diff -Nru ghostscript-9.04~dfsg/arch/windows-x64-msvc.h ghostscript-9.05~dfsg~20120125/arch/windows-x64-msvc.h --- ghostscript-9.04~dfsg/arch/windows-x64-msvc.h 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/arch/windows-x64-msvc.h 2011-09-29 11:01:33.000000000 +0000 @@ -0,0 +1,41 @@ +/* Parameters derived from machine and compiler architecture. */ +/* This file was generated mechanically by genarch.c, for a 64bit */ +/* Microsoft Windows machine, compiling with MSVC. */ + + /* ---------------- Scalar alignments ---------------- */ + +#define ARCH_ALIGN_SHORT_MOD 2 +#define ARCH_ALIGN_INT_MOD 4 +#define ARCH_ALIGN_LONG_MOD 4 +#define ARCH_ALIGN_PTR_MOD 8 +#define ARCH_ALIGN_FLOAT_MOD 4 +#define ARCH_ALIGN_DOUBLE_MOD 8 + + /* ---------------- Scalar sizes ---------------- */ + +#define ARCH_LOG2_SIZEOF_CHAR 0 +#define ARCH_LOG2_SIZEOF_SHORT 1 +#define ARCH_LOG2_SIZEOF_INT 2 +#define ARCH_LOG2_SIZEOF_LONG 2 +#define ARCH_SIZEOF_GX_COLOR_INDEX 8 +#define ARCH_SIZEOF_PTR 8 +#define ARCH_SIZEOF_FLOAT 4 +#define ARCH_SIZEOF_DOUBLE 8 +#define ARCH_FLOAT_MANTISSA_BITS 24 +#define ARCH_DOUBLE_MANTISSA_BITS 53 + + /* ---------------- Unsigned max values ---------------- */ + +#define ARCH_MAX_UCHAR ((unsigned char)0xff + (unsigned char)0) +#define ARCH_MAX_USHORT ((unsigned short)0xffff + (unsigned short)0) +#define ARCH_MAX_UINT ((unsigned int)~0 + (unsigned int)0) +#define ARCH_MAX_ULONG ((unsigned long)~0L + (unsigned long)0) + + /* ---------------- Miscellaneous ---------------- */ + +#define ARCH_IS_BIG_ENDIAN 0 +#define ARCH_PTRS_ARE_SIGNED 0 +#define ARCH_FLOATS_ARE_IEEE 1 +#define ARCH_ARITH_RSHIFT 2 +#define ARCH_DIV_NEG_POS_TRUNCATES 1 + diff -Nru ghostscript-9.04~dfsg/arch/windows-x86-msvc.h ghostscript-9.05~dfsg~20120125/arch/windows-x86-msvc.h --- ghostscript-9.04~dfsg/arch/windows-x86-msvc.h 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/arch/windows-x86-msvc.h 2011-09-29 11:01:33.000000000 +0000 @@ -0,0 +1,40 @@ +/* Parameters derived from machine and compiler architecture. */ +/* This file was generated mechanically by genarch.c, for a 32bit */ +/* Microsoft Windows machine, compiling with MSVC. */ + + /* ---------------- Scalar alignments ---------------- */ + +#define ARCH_ALIGN_SHORT_MOD 2 +#define ARCH_ALIGN_INT_MOD 4 +#define ARCH_ALIGN_LONG_MOD 4 +#define ARCH_ALIGN_PTR_MOD 4 +#define ARCH_ALIGN_FLOAT_MOD 4 +#define ARCH_ALIGN_DOUBLE_MOD 8 + + /* ---------------- Scalar sizes ---------------- */ + +#define ARCH_LOG2_SIZEOF_CHAR 0 +#define ARCH_LOG2_SIZEOF_SHORT 1 +#define ARCH_LOG2_SIZEOF_INT 2 +#define ARCH_LOG2_SIZEOF_LONG 2 +#define ARCH_SIZEOF_GX_COLOR_INDEX 8 +#define ARCH_SIZEOF_PTR 4 +#define ARCH_SIZEOF_FLOAT 4 +#define ARCH_SIZEOF_DOUBLE 8 +#define ARCH_FLOAT_MANTISSA_BITS 24 +#define ARCH_DOUBLE_MANTISSA_BITS 53 + + /* ---------------- Unsigned max values ---------------- */ + +#define ARCH_MAX_UCHAR ((unsigned char)0xff + (unsigned char)0) +#define ARCH_MAX_USHORT ((unsigned short)0xffff + (unsigned short)0) +#define ARCH_MAX_UINT ((unsigned int)~0 + (unsigned int)0) +#define ARCH_MAX_ULONG ((unsigned long)~0L + (unsigned long)0) + + /* ---------------- Miscellaneous ---------------- */ + +#define ARCH_IS_BIG_ENDIAN 0 +#define ARCH_PTRS_ARE_SIGNED 0 +#define ARCH_FLOATS_ARE_IEEE 1 +#define ARCH_ARITH_RSHIFT 2 +#define ARCH_DIV_NEG_POS_TRUNCATES 1 diff -Nru ghostscript-9.04~dfsg/base/configure.ac ghostscript-9.05~dfsg~20120125/base/configure.ac --- ghostscript-9.04~dfsg/base/configure.ac 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/configure.ac 2012-01-25 08:44:23.000000000 +0000 @@ -20,6 +20,7 @@ AC_INIT AC_PREREQ(2.52) +AC_LANG(C) AC_CONFIG_SRCDIR(psi/gs.c) dnl Inherit compiler flags from the environment... @@ -115,37 +116,41 @@ CC_OPT_FLAGS_TO_TRY="-O" SET_DT_SONAME="-soname=" +SO_FOR_MAC="" case `uname` in - Linux*|GNU*) + Linux*|GNU*) if test $ac_cv_prog_gcc = yes; then CC_OPT_FLAGS_TO_TRY="-O2" CC_DBG_FLAGS_TO_TRY="-g -O0" fi - ;; - *BSD) + ;; + *BSD) if test $ac_cv_prog_gcc = yes; then - CC_OPT_FLAGS_TO_TRY="-O2" + CC_OPT_FLAGS_TO_TRY="-O2" CC_DBG_FLAGS_TO_TRY="-g -O0" - fi - ;; - Darwin*) + fi + ;; + Darwin*) if test $ac_cv_prog_gcc = yes; then - CC_OPT_FLAGS_TO_TRY="-O2" + CC_OPT_FLAGS_TO_TRY="-O2" CC_DBG_FLAGS_TO_TRY="-g -O0" - fi - ;; - SunOS) - CC_OPT_FLAGS_TO_TRY="-O2" - # the trailing space is required! + fi + SET_DT_SONAME="" + SO_FOR_MAC="_1" + ;; + SunOS) + CC_OPT_FLAGS_TO_TRY="-O2" + # the trailing space is required! if test $ac_cv_prog_gcc = no; then - SET_DT_SONAME="-h " - fi + SET_DT_SONAME="-h " + fi CC_DBG_FLAGS_TO_TRY="-g -O0" - ;; + ;; esac AC_SUBST(SET_DT_SONAME) +AC_SUBST(SO_FOR_MAC) if test $ac_cv_prog_gcc = yes; then @@ -175,26 +180,26 @@ for flag in $optflags_to_try; do CFLAGS="$CFLAGS $flag" AC_TRY_COMPILE(, [return 0;], [ - echo " $flag" - OPT_CFLAGS="$OPT_CFLAGS $flag" + echo " $flag" + OPT_CFLAGS="$OPT_CFLAGS $flag" ]) CFLAGS=$old_cflags done for flag in $cflags_to_try; do - CFLAGS="$CFLAGS $flag" - AC_TRY_COMPILE(, [return 0;], [ - echo " $flag" - GCFLAGS="$GCFLAGS $flag" - ]) - CFLAGS=$old_cflags + CFLAGS="$CFLAGS $flag" + AC_TRY_COMPILE(, [return 0;], [ + echo " $flag" + GCFLAGS="$GCFLAGS $flag" + ]) + CFLAGS=$old_cflags done old_cflags=$CFLAGS echo for flag in $dbgflags_to_try; do CFLAGS="$CFLAGS $flag" AC_TRY_COMPILE(, [return 0;], [ - echo " $flag" - DBG_CFLAGS="$DBG_CFLAGS $flag" + echo " $flag" + DBG_CFLAGS="$DBG_CFLAGS $flag" ]) CFLAGS=$old_cflags done @@ -217,9 +222,9 @@ OBJDIR_BSDMAKE_WORKAROUND=obj case `uname` in - *BSD) - OBJDIR_BSDMAKEWORKAOROUND="notobj" - ;; + *BSD) + OBJDIR_BSDMAKEWORKAOROUND="notobj" + ;; esac AC_SUBST(OBJDIR_BSDMAKE_WORKAROUND) @@ -245,36 +250,40 @@ AC_CHECK_TYPES([int8_t, int16_t, int32_t, uint8_t, uint16_t, uint32_t],,,[#include ]) if test "$ac_cv_type_uint8_t" = yes; then AC_DEFINE([SYS_TYPES_HAS_STDINT_TYPES]) - GCFLAGS="$GCFLAGS -DSYS_TYPES_HAS_STDINT_TYPES" + GCFLAGS="$GCFLAGS -DSYS_TYPES_HAS_STDINT_TYPES" fi fi dnl we aren't interested in all of DEFS, so manually insert dnl the flags we care about if test "$ac_cv_c_const" != yes; then - GCFLAGS="$GCFLAGS -Dconst=" + GCFLAGS="$GCFLAGS -Dconst=" fi if test "x$ac_cv_header_stdint_h" = xyes; then - GCFLAGS="$GCFLAGS -DHAVE_STDINT_H" + GCFLAGS="$GCFLAGS -DHAVE_STDINT_H=1" +fi + +if test "x$ac_cv_header_sys_time_h" = xyes; then + GCFLAGS="$GCFLAGS -DHAVE_SYS_TIME_H=1" fi dnl try to find a 64 bit type for devicen color index uint64_type="none" AC_CHECK_SIZEOF(unsigned long int) if test $ac_cv_sizeof_unsigned_long_int = 8; then - uint64_type="unsigned long int" + uint64_type="unsigned long int" else AC_CHECK_SIZEOF(unsigned long long) if test $ac_cv_sizeof_unsigned_long_long = 8; then - uint64_type="unsigned long long" + uint64_type="unsigned long long" else AC_CHECK_SIZEOF(unsigned __int64) if test $ac_cv_sizeof_unsigned___int64 = 8; then - uint64_type="unsigned __int64" + uint64_type="unsigned __int64" else AC_CHECK_SIZEOF(u_int64_t) if test $ac_cv_sizeof_u_int64_t = 8; then - uint64_type="u_int64_t" + uint64_type="u_int64_t" fi fi fi @@ -282,7 +291,7 @@ dnl we don't need to do anything if a 64-bit type wasn't found dnl the code falls back to a (probably 32-bit) default if test "$uint64_type" != "none"; then - GCFLAGS="$GCFLAGS -DGX_COLOR_INDEX_TYPE=\"$uint64_type\"" + GCFLAGS="$GCFLAGS -DGX_COLOR_INDEX_TYPE=\"$uint64_type\"" fi dnl -------------------------------------------------- @@ -316,7 +325,7 @@ AC_ARG_WITH(libiconv, [AC_HELP_STRING([--with-libiconv=@<:@no/gnu/native@:>@], [use the libiconv library])],, - [with_libiconv=maybe]) + [with_libiconv=maybe]) found_iconv=no case $with_libiconv in maybe) @@ -357,9 +366,9 @@ dnl Check for libidn (needed for Unicode password support) AC_ARG_WITH(libidn, - [AC_HELP_STRING([--without-libidn], - [don't use libidn to support Unicode passwords])],, - [with_libidn=maybe]) + [AC_HELP_STRING([--without-libidn], + [Do not use libidn to support Unicode passwords])],, + [with_libidn=maybe]) if test x$with_libidn != xno; then AC_CHECK_LIB(idn, stringprep, [ with_libidn=no @@ -391,7 +400,7 @@ if test x$with_libpaper != xno; then AC_CHECK_LIB(paper, systempapername, [with_libpaper=yes], [ - AC_MSG_WARN([disabling support for libpaper]) + AC_MSG_WARN([disabling support for libpaper]) with_libpaper=no ]) fi @@ -414,30 +423,30 @@ FONTCONFIG_CFLAGS="" FONTCONFIG_LIBS="" AC_ARG_ENABLE([fontconfig], AC_HELP_STRING([--disable-fontconfig], - [Don't use fontconfig to list system fonts])) + [Do not use fontconfig to list system fonts])) if test "$enable_fontconfig" != "no"; then - # We MUST NOT use PKG_CHECK_MODULES since it is a) not a standard - # autoconf macro and b) requires pkg-config on the system, which is - # NOT standard on ANY OS, including Linux! - if test "x$PKGCONFIG" != x; then - AC_MSG_CHECKING(for fontconfig with pkg-config) - if $PKGCONFIG --exists fontconfig; then - AC_MSG_RESULT(yes) - FONTCONFIG_CFLAGS="$CFLAGS `$PKGCONFIG --cflags fontconfig`" - FONTCONFIG_LIBS="`$PKGCONFIG --libs fontconfig`" - HAVE_FONTCONFIG=-DHAVE_FONTCONFIG - else - AC_MSG_RESULT(no) - fi - fi - if test -z "$HAVE_FONTCONFIG"; then - AC_CHECK_LIB([fontconfig], [FcInitLoadConfigAndFonts], [ - AC_CHECK_HEADER([fontconfig/fontconfig.h], [ - FONTCONFIG_LIBS="-lfontconfig" - HAVE_FONTCONFIG="-DHAVE_FONTCONFIG" - ]) - ]) - fi + # We MUST NOT use PKG_CHECK_MODULES since it is a) not a standard + # autoconf macro and b) requires pkg-config on the system, which is + # NOT standard on ANY OS, including Linux! + if test "x$PKGCONFIG" != x; then + AC_MSG_CHECKING(for fontconfig with pkg-config) + if $PKGCONFIG --exists fontconfig; then + AC_MSG_RESULT(yes) + FONTCONFIG_CFLAGS="$CFLAGS `$PKGCONFIG --cflags fontconfig`" + FONTCONFIG_LIBS="`$PKGCONFIG --libs fontconfig`" + HAVE_FONTCONFIG=-DHAVE_FONTCONFIG + else + AC_MSG_RESULT(no) + fi + fi + if test -z "$HAVE_FONTCONFIG"; then + AC_CHECK_LIB([fontconfig], [FcInitLoadConfigAndFonts], [ + AC_CHECK_HEADER([fontconfig/fontconfig.h], [ + FONTCONFIG_LIBS="-lfontconfig" + HAVE_FONTCONFIG="-DHAVE_FONTCONFIG" + ]) + ]) + fi fi AC_SUBST(HAVE_FONTCONFIG) AC_SUBST(FONTCONFIG_CFLAGS) @@ -450,25 +459,25 @@ AC_ARG_ENABLE([dbus], AC_HELP_STRING([--disable-dbus], [Do not use dbus to communicate with external services])) if test "$enable_dbus" != "no"; then - if test "x$PKGCONFIG" != x; then - AC_MSG_CHECKING(for dbus with pkg-config) - if $PKGCONFIG --exists dbus-1; then - AC_MSG_RESULT(yes) - DBUS_CFLAGS="$CFLAGS `$PKGCONFIG --cflags dbus-1`" - DBUS_LIBS="`$PKGCONFIG --libs dbus-1`" - HAVE_DBUS=-DHAVE_DBUS - else - AC_MSG_RESULT(no) - fi - fi - if test -z "$HAVE_DBUS"; then - AC_CHECK_LIB([dbus], [dbus_message_iter_get_basic], [ - AC_CHECK_HEADER([dbus-1.0/dbus/dbus.h], [ - DBUS_LIBS="-ldbus-1 -lpthread -lrt" - HAVE_DBUS="-DHAVE_DBUS" - ]) - ]) - fi + if test "x$PKGCONFIG" != x; then + AC_MSG_CHECKING(for dbus with pkg-config) + if $PKGCONFIG --exists dbus-1; then + AC_MSG_RESULT(yes) + DBUS_CFLAGS="$CFLAGS `$PKGCONFIG --cflags dbus-1`" + DBUS_LIBS="`$PKGCONFIG --libs dbus-1`" + HAVE_DBUS=-DHAVE_DBUS + else + AC_MSG_RESULT(no) + fi + fi + if test -z "$HAVE_DBUS"; then + AC_CHECK_LIB([dbus], [dbus_message_iter_get_basic], [ + AC_CHECK_HEADER([dbus-1.0/dbus/dbus.h], [ + DBUS_LIBS="-ldbus-1 -lpthread -lrt" + HAVE_DBUS="-DHAVE_DBUS" + ]) + ]) + fi fi AC_SUBST(HAVE_DBUS) AC_SUBST(DBUS_CFLAGS) @@ -477,7 +486,7 @@ AC_CHECK_LIB(dl, dlopen) AC_ARG_ENABLE([freetype], AC_HELP_STRING([--disable-freetype], - [Disable freetype for font rasterization])) + [Disable freetype for font rasterization])) FT_BRIDGE=0 SHARE_FT=0 FTSRCDIR= @@ -509,28 +518,58 @@ dnl the included freetype source with a checkout from upstream. for dir in freetype2 freetype; do if test -f $dir/src/base/ftbbox.c; then - AC_MSG_RESULT(yes) - SHARE_FT=0 - FTSRCDIR="$dir" - FT_CFLAGS="-I$dir/include" - FT_BRIDGE=1 - break; + AC_MSG_RESULT(yes) + SHARE_FT=0 + FTSRCDIR="$dir" + FT_CFLAGS="-I$dir/include" + FT_BRIDGE=1 + break; fi done if test -z $FTSRCDIR; then AC_MSG_RESULT([no]) if test "x$PKGCONFIG" != x; then - AC_MSG_CHECKING(for system freetype with pkg-config) - if $PKGCONFIG --exists freetype2; then - AC_MSG_RESULT(yes) - FT_CFLAGS="$CFLAGS `$PKGCONFIG --cflags freetype2`" - FT_LIBS="`$PKGCONFIG --libs freetype2`" - FT_BRIDGE=1 - SHARE_FT=1 - else - AC_MSG_RESULT(no) - AC_MSG_WARN([freetype library source not found...using native rasterizer]) - fi + AC_MSG_CHECKING(for system freetype2 >= 2.4.2 with pkg-config) + # pkg-config needs the libtool version, which != the freetype2 version + # There is a table of corresponding ft2<->libtool numbers in freetype/docs/VERSION.DLL + if $PKGCONFIG --atleast-version=12.0.6 freetype2; then + AC_MSG_RESULT(yes) + FT_CFLAGS="$CFLAGS `$PKGCONFIG --cflags freetype2`" + FT_LIBS="`$PKGCONFIG --libs freetype2`" + FT_BRIDGE=1 + SHARE_FT=1 + else + AC_MSG_RESULT(no) + AC_MSG_WARN([freetype library source not found...using native rasterizer]) + AFS=1 + fi + else + AC_CHECK_HEADER([ft2build.h], [FT_BRIDGE=1], [AFS=1]) + + if test "x$FT_BRIDGE" = x1; then + AC_CHECK_LIB(freetype, FT_Init_FreeType, + [FT_BRIDGE=1], [FT_BRIDGE=0; AFS=1]) + + if test "x$FT_BRIDGE" = x1; then + AC_MSG_CHECKING(for system freetype2 library >= 2.4.2) + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([#include "ft2build.h" + #include FT_FREETYPE_H], [ + #if FREETYPE_MAJOR < 2 + FAIL + #endif + #if FREETYPE_MINOR < 4 + FAIL + #endif + #if FREETYPE_PATCH < 2 + FAIL + #endif + return(0); + ])], + [FT_BRIDGE=1;AC_MSG_RESULT(yes)], [FT_BRIDGE=0; AFS=1;AC_MSG_RESULT(no)]) + fi + fi + fi fi fi @@ -547,18 +586,18 @@ dnl to see whether it has already been patched. LIBJPEGDIR=src if test -f jpeg/jpeglib.h; then - AC_MSG_RESULT([jpeg]) - SHARE_LIBJPEG=0 - LIBJPEGDIR=jpeg + AC_MSG_RESULT([jpeg]) + SHARE_LIBJPEG=0 + LIBJPEGDIR=jpeg elif test -f jpeg-6b/jpeglib.h; then - AC_MSG_RESULT([jpeg-6b]) - SHARE_LIBJPEG=0 - LIBJPEGDIR=jpeg-6b + AC_MSG_RESULT([jpeg-6b]) + SHARE_LIBJPEG=0 + LIBJPEGDIR=jpeg-6b else - AC_MSG_RESULT([no]) - AC_CHECK_LIB(jpeg, jpeg_set_defaults, [ - AC_CHECK_HEADERS([jpeglib.h], [SHARE_LIBJPEG=1]) - ]) + AC_MSG_RESULT([no]) + AC_CHECK_LIB(jpeg, jpeg_set_defaults, [ + AC_CHECK_HEADERS([jpeglib.h], [SHARE_LIBJPEG=1]) + ]) fi if test -z "$SHARE_LIBJPEG"; then AC_MSG_ERROR([I wasn't able to find a copy @@ -587,14 +626,14 @@ # this seems a harmless default ZLIBDIR=src if test -d zlib; then - AC_MSG_RESULT([yes]) - SHARE_ZLIB=0 - ZLIBDIR=zlib + AC_MSG_RESULT([yes]) + SHARE_ZLIB=0 + ZLIBDIR=zlib else - AC_MSG_RESULT([no]) - AC_CHECK_LIB(z, deflate, [ - AC_CHECK_HEADERS(zlib.h, [SHARE_ZLIB=1]) - ]) + AC_MSG_RESULT([no]) + AC_CHECK_LIB(z, deflate, [ + AC_CHECK_HEADERS(zlib.h, [SHARE_ZLIB=1]) + ]) fi if test -z "$SHARE_ZLIB"; then AC_MSG_ERROR([I did not find a copy of zlib on your system. @@ -625,18 +664,18 @@ PNGDEVS_ALL='png48 png16m pnggray pngmono png256 png16 pngalpha' AC_MSG_CHECKING([for local png library source]) if test -f libpng/pngread.c; then - AC_MSG_RESULT([yes]) - SHARE_LIBPNG=0 - LIBPNGDIR=libpng - PNGDEVS="$PNGDEVS_ALL" + AC_MSG_RESULT([yes]) + SHARE_LIBPNG=0 + LIBPNGDIR=libpng + PNGDEVS="$PNGDEVS_ALL" else - AC_MSG_RESULT([no]) - AC_CHECK_LIB(png, png_create_write_struct, [ - AC_CHECK_HEADERS(png.h, [ - SHARE_LIBPNG=1 - PNGDEVS="$PNGDEVS_ALL" - ], [SHARE_LIBPNG=0]) - ], [SHARE_LIBPNG=0], [-lz]) + AC_MSG_RESULT([no]) + AC_CHECK_LIB(png, png_create_write_struct, [ + AC_CHECK_HEADERS(png.h, [ + SHARE_LIBPNG=1 + PNGDEVS="$PNGDEVS_ALL" + ], [SHARE_LIBPNG=0]) + ], [SHARE_LIBPNG=0], [-lz]) fi if test -z "$PNGDEVS"; then AC_MSG_NOTICE([disabling png output devices]) @@ -645,81 +684,127 @@ AC_SUBST(LIBPNGDIR) #AC_SUBST(PNGDEVS) -AC_MSG_CHECKING([for local lcms library source]) -LCMSDIR=lcms -SHARELCMS=0 -if test -f $LCMSDIR/include/lcms.h; then - AC_MSG_RESULT([yes]) -else -AC_CHECK_LIB(lcms, cmsCreateXYZProfile, [ - AC_CHECK_HEADERS([lcms.h], [SHARELCMS=1;LCMSDIR=""]) - ]) +WHICHLCMS= + +AC_ARG_WITH([lcms], AC_HELP_STRING([--with-lcms], + [try to use LittleCMS 1.x instead of the default of LittleCMS 2.x])) + +if test x$with_lcms != xyes; then + AC_MSG_CHECKING([for local lcms2 library source]) + LCMS2DIR=lcms2 + if test -f $LCMS2DIR/include/lcms2.h; then + AC_MSG_RESULT([yes]) + SHARELCMS=0 + WHICHLCMS=lcms2 + else + AC_MSG_RESULT([no]) + AC_MSG_CHECKING([for system lcms2 library]) + AC_CHECK_LIB(lcms2, cmsCreateXYZProfile, [ + AC_CHECK_HEADERS([lcms2.h], [LCMS2DIR="";SHARELCMS=1;WHICHLCMS=lcms2]) + ]) + fi fi -AC_MSG_CHECKING([for local lcms2 library source]) -LCMS2DIR=lcms2 -if test -f $LCMS2DIR/include/lcms2.h; then - AC_MSG_RESULT([yes]) -else -AC_CHECK_LIB(lcms2, cmsCreateXYZProfile, [ - AC_CHECK_HEADERS([lcms2.h], [LCMS2DIR=""]) - ]) +if test x$WHICHLCMS = x; then + AC_MSG_CHECKING([for local lcms library source]) + LCMSDIR=lcms + SHARELCMS=0 + if test -f $LCMSDIR/include/lcms.h; then + AC_MSG_RESULT([yes]) + SHARELCMS=0 + WHICHLCMS=lcms + else + + AC_MSG_ERROR([LittleCMS source not found!]) + #AC_CHECK_LIB(lcms, cmsCreateXYZProfile, [ + # AC_CHECK_HEADERS([lcms.h], [SHARELCMS=1;LCMSDIR=""]) + # ]) + fi fi AC_SUBST(SHARELCMS) +AC_SUBST(WHICHLCMS) AC_SUBST(LCMSDIR) AC_SUBST(LCMS2DIR) dnl look for libtiff, it also requires lib dnl png for the png output device; it also requires zlib AC_ARG_WITH([system-libtiff], AC_HELP_STRING([--with-system-libtiff], - [Force using the systems libtiff]), - [], [with_system_libtiff=check]) + [Force using the systems libtiff]), + [], [with_system_libtiff=check]) TIFFDEVS='' TIFFDEVS_ALL='$(DD)tiffs $(DD)tiff12nc $(DD)tiff24nc $(DD)tiff48nc $(DD)tiff32nc $(DD)tiff64nc $(DD)tiffcrle $(DD)tifflzw $(DD)tiffpack $(DD)tiffgray $(DD)tiffsep $(DD)tiffscaled' case "x$with_system_libtiff" in xcheck) - if test -d tiff; then - LIBTIFFDIR=tiff - HAVE_LOCAL_LIBTIFF=1 - SHARE_LIBTIFF=0 - else - AC_CHECK_LIB(tiff, TIFFOpen, - [AC_CHECK_HEADERS(tiff.h, [HAVE_SYSTEM_LIBTIFF=1;SHARE_LIBTIFF=1])], - [], [-ljpeg]) - fi - if test "x$HAVE_LOCAL_LIBTIFF" = x && test "x$HAVE_SYSTEM_LIBTIFF" = x; then - AC_MSG_NOTICE([Could not find a copy of libtiff on your system. + if test -d tiff; then + LIBTIFFDIR=tiff + HAVE_LOCAL_LIBTIFF=1 + SHARE_LIBTIFF=0 + else + # We MUST NOT use PKG_CHECK_MODULES since it is a) not a standard + # autoconf macro and b) requires pkg-config on the system, which is + # NOT standard on ANY OS, including Linux! + if test "x$PKGCONFIG" != x; then + AC_MSG_CHECKING(for libtiff with pkg-config) + if $PKGCONFIG --exists libtiff-4; then + AC_MSG_RESULT(yes) + CFLAGS="$CFLAGS `$PKGCONFIG --cflags libtiff-4`" + LIBS="$LIBS `$PKGCONFIG --libs libtiff-4`" + HAVE_SYSTEM_LIBTIFF=1 + fi + fi + if test -z "$HAVE_SYSTEM_LIBTIFF"; then + AC_CHECK_LIB(tiff, TIFFOpen, + [AC_CHECK_HEADERS(tiff.h, [HAVE_SYSTEM_LIBTIFF=1;SHARE_LIBTIFF=1])], + [], [-ljpeg]) + fi + fi + if test "x$HAVE_LOCAL_LIBTIFF" = x && test "x$HAVE_SYSTEM_LIBTIFF" = x; then + AC_MSG_NOTICE([Could not find a copy of libtiff on your system. Disabling tiff output devices.]) - else - TIFFDEVS="$TIFFDEVS_ALL" - fi - ;; + else + TIFFDEVS="$TIFFDEVS_ALL" + fi + ;; xyes) - AC_CHECK_LIB(tiff, TIFFOpen, - [AC_CHECK_HEADERS(tiff.h, [HAVE_SYSTEM_LIBTIFF=1;SHARE_LIBTIFF=1])], - [], [-ljpeg]) - if test "x$HAVE_SYSTEM_LIBTIFF" != x; then - SHARE_LIBTIFF=1 - TIFFDEVS="$TIFFDEVS_ALL" - else - AC_MSG_NOTICE([Could not find a copy of libtiff on your system. + # We MUST NOT use PKG_CHECK_MODULES since it is a) not a standard + # autoconf macro and b) requires pkg-config on the system, which is + # NOT standard on ANY OS, including Linux! + if test "x$PKGCONFIG" != x; then + AC_MSG_CHECKING(for libtiff with pkg-config) + if $PKGCONFIG --exists libtiff-4; then + AC_MSG_RESULT(yes) + CFLAGS="$CFLAGS `$PKGCONFIG --cflags libtiff-4`" + LIBS="$LIBS `$PKGCONFIG --libs libtiff-4`" + HAVE_SYSTEM_LIBTIFF=1 + fi + fi + if test -z "$HAVE_SYSTEM_LIBTIFF"; then + AC_CHECK_LIB(tiff, TIFFOpen, + [AC_CHECK_HEADERS(tiff.h, [HAVE_SYSTEM_LIBTIFF=1;SHARE_LIBTIFF=1])], + [], [-ljpeg]) + fi + if test "x$HAVE_SYSTEM_LIBTIFF" != x; then + SHARE_LIBTIFF=1 + TIFFDEVS="$TIFFDEVS_ALL" + else + AC_MSG_NOTICE([Could not find a copy of libtiff on your system. Disabling tiff output devices.]) - fi - ;; + fi + ;; xno) - AC_MSG_CHECKING([for local libtiff source]) + AC_MSG_CHECKING([for local libtiff source]) if test -d tiff; then - AC_MSG_RESULT([yes]) - LIBTIFFDIR=tiff - SHARE_LIBTIFF=0 - TIFFDEVS="$TIFFDEVS_ALL" - else - AC_MSG_RESULT([no]) - AC_MSG_NOTICE([Could not find local copy of libtiff. + AC_MSG_RESULT([yes]) + LIBTIFFDIR=tiff + SHARE_LIBTIFF=0 + TIFFDEVS="$TIFFDEVS_ALL" + else + AC_MSG_RESULT([no]) + AC_MSG_NOTICE([Could not find local copy of libtiff. Disabling tiff output devices.]) - fi - ;; + fi + ;; esac if test $SHARE_LIBTIFF -eq 0; then @@ -743,18 +828,28 @@ dnl look for CUPS... AC_ARG_ENABLE([cups], AC_HELP_STRING([--disable-cups], - [Don't include CUPS support])) + [Do not include CUPS support])) AC_ARG_WITH([pdftoraster], AC_HELP_STRING([--without-pdftoraster], - [Don't include CUPS' pdftoraster filter])) + [Do not include CUPS' pdftoraster filter])) AC_ARG_WITH([local-cups], AC_HELP_STRING([--with-local-cups], - [Force using the GS supplied cups code - only useful for debugging]), - [with_local_cups=yes], [with_local_cups=no]) + [Force using the GS supplied cups code - only useful for debugging]), + [with_local_cups=yes], [with_local_cups=no]) AC_ARG_WITH([install-cups], AC_HELP_STRING([--with-install-cups], - [Install the cups conversion tools]), - [CUPSINSTALL=install-cups], [CUPSINSTALL=]) + [Install the cups conversion tools]), + [CUPSINSTALL=install-cups], [CUPSINSTALL=]) + +AC_ARG_WITH([cups-serverbin], AC_HELP_STRING([--with-cups-serverbin], + [override the "cups-config --serverbin" path]), CUPS_SERVERBIN="$withval", CUPS_SERVERBIN="") + +AC_ARG_WITH([cups-serverroot], AC_HELP_STRING([--with-cups-serverroot], + [override the "cups-config --serverroot" path]), CUPS_SERVERROOT="$withval", CUPS_SERVERROOT="") + + +AC_ARG_WITH([cups-datadir], AC_HELP_STRING([--with-cups-datadir], + [override the "cups-config --datadir" path]), CUPS_DATADIR="$withval", CUPS_DATADIR="") CUPSDEV="" CUPSINCLUDE="" @@ -774,38 +869,54 @@ if ( test -d cups ); then if test x$enable_cups != xno; then if test x$with_local_cups != xyes; then - AC_PATH_PROG(CUPSCONFIG,cups-config) - AC_CHECK_HEADER([cups/raster.h],[],[CUPSCONFIG=""]) - if test "x$CUPSCONFIG" != x; then - dnl Use values from CUPS config... - CUPSCFLAGS="`$CUPSCONFIG --cflags` $CFLAGS" -# CUPSLINK="`$CUPSCONFIG --ldflags` `$CUPSCONFIG --static --image --libs | sed -e '1,$s/-lssl//'` $LIBS" - CUPSLINK="`$CUPSCONFIG --ldflags` `$CUPSCONFIG --image --libs`" - GS_SPLIT_LIBS([CUPSLIBS], [$CUPSLINK]) - GS_SPLIT_LIBPATHS([CUPSLIBDIRS],[$CUPSLINK]) - CUPSSERVERROOT="`$CUPSCONFIG --serverroot`" - CUPSSERVERBIN="`$CUPSCONFIG --serverbin`" - CUPSDATA="`$CUPSCONFIG --datadir`" - CUPSINCLUDE="include cups/cups.mak" - CUPSDEV="cups" - CUPSVERSION="`$CUPSCONFIG --version`" - LCUPSINCLUDE="include \$(GLSRCDIR)/lcups.mak" - LCUPSIINCLUDE="include \$(GLSRCDIR)/lcupsi.mak" - if ( test x$with_pdftoraster != xno ); then - if test "$CUPSVERSION" ">" "1.2"; then - CUPSPDFTORASTER="1" - fi - fi - fi + AC_PATH_PROG(CUPSCONFIG,cups-config) + AC_CHECK_HEADER([cups/raster.h],[],[CUPSCONFIG=""]) + if test "x$CUPSCONFIG" != x; then + dnl Use values from CUPS config... + CUPSCFLAGS="`$CUPSCONFIG --cflags` $CFLAGS" +# CUPSLINK="`$CUPSCONFIG --ldflags` `$CUPSCONFIG --static --image --libs | sed -e '1,$s/-lssl//'` $LIBS" + CUPSLINK="`$CUPSCONFIG --ldflags` `$CUPSCONFIG --image --libs`" + GS_SPLIT_LIBS([CUPSLIBS], [$CUPSLINK]) + GS_SPLIT_LIBPATHS([CUPSLIBDIRS],[$CUPSLINK]) + + if test "x$CUPS_SERVERROOT" != "x"; then + CUPSSERVERROOT="$CUPS_SERVERROOT" + else + CUPSSERVERROOT="`$CUPSCONFIG --serverroot`" + fi + + if test "x$CUPS_SERVERBIN" != "x"; then + CUPSSERVERBIN="$CUPS_SERVERBIN" + else + CUPSSERVERBIN="`$CUPSCONFIG --serverbin`" + fi + + if test "x$CUPS_DATADIR" != "x"; then + CUPSDATA="$CUPS_DATADIR" + else + CUPSDATA="`$CUPSCONFIG --datadir`" + fi + + CUPSINCLUDE="include cups/cups.mak" + CUPSDEV="cups" + CUPSVERSION="`$CUPSCONFIG --version`" + LCUPSINCLUDE="include \$(GLSRCDIR)/lcups.mak" + LCUPSIINCLUDE="include \$(GLSRCDIR)/lcupsi.mak" + if ( test x$with_pdftoraster != xno ); then + if test "$CUPSVERSION" ">" "1.2"; then + CUPSPDFTORASTER="1" + fi + fi + fi else if test "$(uname)" = "Linux"; then AC_MSG_WARN([* USING LOCAL CUPS SOURCE *]) SHARELCUPS=0 SHARELCUPSI=0 LCUPSBUILDTYPE=linux - LCUPSINCLUDE="include \$(GLSRCDIR)/lcups.mak" - LCUPSIINCLUDE="include \$(GLSRCDIR)/lcupsi.mak" - CUPSDEV="cups" + LCUPSINCLUDE="include \$(GLSRCDIR)/lcups.mak" + LCUPSIINCLUDE="include \$(GLSRCDIR)/lcupsi.mak" + CUPSDEV="cups" fi fi @@ -847,8 +958,8 @@ else AC_MSG_RESULT([no]) AC_CHECK_LIB(ijs, ijs_server_init, [ - AC_CHECK_HEADERS(ijs/ijs.h, [SHAREIJS=1]) - ]) + AC_CHECK_HEADERS(ijs/ijs.h, [SHAREIJS=1]) + ]) if test $SHAREIJS -eq 1 ; then IJSLIB=ijs # This is for safety - it prevents our header search path going outside the GS source tree @@ -883,7 +994,7 @@ JBIG2_DECODER=luratech SHARE_JBIG2=0 JBIG2DIR=luratech/ldf_jb2 - if test `uname` = Darwin*; then + if test "$(uname)" = "Darwin"; then JBIG2_AUTOCONF_CFLAGS="-DUSE_LDF_JB2 -DMAC -DMAC_OS_X_BUILD" else JBIG2_AUTOCONF_CFLAGS="-DUSE_LDF_JB2 -DLINUX" @@ -948,7 +1059,7 @@ AC_SUBST(JBIG2_AUTOCONF_CFLAGS) JPXDIR=src -SHARE_JASPER=0 +SHARE_JPX=0 JPXDEVS='' JPX_DECODER= JPX_AUTOCONF_CFLAGS= @@ -958,9 +1069,9 @@ if test -d luratech/lwf_jp2; then AC_MSG_RESULT([yes]) JPX_DECODER=luratech - SHARE_JASPER=0 + SHARE_JPX=0 JPXDIR=luratech/lwf_jp2 - if test `uname` = Darwin*; then + if test "$(uname)" = "Darwin"; then JPX_AUTOCONF_CFLAGS="-DUSE_LWF_JP2 -DMAC -DMAC_OS_X_BUILD" else JPX_AUTOCONF_CFLAGS="-DUSE_LWF_JP2 -DLINUX" @@ -971,11 +1082,31 @@ fi fi +OPENJPEGDIR=openjpeg + +AC_ARG_ENABLE([openjpeg], AC_HELP_STRING([--disable-openjpeg], + [Do not use OpenJPEG for JPX decoding])) -if test "x$JPX_DECODER" = x; then +if test "x$JPX_DECODER" = "x"; then + if test "x$enable_openjpeg" != "xno"; then + AC_MSG_CHECKING([for local OpenJPEG library source]) + if test -e $OPENJPEGDIR/libopenjpeg/openjpeg.h; then + AC_MSG_RESULT([yes]) + JPXDIR="$OPENJPEGDIR" + JPX_DECODER=openjpeg + SHARE_JPX=0 + JPX_AUTOCONF_CFLAGS="-DUSE_OPENJPEG_JP2" + JPXDEVS='$(PSD)jpx.dev' + else + AC_MSG_RESULT([no]) + fi + fi +fi + +if test "x$JPX_DECODER" = "x"; then dnl look for the jasper JPEG 2000 library AC_ARG_WITH([jasper], AC_HELP_STRING([--without-jasper], - [don't use the JasPer library for JPEG 2000])) + [Do not use the JasPer library for JPEG 2000])) if test x$with_jasper != xno; then AC_MSG_CHECKING([for local jasper library source]) for d in jasper jasper-1.7*; do @@ -1028,7 +1159,7 @@ else AC_MSG_RESULT([no]) AC_CHECK_LIB([jasper], [jas_image_create], [ - SHARE_JASPER=1 + SHARE_JPX=1 ], [ AC_MSG_WARN([disabling support for JPEG 2000 images]) with_jasper=no @@ -1046,37 +1177,37 @@ AC_SUBST(JPX_DECODER) AC_SUBST(JPX_AUTOCONF_CFLAGS) AC_SUBST(JPXDIR) -AC_SUBST(SHARE_JASPER) +AC_SUBST(SHARE_JPX) AC_SUBST(JPXDEVS) dnl check if we can/should build the gtk loader AC_ARG_ENABLE([gtk], AC_HELP_STRING([--disable-gtk], - [Don't build the gtk loader])) + [Do not build the gtk loader])) SOC_CFLAGS="" SOC_LIBS="" SOC_LOADER="dxmainc.c" if test "x$enable_gtk" != "xno"; then # Try GTK+ 2.x first... if test "x$PKGCONFIG" != x; then - AC_MSG_CHECKING(for GTK+ 2.x) - if $PKGCONFIG --exists gtk+-2.0; then - SOC_LOADER="dxmain.c" - SOC_CFLAGS="`$PKGCONFIG gtk+-2.0 --cflags`" - SOC_LIBS="`$PKGCONFIG gtk+-2.0 --libs`" - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - fi + AC_MSG_CHECKING(for GTK+ 2.x) + if $PKGCONFIG --exists gtk+-2.0; then + SOC_LOADER="dxmain.c" + SOC_CFLAGS="`$PKGCONFIG gtk+-2.0 --cflags`" + SOC_LIBS="`$PKGCONFIG gtk+-2.0 --libs`" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi fi # Then fall back on GTK+ 1.x... if test "x$SOC_LOADER" = x; then - AC_PATH_PROG(GTKCONFIG, gtk-config) - if test "x$GTKCONFIG" != x; then - SOC_LOADER="dxmain.c" - SOC_CFLAGS="`$GTKCONFIG --cflags`" - SOC_LIBS="`$GTKCONFIG --libs`" - fi + AC_PATH_PROG(GTKCONFIG, gtk-config) + if test "x$GTKCONFIG" != x; then + SOC_LOADER="dxmain.c" + SOC_CFLAGS="`$GTKCONFIG --cflags`" + SOC_LIBS="`$GTKCONFIG --libs`" + fi fi fi AC_SUBST(SOC_CFLAGS) @@ -1085,17 +1216,17 @@ dnl look for omni implementation AC_ARG_WITH([omni], AC_HELP_STRING([--with-omni], - [enable the omni driver])) + [enable the omni driver])) dnl set safe defaults OMNIDEVS='' INCLUDEOMNI=no if ( ! test -z "$CONTRIBINCLUDE" ) && ( test x$with_omni = xyes ); then - INCLUDEOMNI=yes + INCLUDEOMNI=yes OMNIDEVS='$(DD)omni.dev' - if test -n "$GCC"; then - LIBS="$LIBS -lstdc++" - fi + if test -n "$GCC"; then + LIBS="$LIBS -lstdc++" + fi fi AC_SUBST(OMNIDEVS) @@ -1108,43 +1239,43 @@ X_LIBS="" if test x$no_x != xyes; then - if test "$x_libraries" = "/usr/lib"; then - echo "Ignoring X library directory \"$x_libraries\" requested by configure." - x_libraries="NONE" - fi - if test ! "$x_libraries" = "NONE" -a ! "$x_libraries" = ""; then - X_LDFLAGS="-L$x_libraries" - if test "$uname" = "SunOS"; then - X_LDFLAGS="$X_LDFLAGS -R$x_libraries" - fi - fi - - if test "$x_includes" = "/usr/include"; then - echo "Ignoring X include directory \"$x_includes\" requested by configure." - x_includes="NONE" - fi - if test ! "$x_includes" = "NONE" -a ! "$x_includes" = ""; then - X_CFLAGS="-I$x_includes" - fi - - SAVELIBS="$LIBS" - SAVELDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $X_LDFLAGS" - - AC_CHECK_LIB(X11,XOpenDisplay) - AC_CHECK_LIB(Xext,XdbeQueryExtension) - AC_CHECK_LIB(Xt,XtAppCreateShell) - - LDFLAGS="$SAVELDFLAGS" - LIBS="$SAVELIBS" - - if test "$ac_cv_lib_Xt_XtAppCreateShell" = yes; then - X11DEVS="x11 x11alpha x11cmyk x11mono x11_ x11alt_ x11cmyk2 x11cmyk4 x11cmyk8 x11rg16x x11rg32x x11gray2 x11gray4" - X_DEVS=$X11DEVS - # the makefile wants a list of just the library names in X_LIBS - GS_SPLIT_LIBS([X_LIBS], - [-lXt $X_PRE_LIBS -lXext -lX11 $X_EXTRA_LIBS]) - fi + if test "$x_libraries" = "/usr/lib"; then + echo "Ignoring X library directory \"$x_libraries\" requested by configure." + x_libraries="NONE" + fi + if test ! "$x_libraries" = "NONE" -a ! "$x_libraries" = ""; then + X_LDFLAGS="-L$x_libraries" + if test "$uname" = "SunOS"; then + X_LDFLAGS="$X_LDFLAGS -R$x_libraries" + fi + fi + + if test "$x_includes" = "/usr/include"; then + echo "Ignoring X include directory \"$x_includes\" requested by configure." + x_includes="NONE" + fi + if test ! "$x_includes" = "NONE" -a ! "$x_includes" = ""; then + X_CFLAGS="-I$x_includes" + fi + + SAVELIBS="$LIBS" + SAVELDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $X_LDFLAGS" + + AC_CHECK_LIB(X11,XOpenDisplay) + AC_CHECK_LIB(Xext,XdbeQueryExtension) + AC_CHECK_LIB(Xt,XtAppCreateShell) + + LDFLAGS="$SAVELDFLAGS" + LIBS="$SAVELIBS" + + if test "$ac_cv_lib_Xt_XtAppCreateShell" = yes; then + X11DEVS="x11 x11alpha x11cmyk x11mono x11_ x11alt_ x11cmyk2 x11cmyk4 x11cmyk8 x11rg16x x11rg32x x11gray2 x11gray4" + X_DEVS=$X11DEVS + # the makefile wants a list of just the library names in X_LIBS + GS_SPLIT_LIBS([X_LIBS], + [-lXt $X_PRE_LIBS -lXext -lX11 $X_EXTRA_LIBS]) + fi fi AC_SUBST(X_LDFLAGS) @@ -1156,14 +1287,14 @@ dnl executible name AC_ARG_WITH([gs], AC_HELP_STRING([--with-gs=NAME], - [name of the Ghostscript executible [[gs]]]), - [GS="$with_gs"],[GS='gs']) + [name of the Ghostscript executible [[gs]]]), + [GS="$with_gs"],[GS='gs']) AC_SUBST(GS) dnl do we compile the postscript initialization files into Ghostscript? COMPILE_INITS="1" AC_ARG_ENABLE([compile-inits], AC_HELP_STRING([--disable-compile-inits], - [Don't compile in initialization files]),[ + [Do not compile in initialization files]),[ if test "x$enable_compile_inits" = xno; then COMPILE_INITS="0" fi]) @@ -1186,18 +1317,16 @@ JAPAN = older japanese printers LEXMARK = all Lexmark printers OKI = all OKI printers - PCLXL = all PCL XL/6 printers + PCLXL = all PCL XL/6 printers File formats: BMP = Output to bmp files FAX = Output to fax files JPEG = Output to JPEG files PBM = Output to PBM/PNM PCX = Output to PCX - PNG = Output to PNG + PNG = Output to PNG PS = Output to PostScript/PDF TIFF = Output to TIFF - WTS = WTS Halftoning devices - ETS = ETS Halftoning devices You can mix both variants, e.g. --with-drivers=HP,stcolor would build HP drivers and the Epson stcolor driver. @@ -1210,8 +1339,8 @@ driversfile="$withval",driversfile="") if test "x$driversfile" != x; then - # Add drivers from file... - drivers="`tr '\n' ',' <$driversfile`" + # Add drivers from file... + drivers="`tr '\n' ',' <$driversfile`" fi dnl Check which drivers we'd like to support. @@ -1230,7 +1359,7 @@ PCLXL_DEVS='pxlmono pxlcolor' EPSON_DEVS='eps9high eps9mid epson epsonc escp lp8000 lq850 photoex st800 stcolor alc1900 alc2000 alc4000 alc4100 alc8500 alc8600 alc9100 lp3000c lp8000c lp8200c lp8300c lp8500c lp8800c lp9000c lp9200c lp9500c lp9800c lps6500 epl2050 epl2050p epl2120 epl2500 epl2750 epl5800 epl5900 epl6100 epl6200 lp1800 lp1900 lp2200 lp2400 lp2500 lp7500 lp7700 lp7900 lp8100 lp8300f lp8400f lp8600 lp8600f lp8700 lp8900 lp9000b lp9100 lp9200b lp9300 lp9400 lp9600 lp9600s lps4500 eplcolor eplmono' CANON_DEVS='bj10e bj200 bjc600 bjc800 lbp8 lips3 bjcmono bjcgray bjccmyk bjccolor' -LEXMARK_DEVS='lxm5700m lx5000 lxm3200 lex2050 lex3200 lex5700 lex7000' +LEXMARK_DEVS='lxm5700m lxm3200 lex2050 lex3200 lex5700 lex7000' BROTHER_DEVS='hl7x0 hl1240 hl1250' APPLE_DEVS='appledmp iwhi iwlo iwlq' IBM_DEVS='ibmpro jetp3852' @@ -1248,152 +1377,153 @@ # PNG_DEVS='png16 png16m png256 pngalpha pnggray pngmono' TIFF_DEVS='tiffs tiff12nc tiff24nc tiff48nc tiff32nc tiff64nc tiffcrle tifflzw tiffpack tiffgray tiffsep tiffsep1 tiffscaled tiffscaled8 tiffscaled24' PCX_DEVS='pcxmono pcxgray pcx16 pcx256 pcx24b pcxcmyk pcx2up' -PBM_DEVS='pbm pbmraw pgm pgmraw pgnm pgnmraw pnm pnmraw ppm ppmraw pkm pkmraw pksm pksmraw pam' -PS_DEVS='psdf psdcmyk psdrgb pdfwrite pswrite ps2write epswrite psgray psmono psrgb bbox' -WTS_HALFTONING_DEVS='imdi simdi wtsimdi wtscmyk' -MISC_FDEVS='ccr cgm24 cgm8 cgmmono cif inferno mag16 mag256 mgr4 mgr8 mgrgray2 mgrgray4 mgrgray8 mgrmono miff24 plan9bm sgirgb sunhmono bit bitrgb bitrgbtags bitcmyk devicen spotcmyk xcf' +PBM_DEVS='pbm pbmraw pgm pgmraw pgnm pgnmraw pnm pnmraw ppm ppmraw pkm pkmraw pksm pksmraw pam pamcmyk4 pamcmyk32 plan plang planm planc plank' +PS_DEVS='psdf psdcmyk psdrgb pdfwrite pswrite ps2write epswrite psgray psmono psrgb bbox txtwrite inkcov' +MISC_FDEVS='ccr cif inferno mag16 mag256 mgr4 mgr8 mgrgray2 mgrgray4 mgrgray8 mgrmono miff24 plan9bm sgirgb sunhmono bit bitrgb bitrgbtags bitcmyk devicen spotcmyk xcf' SVGDEV='svgwrite' while test -n "$drivers"; do - if echo $drivers |grep "," >/dev/null; then - THIS="`echo $drivers |sed -e 's/,.*//'`" - drivers="`echo $drivers |sed -e \"s/$THIS,//\"`" - else - THIS=$drivers - drivers="" - fi - case "$THIS" in - ALL) - # ALL = PRINTERS + FILES... - if test -z "$drivers"; then - drivers="PRINTERS,FILES,X11" - else - drivers="$drivers,PRINTERS,FILES,X11" - fi - ;; - PRINTERS) - P_DEVS0="$P_DEVS0 $CANON_DEVS $EPSON_DEVS $HP_DEVS $LEXMARK_DEVS $BROTHER_DEVS $APPLE_DEVS $IBM_DEVS $OKI_DEVS $JAPAN_DEVS $MISC_PDEVS $ETS_HALFTONING_DEVS $OPVP_DEVS" + if echo $drivers |grep "," >/dev/null; then + THIS="`echo $drivers |sed -e 's/,.*//'`" + SEDCMD="s/$THIS,//" + drivers="`echo $drivers |sed -e $SEDCMD`" + else + THIS=$drivers + drivers="" + fi + case "$THIS" in + ALL) + # ALL = PRINTERS + FILES... + if test -z "$drivers"; then + drivers="PRINTERS,FILES,X11" + else + drivers="$drivers,PRINTERS,FILES,X11" + fi + ;; + PRINTERS) + P_DEVS0="$P_DEVS0 $CANON_DEVS $EPSON_DEVS $HP_DEVS $LEXMARK_DEVS $BROTHER_DEVS $APPLE_DEVS $IBM_DEVS $OKI_DEVS $JAPAN_DEVS $MISC_PDEVS $ETS_HALFTONING_DEVS" + IJS_DEVS0="$IJSDEVS" + if test x$ac_cv_lib_dl_dlopen != xno -a x$found_iconv != xno; then + P_DEVS0="$P_DEVS0 $OPVP_DEVS" + else + AC_MSG_WARN(Unable to include opvp/oprp driver due to missing or disabled prerequisites...) + fi + ;; + FILES) + F_DEVS0="$F_DEVS0 $BMP_DEVS $FAX_DEVS $JPEG_DEVS $TIFF_DEVS $PCX_DEVS $PBM_DEVS $PS_DEVS $MISC_FDEVS" + CUPS_DEVS0="$CUPSDEV" + JBIG2_DEVS="$JBIG2DEVS" + PNG_DEVS0="$PNGDEVS" + ;; + APPLE) + # All Apple printers + P_DEVS0="$P_DEVS0 $APPLE_DEVS" + ;; + BMP) + # BMP file format + F_DEVS0="$F_DEVS0 $BMP_DEVS" + ;; + CANON) + # All Canon printers + P_DEVS0="$P_DEVS0 $CANON_DEVS" + ;; + EPSON) + # All Epson printers + P_DEVS0="$P_DEVS0 $EPSON_DEVS" + ;; + FAX) + # Fax file formats + F_DEVS0="$F_DEVS0 $FAX_DEVS" + ;; + JPEG) + # Jpeg file formats + F_DEVS0="$F_DEVS0 $JPEG_DEVS" + ;; + JBIG2) + # JBIG file formats + JBIG2_DEVS="$JBIG2DEVS" + ;; + PNG) + # PNG file formats + PNG_DEVS0="$PNGDEVS" + ;; + TIFF) + # TIFF file formats + F_DEVS0="$F_DEVS0 $TIFF_DEVS" + ;; + PCLXL) + # PCL XL/PCL 6 drivers + F_DEVS0="$F_DEVS0 $PCLXL_DEVS" + ;; + PCX) + # PCX file formats + F_DEVS0="$F_DEVS0 $PCX_DEVS" + ;; + PBM) + # PBM file formats + F_DEVS0="$F_DEVS0 $PBM_DEVS" + ;; + CUPS) + # CUPS file format + CUPS_DEVS0="$CUPSDEV" + ;; + HP) + # All HP printers + P_DEVS0="$P_DEVS0 $HP_DEVS" + ;; + LEXMARK) + # All Lexmark printers + P_DEVS0="$P_DEVS0 $LEXMARK_DEVS" + ;; + BROTHER) + # All Brother printers + P_DEVS0="$P_DEVS0 $BROTHER_DEVS" + ;; + OKI) + # All OKI printers + P_DEVS0="$P_DEVS0 $OKI_DEVS" + ;; + IBM) + # All IBM printers + P_DEVS0="$P_DEVS0 $IBM_DEVS" + ;; + IJS) + # IJS printers IJS_DEVS0="$IJSDEVS" - ;; - FILES) - F_DEVS0="$F_DEVS0 $BMP_DEVS $FAX_DEVS $JPEG_DEVS $TIFF_DEVS $PCX_DEVS $PBM_DEVS $PS_DEVS $WTS_HALFTONING_DEVS $MISC_FDEVS" - CUPS_DEVS0="$CUPSDEV" - JBIG2_DEVS="$JBIG2DEVS" - PNG_DEVS0="$PNGDEVS" - ;; - APPLE) - # All Apple printers - P_DEVS0="$P_DEVS0 $APPLE_DEVS" - ;; - BMP) - # BMP file format - F_DEVS0="$F_DEVS0 $BMP_DEVS" - ;; - CANON) - # All Canon printers - P_DEVS0="$P_DEVS0 $CANON_DEVS" - ;; - EPSON) - # All Epson printers - P_DEVS0="$P_DEVS0 $EPSON_DEVS" - ;; - FAX) - # Fax file formats - F_DEVS0="$F_DEVS0 $FAX_DEVS" - ;; - JPEG) - # Jpeg file formats - F_DEVS0="$F_DEVS0 $JPEG_DEVS" - ;; - JBIG2) - # JBIG file formats - JBIG2_DEVS="$JBIG2DEVS" - ;; - PNG) - # PNG file formats - PNG_DEVS0="$PNGDEVS" - ;; - TIFF) - # TIFF file formats - F_DEVS0="$F_DEVS0 $TIFF_DEVS" - ;; - PCLXL) - # PCL XL/PCL 6 drivers - F_DEVS0="$F_DEVS0 $PCLXL_DEVS" - ;; - PCX) - # PCX file formats - F_DEVS0="$F_DEVS0 $PCX_DEVS" - ;; - PBM) - # PBM file formats - F_DEVS0="$F_DEVS0 $PBM_DEVS" - ;; - CUPS) - # CUPS file format - CUPS_DEVS0="$CUPSDEV" - ;; - HP) - # All HP printers - P_DEVS0="$P_DEVS0 $HP_DEVS" - ;; - LEXMARK) - # All Lexmark printers - P_DEVS0="$P_DEVS0 $LEXMARK_DEVS" - ;; - BROTHER) - # All Brother printers - P_DEVS0="$P_DEVS0 $BROTHER_DEVS" - ;; - OKI) - # All OKI printers - P_DEVS0="$P_DEVS0 $OKI_DEVS" - ;; - IBM) - # All IBM printers - P_DEVS0="$P_DEVS0 $IBM_DEVS" - ;; - IJS) - # IJS printers - IJS_DEVS0="$IJSDEVS" - ;; - JAPAN) - # All old japanese printers - P_DEVS0="$P_DEVS0 $JAPAN_DEVS" - ;; - PS) - # PostScript/PDF writing - F_DEVS0="$F_DEVS0 $PS_DEVS" - ;; - SVG) - # PostScript/PDF writing - SVG_DEVS0="$SVGDEV" - ;; - WTS) - # WTS Halftoning devices - F_DEVS0="$F_DEVS0 $WTS_HALFTONING_DEVS" - ;; - ETS) - # ETS Halftoning devices - F_DEVS0="$F_DEVS0 $ETS_HALFTONING_DEVS" - ;; - X11) - # X11 display devices - X11_DEVS0="$X_DEVS" - ;; + ;; + JAPAN) + # All old japanese printers + P_DEVS0="$P_DEVS0 $JAPAN_DEVS" + ;; + PS) + # PostScript/PDF writing + F_DEVS0="$F_DEVS0 $PS_DEVS" + ;; + SVG) + # PostScript/PDF writing + SVG_DEVS0="$SVGDEV" + ;; + ETS) + # ETS Halftoning devices + F_DEVS0="$F_DEVS0 $ETS_HALFTONING_DEVS" + ;; + X11) + # X11 display devices + X11_DEVS0="$X_DEVS" + ;; opvp) - # Open Vector Printing driver... - if test x$ac_cv_lib_dl_dlopen != xno -a x$found_iconv != xno; then - P_DEVS0="$P_DEVS0 $OPVP_DEVS" - else - AC_MSG_WARN(Unable to include opvp/oprp driver due to missing or disabled prerequisites...) - fi - ;; - *) - # It's a driver name (or a user messup) - P_DEVS0="$P_DEVS0 `echo $THIS |sed -e 's,\.dev$,,'`" - ;; - esac + # Open Vector Printing driver... + if test x$ac_cv_lib_dl_dlopen != xno -a x$found_iconv != xno; then + P_DEVS0="$P_DEVS0 $OPVP_DEVS" + else + AC_MSG_WARN(Unable to include opvp/oprp driver due to missing or disabled prerequisites...) + fi + ;; + *) + # It's a driver name (or a user messup) + P_DEVS0="$P_DEVS0 `echo $THIS |sed -e 's,\.dev$,,'`" + ;; + esac done noncontribmakefiles=`find . -name '*.mak' -print | grep -v '^\./contrib/'` @@ -1453,76 +1583,78 @@ INSTALL_SHARED="" case `uname` in - Linux*|GNU*) - DYNAMIC_CFLAGS="-fPIC" - DYNAMIC_LDFLAGS="-fPIC -shared" + Linux*|GNU*) + DYNAMIC_CFLAGS="-fPIC" + DYNAMIC_LDFLAGS="-fPIC -shared" if test $ac_cv_prog_gcc = yes; then # GCC high level flag - DYNAMIC_LIBS="-rdynamic -ldl" + DYNAMIC_LIBS="-rdynamic -ldl" else DYNAMIC_LIBS="" fi - ;; - *BSD) - DYNAMIC_CFLAGS="-fPIC" - DYNAMIC_LDFLAGS="-fPIC -shared" - DYNAMIC_LIBS="" - ;; - Darwin*) - DYNAMIC_LDFLAGS="-dynamiclib" - DYNAMIC_LIBS="" - ;; - SunOS) - if test $ac_cv_prog_gcc = yes; then - DYNAMIC_CFLAGS="-fPIC" - else - DYNAMIC_CFLAGS="-KPIC" - fi - DYNAMIC_LDFLAGS="-G" - DYNAMIC_LIBS="" - ;; + ;; + *BSD) + DYNAMIC_CFLAGS="-fPIC" + DYNAMIC_LDFLAGS="-fPIC -shared" + DYNAMIC_LIBS="" + ;; + Darwin*) + DYNAMIC_LDFLAGS="-dynamiclib" + DYNAMIC_LIBS="" + ;; + SunOS) + if test $ac_cv_prog_gcc = yes; then + DYNAMIC_CFLAGS="-fPIC" + else + DYNAMIC_CFLAGS="-KPIC" + fi + DYNAMIC_LDFLAGS="-G" + DYNAMIC_LIBS="" + ;; esac AC_ARG_ENABLE([dynamic], AC_HELP_STRING([--enable-dynamic], [Enable dynamically loaded drivers]), [ - case `uname` in - Linux*|GNU*) - INSTALL_SHARED="install-shared" - if test "x$X_DEVS" != x; then - DYNAMIC_DEVS="\$(GLOBJDIR)/X11.so" - else - DYNAMIC_DEVS="" - fi - DYNAMIC_FLAGS="-DGS_DEVS_SHARED -DGS_DEVS_SHARED_DIR=\\\"\$(gssharedir)\\\"" - X11_DEVS="" - OPT_CFLAGS="$DYNAMIC_CFLAGS $OPT_CFLAGS" - DBG_CFLAGS="$DYNAMIC_CFLAGS $DBG_CFLAGS" - ;; - *BSD) - DYNAMIC_DEVS="\$(GLOBJDIR)/X11.so" - DYNAMIC_FLAGS="-DGS_DEVS_SHARED -DGS_DEVS_SHARED_DIR=\\\"\$(gssharedir)\\\"" - X11_DEVS="" - OPT_CFLAGS="$DYNAMIC_CFLAGS $OPT_CFLAGS" - DBG_CFLAGS="$DYNAMIC_CFLAGS $DBG_CFLAGS" - ;; - Darwin*) - INSTALL_SHARED="install-shared" - DYNAMIC_FLAGS="-DGS_DEVS_SHARED -DGS_DEVS_SHARED_DIR=\\\"\$(gssharedir)\\\"" - X11_DEVS="" - OPT_CFLAGS="$DYNAMIC_CFLAGS $OPT_CFLAGS" - DBG_CFLAGS="$DYNAMIC_CFLAGS $DBG_CFLAGS" - ;; - SunOS) - DYNAMIC_DEVS="\$(GLOBJDIR)/X11.so" - DYNAMIC_FLAGS="-DGS_DEVS_SHARED -DGS_DEVS_SHARED_DIR=\\\"\$(gssharedir)\\\"" - OPT_CFLAGS="$DYNAMIC_CFLAGS $OPT_CFLAGS" - DBG_CFLAGS="$DYNAMIC_CFLAGS $DBG_CFLAGS" - ;; - *) - AC_MSG_ERROR([Sorry, dynamic driver support not available on this platform!]) - ;; - esac + if test "x$enable_dynamic" != xno; then + case `uname` in + Linux*|GNU*) + INSTALL_SHARED="install-shared" + if test "x$X_DEVS" != x; then + DYNAMIC_DEVS="\$(GLOBJDIR)/X11.so" + else + DYNAMIC_DEVS="" + fi + DYNAMIC_FLAGS="-DGS_DEVS_SHARED -DGS_DEVS_SHARED_DIR=\\\"\$(gssharedir)\\\"" + X11_DEVS="" + OPT_CFLAGS="$DYNAMIC_CFLAGS $OPT_CFLAGS" + DBG_CFLAGS="$DYNAMIC_CFLAGS $DBG_CFLAGS" + ;; + *BSD) + DYNAMIC_DEVS="\$(GLOBJDIR)/X11.so" + DYNAMIC_FLAGS="-DGS_DEVS_SHARED -DGS_DEVS_SHARED_DIR=\\\"\$(gssharedir)\\\"" + X11_DEVS="" + OPT_CFLAGS="$DYNAMIC_CFLAGS $OPT_CFLAGS" + DBG_CFLAGS="$DYNAMIC_CFLAGS $DBG_CFLAGS" + ;; + Darwin*) + INSTALL_SHARED="install-shared" + DYNAMIC_FLAGS="-DGS_DEVS_SHARED -DGS_DEVS_SHARED_DIR=\\\"\$(gssharedir)\\\"" + X11_DEVS="" + OPT_CFLAGS="$DYNAMIC_CFLAGS $OPT_CFLAGS" + DBG_CFLAGS="$DYNAMIC_CFLAGS $DBG_CFLAGS" + ;; + SunOS) + DYNAMIC_DEVS="\$(GLOBJDIR)/X11.so" + DYNAMIC_FLAGS="-DGS_DEVS_SHARED -DGS_DEVS_SHARED_DIR=\\\"\$(gssharedir)\\\"" + OPT_CFLAGS="$DYNAMIC_CFLAGS $OPT_CFLAGS" + DBG_CFLAGS="$DYNAMIC_CFLAGS $DBG_CFLAGS" + ;; + *) + AC_MSG_ERROR([Sorry, dynamic driver support not available on this platform!]) + ;; + esac + fi ]) AC_SUBST(DYNAMIC_CFLAGS) @@ -1539,32 +1671,32 @@ dnl Fix "prefix" variable... if test "x$prefix" = xNONE; then - prefix=/usr/local + prefix=/usr/local fi dnl Fix "datadir" variable... if test "x$datadir" = 'x${prefix}/share'; then - datadir="$prefix/share" + datadir="$prefix/share" fi dnl Fix "fontpath" variable... if test "x$fontpath" = "x"; then - # These font directories are used by various Linux distributions... - fontpath="$datadir/fonts/default/ghostscript" - fontpath="${fontpath}:$datadir/fonts/default/Type1" - fontpath="${fontpath}:$datadir/fonts/default/TrueType" - - # These font directories are used by IRIX... - fontpath="${fontpath}:/usr/lib/DPS/outline/base" - - # These font directories are used by Solaris... - fontpath="${fontpath}:/usr/openwin/lib/X11/fonts/Type1" - fontpath="${fontpath}:/usr/openwin/lib/X11/fonts/TrueType" - - # This font directory is used by CUPS... - if test "x$CUPSCONFIG" != x; then - fontpath="${fontpath}:`$CUPSCONFIG --datadir`/fonts" - fi + # These font directories are used by various Linux distributions... + fontpath="$datadir/fonts/default/ghostscript" + fontpath="${fontpath}:$datadir/fonts/default/Type1" + fontpath="${fontpath}:$datadir/fonts/default/TrueType" + + # These font directories are used by IRIX... + fontpath="${fontpath}:/usr/lib/DPS/outline/base" + + # These font directories are used by Solaris... + fontpath="${fontpath}:/usr/openwin/lib/X11/fonts/Type1" + fontpath="${fontpath}:/usr/openwin/lib/X11/fonts/TrueType" + + # This font directory is used by CUPS... + if test "x$CUPSCONFIG" != x; then + fontpath="${fontpath}:`$CUPSCONFIG --datadir`/fonts" + fi fi AC_SUBST(fontpath) @@ -1598,18 +1730,50 @@ AC_CHECK_FUNCS([bzero dup2 floor gettimeofday memchr memmove memset mkdir mkfifo modf pow putenv rint setenv sqrt strchr strerror strrchr strspn strstr]) dnl -------------------------------------------------- +dnl check for big/little endian for LCMS +dnl -------------------------------------------------- + +AC_MSG_CHECKING([for big endian]) + +AC_RUN_IFELSE( + [AC_LANG_PROGRAM([#include ], [ + static const int one = 1; + return (*(char*)&one == 0 ? 0 : 1); + ])], + [LCMS_BIGENDIAN=1], + [LCMS_BIGENDIAN=0]) + +if test "x$LCMS_BIGENDIAN" != "x0"; then + LCMS_ENDIAN="-DUSE_BIG_ENDIAN=$LCMS_BIGENDIAN" + LCMS2_ENDIAN="-DCMS_USE_BIG_ENDIAN=$LCMS_BIGENDIAN" + AC_MSG_RESULT(yes) +else + LCMS_ENDIAN= + LCMS2_ENDIAN= + AC_MSG_RESULT(no) +fi + + +AC_SUBST(LCMS_ENDIAN) +AC_SUBST(LCMS2_ENDIAN) + +dnl -------------------------------------------------- dnl check for sse2 intrinsics dnl -------------------------------------------------- +AC_MSG_CHECKING([sse2 support]) +save_cflags=$CFLAGS +CFLAGS="$CFLAGS $OPT_CFLAGS" + HAVE_SSE2="" -AC_LINK_IFELSE([ -#include -int main (int argc, char *argv[]) -{ +AC_LINK_IFELSE( + [AC_LANG_PROGRAM([#include ], [ __m128i input1; + unsigned char buf1[[128]]; + input1 = _mm_loadu_si128((const __m128i *)buf1); return(0); -} -],HAVE_SSE2="-DHAVE_SSE2") + ])], + [HAVE_SSE2="-DHAVE_SSE2"], [HAVE_SSE2=""]) AC_ARG_ENABLE([sse2], AC_HELP_STRING([--disable-sse2], [Do not use sse2 instrinsics]), [ @@ -1617,42 +1781,56 @@ HAVE_SSE2="" fi]) +if test "x$HAVE_SSE2" != x; then + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + AC_SUBST(HAVE_SSE2) +CFLAGS=$save_cflags dnl -------------------------------------------------- dnl check for byte swap intrinsics dnl -------------------------------------------------- +AC_MSG_CHECKING([byteswap support]) HAVE_BSWAP32="" -AC_LINK_IFELSE([ -int main (int argc, char *argv[]) -{ - int a = __builtin_bswap32(argc); +AC_LINK_IFELSE( + [AC_LANG_PROGRAM([], [ + int a = 0; + int b = __builtin_bswap32(a); return(0); -} -],HAVE_BSWAP32="-DHAVE_BSWAP32", HAVE_BSWAP32="") + ])], + [HAVE_BSWAP32="-DHAVE_BSWAP32"], [HAVE_BSWAP32=""]) AC_ARG_ENABLE([bswap32], AC_HELP_STRING([--disable-bswap32], [Do not use bswap32 instrinsic]), [ if test "x$enable_bswap32" = xno; then HAVE_BSWAP32="" fi]) - + +if test "x$HAVE_BSWAP32" != x; then + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + AC_SUBST(HAVE_BSWAP32) dnl -------------------------------------------------- dnl check for byte swap header dnl -------------------------------------------------- +AC_MSG_CHECKING([for byteswap.h]) HAVE_BYTESWAP_H="" -AC_COMPILE_IFELSE([ -#include "byteswap.h" -int main (int argc, char *argv[]) -{ - int a = bswap_32(argc); +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([#include "byteswap.h"], [ + int a = 0; + int b = __builtin_bswap32(a); return(0); -} -],HAVE_BYTESWAP_H="-DHAVE_BYTESWAP_H", HAVE_BYTESWAP_H="") + ])], + [HAVE_BYTESWAP_H="-DHAVE_BYTESWAP_H"], [HAVE_BYTESWAP_H=""]) AC_ARG_ENABLE([byteswap-h], AC_HELP_STRING([--disable-byteswap-h], [Do not use byteswap.h functions]), [ @@ -1660,6 +1838,12 @@ HAVE_BYTESWAP_H="" fi]) +if test "x$HAVE_BYTESWAP_H" != x; then + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + AC_SUBST(HAVE_BYTESWAP_H) dnl -------------------------------------------------- @@ -1673,7 +1857,17 @@ AC_OUTPUT(Makefile) if ( test -d cups ); then -AC_OUTPUT(cups/pstopxl) -chmod +x cups/pstopxl +AC_OUTPUT(cups/gstopxl) +chmod +x cups/gstopxl +fi + +if test "x$JPX_DECODER" = "xjasper"; then + AC_MSG_WARN([Using JasPer for PDF JPXDecode support]) + AC_MSG_WARN([Support for JaSPER is deprecated and will be removed in a future release]) +fi + +if test "x$AFS" = "x1"; then + AC_MSG_WARN([Using "native" font scaler which is now deprecated (rather than freetype),]) + AC_MSG_WARN([Support for this will be removed in a future release]) fi diff -Nru ghostscript-9.04~dfsg/base/devs.mak ghostscript-9.05~dfsg~20120125/base/devs.mak --- ghostscript-9.04~dfsg/base/devs.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/devs.mak 2011-12-09 10:16:21.000000000 +0000 @@ -133,9 +133,6 @@ # bmp256 8-bit (256-color) .BMP file format # bmp16m 24-bit .BMP file format # bmp32b 32-bit pseudo-.BMP file format -# cgmmono Monochrome (black-and-white) CGM -- LOW LEVEL OUTPUT ONLY -# cgm8 8-bit (256-color) CGM -- DITTO -# cgm24 24-bit color CGM -- DITTO # jpeg JPEG format, RGB output # jpeggray JPEG format, gray output # jpegcmyk JPEG format, cmyk output @@ -801,14 +798,24 @@ # Plain text writer -txtwrite_=$(GLOBJ)gdevtxtw.$(OBJ) -$(DD)txtwrite.dev : $(DEVS_MAK) $(ECHOGS_XE) $(txtwrite_) $(GDEV) +gdevagl_h=$(GLSRC)gdevagl.h + +txtwrite_=$(GLOBJ)gdevtxtw.$(OBJ) $(GLOBJ)gdevagl.$(OBJ) + +$(DD)txtwrite.dev : $(DEVS_MAK) $(ECHOGS_XE) $(txtwrite_) $(GDEV)\ + $(gdevagl_h) $(SETDEV2) $(DD)txtwrite $(txtwrite_) $(GLOBJ)gdevtxtw.$(OBJ) : $(GLSRC)gdevtxtw.c $(GDEV)\ - $(math__h) $(memory__h) $(string__h) $(time__h) + $(memory__h) $(string__h) $(gp_h) $(gsparam_h) $(gsutil_h) \ + $(gsdevice_h) $(gxfont_h) $(gxfont0_h) $(gstext_h) $(gxfcid_h)\ + $(gxistate_h) $(gxpath_h) $(gdevagl_h) $(GLCC) $(GLO_)gdevtxtw.$(OBJ) $(C_) $(GLSRC)gdevtxtw.c +$(GLOBJ)gdevagl.$(OBJ) : $(GLSRC)gdevagl.c $(GDEV)\ + $(gdevagl_h) + $(GLCC) $(GLO_)gdevagl.$(OBJ) $(C_) $(GLSRC)gdevagl.c + ################ BEGIN PDF WRITER ################ @@ -824,7 +831,7 @@ pdfwrite5_=$(GLOBJ)gdevpdfm.$(OBJ) pdfwrite6_=$(GLOBJ)gdevpdfo.$(OBJ) $(GLOBJ)gdevpdfp.$(OBJ) $(GLOBJ)gdevpdft.$(OBJ) pdfwrite7_=$(GLOBJ)gdevpdfr.$(OBJ) -pdfwrite8_=$(GLOBJ)gdevpdfu.$(OBJ) $(GLOBJ)gdevpdfv.$(OBJ) +pdfwrite8_=$(GLOBJ)gdevpdfu.$(OBJ) $(GLOBJ)gdevpdfv.$(OBJ) $(GLOBJ)gdevagl.$(OBJ) pdfwrite9_= $(GLOBJ)ConvertUTF.$(OBJ) pdfwrite10_=$(GLOBJ)gsflip.$(OBJ) pdfwrite11_=$(GLOBJ)scantab.$(OBJ) $(GLOBJ)sfilter2.$(OBJ) @@ -873,7 +880,6 @@ $(spprint_h) $(stream_h) $(gdevpsdf_h) $(gxdevmem_h) $(sarc4_h) opdfread_h=$(GLSRC)opdfread.h -gs_agl_h=$(GLSRC)gs_agl.h gs_mro_e_h=$(GLSRC)gs_mro_e.h gs_mgl_e_h=$(GLSRC)gs_mgl_e.h @@ -921,7 +927,7 @@ $(gserrors_h) $(gsdevice_h) $(gsflip_h) $(gsiparm4_h) $(gsstate_h) $(gscolor2_h)\ $(gdevpdfx_h) $(gdevpdfg_h) $(gdevpdfo_h)\ $(gxcspace_h) $(gximage3_h) $(gximag3x_h) $(gxdcolor_h) $(gxpcolor_h)\ - $(gxhldevc_h) + $(gxhldevc_h) $(gsicc_manage_h) $(GLCC) $(GLO_)gdevpdfi.$(OBJ) $(C_) $(GLSRC)gdevpdfi.c $(GLOBJ)gdevpdfj.$(OBJ) : $(GLSRC)gdevpdfj.c\ @@ -970,7 +976,7 @@ $(sa85x_h) $(scfx_h) $(sdct_h) $(slzwx_h) $(spngpx_h)\ $(srlx_h) $(sarc4_h) $(smd5_h) $(sstring_h) $(strimpl_h) $(szlibx_h)\ $(strmio_h) $(sjbig2_luratech_h) $(sjpx_luratech_h)\ - $(opdfread_h) $(gs_agl_h) $(gs_mro_e_h) $(gs_mgl_e_h) + $(opdfread_h) $(gdevagl_h) $(gs_mro_e_h) $(gs_mgl_e_h) $(GDEVLWFJB2JPXCC) $(GLO_)gdevpdfu.$(OBJ) $(C_) $(GLSRC)gdevpdfu.c $(GLOBJ)gdevpdfv.$(OBJ) : $(GLSRC)gdevpdfv.c $(GXERR) $(math__h) $(string__h)\ @@ -1241,33 +1247,6 @@ $(SETPDEV2) $(DD)bmpa32b $(bmpa_) $(ADDMOD) $(DD)bmpa32b -include $(GLD)async -### -------------------------- CGM file format ------------------------- ### -### This driver is under development. Use at your own risk. ### -### The output is very low-level, consisting only of rectangles and ### -### cell arrays. ### - -cgm_=$(GLOBJ)gdevcgm.$(OBJ) $(GLOBJ)gdevcgml.$(OBJ) - -gdevcgml_h=$(GLSRC)gdevcgml.h -gdevcgmx_h=$(GLSRC)gdevcgmx.h $(gdevcgml_h) - -$(GLOBJ)gdevcgm.$(OBJ) : $(GLSRC)gdevcgm.c $(GDEV) $(memory__h)\ - $(gp_h) $(gsparam_h) $(gsutil_h) $(gdevpccm_h) $(gdevcgml_h) - $(GLCC) $(GLO_)gdevcgm.$(OBJ) $(C_) $(GLSRC)gdevcgm.c - -$(GLOBJ)gdevcgml.$(OBJ) : $(GLSRC)gdevcgml.c $(memory__h) $(stdio__h)\ - $(gdevcgmx_h) - $(GLCC) $(GLO_)gdevcgml.$(OBJ) $(C_) $(GLSRC)gdevcgml.c - -$(DD)cgmmono.dev : $(DEVS_MAK) $(cgm_) $(GDEV) - $(SETDEV) $(DD)cgmmono $(cgm_) - -$(DD)cgm8.dev : $(DEVS_MAK) $(cgm_) $(GDEV) - $(SETDEV) $(DD)cgm8 $(cgm_) - -$(DD)cgm24.dev : $(DEVS_MAK) $(cgm_) $(GDEV) - $(SETDEV) $(DD)cgm24 $(cgm_) - ### ------------------------ The DeviceN device ------------------------ ### devn_=$(GLOBJ)gdevdevn.$(OBJ) @@ -1564,56 +1543,6 @@ $(SETPDEV2) $(DD)pngalpha $(png_) $(ADDMOD) $(DD)pngalpha $(png_i_) -### --------------------- WTS Halftoning drivers ---------------------- ### - -### IMDI from Argyll - -IMDISRC=$(IMDISRCDIR)$(D) - -simdi_=$(GLOBJ)imdi.$(OBJ) $(GLOBJ)imdi_tab.$(OBJ) - -$(GLOBJ)imdi.$(OBJ) : $(IMDISRC)imdi.c - $(GLCC) $(GLO_)imdi.$(OBJ) $(C_) $(IMDISRC)imdi.c - -$(GLOBJ)imdi_tab.$(OBJ) : $(IMDISRC)imdi_tab.c - $(GLCC) $(GLO_)imdi_tab.$(OBJ) $(C_) $(IMDISRC)imdi_tab.c - -$(DD)simdi.dev : $(DEVS_MAK) $(simdi_) $(GDEV) - $(SETMOD) $(DD)simdi $(simdi_) - -### WTS halftoning CMYK device - -wts_=$(GLOBJ)gdevwts.$(OBJ) - -$(GLOBJ)gdevwts.$(OBJ) : $(GLSRC)gdevwts.c $(PDEVH)\ - $(gscdefs_h) $(gscspace_h) $(gxgetbit_h) $(gxiparam_h) $(gxlum_h)\ - $(gscms_h) $(gsicc_cache_h) $(gsicc_manage_h) - $(GLCC) -I$(IMDISRCDIR) $(GLO_)gdevwts.$(OBJ) $(C_) $(GLSRC)gdevwts.c - -$(DD)wtscmyk.dev : $(DEVS_MAK) $(wts_) $(GLD)page.dev $(GDEV) - $(SETPDEV2) $(DD)wtscmyk $(wts_) - -$(DD)wtsimdi.dev : $(DEVS_MAK) $(wts_) $(GLD)sicclib.dev $(GLD)simdi.dev\ - $(GLD)page.dev $(GDEV) - $(SETPDEV2) $(DD)wtsimdi $(wts_) - $(ADDMOD) $(DD)wtsimdi -include $(GLD)sicclib - $(ADDMOD) $(DD)wtsimdi -include $(GLD)simdi - -### IMDI color converting device - -imdi_=$(GLOBJ)gdevimdi.$(OBJ) - -$(GLOBJ)gdevimdi.$(OBJ) : $(GLSRC)gdevimdi.c $(PDEVH) \ - $(gscdefs_h) $(gscspace_h) $(gxgetbit_h) $(gxiparam_h) $(gxlum_h)\ - $(gscms_h) $(gsicc_cache_h) $(gsicc_manage_h) - $(GLCC) -I$(IMDISRCDIR) $(GLO_)gdevimdi.$(OBJ) $(C_) $(GLSRC)gdevimdi.c - -$(DD)imdi.dev : $(DEVS_MAK) $(imdi_) $(GLD)page.dev $(GLD)sicclib.dev\ - $(GLD)simdi.dev $(GDEV) - $(SETPDEV2) $(DD)imdi $(imdi_) - $(ADDMOD) $(DD)imdi -include $(GLD)sicclib - $(ADDMOD) $(DD)imdi -include $(GLD)simdi - ### ---------------------- PostScript image format ---------------------- ### ### These devices make it possible to print monochrome Level 2 files on a ### ### Level 1 printer, by converting them to a bitmap in PostScript ### diff -Nru ghostscript-9.04~dfsg/base/echogs.c ghostscript-9.05~dfsg~20120125/base/echogs.c --- ghostscript-9.04~dfsg/base/echogs.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/echogs.c 2012-01-25 08:44:23.000000000 +0000 @@ -91,7 +91,7 @@ FILE *in = 0; const char *extn = ""; char fmode[4]; -#define FNSIZE 1000 +#define FNSIZE 4096 char *fnparam = NULL; /* Initialisation to shut up compilers */ char fname[FNSIZE]; int newline = 1; @@ -99,7 +99,8 @@ int (*eputc)(int, FILE *) = fputc; int (*eputs)(const char *, FILE *) = fputs; #define LINESIZE 1000+FNSIZE - char line[LINESIZE]; +#define LINESIZESLOP LINESIZE + 10 + char line[LINESIZESLOP]; char sw = 0, sp = 0, hexx = 0; char **argp = argv + 1; int nargs = argc - 1; @@ -124,7 +125,11 @@ if (i == nargs) return 1; fnparam = argp[i]; - strcpy(fmode, *argp + 1); + strncpy(fmode, *argp + 1, 4); + if (strlen(fnparam) + strlen(extn) >= FNSIZE) { + fputs("File param size exceeded\n", stderr); + return 1; + } strcpy(fname, fnparam); strcat(fname, extn); if (fmode[len - 2] == '-') { @@ -159,16 +164,23 @@ } while (1) { char *arg; + int i; if (interact) { - if (fgets(line, LINESIZE, in) == NULL) { + if (fgets(line, LINESIZESLOP, in) == NULL) { interact = 0; if (in != stdin) fclose(in); continue; } /* Remove the terminating \n. */ - line[strlen(line) - 1] = 0; + if (strlen(line) > LINESIZE) { + fputs("Line limit exceeded\n", stderr); + return 1; + } + for (i = strlen(line) - 1; i < LINESIZESLOP; i++) { + line[i] = 0; + } arg = line; } else { if (nargs == 0) diff -Nru ghostscript-9.04~dfsg/base/gdbflags.h ghostscript-9.05~dfsg~20120125/base/gdbflags.h --- ghostscript-9.04~dfsg/base/gdbflags.h 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdbflags.h 2012-01-07 20:18:22.000000000 +0000 @@ -0,0 +1,148 @@ +/* Copyright (C) 2011 Artifex Software, Inc. + All Rights Reserved. + + This software is provided AS-IS with no warranty, either express or + implied. + + This software is distributed under license and may not be copied, modified + or distributed except as expressly authorized under the terms of that + license. Refer to licensing information at http://www.artifex.com/ + or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. +*/ +/* $Id$ */ +/* Debugging flag definitions */ + +/* This is a chameleonic header file; that is to say, it appears differently + * in different circumstances. The caller should provide an appropriate + * definition of FLAG and UNUSED before including it. As such there is no guard against + * repeated inclusion. + */ + +UNUSED(0) /* Never use 0, as lots of things 'imply' 0. */ +FLAG(icc, 1, 'c', "ICC profile"), +UNUSED(2) +UNUSED(3) +UNUSED(4) +UNUSED(5) +UNUSED(6) +UNUSED(7) +UNUSED(8) +UNUSED(9) +UNUSED(10) +UNUSED(11) +UNUSED(12) +UNUSED(13) +UNUSED(14) +UNUSED(15) +UNUSED(16) +UNUSED(17) +UNUSED(18) +UNUSED(19) +UNUSED(20) +UNUSED(21) +UNUSED(22) +UNUSED(23) +UNUSED(24) +UNUSED(25) +UNUSED(26) +UNUSED(27) +UNUSED(28) +UNUSED(29) +UNUSED(30) +UNUSED(31) +UNUSED(32) +FLAG(ps_op_names, '!', 0, "Postscript operator names"), +FLAG(contexts_detail, '"', 0, "Contexts (detail)"), +FLAG(trace_errors, '#', 0, "Turn on tracing of error returns from operators"), +FLAG(memfill_obj, '$', 0, "Fill unused parts of object with identifiable garbage values"), +FLAG(ext_commands, '%', 0, "Externally processed commands"), +UNUSED('&') +FLAG(contexts, '\'',0, "Contexts (create/destroy)"), +UNUSED('(') +UNUSED(')') +FLAG(image, '*', 0, "Image and rasterop parameters"), +FLAG(min_stack, '+', 0, "Use minimum_size stack blocks"), +FLAG(no_path_banding, ',', 0, "Don't use path-based banding"), +UNUSED('-') +FLAG(small_mem_tables, '.', 0, "Use small-memory table sizes even on large-memory machines"), +FLAG(file_line, '/', 0, "Include file/line info on all trace output"), +FLAG(gc, '0', 0, "Garbage collection, minimal detail"), +FLAG(type1, '1', 0, "Type 1 and type 43 font interpreter"), +FLAG(curve, '2', 0, "Curve subdivider/rasterizer"), +FLAG(curve_detail, '3', 0, "Curve subdivider/rasterizer (detail)"), +FLAG(gc_strings, '4', 0, "Garbage collector (strings)"), +FLAG(gc_strings_detail, '5', 0, "Garbage collector (strings, detail)"), +FLAG(gc_chunks, '6', 0, "Garbage collector (chunks, roots)"), +FLAG(gc_objects, '7', 0, "Garbage collector (objects)"), +FLAG(gc_refs, '8', 0, "Garbage collector (refs)"), +FLAG(gc_pointers, '9', 0, "Garbage collector (pointers)"), +FLAG(time, ':', 0, "Command list and allocator time summary"), +UNUSED(';') +UNUSED('<') +UNUSED('=') +UNUSED('>') +FLAG(validate_pointers, '?', 0, "Validate pointers before/during/after garbage collection/save and restore"), +FLAG(memfill_empty, '@', 0, "Fill empty storage with a distinctive bit pattern for debugging"), +FLAG(alloc_detail, 'A', 0, "Allocator (all calls)"), +FLAG(bitmap_detail, 'B', 0, "Bitmap images (detail)"), +FLAG(color_detail, 'C', 0, "Color mapping (detail)"), +FLAG(dict_detail, 'D', 0, "Dictionary (every lookup)"), +UNUSED('E') +FLAG(fill_detail, 'F', 0, "Fill algorithm (detail)"), +UNUSED('G') +FLAG(halftones_detail, 'H', 0, "Halftones (detail)"), +FLAG(interp_detail, 'I', 0, "Interpreter (detail)"), +UNUSED('J') +FLAG(char_cache_detail, 'K', 0, "Character cache (detail)"), +FLAG(clist_detail, 'L', 0, "Command list (detail)"), +UNUSED('M') +UNUSED('N') +FLAG(stroke_detail, 'O', 0, "Stroke (detail)"), +FLAG(paths_detail, 'P', 0, "Paths (detail)"), +UNUSED('Q') +UNUSED('R') +FLAG(scanner, 'S', 0, "Scanner"), +UNUSED('T') +FLAG(undo_detail, 'U', 0, "Undo saver (for save/restore) (detail)"), +FLAG(compositors_detail,'V', 0, "Compositors (alpha/transparency/overprint/rop) (detail)"), +UNUSED('W') +UNUSED('X') +FLAG(type1_hints_detail,'Y', 0, "Type 1 hints (detail)"), +UNUSED('Z') +UNUSED('[') +UNUSED('\\') +UNUSED(']') +FLAG(ref_counts, '^', 0, "Reference counting"), +FLAG(high_level, '_', 0, "High level output"), +FLAG(no_hl_img_banding, '`', 0, "Don't use high_level banded images"), +FLAG(alloc, 'a', 'A', "Allocator (large blocks)"), +FLAG(bitmap, 'b', 'B', "Bitmap images"), +FLAG(color_halftones, 'c', 'C', "Color mapping"), +FLAG(dict, 'd', 'D', "Dictionary (put/undef)"), +FLAG(external_calls, 'e', 0, "External (OS related) calls"), +FLAG(fill, 'f', 'F', "Fill algorithm"), +FLAG(gsave, 'g', 0, "gsave/grestore"), +FLAG(halftones, 'h', 'H', "Halftones"), +FLAG(interp, 'i', 'I', "Interpreter (names only)"), +FLAG(comp_fonts, 'j', 0, "Composite fonts"), +FLAG(char_cache, 'k', 'K', "Character cache"), +FLAG(clist, 'l', 'L', "Command list (bands)"), +FLAG(makefont, 'm', 0, "makefont and font cache"), +FLAG(names, 'n', 0, "Name lookup (new names only)"), +FLAG(stroke, 'o', 'O', "Stroke"), +FLAG(paths, 'p', 'P', "Paths (band list)"), +FLAG(clipping, 'q', 0, "Clipping"), +FLAG(arcs, 'r', 0, "Arcs"), +FLAG(streams, 's', 'S', "Streams"), +FLAG(tiling, 't', 0, "Tiling algorithm"), +FLAG(undo, 'u', 'U', "Undo saver (for save/restore)"), +FLAG(compositors, 'v', 'V', "Compositors (alpha/transparency/overprint/rop)"), +FLAG(compress, 'w', 0, "Compression encoder/decoder"), +FLAG(transforms, 'x', 0, "Transformations"), +FLAG(type1_hints, 'y', 'Y', "Type 1 hints"), +FLAG(trapezoid_fill, 'z', 0, "Trapezoid fill"), +UNUSED('{') +UNUSED('|') /* "Reserved for experimental code" */ +UNUSED('}') +FLAG(math, '~', 0, "Math functions and Functions") diff -Nru ghostscript-9.04~dfsg/base/gdebug.h ghostscript-9.05~dfsg~20120125/base/gdebug.h --- ghostscript-9.04~dfsg/base/gdebug.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdebug.h 2011-11-12 18:29:08.000000000 +0000 @@ -29,10 +29,17 @@ * turn printout on and off during debugging. (In fact, we even provide a * PostScript operator, .setdebug, that does this.) * - * The debugging flags are normally indexed by character code. This is more - * than a convention: gs_debug_c, which tests whether a given flag is set, - * considers that if a flag named by a given upper-case letter is set, the - * flag named by the corresponding lower-case letter is also set. + * The debugging flags are normally indexed by character code. Originally + * this was more than a convention: gs_debug_c, which tests whether a given + * flag is set, considers that if a flag named by a given upper-case letter + * is set, the flag named by the corresponding lower-case letter is also + * set. + * + * The new code uses a 'implication' table that allows us to be more general; + * any debug flag can now 'imply' another one. By default this is setup + * to give the same behaviour as before, but newly added flags are not + * constrained in the same way - we can have A -> B -> C etc or can have + * upper case flags that don't imply lower case ones. * * If the output selected by a given flag can be printed by a single * printf, the conventional way to produce the output is @@ -46,6 +53,29 @@ * ... produce additional output within a line with dprintfN(...) * } */ + +typedef enum { +#define FLAG(a,b,c,d) gs_debug_flag_ ## a = b +#define UNUSED(a) +#include "gdbflags.h" +#undef FLAG +#undef UNUSED +} gs_debug_flag; + +typedef struct { + int used; + char short_desc[20]; + char long_desc[80]; +} gs_debug_flag_details; + +#define gs_debug_flags_max 127 +extern const byte gs_debug_flag_implied_by[gs_debug_flags_max]; +extern const gs_debug_flag_details gs_debug_flags[gs_debug_flags_max]; + + +int gs_debug_flags_parse(gs_memory_t *heap, const char *arg); +void gs_debug_flags_list(gs_memory_t *heap); + /* Define the array of debugging flags, indexed by character code. */ extern char gs_debug[128]; bool gs_debug_c(int /*char */ ); diff -Nru ghostscript-9.04~dfsg/base/gdevagl.c ghostscript-9.05~dfsg~20120125/base/gdevagl.c --- ghostscript-9.04~dfsg/base/gdevagl.c 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevagl.c 2011-09-29 11:01:33.000000000 +0000 @@ -0,0 +1,4298 @@ +#include "gdevagl.h" + +single_glyph_list_t SingleGlyphList[] = { +{"A", 0x0041}, +{"AE", 0x00C6}, +{"AEacute", 0x01FC}, +{"AEmacron", 0x01E2}, +{"AEsmall", 0xF7E6}, +{"Aacute", 0x00C1}, +{"Aacutesmall", 0xF7E1}, +{"Abreve", 0x0102}, +{"Abreveacute", 0x1EAE}, +{"Abrevecyrillic", 0x04D0}, +{"Abrevedotbelow", 0x1EB6}, +{"Abrevegrave", 0x1EB0}, +{"Abrevehookabove", 0x1EB2}, +{"Abrevetilde", 0x1EB4}, +{"Acaron", 0x01CD}, +{"Acircle", 0x24B6}, +{"Acircumflex", 0x00C2}, +{"Acircumflexacute", 0x1EA4}, +{"Acircumflexdotbelow", 0x1EAC}, +{"Acircumflexgrave", 0x1EA6}, +{"Acircumflexhookabove", 0x1EA8}, +{"Acircumflexsmall", 0xF7E2}, +{"Acircumflextilde", 0x1EAA}, +{"Acute", 0xF6C9}, +{"Acutesmall", 0xF7B4}, +{"Acyrillic", 0x0410}, +{"Adblgrave", 0x0200}, +{"Adieresis", 0x00C4}, +{"Adieresiscyrillic", 0x04D2}, +{"Adieresismacron", 0x01DE}, +{"Adieresissmall", 0xF7E4}, +{"Adotbelow", 0x1EA0}, +{"Adotmacron", 0x01E0}, +{"Agrave", 0x00C0}, +{"Agravesmall", 0xF7E0}, +{"Ahookabove", 0x1EA2}, +{"Aiecyrillic", 0x04D4}, +{"Ainvertedbreve", 0x0202}, +{"Alpha", 0x0391}, +{"Alphatonos", 0x0386}, +{"Amacron", 0x0100}, +{"Amonospace", 0xFF21}, +{"Aogonek", 0x0104}, +{"Aring", 0x00C5}, +{"Aringacute", 0x01FA}, +{"Aringbelow", 0x1E00}, +{"Aringsmall", 0xF7E5}, +{"Asmall", 0xF761}, +{"Atilde", 0x00C3}, +{"Atildesmall", 0xF7E3}, +{"Aybarmenian", 0x0531}, +{"B", 0x0042}, +{"Bcircle", 0x24B7}, +{"Bdotaccent", 0x1E02}, +{"Bdotbelow", 0x1E04}, +{"Becyrillic", 0x0411}, +{"Benarmenian", 0x0532}, +{"Beta", 0x0392}, +{"Bhook", 0x0181}, +{"Blinebelow", 0x1E06}, +{"Bmonospace", 0xFF22}, +{"Brevesmall", 0xF6F4}, +{"Bsmall", 0xF762}, +{"Btopbar", 0x0182}, +{"C", 0x0043}, +{"Caarmenian", 0x053E}, +{"Cacute", 0x0106}, +{"Caron", 0xF6CA}, +{"Caronsmall", 0xF6F5}, +{"Ccaron", 0x010C}, +{"Ccedilla", 0x00C7}, +{"Ccedillaacute", 0x1E08}, +{"Ccedillasmall", 0xF7E7}, +{"Ccircle", 0x24B8}, +{"Ccircumflex", 0x0108}, +{"Cdot", 0x010A}, +{"Cdotaccent", 0x010A}, +{"Cedillasmall", 0xF7B8}, +{"Chaarmenian", 0x0549}, +{"Cheabkhasiancyrillic", 0x04BC}, +{"Checyrillic", 0x0427}, +{"Chedescenderabkhasiancyrillic", 0x04BE}, +{"Chedescendercyrillic", 0x04B6}, +{"Chedieresiscyrillic", 0x04F4}, +{"Cheharmenian", 0x0543}, +{"Chekhakassiancyrillic", 0x04CB}, +{"Cheverticalstrokecyrillic", 0x04B8}, +{"Chi", 0x03A7}, +{"Chook", 0x0187}, +{"Circumflexsmall", 0xF6F6}, +{"Cmonospace", 0xFF23}, +{"Coarmenian", 0x0551}, +{"Csmall", 0xF763}, +{"D", 0x0044}, +{"DZ", 0x01F1}, +{"DZcaron", 0x01C4}, +{"Daarmenian", 0x0534}, +{"Dafrican", 0x0189}, +{"Dcaron", 0x010E}, +{"Dcedilla", 0x1E10}, +{"Dcircle", 0x24B9}, +{"Dcircumflexbelow", 0x1E12}, +{"Dcroat", 0x0110}, +{"Ddotaccent", 0x1E0A}, +{"Ddotbelow", 0x1E0C}, +{"Decyrillic", 0x0414}, +{"Deicoptic", 0x03EE}, +{"Delta", 0x2206}, +{"Deltagreek", 0x0394}, +{"Dhook", 0x018A}, +{"Dieresis", 0xF6CB}, +{"DieresisAcute", 0xF6CC}, +{"DieresisGrave", 0xF6CD}, +{"Dieresissmall", 0xF7A8}, +{"Digammagreek", 0x03DC}, +{"Djecyrillic", 0x0402}, +{"Dlinebelow", 0x1E0E}, +{"Dmonospace", 0xFF24}, +{"Dotaccentsmall", 0xF6F7}, +{"Dslash", 0x0110}, +{"Dsmall", 0xF764}, +{"Dtopbar", 0x018B}, +{"Dz", 0x01F2}, +{"Dzcaron", 0x01C5}, +{"Dzeabkhasiancyrillic", 0x04E0}, +{"Dzecyrillic", 0x0405}, +{"Dzhecyrillic", 0x040F}, +{"E", 0x0045}, +{"Eacute", 0x00C9}, +{"Eacutesmall", 0xF7E9}, +{"Ebreve", 0x0114}, +{"Ecaron", 0x011A}, +{"Ecedillabreve", 0x1E1C}, +{"Echarmenian", 0x0535}, +{"Ecircle", 0x24BA}, +{"Ecircumflex", 0x00CA}, +{"Ecircumflexacute", 0x1EBE}, +{"Ecircumflexbelow", 0x1E18}, +{"Ecircumflexdotbelow", 0x1EC6}, +{"Ecircumflexgrave", 0x1EC0}, +{"Ecircumflexhookabove", 0x1EC2}, +{"Ecircumflexsmall", 0xF7EA}, +{"Ecircumflextilde", 0x1EC4}, +{"Ecyrillic", 0x0404}, +{"Edblgrave", 0x0204}, +{"Edieresis", 0x00CB}, +{"Edieresissmall", 0xF7EB}, +{"Edot", 0x0116}, +{"Edotaccent", 0x0116}, +{"Edotbelow", 0x1EB8}, +{"Efcyrillic", 0x0424}, +{"Egrave", 0x00C8}, +{"Egravesmall", 0xF7E8}, +{"Eharmenian", 0x0537}, +{"Ehookabove", 0x1EBA}, +{"Eightroman", 0x2167}, +{"Einvertedbreve", 0x0206}, +{"Eiotifiedcyrillic", 0x0464}, +{"Elcyrillic", 0x041B}, +{"Elevenroman", 0x216A}, +{"Emacron", 0x0112}, +{"Emacronacute", 0x1E16}, +{"Emacrongrave", 0x1E14}, +{"Emcyrillic", 0x041C}, +{"Emonospace", 0xFF25}, +{"Encyrillic", 0x041D}, +{"Endescendercyrillic", 0x04A2}, +{"Eng", 0x014A}, +{"Enghecyrillic", 0x04A4}, +{"Enhookcyrillic", 0x04C7}, +{"Eogonek", 0x0118}, +{"Eopen", 0x0190}, +{"Epsilon", 0x0395}, +{"Epsilontonos", 0x0388}, +{"Ercyrillic", 0x0420}, +{"Ereversed", 0x018E}, +{"Ereversedcyrillic", 0x042D}, +{"Escyrillic", 0x0421}, +{"Esdescendercyrillic", 0x04AA}, +{"Esh", 0x01A9}, +{"Esmall", 0xF765}, +{"Eta", 0x0397}, +{"Etarmenian", 0x0538}, +{"Etatonos", 0x0389}, +{"Eth", 0x00D0}, +{"Ethsmall", 0xF7F0}, +{"Etilde", 0x1EBC}, +{"Etildebelow", 0x1E1A}, +{"Euro", 0x20AC}, +{"Ezh", 0x01B7}, +{"Ezhcaron", 0x01EE}, +{"Ezhreversed", 0x01B8}, +{"F", 0x0046}, +{"Fcircle", 0x24BB}, +{"Fdotaccent", 0x1E1E}, +{"Feharmenian", 0x0556}, +{"Feicoptic", 0x03E4}, +{"Fhook", 0x0191}, +{"Fitacyrillic", 0x0472}, +{"Fiveroman", 0x2164}, +{"Fmonospace", 0xFF26}, +{"Fourroman", 0x2163}, +{"Fsmall", 0xF766}, +{"G", 0x0047}, +{"GBsquare", 0x3387}, +{"Gacute", 0x01F4}, +{"Gamma", 0x0393}, +{"Gammaafrican", 0x0194}, +{"Gangiacoptic", 0x03EA}, +{"Gbreve", 0x011E}, +{"Gcaron", 0x01E6}, +{"Gcedilla", 0x0122}, +{"Gcircle", 0x24BC}, +{"Gcircumflex", 0x011C}, +{"Gcommaaccent", 0x0122}, +{"Gdot", 0x0120}, +{"Gdotaccent", 0x0120}, +{"Gecyrillic", 0x0413}, +{"Ghadarmenian", 0x0542}, +{"Ghemiddlehookcyrillic", 0x0494}, +{"Ghestrokecyrillic", 0x0492}, +{"Gheupturncyrillic", 0x0490}, +{"Ghook", 0x0193}, +{"Gimarmenian", 0x0533}, +{"Gjecyrillic", 0x0403}, +{"Gmacron", 0x1E20}, +{"Gmonospace", 0xFF27}, +{"Grave", 0xF6CE}, +{"Gravesmall", 0xF760}, +{"Gsmall", 0xF767}, +{"Gsmallhook", 0x029B}, +{"Gstroke", 0x01E4}, +{"H", 0x0048}, +{"H18533", 0x25CF}, +{"H18543", 0x25AA}, +{"H18551", 0x25AB}, +{"H22073", 0x25A1}, +{"HPsquare", 0x33CB}, +{"Haabkhasiancyrillic", 0x04A8}, +{"Hadescendercyrillic", 0x04B2}, +{"Hardsigncyrillic", 0x042A}, +{"Hbar", 0x0126}, +{"Hbrevebelow", 0x1E2A}, +{"Hcedilla", 0x1E28}, +{"Hcircle", 0x24BD}, +{"Hcircumflex", 0x0124}, +{"Hdieresis", 0x1E26}, +{"Hdotaccent", 0x1E22}, +{"Hdotbelow", 0x1E24}, +{"Hmonospace", 0xFF28}, +{"Hoarmenian", 0x0540}, +{"Horicoptic", 0x03E8}, +{"Hsmall", 0xF768}, +{"Hungarumlaut", 0xF6CF}, +{"Hungarumlautsmall", 0xF6F8}, +{"Hzsquare", 0x3390}, +{"I", 0x0049}, +{"IAcyrillic", 0x042F}, +{"IJ", 0x0132}, +{"IUcyrillic", 0x042E}, +{"Iacute", 0x00CD}, +{"Iacutesmall", 0xF7ED}, +{"Ibreve", 0x012C}, +{"Icaron", 0x01CF}, +{"Icircle", 0x24BE}, +{"Icircumflex", 0x00CE}, +{"Icircumflexsmall", 0xF7EE}, +{"Icyrillic", 0x0406}, +{"Idblgrave", 0x0208}, +{"Idieresis", 0x00CF}, +{"Idieresisacute", 0x1E2E}, +{"Idieresiscyrillic", 0x04E4}, +{"Idieresissmall", 0xF7EF}, +{"Idot", 0x0130}, +{"Idotaccent", 0x0130}, +{"Idotbelow", 0x1ECA}, +{"Iebrevecyrillic", 0x04D6}, +{"Iecyrillic", 0x0415}, +{"Ifraktur", 0x2111}, +{"Igrave", 0x00CC}, +{"Igravesmall", 0xF7EC}, +{"Ihookabove", 0x1EC8}, +{"Iicyrillic", 0x0418}, +{"Iinvertedbreve", 0x020A}, +{"Iishortcyrillic", 0x0419}, +{"Imacron", 0x012A}, +{"Imacroncyrillic", 0x04E2}, +{"Imonospace", 0xFF29}, +{"Iniarmenian", 0x053B}, +{"Iocyrillic", 0x0401}, +{"Iogonek", 0x012E}, +{"Iota", 0x0399}, +{"Iotaafrican", 0x0196}, +{"Iotadieresis", 0x03AA}, +{"Iotatonos", 0x038A}, +{"Ismall", 0xF769}, +{"Istroke", 0x0197}, +{"Itilde", 0x0128}, +{"Itildebelow", 0x1E2C}, +{"Izhitsacyrillic", 0x0474}, +{"Izhitsadblgravecyrillic", 0x0476}, +{"J", 0x004A}, +{"Jaarmenian", 0x0541}, +{"Jcircle", 0x24BF}, +{"Jcircumflex", 0x0134}, +{"Jecyrillic", 0x0408}, +{"Jheharmenian", 0x054B}, +{"Jmonospace", 0xFF2A}, +{"Jsmall", 0xF76A}, +{"K", 0x004B}, +{"KBsquare", 0x3385}, +{"KKsquare", 0x33CD}, +{"Kabashkircyrillic", 0x04A0}, +{"Kacute", 0x1E30}, +{"Kacyrillic", 0x041A}, +{"Kadescendercyrillic", 0x049A}, +{"Kahookcyrillic", 0x04C3}, +{"Kappa", 0x039A}, +{"Kastrokecyrillic", 0x049E}, +{"Kaverticalstrokecyrillic", 0x049C}, +{"Kcaron", 0x01E8}, +{"Kcedilla", 0x0136}, +{"Kcircle", 0x24C0}, +{"Kcommaaccent", 0x0136}, +{"Kdotbelow", 0x1E32}, +{"Keharmenian", 0x0554}, +{"Kenarmenian", 0x053F}, +{"Khacyrillic", 0x0425}, +{"Kheicoptic", 0x03E6}, +{"Khook", 0x0198}, +{"Kjecyrillic", 0x040C}, +{"Klinebelow", 0x1E34}, +{"Kmonospace", 0xFF2B}, +{"Koppacyrillic", 0x0480}, +{"Koppagreek", 0x03DE}, +{"Ksicyrillic", 0x046E}, +{"Ksmall", 0xF76B}, +{"L", 0x004C}, +{"LJ", 0x01C7}, +{"LL", 0xF6BF}, +{"Lacute", 0x0139}, +{"Lambda", 0x039B}, +{"Lcaron", 0x013D}, +{"Lcedilla", 0x013B}, +{"Lcircle", 0x24C1}, +{"Lcircumflexbelow", 0x1E3C}, +{"Lcommaaccent", 0x013B}, +{"Ldot", 0x013F}, +{"Ldotaccent", 0x013F}, +{"Ldotbelow", 0x1E36}, +{"Ldotbelowmacron", 0x1E38}, +{"Liwnarmenian", 0x053C}, +{"Lj", 0x01C8}, +{"Ljecyrillic", 0x0409}, +{"Llinebelow", 0x1E3A}, +{"Lmonospace", 0xFF2C}, +{"Lslash", 0x0141}, +{"Lslashsmall", 0xF6F9}, +{"Lsmall", 0xF76C}, +{"M", 0x004D}, +{"MBsquare", 0x3386}, +{"Macron", 0xF6D0}, +{"Macronsmall", 0xF7AF}, +{"Macute", 0x1E3E}, +{"Mcircle", 0x24C2}, +{"Mdotaccent", 0x1E40}, +{"Mdotbelow", 0x1E42}, +{"Menarmenian", 0x0544}, +{"Mmonospace", 0xFF2D}, +{"Msmall", 0xF76D}, +{"Mturned", 0x019C}, +{"Mu", 0x039C}, +{"N", 0x004E}, +{"NJ", 0x01CA}, +{"Nacute", 0x0143}, +{"Ncaron", 0x0147}, +{"Ncedilla", 0x0145}, +{"Ncircle", 0x24C3}, +{"Ncircumflexbelow", 0x1E4A}, +{"Ncommaaccent", 0x0145}, +{"Ndotaccent", 0x1E44}, +{"Ndotbelow", 0x1E46}, +{"Nhookleft", 0x019D}, +{"Nineroman", 0x2168}, +{"Nj", 0x01CB}, +{"Njecyrillic", 0x040A}, +{"Nlinebelow", 0x1E48}, +{"Nmonospace", 0xFF2E}, +{"Nowarmenian", 0x0546}, +{"Nsmall", 0xF76E}, +{"Ntilde", 0x00D1}, +{"Ntildesmall", 0xF7F1}, +{"Nu", 0x039D}, +{"O", 0x004F}, +{"OE", 0x0152}, +{"OEsmall", 0xF6FA}, +{"Oacute", 0x00D3}, +{"Oacutesmall", 0xF7F3}, +{"Obarredcyrillic", 0x04E8}, +{"Obarreddieresiscyrillic", 0x04EA}, +{"Obreve", 0x014E}, +{"Ocaron", 0x01D1}, +{"Ocenteredtilde", 0x019F}, +{"Ocircle", 0x24C4}, +{"Ocircumflex", 0x00D4}, +{"Ocircumflexacute", 0x1ED0}, +{"Ocircumflexdotbelow", 0x1ED8}, +{"Ocircumflexgrave", 0x1ED2}, +{"Ocircumflexhookabove", 0x1ED4}, +{"Ocircumflexsmall", 0xF7F4}, +{"Ocircumflextilde", 0x1ED6}, +{"Ocyrillic", 0x041E}, +{"Odblacute", 0x0150}, +{"Odblgrave", 0x020C}, +{"Odieresis", 0x00D6}, +{"Odieresiscyrillic", 0x04E6}, +{"Odieresissmall", 0xF7F6}, +{"Odotbelow", 0x1ECC}, +{"Ogoneksmall", 0xF6FB}, +{"Ograve", 0x00D2}, +{"Ogravesmall", 0xF7F2}, +{"Oharmenian", 0x0555}, +{"Ohm", 0x2126}, +{"Ohookabove", 0x1ECE}, +{"Ohorn", 0x01A0}, +{"Ohornacute", 0x1EDA}, +{"Ohorndotbelow", 0x1EE2}, +{"Ohorngrave", 0x1EDC}, +{"Ohornhookabove", 0x1EDE}, +{"Ohorntilde", 0x1EE0}, +{"Ohungarumlaut", 0x0150}, +{"Oi", 0x01A2}, +{"Oinvertedbreve", 0x020E}, +{"Omacron", 0x014C}, +{"Omacronacute", 0x1E52}, +{"Omacrongrave", 0x1E50}, +{"Omega", 0x2126}, +{"Omegacyrillic", 0x0460}, +{"Omegagreek", 0x03A9}, +{"Omegaroundcyrillic", 0x047A}, +{"Omegatitlocyrillic", 0x047C}, +{"Omegatonos", 0x038F}, +{"Omicron", 0x039F}, +{"Omicrontonos", 0x038C}, +{"Omonospace", 0xFF2F}, +{"Oneroman", 0x2160}, +{"Oogonek", 0x01EA}, +{"Oogonekmacron", 0x01EC}, +{"Oopen", 0x0186}, +{"Oslash", 0x00D8}, +{"Oslashacute", 0x01FE}, +{"Oslashsmall", 0xF7F8}, +{"Osmall", 0xF76F}, +{"Ostrokeacute", 0x01FE}, +{"Otcyrillic", 0x047E}, +{"Otilde", 0x00D5}, +{"Otildeacute", 0x1E4C}, +{"Otildedieresis", 0x1E4E}, +{"Otildesmall", 0xF7F5}, +{"P", 0x0050}, +{"Pacute", 0x1E54}, +{"Pcircle", 0x24C5}, +{"Pdotaccent", 0x1E56}, +{"Pecyrillic", 0x041F}, +{"Peharmenian", 0x054A}, +{"Pemiddlehookcyrillic", 0x04A6}, +{"Phi", 0x03A6}, +{"Phook", 0x01A4}, +{"Pi", 0x03A0}, +{"Piwrarmenian", 0x0553}, +{"Pmonospace", 0xFF30}, +{"Psi", 0x03A8}, +{"Psicyrillic", 0x0470}, +{"Psmall", 0xF770}, +{"Q", 0x0051}, +{"Qcircle", 0x24C6}, +{"Qmonospace", 0xFF31}, +{"Qsmall", 0xF771}, +{"R", 0x0052}, +{"Raarmenian", 0x054C}, +{"Racute", 0x0154}, +{"Rcaron", 0x0158}, +{"Rcedilla", 0x0156}, +{"Rcircle", 0x24C7}, +{"Rcommaaccent", 0x0156}, +{"Rdblgrave", 0x0210}, +{"Rdotaccent", 0x1E58}, +{"Rdotbelow", 0x1E5A}, +{"Rdotbelowmacron", 0x1E5C}, +{"Reharmenian", 0x0550}, +{"Rfraktur", 0x211C}, +{"Rho", 0x03A1}, +{"Ringsmall", 0xF6FC}, +{"Rinvertedbreve", 0x0212}, +{"Rlinebelow", 0x1E5E}, +{"Rmonospace", 0xFF32}, +{"Rsmall", 0xF772}, +{"Rsmallinverted", 0x0281}, +{"Rsmallinvertedsuperior", 0x02B6}, +{"S", 0x0053}, +{"SF010000", 0x250C}, +{"SF020000", 0x2514}, +{"SF030000", 0x2510}, +{"SF040000", 0x2518}, +{"SF050000", 0x253C}, +{"SF060000", 0x252C}, +{"SF070000", 0x2534}, +{"SF080000", 0x251C}, +{"SF090000", 0x2524}, +{"SF100000", 0x2500}, +{"SF110000", 0x2502}, +{"SF190000", 0x2561}, +{"SF200000", 0x2562}, +{"SF210000", 0x2556}, +{"SF220000", 0x2555}, +{"SF230000", 0x2563}, +{"SF240000", 0x2551}, +{"SF250000", 0x2557}, +{"SF260000", 0x255D}, +{"SF270000", 0x255C}, +{"SF280000", 0x255B}, +{"SF360000", 0x255E}, +{"SF370000", 0x255F}, +{"SF380000", 0x255A}, +{"SF390000", 0x2554}, +{"SF400000", 0x2569}, +{"SF410000", 0x2566}, +{"SF420000", 0x2560}, +{"SF430000", 0x2550}, +{"SF440000", 0x256C}, +{"SF450000", 0x2567}, +{"SF460000", 0x2568}, +{"SF470000", 0x2564}, +{"SF480000", 0x2565}, +{"SF490000", 0x2559}, +{"SF500000", 0x2558}, +{"SF510000", 0x2552}, +{"SF520000", 0x2553}, +{"SF530000", 0x256B}, +{"SF540000", 0x256A}, +{"Sacute", 0x015A}, +{"Sacutedotaccent", 0x1E64}, +{"Sampigreek", 0x03E0}, +{"Scaron", 0x0160}, +{"Scarondotaccent", 0x1E66}, +{"Scaronsmall", 0xF6FD}, +{"Scedilla", 0x015E}, +{"Schwa", 0x018F}, +{"Schwacyrillic", 0x04D8}, +{"Schwadieresiscyrillic", 0x04DA}, +{"Scircle", 0x24C8}, +{"Scircumflex", 0x015C}, +{"Scommaaccent", 0x0218}, +{"Sdotaccent", 0x1E60}, +{"Sdotbelow", 0x1E62}, +{"Sdotbelowdotaccent", 0x1E68}, +{"Seharmenian", 0x054D}, +{"Sevenroman", 0x2166}, +{"Shaarmenian", 0x0547}, +{"Shacyrillic", 0x0428}, +{"Shchacyrillic", 0x0429}, +{"Sheicoptic", 0x03E2}, +{"Shhacyrillic", 0x04BA}, +{"Shimacoptic", 0x03EC}, +{"Sigma", 0x03A3}, +{"Sixroman", 0x2165}, +{"Smonospace", 0xFF33}, +{"Softsigncyrillic", 0x042C}, +{"Ssmall", 0xF773}, +{"Stigmagreek", 0x03DA}, +{"T", 0x0054}, +{"Tau", 0x03A4}, +{"Tbar", 0x0166}, +{"Tcaron", 0x0164}, +{"Tcedilla", 0x0162}, +{"Tcircle", 0x24C9}, +{"Tcircumflexbelow", 0x1E70}, +{"Tcommaaccent", 0x0162}, +{"Tdotaccent", 0x1E6A}, +{"Tdotbelow", 0x1E6C}, +{"Tecyrillic", 0x0422}, +{"Tedescendercyrillic", 0x04AC}, +{"Tenroman", 0x2169}, +{"Tetsecyrillic", 0x04B4}, +{"Theta", 0x0398}, +{"Thook", 0x01AC}, +{"Thorn", 0x00DE}, +{"Thornsmall", 0xF7FE}, +{"Threeroman", 0x2162}, +{"Tildesmall", 0xF6FE}, +{"Tiwnarmenian", 0x054F}, +{"Tlinebelow", 0x1E6E}, +{"Tmonospace", 0xFF34}, +{"Toarmenian", 0x0539}, +{"Tonefive", 0x01BC}, +{"Tonesix", 0x0184}, +{"Tonetwo", 0x01A7}, +{"Tretroflexhook", 0x01AE}, +{"Tsecyrillic", 0x0426}, +{"Tshecyrillic", 0x040B}, +{"Tsmall", 0xF774}, +{"Twelveroman", 0x216B}, +{"Tworoman", 0x2161}, +{"U", 0x0055}, +{"Uacute", 0x00DA}, +{"Uacutesmall", 0xF7FA}, +{"Ubreve", 0x016C}, +{"Ucaron", 0x01D3}, +{"Ucircle", 0x24CA}, +{"Ucircumflex", 0x00DB}, +{"Ucircumflexbelow", 0x1E76}, +{"Ucircumflexsmall", 0xF7FB}, +{"Ucyrillic", 0x0423}, +{"Udblacute", 0x0170}, +{"Udblgrave", 0x0214}, +{"Udieresis", 0x00DC}, +{"Udieresisacute", 0x01D7}, +{"Udieresisbelow", 0x1E72}, +{"Udieresiscaron", 0x01D9}, +{"Udieresiscyrillic", 0x04F0}, +{"Udieresisgrave", 0x01DB}, +{"Udieresismacron", 0x01D5}, +{"Udieresissmall", 0xF7FC}, +{"Udotbelow", 0x1EE4}, +{"Ugrave", 0x00D9}, +{"Ugravesmall", 0xF7F9}, +{"Uhookabove", 0x1EE6}, +{"Uhorn", 0x01AF}, +{"Uhornacute", 0x1EE8}, +{"Uhorndotbelow", 0x1EF0}, +{"Uhorngrave", 0x1EEA}, +{"Uhornhookabove", 0x1EEC}, +{"Uhorntilde", 0x1EEE}, +{"Uhungarumlaut", 0x0170}, +{"Uhungarumlautcyrillic", 0x04F2}, +{"Uinvertedbreve", 0x0216}, +{"Ukcyrillic", 0x0478}, +{"Umacron", 0x016A}, +{"Umacroncyrillic", 0x04EE}, +{"Umacrondieresis", 0x1E7A}, +{"Umonospace", 0xFF35}, +{"Uogonek", 0x0172}, +{"Upsilon", 0x03A5}, +{"Upsilon1", 0x03D2}, +{"Upsilonacutehooksymbolgreek", 0x03D3}, +{"Upsilonafrican", 0x01B1}, +{"Upsilondieresis", 0x03AB}, +{"Upsilondieresishooksymbolgreek", 0x03D4}, +{"Upsilonhooksymbol", 0x03D2}, +{"Upsilontonos", 0x038E}, +{"Uring", 0x016E}, +{"Ushortcyrillic", 0x040E}, +{"Usmall", 0xF775}, +{"Ustraightcyrillic", 0x04AE}, +{"Ustraightstrokecyrillic", 0x04B0}, +{"Utilde", 0x0168}, +{"Utildeacute", 0x1E78}, +{"Utildebelow", 0x1E74}, +{"V", 0x0056}, +{"Vcircle", 0x24CB}, +{"Vdotbelow", 0x1E7E}, +{"Vecyrillic", 0x0412}, +{"Vewarmenian", 0x054E}, +{"Vhook", 0x01B2}, +{"Vmonospace", 0xFF36}, +{"Voarmenian", 0x0548}, +{"Vsmall", 0xF776}, +{"Vtilde", 0x1E7C}, +{"W", 0x0057}, +{"Wacute", 0x1E82}, +{"Wcircle", 0x24CC}, +{"Wcircumflex", 0x0174}, +{"Wdieresis", 0x1E84}, +{"Wdotaccent", 0x1E86}, +{"Wdotbelow", 0x1E88}, +{"Wgrave", 0x1E80}, +{"Wmonospace", 0xFF37}, +{"Wsmall", 0xF777}, +{"X", 0x0058}, +{"Xcircle", 0x24CD}, +{"Xdieresis", 0x1E8C}, +{"Xdotaccent", 0x1E8A}, +{"Xeharmenian", 0x053D}, +{"Xi", 0x039E}, +{"Xmonospace", 0xFF38}, +{"Xsmall", 0xF778}, +{"Y", 0x0059}, +{"Yacute", 0x00DD}, +{"Yacutesmall", 0xF7FD}, +{"Yatcyrillic", 0x0462}, +{"Ycircle", 0x24CE}, +{"Ycircumflex", 0x0176}, +{"Ydieresis", 0x0178}, +{"Ydieresissmall", 0xF7FF}, +{"Ydotaccent", 0x1E8E}, +{"Ydotbelow", 0x1EF4}, +{"Yericyrillic", 0x042B}, +{"Yerudieresiscyrillic", 0x04F8}, +{"Ygrave", 0x1EF2}, +{"Yhook", 0x01B3}, +{"Yhookabove", 0x1EF6}, +{"Yiarmenian", 0x0545}, +{"Yicyrillic", 0x0407}, +{"Yiwnarmenian", 0x0552}, +{"Ymonospace", 0xFF39}, +{"Ysmall", 0xF779}, +{"Ytilde", 0x1EF8}, +{"Yusbigcyrillic", 0x046A}, +{"Yusbigiotifiedcyrillic", 0x046C}, +{"Yuslittlecyrillic", 0x0466}, +{"Yuslittleiotifiedcyrillic", 0x0468}, +{"Z", 0x005A}, +{"Zaarmenian", 0x0536}, +{"Zacute", 0x0179}, +{"Zcaron", 0x017D}, +{"Zcaronsmall", 0xF6FF}, +{"Zcircle", 0x24CF}, +{"Zcircumflex", 0x1E90}, +{"Zdot", 0x017B}, +{"Zdotaccent", 0x017B}, +{"Zdotbelow", 0x1E92}, +{"Zecyrillic", 0x0417}, +{"Zedescendercyrillic", 0x0498}, +{"Zedieresiscyrillic", 0x04DE}, +{"Zeta", 0x0396}, +{"Zhearmenian", 0x053A}, +{"Zhebrevecyrillic", 0x04C1}, +{"Zhecyrillic", 0x0416}, +{"Zhedescendercyrillic", 0x0496}, +{"Zhedieresiscyrillic", 0x04DC}, +{"Zlinebelow", 0x1E94}, +{"Zmonospace", 0xFF3A}, +{"Zsmall", 0xF77A}, +{"Zstroke", 0x01B5}, +{"a", 0x0061}, +{"aabengali", 0x0986}, +{"aacute", 0x00E1}, +{"aadeva", 0x0906}, +{"aagujarati", 0x0A86}, +{"aagurmukhi", 0x0A06}, +{"aamatragurmukhi", 0x0A3E}, +{"aarusquare", 0x3303}, +{"aavowelsignbengali", 0x09BE}, +{"aavowelsigndeva", 0x093E}, +{"aavowelsigngujarati", 0x0ABE}, +{"abbreviationmarkarmenian", 0x055F}, +{"abbreviationsigndeva", 0x0970}, +{"abengali", 0x0985}, +{"abopomofo", 0x311A}, +{"abreve", 0x0103}, +{"abreveacute", 0x1EAF}, +{"abrevecyrillic", 0x04D1}, +{"abrevedotbelow", 0x1EB7}, +{"abrevegrave", 0x1EB1}, +{"abrevehookabove", 0x1EB3}, +{"abrevetilde", 0x1EB5}, +{"acaron", 0x01CE}, +{"acircle", 0x24D0}, +{"acircumflex", 0x00E2}, +{"acircumflexacute", 0x1EA5}, +{"acircumflexdotbelow", 0x1EAD}, +{"acircumflexgrave", 0x1EA7}, +{"acircumflexhookabove", 0x1EA9}, +{"acircumflextilde", 0x1EAB}, +{"acute", 0x00B4}, +{"acutebelowcmb", 0x0317}, +{"acutecmb", 0x0301}, +{"acutecomb", 0x0301}, +{"acutedeva", 0x0954}, +{"acutelowmod", 0x02CF}, +{"acutetonecmb", 0x0341}, +{"acyrillic", 0x0430}, +{"adblgrave", 0x0201}, +{"addakgurmukhi", 0x0A71}, +{"adeva", 0x0905}, +{"adieresis", 0x00E4}, +{"adieresiscyrillic", 0x04D3}, +{"adieresismacron", 0x01DF}, +{"adotbelow", 0x1EA1}, +{"adotmacron", 0x01E1}, +{"ae", 0x00E6}, +{"aeacute", 0x01FD}, +{"aekorean", 0x3150}, +{"aemacron", 0x01E3}, +{"afii00208", 0x2015}, +{"afii08941", 0x20A4}, +{"afii10017", 0x0410}, +{"afii10018", 0x0411}, +{"afii10019", 0x0412}, +{"afii10020", 0x0413}, +{"afii10021", 0x0414}, +{"afii10022", 0x0415}, +{"afii10023", 0x0401}, +{"afii10024", 0x0416}, +{"afii10025", 0x0417}, +{"afii10026", 0x0418}, +{"afii10027", 0x0419}, +{"afii10028", 0x041A}, +{"afii10029", 0x041B}, +{"afii10030", 0x041C}, +{"afii10031", 0x041D}, +{"afii10032", 0x041E}, +{"afii10033", 0x041F}, +{"afii10034", 0x0420}, +{"afii10035", 0x0421}, +{"afii10036", 0x0422}, +{"afii10037", 0x0423}, +{"afii10038", 0x0424}, +{"afii10039", 0x0425}, +{"afii10040", 0x0426}, +{"afii10041", 0x0427}, +{"afii10042", 0x0428}, +{"afii10043", 0x0429}, +{"afii10044", 0x042A}, +{"afii10045", 0x042B}, +{"afii10046", 0x042C}, +{"afii10047", 0x042D}, +{"afii10048", 0x042E}, +{"afii10049", 0x042F}, +{"afii10050", 0x0490}, +{"afii10051", 0x0402}, +{"afii10052", 0x0403}, +{"afii10053", 0x0404}, +{"afii10054", 0x0405}, +{"afii10055", 0x0406}, +{"afii10056", 0x0407}, +{"afii10057", 0x0408}, +{"afii10058", 0x0409}, +{"afii10059", 0x040A}, +{"afii10060", 0x040B}, +{"afii10061", 0x040C}, +{"afii10062", 0x040E}, +{"afii10063", 0xF6C4}, +{"afii10064", 0xF6C5}, +{"afii10065", 0x0430}, +{"afii10066", 0x0431}, +{"afii10067", 0x0432}, +{"afii10068", 0x0433}, +{"afii10069", 0x0434}, +{"afii10070", 0x0435}, +{"afii10071", 0x0451}, +{"afii10072", 0x0436}, +{"afii10073", 0x0437}, +{"afii10074", 0x0438}, +{"afii10075", 0x0439}, +{"afii10076", 0x043A}, +{"afii10077", 0x043B}, +{"afii10078", 0x043C}, +{"afii10079", 0x043D}, +{"afii10080", 0x043E}, +{"afii10081", 0x043F}, +{"afii10082", 0x0440}, +{"afii10083", 0x0441}, +{"afii10084", 0x0442}, +{"afii10085", 0x0443}, +{"afii10086", 0x0444}, +{"afii10087", 0x0445}, +{"afii10088", 0x0446}, +{"afii10089", 0x0447}, +{"afii10090", 0x0448}, +{"afii10091", 0x0449}, +{"afii10092", 0x044A}, +{"afii10093", 0x044B}, +{"afii10094", 0x044C}, +{"afii10095", 0x044D}, +{"afii10096", 0x044E}, +{"afii10097", 0x044F}, +{"afii10098", 0x0491}, +{"afii10099", 0x0452}, +{"afii10100", 0x0453}, +{"afii10101", 0x0454}, +{"afii10102", 0x0455}, +{"afii10103", 0x0456}, +{"afii10104", 0x0457}, +{"afii10105", 0x0458}, +{"afii10106", 0x0459}, +{"afii10107", 0x045A}, +{"afii10108", 0x045B}, +{"afii10109", 0x045C}, +{"afii10110", 0x045E}, +{"afii10145", 0x040F}, +{"afii10146", 0x0462}, +{"afii10147", 0x0472}, +{"afii10148", 0x0474}, +{"afii10192", 0xF6C6}, +{"afii10193", 0x045F}, +{"afii10194", 0x0463}, +{"afii10195", 0x0473}, +{"afii10196", 0x0475}, +{"afii10831", 0xF6C7}, +{"afii10832", 0xF6C8}, +{"afii10846", 0x04D9}, +{"afii299", 0x200E}, +{"afii300", 0x200F}, +{"afii301", 0x200D}, +{"afii57381", 0x066A}, +{"afii57388", 0x060C}, +{"afii57392", 0x0660}, +{"afii57393", 0x0661}, +{"afii57394", 0x0662}, +{"afii57395", 0x0663}, +{"afii57396", 0x0664}, +{"afii57397", 0x0665}, +{"afii57398", 0x0666}, +{"afii57399", 0x0667}, +{"afii57400", 0x0668}, +{"afii57401", 0x0669}, +{"afii57403", 0x061B}, +{"afii57407", 0x061F}, +{"afii57409", 0x0621}, +{"afii57410", 0x0622}, +{"afii57411", 0x0623}, +{"afii57412", 0x0624}, +{"afii57413", 0x0625}, +{"afii57414", 0x0626}, +{"afii57415", 0x0627}, +{"afii57416", 0x0628}, +{"afii57417", 0x0629}, +{"afii57418", 0x062A}, +{"afii57419", 0x062B}, +{"afii57420", 0x062C}, +{"afii57421", 0x062D}, +{"afii57422", 0x062E}, +{"afii57423", 0x062F}, +{"afii57424", 0x0630}, +{"afii57425", 0x0631}, +{"afii57426", 0x0632}, +{"afii57427", 0x0633}, +{"afii57428", 0x0634}, +{"afii57429", 0x0635}, +{"afii57430", 0x0636}, +{"afii57431", 0x0637}, +{"afii57432", 0x0638}, +{"afii57433", 0x0639}, +{"afii57434", 0x063A}, +{"afii57440", 0x0640}, +{"afii57441", 0x0641}, +{"afii57442", 0x0642}, +{"afii57443", 0x0643}, +{"afii57444", 0x0644}, +{"afii57445", 0x0645}, +{"afii57446", 0x0646}, +{"afii57448", 0x0648}, +{"afii57449", 0x0649}, +{"afii57450", 0x064A}, +{"afii57451", 0x064B}, +{"afii57452", 0x064C}, +{"afii57453", 0x064D}, +{"afii57454", 0x064E}, +{"afii57455", 0x064F}, +{"afii57456", 0x0650}, +{"afii57457", 0x0651}, +{"afii57458", 0x0652}, +{"afii57470", 0x0647}, +{"afii57505", 0x06A4}, +{"afii57506", 0x067E}, +{"afii57507", 0x0686}, +{"afii57508", 0x0698}, +{"afii57509", 0x06AF}, +{"afii57511", 0x0679}, +{"afii57512", 0x0688}, +{"afii57513", 0x0691}, +{"afii57514", 0x06BA}, +{"afii57519", 0x06D2}, +{"afii57534", 0x06D5}, +{"afii57636", 0x20AA}, +{"afii57645", 0x05BE}, +{"afii57658", 0x05C3}, +{"afii57664", 0x05D0}, +{"afii57665", 0x05D1}, +{"afii57666", 0x05D2}, +{"afii57667", 0x05D3}, +{"afii57668", 0x05D4}, +{"afii57669", 0x05D5}, +{"afii57670", 0x05D6}, +{"afii57671", 0x05D7}, +{"afii57672", 0x05D8}, +{"afii57673", 0x05D9}, +{"afii57674", 0x05DA}, +{"afii57675", 0x05DB}, +{"afii57676", 0x05DC}, +{"afii57677", 0x05DD}, +{"afii57678", 0x05DE}, +{"afii57679", 0x05DF}, +{"afii57680", 0x05E0}, +{"afii57681", 0x05E1}, +{"afii57682", 0x05E2}, +{"afii57683", 0x05E3}, +{"afii57684", 0x05E4}, +{"afii57685", 0x05E5}, +{"afii57686", 0x05E6}, +{"afii57687", 0x05E7}, +{"afii57688", 0x05E8}, +{"afii57689", 0x05E9}, +{"afii57690", 0x05EA}, +{"afii57694", 0xFB2A}, +{"afii57695", 0xFB2B}, +{"afii57700", 0xFB4B}, +{"afii57705", 0xFB1F}, +{"afii57716", 0x05F0}, +{"afii57717", 0x05F1}, +{"afii57718", 0x05F2}, +{"afii57723", 0xFB35}, +{"afii57793", 0x05B4}, +{"afii57794", 0x05B5}, +{"afii57795", 0x05B6}, +{"afii57796", 0x05BB}, +{"afii57797", 0x05B8}, +{"afii57798", 0x05B7}, +{"afii57799", 0x05B0}, +{"afii57800", 0x05B2}, +{"afii57801", 0x05B1}, +{"afii57802", 0x05B3}, +{"afii57803", 0x05C2}, +{"afii57804", 0x05C1}, +{"afii57806", 0x05B9}, +{"afii57807", 0x05BC}, +{"afii57839", 0x05BD}, +{"afii57841", 0x05BF}, +{"afii57842", 0x05C0}, +{"afii57929", 0x02BC}, +{"afii61248", 0x2105}, +{"afii61289", 0x2113}, +{"afii61352", 0x2116}, +{"afii61573", 0x202C}, +{"afii61574", 0x202D}, +{"afii61575", 0x202E}, +{"afii61664", 0x200C}, +{"afii63167", 0x066D}, +{"afii64937", 0x02BD}, +{"agrave", 0x00E0}, +{"agujarati", 0x0A85}, +{"agurmukhi", 0x0A05}, +{"ahiragana", 0x3042}, +{"ahookabove", 0x1EA3}, +{"aibengali", 0x0990}, +{"aibopomofo", 0x311E}, +{"aideva", 0x0910}, +{"aiecyrillic", 0x04D5}, +{"aigujarati", 0x0A90}, +{"aigurmukhi", 0x0A10}, +{"aimatragurmukhi", 0x0A48}, +{"ainarabic", 0x0639}, +{"ainfinalarabic", 0xFECA}, +{"aininitialarabic", 0xFECB}, +{"ainmedialarabic", 0xFECC}, +{"ainvertedbreve", 0x0203}, +{"aivowelsignbengali", 0x09C8}, +{"aivowelsigndeva", 0x0948}, +{"aivowelsigngujarati", 0x0AC8}, +{"akatakana", 0x30A2}, +{"akatakanahalfwidth", 0xFF71}, +{"akorean", 0x314F}, +{"alef", 0x05D0}, +{"alefarabic", 0x0627}, +{"alefdageshhebrew", 0xFB30}, +{"aleffinalarabic", 0xFE8E}, +{"alefhamzaabovearabic", 0x0623}, +{"alefhamzaabovefinalarabic", 0xFE84}, +{"alefhamzabelowarabic", 0x0625}, +{"alefhamzabelowfinalarabic", 0xFE88}, +{"alefhebrew", 0x05D0}, +{"aleflamedhebrew", 0xFB4F}, +{"alefmaddaabovearabic", 0x0622}, +{"alefmaddaabovefinalarabic", 0xFE82}, +{"alefmaksuraarabic", 0x0649}, +{"alefmaksurafinalarabic", 0xFEF0}, +{"alefmaksurainitialarabic", 0xFEF3}, +{"alefmaksuramedialarabic", 0xFEF4}, +{"alefpatahhebrew", 0xFB2E}, +{"alefqamatshebrew", 0xFB2F}, +{"aleph", 0x2135}, +{"allequal", 0x224C}, +{"alpha", 0x03B1}, +{"alphatonos", 0x03AC}, +{"amacron", 0x0101}, +{"amonospace", 0xFF41}, +{"ampersand", 0x0026}, +{"ampersandmonospace", 0xFF06}, +{"ampersandsmall", 0xF726}, +{"amsquare", 0x33C2}, +{"anbopomofo", 0x3122}, +{"angbopomofo", 0x3124}, +{"angkhankhuthai", 0x0E5A}, +{"angle", 0x2220}, +{"anglebracketleft", 0x3008}, +{"anglebracketleftvertical", 0xFE3F}, +{"anglebracketright", 0x3009}, +{"anglebracketrightvertical", 0xFE40}, +{"angleleft", 0x2329}, +{"angleright", 0x232A}, +{"angstrom", 0x212B}, +{"anoteleia", 0x0387}, +{"anudattadeva", 0x0952}, +{"anusvarabengali", 0x0982}, +{"anusvaradeva", 0x0902}, +{"anusvaragujarati", 0x0A82}, +{"aogonek", 0x0105}, +{"apaatosquare", 0x3300}, +{"aparen", 0x249C}, +{"apostrophearmenian", 0x055A}, +{"apostrophemod", 0x02BC}, +{"apple", 0xF8FF}, +{"approaches", 0x2250}, +{"approxequal", 0x2248}, +{"approxequalorimage", 0x2252}, +{"approximatelyequal", 0x2245}, +{"araeaekorean", 0x318E}, +{"araeakorean", 0x318D}, +{"arc", 0x2312}, +{"arighthalfring", 0x1E9A}, +{"aring", 0x00E5}, +{"aringacute", 0x01FB}, +{"aringbelow", 0x1E01}, +{"arrowboth", 0x2194}, +{"arrowdashdown", 0x21E3}, +{"arrowdashleft", 0x21E0}, +{"arrowdashright", 0x21E2}, +{"arrowdashup", 0x21E1}, +{"arrowdblboth", 0x21D4}, +{"arrowdbldown", 0x21D3}, +{"arrowdblleft", 0x21D0}, +{"arrowdblright", 0x21D2}, +{"arrowdblup", 0x21D1}, +{"arrowdown", 0x2193}, +{"arrowdownleft", 0x2199}, +{"arrowdownright", 0x2198}, +{"arrowdownwhite", 0x21E9}, +{"arrowheaddownmod", 0x02C5}, +{"arrowheadleftmod", 0x02C2}, +{"arrowheadrightmod", 0x02C3}, +{"arrowheadupmod", 0x02C4}, +{"arrowhorizex", 0xF8E7}, +{"arrowleft", 0x2190}, +{"arrowleftdbl", 0x21D0}, +{"arrowleftdblstroke", 0x21CD}, +{"arrowleftoverright", 0x21C6}, +{"arrowleftwhite", 0x21E6}, +{"arrowright", 0x2192}, +{"arrowrightdblstroke", 0x21CF}, +{"arrowrightheavy", 0x279E}, +{"arrowrightoverleft", 0x21C4}, +{"arrowrightwhite", 0x21E8}, +{"arrowtableft", 0x21E4}, +{"arrowtabright", 0x21E5}, +{"arrowup", 0x2191}, +{"arrowupdn", 0x2195}, +{"arrowupdnbse", 0x21A8}, +{"arrowupdownbase", 0x21A8}, +{"arrowupleft", 0x2196}, +{"arrowupleftofdown", 0x21C5}, +{"arrowupright", 0x2197}, +{"arrowupwhite", 0x21E7}, +{"arrowvertex", 0xF8E6}, +{"asciicircum", 0x005E}, +{"asciicircummonospace", 0xFF3E}, +{"asciitilde", 0x007E}, +{"asciitildemonospace", 0xFF5E}, +{"ascript", 0x0251}, +{"ascriptturned", 0x0252}, +{"asmallhiragana", 0x3041}, +{"asmallkatakana", 0x30A1}, +{"asmallkatakanahalfwidth", 0xFF67}, +{"asterisk", 0x002A}, +{"asteriskaltonearabic", 0x066D}, +{"asteriskarabic", 0x066D}, +{"asteriskmath", 0x2217}, +{"asteriskmonospace", 0xFF0A}, +{"asterisksmall", 0xFE61}, +{"asterism", 0x2042}, +{"asuperior", 0xF6E9}, +{"asymptoticallyequal", 0x2243}, +{"at", 0x0040}, +{"atilde", 0x00E3}, +{"atmonospace", 0xFF20}, +{"atsmall", 0xFE6B}, +{"aturned", 0x0250}, +{"aubengali", 0x0994}, +{"aubopomofo", 0x3120}, +{"audeva", 0x0914}, +{"augujarati", 0x0A94}, +{"augurmukhi", 0x0A14}, +{"aulengthmarkbengali", 0x09D7}, +{"aumatragurmukhi", 0x0A4C}, +{"auvowelsignbengali", 0x09CC}, +{"auvowelsigndeva", 0x094C}, +{"auvowelsigngujarati", 0x0ACC}, +{"avagrahadeva", 0x093D}, +{"aybarmenian", 0x0561}, +{"ayin", 0x05E2}, +{"ayinaltonehebrew", 0xFB20}, +{"ayinhebrew", 0x05E2}, +{"b", 0x0062}, +{"babengali", 0x09AC}, +{"backslash", 0x005C}, +{"backslashmonospace", 0xFF3C}, +{"badeva", 0x092C}, +{"bagujarati", 0x0AAC}, +{"bagurmukhi", 0x0A2C}, +{"bahiragana", 0x3070}, +{"bahtthai", 0x0E3F}, +{"bakatakana", 0x30D0}, +{"bar", 0x007C}, +{"barmonospace", 0xFF5C}, +{"bbopomofo", 0x3105}, +{"bcircle", 0x24D1}, +{"bdotaccent", 0x1E03}, +{"bdotbelow", 0x1E05}, +{"beamedsixteenthnotes", 0x266C}, +{"because", 0x2235}, +{"becyrillic", 0x0431}, +{"beharabic", 0x0628}, +{"behfinalarabic", 0xFE90}, +{"behinitialarabic", 0xFE91}, +{"behiragana", 0x3079}, +{"behmedialarabic", 0xFE92}, +{"behmeeminitialarabic", 0xFC9F}, +{"behmeemisolatedarabic", 0xFC08}, +{"behnoonfinalarabic", 0xFC6D}, +{"bekatakana", 0x30D9}, +{"benarmenian", 0x0562}, +{"bet", 0x05D1}, +{"beta", 0x03B2}, +{"betasymbolgreek", 0x03D0}, +{"betdagesh", 0xFB31}, +{"betdageshhebrew", 0xFB31}, +{"bethebrew", 0x05D1}, +{"betrafehebrew", 0xFB4C}, +{"bhabengali", 0x09AD}, +{"bhadeva", 0x092D}, +{"bhagujarati", 0x0AAD}, +{"bhagurmukhi", 0x0A2D}, +{"bhook", 0x0253}, +{"bihiragana", 0x3073}, +{"bikatakana", 0x30D3}, +{"bilabialclick", 0x0298}, +{"bindigurmukhi", 0x0A02}, +{"birusquare", 0x3331}, +{"blackcircle", 0x25CF}, +{"blackdiamond", 0x25C6}, +{"blackdownpointingtriangle", 0x25BC}, +{"blackleftpointingpointer", 0x25C4}, +{"blackleftpointingtriangle", 0x25C0}, +{"blacklenticularbracketleft", 0x3010}, +{"blacklenticularbracketleftvertical", 0xFE3B}, +{"blacklenticularbracketright", 0x3011}, +{"blacklenticularbracketrightvertical", 0xFE3C}, +{"blacklowerlefttriangle", 0x25E3}, +{"blacklowerrighttriangle", 0x25E2}, +{"blackrectangle", 0x25AC}, +{"blackrightpointingpointer", 0x25BA}, +{"blackrightpointingtriangle", 0x25B6}, +{"blacksmallsquare", 0x25AA}, +{"blacksmilingface", 0x263B}, +{"blacksquare", 0x25A0}, +{"blackstar", 0x2605}, +{"blackupperlefttriangle", 0x25E4}, +{"blackupperrighttriangle", 0x25E5}, +{"blackuppointingsmalltriangle", 0x25B4}, +{"blackuppointingtriangle", 0x25B2}, +{"blank", 0x2423}, +{"blinebelow", 0x1E07}, +{"block", 0x2588}, +{"bmonospace", 0xFF42}, +{"bobaimaithai", 0x0E1A}, +{"bohiragana", 0x307C}, +{"bokatakana", 0x30DC}, +{"bparen", 0x249D}, +{"bqsquare", 0x33C3}, +{"braceex", 0xF8F4}, +{"braceleft", 0x007B}, +{"braceleftbt", 0xF8F3}, +{"braceleftmid", 0xF8F2}, +{"braceleftmonospace", 0xFF5B}, +{"braceleftsmall", 0xFE5B}, +{"bracelefttp", 0xF8F1}, +{"braceleftvertical", 0xFE37}, +{"braceright", 0x007D}, +{"bracerightbt", 0xF8FE}, +{"bracerightmid", 0xF8FD}, +{"bracerightmonospace", 0xFF5D}, +{"bracerightsmall", 0xFE5C}, +{"bracerighttp", 0xF8FC}, +{"bracerightvertical", 0xFE38}, +{"bracketleft", 0x005B}, +{"bracketleftbt", 0xF8F0}, +{"bracketleftex", 0xF8EF}, +{"bracketleftmonospace", 0xFF3B}, +{"bracketlefttp", 0xF8EE}, +{"bracketright", 0x005D}, +{"bracketrightbt", 0xF8FB}, +{"bracketrightex", 0xF8FA}, +{"bracketrightmonospace", 0xFF3D}, +{"bracketrighttp", 0xF8F9}, +{"breve", 0x02D8}, +{"brevebelowcmb", 0x032E}, +{"brevecmb", 0x0306}, +{"breveinvertedbelowcmb", 0x032F}, +{"breveinvertedcmb", 0x0311}, +{"breveinverteddoublecmb", 0x0361}, +{"bridgebelowcmb", 0x032A}, +{"bridgeinvertedbelowcmb", 0x033A}, +{"brokenbar", 0x00A6}, +{"bstroke", 0x0180}, +{"bsuperior", 0xF6EA}, +{"btopbar", 0x0183}, +{"buhiragana", 0x3076}, +{"bukatakana", 0x30D6}, +{"bullet", 0x2022}, +{"bulletinverse", 0x25D8}, +{"bulletoperator", 0x2219}, +{"bullseye", 0x25CE}, +{"c", 0x0063}, +{"caarmenian", 0x056E}, +{"cabengali", 0x099A}, +{"cacute", 0x0107}, +{"cadeva", 0x091A}, +{"cagujarati", 0x0A9A}, +{"cagurmukhi", 0x0A1A}, +{"calsquare", 0x3388}, +{"candrabindubengali", 0x0981}, +{"candrabinducmb", 0x0310}, +{"candrabindudeva", 0x0901}, +{"candrabindugujarati", 0x0A81}, +{"capslock", 0x21EA}, +{"careof", 0x2105}, +{"caron", 0x02C7}, +{"caronbelowcmb", 0x032C}, +{"caroncmb", 0x030C}, +{"carriagereturn", 0x21B5}, +{"cbopomofo", 0x3118}, +{"ccaron", 0x010D}, +{"ccedilla", 0x00E7}, +{"ccedillaacute", 0x1E09}, +{"ccircle", 0x24D2}, +{"ccircumflex", 0x0109}, +{"ccurl", 0x0255}, +{"cdot", 0x010B}, +{"cdotaccent", 0x010B}, +{"cdsquare", 0x33C5}, +{"cedilla", 0x00B8}, +{"cedillacmb", 0x0327}, +{"cent", 0x00A2}, +{"centigrade", 0x2103}, +{"centinferior", 0xF6DF}, +{"centmonospace", 0xFFE0}, +{"centoldstyle", 0xF7A2}, +{"centsuperior", 0xF6E0}, +{"chaarmenian", 0x0579}, +{"chabengali", 0x099B}, +{"chadeva", 0x091B}, +{"chagujarati", 0x0A9B}, +{"chagurmukhi", 0x0A1B}, +{"chbopomofo", 0x3114}, +{"cheabkhasiancyrillic", 0x04BD}, +{"checkmark", 0x2713}, +{"checyrillic", 0x0447}, +{"chedescenderabkhasiancyrillic", 0x04BF}, +{"chedescendercyrillic", 0x04B7}, +{"chedieresiscyrillic", 0x04F5}, +{"cheharmenian", 0x0573}, +{"chekhakassiancyrillic", 0x04CC}, +{"cheverticalstrokecyrillic", 0x04B9}, +{"chi", 0x03C7}, +{"chieuchacirclekorean", 0x3277}, +{"chieuchaparenkorean", 0x3217}, +{"chieuchcirclekorean", 0x3269}, +{"chieuchkorean", 0x314A}, +{"chieuchparenkorean", 0x3209}, +{"chochangthai", 0x0E0A}, +{"chochanthai", 0x0E08}, +{"chochingthai", 0x0E09}, +{"chochoethai", 0x0E0C}, +{"chook", 0x0188}, +{"cieucacirclekorean", 0x3276}, +{"cieucaparenkorean", 0x3216}, +{"cieuccirclekorean", 0x3268}, +{"cieuckorean", 0x3148}, +{"cieucparenkorean", 0x3208}, +{"cieucuparenkorean", 0x321C}, +{"circle", 0x25CB}, +{"circlemultiply", 0x2297}, +{"circleot", 0x2299}, +{"circleplus", 0x2295}, +{"circlepostalmark", 0x3036}, +{"circlewithlefthalfblack", 0x25D0}, +{"circlewithrighthalfblack", 0x25D1}, +{"circumflex", 0x02C6}, +{"circumflexbelowcmb", 0x032D}, +{"circumflexcmb", 0x0302}, +{"clear", 0x2327}, +{"clickalveolar", 0x01C2}, +{"clickdental", 0x01C0}, +{"clicklateral", 0x01C1}, +{"clickretroflex", 0x01C3}, +{"club", 0x2663}, +{"clubsuitblack", 0x2663}, +{"clubsuitwhite", 0x2667}, +{"cmcubedsquare", 0x33A4}, +{"cmonospace", 0xFF43}, +{"cmsquaredsquare", 0x33A0}, +{"coarmenian", 0x0581}, +{"colon", 0x003A}, +{"colonmonetary", 0x20A1}, +{"colonmonospace", 0xFF1A}, +{"colonsign", 0x20A1}, +{"colonsmall", 0xFE55}, +{"colontriangularhalfmod", 0x02D1}, +{"colontriangularmod", 0x02D0}, +{"comma", 0x002C}, +{"commaabovecmb", 0x0313}, +{"commaaboverightcmb", 0x0315}, +{"commaaccent", 0xF6C3}, +{"commaarabic", 0x060C}, +{"commaarmenian", 0x055D}, +{"commainferior", 0xF6E1}, +{"commamonospace", 0xFF0C}, +{"commareversedabovecmb", 0x0314}, +{"commareversedmod", 0x02BD}, +{"commasmall", 0xFE50}, +{"commasuperior", 0xF6E2}, +{"commaturnedabovecmb", 0x0312}, +{"commaturnedmod", 0x02BB}, +{"compass", 0x263C}, +{"congruent", 0x2245}, +{"contourintegral", 0x222E}, +{"control", 0x2303}, +{"controlACK", 0x0006}, +{"controlBEL", 0x0007}, +{"controlBS", 0x0008}, +{"controlCAN", 0x0018}, +{"controlCR", 0x000D}, +{"controlDC1", 0x0011}, +{"controlDC2", 0x0012}, +{"controlDC3", 0x0013}, +{"controlDC4", 0x0014}, +{"controlDEL", 0x007F}, +{"controlDLE", 0x0010}, +{"controlEM", 0x0019}, +{"controlENQ", 0x0005}, +{"controlEOT", 0x0004}, +{"controlESC", 0x001B}, +{"controlETB", 0x0017}, +{"controlETX", 0x0003}, +{"controlFF", 0x000C}, +{"controlFS", 0x001C}, +{"controlGS", 0x001D}, +{"controlHT", 0x0009}, +{"controlLF", 0x000A}, +{"controlNAK", 0x0015}, +{"controlRS", 0x001E}, +{"controlSI", 0x000F}, +{"controlSO", 0x000E}, +{"controlSOT", 0x0002}, +{"controlSTX", 0x0001}, +{"controlSUB", 0x001A}, +{"controlSYN", 0x0016}, +{"controlUS", 0x001F}, +{"controlVT", 0x000B}, +{"copyright", 0x00A9}, +{"copyrightsans", 0xF8E9}, +{"copyrightserif", 0xF6D9}, +{"cornerbracketleft", 0x300C}, +{"cornerbracketlefthalfwidth", 0xFF62}, +{"cornerbracketleftvertical", 0xFE41}, +{"cornerbracketright", 0x300D}, +{"cornerbracketrighthalfwidth", 0xFF63}, +{"cornerbracketrightvertical", 0xFE42}, +{"corporationsquare", 0x337F}, +{"cosquare", 0x33C7}, +{"coverkgsquare", 0x33C6}, +{"cparen", 0x249E}, +{"cruzeiro", 0x20A2}, +{"cstretched", 0x0297}, +{"curlyand", 0x22CF}, +{"curlyor", 0x22CE}, +{"currency", 0x00A4}, +{"cyrBreve", 0xF6D1}, +{"cyrFlex", 0xF6D2}, +{"cyrbreve", 0xF6D4}, +{"cyrflex", 0xF6D5}, +{"d", 0x0064}, +{"daarmenian", 0x0564}, +{"dabengali", 0x09A6}, +{"dadarabic", 0x0636}, +{"dadeva", 0x0926}, +{"dadfinalarabic", 0xFEBE}, +{"dadinitialarabic", 0xFEBF}, +{"dadmedialarabic", 0xFEC0}, +{"dagesh", 0x05BC}, +{"dageshhebrew", 0x05BC}, +{"dagger", 0x2020}, +{"daggerdbl", 0x2021}, +{"dagujarati", 0x0AA6}, +{"dagurmukhi", 0x0A26}, +{"dahiragana", 0x3060}, +{"dakatakana", 0x30C0}, +{"dalarabic", 0x062F}, +{"dalet", 0x05D3}, +{"daletdagesh", 0xFB33}, +{"daletdageshhebrew", 0xFB33}, +{"dalethebrew", 0x05D3}, +{"dalfinalarabic", 0xFEAA}, +{"dammaarabic", 0x064F}, +{"dammalowarabic", 0x064F}, +{"dammatanaltonearabic", 0x064C}, +{"dammatanarabic", 0x064C}, +{"danda", 0x0964}, +{"dargahebrew", 0x05A7}, +{"dargalefthebrew", 0x05A7}, +{"dasiapneumatacyrilliccmb", 0x0485}, +{"dblGrave", 0xF6D3}, +{"dblanglebracketleft", 0x300A}, +{"dblanglebracketleftvertical", 0xFE3D}, +{"dblanglebracketright", 0x300B}, +{"dblanglebracketrightvertical", 0xFE3E}, +{"dblarchinvertedbelowcmb", 0x032B}, +{"dblarrowleft", 0x21D4}, +{"dblarrowright", 0x21D2}, +{"dbldanda", 0x0965}, +{"dblgrave", 0xF6D6}, +{"dblgravecmb", 0x030F}, +{"dblintegral", 0x222C}, +{"dbllowline", 0x2017}, +{"dbllowlinecmb", 0x0333}, +{"dbloverlinecmb", 0x033F}, +{"dblprimemod", 0x02BA}, +{"dblverticalbar", 0x2016}, +{"dblverticallineabovecmb", 0x030E}, +{"dbopomofo", 0x3109}, +{"dbsquare", 0x33C8}, +{"dcaron", 0x010F}, +{"dcedilla", 0x1E11}, +{"dcircle", 0x24D3}, +{"dcircumflexbelow", 0x1E13}, +{"dcroat", 0x0111}, +{"ddabengali", 0x09A1}, +{"ddadeva", 0x0921}, +{"ddagujarati", 0x0AA1}, +{"ddagurmukhi", 0x0A21}, +{"ddalarabic", 0x0688}, +{"ddalfinalarabic", 0xFB89}, +{"dddhadeva", 0x095C}, +{"ddhabengali", 0x09A2}, +{"ddhadeva", 0x0922}, +{"ddhagujarati", 0x0AA2}, +{"ddhagurmukhi", 0x0A22}, +{"ddotaccent", 0x1E0B}, +{"ddotbelow", 0x1E0D}, +{"decimalseparatorarabic", 0x066B}, +{"decimalseparatorpersian", 0x066B}, +{"decyrillic", 0x0434}, +{"degree", 0x00B0}, +{"dehihebrew", 0x05AD}, +{"dehiragana", 0x3067}, +{"deicoptic", 0x03EF}, +{"dekatakana", 0x30C7}, +{"deleteleft", 0x232B}, +{"deleteright", 0x2326}, +{"delta", 0x03B4}, +{"deltaturned", 0x018D}, +{"denominatorminusonenumeratorbengali", 0x09F8}, +{"dezh", 0x02A4}, +{"dhabengali", 0x09A7}, +{"dhadeva", 0x0927}, +{"dhagujarati", 0x0AA7}, +{"dhagurmukhi", 0x0A27}, +{"dhook", 0x0257}, +{"dialytikatonos", 0x0385}, +{"dialytikatonoscmb", 0x0344}, +{"diamond", 0x2666}, +{"diamondsuitwhite", 0x2662}, +{"dieresis", 0x00A8}, +{"dieresisacute", 0xF6D7}, +{"dieresisbelowcmb", 0x0324}, +{"dieresiscmb", 0x0308}, +{"dieresisgrave", 0xF6D8}, +{"dieresistonos", 0x0385}, +{"dihiragana", 0x3062}, +{"dikatakana", 0x30C2}, +{"dittomark", 0x3003}, +{"divide", 0x00F7}, +{"divides", 0x2223}, +{"divisionslash", 0x2215}, +{"djecyrillic", 0x0452}, +{"dkshade", 0x2593}, +{"dlinebelow", 0x1E0F}, +{"dlsquare", 0x3397}, +{"dmacron", 0x0111}, +{"dmonospace", 0xFF44}, +{"dnblock", 0x2584}, +{"dochadathai", 0x0E0E}, +{"dodekthai", 0x0E14}, +{"dohiragana", 0x3069}, +{"dokatakana", 0x30C9}, +{"dollar", 0x0024}, +{"dollarinferior", 0xF6E3}, +{"dollarmonospace", 0xFF04}, +{"dollaroldstyle", 0xF724}, +{"dollarsmall", 0xFE69}, +{"dollarsuperior", 0xF6E4}, +{"dong", 0x20AB}, +{"dorusquare", 0x3326}, +{"dotaccent", 0x02D9}, +{"dotaccentcmb", 0x0307}, +{"dotbelowcmb", 0x0323}, +{"dotbelowcomb", 0x0323}, +{"dotkatakana", 0x30FB}, +{"dotlessi", 0x0131}, +{"dotlessj", 0xF6BE}, +{"dotlessjstrokehook", 0x0284}, +{"dotmath", 0x22C5}, +{"dottedcircle", 0x25CC}, +{"doubleyodpatah", 0xFB1F}, +{"doubleyodpatahhebrew", 0xFB1F}, +{"downtackbelowcmb", 0x031E}, +{"downtackmod", 0x02D5}, +{"dparen", 0x249F}, +{"dsuperior", 0xF6EB}, +{"dtail", 0x0256}, +{"dtopbar", 0x018C}, +{"duhiragana", 0x3065}, +{"dukatakana", 0x30C5}, +{"dz", 0x01F3}, +{"dzaltone", 0x02A3}, +{"dzcaron", 0x01C6}, +{"dzcurl", 0x02A5}, +{"dzeabkhasiancyrillic", 0x04E1}, +{"dzecyrillic", 0x0455}, +{"dzhecyrillic", 0x045F}, +{"e", 0x0065}, +{"eacute", 0x00E9}, +{"earth", 0x2641}, +{"ebengali", 0x098F}, +{"ebopomofo", 0x311C}, +{"ebreve", 0x0115}, +{"ecandradeva", 0x090D}, +{"ecandragujarati", 0x0A8D}, +{"ecandravowelsigndeva", 0x0945}, +{"ecandravowelsigngujarati", 0x0AC5}, +{"ecaron", 0x011B}, +{"ecedillabreve", 0x1E1D}, +{"echarmenian", 0x0565}, +{"echyiwnarmenian", 0x0587}, +{"ecircle", 0x24D4}, +{"ecircumflex", 0x00EA}, +{"ecircumflexacute", 0x1EBF}, +{"ecircumflexbelow", 0x1E19}, +{"ecircumflexdotbelow", 0x1EC7}, +{"ecircumflexgrave", 0x1EC1}, +{"ecircumflexhookabove", 0x1EC3}, +{"ecircumflextilde", 0x1EC5}, +{"ecyrillic", 0x0454}, +{"edblgrave", 0x0205}, +{"edeva", 0x090F}, +{"edieresis", 0x00EB}, +{"edot", 0x0117}, +{"edotaccent", 0x0117}, +{"edotbelow", 0x1EB9}, +{"eegurmukhi", 0x0A0F}, +{"eematragurmukhi", 0x0A47}, +{"efcyrillic", 0x0444}, +{"egrave", 0x00E8}, +{"egujarati", 0x0A8F}, +{"eharmenian", 0x0567}, +{"ehbopomofo", 0x311D}, +{"ehiragana", 0x3048}, +{"ehookabove", 0x1EBB}, +{"eibopomofo", 0x311F}, +{"eight", 0x0038}, +{"eightarabic", 0x0668}, +{"eightbengali", 0x09EE}, +{"eightcircle", 0x2467}, +{"eightcircleinversesansserif", 0x2791}, +{"eightdeva", 0x096E}, +{"eighteencircle", 0x2471}, +{"eighteenparen", 0x2485}, +{"eighteenperiod", 0x2499}, +{"eightgujarati", 0x0AEE}, +{"eightgurmukhi", 0x0A6E}, +{"eighthackarabic", 0x0668}, +{"eighthangzhou", 0x3028}, +{"eighthnotebeamed", 0x266B}, +{"eightideographicparen", 0x3227}, +{"eightinferior", 0x2088}, +{"eightmonospace", 0xFF18}, +{"eightoldstyle", 0xF738}, +{"eightparen", 0x247B}, +{"eightperiod", 0x248F}, +{"eightpersian", 0x06F8}, +{"eightroman", 0x2177}, +{"eightsuperior", 0x2078}, +{"eightthai", 0x0E58}, +{"einvertedbreve", 0x0207}, +{"eiotifiedcyrillic", 0x0465}, +{"ekatakana", 0x30A8}, +{"ekatakanahalfwidth", 0xFF74}, +{"ekonkargurmukhi", 0x0A74}, +{"ekorean", 0x3154}, +{"elcyrillic", 0x043B}, +{"element", 0x2208}, +{"elevencircle", 0x246A}, +{"elevenparen", 0x247E}, +{"elevenperiod", 0x2492}, +{"elevenroman", 0x217A}, +{"ellipsis", 0x2026}, +{"ellipsisvertical", 0x22EE}, +{"emacron", 0x0113}, +{"emacronacute", 0x1E17}, +{"emacrongrave", 0x1E15}, +{"emcyrillic", 0x043C}, +{"emdash", 0x2014}, +{"emdashvertical", 0xFE31}, +{"emonospace", 0xFF45}, +{"emphasismarkarmenian", 0x055B}, +{"emptyset", 0x2205}, +{"enbopomofo", 0x3123}, +{"encyrillic", 0x043D}, +{"endash", 0x2013}, +{"endashvertical", 0xFE32}, +{"endescendercyrillic", 0x04A3}, +{"eng", 0x014B}, +{"engbopomofo", 0x3125}, +{"enghecyrillic", 0x04A5}, +{"enhookcyrillic", 0x04C8}, +{"enspace", 0x2002}, +{"eogonek", 0x0119}, +{"eokorean", 0x3153}, +{"eopen", 0x025B}, +{"eopenclosed", 0x029A}, +{"eopenreversed", 0x025C}, +{"eopenreversedclosed", 0x025E}, +{"eopenreversedhook", 0x025D}, +{"eparen", 0x24A0}, +{"epsilon", 0x03B5}, +{"epsilontonos", 0x03AD}, +{"equal", 0x003D}, +{"equalmonospace", 0xFF1D}, +{"equalsmall", 0xFE66}, +{"equalsuperior", 0x207C}, +{"equivalence", 0x2261}, +{"erbopomofo", 0x3126}, +{"ercyrillic", 0x0440}, +{"ereversed", 0x0258}, +{"ereversedcyrillic", 0x044D}, +{"escyrillic", 0x0441}, +{"esdescendercyrillic", 0x04AB}, +{"esh", 0x0283}, +{"eshcurl", 0x0286}, +{"eshortdeva", 0x090E}, +{"eshortvowelsigndeva", 0x0946}, +{"eshreversedloop", 0x01AA}, +{"eshsquatreversed", 0x0285}, +{"esmallhiragana", 0x3047}, +{"esmallkatakana", 0x30A7}, +{"esmallkatakanahalfwidth", 0xFF6A}, +{"estimated", 0x212E}, +{"esuperior", 0xF6EC}, +{"eta", 0x03B7}, +{"etarmenian", 0x0568}, +{"etatonos", 0x03AE}, +{"eth", 0x00F0}, +{"etilde", 0x1EBD}, +{"etildebelow", 0x1E1B}, +{"etnahtafoukhhebrew", 0x0591}, +{"etnahtafoukhlefthebrew", 0x0591}, +{"etnahtahebrew", 0x0591}, +{"etnahtalefthebrew", 0x0591}, +{"eturned", 0x01DD}, +{"eukorean", 0x3161}, +{"euro", 0x20AC}, +{"evowelsignbengali", 0x09C7}, +{"evowelsigndeva", 0x0947}, +{"evowelsigngujarati", 0x0AC7}, +{"exclam", 0x0021}, +{"exclamarmenian", 0x055C}, +{"exclamdbl", 0x203C}, +{"exclamdown", 0x00A1}, +{"exclamdownsmall", 0xF7A1}, +{"exclammonospace", 0xFF01}, +{"exclamsmall", 0xF721}, +{"existential", 0x2203}, +{"ezh", 0x0292}, +{"ezhcaron", 0x01EF}, +{"ezhcurl", 0x0293}, +{"ezhreversed", 0x01B9}, +{"ezhtail", 0x01BA}, +{"f", 0x0066}, +{"fadeva", 0x095E}, +{"fagurmukhi", 0x0A5E}, +{"fahrenheit", 0x2109}, +{"fathaarabic", 0x064E}, +{"fathalowarabic", 0x064E}, +{"fathatanarabic", 0x064B}, +{"fbopomofo", 0x3108}, +{"fcircle", 0x24D5}, +{"fdotaccent", 0x1E1F}, +{"feharabic", 0x0641}, +{"feharmenian", 0x0586}, +{"fehfinalarabic", 0xFED2}, +{"fehinitialarabic", 0xFED3}, +{"fehmedialarabic", 0xFED4}, +{"feicoptic", 0x03E5}, +{"female", 0x2640}, +{"ff", 0xFB00}, +{"ffi", 0xFB03}, +{"ffl", 0xFB04}, +{"fi", 0xFB01}, +{"fifteencircle", 0x246E}, +{"fifteenparen", 0x2482}, +{"fifteenperiod", 0x2496}, +{"figuredash", 0x2012}, +{"filledbox", 0x25A0}, +{"filledrect", 0x25AC}, +{"finalkaf", 0x05DA}, +{"finalkafdagesh", 0xFB3A}, +{"finalkafdageshhebrew", 0xFB3A}, +{"finalkafhebrew", 0x05DA}, +{"finalmem", 0x05DD}, +{"finalmemhebrew", 0x05DD}, +{"finalnun", 0x05DF}, +{"finalnunhebrew", 0x05DF}, +{"finalpe", 0x05E3}, +{"finalpehebrew", 0x05E3}, +{"finaltsadi", 0x05E5}, +{"finaltsadihebrew", 0x05E5}, +{"firsttonechinese", 0x02C9}, +{"fisheye", 0x25C9}, +{"fitacyrillic", 0x0473}, +{"five", 0x0035}, +{"fivearabic", 0x0665}, +{"fivebengali", 0x09EB}, +{"fivecircle", 0x2464}, +{"fivecircleinversesansserif", 0x278E}, +{"fivedeva", 0x096B}, +{"fiveeighths", 0x215D}, +{"fivegujarati", 0x0AEB}, +{"fivegurmukhi", 0x0A6B}, +{"fivehackarabic", 0x0665}, +{"fivehangzhou", 0x3025}, +{"fiveideographicparen", 0x3224}, +{"fiveinferior", 0x2085}, +{"fivemonospace", 0xFF15}, +{"fiveoldstyle", 0xF735}, +{"fiveparen", 0x2478}, +{"fiveperiod", 0x248C}, +{"fivepersian", 0x06F5}, +{"fiveroman", 0x2174}, +{"fivesuperior", 0x2075}, +{"fivethai", 0x0E55}, +{"fl", 0xFB02}, +{"florin", 0x0192}, +{"fmonospace", 0xFF46}, +{"fmsquare", 0x3399}, +{"fofanthai", 0x0E1F}, +{"fofathai", 0x0E1D}, +{"fongmanthai", 0x0E4F}, +{"forall", 0x2200}, +{"four", 0x0034}, +{"fourarabic", 0x0664}, +{"fourbengali", 0x09EA}, +{"fourcircle", 0x2463}, +{"fourcircleinversesansserif", 0x278D}, +{"fourdeva", 0x096A}, +{"fourgujarati", 0x0AEA}, +{"fourgurmukhi", 0x0A6A}, +{"fourhackarabic", 0x0664}, +{"fourhangzhou", 0x3024}, +{"fourideographicparen", 0x3223}, +{"fourinferior", 0x2084}, +{"fourmonospace", 0xFF14}, +{"fournumeratorbengali", 0x09F7}, +{"fouroldstyle", 0xF734}, +{"fourparen", 0x2477}, +{"fourperiod", 0x248B}, +{"fourpersian", 0x06F4}, +{"fourroman", 0x2173}, +{"foursuperior", 0x2074}, +{"fourteencircle", 0x246D}, +{"fourteenparen", 0x2481}, +{"fourteenperiod", 0x2495}, +{"fourthai", 0x0E54}, +{"fourthtonechinese", 0x02CB}, +{"fparen", 0x24A1}, +{"fraction", 0x2044}, +{"franc", 0x20A3}, +{"g", 0x0067}, +{"gabengali", 0x0997}, +{"gacute", 0x01F5}, +{"gadeva", 0x0917}, +{"gafarabic", 0x06AF}, +{"gaffinalarabic", 0xFB93}, +{"gafinitialarabic", 0xFB94}, +{"gafmedialarabic", 0xFB95}, +{"gagujarati", 0x0A97}, +{"gagurmukhi", 0x0A17}, +{"gahiragana", 0x304C}, +{"gakatakana", 0x30AC}, +{"gamma", 0x03B3}, +{"gammalatinsmall", 0x0263}, +{"gammasuperior", 0x02E0}, +{"gangiacoptic", 0x03EB}, +{"gbopomofo", 0x310D}, +{"gbreve", 0x011F}, +{"gcaron", 0x01E7}, +{"gcedilla", 0x0123}, +{"gcircle", 0x24D6}, +{"gcircumflex", 0x011D}, +{"gcommaaccent", 0x0123}, +{"gdot", 0x0121}, +{"gdotaccent", 0x0121}, +{"gecyrillic", 0x0433}, +{"gehiragana", 0x3052}, +{"gekatakana", 0x30B2}, +{"geometricallyequal", 0x2251}, +{"gereshaccenthebrew", 0x059C}, +{"gereshhebrew", 0x05F3}, +{"gereshmuqdamhebrew", 0x059D}, +{"germandbls", 0x00DF}, +{"gershayimaccenthebrew", 0x059E}, +{"gershayimhebrew", 0x05F4}, +{"getamark", 0x3013}, +{"ghabengali", 0x0998}, +{"ghadarmenian", 0x0572}, +{"ghadeva", 0x0918}, +{"ghagujarati", 0x0A98}, +{"ghagurmukhi", 0x0A18}, +{"ghainarabic", 0x063A}, +{"ghainfinalarabic", 0xFECE}, +{"ghaininitialarabic", 0xFECF}, +{"ghainmedialarabic", 0xFED0}, +{"ghemiddlehookcyrillic", 0x0495}, +{"ghestrokecyrillic", 0x0493}, +{"gheupturncyrillic", 0x0491}, +{"ghhadeva", 0x095A}, +{"ghhagurmukhi", 0x0A5A}, +{"ghook", 0x0260}, +{"ghzsquare", 0x3393}, +{"gihiragana", 0x304E}, +{"gikatakana", 0x30AE}, +{"gimarmenian", 0x0563}, +{"gimel", 0x05D2}, +{"gimeldagesh", 0xFB32}, +{"gimeldageshhebrew", 0xFB32}, +{"gimelhebrew", 0x05D2}, +{"gjecyrillic", 0x0453}, +{"glottalinvertedstroke", 0x01BE}, +{"glottalstop", 0x0294}, +{"glottalstopinverted", 0x0296}, +{"glottalstopmod", 0x02C0}, +{"glottalstopreversed", 0x0295}, +{"glottalstopreversedmod", 0x02C1}, +{"glottalstopreversedsuperior", 0x02E4}, +{"glottalstopstroke", 0x02A1}, +{"glottalstopstrokereversed", 0x02A2}, +{"gmacron", 0x1E21}, +{"gmonospace", 0xFF47}, +{"gohiragana", 0x3054}, +{"gokatakana", 0x30B4}, +{"gparen", 0x24A2}, +{"gpasquare", 0x33AC}, +{"gradient", 0x2207}, +{"grave", 0x0060}, +{"gravebelowcmb", 0x0316}, +{"gravecmb", 0x0300}, +{"gravecomb", 0x0300}, +{"gravedeva", 0x0953}, +{"gravelowmod", 0x02CE}, +{"gravemonospace", 0xFF40}, +{"gravetonecmb", 0x0340}, +{"greater", 0x003E}, +{"greaterequal", 0x2265}, +{"greaterequalorless", 0x22DB}, +{"greatermonospace", 0xFF1E}, +{"greaterorequivalent", 0x2273}, +{"greaterorless", 0x2277}, +{"greateroverequal", 0x2267}, +{"greatersmall", 0xFE65}, +{"gscript", 0x0261}, +{"gstroke", 0x01E5}, +{"guhiragana", 0x3050}, +{"guillemotleft", 0x00AB}, +{"guillemotright", 0x00BB}, +{"guilsinglleft", 0x2039}, +{"guilsinglright", 0x203A}, +{"gukatakana", 0x30B0}, +{"guramusquare", 0x3318}, +{"gysquare", 0x33C9}, +{"h", 0x0068}, +{"haabkhasiancyrillic", 0x04A9}, +{"haaltonearabic", 0x06C1}, +{"habengali", 0x09B9}, +{"hadescendercyrillic", 0x04B3}, +{"hadeva", 0x0939}, +{"hagujarati", 0x0AB9}, +{"hagurmukhi", 0x0A39}, +{"haharabic", 0x062D}, +{"hahfinalarabic", 0xFEA2}, +{"hahinitialarabic", 0xFEA3}, +{"hahiragana", 0x306F}, +{"hahmedialarabic", 0xFEA4}, +{"haitusquare", 0x332A}, +{"hakatakana", 0x30CF}, +{"hakatakanahalfwidth", 0xFF8A}, +{"halantgurmukhi", 0x0A4D}, +{"hamzaarabic", 0x0621}, +{"hamzalowarabic", 0x0621}, +{"hangulfiller", 0x3164}, +{"hardsigncyrillic", 0x044A}, +{"harpoonleftbarbup", 0x21BC}, +{"harpoonrightbarbup", 0x21C0}, +{"hasquare", 0x33CA}, +{"hatafpatah", 0x05B2}, +{"hatafpatah16", 0x05B2}, +{"hatafpatah23", 0x05B2}, +{"hatafpatah2f", 0x05B2}, +{"hatafpatahhebrew", 0x05B2}, +{"hatafpatahnarrowhebrew", 0x05B2}, +{"hatafpatahquarterhebrew", 0x05B2}, +{"hatafpatahwidehebrew", 0x05B2}, +{"hatafqamats", 0x05B3}, +{"hatafqamats1b", 0x05B3}, +{"hatafqamats28", 0x05B3}, +{"hatafqamats34", 0x05B3}, +{"hatafqamatshebrew", 0x05B3}, +{"hatafqamatsnarrowhebrew", 0x05B3}, +{"hatafqamatsquarterhebrew", 0x05B3}, +{"hatafqamatswidehebrew", 0x05B3}, +{"hatafsegol", 0x05B1}, +{"hatafsegol17", 0x05B1}, +{"hatafsegol24", 0x05B1}, +{"hatafsegol30", 0x05B1}, +{"hatafsegolhebrew", 0x05B1}, +{"hatafsegolnarrowhebrew", 0x05B1}, +{"hatafsegolquarterhebrew", 0x05B1}, +{"hatafsegolwidehebrew", 0x05B1}, +{"hbar", 0x0127}, +{"hbopomofo", 0x310F}, +{"hbrevebelow", 0x1E2B}, +{"hcedilla", 0x1E29}, +{"hcircle", 0x24D7}, +{"hcircumflex", 0x0125}, +{"hdieresis", 0x1E27}, +{"hdotaccent", 0x1E23}, +{"hdotbelow", 0x1E25}, +{"he", 0x05D4}, +{"heart", 0x2665}, +{"heartsuitblack", 0x2665}, +{"heartsuitwhite", 0x2661}, +{"hedagesh", 0xFB34}, +{"hedageshhebrew", 0xFB34}, +{"hehaltonearabic", 0x06C1}, +{"heharabic", 0x0647}, +{"hehebrew", 0x05D4}, +{"hehfinalaltonearabic", 0xFBA7}, +{"hehfinalalttwoarabic", 0xFEEA}, +{"hehfinalarabic", 0xFEEA}, +{"hehhamzaabovefinalarabic", 0xFBA5}, +{"hehhamzaaboveisolatedarabic", 0xFBA4}, +{"hehinitialaltonearabic", 0xFBA8}, +{"hehinitialarabic", 0xFEEB}, +{"hehiragana", 0x3078}, +{"hehmedialaltonearabic", 0xFBA9}, +{"hehmedialarabic", 0xFEEC}, +{"heiseierasquare", 0x337B}, +{"hekatakana", 0x30D8}, +{"hekatakanahalfwidth", 0xFF8D}, +{"hekutaarusquare", 0x3336}, +{"henghook", 0x0267}, +{"herutusquare", 0x3339}, +{"het", 0x05D7}, +{"hethebrew", 0x05D7}, +{"hhook", 0x0266}, +{"hhooksuperior", 0x02B1}, +{"hieuhacirclekorean", 0x327B}, +{"hieuhaparenkorean", 0x321B}, +{"hieuhcirclekorean", 0x326D}, +{"hieuhkorean", 0x314E}, +{"hieuhparenkorean", 0x320D}, +{"hihiragana", 0x3072}, +{"hikatakana", 0x30D2}, +{"hikatakanahalfwidth", 0xFF8B}, +{"hiriq", 0x05B4}, +{"hiriq14", 0x05B4}, +{"hiriq21", 0x05B4}, +{"hiriq2d", 0x05B4}, +{"hiriqhebrew", 0x05B4}, +{"hiriqnarrowhebrew", 0x05B4}, +{"hiriqquarterhebrew", 0x05B4}, +{"hiriqwidehebrew", 0x05B4}, +{"hlinebelow", 0x1E96}, +{"hmonospace", 0xFF48}, +{"hoarmenian", 0x0570}, +{"hohipthai", 0x0E2B}, +{"hohiragana", 0x307B}, +{"hokatakana", 0x30DB}, +{"hokatakanahalfwidth", 0xFF8E}, +{"holam", 0x05B9}, +{"holam19", 0x05B9}, +{"holam26", 0x05B9}, +{"holam32", 0x05B9}, +{"holamhebrew", 0x05B9}, +{"holamnarrowhebrew", 0x05B9}, +{"holamquarterhebrew", 0x05B9}, +{"holamwidehebrew", 0x05B9}, +{"honokhukthai", 0x0E2E}, +{"hookabovecomb", 0x0309}, +{"hookcmb", 0x0309}, +{"hookpalatalizedbelowcmb", 0x0321}, +{"hookretroflexbelowcmb", 0x0322}, +{"hoonsquare", 0x3342}, +{"horicoptic", 0x03E9}, +{"horizontalbar", 0x2015}, +{"horncmb", 0x031B}, +{"hotsprings", 0x2668}, +{"house", 0x2302}, +{"hparen", 0x24A3}, +{"hsuperior", 0x02B0}, +{"hturned", 0x0265}, +{"huhiragana", 0x3075}, +{"huiitosquare", 0x3333}, +{"hukatakana", 0x30D5}, +{"hukatakanahalfwidth", 0xFF8C}, +{"hungarumlaut", 0x02DD}, +{"hungarumlautcmb", 0x030B}, +{"hv", 0x0195}, +{"hyphen", 0x002D}, +{"hypheninferior", 0xF6E5}, +{"hyphenmonospace", 0xFF0D}, +{"hyphensmall", 0xFE63}, +{"hyphensuperior", 0xF6E6}, +{"hyphentwo", 0x2010}, +{"i", 0x0069}, +{"iacute", 0x00ED}, +{"iacyrillic", 0x044F}, +{"ibengali", 0x0987}, +{"ibopomofo", 0x3127}, +{"ibreve", 0x012D}, +{"icaron", 0x01D0}, +{"icircle", 0x24D8}, +{"icircumflex", 0x00EE}, +{"icyrillic", 0x0456}, +{"idblgrave", 0x0209}, +{"ideographearthcircle", 0x328F}, +{"ideographfirecircle", 0x328B}, +{"ideographicallianceparen", 0x323F}, +{"ideographiccallparen", 0x323A}, +{"ideographiccentrecircle", 0x32A5}, +{"ideographicclose", 0x3006}, +{"ideographiccomma", 0x3001}, +{"ideographiccommaleft", 0xFF64}, +{"ideographiccongratulationparen", 0x3237}, +{"ideographiccorrectcircle", 0x32A3}, +{"ideographicearthparen", 0x322F}, +{"ideographicenterpriseparen", 0x323D}, +{"ideographicexcellentcircle", 0x329D}, +{"ideographicfestivalparen", 0x3240}, +{"ideographicfinancialcircle", 0x3296}, +{"ideographicfinancialparen", 0x3236}, +{"ideographicfireparen", 0x322B}, +{"ideographichaveparen", 0x3232}, +{"ideographichighcircle", 0x32A4}, +{"ideographiciterationmark", 0x3005}, +{"ideographiclaborcircle", 0x3298}, +{"ideographiclaborparen", 0x3238}, +{"ideographicleftcircle", 0x32A7}, +{"ideographiclowcircle", 0x32A6}, +{"ideographicmedicinecircle", 0x32A9}, +{"ideographicmetalparen", 0x322E}, +{"ideographicmoonparen", 0x322A}, +{"ideographicnameparen", 0x3234}, +{"ideographicperiod", 0x3002}, +{"ideographicprintcircle", 0x329E}, +{"ideographicreachparen", 0x3243}, +{"ideographicrepresentparen", 0x3239}, +{"ideographicresourceparen", 0x323E}, +{"ideographicrightcircle", 0x32A8}, +{"ideographicsecretcircle", 0x3299}, +{"ideographicselfparen", 0x3242}, +{"ideographicsocietyparen", 0x3233}, +{"ideographicspace", 0x3000}, +{"ideographicspecialparen", 0x3235}, +{"ideographicstockparen", 0x3231}, +{"ideographicstudyparen", 0x323B}, +{"ideographicsunparen", 0x3230}, +{"ideographicsuperviseparen", 0x323C}, +{"ideographicwaterparen", 0x322C}, +{"ideographicwoodparen", 0x322D}, +{"ideographiczero", 0x3007}, +{"ideographmetalcircle", 0x328E}, +{"ideographmooncircle", 0x328A}, +{"ideographnamecircle", 0x3294}, +{"ideographsuncircle", 0x3290}, +{"ideographwatercircle", 0x328C}, +{"ideographwoodcircle", 0x328D}, +{"ideva", 0x0907}, +{"idieresis", 0x00EF}, +{"idieresisacute", 0x1E2F}, +{"idieresiscyrillic", 0x04E5}, +{"idotbelow", 0x1ECB}, +{"iebrevecyrillic", 0x04D7}, +{"iecyrillic", 0x0435}, +{"ieungacirclekorean", 0x3275}, +{"ieungaparenkorean", 0x3215}, +{"ieungcirclekorean", 0x3267}, +{"ieungkorean", 0x3147}, +{"ieungparenkorean", 0x3207}, +{"igrave", 0x00EC}, +{"igujarati", 0x0A87}, +{"igurmukhi", 0x0A07}, +{"ihiragana", 0x3044}, +{"ihookabove", 0x1EC9}, +{"iibengali", 0x0988}, +{"iicyrillic", 0x0438}, +{"iideva", 0x0908}, +{"iigujarati", 0x0A88}, +{"iigurmukhi", 0x0A08}, +{"iimatragurmukhi", 0x0A40}, +{"iinvertedbreve", 0x020B}, +{"iishortcyrillic", 0x0439}, +{"iivowelsignbengali", 0x09C0}, +{"iivowelsigndeva", 0x0940}, +{"iivowelsigngujarati", 0x0AC0}, +{"ij", 0x0133}, +{"ikatakana", 0x30A4}, +{"ikatakanahalfwidth", 0xFF72}, +{"ikorean", 0x3163}, +{"ilde", 0x02DC}, +{"iluyhebrew", 0x05AC}, +{"imacron", 0x012B}, +{"imacroncyrillic", 0x04E3}, +{"imageorapproximatelyequal", 0x2253}, +{"imatragurmukhi", 0x0A3F}, +{"imonospace", 0xFF49}, +{"increment", 0x2206}, +{"infinity", 0x221E}, +{"iniarmenian", 0x056B}, +{"integral", 0x222B}, +{"integralbottom", 0x2321}, +{"integralbt", 0x2321}, +{"integralex", 0xF8F5}, +{"integraltop", 0x2320}, +{"integraltp", 0x2320}, +{"intersection", 0x2229}, +{"intisquare", 0x3305}, +{"invbullet", 0x25D8}, +{"invcircle", 0x25D9}, +{"invsmileface", 0x263B}, +{"iocyrillic", 0x0451}, +{"iogonek", 0x012F}, +{"iota", 0x03B9}, +{"iotadieresis", 0x03CA}, +{"iotadieresistonos", 0x0390}, +{"iotalatin", 0x0269}, +{"iotatonos", 0x03AF}, +{"iparen", 0x24A4}, +{"irigurmukhi", 0x0A72}, +{"ismallhiragana", 0x3043}, +{"ismallkatakana", 0x30A3}, +{"ismallkatakanahalfwidth", 0xFF68}, +{"issharbengali", 0x09FA}, +{"istroke", 0x0268}, +{"isuperior", 0xF6ED}, +{"iterationhiragana", 0x309D}, +{"iterationkatakana", 0x30FD}, +{"itilde", 0x0129}, +{"itildebelow", 0x1E2D}, +{"iubopomofo", 0x3129}, +{"iucyrillic", 0x044E}, +{"ivowelsignbengali", 0x09BF}, +{"ivowelsigndeva", 0x093F}, +{"ivowelsigngujarati", 0x0ABF}, +{"izhitsacyrillic", 0x0475}, +{"izhitsadblgravecyrillic", 0x0477}, +{"j", 0x006A}, +{"jaarmenian", 0x0571}, +{"jabengali", 0x099C}, +{"jadeva", 0x091C}, +{"jagujarati", 0x0A9C}, +{"jagurmukhi", 0x0A1C}, +{"jbopomofo", 0x3110}, +{"jcaron", 0x01F0}, +{"jcircle", 0x24D9}, +{"jcircumflex", 0x0135}, +{"jcrossedtail", 0x029D}, +{"jdotlessstroke", 0x025F}, +{"jecyrillic", 0x0458}, +{"jeemarabic", 0x062C}, +{"jeemfinalarabic", 0xFE9E}, +{"jeeminitialarabic", 0xFE9F}, +{"jeemmedialarabic", 0xFEA0}, +{"jeharabic", 0x0698}, +{"jehfinalarabic", 0xFB8B}, +{"jhabengali", 0x099D}, +{"jhadeva", 0x091D}, +{"jhagujarati", 0x0A9D}, +{"jhagurmukhi", 0x0A1D}, +{"jheharmenian", 0x057B}, +{"jis", 0x3004}, +{"jmonospace", 0xFF4A}, +{"jparen", 0x24A5}, +{"jsuperior", 0x02B2}, +{"k", 0x006B}, +{"kabashkircyrillic", 0x04A1}, +{"kabengali", 0x0995}, +{"kacute", 0x1E31}, +{"kacyrillic", 0x043A}, +{"kadescendercyrillic", 0x049B}, +{"kadeva", 0x0915}, +{"kaf", 0x05DB}, +{"kafarabic", 0x0643}, +{"kafdagesh", 0xFB3B}, +{"kafdageshhebrew", 0xFB3B}, +{"kaffinalarabic", 0xFEDA}, +{"kafhebrew", 0x05DB}, +{"kafinitialarabic", 0xFEDB}, +{"kafmedialarabic", 0xFEDC}, +{"kafrafehebrew", 0xFB4D}, +{"kagujarati", 0x0A95}, +{"kagurmukhi", 0x0A15}, +{"kahiragana", 0x304B}, +{"kahookcyrillic", 0x04C4}, +{"kakatakana", 0x30AB}, +{"kakatakanahalfwidth", 0xFF76}, +{"kappa", 0x03BA}, +{"kappasymbolgreek", 0x03F0}, +{"kapyeounmieumkorean", 0x3171}, +{"kapyeounphieuphkorean", 0x3184}, +{"kapyeounpieupkorean", 0x3178}, +{"kapyeounssangpieupkorean", 0x3179}, +{"karoriisquare", 0x330D}, +{"kashidaautoarabic", 0x0640}, +{"kashidaautonosidebearingarabic", 0x0640}, +{"kasmallkatakana", 0x30F5}, +{"kasquare", 0x3384}, +{"kasraarabic", 0x0650}, +{"kasratanarabic", 0x064D}, +{"kastrokecyrillic", 0x049F}, +{"katahiraprolongmarkhalfwidth", 0xFF70}, +{"kaverticalstrokecyrillic", 0x049D}, +{"kbopomofo", 0x310E}, +{"kcalsquare", 0x3389}, +{"kcaron", 0x01E9}, +{"kcedilla", 0x0137}, +{"kcircle", 0x24DA}, +{"kcommaaccent", 0x0137}, +{"kdotbelow", 0x1E33}, +{"keharmenian", 0x0584}, +{"kehiragana", 0x3051}, +{"kekatakana", 0x30B1}, +{"kekatakanahalfwidth", 0xFF79}, +{"kenarmenian", 0x056F}, +{"kesmallkatakana", 0x30F6}, +{"kgreenlandic", 0x0138}, +{"khabengali", 0x0996}, +{"khacyrillic", 0x0445}, +{"khadeva", 0x0916}, +{"khagujarati", 0x0A96}, +{"khagurmukhi", 0x0A16}, +{"khaharabic", 0x062E}, +{"khahfinalarabic", 0xFEA6}, +{"khahinitialarabic", 0xFEA7}, +{"khahmedialarabic", 0xFEA8}, +{"kheicoptic", 0x03E7}, +{"khhadeva", 0x0959}, +{"khhagurmukhi", 0x0A59}, +{"khieukhacirclekorean", 0x3278}, +{"khieukhaparenkorean", 0x3218}, +{"khieukhcirclekorean", 0x326A}, +{"khieukhkorean", 0x314B}, +{"khieukhparenkorean", 0x320A}, +{"khokhaithai", 0x0E02}, +{"khokhonthai", 0x0E05}, +{"khokhuatthai", 0x0E03}, +{"khokhwaithai", 0x0E04}, +{"khomutthai", 0x0E5B}, +{"khook", 0x0199}, +{"khorakhangthai", 0x0E06}, +{"khzsquare", 0x3391}, +{"kihiragana", 0x304D}, +{"kikatakana", 0x30AD}, +{"kikatakanahalfwidth", 0xFF77}, +{"kiroguramusquare", 0x3315}, +{"kiromeetorusquare", 0x3316}, +{"kirosquare", 0x3314}, +{"kiyeokacirclekorean", 0x326E}, +{"kiyeokaparenkorean", 0x320E}, +{"kiyeokcirclekorean", 0x3260}, +{"kiyeokkorean", 0x3131}, +{"kiyeokparenkorean", 0x3200}, +{"kiyeoksioskorean", 0x3133}, +{"kjecyrillic", 0x045C}, +{"klinebelow", 0x1E35}, +{"klsquare", 0x3398}, +{"kmcubedsquare", 0x33A6}, +{"kmonospace", 0xFF4B}, +{"kmsquaredsquare", 0x33A2}, +{"kohiragana", 0x3053}, +{"kohmsquare", 0x33C0}, +{"kokaithai", 0x0E01}, +{"kokatakana", 0x30B3}, +{"kokatakanahalfwidth", 0xFF7A}, +{"kooposquare", 0x331E}, +{"koppacyrillic", 0x0481}, +{"koreanstandardsymbol", 0x327F}, +{"koroniscmb", 0x0343}, +{"kparen", 0x24A6}, +{"kpasquare", 0x33AA}, +{"ksicyrillic", 0x046F}, +{"ktsquare", 0x33CF}, +{"kturned", 0x029E}, +{"kuhiragana", 0x304F}, +{"kukatakana", 0x30AF}, +{"kukatakanahalfwidth", 0xFF78}, +{"kvsquare", 0x33B8}, +{"kwsquare", 0x33BE}, +{"l", 0x006C}, +{"labengali", 0x09B2}, +{"lacute", 0x013A}, +{"ladeva", 0x0932}, +{"lagujarati", 0x0AB2}, +{"lagurmukhi", 0x0A32}, +{"lakkhangyaothai", 0x0E45}, +{"lamaleffinalarabic", 0xFEFC}, +{"lamalefhamzaabovefinalarabic", 0xFEF8}, +{"lamalefhamzaaboveisolatedarabic", 0xFEF7}, +{"lamalefhamzabelowfinalarabic", 0xFEFA}, +{"lamalefhamzabelowisolatedarabic", 0xFEF9}, +{"lamalefisolatedarabic", 0xFEFB}, +{"lamalefmaddaabovefinalarabic", 0xFEF6}, +{"lamalefmaddaaboveisolatedarabic", 0xFEF5}, +{"lamarabic", 0x0644}, +{"lambda", 0x03BB}, +{"lambdastroke", 0x019B}, +{"lamed", 0x05DC}, +{"lameddagesh", 0xFB3C}, +{"lameddageshhebrew", 0xFB3C}, +{"lamedhebrew", 0x05DC}, +{"lamfinalarabic", 0xFEDE}, +{"lamhahinitialarabic", 0xFCCA}, +{"laminitialarabic", 0xFEDF}, +{"lamjeeminitialarabic", 0xFCC9}, +{"lamkhahinitialarabic", 0xFCCB}, +{"lamlamhehisolatedarabic", 0xFDF2}, +{"lammedialarabic", 0xFEE0}, +{"lammeemhahinitialarabic", 0xFD88}, +{"lammeeminitialarabic", 0xFCCC}, +{"largecircle", 0x25EF}, +{"lbar", 0x019A}, +{"lbelt", 0x026C}, +{"lbopomofo", 0x310C}, +{"lcaron", 0x013E}, +{"lcedilla", 0x013C}, +{"lcircle", 0x24DB}, +{"lcircumflexbelow", 0x1E3D}, +{"lcommaaccent", 0x013C}, +{"ldot", 0x0140}, +{"ldotaccent", 0x0140}, +{"ldotbelow", 0x1E37}, +{"ldotbelowmacron", 0x1E39}, +{"leftangleabovecmb", 0x031A}, +{"lefttackbelowcmb", 0x0318}, +{"less", 0x003C}, +{"lessequal", 0x2264}, +{"lessequalorgreater", 0x22DA}, +{"lessmonospace", 0xFF1C}, +{"lessorequivalent", 0x2272}, +{"lessorgreater", 0x2276}, +{"lessoverequal", 0x2266}, +{"lesssmall", 0xFE64}, +{"lezh", 0x026E}, +{"lfblock", 0x258C}, +{"lhookretroflex", 0x026D}, +{"lira", 0x20A4}, +{"liwnarmenian", 0x056C}, +{"lj", 0x01C9}, +{"ljecyrillic", 0x0459}, +{"ll", 0xF6C0}, +{"lladeva", 0x0933}, +{"llagujarati", 0x0AB3}, +{"llinebelow", 0x1E3B}, +{"llladeva", 0x0934}, +{"llvocalicbengali", 0x09E1}, +{"llvocalicdeva", 0x0961}, +{"llvocalicvowelsignbengali", 0x09E3}, +{"llvocalicvowelsigndeva", 0x0963}, +{"lmiddletilde", 0x026B}, +{"lmonospace", 0xFF4C}, +{"lmsquare", 0x33D0}, +{"lochulathai", 0x0E2C}, +{"logicaland", 0x2227}, +{"logicalnot", 0x00AC}, +{"logicalnotreversed", 0x2310}, +{"logicalor", 0x2228}, +{"lolingthai", 0x0E25}, +{"longs", 0x017F}, +{"lowlinecenterline", 0xFE4E}, +{"lowlinecmb", 0x0332}, +{"lowlinedashed", 0xFE4D}, +{"lozenge", 0x25CA}, +{"lparen", 0x24A7}, +{"lslash", 0x0142}, +{"lsquare", 0x2113}, +{"lsuperior", 0xF6EE}, +{"ltshade", 0x2591}, +{"luthai", 0x0E26}, +{"lvocalicbengali", 0x098C}, +{"lvocalicdeva", 0x090C}, +{"lvocalicvowelsignbengali", 0x09E2}, +{"lvocalicvowelsigndeva", 0x0962}, +{"lxsquare", 0x33D3}, +{"m", 0x006D}, +{"mabengali", 0x09AE}, +{"macron", 0x00AF}, +{"macronbelowcmb", 0x0331}, +{"macroncmb", 0x0304}, +{"macronlowmod", 0x02CD}, +{"macronmonospace", 0xFFE3}, +{"macute", 0x1E3F}, +{"madeva", 0x092E}, +{"magujarati", 0x0AAE}, +{"magurmukhi", 0x0A2E}, +{"mahapakhhebrew", 0x05A4}, +{"mahapakhlefthebrew", 0x05A4}, +{"mahiragana", 0x307E}, +{"maichattawalowleftthai", 0xF895}, +{"maichattawalowrightthai", 0xF894}, +{"maichattawathai", 0x0E4B}, +{"maichattawaupperleftthai", 0xF893}, +{"maieklowleftthai", 0xF88C}, +{"maieklowrightthai", 0xF88B}, +{"maiekthai", 0x0E48}, +{"maiekupperleftthai", 0xF88A}, +{"maihanakatleftthai", 0xF884}, +{"maihanakatthai", 0x0E31}, +{"maitaikhuleftthai", 0xF889}, +{"maitaikhuthai", 0x0E47}, +{"maitholowleftthai", 0xF88F}, +{"maitholowrightthai", 0xF88E}, +{"maithothai", 0x0E49}, +{"maithoupperleftthai", 0xF88D}, +{"maitrilowleftthai", 0xF892}, +{"maitrilowrightthai", 0xF891}, +{"maitrithai", 0x0E4A}, +{"maitriupperleftthai", 0xF890}, +{"maiyamokthai", 0x0E46}, +{"makatakana", 0x30DE}, +{"makatakanahalfwidth", 0xFF8F}, +{"male", 0x2642}, +{"mansyonsquare", 0x3347}, +{"maqafhebrew", 0x05BE}, +{"mars", 0x2642}, +{"masoracirclehebrew", 0x05AF}, +{"masquare", 0x3383}, +{"mbopomofo", 0x3107}, +{"mbsquare", 0x33D4}, +{"mcircle", 0x24DC}, +{"mcubedsquare", 0x33A5}, +{"mdotaccent", 0x1E41}, +{"mdotbelow", 0x1E43}, +{"meemarabic", 0x0645}, +{"meemfinalarabic", 0xFEE2}, +{"meeminitialarabic", 0xFEE3}, +{"meemmedialarabic", 0xFEE4}, +{"meemmeeminitialarabic", 0xFCD1}, +{"meemmeemisolatedarabic", 0xFC48}, +{"meetorusquare", 0x334D}, +{"mehiragana", 0x3081}, +{"meizierasquare", 0x337E}, +{"mekatakana", 0x30E1}, +{"mekatakanahalfwidth", 0xFF92}, +{"mem", 0x05DE}, +{"memdagesh", 0xFB3E}, +{"memdageshhebrew", 0xFB3E}, +{"memhebrew", 0x05DE}, +{"menarmenian", 0x0574}, +{"merkhahebrew", 0x05A5}, +{"merkhakefulahebrew", 0x05A6}, +{"merkhakefulalefthebrew", 0x05A6}, +{"merkhalefthebrew", 0x05A5}, +{"mhook", 0x0271}, +{"mhzsquare", 0x3392}, +{"middledotkatakanahalfwidth", 0xFF65}, +{"middot", 0x00B7}, +{"mieumacirclekorean", 0x3272}, +{"mieumaparenkorean", 0x3212}, +{"mieumcirclekorean", 0x3264}, +{"mieumkorean", 0x3141}, +{"mieumpansioskorean", 0x3170}, +{"mieumparenkorean", 0x3204}, +{"mieumpieupkorean", 0x316E}, +{"mieumsioskorean", 0x316F}, +{"mihiragana", 0x307F}, +{"mikatakana", 0x30DF}, +{"mikatakanahalfwidth", 0xFF90}, +{"minus", 0x2212}, +{"minusbelowcmb", 0x0320}, +{"minuscircle", 0x2296}, +{"minusmod", 0x02D7}, +{"minusplus", 0x2213}, +{"minute", 0x2032}, +{"miribaarusquare", 0x334A}, +{"mirisquare", 0x3349}, +{"mlonglegturned", 0x0270}, +{"mlsquare", 0x3396}, +{"mmcubedsquare", 0x33A3}, +{"mmonospace", 0xFF4D}, +{"mmsquaredsquare", 0x339F}, +{"mohiragana", 0x3082}, +{"mohmsquare", 0x33C1}, +{"mokatakana", 0x30E2}, +{"mokatakanahalfwidth", 0xFF93}, +{"molsquare", 0x33D6}, +{"momathai", 0x0E21}, +{"moverssquare", 0x33A7}, +{"moverssquaredsquare", 0x33A8}, +{"mparen", 0x24A8}, +{"mpasquare", 0x33AB}, +{"mssquare", 0x33B3}, +{"msuperior", 0xF6EF}, +{"mturned", 0x026F}, +{"mu", 0x00B5}, +{"mu1", 0x00B5}, +{"muasquare", 0x3382}, +{"muchgreater", 0x226B}, +{"muchless", 0x226A}, +{"mufsquare", 0x338C}, +{"mugreek", 0x03BC}, +{"mugsquare", 0x338D}, +{"muhiragana", 0x3080}, +{"mukatakana", 0x30E0}, +{"mukatakanahalfwidth", 0xFF91}, +{"mulsquare", 0x3395}, +{"multiply", 0x00D7}, +{"mumsquare", 0x339B}, +{"munahhebrew", 0x05A3}, +{"munahlefthebrew", 0x05A3}, +{"musicalnote", 0x266A}, +{"musicalnotedbl", 0x266B}, +{"musicflatsign", 0x266D}, +{"musicsharpsign", 0x266F}, +{"mussquare", 0x33B2}, +{"muvsquare", 0x33B6}, +{"muwsquare", 0x33BC}, +{"mvmegasquare", 0x33B9}, +{"mvsquare", 0x33B7}, +{"mwmegasquare", 0x33BF}, +{"mwsquare", 0x33BD}, +{"n", 0x006E}, +{"nabengali", 0x09A8}, +{"nabla", 0x2207}, +{"nacute", 0x0144}, +{"nadeva", 0x0928}, +{"nagujarati", 0x0AA8}, +{"nagurmukhi", 0x0A28}, +{"nahiragana", 0x306A}, +{"nakatakana", 0x30CA}, +{"nakatakanahalfwidth", 0xFF85}, +{"napostrophe", 0x0149}, +{"nasquare", 0x3381}, +{"nbopomofo", 0x310B}, +{"nbspace", 0x00A0}, +{"ncaron", 0x0148}, +{"ncedilla", 0x0146}, +{"ncircle", 0x24DD}, +{"ncircumflexbelow", 0x1E4B}, +{"ncommaaccent", 0x0146}, +{"ndotaccent", 0x1E45}, +{"ndotbelow", 0x1E47}, +{"nehiragana", 0x306D}, +{"nekatakana", 0x30CD}, +{"nekatakanahalfwidth", 0xFF88}, +{"newsheqelsign", 0x20AA}, +{"nfsquare", 0x338B}, +{"ngabengali", 0x0999}, +{"ngadeva", 0x0919}, +{"ngagujarati", 0x0A99}, +{"ngagurmukhi", 0x0A19}, +{"ngonguthai", 0x0E07}, +{"nhiragana", 0x3093}, +{"nhookleft", 0x0272}, +{"nhookretroflex", 0x0273}, +{"nieunacirclekorean", 0x326F}, +{"nieunaparenkorean", 0x320F}, +{"nieuncieuckorean", 0x3135}, +{"nieuncirclekorean", 0x3261}, +{"nieunhieuhkorean", 0x3136}, +{"nieunkorean", 0x3134}, +{"nieunpansioskorean", 0x3168}, +{"nieunparenkorean", 0x3201}, +{"nieunsioskorean", 0x3167}, +{"nieuntikeutkorean", 0x3166}, +{"nihiragana", 0x306B}, +{"nikatakana", 0x30CB}, +{"nikatakanahalfwidth", 0xFF86}, +{"nikhahitleftthai", 0xF899}, +{"nikhahitthai", 0x0E4D}, +{"nine", 0x0039}, +{"ninearabic", 0x0669}, +{"ninebengali", 0x09EF}, +{"ninecircle", 0x2468}, +{"ninecircleinversesansserif", 0x2792}, +{"ninedeva", 0x096F}, +{"ninegujarati", 0x0AEF}, +{"ninegurmukhi", 0x0A6F}, +{"ninehackarabic", 0x0669}, +{"ninehangzhou", 0x3029}, +{"nineideographicparen", 0x3228}, +{"nineinferior", 0x2089}, +{"ninemonospace", 0xFF19}, +{"nineoldstyle", 0xF739}, +{"nineparen", 0x247C}, +{"nineperiod", 0x2490}, +{"ninepersian", 0x06F9}, +{"nineroman", 0x2178}, +{"ninesuperior", 0x2079}, +{"nineteencircle", 0x2472}, +{"nineteenparen", 0x2486}, +{"nineteenperiod", 0x249A}, +{"ninethai", 0x0E59}, +{"nj", 0x01CC}, +{"njecyrillic", 0x045A}, +{"nkatakana", 0x30F3}, +{"nkatakanahalfwidth", 0xFF9D}, +{"nlegrightlong", 0x019E}, +{"nlinebelow", 0x1E49}, +{"nmonospace", 0xFF4E}, +{"nmsquare", 0x339A}, +{"nnabengali", 0x09A3}, +{"nnadeva", 0x0923}, +{"nnagujarati", 0x0AA3}, +{"nnagurmukhi", 0x0A23}, +{"nnnadeva", 0x0929}, +{"nohiragana", 0x306E}, +{"nokatakana", 0x30CE}, +{"nokatakanahalfwidth", 0xFF89}, +{"nonbreakingspace", 0x00A0}, +{"nonenthai", 0x0E13}, +{"nonuthai", 0x0E19}, +{"noonarabic", 0x0646}, +{"noonfinalarabic", 0xFEE6}, +{"noonghunnaarabic", 0x06BA}, +{"noonghunnafinalarabic", 0xFB9F}, +{"nooninitialarabic", 0xFEE7}, +{"noonjeeminitialarabic", 0xFCD2}, +{"noonjeemisolatedarabic", 0xFC4B}, +{"noonmedialarabic", 0xFEE8}, +{"noonmeeminitialarabic", 0xFCD5}, +{"noonmeemisolatedarabic", 0xFC4E}, +{"noonnoonfinalarabic", 0xFC8D}, +{"notcontains", 0x220C}, +{"notelement", 0x2209}, +{"notelementof", 0x2209}, +{"notequal", 0x2260}, +{"notgreater", 0x226F}, +{"notgreaternorequal", 0x2271}, +{"notgreaternorless", 0x2279}, +{"notidentical", 0x2262}, +{"notless", 0x226E}, +{"notlessnorequal", 0x2270}, +{"notparallel", 0x2226}, +{"notprecedes", 0x2280}, +{"notsubset", 0x2284}, +{"notsucceeds", 0x2281}, +{"notsuperset", 0x2285}, +{"nowarmenian", 0x0576}, +{"nparen", 0x24A9}, +{"nssquare", 0x33B1}, +{"nsuperior", 0x207F}, +{"ntilde", 0x00F1}, +{"nu", 0x03BD}, +{"nuhiragana", 0x306C}, +{"nukatakana", 0x30CC}, +{"nukatakanahalfwidth", 0xFF87}, +{"nuktabengali", 0x09BC}, +{"nuktadeva", 0x093C}, +{"nuktagujarati", 0x0ABC}, +{"nuktagurmukhi", 0x0A3C}, +{"numbersign", 0x0023}, +{"numbersignmonospace", 0xFF03}, +{"numbersignsmall", 0xFE5F}, +{"numeralsigngreek", 0x0374}, +{"numeralsignlowergreek", 0x0375}, +{"numero", 0x2116}, +{"nun", 0x05E0}, +{"nundagesh", 0xFB40}, +{"nundageshhebrew", 0xFB40}, +{"nunhebrew", 0x05E0}, +{"nvsquare", 0x33B5}, +{"nwsquare", 0x33BB}, +{"nyabengali", 0x099E}, +{"nyadeva", 0x091E}, +{"nyagujarati", 0x0A9E}, +{"nyagurmukhi", 0x0A1E}, +{"o", 0x006F}, +{"oacute", 0x00F3}, +{"oangthai", 0x0E2D}, +{"obarred", 0x0275}, +{"obarredcyrillic", 0x04E9}, +{"obarreddieresiscyrillic", 0x04EB}, +{"obengali", 0x0993}, +{"obopomofo", 0x311B}, +{"obreve", 0x014F}, +{"ocandradeva", 0x0911}, +{"ocandragujarati", 0x0A91}, +{"ocandravowelsigndeva", 0x0949}, +{"ocandravowelsigngujarati", 0x0AC9}, +{"ocaron", 0x01D2}, +{"ocircle", 0x24DE}, +{"ocircumflex", 0x00F4}, +{"ocircumflexacute", 0x1ED1}, +{"ocircumflexdotbelow", 0x1ED9}, +{"ocircumflexgrave", 0x1ED3}, +{"ocircumflexhookabove", 0x1ED5}, +{"ocircumflextilde", 0x1ED7}, +{"ocyrillic", 0x043E}, +{"odblacute", 0x0151}, +{"odblgrave", 0x020D}, +{"odeva", 0x0913}, +{"odieresis", 0x00F6}, +{"odieresiscyrillic", 0x04E7}, +{"odotbelow", 0x1ECD}, +{"oe", 0x0153}, +{"oekorean", 0x315A}, +{"ogonek", 0x02DB}, +{"ogonekcmb", 0x0328}, +{"ograve", 0x00F2}, +{"ogujarati", 0x0A93}, +{"oharmenian", 0x0585}, +{"ohiragana", 0x304A}, +{"ohookabove", 0x1ECF}, +{"ohorn", 0x01A1}, +{"ohornacute", 0x1EDB}, +{"ohorndotbelow", 0x1EE3}, +{"ohorngrave", 0x1EDD}, +{"ohornhookabove", 0x1EDF}, +{"ohorntilde", 0x1EE1}, +{"ohungarumlaut", 0x0151}, +{"oi", 0x01A3}, +{"oinvertedbreve", 0x020F}, +{"okatakana", 0x30AA}, +{"okatakanahalfwidth", 0xFF75}, +{"okorean", 0x3157}, +{"olehebrew", 0x05AB}, +{"omacron", 0x014D}, +{"omacronacute", 0x1E53}, +{"omacrongrave", 0x1E51}, +{"omdeva", 0x0950}, +{"omega", 0x03C9}, +{"omega1", 0x03D6}, +{"omegacyrillic", 0x0461}, +{"omegalatinclosed", 0x0277}, +{"omegaroundcyrillic", 0x047B}, +{"omegatitlocyrillic", 0x047D}, +{"omegatonos", 0x03CE}, +{"omgujarati", 0x0AD0}, +{"omicron", 0x03BF}, +{"omicrontonos", 0x03CC}, +{"omonospace", 0xFF4F}, +{"one", 0x0031}, +{"onearabic", 0x0661}, +{"onebengali", 0x09E7}, +{"onecircle", 0x2460}, +{"onecircleinversesansserif", 0x278A}, +{"onedeva", 0x0967}, +{"onedotenleader", 0x2024}, +{"oneeighth", 0x215B}, +{"onefitted", 0xF6DC}, +{"onegujarati", 0x0AE7}, +{"onegurmukhi", 0x0A67}, +{"onehackarabic", 0x0661}, +{"onehalf", 0x00BD}, +{"onehangzhou", 0x3021}, +{"oneideographicparen", 0x3220}, +{"oneinferior", 0x2081}, +{"onemonospace", 0xFF11}, +{"onenumeratorbengali", 0x09F4}, +{"oneoldstyle", 0xF731}, +{"oneparen", 0x2474}, +{"oneperiod", 0x2488}, +{"onepersian", 0x06F1}, +{"onequarter", 0x00BC}, +{"oneroman", 0x2170}, +{"onesuperior", 0x00B9}, +{"onethai", 0x0E51}, +{"onethird", 0x2153}, +{"oogonek", 0x01EB}, +{"oogonekmacron", 0x01ED}, +{"oogurmukhi", 0x0A13}, +{"oomatragurmukhi", 0x0A4B}, +{"oopen", 0x0254}, +{"oparen", 0x24AA}, +{"openbullet", 0x25E6}, +{"option", 0x2325}, +{"ordfeminine", 0x00AA}, +{"ordmasculine", 0x00BA}, +{"orthogonal", 0x221F}, +{"oshortdeva", 0x0912}, +{"oshortvowelsigndeva", 0x094A}, +{"oslash", 0x00F8}, +{"oslashacute", 0x01FF}, +{"osmallhiragana", 0x3049}, +{"osmallkatakana", 0x30A9}, +{"osmallkatakanahalfwidth", 0xFF6B}, +{"ostrokeacute", 0x01FF}, +{"osuperior", 0xF6F0}, +{"otcyrillic", 0x047F}, +{"otilde", 0x00F5}, +{"otildeacute", 0x1E4D}, +{"otildedieresis", 0x1E4F}, +{"oubopomofo", 0x3121}, +{"overline", 0x203E}, +{"overlinecenterline", 0xFE4A}, +{"overlinecmb", 0x0305}, +{"overlinedashed", 0xFE49}, +{"overlinedblwavy", 0xFE4C}, +{"overlinewavy", 0xFE4B}, +{"overscore", 0x00AF}, +{"ovowelsignbengali", 0x09CB}, +{"ovowelsigndeva", 0x094B}, +{"ovowelsigngujarati", 0x0ACB}, +{"p", 0x0070}, +{"paampssquare", 0x3380}, +{"paasentosquare", 0x332B}, +{"pabengali", 0x09AA}, +{"pacute", 0x1E55}, +{"padeva", 0x092A}, +{"pagedown", 0x21DF}, +{"pageup", 0x21DE}, +{"pagujarati", 0x0AAA}, +{"pagurmukhi", 0x0A2A}, +{"pahiragana", 0x3071}, +{"paiyannoithai", 0x0E2F}, +{"pakatakana", 0x30D1}, +{"palatalizationcyrilliccmb", 0x0484}, +{"palochkacyrillic", 0x04C0}, +{"pansioskorean", 0x317F}, +{"paragraph", 0x00B6}, +{"parallel", 0x2225}, +{"parenleft", 0x0028}, +{"parenleftaltonearabic", 0xFD3E}, +{"parenleftbt", 0xF8ED}, +{"parenleftex", 0xF8EC}, +{"parenleftinferior", 0x208D}, +{"parenleftmonospace", 0xFF08}, +{"parenleftsmall", 0xFE59}, +{"parenleftsuperior", 0x207D}, +{"parenlefttp", 0xF8EB}, +{"parenleftvertical", 0xFE35}, +{"parenright", 0x0029}, +{"parenrightaltonearabic", 0xFD3F}, +{"parenrightbt", 0xF8F8}, +{"parenrightex", 0xF8F7}, +{"parenrightinferior", 0x208E}, +{"parenrightmonospace", 0xFF09}, +{"parenrightsmall", 0xFE5A}, +{"parenrightsuperior", 0x207E}, +{"parenrighttp", 0xF8F6}, +{"parenrightvertical", 0xFE36}, +{"partialdiff", 0x2202}, +{"paseqhebrew", 0x05C0}, +{"pashtahebrew", 0x0599}, +{"pasquare", 0x33A9}, +{"patah", 0x05B7}, +{"patah11", 0x05B7}, +{"patah1d", 0x05B7}, +{"patah2a", 0x05B7}, +{"patahhebrew", 0x05B7}, +{"patahnarrowhebrew", 0x05B7}, +{"patahquarterhebrew", 0x05B7}, +{"patahwidehebrew", 0x05B7}, +{"pazerhebrew", 0x05A1}, +{"pbopomofo", 0x3106}, +{"pcircle", 0x24DF}, +{"pdotaccent", 0x1E57}, +{"pe", 0x05E4}, +{"pecyrillic", 0x043F}, +{"pedagesh", 0xFB44}, +{"pedageshhebrew", 0xFB44}, +{"peezisquare", 0x333B}, +{"pefinaldageshhebrew", 0xFB43}, +{"peharabic", 0x067E}, +{"peharmenian", 0x057A}, +{"pehebrew", 0x05E4}, +{"pehfinalarabic", 0xFB57}, +{"pehinitialarabic", 0xFB58}, +{"pehiragana", 0x307A}, +{"pehmedialarabic", 0xFB59}, +{"pekatakana", 0x30DA}, +{"pemiddlehookcyrillic", 0x04A7}, +{"perafehebrew", 0xFB4E}, +{"percent", 0x0025}, +{"percentarabic", 0x066A}, +{"percentmonospace", 0xFF05}, +{"percentsmall", 0xFE6A}, +{"period", 0x002E}, +{"periodarmenian", 0x0589}, +{"periodcentered", 0x00B7}, +{"periodhalfwidth", 0xFF61}, +{"periodinferior", 0xF6E7}, +{"periodmonospace", 0xFF0E}, +{"periodsmall", 0xFE52}, +{"periodsuperior", 0xF6E8}, +{"perispomenigreekcmb", 0x0342}, +{"perpendicular", 0x22A5}, +{"perthousand", 0x2030}, +{"peseta", 0x20A7}, +{"pfsquare", 0x338A}, +{"phabengali", 0x09AB}, +{"phadeva", 0x092B}, +{"phagujarati", 0x0AAB}, +{"phagurmukhi", 0x0A2B}, +{"phi", 0x03C6}, +{"phi1", 0x03D5}, +{"phieuphacirclekorean", 0x327A}, +{"phieuphaparenkorean", 0x321A}, +{"phieuphcirclekorean", 0x326C}, +{"phieuphkorean", 0x314D}, +{"phieuphparenkorean", 0x320C}, +{"philatin", 0x0278}, +{"phinthuthai", 0x0E3A}, +{"phisymbolgreek", 0x03D5}, +{"phook", 0x01A5}, +{"phophanthai", 0x0E1E}, +{"phophungthai", 0x0E1C}, +{"phosamphaothai", 0x0E20}, +{"pi", 0x03C0}, +{"pieupacirclekorean", 0x3273}, +{"pieupaparenkorean", 0x3213}, +{"pieupcieuckorean", 0x3176}, +{"pieupcirclekorean", 0x3265}, +{"pieupkiyeokkorean", 0x3172}, +{"pieupkorean", 0x3142}, +{"pieupparenkorean", 0x3205}, +{"pieupsioskiyeokkorean", 0x3174}, +{"pieupsioskorean", 0x3144}, +{"pieupsiostikeutkorean", 0x3175}, +{"pieupthieuthkorean", 0x3177}, +{"pieuptikeutkorean", 0x3173}, +{"pihiragana", 0x3074}, +{"pikatakana", 0x30D4}, +{"pisymbolgreek", 0x03D6}, +{"piwrarmenian", 0x0583}, +{"plus", 0x002B}, +{"plusbelowcmb", 0x031F}, +{"pluscircle", 0x2295}, +{"plusminus", 0x00B1}, +{"plusmod", 0x02D6}, +{"plusmonospace", 0xFF0B}, +{"plussmall", 0xFE62}, +{"plussuperior", 0x207A}, +{"pmonospace", 0xFF50}, +{"pmsquare", 0x33D8}, +{"pohiragana", 0x307D}, +{"pointingindexdownwhite", 0x261F}, +{"pointingindexleftwhite", 0x261C}, +{"pointingindexrightwhite", 0x261E}, +{"pointingindexupwhite", 0x261D}, +{"pokatakana", 0x30DD}, +{"poplathai", 0x0E1B}, +{"postalmark", 0x3012}, +{"postalmarkface", 0x3020}, +{"pparen", 0x24AB}, +{"precedes", 0x227A}, +{"prescription", 0x211E}, +{"primemod", 0x02B9}, +{"primereversed", 0x2035}, +{"product", 0x220F}, +{"projective", 0x2305}, +{"prolongedkana", 0x30FC}, +{"propellor", 0x2318}, +{"propersubset", 0x2282}, +{"propersuperset", 0x2283}, +{"proportion", 0x2237}, +{"proportional", 0x221D}, +{"psi", 0x03C8}, +{"psicyrillic", 0x0471}, +{"psilipneumatacyrilliccmb", 0x0486}, +{"pssquare", 0x33B0}, +{"puhiragana", 0x3077}, +{"pukatakana", 0x30D7}, +{"pvsquare", 0x33B4}, +{"pwsquare", 0x33BA}, +{"q", 0x0071}, +{"qadeva", 0x0958}, +{"qadmahebrew", 0x05A8}, +{"qafarabic", 0x0642}, +{"qaffinalarabic", 0xFED6}, +{"qafinitialarabic", 0xFED7}, +{"qafmedialarabic", 0xFED8}, +{"qamats", 0x05B8}, +{"qamats10", 0x05B8}, +{"qamats1a", 0x05B8}, +{"qamats1c", 0x05B8}, +{"qamats27", 0x05B8}, +{"qamats29", 0x05B8}, +{"qamats33", 0x05B8}, +{"qamatsde", 0x05B8}, +{"qamatshebrew", 0x05B8}, +{"qamatsnarrowhebrew", 0x05B8}, +{"qamatsqatanhebrew", 0x05B8}, +{"qamatsqatannarrowhebrew", 0x05B8}, +{"qamatsqatanquarterhebrew", 0x05B8}, +{"qamatsqatanwidehebrew", 0x05B8}, +{"qamatsquarterhebrew", 0x05B8}, +{"qamatswidehebrew", 0x05B8}, +{"qarneyparahebrew", 0x059F}, +{"qbopomofo", 0x3111}, +{"qcircle", 0x24E0}, +{"qhook", 0x02A0}, +{"qmonospace", 0xFF51}, +{"qof", 0x05E7}, +{"qofdagesh", 0xFB47}, +{"qofdageshhebrew", 0xFB47}, +{"qofhebrew", 0x05E7}, +{"qparen", 0x24AC}, +{"quarternote", 0x2669}, +{"qubuts", 0x05BB}, +{"qubuts18", 0x05BB}, +{"qubuts25", 0x05BB}, +{"qubuts31", 0x05BB}, +{"qubutshebrew", 0x05BB}, +{"qubutsnarrowhebrew", 0x05BB}, +{"qubutsquarterhebrew", 0x05BB}, +{"qubutswidehebrew", 0x05BB}, +{"question", 0x003F}, +{"questionarabic", 0x061F}, +{"questionarmenian", 0x055E}, +{"questiondown", 0x00BF}, +{"questiondownsmall", 0xF7BF}, +{"questiongreek", 0x037E}, +{"questionmonospace", 0xFF1F}, +{"questionsmall", 0xF73F}, +{"quotedbl", 0x0022}, +{"quotedblbase", 0x201E}, +{"quotedblleft", 0x201C}, +{"quotedblmonospace", 0xFF02}, +{"quotedblprime", 0x301E}, +{"quotedblprimereversed", 0x301D}, +{"quotedblright", 0x201D}, +{"quoteleft", 0x2018}, +{"quoteleftreversed", 0x201B}, +{"quotereversed", 0x201B}, +{"quoteright", 0x2019}, +{"quoterightn", 0x0149}, +{"quotesinglbase", 0x201A}, +{"quotesingle", 0x0027}, +{"quotesinglemonospace", 0xFF07}, +{"r", 0x0072}, +{"raarmenian", 0x057C}, +{"rabengali", 0x09B0}, +{"racute", 0x0155}, +{"radeva", 0x0930}, +{"radical", 0x221A}, +{"radicalex", 0xF8E5}, +{"radoverssquare", 0x33AE}, +{"radoverssquaredsquare", 0x33AF}, +{"radsquare", 0x33AD}, +{"rafe", 0x05BF}, +{"rafehebrew", 0x05BF}, +{"ragujarati", 0x0AB0}, +{"ragurmukhi", 0x0A30}, +{"rahiragana", 0x3089}, +{"rakatakana", 0x30E9}, +{"rakatakanahalfwidth", 0xFF97}, +{"ralowerdiagonalbengali", 0x09F1}, +{"ramiddlediagonalbengali", 0x09F0}, +{"ramshorn", 0x0264}, +{"ratio", 0x2236}, +{"rbopomofo", 0x3116}, +{"rcaron", 0x0159}, +{"rcedilla", 0x0157}, +{"rcircle", 0x24E1}, +{"rcommaaccent", 0x0157}, +{"rdblgrave", 0x0211}, +{"rdotaccent", 0x1E59}, +{"rdotbelow", 0x1E5B}, +{"rdotbelowmacron", 0x1E5D}, +{"referencemark", 0x203B}, +{"reflexsubset", 0x2286}, +{"reflexsuperset", 0x2287}, +{"registered", 0x00AE}, +{"registersans", 0xF8E8}, +{"registerserif", 0xF6DA}, +{"reharabic", 0x0631}, +{"reharmenian", 0x0580}, +{"rehfinalarabic", 0xFEAE}, +{"rehiragana", 0x308C}, +{"rekatakana", 0x30EC}, +{"rekatakanahalfwidth", 0xFF9A}, +{"resh", 0x05E8}, +{"reshdageshhebrew", 0xFB48}, +{"reshhebrew", 0x05E8}, +{"reversedtilde", 0x223D}, +{"reviahebrew", 0x0597}, +{"reviamugrashhebrew", 0x0597}, +{"revlogicalnot", 0x2310}, +{"rfishhook", 0x027E}, +{"rfishhookreversed", 0x027F}, +{"rhabengali", 0x09DD}, +{"rhadeva", 0x095D}, +{"rho", 0x03C1}, +{"rhook", 0x027D}, +{"rhookturned", 0x027B}, +{"rhookturnedsuperior", 0x02B5}, +{"rhosymbolgreek", 0x03F1}, +{"rhotichookmod", 0x02DE}, +{"rieulacirclekorean", 0x3271}, +{"rieulaparenkorean", 0x3211}, +{"rieulcirclekorean", 0x3263}, +{"rieulhieuhkorean", 0x3140}, +{"rieulkiyeokkorean", 0x313A}, +{"rieulkiyeoksioskorean", 0x3169}, +{"rieulkorean", 0x3139}, +{"rieulmieumkorean", 0x313B}, +{"rieulpansioskorean", 0x316C}, +{"rieulparenkorean", 0x3203}, +{"rieulphieuphkorean", 0x313F}, +{"rieulpieupkorean", 0x313C}, +{"rieulpieupsioskorean", 0x316B}, +{"rieulsioskorean", 0x313D}, +{"rieulthieuthkorean", 0x313E}, +{"rieultikeutkorean", 0x316A}, +{"rieulyeorinhieuhkorean", 0x316D}, +{"rightangle", 0x221F}, +{"righttackbelowcmb", 0x0319}, +{"righttriangle", 0x22BF}, +{"rihiragana", 0x308A}, +{"rikatakana", 0x30EA}, +{"rikatakanahalfwidth", 0xFF98}, +{"ring", 0x02DA}, +{"ringbelowcmb", 0x0325}, +{"ringcmb", 0x030A}, +{"ringhalfleft", 0x02BF}, +{"ringhalfleftarmenian", 0x0559}, +{"ringhalfleftbelowcmb", 0x031C}, +{"ringhalfleftcentered", 0x02D3}, +{"ringhalfright", 0x02BE}, +{"ringhalfrightbelowcmb", 0x0339}, +{"ringhalfrightcentered", 0x02D2}, +{"rinvertedbreve", 0x0213}, +{"rittorusquare", 0x3351}, +{"rlinebelow", 0x1E5F}, +{"rlongleg", 0x027C}, +{"rlonglegturned", 0x027A}, +{"rmonospace", 0xFF52}, +{"rohiragana", 0x308D}, +{"rokatakana", 0x30ED}, +{"rokatakanahalfwidth", 0xFF9B}, +{"roruathai", 0x0E23}, +{"rparen", 0x24AD}, +{"rrabengali", 0x09DC}, +{"rradeva", 0x0931}, +{"rragurmukhi", 0x0A5C}, +{"rreharabic", 0x0691}, +{"rrehfinalarabic", 0xFB8D}, +{"rrvocalicbengali", 0x09E0}, +{"rrvocalicdeva", 0x0960}, +{"rrvocalicgujarati", 0x0AE0}, +{"rrvocalicvowelsignbengali", 0x09C4}, +{"rrvocalicvowelsigndeva", 0x0944}, +{"rrvocalicvowelsigngujarati", 0x0AC4}, +{"rsuperior", 0xF6F1}, +{"rtblock", 0x2590}, +{"rturned", 0x0279}, +{"rturnedsuperior", 0x02B4}, +{"ruhiragana", 0x308B}, +{"rukatakana", 0x30EB}, +{"rukatakanahalfwidth", 0xFF99}, +{"rupeemarkbengali", 0x09F2}, +{"rupeesignbengali", 0x09F3}, +{"rupiah", 0xF6DD}, +{"ruthai", 0x0E24}, +{"rvocalicbengali", 0x098B}, +{"rvocalicdeva", 0x090B}, +{"rvocalicgujarati", 0x0A8B}, +{"rvocalicvowelsignbengali", 0x09C3}, +{"rvocalicvowelsigndeva", 0x0943}, +{"rvocalicvowelsigngujarati", 0x0AC3}, +{"s", 0x0073}, +{"sabengali", 0x09B8}, +{"sacute", 0x015B}, +{"sacutedotaccent", 0x1E65}, +{"sadarabic", 0x0635}, +{"sadeva", 0x0938}, +{"sadfinalarabic", 0xFEBA}, +{"sadinitialarabic", 0xFEBB}, +{"sadmedialarabic", 0xFEBC}, +{"sagujarati", 0x0AB8}, +{"sagurmukhi", 0x0A38}, +{"sahiragana", 0x3055}, +{"sakatakana", 0x30B5}, +{"sakatakanahalfwidth", 0xFF7B}, +{"sallallahoualayhewasallamarabic", 0xFDFA}, +{"samekh", 0x05E1}, +{"samekhdagesh", 0xFB41}, +{"samekhdageshhebrew", 0xFB41}, +{"samekhhebrew", 0x05E1}, +{"saraaathai", 0x0E32}, +{"saraaethai", 0x0E41}, +{"saraaimaimalaithai", 0x0E44}, +{"saraaimaimuanthai", 0x0E43}, +{"saraamthai", 0x0E33}, +{"saraathai", 0x0E30}, +{"saraethai", 0x0E40}, +{"saraiileftthai", 0xF886}, +{"saraiithai", 0x0E35}, +{"saraileftthai", 0xF885}, +{"saraithai", 0x0E34}, +{"saraothai", 0x0E42}, +{"saraueeleftthai", 0xF888}, +{"saraueethai", 0x0E37}, +{"saraueleftthai", 0xF887}, +{"sarauethai", 0x0E36}, +{"sarauthai", 0x0E38}, +{"sarauuthai", 0x0E39}, +{"sbopomofo", 0x3119}, +{"scaron", 0x0161}, +{"scarondotaccent", 0x1E67}, +{"scedilla", 0x015F}, +{"schwa", 0x0259}, +{"schwacyrillic", 0x04D9}, +{"schwadieresiscyrillic", 0x04DB}, +{"schwahook", 0x025A}, +{"scircle", 0x24E2}, +{"scircumflex", 0x015D}, +{"scommaaccent", 0x0219}, +{"sdotaccent", 0x1E61}, +{"sdotbelow", 0x1E63}, +{"sdotbelowdotaccent", 0x1E69}, +{"seagullbelowcmb", 0x033C}, +{"second", 0x2033}, +{"secondtonechinese", 0x02CA}, +{"section", 0x00A7}, +{"seenarabic", 0x0633}, +{"seenfinalarabic", 0xFEB2}, +{"seeninitialarabic", 0xFEB3}, +{"seenmedialarabic", 0xFEB4}, +{"segol", 0x05B6}, +{"segol13", 0x05B6}, +{"segol1f", 0x05B6}, +{"segol2c", 0x05B6}, +{"segolhebrew", 0x05B6}, +{"segolnarrowhebrew", 0x05B6}, +{"segolquarterhebrew", 0x05B6}, +{"segoltahebrew", 0x0592}, +{"segolwidehebrew", 0x05B6}, +{"seharmenian", 0x057D}, +{"sehiragana", 0x305B}, +{"sekatakana", 0x30BB}, +{"sekatakanahalfwidth", 0xFF7E}, +{"semicolon", 0x003B}, +{"semicolonarabic", 0x061B}, +{"semicolonmonospace", 0xFF1B}, +{"semicolonsmall", 0xFE54}, +{"semivoicedmarkkana", 0x309C}, +{"semivoicedmarkkanahalfwidth", 0xFF9F}, +{"sentisquare", 0x3322}, +{"sentosquare", 0x3323}, +{"seven", 0x0037}, +{"sevenarabic", 0x0667}, +{"sevenbengali", 0x09ED}, +{"sevencircle", 0x2466}, +{"sevencircleinversesansserif", 0x2790}, +{"sevendeva", 0x096D}, +{"seveneighths", 0x215E}, +{"sevengujarati", 0x0AED}, +{"sevengurmukhi", 0x0A6D}, +{"sevenhackarabic", 0x0667}, +{"sevenhangzhou", 0x3027}, +{"sevenideographicparen", 0x3226}, +{"seveninferior", 0x2087}, +{"sevenmonospace", 0xFF17}, +{"sevenoldstyle", 0xF737}, +{"sevenparen", 0x247A}, +{"sevenperiod", 0x248E}, +{"sevenpersian", 0x06F7}, +{"sevenroman", 0x2176}, +{"sevensuperior", 0x2077}, +{"seventeencircle", 0x2470}, +{"seventeenparen", 0x2484}, +{"seventeenperiod", 0x2498}, +{"seventhai", 0x0E57}, +{"sfthyphen", 0x00AD}, +{"shaarmenian", 0x0577}, +{"shabengali", 0x09B6}, +{"shacyrillic", 0x0448}, +{"shaddaarabic", 0x0651}, +{"shaddadammaarabic", 0xFC61}, +{"shaddadammatanarabic", 0xFC5E}, +{"shaddafathaarabic", 0xFC60}, +{"shaddakasraarabic", 0xFC62}, +{"shaddakasratanarabic", 0xFC5F}, +{"shade", 0x2592}, +{"shadedark", 0x2593}, +{"shadelight", 0x2591}, +{"shademedium", 0x2592}, +{"shadeva", 0x0936}, +{"shagujarati", 0x0AB6}, +{"shagurmukhi", 0x0A36}, +{"shalshelethebrew", 0x0593}, +{"shbopomofo", 0x3115}, +{"shchacyrillic", 0x0449}, +{"sheenarabic", 0x0634}, +{"sheenfinalarabic", 0xFEB6}, +{"sheeninitialarabic", 0xFEB7}, +{"sheenmedialarabic", 0xFEB8}, +{"sheicoptic", 0x03E3}, +{"sheqel", 0x20AA}, +{"sheqelhebrew", 0x20AA}, +{"sheva", 0x05B0}, +{"sheva115", 0x05B0}, +{"sheva15", 0x05B0}, +{"sheva22", 0x05B0}, +{"sheva2e", 0x05B0}, +{"shevahebrew", 0x05B0}, +{"shevanarrowhebrew", 0x05B0}, +{"shevaquarterhebrew", 0x05B0}, +{"shevawidehebrew", 0x05B0}, +{"shhacyrillic", 0x04BB}, +{"shimacoptic", 0x03ED}, +{"shin", 0x05E9}, +{"shindagesh", 0xFB49}, +{"shindageshhebrew", 0xFB49}, +{"shindageshshindot", 0xFB2C}, +{"shindageshshindothebrew", 0xFB2C}, +{"shindageshsindot", 0xFB2D}, +{"shindageshsindothebrew", 0xFB2D}, +{"shindothebrew", 0x05C1}, +{"shinhebrew", 0x05E9}, +{"shinshindot", 0xFB2A}, +{"shinshindothebrew", 0xFB2A}, +{"shinsindot", 0xFB2B}, +{"shinsindothebrew", 0xFB2B}, +{"shook", 0x0282}, +{"sigma", 0x03C3}, +{"sigma1", 0x03C2}, +{"sigmafinal", 0x03C2}, +{"sigmalunatesymbolgreek", 0x03F2}, +{"sihiragana", 0x3057}, +{"sikatakana", 0x30B7}, +{"sikatakanahalfwidth", 0xFF7C}, +{"siluqhebrew", 0x05BD}, +{"siluqlefthebrew", 0x05BD}, +{"similar", 0x223C}, +{"sindothebrew", 0x05C2}, +{"siosacirclekorean", 0x3274}, +{"siosaparenkorean", 0x3214}, +{"sioscieuckorean", 0x317E}, +{"sioscirclekorean", 0x3266}, +{"sioskiyeokkorean", 0x317A}, +{"sioskorean", 0x3145}, +{"siosnieunkorean", 0x317B}, +{"siosparenkorean", 0x3206}, +{"siospieupkorean", 0x317D}, +{"siostikeutkorean", 0x317C}, +{"six", 0x0036}, +{"sixarabic", 0x0666}, +{"sixbengali", 0x09EC}, +{"sixcircle", 0x2465}, +{"sixcircleinversesansserif", 0x278F}, +{"sixdeva", 0x096C}, +{"sixgujarati", 0x0AEC}, +{"sixgurmukhi", 0x0A6C}, +{"sixhackarabic", 0x0666}, +{"sixhangzhou", 0x3026}, +{"sixideographicparen", 0x3225}, +{"sixinferior", 0x2086}, +{"sixmonospace", 0xFF16}, +{"sixoldstyle", 0xF736}, +{"sixparen", 0x2479}, +{"sixperiod", 0x248D}, +{"sixpersian", 0x06F6}, +{"sixroman", 0x2175}, +{"sixsuperior", 0x2076}, +{"sixteencircle", 0x246F}, +{"sixteencurrencydenominatorbengali", 0x09F9}, +{"sixteenparen", 0x2483}, +{"sixteenperiod", 0x2497}, +{"sixthai", 0x0E56}, +{"slash", 0x002F}, +{"slashmonospace", 0xFF0F}, +{"slong", 0x017F}, +{"slongdotaccent", 0x1E9B}, +{"smileface", 0x263A}, +{"smonospace", 0xFF53}, +{"sofpasuqhebrew", 0x05C3}, +{"softhyphen", 0x00AD}, +{"softsigncyrillic", 0x044C}, +{"sohiragana", 0x305D}, +{"sokatakana", 0x30BD}, +{"sokatakanahalfwidth", 0xFF7F}, +{"soliduslongoverlaycmb", 0x0338}, +{"solidusshortoverlaycmb", 0x0337}, +{"sorusithai", 0x0E29}, +{"sosalathai", 0x0E28}, +{"sosothai", 0x0E0B}, +{"sosuathai", 0x0E2A}, +{"space", 0x0020}, +{"spacehackarabic", 0x0020}, +{"spade", 0x2660}, +{"spadesuitblack", 0x2660}, +{"spadesuitwhite", 0x2664}, +{"sparen", 0x24AE}, +{"squarebelowcmb", 0x033B}, +{"squarecc", 0x33C4}, +{"squarecm", 0x339D}, +{"squarediagonalcrosshatchfill", 0x25A9}, +{"squarehorizontalfill", 0x25A4}, +{"squarekg", 0x338F}, +{"squarekm", 0x339E}, +{"squarekmcapital", 0x33CE}, +{"squareln", 0x33D1}, +{"squarelog", 0x33D2}, +{"squaremg", 0x338E}, +{"squaremil", 0x33D5}, +{"squaremm", 0x339C}, +{"squaremsquared", 0x33A1}, +{"squareorthogonalcrosshatchfill", 0x25A6}, +{"squareupperlefttolowerrightfill", 0x25A7}, +{"squareupperrighttolowerleftfill", 0x25A8}, +{"squareverticalfill", 0x25A5}, +{"squarewhitewithsmallblack", 0x25A3}, +{"srsquare", 0x33DB}, +{"ssabengali", 0x09B7}, +{"ssadeva", 0x0937}, +{"ssagujarati", 0x0AB7}, +{"ssangcieuckorean", 0x3149}, +{"ssanghieuhkorean", 0x3185}, +{"ssangieungkorean", 0x3180}, +{"ssangkiyeokkorean", 0x3132}, +{"ssangnieunkorean", 0x3165}, +{"ssangpieupkorean", 0x3143}, +{"ssangsioskorean", 0x3146}, +{"ssangtikeutkorean", 0x3138}, +{"ssuperior", 0xF6F2}, +{"sterling", 0x00A3}, +{"sterlingmonospace", 0xFFE1}, +{"strokelongoverlaycmb", 0x0336}, +{"strokeshortoverlaycmb", 0x0335}, +{"subset", 0x2282}, +{"subsetnotequal", 0x228A}, +{"subsetorequal", 0x2286}, +{"succeeds", 0x227B}, +{"suchthat", 0x220B}, +{"suhiragana", 0x3059}, +{"sukatakana", 0x30B9}, +{"sukatakanahalfwidth", 0xFF7D}, +{"sukunarabic", 0x0652}, +{"summation", 0x2211}, +{"sun", 0x263C}, +{"superset", 0x2283}, +{"supersetnotequal", 0x228B}, +{"supersetorequal", 0x2287}, +{"svsquare", 0x33DC}, +{"syouwaerasquare", 0x337C}, +{"t", 0x0074}, +{"tabengali", 0x09A4}, +{"tackdown", 0x22A4}, +{"tackleft", 0x22A3}, +{"tadeva", 0x0924}, +{"tagujarati", 0x0AA4}, +{"tagurmukhi", 0x0A24}, +{"taharabic", 0x0637}, +{"tahfinalarabic", 0xFEC2}, +{"tahinitialarabic", 0xFEC3}, +{"tahiragana", 0x305F}, +{"tahmedialarabic", 0xFEC4}, +{"taisyouerasquare", 0x337D}, +{"takatakana", 0x30BF}, +{"takatakanahalfwidth", 0xFF80}, +{"tatweelarabic", 0x0640}, +{"tau", 0x03C4}, +{"tav", 0x05EA}, +{"tavdages", 0xFB4A}, +{"tavdagesh", 0xFB4A}, +{"tavdageshhebrew", 0xFB4A}, +{"tavhebrew", 0x05EA}, +{"tbar", 0x0167}, +{"tbopomofo", 0x310A}, +{"tcaron", 0x0165}, +{"tccurl", 0x02A8}, +{"tcedilla", 0x0163}, +{"tcheharabic", 0x0686}, +{"tchehfinalarabic", 0xFB7B}, +{"tchehinitialarabic", 0xFB7C}, +{"tchehmedialarabic", 0xFB7D}, +{"tcircle", 0x24E3}, +{"tcircumflexbelow", 0x1E71}, +{"tcommaaccent", 0x0163}, +{"tdieresis", 0x1E97}, +{"tdotaccent", 0x1E6B}, +{"tdotbelow", 0x1E6D}, +{"tecyrillic", 0x0442}, +{"tedescendercyrillic", 0x04AD}, +{"teharabic", 0x062A}, +{"tehfinalarabic", 0xFE96}, +{"tehhahinitialarabic", 0xFCA2}, +{"tehhahisolatedarabic", 0xFC0C}, +{"tehinitialarabic", 0xFE97}, +{"tehiragana", 0x3066}, +{"tehjeeminitialarabic", 0xFCA1}, +{"tehjeemisolatedarabic", 0xFC0B}, +{"tehmarbutaarabic", 0x0629}, +{"tehmarbutafinalarabic", 0xFE94}, +{"tehmedialarabic", 0xFE98}, +{"tehmeeminitialarabic", 0xFCA4}, +{"tehmeemisolatedarabic", 0xFC0E}, +{"tehnoonfinalarabic", 0xFC73}, +{"tekatakana", 0x30C6}, +{"tekatakanahalfwidth", 0xFF83}, +{"telephone", 0x2121}, +{"telephoneblack", 0x260E}, +{"telishagedolahebrew", 0x05A0}, +{"telishaqetanahebrew", 0x05A9}, +{"tencircle", 0x2469}, +{"tenideographicparen", 0x3229}, +{"tenparen", 0x247D}, +{"tenperiod", 0x2491}, +{"tenroman", 0x2179}, +{"tesh", 0x02A7}, +{"tet", 0x05D8}, +{"tetdagesh", 0xFB38}, +{"tetdageshhebrew", 0xFB38}, +{"tethebrew", 0x05D8}, +{"tetsecyrillic", 0x04B5}, +{"tevirhebrew", 0x059B}, +{"tevirlefthebrew", 0x059B}, +{"thabengali", 0x09A5}, +{"thadeva", 0x0925}, +{"thagujarati", 0x0AA5}, +{"thagurmukhi", 0x0A25}, +{"thalarabic", 0x0630}, +{"thalfinalarabic", 0xFEAC}, +{"thanthakhatlowleftthai", 0xF898}, +{"thanthakhatlowrightthai", 0xF897}, +{"thanthakhatthai", 0x0E4C}, +{"thanthakhatupperleftthai", 0xF896}, +{"theharabic", 0x062B}, +{"thehfinalarabic", 0xFE9A}, +{"thehinitialarabic", 0xFE9B}, +{"thehmedialarabic", 0xFE9C}, +{"thereexists", 0x2203}, +{"therefore", 0x2234}, +{"theta", 0x03B8}, +{"theta1", 0x03D1}, +{"thetasymbolgreek", 0x03D1}, +{"thieuthacirclekorean", 0x3279}, +{"thieuthaparenkorean", 0x3219}, +{"thieuthcirclekorean", 0x326B}, +{"thieuthkorean", 0x314C}, +{"thieuthparenkorean", 0x320B}, +{"thirteencircle", 0x246C}, +{"thirteenparen", 0x2480}, +{"thirteenperiod", 0x2494}, +{"thonangmonthothai", 0x0E11}, +{"thook", 0x01AD}, +{"thophuthaothai", 0x0E12}, +{"thorn", 0x00FE}, +{"thothahanthai", 0x0E17}, +{"thothanthai", 0x0E10}, +{"thothongthai", 0x0E18}, +{"thothungthai", 0x0E16}, +{"thousandcyrillic", 0x0482}, +{"thousandsseparatorarabic", 0x066C}, +{"thousandsseparatorpersian", 0x066C}, +{"three", 0x0033}, +{"threearabic", 0x0663}, +{"threebengali", 0x09E9}, +{"threecircle", 0x2462}, +{"threecircleinversesansserif", 0x278C}, +{"threedeva", 0x0969}, +{"threeeighths", 0x215C}, +{"threegujarati", 0x0AE9}, +{"threegurmukhi", 0x0A69}, +{"threehackarabic", 0x0663}, +{"threehangzhou", 0x3023}, +{"threeideographicparen", 0x3222}, +{"threeinferior", 0x2083}, +{"threemonospace", 0xFF13}, +{"threenumeratorbengali", 0x09F6}, +{"threeoldstyle", 0xF733}, +{"threeparen", 0x2476}, +{"threeperiod", 0x248A}, +{"threepersian", 0x06F3}, +{"threequarters", 0x00BE}, +{"threequartersemdash", 0xF6DE}, +{"threeroman", 0x2172}, +{"threesuperior", 0x00B3}, +{"threethai", 0x0E53}, +{"thzsquare", 0x3394}, +{"tihiragana", 0x3061}, +{"tikatakana", 0x30C1}, +{"tikatakanahalfwidth", 0xFF81}, +{"tikeutacirclekorean", 0x3270}, +{"tikeutaparenkorean", 0x3210}, +{"tikeutcirclekorean", 0x3262}, +{"tikeutkorean", 0x3137}, +{"tikeutparenkorean", 0x3202}, +{"tilde", 0x02DC}, +{"tildebelowcmb", 0x0330}, +{"tildecmb", 0x0303}, +{"tildecomb", 0x0303}, +{"tildedoublecmb", 0x0360}, +{"tildeoperator", 0x223C}, +{"tildeoverlaycmb", 0x0334}, +{"tildeverticalcmb", 0x033E}, +{"timescircle", 0x2297}, +{"tipehahebrew", 0x0596}, +{"tipehalefthebrew", 0x0596}, +{"tippigurmukhi", 0x0A70}, +{"titlocyrilliccmb", 0x0483}, +{"tiwnarmenian", 0x057F}, +{"tlinebelow", 0x1E6F}, +{"tmonospace", 0xFF54}, +{"toarmenian", 0x0569}, +{"tohiragana", 0x3068}, +{"tokatakana", 0x30C8}, +{"tokatakanahalfwidth", 0xFF84}, +{"tonebarextrahighmod", 0x02E5}, +{"tonebarextralowmod", 0x02E9}, +{"tonebarhighmod", 0x02E6}, +{"tonebarlowmod", 0x02E8}, +{"tonebarmidmod", 0x02E7}, +{"tonefive", 0x01BD}, +{"tonesix", 0x0185}, +{"tonetwo", 0x01A8}, +{"tonos", 0x0384}, +{"tonsquare", 0x3327}, +{"topatakthai", 0x0E0F}, +{"tortoiseshellbracketleft", 0x3014}, +{"tortoiseshellbracketleftsmall", 0xFE5D}, +{"tortoiseshellbracketleftvertical", 0xFE39}, +{"tortoiseshellbracketright", 0x3015}, +{"tortoiseshellbracketrightsmall", 0xFE5E}, +{"tortoiseshellbracketrightvertical", 0xFE3A}, +{"totaothai", 0x0E15}, +{"tpalatalhook", 0x01AB}, +{"tparen", 0x24AF}, +{"trademark", 0x2122}, +{"trademarksans", 0xF8EA}, +{"trademarkserif", 0xF6DB}, +{"tretroflexhook", 0x0288}, +{"triagdn", 0x25BC}, +{"triaglf", 0x25C4}, +{"triagrt", 0x25BA}, +{"triagup", 0x25B2}, +{"ts", 0x02A6}, +{"tsadi", 0x05E6}, +{"tsadidagesh", 0xFB46}, +{"tsadidageshhebrew", 0xFB46}, +{"tsadihebrew", 0x05E6}, +{"tsecyrillic", 0x0446}, +{"tsere", 0x05B5}, +{"tsere12", 0x05B5}, +{"tsere1e", 0x05B5}, +{"tsere2b", 0x05B5}, +{"tserehebrew", 0x05B5}, +{"tserenarrowhebrew", 0x05B5}, +{"tserequarterhebrew", 0x05B5}, +{"tserewidehebrew", 0x05B5}, +{"tshecyrillic", 0x045B}, +{"tsuperior", 0xF6F3}, +{"ttabengali", 0x099F}, +{"ttadeva", 0x091F}, +{"ttagujarati", 0x0A9F}, +{"ttagurmukhi", 0x0A1F}, +{"tteharabic", 0x0679}, +{"ttehfinalarabic", 0xFB67}, +{"ttehinitialarabic", 0xFB68}, +{"ttehmedialarabic", 0xFB69}, +{"tthabengali", 0x09A0}, +{"tthadeva", 0x0920}, +{"tthagujarati", 0x0AA0}, +{"tthagurmukhi", 0x0A20}, +{"tturned", 0x0287}, +{"tuhiragana", 0x3064}, +{"tukatakana", 0x30C4}, +{"tukatakanahalfwidth", 0xFF82}, +{"tusmallhiragana", 0x3063}, +{"tusmallkatakana", 0x30C3}, +{"tusmallkatakanahalfwidth", 0xFF6F}, +{"twelvecircle", 0x246B}, +{"twelveparen", 0x247F}, +{"twelveperiod", 0x2493}, +{"twelveroman", 0x217B}, +{"twentycircle", 0x2473}, +{"twentyhangzhou", 0x5344}, +{"twentyparen", 0x2487}, +{"twentyperiod", 0x249B}, +{"two", 0x0032}, +{"twoarabic", 0x0662}, +{"twobengali", 0x09E8}, +{"twocircle", 0x2461}, +{"twocircleinversesansserif", 0x278B}, +{"twodeva", 0x0968}, +{"twodotenleader", 0x2025}, +{"twodotleader", 0x2025}, +{"twodotleadervertical", 0xFE30}, +{"twogujarati", 0x0AE8}, +{"twogurmukhi", 0x0A68}, +{"twohackarabic", 0x0662}, +{"twohangzhou", 0x3022}, +{"twoideographicparen", 0x3221}, +{"twoinferior", 0x2082}, +{"twomonospace", 0xFF12}, +{"twonumeratorbengali", 0x09F5}, +{"twooldstyle", 0xF732}, +{"twoparen", 0x2475}, +{"twoperiod", 0x2489}, +{"twopersian", 0x06F2}, +{"tworoman", 0x2171}, +{"twostroke", 0x01BB}, +{"twosuperior", 0x00B2}, +{"twothai", 0x0E52}, +{"twothirds", 0x2154}, +{"u", 0x0075}, +{"uacute", 0x00FA}, +{"ubar", 0x0289}, +{"ubengali", 0x0989}, +{"ubopomofo", 0x3128}, +{"ubreve", 0x016D}, +{"ucaron", 0x01D4}, +{"ucircle", 0x24E4}, +{"ucircumflex", 0x00FB}, +{"ucircumflexbelow", 0x1E77}, +{"ucyrillic", 0x0443}, +{"udattadeva", 0x0951}, +{"udblacute", 0x0171}, +{"udblgrave", 0x0215}, +{"udeva", 0x0909}, +{"udieresis", 0x00FC}, +{"udieresisacute", 0x01D8}, +{"udieresisbelow", 0x1E73}, +{"udieresiscaron", 0x01DA}, +{"udieresiscyrillic", 0x04F1}, +{"udieresisgrave", 0x01DC}, +{"udieresismacron", 0x01D6}, +{"udotbelow", 0x1EE5}, +{"ugrave", 0x00F9}, +{"ugujarati", 0x0A89}, +{"ugurmukhi", 0x0A09}, +{"uhiragana", 0x3046}, +{"uhookabove", 0x1EE7}, +{"uhorn", 0x01B0}, +{"uhornacute", 0x1EE9}, +{"uhorndotbelow", 0x1EF1}, +{"uhorngrave", 0x1EEB}, +{"uhornhookabove", 0x1EED}, +{"uhorntilde", 0x1EEF}, +{"uhungarumlaut", 0x0171}, +{"uhungarumlautcyrillic", 0x04F3}, +{"uinvertedbreve", 0x0217}, +{"ukatakana", 0x30A6}, +{"ukatakanahalfwidth", 0xFF73}, +{"ukcyrillic", 0x0479}, +{"ukorean", 0x315C}, +{"umacron", 0x016B}, +{"umacroncyrillic", 0x04EF}, +{"umacrondieresis", 0x1E7B}, +{"umatragurmukhi", 0x0A41}, +{"umonospace", 0xFF55}, +{"underscore", 0x005F}, +{"underscoredbl", 0x2017}, +{"underscoremonospace", 0xFF3F}, +{"underscorevertical", 0xFE33}, +{"underscorewavy", 0xFE4F}, +{"union", 0x222A}, +{"universal", 0x2200}, +{"uogonek", 0x0173}, +{"uparen", 0x24B0}, +{"upblock", 0x2580}, +{"upperdothebrew", 0x05C4}, +{"upsilon", 0x03C5}, +{"upsilondieresis", 0x03CB}, +{"upsilondieresistonos", 0x03B0}, +{"upsilonlatin", 0x028A}, +{"upsilontonos", 0x03CD}, +{"uptackbelowcmb", 0x031D}, +{"uptackmod", 0x02D4}, +{"uragurmukhi", 0x0A73}, +{"uring", 0x016F}, +{"ushortcyrillic", 0x045E}, +{"usmallhiragana", 0x3045}, +{"usmallkatakana", 0x30A5}, +{"usmallkatakanahalfwidth", 0xFF69}, +{"ustraightcyrillic", 0x04AF}, +{"ustraightstrokecyrillic", 0x04B1}, +{"utilde", 0x0169}, +{"utildeacute", 0x1E79}, +{"utildebelow", 0x1E75}, +{"uubengali", 0x098A}, +{"uudeva", 0x090A}, +{"uugujarati", 0x0A8A}, +{"uugurmukhi", 0x0A0A}, +{"uumatragurmukhi", 0x0A42}, +{"uuvowelsignbengali", 0x09C2}, +{"uuvowelsigndeva", 0x0942}, +{"uuvowelsigngujarati", 0x0AC2}, +{"uvowelsignbengali", 0x09C1}, +{"uvowelsigndeva", 0x0941}, +{"uvowelsigngujarati", 0x0AC1}, +{"v", 0x0076}, +{"vadeva", 0x0935}, +{"vagujarati", 0x0AB5}, +{"vagurmukhi", 0x0A35}, +{"vakatakana", 0x30F7}, +{"vav", 0x05D5}, +{"vavdagesh", 0xFB35}, +{"vavdagesh65", 0xFB35}, +{"vavdageshhebrew", 0xFB35}, +{"vavhebrew", 0x05D5}, +{"vavholam", 0xFB4B}, +{"vavholamhebrew", 0xFB4B}, +{"vavvavhebrew", 0x05F0}, +{"vavyodhebrew", 0x05F1}, +{"vcircle", 0x24E5}, +{"vdotbelow", 0x1E7F}, +{"vecyrillic", 0x0432}, +{"veharabic", 0x06A4}, +{"vehfinalarabic", 0xFB6B}, +{"vehinitialarabic", 0xFB6C}, +{"vehmedialarabic", 0xFB6D}, +{"vekatakana", 0x30F9}, +{"venus", 0x2640}, +{"verticalbar", 0x007C}, +{"verticallineabovecmb", 0x030D}, +{"verticallinebelowcmb", 0x0329}, +{"verticallinelowmod", 0x02CC}, +{"verticallinemod", 0x02C8}, +{"vewarmenian", 0x057E}, +{"vhook", 0x028B}, +{"vikatakana", 0x30F8}, +{"viramabengali", 0x09CD}, +{"viramadeva", 0x094D}, +{"viramagujarati", 0x0ACD}, +{"visargabengali", 0x0983}, +{"visargadeva", 0x0903}, +{"visargagujarati", 0x0A83}, +{"vmonospace", 0xFF56}, +{"voarmenian", 0x0578}, +{"voicediterationhiragana", 0x309E}, +{"voicediterationkatakana", 0x30FE}, +{"voicedmarkkana", 0x309B}, +{"voicedmarkkanahalfwidth", 0xFF9E}, +{"vokatakana", 0x30FA}, +{"vparen", 0x24B1}, +{"vtilde", 0x1E7D}, +{"vturned", 0x028C}, +{"vuhiragana", 0x3094}, +{"vukatakana", 0x30F4}, +{"w", 0x0077}, +{"wacute", 0x1E83}, +{"waekorean", 0x3159}, +{"wahiragana", 0x308F}, +{"wakatakana", 0x30EF}, +{"wakatakanahalfwidth", 0xFF9C}, +{"wakorean", 0x3158}, +{"wasmallhiragana", 0x308E}, +{"wasmallkatakana", 0x30EE}, +{"wattosquare", 0x3357}, +{"wavedash", 0x301C}, +{"wavyunderscorevertical", 0xFE34}, +{"wawarabic", 0x0648}, +{"wawfinalarabic", 0xFEEE}, +{"wawhamzaabovearabic", 0x0624}, +{"wawhamzaabovefinalarabic", 0xFE86}, +{"wbsquare", 0x33DD}, +{"wcircle", 0x24E6}, +{"wcircumflex", 0x0175}, +{"wdieresis", 0x1E85}, +{"wdotaccent", 0x1E87}, +{"wdotbelow", 0x1E89}, +{"wehiragana", 0x3091}, +{"weierstrass", 0x2118}, +{"wekatakana", 0x30F1}, +{"wekorean", 0x315E}, +{"weokorean", 0x315D}, +{"wgrave", 0x1E81}, +{"whitebullet", 0x25E6}, +{"whitecircle", 0x25CB}, +{"whitecircleinverse", 0x25D9}, +{"whitecornerbracketleft", 0x300E}, +{"whitecornerbracketleftvertical", 0xFE43}, +{"whitecornerbracketright", 0x300F}, +{"whitecornerbracketrightvertical", 0xFE44}, +{"whitediamond", 0x25C7}, +{"whitediamondcontainingblacksmalldiamond", 0x25C8}, +{"whitedownpointingsmalltriangle", 0x25BF}, +{"whitedownpointingtriangle", 0x25BD}, +{"whiteleftpointingsmalltriangle", 0x25C3}, +{"whiteleftpointingtriangle", 0x25C1}, +{"whitelenticularbracketleft", 0x3016}, +{"whitelenticularbracketright", 0x3017}, +{"whiterightpointingsmalltriangle", 0x25B9}, +{"whiterightpointingtriangle", 0x25B7}, +{"whitesmallsquare", 0x25AB}, +{"whitesmilingface", 0x263A}, +{"whitesquare", 0x25A1}, +{"whitestar", 0x2606}, +{"whitetelephone", 0x260F}, +{"whitetortoiseshellbracketleft", 0x3018}, +{"whitetortoiseshellbracketright", 0x3019}, +{"whiteuppointingsmalltriangle", 0x25B5}, +{"whiteuppointingtriangle", 0x25B3}, +{"wihiragana", 0x3090}, +{"wikatakana", 0x30F0}, +{"wikorean", 0x315F}, +{"wmonospace", 0xFF57}, +{"wohiragana", 0x3092}, +{"wokatakana", 0x30F2}, +{"wokatakanahalfwidth", 0xFF66}, +{"won", 0x20A9}, +{"wonmonospace", 0xFFE6}, +{"wowaenthai", 0x0E27}, +{"wparen", 0x24B2}, +{"wring", 0x1E98}, +{"wsuperior", 0x02B7}, +{"wturned", 0x028D}, +{"wynn", 0x01BF}, +{"x", 0x0078}, +{"xabovecmb", 0x033D}, +{"xbopomofo", 0x3112}, +{"xcircle", 0x24E7}, +{"xdieresis", 0x1E8D}, +{"xdotaccent", 0x1E8B}, +{"xeharmenian", 0x056D}, +{"xi", 0x03BE}, +{"xmonospace", 0xFF58}, +{"xparen", 0x24B3}, +{"xsuperior", 0x02E3}, +{"y", 0x0079}, +{"yaadosquare", 0x334E}, +{"yabengali", 0x09AF}, +{"yacute", 0x00FD}, +{"yadeva", 0x092F}, +{"yaekorean", 0x3152}, +{"yagujarati", 0x0AAF}, +{"yagurmukhi", 0x0A2F}, +{"yahiragana", 0x3084}, +{"yakatakana", 0x30E4}, +{"yakatakanahalfwidth", 0xFF94}, +{"yakorean", 0x3151}, +{"yamakkanthai", 0x0E4E}, +{"yasmallhiragana", 0x3083}, +{"yasmallkatakana", 0x30E3}, +{"yasmallkatakanahalfwidth", 0xFF6C}, +{"yatcyrillic", 0x0463}, +{"ycircle", 0x24E8}, +{"ycircumflex", 0x0177}, +{"ydieresis", 0x00FF}, +{"ydotaccent", 0x1E8F}, +{"ydotbelow", 0x1EF5}, +{"yeharabic", 0x064A}, +{"yehbarreearabic", 0x06D2}, +{"yehbarreefinalarabic", 0xFBAF}, +{"yehfinalarabic", 0xFEF2}, +{"yehhamzaabovearabic", 0x0626}, +{"yehhamzaabovefinalarabic", 0xFE8A}, +{"yehhamzaaboveinitialarabic", 0xFE8B}, +{"yehhamzaabovemedialarabic", 0xFE8C}, +{"yehinitialarabic", 0xFEF3}, +{"yehmedialarabic", 0xFEF4}, +{"yehmeeminitialarabic", 0xFCDD}, +{"yehmeemisolatedarabic", 0xFC58}, +{"yehnoonfinalarabic", 0xFC94}, +{"yehthreedotsbelowarabic", 0x06D1}, +{"yekorean", 0x3156}, +{"yen", 0x00A5}, +{"yenmonospace", 0xFFE5}, +{"yeokorean", 0x3155}, +{"yeorinhieuhkorean", 0x3186}, +{"yerahbenyomohebrew", 0x05AA}, +{"yerahbenyomolefthebrew", 0x05AA}, +{"yericyrillic", 0x044B}, +{"yerudieresiscyrillic", 0x04F9}, +{"yesieungkorean", 0x3181}, +{"yesieungpansioskorean", 0x3183}, +{"yesieungsioskorean", 0x3182}, +{"yetivhebrew", 0x059A}, +{"ygrave", 0x1EF3}, +{"yhook", 0x01B4}, +{"yhookabove", 0x1EF7}, +{"yiarmenian", 0x0575}, +{"yicyrillic", 0x0457}, +{"yikorean", 0x3162}, +{"yinyang", 0x262F}, +{"yiwnarmenian", 0x0582}, +{"ymonospace", 0xFF59}, +{"yod", 0x05D9}, +{"yoddagesh", 0xFB39}, +{"yoddageshhebrew", 0xFB39}, +{"yodhebrew", 0x05D9}, +{"yodyodhebrew", 0x05F2}, +{"yodyodpatahhebrew", 0xFB1F}, +{"yohiragana", 0x3088}, +{"yoikorean", 0x3189}, +{"yokatakana", 0x30E8}, +{"yokatakanahalfwidth", 0xFF96}, +{"yokorean", 0x315B}, +{"yosmallhiragana", 0x3087}, +{"yosmallkatakana", 0x30E7}, +{"yosmallkatakanahalfwidth", 0xFF6E}, +{"yotgreek", 0x03F3}, +{"yoyaekorean", 0x3188}, +{"yoyakorean", 0x3187}, +{"yoyakthai", 0x0E22}, +{"yoyingthai", 0x0E0D}, +{"yparen", 0x24B4}, +{"ypogegrammeni", 0x037A}, +{"ypogegrammenigreekcmb", 0x0345}, +{"yr", 0x01A6}, +{"yring", 0x1E99}, +{"ysuperior", 0x02B8}, +{"ytilde", 0x1EF9}, +{"yturned", 0x028E}, +{"yuhiragana", 0x3086}, +{"yuikorean", 0x318C}, +{"yukatakana", 0x30E6}, +{"yukatakanahalfwidth", 0xFF95}, +{"yukorean", 0x3160}, +{"yusbigcyrillic", 0x046B}, +{"yusbigiotifiedcyrillic", 0x046D}, +{"yuslittlecyrillic", 0x0467}, +{"yuslittleiotifiedcyrillic", 0x0469}, +{"yusmallhiragana", 0x3085}, +{"yusmallkatakana", 0x30E5}, +{"yusmallkatakanahalfwidth", 0xFF6D}, +{"yuyekorean", 0x318B}, +{"yuyeokorean", 0x318A}, +{"yyabengali", 0x09DF}, +{"yyadeva", 0x095F}, +{"z", 0x007A}, +{"zaarmenian", 0x0566}, +{"zacute", 0x017A}, +{"zadeva", 0x095B}, +{"zagurmukhi", 0x0A5B}, +{"zaharabic", 0x0638}, +{"zahfinalarabic", 0xFEC6}, +{"zahinitialarabic", 0xFEC7}, +{"zahiragana", 0x3056}, +{"zahmedialarabic", 0xFEC8}, +{"zainarabic", 0x0632}, +{"zainfinalarabic", 0xFEB0}, +{"zakatakana", 0x30B6}, +{"zaqefgadolhebrew", 0x0595}, +{"zaqefqatanhebrew", 0x0594}, +{"zarqahebrew", 0x0598}, +{"zayin", 0x05D6}, +{"zayindagesh", 0xFB36}, +{"zayindageshhebrew", 0xFB36}, +{"zayinhebrew", 0x05D6}, +{"zbopomofo", 0x3117}, +{"zcaron", 0x017E}, +{"zcircle", 0x24E9}, +{"zcircumflex", 0x1E91}, +{"zcurl", 0x0291}, +{"zdot", 0x017C}, +{"zdotaccent", 0x017C}, +{"zdotbelow", 0x1E93}, +{"zecyrillic", 0x0437}, +{"zedescendercyrillic", 0x0499}, +{"zedieresiscyrillic", 0x04DF}, +{"zehiragana", 0x305C}, +{"zekatakana", 0x30BC}, +{"zero", 0x0030}, +{"zeroarabic", 0x0660}, +{"zerobengali", 0x09E6}, +{"zerodeva", 0x0966}, +{"zerogujarati", 0x0AE6}, +{"zerogurmukhi", 0x0A66}, +{"zerohackarabic", 0x0660}, +{"zeroinferior", 0x2080}, +{"zeromonospace", 0xFF10}, +{"zerooldstyle", 0xF730}, +{"zeropersian", 0x06F0}, +{"zerosuperior", 0x2070}, +{"zerothai", 0x0E50}, +{"zerowidthjoiner", 0xFEFF}, +{"zerowidthnonjoiner", 0x200C}, +{"zerowidthspace", 0x200B}, +{"zeta", 0x03B6}, +{"zhbopomofo", 0x3113}, +{"zhearmenian", 0x056A}, +{"zhebrevecyrillic", 0x04C2}, +{"zhecyrillic", 0x0436}, +{"zhedescendercyrillic", 0x0497}, +{"zhedieresiscyrillic", 0x04DD}, +{"zihiragana", 0x3058}, +{"zikatakana", 0x30B8}, +{"zinorhebrew", 0x05AE}, +{"zlinebelow", 0x1E95}, +{"zmonospace", 0xFF5A}, +{"zohiragana", 0x305E}, +{"zokatakana", 0x30BE}, +{"zparen", 0x24B5}, +{"zretroflexhook", 0x0290}, +{"zstroke", 0x01B6}, +{"zuhiragana", 0x305A}, +{"zukatakana", 0x30BA}, + {0x00, 0} +}; + +double_glyph_list_t DoubleGlyphList[] = { +{"dalethatafpatah", {0x05D3, 0x05B2}}, +{"dalethatafpatahhebrew", {0x05D3, 0x05B2}}, +{"dalethatafsegol", {0x05D3, 0x05B1}}, +{"dalethatafsegolhebrew", {0x05D3, 0x05B1}}, +{"dalethiriq", {0x05D3, 0x05B4}}, +{"dalethiriqhebrew", {0x05D3, 0x05B4}}, +{"daletholam", {0x05D3, 0x05B9}}, +{"daletholamhebrew", {0x05D3, 0x05B9}}, +{"daletpatah", {0x05D3, 0x05B7}}, +{"daletpatahhebrew", {0x05D3, 0x05B7}}, +{"daletqamats", {0x05D3, 0x05B8}}, +{"daletqamatshebrew", {0x05D3, 0x05B8}}, +{"daletqubuts", {0x05D3, 0x05BB}}, +{"daletqubutshebrew", {0x05D3, 0x05BB}}, +{"daletsegol", {0x05D3, 0x05B6}}, +{"daletsegolhebrew", {0x05D3, 0x05B6}}, +{"daletsheva", {0x05D3, 0x05B0}}, +{"daletshevahebrew", {0x05D3, 0x05B0}}, +{"dalettsere", {0x05D3, 0x05B5}}, +{"dalettserehebrew", {0x05D3, 0x05B5}}, +{"finalkafqamats", {0x05DA, 0x05B8}}, +{"finalkafqamatshebrew", {0x05DA, 0x05B8}}, +{"finalkafsheva", {0x05DA, 0x05B0}}, +{"finalkafshevahebrew", {0x05DA, 0x05B0}}, +{"hamzadammaarabic", {0x0621, 0x064F}}, +{"hamzadammatanarabic", {0x0621, 0x064C}}, +{"hamzafathaarabic", {0x0621, 0x064E}}, +{"hamzafathatanarabic", {0x0621, 0x064B}}, +{"hamzalowkasraarabic", {0x0621, 0x0650}}, +{"hamzalowkasratanarabic", {0x0621, 0x064D}}, +{"hamzasukunarabic", {0x0621, 0x0652}}, +{"lamedholam", {0x05DC, 0x05B9}}, +{"lamedholamhebrew", {0x05DC, 0x05B9}}, +{"noonhehinitialarabic", {0xFEE7, 0xFEEC}}, +{"qofhatafpatah", {0x05E7, 0x05B2}}, +{"qofhatafpatahhebrew", {0x05E7, 0x05B2}}, +{"qofhatafsegol", {0x05E7, 0x05B1}}, +{"qofhatafsegolhebrew", {0x05E7, 0x05B1}}, +{"qofhiriq", {0x05E7, 0x05B4}}, +{"qofhiriqhebrew", {0x05E7, 0x05B4}}, +{"qofholam", {0x05E7, 0x05B9}}, +{"qofholamhebrew", {0x05E7, 0x05B9}}, +{"qofpatah", {0x05E7, 0x05B7}}, +{"qofpatahhebrew", {0x05E7, 0x05B7}}, +{"qofqamats", {0x05E7, 0x05B8}}, +{"qofqamatshebrew", {0x05E7, 0x05B8}}, +{"qofqubuts", {0x05E7, 0x05BB}}, +{"qofqubutshebrew", {0x05E7, 0x05BB}}, +{"qofsegol", {0x05E7, 0x05B6}}, +{"qofsegolhebrew", {0x05E7, 0x05B6}}, +{"qofsheva", {0x05E7, 0x05B0}}, +{"qofshevahebrew", {0x05E7, 0x05B0}}, +{"qoftsere", {0x05E7, 0x05B5}}, +{"qoftserehebrew", {0x05E7, 0x05B5}}, +{"reshhatafpatah", {0x05E8, 0x05B2}}, +{"reshhatafpatahhebrew", {0x05E8, 0x05B2}}, +{"reshhatafsegol", {0x05E8, 0x05B1}}, +{"reshhatafsegolhebrew", {0x05E8, 0x05B1}}, +{"reshhiriq", {0x05E8, 0x05B4}}, +{"reshhiriqhebrew", {0x05E8, 0x05B4}}, +{"reshholam", {0x05E8, 0x05B9}}, +{"reshholamhebrew", {0x05E8, 0x05B9}}, +{"reshpatah", {0x05E8, 0x05B7}}, +{"reshpatahhebrew", {0x05E8, 0x05B7}}, +{"reshqamats", {0x05E8, 0x05B8}}, +{"reshqamatshebrew", {0x05E8, 0x05B8}}, +{"reshqubuts", {0x05E8, 0x05BB}}, +{"reshqubutshebrew", {0x05E8, 0x05BB}}, +{"reshsegol", {0x05E8, 0x05B6}}, +{"reshsegolhebrew", {0x05E8, 0x05B6}}, +{"reshsheva", {0x05E8, 0x05B0}}, +{"reshshevahebrew", {0x05E8, 0x05B0}}, +{"reshtsere", {0x05E8, 0x05B5}}, +{"reshtserehebrew", {0x05E8, 0x05B5}}, +{"shaddafathatanarabic", {0x0651, 0x064B}}, +{"tchehmeeminitialarabic", {0xFB7C, 0xFEE4}}, + {0x00, {0,0}} +}; + +treble_glyph_list_t TrebleGlyphList[] = { + {"lamedholamdagesh", {0x05DC, 0x05B9, 0x05BC}}, + {"lamedholamdageshhebrew", {0x05DC, 0x05B9, 0x05BC}}, + {"lammeemjeeminitialarabic", {0xFEDF, 0xFEE4, 0xFEA0}}, + {"lammeemkhahinitialarabic", {0xFEDF, 0xFEE4, 0xFEA8}}, + {0x00, {0,0,0}} +}; + +quad_glyph_list_t QuadGlyphList[] = { + {"rehyehaleflamarabic", {0x0631, 0xFEF3, 0xFE8E, 0x0644}}, + {0x00, {0,0,0}} +}; diff -Nru ghostscript-9.04~dfsg/base/gdevagl.h ghostscript-9.05~dfsg~20120125/base/gdevagl.h --- ghostscript-9.04~dfsg/base/gdevagl.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevagl.h 2011-09-29 11:01:33.000000000 +0000 @@ -1,4320 +1,23 @@ -/* We need several tables, to hold the glyph naems and a variable number of +/* We need several tables, to hold the glyph names and a variable number of * Unicode code points. */ typedef struct single_glyph_list_s { - char *Glyph; + const char *Glyph; unsigned short Unicode; } single_glyph_list_t; typedef struct double_glyph_list_s { - char *Glyph; + const char *Glyph; unsigned short Unicode[2]; } double_glyph_list_t; typedef struct treble_glyph_list_s { - char *Glyph; + const char *Glyph; unsigned short Unicode[3]; } treble_glyph_list_t; typedef struct quad_glyph_list_s { - char *Glyph; - unsigned short Unicode[4]; + const char *Glyph; + short Unicode[4]; } quad_glyph_list_t; - -single_glyph_list_t SingleGlyphList[] = { -"A", 0x0041, -"AE", 0x00C6, -"AEacute", 0x01FC, -"AEmacron", 0x01E2, -"AEsmall", 0xF7E6, -"Aacute", 0x00C1, -"Aacutesmall", 0xF7E1, -"Abreve", 0x0102, -"Abreveacute", 0x1EAE, -"Abrevecyrillic", 0x04D0, -"Abrevedotbelow", 0x1EB6, -"Abrevegrave", 0x1EB0, -"Abrevehookabove", 0x1EB2, -"Abrevetilde", 0x1EB4, -"Acaron", 0x01CD, -"Acircle", 0x24B6, -"Acircumflex", 0x00C2, -"Acircumflexacute", 0x1EA4, -"Acircumflexdotbelow", 0x1EAC, -"Acircumflexgrave", 0x1EA6, -"Acircumflexhookabove", 0x1EA8, -"Acircumflexsmall", 0xF7E2, -"Acircumflextilde", 0x1EAA, -"Acute", 0xF6C9, -"Acutesmall", 0xF7B4, -"Acyrillic", 0x0410, -"Adblgrave", 0x0200, -"Adieresis", 0x00C4, -"Adieresiscyrillic", 0x04D2, -"Adieresismacron", 0x01DE, -"Adieresissmall", 0xF7E4, -"Adotbelow", 0x1EA0, -"Adotmacron", 0x01E0, -"Agrave", 0x00C0, -"Agravesmall", 0xF7E0, -"Ahookabove", 0x1EA2, -"Aiecyrillic", 0x04D4, -"Ainvertedbreve", 0x0202, -"Alpha", 0x0391, -"Alphatonos", 0x0386, -"Amacron", 0x0100, -"Amonospace", 0xFF21, -"Aogonek", 0x0104, -"Aring", 0x00C5, -"Aringacute", 0x01FA, -"Aringbelow", 0x1E00, -"Aringsmall", 0xF7E5, -"Asmall", 0xF761, -"Atilde", 0x00C3, -"Atildesmall", 0xF7E3, -"Aybarmenian", 0x0531, -"B", 0x0042, -"Bcircle", 0x24B7, -"Bdotaccent", 0x1E02, -"Bdotbelow", 0x1E04, -"Becyrillic", 0x0411, -"Benarmenian", 0x0532, -"Beta", 0x0392, -"Bhook", 0x0181, -"Blinebelow", 0x1E06, -"Bmonospace", 0xFF22, -"Brevesmall", 0xF6F4, -"Bsmall", 0xF762, -"Btopbar", 0x0182, -"C", 0x0043, -"Caarmenian", 0x053E, -"Cacute", 0x0106, -"Caron", 0xF6CA, -"Caronsmall", 0xF6F5, -"Ccaron", 0x010C, -"Ccedilla", 0x00C7, -"Ccedillaacute", 0x1E08, -"Ccedillasmall", 0xF7E7, -"Ccircle", 0x24B8, -"Ccircumflex", 0x0108, -"Cdot", 0x010A, -"Cdotaccent", 0x010A, -"Cedillasmall", 0xF7B8, -"Chaarmenian", 0x0549, -"Cheabkhasiancyrillic", 0x04BC, -"Checyrillic", 0x0427, -"Chedescenderabkhasiancyrillic", 0x04BE, -"Chedescendercyrillic", 0x04B6, -"Chedieresiscyrillic", 0x04F4, -"Cheharmenian", 0x0543, -"Chekhakassiancyrillic", 0x04CB, -"Cheverticalstrokecyrillic", 0x04B8, -"Chi", 0x03A7, -"Chook", 0x0187, -"Circumflexsmall", 0xF6F6, -"Cmonospace", 0xFF23, -"Coarmenian", 0x0551, -"Csmall", 0xF763, -"D", 0x0044, -"DZ", 0x01F1, -"DZcaron", 0x01C4, -"Daarmenian", 0x0534, -"Dafrican", 0x0189, -"Dcaron", 0x010E, -"Dcedilla", 0x1E10, -"Dcircle", 0x24B9, -"Dcircumflexbelow", 0x1E12, -"Dcroat", 0x0110, -"Ddotaccent", 0x1E0A, -"Ddotbelow", 0x1E0C, -"Decyrillic", 0x0414, -"Deicoptic", 0x03EE, -"Delta", 0x2206, -"Deltagreek", 0x0394, -"Dhook", 0x018A, -"Dieresis", 0xF6CB, -"DieresisAcute", 0xF6CC, -"DieresisGrave", 0xF6CD, -"Dieresissmall", 0xF7A8, -"Digammagreek", 0x03DC, -"Djecyrillic", 0x0402, -"Dlinebelow", 0x1E0E, -"Dmonospace", 0xFF24, -"Dotaccentsmall", 0xF6F7, -"Dslash", 0x0110, -"Dsmall", 0xF764, -"Dtopbar", 0x018B, -"Dz", 0x01F2, -"Dzcaron", 0x01C5, -"Dzeabkhasiancyrillic", 0x04E0, -"Dzecyrillic", 0x0405, -"Dzhecyrillic", 0x040F, -"E", 0x0045, -"Eacute", 0x00C9, -"Eacutesmall", 0xF7E9, -"Ebreve", 0x0114, -"Ecaron", 0x011A, -"Ecedillabreve", 0x1E1C, -"Echarmenian", 0x0535, -"Ecircle", 0x24BA, -"Ecircumflex", 0x00CA, -"Ecircumflexacute", 0x1EBE, -"Ecircumflexbelow", 0x1E18, -"Ecircumflexdotbelow", 0x1EC6, -"Ecircumflexgrave", 0x1EC0, -"Ecircumflexhookabove", 0x1EC2, -"Ecircumflexsmall", 0xF7EA, -"Ecircumflextilde", 0x1EC4, -"Ecyrillic", 0x0404, -"Edblgrave", 0x0204, -"Edieresis", 0x00CB, -"Edieresissmall", 0xF7EB, -"Edot", 0x0116, -"Edotaccent", 0x0116, -"Edotbelow", 0x1EB8, -"Efcyrillic", 0x0424, -"Egrave", 0x00C8, -"Egravesmall", 0xF7E8, -"Eharmenian", 0x0537, -"Ehookabove", 0x1EBA, -"Eightroman", 0x2167, -"Einvertedbreve", 0x0206, -"Eiotifiedcyrillic", 0x0464, -"Elcyrillic", 0x041B, -"Elevenroman", 0x216A, -"Emacron", 0x0112, -"Emacronacute", 0x1E16, -"Emacrongrave", 0x1E14, -"Emcyrillic", 0x041C, -"Emonospace", 0xFF25, -"Encyrillic", 0x041D, -"Endescendercyrillic", 0x04A2, -"Eng", 0x014A, -"Enghecyrillic", 0x04A4, -"Enhookcyrillic", 0x04C7, -"Eogonek", 0x0118, -"Eopen", 0x0190, -"Epsilon", 0x0395, -"Epsilontonos", 0x0388, -"Ercyrillic", 0x0420, -"Ereversed", 0x018E, -"Ereversedcyrillic", 0x042D, -"Escyrillic", 0x0421, -"Esdescendercyrillic", 0x04AA, -"Esh", 0x01A9, -"Esmall", 0xF765, -"Eta", 0x0397, -"Etarmenian", 0x0538, -"Etatonos", 0x0389, -"Eth", 0x00D0, -"Ethsmall", 0xF7F0, -"Etilde", 0x1EBC, -"Etildebelow", 0x1E1A, -"Euro", 0x20AC, -"Ezh", 0x01B7, -"Ezhcaron", 0x01EE, -"Ezhreversed", 0x01B8, -"F", 0x0046, -"Fcircle", 0x24BB, -"Fdotaccent", 0x1E1E, -"Feharmenian", 0x0556, -"Feicoptic", 0x03E4, -"Fhook", 0x0191, -"Fitacyrillic", 0x0472, -"Fiveroman", 0x2164, -"Fmonospace", 0xFF26, -"Fourroman", 0x2163, -"Fsmall", 0xF766, -"G", 0x0047, -"GBsquare", 0x3387, -"Gacute", 0x01F4, -"Gamma", 0x0393, -"Gammaafrican", 0x0194, -"Gangiacoptic", 0x03EA, -"Gbreve", 0x011E, -"Gcaron", 0x01E6, -"Gcedilla", 0x0122, -"Gcircle", 0x24BC, -"Gcircumflex", 0x011C, -"Gcommaaccent", 0x0122, -"Gdot", 0x0120, -"Gdotaccent", 0x0120, -"Gecyrillic", 0x0413, -"Ghadarmenian", 0x0542, -"Ghemiddlehookcyrillic", 0x0494, -"Ghestrokecyrillic", 0x0492, -"Gheupturncyrillic", 0x0490, -"Ghook", 0x0193, -"Gimarmenian", 0x0533, -"Gjecyrillic", 0x0403, -"Gmacron", 0x1E20, -"Gmonospace", 0xFF27, -"Grave", 0xF6CE, -"Gravesmall", 0xF760, -"Gsmall", 0xF767, -"Gsmallhook", 0x029B, -"Gstroke", 0x01E4, -"H", 0x0048, -"H18533", 0x25CF, -"H18543", 0x25AA, -"H18551", 0x25AB, -"H22073", 0x25A1, -"HPsquare", 0x33CB, -"Haabkhasiancyrillic", 0x04A8, -"Hadescendercyrillic", 0x04B2, -"Hardsigncyrillic", 0x042A, -"Hbar", 0x0126, -"Hbrevebelow", 0x1E2A, -"Hcedilla", 0x1E28, -"Hcircle", 0x24BD, -"Hcircumflex", 0x0124, -"Hdieresis", 0x1E26, -"Hdotaccent", 0x1E22, -"Hdotbelow", 0x1E24, -"Hmonospace", 0xFF28, -"Hoarmenian", 0x0540, -"Horicoptic", 0x03E8, -"Hsmall", 0xF768, -"Hungarumlaut", 0xF6CF, -"Hungarumlautsmall", 0xF6F8, -"Hzsquare", 0x3390, -"I", 0x0049, -"IAcyrillic", 0x042F, -"IJ", 0x0132, -"IUcyrillic", 0x042E, -"Iacute", 0x00CD, -"Iacutesmall", 0xF7ED, -"Ibreve", 0x012C, -"Icaron", 0x01CF, -"Icircle", 0x24BE, -"Icircumflex", 0x00CE, -"Icircumflexsmall", 0xF7EE, -"Icyrillic", 0x0406, -"Idblgrave", 0x0208, -"Idieresis", 0x00CF, -"Idieresisacute", 0x1E2E, -"Idieresiscyrillic", 0x04E4, -"Idieresissmall", 0xF7EF, -"Idot", 0x0130, -"Idotaccent", 0x0130, -"Idotbelow", 0x1ECA, -"Iebrevecyrillic", 0x04D6, -"Iecyrillic", 0x0415, -"Ifraktur", 0x2111, -"Igrave", 0x00CC, -"Igravesmall", 0xF7EC, -"Ihookabove", 0x1EC8, -"Iicyrillic", 0x0418, -"Iinvertedbreve", 0x020A, -"Iishortcyrillic", 0x0419, -"Imacron", 0x012A, -"Imacroncyrillic", 0x04E2, -"Imonospace", 0xFF29, -"Iniarmenian", 0x053B, -"Iocyrillic", 0x0401, -"Iogonek", 0x012E, -"Iota", 0x0399, -"Iotaafrican", 0x0196, -"Iotadieresis", 0x03AA, -"Iotatonos", 0x038A, -"Ismall", 0xF769, -"Istroke", 0x0197, -"Itilde", 0x0128, -"Itildebelow", 0x1E2C, -"Izhitsacyrillic", 0x0474, -"Izhitsadblgravecyrillic", 0x0476, -"J", 0x004A, -"Jaarmenian", 0x0541, -"Jcircle", 0x24BF, -"Jcircumflex", 0x0134, -"Jecyrillic", 0x0408, -"Jheharmenian", 0x054B, -"Jmonospace", 0xFF2A, -"Jsmall", 0xF76A, -"K", 0x004B, -"KBsquare", 0x3385, -"KKsquare", 0x33CD, -"Kabashkircyrillic", 0x04A0, -"Kacute", 0x1E30, -"Kacyrillic", 0x041A, -"Kadescendercyrillic", 0x049A, -"Kahookcyrillic", 0x04C3, -"Kappa", 0x039A, -"Kastrokecyrillic", 0x049E, -"Kaverticalstrokecyrillic", 0x049C, -"Kcaron", 0x01E8, -"Kcedilla", 0x0136, -"Kcircle", 0x24C0, -"Kcommaaccent", 0x0136, -"Kdotbelow", 0x1E32, -"Keharmenian", 0x0554, -"Kenarmenian", 0x053F, -"Khacyrillic", 0x0425, -"Kheicoptic", 0x03E6, -"Khook", 0x0198, -"Kjecyrillic", 0x040C, -"Klinebelow", 0x1E34, -"Kmonospace", 0xFF2B, -"Koppacyrillic", 0x0480, -"Koppagreek", 0x03DE, -"Ksicyrillic", 0x046E, -"Ksmall", 0xF76B, -"L", 0x004C, -"LJ", 0x01C7, -"LL", 0xF6BF, -"Lacute", 0x0139, -"Lambda", 0x039B, -"Lcaron", 0x013D, -"Lcedilla", 0x013B, -"Lcircle", 0x24C1, -"Lcircumflexbelow", 0x1E3C, -"Lcommaaccent", 0x013B, -"Ldot", 0x013F, -"Ldotaccent", 0x013F, -"Ldotbelow", 0x1E36, -"Ldotbelowmacron", 0x1E38, -"Liwnarmenian", 0x053C, -"Lj", 0x01C8, -"Ljecyrillic", 0x0409, -"Llinebelow", 0x1E3A, -"Lmonospace", 0xFF2C, -"Lslash", 0x0141, -"Lslashsmall", 0xF6F9, -"Lsmall", 0xF76C, -"M", 0x004D, -"MBsquare", 0x3386, -"Macron", 0xF6D0, -"Macronsmall", 0xF7AF, -"Macute", 0x1E3E, -"Mcircle", 0x24C2, -"Mdotaccent", 0x1E40, -"Mdotbelow", 0x1E42, -"Menarmenian", 0x0544, -"Mmonospace", 0xFF2D, -"Msmall", 0xF76D, -"Mturned", 0x019C, -"Mu", 0x039C, -"N", 0x004E, -"NJ", 0x01CA, -"Nacute", 0x0143, -"Ncaron", 0x0147, -"Ncedilla", 0x0145, -"Ncircle", 0x24C3, -"Ncircumflexbelow", 0x1E4A, -"Ncommaaccent", 0x0145, -"Ndotaccent", 0x1E44, -"Ndotbelow", 0x1E46, -"Nhookleft", 0x019D, -"Nineroman", 0x2168, -"Nj", 0x01CB, -"Njecyrillic", 0x040A, -"Nlinebelow", 0x1E48, -"Nmonospace", 0xFF2E, -"Nowarmenian", 0x0546, -"Nsmall", 0xF76E, -"Ntilde", 0x00D1, -"Ntildesmall", 0xF7F1, -"Nu", 0x039D, -"O", 0x004F, -"OE", 0x0152, -"OEsmall", 0xF6FA, -"Oacute", 0x00D3, -"Oacutesmall", 0xF7F3, -"Obarredcyrillic", 0x04E8, -"Obarreddieresiscyrillic", 0x04EA, -"Obreve", 0x014E, -"Ocaron", 0x01D1, -"Ocenteredtilde", 0x019F, -"Ocircle", 0x24C4, -"Ocircumflex", 0x00D4, -"Ocircumflexacute", 0x1ED0, -"Ocircumflexdotbelow", 0x1ED8, -"Ocircumflexgrave", 0x1ED2, -"Ocircumflexhookabove", 0x1ED4, -"Ocircumflexsmall", 0xF7F4, -"Ocircumflextilde", 0x1ED6, -"Ocyrillic", 0x041E, -"Odblacute", 0x0150, -"Odblgrave", 0x020C, -"Odieresis", 0x00D6, -"Odieresiscyrillic", 0x04E6, -"Odieresissmall", 0xF7F6, -"Odotbelow", 0x1ECC, -"Ogoneksmall", 0xF6FB, -"Ograve", 0x00D2, -"Ogravesmall", 0xF7F2, -"Oharmenian", 0x0555, -"Ohm", 0x2126, -"Ohookabove", 0x1ECE, -"Ohorn", 0x01A0, -"Ohornacute", 0x1EDA, -"Ohorndotbelow", 0x1EE2, -"Ohorngrave", 0x1EDC, -"Ohornhookabove", 0x1EDE, -"Ohorntilde", 0x1EE0, -"Ohungarumlaut", 0x0150, -"Oi", 0x01A2, -"Oinvertedbreve", 0x020E, -"Omacron", 0x014C, -"Omacronacute", 0x1E52, -"Omacrongrave", 0x1E50, -"Omega", 0x2126, -"Omegacyrillic", 0x0460, -"Omegagreek", 0x03A9, -"Omegaroundcyrillic", 0x047A, -"Omegatitlocyrillic", 0x047C, -"Omegatonos", 0x038F, -"Omicron", 0x039F, -"Omicrontonos", 0x038C, -"Omonospace", 0xFF2F, -"Oneroman", 0x2160, -"Oogonek", 0x01EA, -"Oogonekmacron", 0x01EC, -"Oopen", 0x0186, -"Oslash", 0x00D8, -"Oslashacute", 0x01FE, -"Oslashsmall", 0xF7F8, -"Osmall", 0xF76F, -"Ostrokeacute", 0x01FE, -"Otcyrillic", 0x047E, -"Otilde", 0x00D5, -"Otildeacute", 0x1E4C, -"Otildedieresis", 0x1E4E, -"Otildesmall", 0xF7F5, -"P", 0x0050, -"Pacute", 0x1E54, -"Pcircle", 0x24C5, -"Pdotaccent", 0x1E56, -"Pecyrillic", 0x041F, -"Peharmenian", 0x054A, -"Pemiddlehookcyrillic", 0x04A6, -"Phi", 0x03A6, -"Phook", 0x01A4, -"Pi", 0x03A0, -"Piwrarmenian", 0x0553, -"Pmonospace", 0xFF30, -"Psi", 0x03A8, -"Psicyrillic", 0x0470, -"Psmall", 0xF770, -"Q", 0x0051, -"Qcircle", 0x24C6, -"Qmonospace", 0xFF31, -"Qsmall", 0xF771, -"R", 0x0052, -"Raarmenian", 0x054C, -"Racute", 0x0154, -"Rcaron", 0x0158, -"Rcedilla", 0x0156, -"Rcircle", 0x24C7, -"Rcommaaccent", 0x0156, -"Rdblgrave", 0x0210, -"Rdotaccent", 0x1E58, -"Rdotbelow", 0x1E5A, -"Rdotbelowmacron", 0x1E5C, -"Reharmenian", 0x0550, -"Rfraktur", 0x211C, -"Rho", 0x03A1, -"Ringsmall", 0xF6FC, -"Rinvertedbreve", 0x0212, -"Rlinebelow", 0x1E5E, -"Rmonospace", 0xFF32, -"Rsmall", 0xF772, -"Rsmallinverted", 0x0281, -"Rsmallinvertedsuperior", 0x02B6, -"S", 0x0053, -"SF010000", 0x250C, -"SF020000", 0x2514, -"SF030000", 0x2510, -"SF040000", 0x2518, -"SF050000", 0x253C, -"SF060000", 0x252C, -"SF070000", 0x2534, -"SF080000", 0x251C, -"SF090000", 0x2524, -"SF100000", 0x2500, -"SF110000", 0x2502, -"SF190000", 0x2561, -"SF200000", 0x2562, -"SF210000", 0x2556, -"SF220000", 0x2555, -"SF230000", 0x2563, -"SF240000", 0x2551, -"SF250000", 0x2557, -"SF260000", 0x255D, -"SF270000", 0x255C, -"SF280000", 0x255B, -"SF360000", 0x255E, -"SF370000", 0x255F, -"SF380000", 0x255A, -"SF390000", 0x2554, -"SF400000", 0x2569, -"SF410000", 0x2566, -"SF420000", 0x2560, -"SF430000", 0x2550, -"SF440000", 0x256C, -"SF450000", 0x2567, -"SF460000", 0x2568, -"SF470000", 0x2564, -"SF480000", 0x2565, -"SF490000", 0x2559, -"SF500000", 0x2558, -"SF510000", 0x2552, -"SF520000", 0x2553, -"SF530000", 0x256B, -"SF540000", 0x256A, -"Sacute", 0x015A, -"Sacutedotaccent", 0x1E64, -"Sampigreek", 0x03E0, -"Scaron", 0x0160, -"Scarondotaccent", 0x1E66, -"Scaronsmall", 0xF6FD, -"Scedilla", 0x015E, -"Schwa", 0x018F, -"Schwacyrillic", 0x04D8, -"Schwadieresiscyrillic", 0x04DA, -"Scircle", 0x24C8, -"Scircumflex", 0x015C, -"Scommaaccent", 0x0218, -"Sdotaccent", 0x1E60, -"Sdotbelow", 0x1E62, -"Sdotbelowdotaccent", 0x1E68, -"Seharmenian", 0x054D, -"Sevenroman", 0x2166, -"Shaarmenian", 0x0547, -"Shacyrillic", 0x0428, -"Shchacyrillic", 0x0429, -"Sheicoptic", 0x03E2, -"Shhacyrillic", 0x04BA, -"Shimacoptic", 0x03EC, -"Sigma", 0x03A3, -"Sixroman", 0x2165, -"Smonospace", 0xFF33, -"Softsigncyrillic", 0x042C, -"Ssmall", 0xF773, -"Stigmagreek", 0x03DA, -"T", 0x0054, -"Tau", 0x03A4, -"Tbar", 0x0166, -"Tcaron", 0x0164, -"Tcedilla", 0x0162, -"Tcircle", 0x24C9, -"Tcircumflexbelow", 0x1E70, -"Tcommaaccent", 0x0162, -"Tdotaccent", 0x1E6A, -"Tdotbelow", 0x1E6C, -"Tecyrillic", 0x0422, -"Tedescendercyrillic", 0x04AC, -"Tenroman", 0x2169, -"Tetsecyrillic", 0x04B4, -"Theta", 0x0398, -"Thook", 0x01AC, -"Thorn", 0x00DE, -"Thornsmall", 0xF7FE, -"Threeroman", 0x2162, -"Tildesmall", 0xF6FE, -"Tiwnarmenian", 0x054F, -"Tlinebelow", 0x1E6E, -"Tmonospace", 0xFF34, -"Toarmenian", 0x0539, -"Tonefive", 0x01BC, -"Tonesix", 0x0184, -"Tonetwo", 0x01A7, -"Tretroflexhook", 0x01AE, -"Tsecyrillic", 0x0426, -"Tshecyrillic", 0x040B, -"Tsmall", 0xF774, -"Twelveroman", 0x216B, -"Tworoman", 0x2161, -"U", 0x0055, -"Uacute", 0x00DA, -"Uacutesmall", 0xF7FA, -"Ubreve", 0x016C, -"Ucaron", 0x01D3, -"Ucircle", 0x24CA, -"Ucircumflex", 0x00DB, -"Ucircumflexbelow", 0x1E76, -"Ucircumflexsmall", 0xF7FB, -"Ucyrillic", 0x0423, -"Udblacute", 0x0170, -"Udblgrave", 0x0214, -"Udieresis", 0x00DC, -"Udieresisacute", 0x01D7, -"Udieresisbelow", 0x1E72, -"Udieresiscaron", 0x01D9, -"Udieresiscyrillic", 0x04F0, -"Udieresisgrave", 0x01DB, -"Udieresismacron", 0x01D5, -"Udieresissmall", 0xF7FC, -"Udotbelow", 0x1EE4, -"Ugrave", 0x00D9, -"Ugravesmall", 0xF7F9, -"Uhookabove", 0x1EE6, -"Uhorn", 0x01AF, -"Uhornacute", 0x1EE8, -"Uhorndotbelow", 0x1EF0, -"Uhorngrave", 0x1EEA, -"Uhornhookabove", 0x1EEC, -"Uhorntilde", 0x1EEE, -"Uhungarumlaut", 0x0170, -"Uhungarumlautcyrillic", 0x04F2, -"Uinvertedbreve", 0x0216, -"Ukcyrillic", 0x0478, -"Umacron", 0x016A, -"Umacroncyrillic", 0x04EE, -"Umacrondieresis", 0x1E7A, -"Umonospace", 0xFF35, -"Uogonek", 0x0172, -"Upsilon", 0x03A5, -"Upsilon1", 0x03D2, -"Upsilonacutehooksymbolgreek", 0x03D3, -"Upsilonafrican", 0x01B1, -"Upsilondieresis", 0x03AB, -"Upsilondieresishooksymbolgreek", 0x03D4, -"Upsilonhooksymbol", 0x03D2, -"Upsilontonos", 0x038E, -"Uring", 0x016E, -"Ushortcyrillic", 0x040E, -"Usmall", 0xF775, -"Ustraightcyrillic", 0x04AE, -"Ustraightstrokecyrillic", 0x04B0, -"Utilde", 0x0168, -"Utildeacute", 0x1E78, -"Utildebelow", 0x1E74, -"V", 0x0056, -"Vcircle", 0x24CB, -"Vdotbelow", 0x1E7E, -"Vecyrillic", 0x0412, -"Vewarmenian", 0x054E, -"Vhook", 0x01B2, -"Vmonospace", 0xFF36, -"Voarmenian", 0x0548, -"Vsmall", 0xF776, -"Vtilde", 0x1E7C, -"W", 0x0057, -"Wacute", 0x1E82, -"Wcircle", 0x24CC, -"Wcircumflex", 0x0174, -"Wdieresis", 0x1E84, -"Wdotaccent", 0x1E86, -"Wdotbelow", 0x1E88, -"Wgrave", 0x1E80, -"Wmonospace", 0xFF37, -"Wsmall", 0xF777, -"X", 0x0058, -"Xcircle", 0x24CD, -"Xdieresis", 0x1E8C, -"Xdotaccent", 0x1E8A, -"Xeharmenian", 0x053D, -"Xi", 0x039E, -"Xmonospace", 0xFF38, -"Xsmall", 0xF778, -"Y", 0x0059, -"Yacute", 0x00DD, -"Yacutesmall", 0xF7FD, -"Yatcyrillic", 0x0462, -"Ycircle", 0x24CE, -"Ycircumflex", 0x0176, -"Ydieresis", 0x0178, -"Ydieresissmall", 0xF7FF, -"Ydotaccent", 0x1E8E, -"Ydotbelow", 0x1EF4, -"Yericyrillic", 0x042B, -"Yerudieresiscyrillic", 0x04F8, -"Ygrave", 0x1EF2, -"Yhook", 0x01B3, -"Yhookabove", 0x1EF6, -"Yiarmenian", 0x0545, -"Yicyrillic", 0x0407, -"Yiwnarmenian", 0x0552, -"Ymonospace", 0xFF39, -"Ysmall", 0xF779, -"Ytilde", 0x1EF8, -"Yusbigcyrillic", 0x046A, -"Yusbigiotifiedcyrillic", 0x046C, -"Yuslittlecyrillic", 0x0466, -"Yuslittleiotifiedcyrillic", 0x0468, -"Z", 0x005A, -"Zaarmenian", 0x0536, -"Zacute", 0x0179, -"Zcaron", 0x017D, -"Zcaronsmall", 0xF6FF, -"Zcircle", 0x24CF, -"Zcircumflex", 0x1E90, -"Zdot", 0x017B, -"Zdotaccent", 0x017B, -"Zdotbelow", 0x1E92, -"Zecyrillic", 0x0417, -"Zedescendercyrillic", 0x0498, -"Zedieresiscyrillic", 0x04DE, -"Zeta", 0x0396, -"Zhearmenian", 0x053A, -"Zhebrevecyrillic", 0x04C1, -"Zhecyrillic", 0x0416, -"Zhedescendercyrillic", 0x0496, -"Zhedieresiscyrillic", 0x04DC, -"Zlinebelow", 0x1E94, -"Zmonospace", 0xFF3A, -"Zsmall", 0xF77A, -"Zstroke", 0x01B5, -"a", 0x0061, -"aabengali", 0x0986, -"aacute", 0x00E1, -"aadeva", 0x0906, -"aagujarati", 0x0A86, -"aagurmukhi", 0x0A06, -"aamatragurmukhi", 0x0A3E, -"aarusquare", 0x3303, -"aavowelsignbengali", 0x09BE, -"aavowelsigndeva", 0x093E, -"aavowelsigngujarati", 0x0ABE, -"abbreviationmarkarmenian", 0x055F, -"abbreviationsigndeva", 0x0970, -"abengali", 0x0985, -"abopomofo", 0x311A, -"abreve", 0x0103, -"abreveacute", 0x1EAF, -"abrevecyrillic", 0x04D1, -"abrevedotbelow", 0x1EB7, -"abrevegrave", 0x1EB1, -"abrevehookabove", 0x1EB3, -"abrevetilde", 0x1EB5, -"acaron", 0x01CE, -"acircle", 0x24D0, -"acircumflex", 0x00E2, -"acircumflexacute", 0x1EA5, -"acircumflexdotbelow", 0x1EAD, -"acircumflexgrave", 0x1EA7, -"acircumflexhookabove", 0x1EA9, -"acircumflextilde", 0x1EAB, -"acute", 0x00B4, -"acutebelowcmb", 0x0317, -"acutecmb", 0x0301, -"acutecomb", 0x0301, -"acutedeva", 0x0954, -"acutelowmod", 0x02CF, -"acutetonecmb", 0x0341, -"acyrillic", 0x0430, -"adblgrave", 0x0201, -"addakgurmukhi", 0x0A71, -"adeva", 0x0905, -"adieresis", 0x00E4, -"adieresiscyrillic", 0x04D3, -"adieresismacron", 0x01DF, -"adotbelow", 0x1EA1, -"adotmacron", 0x01E1, -"ae", 0x00E6, -"aeacute", 0x01FD, -"aekorean", 0x3150, -"aemacron", 0x01E3, -"afii00208", 0x2015, -"afii08941", 0x20A4, -"afii10017", 0x0410, -"afii10018", 0x0411, -"afii10019", 0x0412, -"afii10020", 0x0413, -"afii10021", 0x0414, -"afii10022", 0x0415, -"afii10023", 0x0401, -"afii10024", 0x0416, -"afii10025", 0x0417, -"afii10026", 0x0418, -"afii10027", 0x0419, -"afii10028", 0x041A, -"afii10029", 0x041B, -"afii10030", 0x041C, -"afii10031", 0x041D, -"afii10032", 0x041E, -"afii10033", 0x041F, -"afii10034", 0x0420, -"afii10035", 0x0421, -"afii10036", 0x0422, -"afii10037", 0x0423, -"afii10038", 0x0424, -"afii10039", 0x0425, -"afii10040", 0x0426, -"afii10041", 0x0427, -"afii10042", 0x0428, -"afii10043", 0x0429, -"afii10044", 0x042A, -"afii10045", 0x042B, -"afii10046", 0x042C, -"afii10047", 0x042D, -"afii10048", 0x042E, -"afii10049", 0x042F, -"afii10050", 0x0490, -"afii10051", 0x0402, -"afii10052", 0x0403, -"afii10053", 0x0404, -"afii10054", 0x0405, -"afii10055", 0x0406, -"afii10056", 0x0407, -"afii10057", 0x0408, -"afii10058", 0x0409, -"afii10059", 0x040A, -"afii10060", 0x040B, -"afii10061", 0x040C, -"afii10062", 0x040E, -"afii10063", 0xF6C4, -"afii10064", 0xF6C5, -"afii10065", 0x0430, -"afii10066", 0x0431, -"afii10067", 0x0432, -"afii10068", 0x0433, -"afii10069", 0x0434, -"afii10070", 0x0435, -"afii10071", 0x0451, -"afii10072", 0x0436, -"afii10073", 0x0437, -"afii10074", 0x0438, -"afii10075", 0x0439, -"afii10076", 0x043A, -"afii10077", 0x043B, -"afii10078", 0x043C, -"afii10079", 0x043D, -"afii10080", 0x043E, -"afii10081", 0x043F, -"afii10082", 0x0440, -"afii10083", 0x0441, -"afii10084", 0x0442, -"afii10085", 0x0443, -"afii10086", 0x0444, -"afii10087", 0x0445, -"afii10088", 0x0446, -"afii10089", 0x0447, -"afii10090", 0x0448, -"afii10091", 0x0449, -"afii10092", 0x044A, -"afii10093", 0x044B, -"afii10094", 0x044C, -"afii10095", 0x044D, -"afii10096", 0x044E, -"afii10097", 0x044F, -"afii10098", 0x0491, -"afii10099", 0x0452, -"afii10100", 0x0453, -"afii10101", 0x0454, -"afii10102", 0x0455, -"afii10103", 0x0456, -"afii10104", 0x0457, -"afii10105", 0x0458, -"afii10106", 0x0459, -"afii10107", 0x045A, -"afii10108", 0x045B, -"afii10109", 0x045C, -"afii10110", 0x045E, -"afii10145", 0x040F, -"afii10146", 0x0462, -"afii10147", 0x0472, -"afii10148", 0x0474, -"afii10192", 0xF6C6, -"afii10193", 0x045F, -"afii10194", 0x0463, -"afii10195", 0x0473, -"afii10196", 0x0475, -"afii10831", 0xF6C7, -"afii10832", 0xF6C8, -"afii10846", 0x04D9, -"afii299", 0x200E, -"afii300", 0x200F, -"afii301", 0x200D, -"afii57381", 0x066A, -"afii57388", 0x060C, -"afii57392", 0x0660, -"afii57393", 0x0661, -"afii57394", 0x0662, -"afii57395", 0x0663, -"afii57396", 0x0664, -"afii57397", 0x0665, -"afii57398", 0x0666, -"afii57399", 0x0667, -"afii57400", 0x0668, -"afii57401", 0x0669, -"afii57403", 0x061B, -"afii57407", 0x061F, -"afii57409", 0x0621, -"afii57410", 0x0622, -"afii57411", 0x0623, -"afii57412", 0x0624, -"afii57413", 0x0625, -"afii57414", 0x0626, -"afii57415", 0x0627, -"afii57416", 0x0628, -"afii57417", 0x0629, -"afii57418", 0x062A, -"afii57419", 0x062B, -"afii57420", 0x062C, -"afii57421", 0x062D, -"afii57422", 0x062E, -"afii57423", 0x062F, -"afii57424", 0x0630, -"afii57425", 0x0631, -"afii57426", 0x0632, -"afii57427", 0x0633, -"afii57428", 0x0634, -"afii57429", 0x0635, -"afii57430", 0x0636, -"afii57431", 0x0637, -"afii57432", 0x0638, -"afii57433", 0x0639, -"afii57434", 0x063A, -"afii57440", 0x0640, -"afii57441", 0x0641, -"afii57442", 0x0642, -"afii57443", 0x0643, -"afii57444", 0x0644, -"afii57445", 0x0645, -"afii57446", 0x0646, -"afii57448", 0x0648, -"afii57449", 0x0649, -"afii57450", 0x064A, -"afii57451", 0x064B, -"afii57452", 0x064C, -"afii57453", 0x064D, -"afii57454", 0x064E, -"afii57455", 0x064F, -"afii57456", 0x0650, -"afii57457", 0x0651, -"afii57458", 0x0652, -"afii57470", 0x0647, -"afii57505", 0x06A4, -"afii57506", 0x067E, -"afii57507", 0x0686, -"afii57508", 0x0698, -"afii57509", 0x06AF, -"afii57511", 0x0679, -"afii57512", 0x0688, -"afii57513", 0x0691, -"afii57514", 0x06BA, -"afii57519", 0x06D2, -"afii57534", 0x06D5, -"afii57636", 0x20AA, -"afii57645", 0x05BE, -"afii57658", 0x05C3, -"afii57664", 0x05D0, -"afii57665", 0x05D1, -"afii57666", 0x05D2, -"afii57667", 0x05D3, -"afii57668", 0x05D4, -"afii57669", 0x05D5, -"afii57670", 0x05D6, -"afii57671", 0x05D7, -"afii57672", 0x05D8, -"afii57673", 0x05D9, -"afii57674", 0x05DA, -"afii57675", 0x05DB, -"afii57676", 0x05DC, -"afii57677", 0x05DD, -"afii57678", 0x05DE, -"afii57679", 0x05DF, -"afii57680", 0x05E0, -"afii57681", 0x05E1, -"afii57682", 0x05E2, -"afii57683", 0x05E3, -"afii57684", 0x05E4, -"afii57685", 0x05E5, -"afii57686", 0x05E6, -"afii57687", 0x05E7, -"afii57688", 0x05E8, -"afii57689", 0x05E9, -"afii57690", 0x05EA, -"afii57694", 0xFB2A, -"afii57695", 0xFB2B, -"afii57700", 0xFB4B, -"afii57705", 0xFB1F, -"afii57716", 0x05F0, -"afii57717", 0x05F1, -"afii57718", 0x05F2, -"afii57723", 0xFB35, -"afii57793", 0x05B4, -"afii57794", 0x05B5, -"afii57795", 0x05B6, -"afii57796", 0x05BB, -"afii57797", 0x05B8, -"afii57798", 0x05B7, -"afii57799", 0x05B0, -"afii57800", 0x05B2, -"afii57801", 0x05B1, -"afii57802", 0x05B3, -"afii57803", 0x05C2, -"afii57804", 0x05C1, -"afii57806", 0x05B9, -"afii57807", 0x05BC, -"afii57839", 0x05BD, -"afii57841", 0x05BF, -"afii57842", 0x05C0, -"afii57929", 0x02BC, -"afii61248", 0x2105, -"afii61289", 0x2113, -"afii61352", 0x2116, -"afii61573", 0x202C, -"afii61574", 0x202D, -"afii61575", 0x202E, -"afii61664", 0x200C, -"afii63167", 0x066D, -"afii64937", 0x02BD, -"agrave", 0x00E0, -"agujarati", 0x0A85, -"agurmukhi", 0x0A05, -"ahiragana", 0x3042, -"ahookabove", 0x1EA3, -"aibengali", 0x0990, -"aibopomofo", 0x311E, -"aideva", 0x0910, -"aiecyrillic", 0x04D5, -"aigujarati", 0x0A90, -"aigurmukhi", 0x0A10, -"aimatragurmukhi", 0x0A48, -"ainarabic", 0x0639, -"ainfinalarabic", 0xFECA, -"aininitialarabic", 0xFECB, -"ainmedialarabic", 0xFECC, -"ainvertedbreve", 0x0203, -"aivowelsignbengali", 0x09C8, -"aivowelsigndeva", 0x0948, -"aivowelsigngujarati", 0x0AC8, -"akatakana", 0x30A2, -"akatakanahalfwidth", 0xFF71, -"akorean", 0x314F, -"alef", 0x05D0, -"alefarabic", 0x0627, -"alefdageshhebrew", 0xFB30, -"aleffinalarabic", 0xFE8E, -"alefhamzaabovearabic", 0x0623, -"alefhamzaabovefinalarabic", 0xFE84, -"alefhamzabelowarabic", 0x0625, -"alefhamzabelowfinalarabic", 0xFE88, -"alefhebrew", 0x05D0, -"aleflamedhebrew", 0xFB4F, -"alefmaddaabovearabic", 0x0622, -"alefmaddaabovefinalarabic", 0xFE82, -"alefmaksuraarabic", 0x0649, -"alefmaksurafinalarabic", 0xFEF0, -"alefmaksurainitialarabic", 0xFEF3, -"alefmaksuramedialarabic", 0xFEF4, -"alefpatahhebrew", 0xFB2E, -"alefqamatshebrew", 0xFB2F, -"aleph", 0x2135, -"allequal", 0x224C, -"alpha", 0x03B1, -"alphatonos", 0x03AC, -"amacron", 0x0101, -"amonospace", 0xFF41, -"ampersand", 0x0026, -"ampersandmonospace", 0xFF06, -"ampersandsmall", 0xF726, -"amsquare", 0x33C2, -"anbopomofo", 0x3122, -"angbopomofo", 0x3124, -"angkhankhuthai", 0x0E5A, -"angle", 0x2220, -"anglebracketleft", 0x3008, -"anglebracketleftvertical", 0xFE3F, -"anglebracketright", 0x3009, -"anglebracketrightvertical", 0xFE40, -"angleleft", 0x2329, -"angleright", 0x232A, -"angstrom", 0x212B, -"anoteleia", 0x0387, -"anudattadeva", 0x0952, -"anusvarabengali", 0x0982, -"anusvaradeva", 0x0902, -"anusvaragujarati", 0x0A82, -"aogonek", 0x0105, -"apaatosquare", 0x3300, -"aparen", 0x249C, -"apostrophearmenian", 0x055A, -"apostrophemod", 0x02BC, -"apple", 0xF8FF, -"approaches", 0x2250, -"approxequal", 0x2248, -"approxequalorimage", 0x2252, -"approximatelyequal", 0x2245, -"araeaekorean", 0x318E, -"araeakorean", 0x318D, -"arc", 0x2312, -"arighthalfring", 0x1E9A, -"aring", 0x00E5, -"aringacute", 0x01FB, -"aringbelow", 0x1E01, -"arrowboth", 0x2194, -"arrowdashdown", 0x21E3, -"arrowdashleft", 0x21E0, -"arrowdashright", 0x21E2, -"arrowdashup", 0x21E1, -"arrowdblboth", 0x21D4, -"arrowdbldown", 0x21D3, -"arrowdblleft", 0x21D0, -"arrowdblright", 0x21D2, -"arrowdblup", 0x21D1, -"arrowdown", 0x2193, -"arrowdownleft", 0x2199, -"arrowdownright", 0x2198, -"arrowdownwhite", 0x21E9, -"arrowheaddownmod", 0x02C5, -"arrowheadleftmod", 0x02C2, -"arrowheadrightmod", 0x02C3, -"arrowheadupmod", 0x02C4, -"arrowhorizex", 0xF8E7, -"arrowleft", 0x2190, -"arrowleftdbl", 0x21D0, -"arrowleftdblstroke", 0x21CD, -"arrowleftoverright", 0x21C6, -"arrowleftwhite", 0x21E6, -"arrowright", 0x2192, -"arrowrightdblstroke", 0x21CF, -"arrowrightheavy", 0x279E, -"arrowrightoverleft", 0x21C4, -"arrowrightwhite", 0x21E8, -"arrowtableft", 0x21E4, -"arrowtabright", 0x21E5, -"arrowup", 0x2191, -"arrowupdn", 0x2195, -"arrowupdnbse", 0x21A8, -"arrowupdownbase", 0x21A8, -"arrowupleft", 0x2196, -"arrowupleftofdown", 0x21C5, -"arrowupright", 0x2197, -"arrowupwhite", 0x21E7, -"arrowvertex", 0xF8E6, -"asciicircum", 0x005E, -"asciicircummonospace", 0xFF3E, -"asciitilde", 0x007E, -"asciitildemonospace", 0xFF5E, -"ascript", 0x0251, -"ascriptturned", 0x0252, -"asmallhiragana", 0x3041, -"asmallkatakana", 0x30A1, -"asmallkatakanahalfwidth", 0xFF67, -"asterisk", 0x002A, -"asteriskaltonearabic", 0x066D, -"asteriskarabic", 0x066D, -"asteriskmath", 0x2217, -"asteriskmonospace", 0xFF0A, -"asterisksmall", 0xFE61, -"asterism", 0x2042, -"asuperior", 0xF6E9, -"asymptoticallyequal", 0x2243, -"at", 0x0040, -"atilde", 0x00E3, -"atmonospace", 0xFF20, -"atsmall", 0xFE6B, -"aturned", 0x0250, -"aubengali", 0x0994, -"aubopomofo", 0x3120, -"audeva", 0x0914, -"augujarati", 0x0A94, -"augurmukhi", 0x0A14, -"aulengthmarkbengali", 0x09D7, -"aumatragurmukhi", 0x0A4C, -"auvowelsignbengali", 0x09CC, -"auvowelsigndeva", 0x094C, -"auvowelsigngujarati", 0x0ACC, -"avagrahadeva", 0x093D, -"aybarmenian", 0x0561, -"ayin", 0x05E2, -"ayinaltonehebrew", 0xFB20, -"ayinhebrew", 0x05E2, -"b", 0x0062, -"babengali", 0x09AC, -"backslash", 0x005C, -"backslashmonospace", 0xFF3C, -"badeva", 0x092C, -"bagujarati", 0x0AAC, -"bagurmukhi", 0x0A2C, -"bahiragana", 0x3070, -"bahtthai", 0x0E3F, -"bakatakana", 0x30D0, -"bar", 0x007C, -"barmonospace", 0xFF5C, -"bbopomofo", 0x3105, -"bcircle", 0x24D1, -"bdotaccent", 0x1E03, -"bdotbelow", 0x1E05, -"beamedsixteenthnotes", 0x266C, -"because", 0x2235, -"becyrillic", 0x0431, -"beharabic", 0x0628, -"behfinalarabic", 0xFE90, -"behinitialarabic", 0xFE91, -"behiragana", 0x3079, -"behmedialarabic", 0xFE92, -"behmeeminitialarabic", 0xFC9F, -"behmeemisolatedarabic", 0xFC08, -"behnoonfinalarabic", 0xFC6D, -"bekatakana", 0x30D9, -"benarmenian", 0x0562, -"bet", 0x05D1, -"beta", 0x03B2, -"betasymbolgreek", 0x03D0, -"betdagesh", 0xFB31, -"betdageshhebrew", 0xFB31, -"bethebrew", 0x05D1, -"betrafehebrew", 0xFB4C, -"bhabengali", 0x09AD, -"bhadeva", 0x092D, -"bhagujarati", 0x0AAD, -"bhagurmukhi", 0x0A2D, -"bhook", 0x0253, -"bihiragana", 0x3073, -"bikatakana", 0x30D3, -"bilabialclick", 0x0298, -"bindigurmukhi", 0x0A02, -"birusquare", 0x3331, -"blackcircle", 0x25CF, -"blackdiamond", 0x25C6, -"blackdownpointingtriangle", 0x25BC, -"blackleftpointingpointer", 0x25C4, -"blackleftpointingtriangle", 0x25C0, -"blacklenticularbracketleft", 0x3010, -"blacklenticularbracketleftvertical", 0xFE3B, -"blacklenticularbracketright", 0x3011, -"blacklenticularbracketrightvertical", 0xFE3C, -"blacklowerlefttriangle", 0x25E3, -"blacklowerrighttriangle", 0x25E2, -"blackrectangle", 0x25AC, -"blackrightpointingpointer", 0x25BA, -"blackrightpointingtriangle", 0x25B6, -"blacksmallsquare", 0x25AA, -"blacksmilingface", 0x263B, -"blacksquare", 0x25A0, -"blackstar", 0x2605, -"blackupperlefttriangle", 0x25E4, -"blackupperrighttriangle", 0x25E5, -"blackuppointingsmalltriangle", 0x25B4, -"blackuppointingtriangle", 0x25B2, -"blank", 0x2423, -"blinebelow", 0x1E07, -"block", 0x2588, -"bmonospace", 0xFF42, -"bobaimaithai", 0x0E1A, -"bohiragana", 0x307C, -"bokatakana", 0x30DC, -"bparen", 0x249D, -"bqsquare", 0x33C3, -"braceex", 0xF8F4, -"braceleft", 0x007B, -"braceleftbt", 0xF8F3, -"braceleftmid", 0xF8F2, -"braceleftmonospace", 0xFF5B, -"braceleftsmall", 0xFE5B, -"bracelefttp", 0xF8F1, -"braceleftvertical", 0xFE37, -"braceright", 0x007D, -"bracerightbt", 0xF8FE, -"bracerightmid", 0xF8FD, -"bracerightmonospace", 0xFF5D, -"bracerightsmall", 0xFE5C, -"bracerighttp", 0xF8FC, -"bracerightvertical", 0xFE38, -"bracketleft", 0x005B, -"bracketleftbt", 0xF8F0, -"bracketleftex", 0xF8EF, -"bracketleftmonospace", 0xFF3B, -"bracketlefttp", 0xF8EE, -"bracketright", 0x005D, -"bracketrightbt", 0xF8FB, -"bracketrightex", 0xF8FA, -"bracketrightmonospace", 0xFF3D, -"bracketrighttp", 0xF8F9, -"breve", 0x02D8, -"brevebelowcmb", 0x032E, -"brevecmb", 0x0306, -"breveinvertedbelowcmb", 0x032F, -"breveinvertedcmb", 0x0311, -"breveinverteddoublecmb", 0x0361, -"bridgebelowcmb", 0x032A, -"bridgeinvertedbelowcmb", 0x033A, -"brokenbar", 0x00A6, -"bstroke", 0x0180, -"bsuperior", 0xF6EA, -"btopbar", 0x0183, -"buhiragana", 0x3076, -"bukatakana", 0x30D6, -"bullet", 0x2022, -"bulletinverse", 0x25D8, -"bulletoperator", 0x2219, -"bullseye", 0x25CE, -"c", 0x0063, -"caarmenian", 0x056E, -"cabengali", 0x099A, -"cacute", 0x0107, -"cadeva", 0x091A, -"cagujarati", 0x0A9A, -"cagurmukhi", 0x0A1A, -"calsquare", 0x3388, -"candrabindubengali", 0x0981, -"candrabinducmb", 0x0310, -"candrabindudeva", 0x0901, -"candrabindugujarati", 0x0A81, -"capslock", 0x21EA, -"careof", 0x2105, -"caron", 0x02C7, -"caronbelowcmb", 0x032C, -"caroncmb", 0x030C, -"carriagereturn", 0x21B5, -"cbopomofo", 0x3118, -"ccaron", 0x010D, -"ccedilla", 0x00E7, -"ccedillaacute", 0x1E09, -"ccircle", 0x24D2, -"ccircumflex", 0x0109, -"ccurl", 0x0255, -"cdot", 0x010B, -"cdotaccent", 0x010B, -"cdsquare", 0x33C5, -"cedilla", 0x00B8, -"cedillacmb", 0x0327, -"cent", 0x00A2, -"centigrade", 0x2103, -"centinferior", 0xF6DF, -"centmonospace", 0xFFE0, -"centoldstyle", 0xF7A2, -"centsuperior", 0xF6E0, -"chaarmenian", 0x0579, -"chabengali", 0x099B, -"chadeva", 0x091B, -"chagujarati", 0x0A9B, -"chagurmukhi", 0x0A1B, -"chbopomofo", 0x3114, -"cheabkhasiancyrillic", 0x04BD, -"checkmark", 0x2713, -"checyrillic", 0x0447, -"chedescenderabkhasiancyrillic", 0x04BF, -"chedescendercyrillic", 0x04B7, -"chedieresiscyrillic", 0x04F5, -"cheharmenian", 0x0573, -"chekhakassiancyrillic", 0x04CC, -"cheverticalstrokecyrillic", 0x04B9, -"chi", 0x03C7, -"chieuchacirclekorean", 0x3277, -"chieuchaparenkorean", 0x3217, -"chieuchcirclekorean", 0x3269, -"chieuchkorean", 0x314A, -"chieuchparenkorean", 0x3209, -"chochangthai", 0x0E0A, -"chochanthai", 0x0E08, -"chochingthai", 0x0E09, -"chochoethai", 0x0E0C, -"chook", 0x0188, -"cieucacirclekorean", 0x3276, -"cieucaparenkorean", 0x3216, -"cieuccirclekorean", 0x3268, -"cieuckorean", 0x3148, -"cieucparenkorean", 0x3208, -"cieucuparenkorean", 0x321C, -"circle", 0x25CB, -"circlemultiply", 0x2297, -"circleot", 0x2299, -"circleplus", 0x2295, -"circlepostalmark", 0x3036, -"circlewithlefthalfblack", 0x25D0, -"circlewithrighthalfblack", 0x25D1, -"circumflex", 0x02C6, -"circumflexbelowcmb", 0x032D, -"circumflexcmb", 0x0302, -"clear", 0x2327, -"clickalveolar", 0x01C2, -"clickdental", 0x01C0, -"clicklateral", 0x01C1, -"clickretroflex", 0x01C3, -"club", 0x2663, -"clubsuitblack", 0x2663, -"clubsuitwhite", 0x2667, -"cmcubedsquare", 0x33A4, -"cmonospace", 0xFF43, -"cmsquaredsquare", 0x33A0, -"coarmenian", 0x0581, -"colon", 0x003A, -"colonmonetary", 0x20A1, -"colonmonospace", 0xFF1A, -"colonsign", 0x20A1, -"colonsmall", 0xFE55, -"colontriangularhalfmod", 0x02D1, -"colontriangularmod", 0x02D0, -"comma", 0x002C, -"commaabovecmb", 0x0313, -"commaaboverightcmb", 0x0315, -"commaaccent", 0xF6C3, -"commaarabic", 0x060C, -"commaarmenian", 0x055D, -"commainferior", 0xF6E1, -"commamonospace", 0xFF0C, -"commareversedabovecmb", 0x0314, -"commareversedmod", 0x02BD, -"commasmall", 0xFE50, -"commasuperior", 0xF6E2, -"commaturnedabovecmb", 0x0312, -"commaturnedmod", 0x02BB, -"compass", 0x263C, -"congruent", 0x2245, -"contourintegral", 0x222E, -"control", 0x2303, -"controlACK", 0x0006, -"controlBEL", 0x0007, -"controlBS", 0x0008, -"controlCAN", 0x0018, -"controlCR", 0x000D, -"controlDC1", 0x0011, -"controlDC2", 0x0012, -"controlDC3", 0x0013, -"controlDC4", 0x0014, -"controlDEL", 0x007F, -"controlDLE", 0x0010, -"controlEM", 0x0019, -"controlENQ", 0x0005, -"controlEOT", 0x0004, -"controlESC", 0x001B, -"controlETB", 0x0017, -"controlETX", 0x0003, -"controlFF", 0x000C, -"controlFS", 0x001C, -"controlGS", 0x001D, -"controlHT", 0x0009, -"controlLF", 0x000A, -"controlNAK", 0x0015, -"controlRS", 0x001E, -"controlSI", 0x000F, -"controlSO", 0x000E, -"controlSOT", 0x0002, -"controlSTX", 0x0001, -"controlSUB", 0x001A, -"controlSYN", 0x0016, -"controlUS", 0x001F, -"controlVT", 0x000B, -"copyright", 0x00A9, -"copyrightsans", 0xF8E9, -"copyrightserif", 0xF6D9, -"cornerbracketleft", 0x300C, -"cornerbracketlefthalfwidth", 0xFF62, -"cornerbracketleftvertical", 0xFE41, -"cornerbracketright", 0x300D, -"cornerbracketrighthalfwidth", 0xFF63, -"cornerbracketrightvertical", 0xFE42, -"corporationsquare", 0x337F, -"cosquare", 0x33C7, -"coverkgsquare", 0x33C6, -"cparen", 0x249E, -"cruzeiro", 0x20A2, -"cstretched", 0x0297, -"curlyand", 0x22CF, -"curlyor", 0x22CE, -"currency", 0x00A4, -"cyrBreve", 0xF6D1, -"cyrFlex", 0xF6D2, -"cyrbreve", 0xF6D4, -"cyrflex", 0xF6D5, -"d", 0x0064, -"daarmenian", 0x0564, -"dabengali", 0x09A6, -"dadarabic", 0x0636, -"dadeva", 0x0926, -"dadfinalarabic", 0xFEBE, -"dadinitialarabic", 0xFEBF, -"dadmedialarabic", 0xFEC0, -"dagesh", 0x05BC, -"dageshhebrew", 0x05BC, -"dagger", 0x2020, -"daggerdbl", 0x2021, -"dagujarati", 0x0AA6, -"dagurmukhi", 0x0A26, -"dahiragana", 0x3060, -"dakatakana", 0x30C0, -"dalarabic", 0x062F, -"dalet", 0x05D3, -"daletdagesh", 0xFB33, -"daletdageshhebrew", 0xFB33, -"dalethebrew", 0x05D3, -"dalfinalarabic", 0xFEAA, -"dammaarabic", 0x064F, -"dammalowarabic", 0x064F, -"dammatanaltonearabic", 0x064C, -"dammatanarabic", 0x064C, -"danda", 0x0964, -"dargahebrew", 0x05A7, -"dargalefthebrew", 0x05A7, -"dasiapneumatacyrilliccmb", 0x0485, -"dblGrave", 0xF6D3, -"dblanglebracketleft", 0x300A, -"dblanglebracketleftvertical", 0xFE3D, -"dblanglebracketright", 0x300B, -"dblanglebracketrightvertical", 0xFE3E, -"dblarchinvertedbelowcmb", 0x032B, -"dblarrowleft", 0x21D4, -"dblarrowright", 0x21D2, -"dbldanda", 0x0965, -"dblgrave", 0xF6D6, -"dblgravecmb", 0x030F, -"dblintegral", 0x222C, -"dbllowline", 0x2017, -"dbllowlinecmb", 0x0333, -"dbloverlinecmb", 0x033F, -"dblprimemod", 0x02BA, -"dblverticalbar", 0x2016, -"dblverticallineabovecmb", 0x030E, -"dbopomofo", 0x3109, -"dbsquare", 0x33C8, -"dcaron", 0x010F, -"dcedilla", 0x1E11, -"dcircle", 0x24D3, -"dcircumflexbelow", 0x1E13, -"dcroat", 0x0111, -"ddabengali", 0x09A1, -"ddadeva", 0x0921, -"ddagujarati", 0x0AA1, -"ddagurmukhi", 0x0A21, -"ddalarabic", 0x0688, -"ddalfinalarabic", 0xFB89, -"dddhadeva", 0x095C, -"ddhabengali", 0x09A2, -"ddhadeva", 0x0922, -"ddhagujarati", 0x0AA2, -"ddhagurmukhi", 0x0A22, -"ddotaccent", 0x1E0B, -"ddotbelow", 0x1E0D, -"decimalseparatorarabic", 0x066B, -"decimalseparatorpersian", 0x066B, -"decyrillic", 0x0434, -"degree", 0x00B0, -"dehihebrew", 0x05AD, -"dehiragana", 0x3067, -"deicoptic", 0x03EF, -"dekatakana", 0x30C7, -"deleteleft", 0x232B, -"deleteright", 0x2326, -"delta", 0x03B4, -"deltaturned", 0x018D, -"denominatorminusonenumeratorbengali", 0x09F8, -"dezh", 0x02A4, -"dhabengali", 0x09A7, -"dhadeva", 0x0927, -"dhagujarati", 0x0AA7, -"dhagurmukhi", 0x0A27, -"dhook", 0x0257, -"dialytikatonos", 0x0385, -"dialytikatonoscmb", 0x0344, -"diamond", 0x2666, -"diamondsuitwhite", 0x2662, -"dieresis", 0x00A8, -"dieresisacute", 0xF6D7, -"dieresisbelowcmb", 0x0324, -"dieresiscmb", 0x0308, -"dieresisgrave", 0xF6D8, -"dieresistonos", 0x0385, -"dihiragana", 0x3062, -"dikatakana", 0x30C2, -"dittomark", 0x3003, -"divide", 0x00F7, -"divides", 0x2223, -"divisionslash", 0x2215, -"djecyrillic", 0x0452, -"dkshade", 0x2593, -"dlinebelow", 0x1E0F, -"dlsquare", 0x3397, -"dmacron", 0x0111, -"dmonospace", 0xFF44, -"dnblock", 0x2584, -"dochadathai", 0x0E0E, -"dodekthai", 0x0E14, -"dohiragana", 0x3069, -"dokatakana", 0x30C9, -"dollar", 0x0024, -"dollarinferior", 0xF6E3, -"dollarmonospace", 0xFF04, -"dollaroldstyle", 0xF724, -"dollarsmall", 0xFE69, -"dollarsuperior", 0xF6E4, -"dong", 0x20AB, -"dorusquare", 0x3326, -"dotaccent", 0x02D9, -"dotaccentcmb", 0x0307, -"dotbelowcmb", 0x0323, -"dotbelowcomb", 0x0323, -"dotkatakana", 0x30FB, -"dotlessi", 0x0131, -"dotlessj", 0xF6BE, -"dotlessjstrokehook", 0x0284, -"dotmath", 0x22C5, -"dottedcircle", 0x25CC, -"doubleyodpatah", 0xFB1F, -"doubleyodpatahhebrew", 0xFB1F, -"downtackbelowcmb", 0x031E, -"downtackmod", 0x02D5, -"dparen", 0x249F, -"dsuperior", 0xF6EB, -"dtail", 0x0256, -"dtopbar", 0x018C, -"duhiragana", 0x3065, -"dukatakana", 0x30C5, -"dz", 0x01F3, -"dzaltone", 0x02A3, -"dzcaron", 0x01C6, -"dzcurl", 0x02A5, -"dzeabkhasiancyrillic", 0x04E1, -"dzecyrillic", 0x0455, -"dzhecyrillic", 0x045F, -"e", 0x0065, -"eacute", 0x00E9, -"earth", 0x2641, -"ebengali", 0x098F, -"ebopomofo", 0x311C, -"ebreve", 0x0115, -"ecandradeva", 0x090D, -"ecandragujarati", 0x0A8D, -"ecandravowelsigndeva", 0x0945, -"ecandravowelsigngujarati", 0x0AC5, -"ecaron", 0x011B, -"ecedillabreve", 0x1E1D, -"echarmenian", 0x0565, -"echyiwnarmenian", 0x0587, -"ecircle", 0x24D4, -"ecircumflex", 0x00EA, -"ecircumflexacute", 0x1EBF, -"ecircumflexbelow", 0x1E19, -"ecircumflexdotbelow", 0x1EC7, -"ecircumflexgrave", 0x1EC1, -"ecircumflexhookabove", 0x1EC3, -"ecircumflextilde", 0x1EC5, -"ecyrillic", 0x0454, -"edblgrave", 0x0205, -"edeva", 0x090F, -"edieresis", 0x00EB, -"edot", 0x0117, -"edotaccent", 0x0117, -"edotbelow", 0x1EB9, -"eegurmukhi", 0x0A0F, -"eematragurmukhi", 0x0A47, -"efcyrillic", 0x0444, -"egrave", 0x00E8, -"egujarati", 0x0A8F, -"eharmenian", 0x0567, -"ehbopomofo", 0x311D, -"ehiragana", 0x3048, -"ehookabove", 0x1EBB, -"eibopomofo", 0x311F, -"eight", 0x0038, -"eightarabic", 0x0668, -"eightbengali", 0x09EE, -"eightcircle", 0x2467, -"eightcircleinversesansserif", 0x2791, -"eightdeva", 0x096E, -"eighteencircle", 0x2471, -"eighteenparen", 0x2485, -"eighteenperiod", 0x2499, -"eightgujarati", 0x0AEE, -"eightgurmukhi", 0x0A6E, -"eighthackarabic", 0x0668, -"eighthangzhou", 0x3028, -"eighthnotebeamed", 0x266B, -"eightideographicparen", 0x3227, -"eightinferior", 0x2088, -"eightmonospace", 0xFF18, -"eightoldstyle", 0xF738, -"eightparen", 0x247B, -"eightperiod", 0x248F, -"eightpersian", 0x06F8, -"eightroman", 0x2177, -"eightsuperior", 0x2078, -"eightthai", 0x0E58, -"einvertedbreve", 0x0207, -"eiotifiedcyrillic", 0x0465, -"ekatakana", 0x30A8, -"ekatakanahalfwidth", 0xFF74, -"ekonkargurmukhi", 0x0A74, -"ekorean", 0x3154, -"elcyrillic", 0x043B, -"element", 0x2208, -"elevencircle", 0x246A, -"elevenparen", 0x247E, -"elevenperiod", 0x2492, -"elevenroman", 0x217A, -"ellipsis", 0x2026, -"ellipsisvertical", 0x22EE, -"emacron", 0x0113, -"emacronacute", 0x1E17, -"emacrongrave", 0x1E15, -"emcyrillic", 0x043C, -"emdash", 0x2014, -"emdashvertical", 0xFE31, -"emonospace", 0xFF45, -"emphasismarkarmenian", 0x055B, -"emptyset", 0x2205, -"enbopomofo", 0x3123, -"encyrillic", 0x043D, -"endash", 0x2013, -"endashvertical", 0xFE32, -"endescendercyrillic", 0x04A3, -"eng", 0x014B, -"engbopomofo", 0x3125, -"enghecyrillic", 0x04A5, -"enhookcyrillic", 0x04C8, -"enspace", 0x2002, -"eogonek", 0x0119, -"eokorean", 0x3153, -"eopen", 0x025B, -"eopenclosed", 0x029A, -"eopenreversed", 0x025C, -"eopenreversedclosed", 0x025E, -"eopenreversedhook", 0x025D, -"eparen", 0x24A0, -"epsilon", 0x03B5, -"epsilontonos", 0x03AD, -"equal", 0x003D, -"equalmonospace", 0xFF1D, -"equalsmall", 0xFE66, -"equalsuperior", 0x207C, -"equivalence", 0x2261, -"erbopomofo", 0x3126, -"ercyrillic", 0x0440, -"ereversed", 0x0258, -"ereversedcyrillic", 0x044D, -"escyrillic", 0x0441, -"esdescendercyrillic", 0x04AB, -"esh", 0x0283, -"eshcurl", 0x0286, -"eshortdeva", 0x090E, -"eshortvowelsigndeva", 0x0946, -"eshreversedloop", 0x01AA, -"eshsquatreversed", 0x0285, -"esmallhiragana", 0x3047, -"esmallkatakana", 0x30A7, -"esmallkatakanahalfwidth", 0xFF6A, -"estimated", 0x212E, -"esuperior", 0xF6EC, -"eta", 0x03B7, -"etarmenian", 0x0568, -"etatonos", 0x03AE, -"eth", 0x00F0, -"etilde", 0x1EBD, -"etildebelow", 0x1E1B, -"etnahtafoukhhebrew", 0x0591, -"etnahtafoukhlefthebrew", 0x0591, -"etnahtahebrew", 0x0591, -"etnahtalefthebrew", 0x0591, -"eturned", 0x01DD, -"eukorean", 0x3161, -"euro", 0x20AC, -"evowelsignbengali", 0x09C7, -"evowelsigndeva", 0x0947, -"evowelsigngujarati", 0x0AC7, -"exclam", 0x0021, -"exclamarmenian", 0x055C, -"exclamdbl", 0x203C, -"exclamdown", 0x00A1, -"exclamdownsmall", 0xF7A1, -"exclammonospace", 0xFF01, -"exclamsmall", 0xF721, -"existential", 0x2203, -"ezh", 0x0292, -"ezhcaron", 0x01EF, -"ezhcurl", 0x0293, -"ezhreversed", 0x01B9, -"ezhtail", 0x01BA, -"f", 0x0066, -"fadeva", 0x095E, -"fagurmukhi", 0x0A5E, -"fahrenheit", 0x2109, -"fathaarabic", 0x064E, -"fathalowarabic", 0x064E, -"fathatanarabic", 0x064B, -"fbopomofo", 0x3108, -"fcircle", 0x24D5, -"fdotaccent", 0x1E1F, -"feharabic", 0x0641, -"feharmenian", 0x0586, -"fehfinalarabic", 0xFED2, -"fehinitialarabic", 0xFED3, -"fehmedialarabic", 0xFED4, -"feicoptic", 0x03E5, -"female", 0x2640, -"ff", 0xFB00, -"ffi", 0xFB03, -"ffl", 0xFB04, -"fi", 0xFB01, -"fifteencircle", 0x246E, -"fifteenparen", 0x2482, -"fifteenperiod", 0x2496, -"figuredash", 0x2012, -"filledbox", 0x25A0, -"filledrect", 0x25AC, -"finalkaf", 0x05DA, -"finalkafdagesh", 0xFB3A, -"finalkafdageshhebrew", 0xFB3A, -"finalkafhebrew", 0x05DA, -"finalmem", 0x05DD, -"finalmemhebrew", 0x05DD, -"finalnun", 0x05DF, -"finalnunhebrew", 0x05DF, -"finalpe", 0x05E3, -"finalpehebrew", 0x05E3, -"finaltsadi", 0x05E5, -"finaltsadihebrew", 0x05E5, -"firsttonechinese", 0x02C9, -"fisheye", 0x25C9, -"fitacyrillic", 0x0473, -"five", 0x0035, -"fivearabic", 0x0665, -"fivebengali", 0x09EB, -"fivecircle", 0x2464, -"fivecircleinversesansserif", 0x278E, -"fivedeva", 0x096B, -"fiveeighths", 0x215D, -"fivegujarati", 0x0AEB, -"fivegurmukhi", 0x0A6B, -"fivehackarabic", 0x0665, -"fivehangzhou", 0x3025, -"fiveideographicparen", 0x3224, -"fiveinferior", 0x2085, -"fivemonospace", 0xFF15, -"fiveoldstyle", 0xF735, -"fiveparen", 0x2478, -"fiveperiod", 0x248C, -"fivepersian", 0x06F5, -"fiveroman", 0x2174, -"fivesuperior", 0x2075, -"fivethai", 0x0E55, -"fl", 0xFB02, -"florin", 0x0192, -"fmonospace", 0xFF46, -"fmsquare", 0x3399, -"fofanthai", 0x0E1F, -"fofathai", 0x0E1D, -"fongmanthai", 0x0E4F, -"forall", 0x2200, -"four", 0x0034, -"fourarabic", 0x0664, -"fourbengali", 0x09EA, -"fourcircle", 0x2463, -"fourcircleinversesansserif", 0x278D, -"fourdeva", 0x096A, -"fourgujarati", 0x0AEA, -"fourgurmukhi", 0x0A6A, -"fourhackarabic", 0x0664, -"fourhangzhou", 0x3024, -"fourideographicparen", 0x3223, -"fourinferior", 0x2084, -"fourmonospace", 0xFF14, -"fournumeratorbengali", 0x09F7, -"fouroldstyle", 0xF734, -"fourparen", 0x2477, -"fourperiod", 0x248B, -"fourpersian", 0x06F4, -"fourroman", 0x2173, -"foursuperior", 0x2074, -"fourteencircle", 0x246D, -"fourteenparen", 0x2481, -"fourteenperiod", 0x2495, -"fourthai", 0x0E54, -"fourthtonechinese", 0x02CB, -"fparen", 0x24A1, -"fraction", 0x2044, -"franc", 0x20A3, -"g", 0x0067, -"gabengali", 0x0997, -"gacute", 0x01F5, -"gadeva", 0x0917, -"gafarabic", 0x06AF, -"gaffinalarabic", 0xFB93, -"gafinitialarabic", 0xFB94, -"gafmedialarabic", 0xFB95, -"gagujarati", 0x0A97, -"gagurmukhi", 0x0A17, -"gahiragana", 0x304C, -"gakatakana", 0x30AC, -"gamma", 0x03B3, -"gammalatinsmall", 0x0263, -"gammasuperior", 0x02E0, -"gangiacoptic", 0x03EB, -"gbopomofo", 0x310D, -"gbreve", 0x011F, -"gcaron", 0x01E7, -"gcedilla", 0x0123, -"gcircle", 0x24D6, -"gcircumflex", 0x011D, -"gcommaaccent", 0x0123, -"gdot", 0x0121, -"gdotaccent", 0x0121, -"gecyrillic", 0x0433, -"gehiragana", 0x3052, -"gekatakana", 0x30B2, -"geometricallyequal", 0x2251, -"gereshaccenthebrew", 0x059C, -"gereshhebrew", 0x05F3, -"gereshmuqdamhebrew", 0x059D, -"germandbls", 0x00DF, -"gershayimaccenthebrew", 0x059E, -"gershayimhebrew", 0x05F4, -"getamark", 0x3013, -"ghabengali", 0x0998, -"ghadarmenian", 0x0572, -"ghadeva", 0x0918, -"ghagujarati", 0x0A98, -"ghagurmukhi", 0x0A18, -"ghainarabic", 0x063A, -"ghainfinalarabic", 0xFECE, -"ghaininitialarabic", 0xFECF, -"ghainmedialarabic", 0xFED0, -"ghemiddlehookcyrillic", 0x0495, -"ghestrokecyrillic", 0x0493, -"gheupturncyrillic", 0x0491, -"ghhadeva", 0x095A, -"ghhagurmukhi", 0x0A5A, -"ghook", 0x0260, -"ghzsquare", 0x3393, -"gihiragana", 0x304E, -"gikatakana", 0x30AE, -"gimarmenian", 0x0563, -"gimel", 0x05D2, -"gimeldagesh", 0xFB32, -"gimeldageshhebrew", 0xFB32, -"gimelhebrew", 0x05D2, -"gjecyrillic", 0x0453, -"glottalinvertedstroke", 0x01BE, -"glottalstop", 0x0294, -"glottalstopinverted", 0x0296, -"glottalstopmod", 0x02C0, -"glottalstopreversed", 0x0295, -"glottalstopreversedmod", 0x02C1, -"glottalstopreversedsuperior", 0x02E4, -"glottalstopstroke", 0x02A1, -"glottalstopstrokereversed", 0x02A2, -"gmacron", 0x1E21, -"gmonospace", 0xFF47, -"gohiragana", 0x3054, -"gokatakana", 0x30B4, -"gparen", 0x24A2, -"gpasquare", 0x33AC, -"gradient", 0x2207, -"grave", 0x0060, -"gravebelowcmb", 0x0316, -"gravecmb", 0x0300, -"gravecomb", 0x0300, -"gravedeva", 0x0953, -"gravelowmod", 0x02CE, -"gravemonospace", 0xFF40, -"gravetonecmb", 0x0340, -"greater", 0x003E, -"greaterequal", 0x2265, -"greaterequalorless", 0x22DB, -"greatermonospace", 0xFF1E, -"greaterorequivalent", 0x2273, -"greaterorless", 0x2277, -"greateroverequal", 0x2267, -"greatersmall", 0xFE65, -"gscript", 0x0261, -"gstroke", 0x01E5, -"guhiragana", 0x3050, -"guillemotleft", 0x00AB, -"guillemotright", 0x00BB, -"guilsinglleft", 0x2039, -"guilsinglright", 0x203A, -"gukatakana", 0x30B0, -"guramusquare", 0x3318, -"gysquare", 0x33C9, -"h", 0x0068, -"haabkhasiancyrillic", 0x04A9, -"haaltonearabic", 0x06C1, -"habengali", 0x09B9, -"hadescendercyrillic", 0x04B3, -"hadeva", 0x0939, -"hagujarati", 0x0AB9, -"hagurmukhi", 0x0A39, -"haharabic", 0x062D, -"hahfinalarabic", 0xFEA2, -"hahinitialarabic", 0xFEA3, -"hahiragana", 0x306F, -"hahmedialarabic", 0xFEA4, -"haitusquare", 0x332A, -"hakatakana", 0x30CF, -"hakatakanahalfwidth", 0xFF8A, -"halantgurmukhi", 0x0A4D, -"hamzaarabic", 0x0621, -"hamzalowarabic", 0x0621, -"hangulfiller", 0x3164, -"hardsigncyrillic", 0x044A, -"harpoonleftbarbup", 0x21BC, -"harpoonrightbarbup", 0x21C0, -"hasquare", 0x33CA, -"hatafpatah", 0x05B2, -"hatafpatah16", 0x05B2, -"hatafpatah23", 0x05B2, -"hatafpatah2f", 0x05B2, -"hatafpatahhebrew", 0x05B2, -"hatafpatahnarrowhebrew", 0x05B2, -"hatafpatahquarterhebrew", 0x05B2, -"hatafpatahwidehebrew", 0x05B2, -"hatafqamats", 0x05B3, -"hatafqamats1b", 0x05B3, -"hatafqamats28", 0x05B3, -"hatafqamats34", 0x05B3, -"hatafqamatshebrew", 0x05B3, -"hatafqamatsnarrowhebrew", 0x05B3, -"hatafqamatsquarterhebrew", 0x05B3, -"hatafqamatswidehebrew", 0x05B3, -"hatafsegol", 0x05B1, -"hatafsegol17", 0x05B1, -"hatafsegol24", 0x05B1, -"hatafsegol30", 0x05B1, -"hatafsegolhebrew", 0x05B1, -"hatafsegolnarrowhebrew", 0x05B1, -"hatafsegolquarterhebrew", 0x05B1, -"hatafsegolwidehebrew", 0x05B1, -"hbar", 0x0127, -"hbopomofo", 0x310F, -"hbrevebelow", 0x1E2B, -"hcedilla", 0x1E29, -"hcircle", 0x24D7, -"hcircumflex", 0x0125, -"hdieresis", 0x1E27, -"hdotaccent", 0x1E23, -"hdotbelow", 0x1E25, -"he", 0x05D4, -"heart", 0x2665, -"heartsuitblack", 0x2665, -"heartsuitwhite", 0x2661, -"hedagesh", 0xFB34, -"hedageshhebrew", 0xFB34, -"hehaltonearabic", 0x06C1, -"heharabic", 0x0647, -"hehebrew", 0x05D4, -"hehfinalaltonearabic", 0xFBA7, -"hehfinalalttwoarabic", 0xFEEA, -"hehfinalarabic", 0xFEEA, -"hehhamzaabovefinalarabic", 0xFBA5, -"hehhamzaaboveisolatedarabic", 0xFBA4, -"hehinitialaltonearabic", 0xFBA8, -"hehinitialarabic", 0xFEEB, -"hehiragana", 0x3078, -"hehmedialaltonearabic", 0xFBA9, -"hehmedialarabic", 0xFEEC, -"heiseierasquare", 0x337B, -"hekatakana", 0x30D8, -"hekatakanahalfwidth", 0xFF8D, -"hekutaarusquare", 0x3336, -"henghook", 0x0267, -"herutusquare", 0x3339, -"het", 0x05D7, -"hethebrew", 0x05D7, -"hhook", 0x0266, -"hhooksuperior", 0x02B1, -"hieuhacirclekorean", 0x327B, -"hieuhaparenkorean", 0x321B, -"hieuhcirclekorean", 0x326D, -"hieuhkorean", 0x314E, -"hieuhparenkorean", 0x320D, -"hihiragana", 0x3072, -"hikatakana", 0x30D2, -"hikatakanahalfwidth", 0xFF8B, -"hiriq", 0x05B4, -"hiriq14", 0x05B4, -"hiriq21", 0x05B4, -"hiriq2d", 0x05B4, -"hiriqhebrew", 0x05B4, -"hiriqnarrowhebrew", 0x05B4, -"hiriqquarterhebrew", 0x05B4, -"hiriqwidehebrew", 0x05B4, -"hlinebelow", 0x1E96, -"hmonospace", 0xFF48, -"hoarmenian", 0x0570, -"hohipthai", 0x0E2B, -"hohiragana", 0x307B, -"hokatakana", 0x30DB, -"hokatakanahalfwidth", 0xFF8E, -"holam", 0x05B9, -"holam19", 0x05B9, -"holam26", 0x05B9, -"holam32", 0x05B9, -"holamhebrew", 0x05B9, -"holamnarrowhebrew", 0x05B9, -"holamquarterhebrew", 0x05B9, -"holamwidehebrew", 0x05B9, -"honokhukthai", 0x0E2E, -"hookabovecomb", 0x0309, -"hookcmb", 0x0309, -"hookpalatalizedbelowcmb", 0x0321, -"hookretroflexbelowcmb", 0x0322, -"hoonsquare", 0x3342, -"horicoptic", 0x03E9, -"horizontalbar", 0x2015, -"horncmb", 0x031B, -"hotsprings", 0x2668, -"house", 0x2302, -"hparen", 0x24A3, -"hsuperior", 0x02B0, -"hturned", 0x0265, -"huhiragana", 0x3075, -"huiitosquare", 0x3333, -"hukatakana", 0x30D5, -"hukatakanahalfwidth", 0xFF8C, -"hungarumlaut", 0x02DD, -"hungarumlautcmb", 0x030B, -"hv", 0x0195, -"hyphen", 0x002D, -"hypheninferior", 0xF6E5, -"hyphenmonospace", 0xFF0D, -"hyphensmall", 0xFE63, -"hyphensuperior", 0xF6E6, -"hyphentwo", 0x2010, -"i", 0x0069, -"iacute", 0x00ED, -"iacyrillic", 0x044F, -"ibengali", 0x0987, -"ibopomofo", 0x3127, -"ibreve", 0x012D, -"icaron", 0x01D0, -"icircle", 0x24D8, -"icircumflex", 0x00EE, -"icyrillic", 0x0456, -"idblgrave", 0x0209, -"ideographearthcircle", 0x328F, -"ideographfirecircle", 0x328B, -"ideographicallianceparen", 0x323F, -"ideographiccallparen", 0x323A, -"ideographiccentrecircle", 0x32A5, -"ideographicclose", 0x3006, -"ideographiccomma", 0x3001, -"ideographiccommaleft", 0xFF64, -"ideographiccongratulationparen", 0x3237, -"ideographiccorrectcircle", 0x32A3, -"ideographicearthparen", 0x322F, -"ideographicenterpriseparen", 0x323D, -"ideographicexcellentcircle", 0x329D, -"ideographicfestivalparen", 0x3240, -"ideographicfinancialcircle", 0x3296, -"ideographicfinancialparen", 0x3236, -"ideographicfireparen", 0x322B, -"ideographichaveparen", 0x3232, -"ideographichighcircle", 0x32A4, -"ideographiciterationmark", 0x3005, -"ideographiclaborcircle", 0x3298, -"ideographiclaborparen", 0x3238, -"ideographicleftcircle", 0x32A7, -"ideographiclowcircle", 0x32A6, -"ideographicmedicinecircle", 0x32A9, -"ideographicmetalparen", 0x322E, -"ideographicmoonparen", 0x322A, -"ideographicnameparen", 0x3234, -"ideographicperiod", 0x3002, -"ideographicprintcircle", 0x329E, -"ideographicreachparen", 0x3243, -"ideographicrepresentparen", 0x3239, -"ideographicresourceparen", 0x323E, -"ideographicrightcircle", 0x32A8, -"ideographicsecretcircle", 0x3299, -"ideographicselfparen", 0x3242, -"ideographicsocietyparen", 0x3233, -"ideographicspace", 0x3000, -"ideographicspecialparen", 0x3235, -"ideographicstockparen", 0x3231, -"ideographicstudyparen", 0x323B, -"ideographicsunparen", 0x3230, -"ideographicsuperviseparen", 0x323C, -"ideographicwaterparen", 0x322C, -"ideographicwoodparen", 0x322D, -"ideographiczero", 0x3007, -"ideographmetalcircle", 0x328E, -"ideographmooncircle", 0x328A, -"ideographnamecircle", 0x3294, -"ideographsuncircle", 0x3290, -"ideographwatercircle", 0x328C, -"ideographwoodcircle", 0x328D, -"ideva", 0x0907, -"idieresis", 0x00EF, -"idieresisacute", 0x1E2F, -"idieresiscyrillic", 0x04E5, -"idotbelow", 0x1ECB, -"iebrevecyrillic", 0x04D7, -"iecyrillic", 0x0435, -"ieungacirclekorean", 0x3275, -"ieungaparenkorean", 0x3215, -"ieungcirclekorean", 0x3267, -"ieungkorean", 0x3147, -"ieungparenkorean", 0x3207, -"igrave", 0x00EC, -"igujarati", 0x0A87, -"igurmukhi", 0x0A07, -"ihiragana", 0x3044, -"ihookabove", 0x1EC9, -"iibengali", 0x0988, -"iicyrillic", 0x0438, -"iideva", 0x0908, -"iigujarati", 0x0A88, -"iigurmukhi", 0x0A08, -"iimatragurmukhi", 0x0A40, -"iinvertedbreve", 0x020B, -"iishortcyrillic", 0x0439, -"iivowelsignbengali", 0x09C0, -"iivowelsigndeva", 0x0940, -"iivowelsigngujarati", 0x0AC0, -"ij", 0x0133, -"ikatakana", 0x30A4, -"ikatakanahalfwidth", 0xFF72, -"ikorean", 0x3163, -"ilde", 0x02DC, -"iluyhebrew", 0x05AC, -"imacron", 0x012B, -"imacroncyrillic", 0x04E3, -"imageorapproximatelyequal", 0x2253, -"imatragurmukhi", 0x0A3F, -"imonospace", 0xFF49, -"increment", 0x2206, -"infinity", 0x221E, -"iniarmenian", 0x056B, -"integral", 0x222B, -"integralbottom", 0x2321, -"integralbt", 0x2321, -"integralex", 0xF8F5, -"integraltop", 0x2320, -"integraltp", 0x2320, -"intersection", 0x2229, -"intisquare", 0x3305, -"invbullet", 0x25D8, -"invcircle", 0x25D9, -"invsmileface", 0x263B, -"iocyrillic", 0x0451, -"iogonek", 0x012F, -"iota", 0x03B9, -"iotadieresis", 0x03CA, -"iotadieresistonos", 0x0390, -"iotalatin", 0x0269, -"iotatonos", 0x03AF, -"iparen", 0x24A4, -"irigurmukhi", 0x0A72, -"ismallhiragana", 0x3043, -"ismallkatakana", 0x30A3, -"ismallkatakanahalfwidth", 0xFF68, -"issharbengali", 0x09FA, -"istroke", 0x0268, -"isuperior", 0xF6ED, -"iterationhiragana", 0x309D, -"iterationkatakana", 0x30FD, -"itilde", 0x0129, -"itildebelow", 0x1E2D, -"iubopomofo", 0x3129, -"iucyrillic", 0x044E, -"ivowelsignbengali", 0x09BF, -"ivowelsigndeva", 0x093F, -"ivowelsigngujarati", 0x0ABF, -"izhitsacyrillic", 0x0475, -"izhitsadblgravecyrillic", 0x0477, -"j", 0x006A, -"jaarmenian", 0x0571, -"jabengali", 0x099C, -"jadeva", 0x091C, -"jagujarati", 0x0A9C, -"jagurmukhi", 0x0A1C, -"jbopomofo", 0x3110, -"jcaron", 0x01F0, -"jcircle", 0x24D9, -"jcircumflex", 0x0135, -"jcrossedtail", 0x029D, -"jdotlessstroke", 0x025F, -"jecyrillic", 0x0458, -"jeemarabic", 0x062C, -"jeemfinalarabic", 0xFE9E, -"jeeminitialarabic", 0xFE9F, -"jeemmedialarabic", 0xFEA0, -"jeharabic", 0x0698, -"jehfinalarabic", 0xFB8B, -"jhabengali", 0x099D, -"jhadeva", 0x091D, -"jhagujarati", 0x0A9D, -"jhagurmukhi", 0x0A1D, -"jheharmenian", 0x057B, -"jis", 0x3004, -"jmonospace", 0xFF4A, -"jparen", 0x24A5, -"jsuperior", 0x02B2, -"k", 0x006B, -"kabashkircyrillic", 0x04A1, -"kabengali", 0x0995, -"kacute", 0x1E31, -"kacyrillic", 0x043A, -"kadescendercyrillic", 0x049B, -"kadeva", 0x0915, -"kaf", 0x05DB, -"kafarabic", 0x0643, -"kafdagesh", 0xFB3B, -"kafdageshhebrew", 0xFB3B, -"kaffinalarabic", 0xFEDA, -"kafhebrew", 0x05DB, -"kafinitialarabic", 0xFEDB, -"kafmedialarabic", 0xFEDC, -"kafrafehebrew", 0xFB4D, -"kagujarati", 0x0A95, -"kagurmukhi", 0x0A15, -"kahiragana", 0x304B, -"kahookcyrillic", 0x04C4, -"kakatakana", 0x30AB, -"kakatakanahalfwidth", 0xFF76, -"kappa", 0x03BA, -"kappasymbolgreek", 0x03F0, -"kapyeounmieumkorean", 0x3171, -"kapyeounphieuphkorean", 0x3184, -"kapyeounpieupkorean", 0x3178, -"kapyeounssangpieupkorean", 0x3179, -"karoriisquare", 0x330D, -"kashidaautoarabic", 0x0640, -"kashidaautonosidebearingarabic", 0x0640, -"kasmallkatakana", 0x30F5, -"kasquare", 0x3384, -"kasraarabic", 0x0650, -"kasratanarabic", 0x064D, -"kastrokecyrillic", 0x049F, -"katahiraprolongmarkhalfwidth", 0xFF70, -"kaverticalstrokecyrillic", 0x049D, -"kbopomofo", 0x310E, -"kcalsquare", 0x3389, -"kcaron", 0x01E9, -"kcedilla", 0x0137, -"kcircle", 0x24DA, -"kcommaaccent", 0x0137, -"kdotbelow", 0x1E33, -"keharmenian", 0x0584, -"kehiragana", 0x3051, -"kekatakana", 0x30B1, -"kekatakanahalfwidth", 0xFF79, -"kenarmenian", 0x056F, -"kesmallkatakana", 0x30F6, -"kgreenlandic", 0x0138, -"khabengali", 0x0996, -"khacyrillic", 0x0445, -"khadeva", 0x0916, -"khagujarati", 0x0A96, -"khagurmukhi", 0x0A16, -"khaharabic", 0x062E, -"khahfinalarabic", 0xFEA6, -"khahinitialarabic", 0xFEA7, -"khahmedialarabic", 0xFEA8, -"kheicoptic", 0x03E7, -"khhadeva", 0x0959, -"khhagurmukhi", 0x0A59, -"khieukhacirclekorean", 0x3278, -"khieukhaparenkorean", 0x3218, -"khieukhcirclekorean", 0x326A, -"khieukhkorean", 0x314B, -"khieukhparenkorean", 0x320A, -"khokhaithai", 0x0E02, -"khokhonthai", 0x0E05, -"khokhuatthai", 0x0E03, -"khokhwaithai", 0x0E04, -"khomutthai", 0x0E5B, -"khook", 0x0199, -"khorakhangthai", 0x0E06, -"khzsquare", 0x3391, -"kihiragana", 0x304D, -"kikatakana", 0x30AD, -"kikatakanahalfwidth", 0xFF77, -"kiroguramusquare", 0x3315, -"kiromeetorusquare", 0x3316, -"kirosquare", 0x3314, -"kiyeokacirclekorean", 0x326E, -"kiyeokaparenkorean", 0x320E, -"kiyeokcirclekorean", 0x3260, -"kiyeokkorean", 0x3131, -"kiyeokparenkorean", 0x3200, -"kiyeoksioskorean", 0x3133, -"kjecyrillic", 0x045C, -"klinebelow", 0x1E35, -"klsquare", 0x3398, -"kmcubedsquare", 0x33A6, -"kmonospace", 0xFF4B, -"kmsquaredsquare", 0x33A2, -"kohiragana", 0x3053, -"kohmsquare", 0x33C0, -"kokaithai", 0x0E01, -"kokatakana", 0x30B3, -"kokatakanahalfwidth", 0xFF7A, -"kooposquare", 0x331E, -"koppacyrillic", 0x0481, -"koreanstandardsymbol", 0x327F, -"koroniscmb", 0x0343, -"kparen", 0x24A6, -"kpasquare", 0x33AA, -"ksicyrillic", 0x046F, -"ktsquare", 0x33CF, -"kturned", 0x029E, -"kuhiragana", 0x304F, -"kukatakana", 0x30AF, -"kukatakanahalfwidth", 0xFF78, -"kvsquare", 0x33B8, -"kwsquare", 0x33BE, -"l", 0x006C, -"labengali", 0x09B2, -"lacute", 0x013A, -"ladeva", 0x0932, -"lagujarati", 0x0AB2, -"lagurmukhi", 0x0A32, -"lakkhangyaothai", 0x0E45, -"lamaleffinalarabic", 0xFEFC, -"lamalefhamzaabovefinalarabic", 0xFEF8, -"lamalefhamzaaboveisolatedarabic", 0xFEF7, -"lamalefhamzabelowfinalarabic", 0xFEFA, -"lamalefhamzabelowisolatedarabic", 0xFEF9, -"lamalefisolatedarabic", 0xFEFB, -"lamalefmaddaabovefinalarabic", 0xFEF6, -"lamalefmaddaaboveisolatedarabic", 0xFEF5, -"lamarabic", 0x0644, -"lambda", 0x03BB, -"lambdastroke", 0x019B, -"lamed", 0x05DC, -"lameddagesh", 0xFB3C, -"lameddageshhebrew", 0xFB3C, -"lamedhebrew", 0x05DC, -"lamfinalarabic", 0xFEDE, -"lamhahinitialarabic", 0xFCCA, -"laminitialarabic", 0xFEDF, -"lamjeeminitialarabic", 0xFCC9, -"lamkhahinitialarabic", 0xFCCB, -"lamlamhehisolatedarabic", 0xFDF2, -"lammedialarabic", 0xFEE0, -"lammeemhahinitialarabic", 0xFD88, -"lammeeminitialarabic", 0xFCCC, -"largecircle", 0x25EF, -"lbar", 0x019A, -"lbelt", 0x026C, -"lbopomofo", 0x310C, -"lcaron", 0x013E, -"lcedilla", 0x013C, -"lcircle", 0x24DB, -"lcircumflexbelow", 0x1E3D, -"lcommaaccent", 0x013C, -"ldot", 0x0140, -"ldotaccent", 0x0140, -"ldotbelow", 0x1E37, -"ldotbelowmacron", 0x1E39, -"leftangleabovecmb", 0x031A, -"lefttackbelowcmb", 0x0318, -"less", 0x003C, -"lessequal", 0x2264, -"lessequalorgreater", 0x22DA, -"lessmonospace", 0xFF1C, -"lessorequivalent", 0x2272, -"lessorgreater", 0x2276, -"lessoverequal", 0x2266, -"lesssmall", 0xFE64, -"lezh", 0x026E, -"lfblock", 0x258C, -"lhookretroflex", 0x026D, -"lira", 0x20A4, -"liwnarmenian", 0x056C, -"lj", 0x01C9, -"ljecyrillic", 0x0459, -"ll", 0xF6C0, -"lladeva", 0x0933, -"llagujarati", 0x0AB3, -"llinebelow", 0x1E3B, -"llladeva", 0x0934, -"llvocalicbengali", 0x09E1, -"llvocalicdeva", 0x0961, -"llvocalicvowelsignbengali", 0x09E3, -"llvocalicvowelsigndeva", 0x0963, -"lmiddletilde", 0x026B, -"lmonospace", 0xFF4C, -"lmsquare", 0x33D0, -"lochulathai", 0x0E2C, -"logicaland", 0x2227, -"logicalnot", 0x00AC, -"logicalnotreversed", 0x2310, -"logicalor", 0x2228, -"lolingthai", 0x0E25, -"longs", 0x017F, -"lowlinecenterline", 0xFE4E, -"lowlinecmb", 0x0332, -"lowlinedashed", 0xFE4D, -"lozenge", 0x25CA, -"lparen", 0x24A7, -"lslash", 0x0142, -"lsquare", 0x2113, -"lsuperior", 0xF6EE, -"ltshade", 0x2591, -"luthai", 0x0E26, -"lvocalicbengali", 0x098C, -"lvocalicdeva", 0x090C, -"lvocalicvowelsignbengali", 0x09E2, -"lvocalicvowelsigndeva", 0x0962, -"lxsquare", 0x33D3, -"m", 0x006D, -"mabengali", 0x09AE, -"macron", 0x00AF, -"macronbelowcmb", 0x0331, -"macroncmb", 0x0304, -"macronlowmod", 0x02CD, -"macronmonospace", 0xFFE3, -"macute", 0x1E3F, -"madeva", 0x092E, -"magujarati", 0x0AAE, -"magurmukhi", 0x0A2E, -"mahapakhhebrew", 0x05A4, -"mahapakhlefthebrew", 0x05A4, -"mahiragana", 0x307E, -"maichattawalowleftthai", 0xF895, -"maichattawalowrightthai", 0xF894, -"maichattawathai", 0x0E4B, -"maichattawaupperleftthai", 0xF893, -"maieklowleftthai", 0xF88C, -"maieklowrightthai", 0xF88B, -"maiekthai", 0x0E48, -"maiekupperleftthai", 0xF88A, -"maihanakatleftthai", 0xF884, -"maihanakatthai", 0x0E31, -"maitaikhuleftthai", 0xF889, -"maitaikhuthai", 0x0E47, -"maitholowleftthai", 0xF88F, -"maitholowrightthai", 0xF88E, -"maithothai", 0x0E49, -"maithoupperleftthai", 0xF88D, -"maitrilowleftthai", 0xF892, -"maitrilowrightthai", 0xF891, -"maitrithai", 0x0E4A, -"maitriupperleftthai", 0xF890, -"maiyamokthai", 0x0E46, -"makatakana", 0x30DE, -"makatakanahalfwidth", 0xFF8F, -"male", 0x2642, -"mansyonsquare", 0x3347, -"maqafhebrew", 0x05BE, -"mars", 0x2642, -"masoracirclehebrew", 0x05AF, -"masquare", 0x3383, -"mbopomofo", 0x3107, -"mbsquare", 0x33D4, -"mcircle", 0x24DC, -"mcubedsquare", 0x33A5, -"mdotaccent", 0x1E41, -"mdotbelow", 0x1E43, -"meemarabic", 0x0645, -"meemfinalarabic", 0xFEE2, -"meeminitialarabic", 0xFEE3, -"meemmedialarabic", 0xFEE4, -"meemmeeminitialarabic", 0xFCD1, -"meemmeemisolatedarabic", 0xFC48, -"meetorusquare", 0x334D, -"mehiragana", 0x3081, -"meizierasquare", 0x337E, -"mekatakana", 0x30E1, -"mekatakanahalfwidth", 0xFF92, -"mem", 0x05DE, -"memdagesh", 0xFB3E, -"memdageshhebrew", 0xFB3E, -"memhebrew", 0x05DE, -"menarmenian", 0x0574, -"merkhahebrew", 0x05A5, -"merkhakefulahebrew", 0x05A6, -"merkhakefulalefthebrew", 0x05A6, -"merkhalefthebrew", 0x05A5, -"mhook", 0x0271, -"mhzsquare", 0x3392, -"middledotkatakanahalfwidth", 0xFF65, -"middot", 0x00B7, -"mieumacirclekorean", 0x3272, -"mieumaparenkorean", 0x3212, -"mieumcirclekorean", 0x3264, -"mieumkorean", 0x3141, -"mieumpansioskorean", 0x3170, -"mieumparenkorean", 0x3204, -"mieumpieupkorean", 0x316E, -"mieumsioskorean", 0x316F, -"mihiragana", 0x307F, -"mikatakana", 0x30DF, -"mikatakanahalfwidth", 0xFF90, -"minus", 0x2212, -"minusbelowcmb", 0x0320, -"minuscircle", 0x2296, -"minusmod", 0x02D7, -"minusplus", 0x2213, -"minute", 0x2032, -"miribaarusquare", 0x334A, -"mirisquare", 0x3349, -"mlonglegturned", 0x0270, -"mlsquare", 0x3396, -"mmcubedsquare", 0x33A3, -"mmonospace", 0xFF4D, -"mmsquaredsquare", 0x339F, -"mohiragana", 0x3082, -"mohmsquare", 0x33C1, -"mokatakana", 0x30E2, -"mokatakanahalfwidth", 0xFF93, -"molsquare", 0x33D6, -"momathai", 0x0E21, -"moverssquare", 0x33A7, -"moverssquaredsquare", 0x33A8, -"mparen", 0x24A8, -"mpasquare", 0x33AB, -"mssquare", 0x33B3, -"msuperior", 0xF6EF, -"mturned", 0x026F, -"mu", 0x00B5, -"mu1", 0x00B5, -"muasquare", 0x3382, -"muchgreater", 0x226B, -"muchless", 0x226A, -"mufsquare", 0x338C, -"mugreek", 0x03BC, -"mugsquare", 0x338D, -"muhiragana", 0x3080, -"mukatakana", 0x30E0, -"mukatakanahalfwidth", 0xFF91, -"mulsquare", 0x3395, -"multiply", 0x00D7, -"mumsquare", 0x339B, -"munahhebrew", 0x05A3, -"munahlefthebrew", 0x05A3, -"musicalnote", 0x266A, -"musicalnotedbl", 0x266B, -"musicflatsign", 0x266D, -"musicsharpsign", 0x266F, -"mussquare", 0x33B2, -"muvsquare", 0x33B6, -"muwsquare", 0x33BC, -"mvmegasquare", 0x33B9, -"mvsquare", 0x33B7, -"mwmegasquare", 0x33BF, -"mwsquare", 0x33BD, -"n", 0x006E, -"nabengali", 0x09A8, -"nabla", 0x2207, -"nacute", 0x0144, -"nadeva", 0x0928, -"nagujarati", 0x0AA8, -"nagurmukhi", 0x0A28, -"nahiragana", 0x306A, -"nakatakana", 0x30CA, -"nakatakanahalfwidth", 0xFF85, -"napostrophe", 0x0149, -"nasquare", 0x3381, -"nbopomofo", 0x310B, -"nbspace", 0x00A0, -"ncaron", 0x0148, -"ncedilla", 0x0146, -"ncircle", 0x24DD, -"ncircumflexbelow", 0x1E4B, -"ncommaaccent", 0x0146, -"ndotaccent", 0x1E45, -"ndotbelow", 0x1E47, -"nehiragana", 0x306D, -"nekatakana", 0x30CD, -"nekatakanahalfwidth", 0xFF88, -"newsheqelsign", 0x20AA, -"nfsquare", 0x338B, -"ngabengali", 0x0999, -"ngadeva", 0x0919, -"ngagujarati", 0x0A99, -"ngagurmukhi", 0x0A19, -"ngonguthai", 0x0E07, -"nhiragana", 0x3093, -"nhookleft", 0x0272, -"nhookretroflex", 0x0273, -"nieunacirclekorean", 0x326F, -"nieunaparenkorean", 0x320F, -"nieuncieuckorean", 0x3135, -"nieuncirclekorean", 0x3261, -"nieunhieuhkorean", 0x3136, -"nieunkorean", 0x3134, -"nieunpansioskorean", 0x3168, -"nieunparenkorean", 0x3201, -"nieunsioskorean", 0x3167, -"nieuntikeutkorean", 0x3166, -"nihiragana", 0x306B, -"nikatakana", 0x30CB, -"nikatakanahalfwidth", 0xFF86, -"nikhahitleftthai", 0xF899, -"nikhahitthai", 0x0E4D, -"nine", 0x0039, -"ninearabic", 0x0669, -"ninebengali", 0x09EF, -"ninecircle", 0x2468, -"ninecircleinversesansserif", 0x2792, -"ninedeva", 0x096F, -"ninegujarati", 0x0AEF, -"ninegurmukhi", 0x0A6F, -"ninehackarabic", 0x0669, -"ninehangzhou", 0x3029, -"nineideographicparen", 0x3228, -"nineinferior", 0x2089, -"ninemonospace", 0xFF19, -"nineoldstyle", 0xF739, -"nineparen", 0x247C, -"nineperiod", 0x2490, -"ninepersian", 0x06F9, -"nineroman", 0x2178, -"ninesuperior", 0x2079, -"nineteencircle", 0x2472, -"nineteenparen", 0x2486, -"nineteenperiod", 0x249A, -"ninethai", 0x0E59, -"nj", 0x01CC, -"njecyrillic", 0x045A, -"nkatakana", 0x30F3, -"nkatakanahalfwidth", 0xFF9D, -"nlegrightlong", 0x019E, -"nlinebelow", 0x1E49, -"nmonospace", 0xFF4E, -"nmsquare", 0x339A, -"nnabengali", 0x09A3, -"nnadeva", 0x0923, -"nnagujarati", 0x0AA3, -"nnagurmukhi", 0x0A23, -"nnnadeva", 0x0929, -"nohiragana", 0x306E, -"nokatakana", 0x30CE, -"nokatakanahalfwidth", 0xFF89, -"nonbreakingspace", 0x00A0, -"nonenthai", 0x0E13, -"nonuthai", 0x0E19, -"noonarabic", 0x0646, -"noonfinalarabic", 0xFEE6, -"noonghunnaarabic", 0x06BA, -"noonghunnafinalarabic", 0xFB9F, -"nooninitialarabic", 0xFEE7, -"noonjeeminitialarabic", 0xFCD2, -"noonjeemisolatedarabic", 0xFC4B, -"noonmedialarabic", 0xFEE8, -"noonmeeminitialarabic", 0xFCD5, -"noonmeemisolatedarabic", 0xFC4E, -"noonnoonfinalarabic", 0xFC8D, -"notcontains", 0x220C, -"notelement", 0x2209, -"notelementof", 0x2209, -"notequal", 0x2260, -"notgreater", 0x226F, -"notgreaternorequal", 0x2271, -"notgreaternorless", 0x2279, -"notidentical", 0x2262, -"notless", 0x226E, -"notlessnorequal", 0x2270, -"notparallel", 0x2226, -"notprecedes", 0x2280, -"notsubset", 0x2284, -"notsucceeds", 0x2281, -"notsuperset", 0x2285, -"nowarmenian", 0x0576, -"nparen", 0x24A9, -"nssquare", 0x33B1, -"nsuperior", 0x207F, -"ntilde", 0x00F1, -"nu", 0x03BD, -"nuhiragana", 0x306C, -"nukatakana", 0x30CC, -"nukatakanahalfwidth", 0xFF87, -"nuktabengali", 0x09BC, -"nuktadeva", 0x093C, -"nuktagujarati", 0x0ABC, -"nuktagurmukhi", 0x0A3C, -"numbersign", 0x0023, -"numbersignmonospace", 0xFF03, -"numbersignsmall", 0xFE5F, -"numeralsigngreek", 0x0374, -"numeralsignlowergreek", 0x0375, -"numero", 0x2116, -"nun", 0x05E0, -"nundagesh", 0xFB40, -"nundageshhebrew", 0xFB40, -"nunhebrew", 0x05E0, -"nvsquare", 0x33B5, -"nwsquare", 0x33BB, -"nyabengali", 0x099E, -"nyadeva", 0x091E, -"nyagujarati", 0x0A9E, -"nyagurmukhi", 0x0A1E, -"o", 0x006F, -"oacute", 0x00F3, -"oangthai", 0x0E2D, -"obarred", 0x0275, -"obarredcyrillic", 0x04E9, -"obarreddieresiscyrillic", 0x04EB, -"obengali", 0x0993, -"obopomofo", 0x311B, -"obreve", 0x014F, -"ocandradeva", 0x0911, -"ocandragujarati", 0x0A91, -"ocandravowelsigndeva", 0x0949, -"ocandravowelsigngujarati", 0x0AC9, -"ocaron", 0x01D2, -"ocircle", 0x24DE, -"ocircumflex", 0x00F4, -"ocircumflexacute", 0x1ED1, -"ocircumflexdotbelow", 0x1ED9, -"ocircumflexgrave", 0x1ED3, -"ocircumflexhookabove", 0x1ED5, -"ocircumflextilde", 0x1ED7, -"ocyrillic", 0x043E, -"odblacute", 0x0151, -"odblgrave", 0x020D, -"odeva", 0x0913, -"odieresis", 0x00F6, -"odieresiscyrillic", 0x04E7, -"odotbelow", 0x1ECD, -"oe", 0x0153, -"oekorean", 0x315A, -"ogonek", 0x02DB, -"ogonekcmb", 0x0328, -"ograve", 0x00F2, -"ogujarati", 0x0A93, -"oharmenian", 0x0585, -"ohiragana", 0x304A, -"ohookabove", 0x1ECF, -"ohorn", 0x01A1, -"ohornacute", 0x1EDB, -"ohorndotbelow", 0x1EE3, -"ohorngrave", 0x1EDD, -"ohornhookabove", 0x1EDF, -"ohorntilde", 0x1EE1, -"ohungarumlaut", 0x0151, -"oi", 0x01A3, -"oinvertedbreve", 0x020F, -"okatakana", 0x30AA, -"okatakanahalfwidth", 0xFF75, -"okorean", 0x3157, -"olehebrew", 0x05AB, -"omacron", 0x014D, -"omacronacute", 0x1E53, -"omacrongrave", 0x1E51, -"omdeva", 0x0950, -"omega", 0x03C9, -"omega1", 0x03D6, -"omegacyrillic", 0x0461, -"omegalatinclosed", 0x0277, -"omegaroundcyrillic", 0x047B, -"omegatitlocyrillic", 0x047D, -"omegatonos", 0x03CE, -"omgujarati", 0x0AD0, -"omicron", 0x03BF, -"omicrontonos", 0x03CC, -"omonospace", 0xFF4F, -"one", 0x0031, -"onearabic", 0x0661, -"onebengali", 0x09E7, -"onecircle", 0x2460, -"onecircleinversesansserif", 0x278A, -"onedeva", 0x0967, -"onedotenleader", 0x2024, -"oneeighth", 0x215B, -"onefitted", 0xF6DC, -"onegujarati", 0x0AE7, -"onegurmukhi", 0x0A67, -"onehackarabic", 0x0661, -"onehalf", 0x00BD, -"onehangzhou", 0x3021, -"oneideographicparen", 0x3220, -"oneinferior", 0x2081, -"onemonospace", 0xFF11, -"onenumeratorbengali", 0x09F4, -"oneoldstyle", 0xF731, -"oneparen", 0x2474, -"oneperiod", 0x2488, -"onepersian", 0x06F1, -"onequarter", 0x00BC, -"oneroman", 0x2170, -"onesuperior", 0x00B9, -"onethai", 0x0E51, -"onethird", 0x2153, -"oogonek", 0x01EB, -"oogonekmacron", 0x01ED, -"oogurmukhi", 0x0A13, -"oomatragurmukhi", 0x0A4B, -"oopen", 0x0254, -"oparen", 0x24AA, -"openbullet", 0x25E6, -"option", 0x2325, -"ordfeminine", 0x00AA, -"ordmasculine", 0x00BA, -"orthogonal", 0x221F, -"oshortdeva", 0x0912, -"oshortvowelsigndeva", 0x094A, -"oslash", 0x00F8, -"oslashacute", 0x01FF, -"osmallhiragana", 0x3049, -"osmallkatakana", 0x30A9, -"osmallkatakanahalfwidth", 0xFF6B, -"ostrokeacute", 0x01FF, -"osuperior", 0xF6F0, -"otcyrillic", 0x047F, -"otilde", 0x00F5, -"otildeacute", 0x1E4D, -"otildedieresis", 0x1E4F, -"oubopomofo", 0x3121, -"overline", 0x203E, -"overlinecenterline", 0xFE4A, -"overlinecmb", 0x0305, -"overlinedashed", 0xFE49, -"overlinedblwavy", 0xFE4C, -"overlinewavy", 0xFE4B, -"overscore", 0x00AF, -"ovowelsignbengali", 0x09CB, -"ovowelsigndeva", 0x094B, -"ovowelsigngujarati", 0x0ACB, -"p", 0x0070, -"paampssquare", 0x3380, -"paasentosquare", 0x332B, -"pabengali", 0x09AA, -"pacute", 0x1E55, -"padeva", 0x092A, -"pagedown", 0x21DF, -"pageup", 0x21DE, -"pagujarati", 0x0AAA, -"pagurmukhi", 0x0A2A, -"pahiragana", 0x3071, -"paiyannoithai", 0x0E2F, -"pakatakana", 0x30D1, -"palatalizationcyrilliccmb", 0x0484, -"palochkacyrillic", 0x04C0, -"pansioskorean", 0x317F, -"paragraph", 0x00B6, -"parallel", 0x2225, -"parenleft", 0x0028, -"parenleftaltonearabic", 0xFD3E, -"parenleftbt", 0xF8ED, -"parenleftex", 0xF8EC, -"parenleftinferior", 0x208D, -"parenleftmonospace", 0xFF08, -"parenleftsmall", 0xFE59, -"parenleftsuperior", 0x207D, -"parenlefttp", 0xF8EB, -"parenleftvertical", 0xFE35, -"parenright", 0x0029, -"parenrightaltonearabic", 0xFD3F, -"parenrightbt", 0xF8F8, -"parenrightex", 0xF8F7, -"parenrightinferior", 0x208E, -"parenrightmonospace", 0xFF09, -"parenrightsmall", 0xFE5A, -"parenrightsuperior", 0x207E, -"parenrighttp", 0xF8F6, -"parenrightvertical", 0xFE36, -"partialdiff", 0x2202, -"paseqhebrew", 0x05C0, -"pashtahebrew", 0x0599, -"pasquare", 0x33A9, -"patah", 0x05B7, -"patah11", 0x05B7, -"patah1d", 0x05B7, -"patah2a", 0x05B7, -"patahhebrew", 0x05B7, -"patahnarrowhebrew", 0x05B7, -"patahquarterhebrew", 0x05B7, -"patahwidehebrew", 0x05B7, -"pazerhebrew", 0x05A1, -"pbopomofo", 0x3106, -"pcircle", 0x24DF, -"pdotaccent", 0x1E57, -"pe", 0x05E4, -"pecyrillic", 0x043F, -"pedagesh", 0xFB44, -"pedageshhebrew", 0xFB44, -"peezisquare", 0x333B, -"pefinaldageshhebrew", 0xFB43, -"peharabic", 0x067E, -"peharmenian", 0x057A, -"pehebrew", 0x05E4, -"pehfinalarabic", 0xFB57, -"pehinitialarabic", 0xFB58, -"pehiragana", 0x307A, -"pehmedialarabic", 0xFB59, -"pekatakana", 0x30DA, -"pemiddlehookcyrillic", 0x04A7, -"perafehebrew", 0xFB4E, -"percent", 0x0025, -"percentarabic", 0x066A, -"percentmonospace", 0xFF05, -"percentsmall", 0xFE6A, -"period", 0x002E, -"periodarmenian", 0x0589, -"periodcentered", 0x00B7, -"periodhalfwidth", 0xFF61, -"periodinferior", 0xF6E7, -"periodmonospace", 0xFF0E, -"periodsmall", 0xFE52, -"periodsuperior", 0xF6E8, -"perispomenigreekcmb", 0x0342, -"perpendicular", 0x22A5, -"perthousand", 0x2030, -"peseta", 0x20A7, -"pfsquare", 0x338A, -"phabengali", 0x09AB, -"phadeva", 0x092B, -"phagujarati", 0x0AAB, -"phagurmukhi", 0x0A2B, -"phi", 0x03C6, -"phi1", 0x03D5, -"phieuphacirclekorean", 0x327A, -"phieuphaparenkorean", 0x321A, -"phieuphcirclekorean", 0x326C, -"phieuphkorean", 0x314D, -"phieuphparenkorean", 0x320C, -"philatin", 0x0278, -"phinthuthai", 0x0E3A, -"phisymbolgreek", 0x03D5, -"phook", 0x01A5, -"phophanthai", 0x0E1E, -"phophungthai", 0x0E1C, -"phosamphaothai", 0x0E20, -"pi", 0x03C0, -"pieupacirclekorean", 0x3273, -"pieupaparenkorean", 0x3213, -"pieupcieuckorean", 0x3176, -"pieupcirclekorean", 0x3265, -"pieupkiyeokkorean", 0x3172, -"pieupkorean", 0x3142, -"pieupparenkorean", 0x3205, -"pieupsioskiyeokkorean", 0x3174, -"pieupsioskorean", 0x3144, -"pieupsiostikeutkorean", 0x3175, -"pieupthieuthkorean", 0x3177, -"pieuptikeutkorean", 0x3173, -"pihiragana", 0x3074, -"pikatakana", 0x30D4, -"pisymbolgreek", 0x03D6, -"piwrarmenian", 0x0583, -"plus", 0x002B, -"plusbelowcmb", 0x031F, -"pluscircle", 0x2295, -"plusminus", 0x00B1, -"plusmod", 0x02D6, -"plusmonospace", 0xFF0B, -"plussmall", 0xFE62, -"plussuperior", 0x207A, -"pmonospace", 0xFF50, -"pmsquare", 0x33D8, -"pohiragana", 0x307D, -"pointingindexdownwhite", 0x261F, -"pointingindexleftwhite", 0x261C, -"pointingindexrightwhite", 0x261E, -"pointingindexupwhite", 0x261D, -"pokatakana", 0x30DD, -"poplathai", 0x0E1B, -"postalmark", 0x3012, -"postalmarkface", 0x3020, -"pparen", 0x24AB, -"precedes", 0x227A, -"prescription", 0x211E, -"primemod", 0x02B9, -"primereversed", 0x2035, -"product", 0x220F, -"projective", 0x2305, -"prolongedkana", 0x30FC, -"propellor", 0x2318, -"propersubset", 0x2282, -"propersuperset", 0x2283, -"proportion", 0x2237, -"proportional", 0x221D, -"psi", 0x03C8, -"psicyrillic", 0x0471, -"psilipneumatacyrilliccmb", 0x0486, -"pssquare", 0x33B0, -"puhiragana", 0x3077, -"pukatakana", 0x30D7, -"pvsquare", 0x33B4, -"pwsquare", 0x33BA, -"q", 0x0071, -"qadeva", 0x0958, -"qadmahebrew", 0x05A8, -"qafarabic", 0x0642, -"qaffinalarabic", 0xFED6, -"qafinitialarabic", 0xFED7, -"qafmedialarabic", 0xFED8, -"qamats", 0x05B8, -"qamats10", 0x05B8, -"qamats1a", 0x05B8, -"qamats1c", 0x05B8, -"qamats27", 0x05B8, -"qamats29", 0x05B8, -"qamats33", 0x05B8, -"qamatsde", 0x05B8, -"qamatshebrew", 0x05B8, -"qamatsnarrowhebrew", 0x05B8, -"qamatsqatanhebrew", 0x05B8, -"qamatsqatannarrowhebrew", 0x05B8, -"qamatsqatanquarterhebrew", 0x05B8, -"qamatsqatanwidehebrew", 0x05B8, -"qamatsquarterhebrew", 0x05B8, -"qamatswidehebrew", 0x05B8, -"qarneyparahebrew", 0x059F, -"qbopomofo", 0x3111, -"qcircle", 0x24E0, -"qhook", 0x02A0, -"qmonospace", 0xFF51, -"qof", 0x05E7, -"qofdagesh", 0xFB47, -"qofdageshhebrew", 0xFB47, -"qofhebrew", 0x05E7, -"qparen", 0x24AC, -"quarternote", 0x2669, -"qubuts", 0x05BB, -"qubuts18", 0x05BB, -"qubuts25", 0x05BB, -"qubuts31", 0x05BB, -"qubutshebrew", 0x05BB, -"qubutsnarrowhebrew", 0x05BB, -"qubutsquarterhebrew", 0x05BB, -"qubutswidehebrew", 0x05BB, -"question", 0x003F, -"questionarabic", 0x061F, -"questionarmenian", 0x055E, -"questiondown", 0x00BF, -"questiondownsmall", 0xF7BF, -"questiongreek", 0x037E, -"questionmonospace", 0xFF1F, -"questionsmall", 0xF73F, -"quotedbl", 0x0022, -"quotedblbase", 0x201E, -"quotedblleft", 0x201C, -"quotedblmonospace", 0xFF02, -"quotedblprime", 0x301E, -"quotedblprimereversed", 0x301D, -"quotedblright", 0x201D, -"quoteleft", 0x2018, -"quoteleftreversed", 0x201B, -"quotereversed", 0x201B, -"quoteright", 0x2019, -"quoterightn", 0x0149, -"quotesinglbase", 0x201A, -"quotesingle", 0x0027, -"quotesinglemonospace", 0xFF07, -"r", 0x0072, -"raarmenian", 0x057C, -"rabengali", 0x09B0, -"racute", 0x0155, -"radeva", 0x0930, -"radical", 0x221A, -"radicalex", 0xF8E5, -"radoverssquare", 0x33AE, -"radoverssquaredsquare", 0x33AF, -"radsquare", 0x33AD, -"rafe", 0x05BF, -"rafehebrew", 0x05BF, -"ragujarati", 0x0AB0, -"ragurmukhi", 0x0A30, -"rahiragana", 0x3089, -"rakatakana", 0x30E9, -"rakatakanahalfwidth", 0xFF97, -"ralowerdiagonalbengali", 0x09F1, -"ramiddlediagonalbengali", 0x09F0, -"ramshorn", 0x0264, -"ratio", 0x2236, -"rbopomofo", 0x3116, -"rcaron", 0x0159, -"rcedilla", 0x0157, -"rcircle", 0x24E1, -"rcommaaccent", 0x0157, -"rdblgrave", 0x0211, -"rdotaccent", 0x1E59, -"rdotbelow", 0x1E5B, -"rdotbelowmacron", 0x1E5D, -"referencemark", 0x203B, -"reflexsubset", 0x2286, -"reflexsuperset", 0x2287, -"registered", 0x00AE, -"registersans", 0xF8E8, -"registerserif", 0xF6DA, -"reharabic", 0x0631, -"reharmenian", 0x0580, -"rehfinalarabic", 0xFEAE, -"rehiragana", 0x308C, -"rekatakana", 0x30EC, -"rekatakanahalfwidth", 0xFF9A, -"resh", 0x05E8, -"reshdageshhebrew", 0xFB48, -"reshhebrew", 0x05E8, -"reversedtilde", 0x223D, -"reviahebrew", 0x0597, -"reviamugrashhebrew", 0x0597, -"revlogicalnot", 0x2310, -"rfishhook", 0x027E, -"rfishhookreversed", 0x027F, -"rhabengali", 0x09DD, -"rhadeva", 0x095D, -"rho", 0x03C1, -"rhook", 0x027D, -"rhookturned", 0x027B, -"rhookturnedsuperior", 0x02B5, -"rhosymbolgreek", 0x03F1, -"rhotichookmod", 0x02DE, -"rieulacirclekorean", 0x3271, -"rieulaparenkorean", 0x3211, -"rieulcirclekorean", 0x3263, -"rieulhieuhkorean", 0x3140, -"rieulkiyeokkorean", 0x313A, -"rieulkiyeoksioskorean", 0x3169, -"rieulkorean", 0x3139, -"rieulmieumkorean", 0x313B, -"rieulpansioskorean", 0x316C, -"rieulparenkorean", 0x3203, -"rieulphieuphkorean", 0x313F, -"rieulpieupkorean", 0x313C, -"rieulpieupsioskorean", 0x316B, -"rieulsioskorean", 0x313D, -"rieulthieuthkorean", 0x313E, -"rieultikeutkorean", 0x316A, -"rieulyeorinhieuhkorean", 0x316D, -"rightangle", 0x221F, -"righttackbelowcmb", 0x0319, -"righttriangle", 0x22BF, -"rihiragana", 0x308A, -"rikatakana", 0x30EA, -"rikatakanahalfwidth", 0xFF98, -"ring", 0x02DA, -"ringbelowcmb", 0x0325, -"ringcmb", 0x030A, -"ringhalfleft", 0x02BF, -"ringhalfleftarmenian", 0x0559, -"ringhalfleftbelowcmb", 0x031C, -"ringhalfleftcentered", 0x02D3, -"ringhalfright", 0x02BE, -"ringhalfrightbelowcmb", 0x0339, -"ringhalfrightcentered", 0x02D2, -"rinvertedbreve", 0x0213, -"rittorusquare", 0x3351, -"rlinebelow", 0x1E5F, -"rlongleg", 0x027C, -"rlonglegturned", 0x027A, -"rmonospace", 0xFF52, -"rohiragana", 0x308D, -"rokatakana", 0x30ED, -"rokatakanahalfwidth", 0xFF9B, -"roruathai", 0x0E23, -"rparen", 0x24AD, -"rrabengali", 0x09DC, -"rradeva", 0x0931, -"rragurmukhi", 0x0A5C, -"rreharabic", 0x0691, -"rrehfinalarabic", 0xFB8D, -"rrvocalicbengali", 0x09E0, -"rrvocalicdeva", 0x0960, -"rrvocalicgujarati", 0x0AE0, -"rrvocalicvowelsignbengali", 0x09C4, -"rrvocalicvowelsigndeva", 0x0944, -"rrvocalicvowelsigngujarati", 0x0AC4, -"rsuperior", 0xF6F1, -"rtblock", 0x2590, -"rturned", 0x0279, -"rturnedsuperior", 0x02B4, -"ruhiragana", 0x308B, -"rukatakana", 0x30EB, -"rukatakanahalfwidth", 0xFF99, -"rupeemarkbengali", 0x09F2, -"rupeesignbengali", 0x09F3, -"rupiah", 0xF6DD, -"ruthai", 0x0E24, -"rvocalicbengali", 0x098B, -"rvocalicdeva", 0x090B, -"rvocalicgujarati", 0x0A8B, -"rvocalicvowelsignbengali", 0x09C3, -"rvocalicvowelsigndeva", 0x0943, -"rvocalicvowelsigngujarati", 0x0AC3, -"s", 0x0073, -"sabengali", 0x09B8, -"sacute", 0x015B, -"sacutedotaccent", 0x1E65, -"sadarabic", 0x0635, -"sadeva", 0x0938, -"sadfinalarabic", 0xFEBA, -"sadinitialarabic", 0xFEBB, -"sadmedialarabic", 0xFEBC, -"sagujarati", 0x0AB8, -"sagurmukhi", 0x0A38, -"sahiragana", 0x3055, -"sakatakana", 0x30B5, -"sakatakanahalfwidth", 0xFF7B, -"sallallahoualayhewasallamarabic", 0xFDFA, -"samekh", 0x05E1, -"samekhdagesh", 0xFB41, -"samekhdageshhebrew", 0xFB41, -"samekhhebrew", 0x05E1, -"saraaathai", 0x0E32, -"saraaethai", 0x0E41, -"saraaimaimalaithai", 0x0E44, -"saraaimaimuanthai", 0x0E43, -"saraamthai", 0x0E33, -"saraathai", 0x0E30, -"saraethai", 0x0E40, -"saraiileftthai", 0xF886, -"saraiithai", 0x0E35, -"saraileftthai", 0xF885, -"saraithai", 0x0E34, -"saraothai", 0x0E42, -"saraueeleftthai", 0xF888, -"saraueethai", 0x0E37, -"saraueleftthai", 0xF887, -"sarauethai", 0x0E36, -"sarauthai", 0x0E38, -"sarauuthai", 0x0E39, -"sbopomofo", 0x3119, -"scaron", 0x0161, -"scarondotaccent", 0x1E67, -"scedilla", 0x015F, -"schwa", 0x0259, -"schwacyrillic", 0x04D9, -"schwadieresiscyrillic", 0x04DB, -"schwahook", 0x025A, -"scircle", 0x24E2, -"scircumflex", 0x015D, -"scommaaccent", 0x0219, -"sdotaccent", 0x1E61, -"sdotbelow", 0x1E63, -"sdotbelowdotaccent", 0x1E69, -"seagullbelowcmb", 0x033C, -"second", 0x2033, -"secondtonechinese", 0x02CA, -"section", 0x00A7, -"seenarabic", 0x0633, -"seenfinalarabic", 0xFEB2, -"seeninitialarabic", 0xFEB3, -"seenmedialarabic", 0xFEB4, -"segol", 0x05B6, -"segol13", 0x05B6, -"segol1f", 0x05B6, -"segol2c", 0x05B6, -"segolhebrew", 0x05B6, -"segolnarrowhebrew", 0x05B6, -"segolquarterhebrew", 0x05B6, -"segoltahebrew", 0x0592, -"segolwidehebrew", 0x05B6, -"seharmenian", 0x057D, -"sehiragana", 0x305B, -"sekatakana", 0x30BB, -"sekatakanahalfwidth", 0xFF7E, -"semicolon", 0x003B, -"semicolonarabic", 0x061B, -"semicolonmonospace", 0xFF1B, -"semicolonsmall", 0xFE54, -"semivoicedmarkkana", 0x309C, -"semivoicedmarkkanahalfwidth", 0xFF9F, -"sentisquare", 0x3322, -"sentosquare", 0x3323, -"seven", 0x0037, -"sevenarabic", 0x0667, -"sevenbengali", 0x09ED, -"sevencircle", 0x2466, -"sevencircleinversesansserif", 0x2790, -"sevendeva", 0x096D, -"seveneighths", 0x215E, -"sevengujarati", 0x0AED, -"sevengurmukhi", 0x0A6D, -"sevenhackarabic", 0x0667, -"sevenhangzhou", 0x3027, -"sevenideographicparen", 0x3226, -"seveninferior", 0x2087, -"sevenmonospace", 0xFF17, -"sevenoldstyle", 0xF737, -"sevenparen", 0x247A, -"sevenperiod", 0x248E, -"sevenpersian", 0x06F7, -"sevenroman", 0x2176, -"sevensuperior", 0x2077, -"seventeencircle", 0x2470, -"seventeenparen", 0x2484, -"seventeenperiod", 0x2498, -"seventhai", 0x0E57, -"sfthyphen", 0x00AD, -"shaarmenian", 0x0577, -"shabengali", 0x09B6, -"shacyrillic", 0x0448, -"shaddaarabic", 0x0651, -"shaddadammaarabic", 0xFC61, -"shaddadammatanarabic", 0xFC5E, -"shaddafathaarabic", 0xFC60, -"shaddakasraarabic", 0xFC62, -"shaddakasratanarabic", 0xFC5F, -"shade", 0x2592, -"shadedark", 0x2593, -"shadelight", 0x2591, -"shademedium", 0x2592, -"shadeva", 0x0936, -"shagujarati", 0x0AB6, -"shagurmukhi", 0x0A36, -"shalshelethebrew", 0x0593, -"shbopomofo", 0x3115, -"shchacyrillic", 0x0449, -"sheenarabic", 0x0634, -"sheenfinalarabic", 0xFEB6, -"sheeninitialarabic", 0xFEB7, -"sheenmedialarabic", 0xFEB8, -"sheicoptic", 0x03E3, -"sheqel", 0x20AA, -"sheqelhebrew", 0x20AA, -"sheva", 0x05B0, -"sheva115", 0x05B0, -"sheva15", 0x05B0, -"sheva22", 0x05B0, -"sheva2e", 0x05B0, -"shevahebrew", 0x05B0, -"shevanarrowhebrew", 0x05B0, -"shevaquarterhebrew", 0x05B0, -"shevawidehebrew", 0x05B0, -"shhacyrillic", 0x04BB, -"shimacoptic", 0x03ED, -"shin", 0x05E9, -"shindagesh", 0xFB49, -"shindageshhebrew", 0xFB49, -"shindageshshindot", 0xFB2C, -"shindageshshindothebrew", 0xFB2C, -"shindageshsindot", 0xFB2D, -"shindageshsindothebrew", 0xFB2D, -"shindothebrew", 0x05C1, -"shinhebrew", 0x05E9, -"shinshindot", 0xFB2A, -"shinshindothebrew", 0xFB2A, -"shinsindot", 0xFB2B, -"shinsindothebrew", 0xFB2B, -"shook", 0x0282, -"sigma", 0x03C3, -"sigma1", 0x03C2, -"sigmafinal", 0x03C2, -"sigmalunatesymbolgreek", 0x03F2, -"sihiragana", 0x3057, -"sikatakana", 0x30B7, -"sikatakanahalfwidth", 0xFF7C, -"siluqhebrew", 0x05BD, -"siluqlefthebrew", 0x05BD, -"similar", 0x223C, -"sindothebrew", 0x05C2, -"siosacirclekorean", 0x3274, -"siosaparenkorean", 0x3214, -"sioscieuckorean", 0x317E, -"sioscirclekorean", 0x3266, -"sioskiyeokkorean", 0x317A, -"sioskorean", 0x3145, -"siosnieunkorean", 0x317B, -"siosparenkorean", 0x3206, -"siospieupkorean", 0x317D, -"siostikeutkorean", 0x317C, -"six", 0x0036, -"sixarabic", 0x0666, -"sixbengali", 0x09EC, -"sixcircle", 0x2465, -"sixcircleinversesansserif", 0x278F, -"sixdeva", 0x096C, -"sixgujarati", 0x0AEC, -"sixgurmukhi", 0x0A6C, -"sixhackarabic", 0x0666, -"sixhangzhou", 0x3026, -"sixideographicparen", 0x3225, -"sixinferior", 0x2086, -"sixmonospace", 0xFF16, -"sixoldstyle", 0xF736, -"sixparen", 0x2479, -"sixperiod", 0x248D, -"sixpersian", 0x06F6, -"sixroman", 0x2175, -"sixsuperior", 0x2076, -"sixteencircle", 0x246F, -"sixteencurrencydenominatorbengali", 0x09F9, -"sixteenparen", 0x2483, -"sixteenperiod", 0x2497, -"sixthai", 0x0E56, -"slash", 0x002F, -"slashmonospace", 0xFF0F, -"slong", 0x017F, -"slongdotaccent", 0x1E9B, -"smileface", 0x263A, -"smonospace", 0xFF53, -"sofpasuqhebrew", 0x05C3, -"softhyphen", 0x00AD, -"softsigncyrillic", 0x044C, -"sohiragana", 0x305D, -"sokatakana", 0x30BD, -"sokatakanahalfwidth", 0xFF7F, -"soliduslongoverlaycmb", 0x0338, -"solidusshortoverlaycmb", 0x0337, -"sorusithai", 0x0E29, -"sosalathai", 0x0E28, -"sosothai", 0x0E0B, -"sosuathai", 0x0E2A, -"space", 0x0020, -"spacehackarabic", 0x0020, -"spade", 0x2660, -"spadesuitblack", 0x2660, -"spadesuitwhite", 0x2664, -"sparen", 0x24AE, -"squarebelowcmb", 0x033B, -"squarecc", 0x33C4, -"squarecm", 0x339D, -"squarediagonalcrosshatchfill", 0x25A9, -"squarehorizontalfill", 0x25A4, -"squarekg", 0x338F, -"squarekm", 0x339E, -"squarekmcapital", 0x33CE, -"squareln", 0x33D1, -"squarelog", 0x33D2, -"squaremg", 0x338E, -"squaremil", 0x33D5, -"squaremm", 0x339C, -"squaremsquared", 0x33A1, -"squareorthogonalcrosshatchfill", 0x25A6, -"squareupperlefttolowerrightfill", 0x25A7, -"squareupperrighttolowerleftfill", 0x25A8, -"squareverticalfill", 0x25A5, -"squarewhitewithsmallblack", 0x25A3, -"srsquare", 0x33DB, -"ssabengali", 0x09B7, -"ssadeva", 0x0937, -"ssagujarati", 0x0AB7, -"ssangcieuckorean", 0x3149, -"ssanghieuhkorean", 0x3185, -"ssangieungkorean", 0x3180, -"ssangkiyeokkorean", 0x3132, -"ssangnieunkorean", 0x3165, -"ssangpieupkorean", 0x3143, -"ssangsioskorean", 0x3146, -"ssangtikeutkorean", 0x3138, -"ssuperior", 0xF6F2, -"sterling", 0x00A3, -"sterlingmonospace", 0xFFE1, -"strokelongoverlaycmb", 0x0336, -"strokeshortoverlaycmb", 0x0335, -"subset", 0x2282, -"subsetnotequal", 0x228A, -"subsetorequal", 0x2286, -"succeeds", 0x227B, -"suchthat", 0x220B, -"suhiragana", 0x3059, -"sukatakana", 0x30B9, -"sukatakanahalfwidth", 0xFF7D, -"sukunarabic", 0x0652, -"summation", 0x2211, -"sun", 0x263C, -"superset", 0x2283, -"supersetnotequal", 0x228B, -"supersetorequal", 0x2287, -"svsquare", 0x33DC, -"syouwaerasquare", 0x337C, -"t", 0x0074, -"tabengali", 0x09A4, -"tackdown", 0x22A4, -"tackleft", 0x22A3, -"tadeva", 0x0924, -"tagujarati", 0x0AA4, -"tagurmukhi", 0x0A24, -"taharabic", 0x0637, -"tahfinalarabic", 0xFEC2, -"tahinitialarabic", 0xFEC3, -"tahiragana", 0x305F, -"tahmedialarabic", 0xFEC4, -"taisyouerasquare", 0x337D, -"takatakana", 0x30BF, -"takatakanahalfwidth", 0xFF80, -"tatweelarabic", 0x0640, -"tau", 0x03C4, -"tav", 0x05EA, -"tavdages", 0xFB4A, -"tavdagesh", 0xFB4A, -"tavdageshhebrew", 0xFB4A, -"tavhebrew", 0x05EA, -"tbar", 0x0167, -"tbopomofo", 0x310A, -"tcaron", 0x0165, -"tccurl", 0x02A8, -"tcedilla", 0x0163, -"tcheharabic", 0x0686, -"tchehfinalarabic", 0xFB7B, -"tchehinitialarabic", 0xFB7C, -"tchehmedialarabic", 0xFB7D, -"tcircle", 0x24E3, -"tcircumflexbelow", 0x1E71, -"tcommaaccent", 0x0163, -"tdieresis", 0x1E97, -"tdotaccent", 0x1E6B, -"tdotbelow", 0x1E6D, -"tecyrillic", 0x0442, -"tedescendercyrillic", 0x04AD, -"teharabic", 0x062A, -"tehfinalarabic", 0xFE96, -"tehhahinitialarabic", 0xFCA2, -"tehhahisolatedarabic", 0xFC0C, -"tehinitialarabic", 0xFE97, -"tehiragana", 0x3066, -"tehjeeminitialarabic", 0xFCA1, -"tehjeemisolatedarabic", 0xFC0B, -"tehmarbutaarabic", 0x0629, -"tehmarbutafinalarabic", 0xFE94, -"tehmedialarabic", 0xFE98, -"tehmeeminitialarabic", 0xFCA4, -"tehmeemisolatedarabic", 0xFC0E, -"tehnoonfinalarabic", 0xFC73, -"tekatakana", 0x30C6, -"tekatakanahalfwidth", 0xFF83, -"telephone", 0x2121, -"telephoneblack", 0x260E, -"telishagedolahebrew", 0x05A0, -"telishaqetanahebrew", 0x05A9, -"tencircle", 0x2469, -"tenideographicparen", 0x3229, -"tenparen", 0x247D, -"tenperiod", 0x2491, -"tenroman", 0x2179, -"tesh", 0x02A7, -"tet", 0x05D8, -"tetdagesh", 0xFB38, -"tetdageshhebrew", 0xFB38, -"tethebrew", 0x05D8, -"tetsecyrillic", 0x04B5, -"tevirhebrew", 0x059B, -"tevirlefthebrew", 0x059B, -"thabengali", 0x09A5, -"thadeva", 0x0925, -"thagujarati", 0x0AA5, -"thagurmukhi", 0x0A25, -"thalarabic", 0x0630, -"thalfinalarabic", 0xFEAC, -"thanthakhatlowleftthai", 0xF898, -"thanthakhatlowrightthai", 0xF897, -"thanthakhatthai", 0x0E4C, -"thanthakhatupperleftthai", 0xF896, -"theharabic", 0x062B, -"thehfinalarabic", 0xFE9A, -"thehinitialarabic", 0xFE9B, -"thehmedialarabic", 0xFE9C, -"thereexists", 0x2203, -"therefore", 0x2234, -"theta", 0x03B8, -"theta1", 0x03D1, -"thetasymbolgreek", 0x03D1, -"thieuthacirclekorean", 0x3279, -"thieuthaparenkorean", 0x3219, -"thieuthcirclekorean", 0x326B, -"thieuthkorean", 0x314C, -"thieuthparenkorean", 0x320B, -"thirteencircle", 0x246C, -"thirteenparen", 0x2480, -"thirteenperiod", 0x2494, -"thonangmonthothai", 0x0E11, -"thook", 0x01AD, -"thophuthaothai", 0x0E12, -"thorn", 0x00FE, -"thothahanthai", 0x0E17, -"thothanthai", 0x0E10, -"thothongthai", 0x0E18, -"thothungthai", 0x0E16, -"thousandcyrillic", 0x0482, -"thousandsseparatorarabic", 0x066C, -"thousandsseparatorpersian", 0x066C, -"three", 0x0033, -"threearabic", 0x0663, -"threebengali", 0x09E9, -"threecircle", 0x2462, -"threecircleinversesansserif", 0x278C, -"threedeva", 0x0969, -"threeeighths", 0x215C, -"threegujarati", 0x0AE9, -"threegurmukhi", 0x0A69, -"threehackarabic", 0x0663, -"threehangzhou", 0x3023, -"threeideographicparen", 0x3222, -"threeinferior", 0x2083, -"threemonospace", 0xFF13, -"threenumeratorbengali", 0x09F6, -"threeoldstyle", 0xF733, -"threeparen", 0x2476, -"threeperiod", 0x248A, -"threepersian", 0x06F3, -"threequarters", 0x00BE, -"threequartersemdash", 0xF6DE, -"threeroman", 0x2172, -"threesuperior", 0x00B3, -"threethai", 0x0E53, -"thzsquare", 0x3394, -"tihiragana", 0x3061, -"tikatakana", 0x30C1, -"tikatakanahalfwidth", 0xFF81, -"tikeutacirclekorean", 0x3270, -"tikeutaparenkorean", 0x3210, -"tikeutcirclekorean", 0x3262, -"tikeutkorean", 0x3137, -"tikeutparenkorean", 0x3202, -"tilde", 0x02DC, -"tildebelowcmb", 0x0330, -"tildecmb", 0x0303, -"tildecomb", 0x0303, -"tildedoublecmb", 0x0360, -"tildeoperator", 0x223C, -"tildeoverlaycmb", 0x0334, -"tildeverticalcmb", 0x033E, -"timescircle", 0x2297, -"tipehahebrew", 0x0596, -"tipehalefthebrew", 0x0596, -"tippigurmukhi", 0x0A70, -"titlocyrilliccmb", 0x0483, -"tiwnarmenian", 0x057F, -"tlinebelow", 0x1E6F, -"tmonospace", 0xFF54, -"toarmenian", 0x0569, -"tohiragana", 0x3068, -"tokatakana", 0x30C8, -"tokatakanahalfwidth", 0xFF84, -"tonebarextrahighmod", 0x02E5, -"tonebarextralowmod", 0x02E9, -"tonebarhighmod", 0x02E6, -"tonebarlowmod", 0x02E8, -"tonebarmidmod", 0x02E7, -"tonefive", 0x01BD, -"tonesix", 0x0185, -"tonetwo", 0x01A8, -"tonos", 0x0384, -"tonsquare", 0x3327, -"topatakthai", 0x0E0F, -"tortoiseshellbracketleft", 0x3014, -"tortoiseshellbracketleftsmall", 0xFE5D, -"tortoiseshellbracketleftvertical", 0xFE39, -"tortoiseshellbracketright", 0x3015, -"tortoiseshellbracketrightsmall", 0xFE5E, -"tortoiseshellbracketrightvertical", 0xFE3A, -"totaothai", 0x0E15, -"tpalatalhook", 0x01AB, -"tparen", 0x24AF, -"trademark", 0x2122, -"trademarksans", 0xF8EA, -"trademarkserif", 0xF6DB, -"tretroflexhook", 0x0288, -"triagdn", 0x25BC, -"triaglf", 0x25C4, -"triagrt", 0x25BA, -"triagup", 0x25B2, -"ts", 0x02A6, -"tsadi", 0x05E6, -"tsadidagesh", 0xFB46, -"tsadidageshhebrew", 0xFB46, -"tsadihebrew", 0x05E6, -"tsecyrillic", 0x0446, -"tsere", 0x05B5, -"tsere12", 0x05B5, -"tsere1e", 0x05B5, -"tsere2b", 0x05B5, -"tserehebrew", 0x05B5, -"tserenarrowhebrew", 0x05B5, -"tserequarterhebrew", 0x05B5, -"tserewidehebrew", 0x05B5, -"tshecyrillic", 0x045B, -"tsuperior", 0xF6F3, -"ttabengali", 0x099F, -"ttadeva", 0x091F, -"ttagujarati", 0x0A9F, -"ttagurmukhi", 0x0A1F, -"tteharabic", 0x0679, -"ttehfinalarabic", 0xFB67, -"ttehinitialarabic", 0xFB68, -"ttehmedialarabic", 0xFB69, -"tthabengali", 0x09A0, -"tthadeva", 0x0920, -"tthagujarati", 0x0AA0, -"tthagurmukhi", 0x0A20, -"tturned", 0x0287, -"tuhiragana", 0x3064, -"tukatakana", 0x30C4, -"tukatakanahalfwidth", 0xFF82, -"tusmallhiragana", 0x3063, -"tusmallkatakana", 0x30C3, -"tusmallkatakanahalfwidth", 0xFF6F, -"twelvecircle", 0x246B, -"twelveparen", 0x247F, -"twelveperiod", 0x2493, -"twelveroman", 0x217B, -"twentycircle", 0x2473, -"twentyhangzhou", 0x5344, -"twentyparen", 0x2487, -"twentyperiod", 0x249B, -"two", 0x0032, -"twoarabic", 0x0662, -"twobengali", 0x09E8, -"twocircle", 0x2461, -"twocircleinversesansserif", 0x278B, -"twodeva", 0x0968, -"twodotenleader", 0x2025, -"twodotleader", 0x2025, -"twodotleadervertical", 0xFE30, -"twogujarati", 0x0AE8, -"twogurmukhi", 0x0A68, -"twohackarabic", 0x0662, -"twohangzhou", 0x3022, -"twoideographicparen", 0x3221, -"twoinferior", 0x2082, -"twomonospace", 0xFF12, -"twonumeratorbengali", 0x09F5, -"twooldstyle", 0xF732, -"twoparen", 0x2475, -"twoperiod", 0x2489, -"twopersian", 0x06F2, -"tworoman", 0x2171, -"twostroke", 0x01BB, -"twosuperior", 0x00B2, -"twothai", 0x0E52, -"twothirds", 0x2154, -"u", 0x0075, -"uacute", 0x00FA, -"ubar", 0x0289, -"ubengali", 0x0989, -"ubopomofo", 0x3128, -"ubreve", 0x016D, -"ucaron", 0x01D4, -"ucircle", 0x24E4, -"ucircumflex", 0x00FB, -"ucircumflexbelow", 0x1E77, -"ucyrillic", 0x0443, -"udattadeva", 0x0951, -"udblacute", 0x0171, -"udblgrave", 0x0215, -"udeva", 0x0909, -"udieresis", 0x00FC, -"udieresisacute", 0x01D8, -"udieresisbelow", 0x1E73, -"udieresiscaron", 0x01DA, -"udieresiscyrillic", 0x04F1, -"udieresisgrave", 0x01DC, -"udieresismacron", 0x01D6, -"udotbelow", 0x1EE5, -"ugrave", 0x00F9, -"ugujarati", 0x0A89, -"ugurmukhi", 0x0A09, -"uhiragana", 0x3046, -"uhookabove", 0x1EE7, -"uhorn", 0x01B0, -"uhornacute", 0x1EE9, -"uhorndotbelow", 0x1EF1, -"uhorngrave", 0x1EEB, -"uhornhookabove", 0x1EED, -"uhorntilde", 0x1EEF, -"uhungarumlaut", 0x0171, -"uhungarumlautcyrillic", 0x04F3, -"uinvertedbreve", 0x0217, -"ukatakana", 0x30A6, -"ukatakanahalfwidth", 0xFF73, -"ukcyrillic", 0x0479, -"ukorean", 0x315C, -"umacron", 0x016B, -"umacroncyrillic", 0x04EF, -"umacrondieresis", 0x1E7B, -"umatragurmukhi", 0x0A41, -"umonospace", 0xFF55, -"underscore", 0x005F, -"underscoredbl", 0x2017, -"underscoremonospace", 0xFF3F, -"underscorevertical", 0xFE33, -"underscorewavy", 0xFE4F, -"union", 0x222A, -"universal", 0x2200, -"uogonek", 0x0173, -"uparen", 0x24B0, -"upblock", 0x2580, -"upperdothebrew", 0x05C4, -"upsilon", 0x03C5, -"upsilondieresis", 0x03CB, -"upsilondieresistonos", 0x03B0, -"upsilonlatin", 0x028A, -"upsilontonos", 0x03CD, -"uptackbelowcmb", 0x031D, -"uptackmod", 0x02D4, -"uragurmukhi", 0x0A73, -"uring", 0x016F, -"ushortcyrillic", 0x045E, -"usmallhiragana", 0x3045, -"usmallkatakana", 0x30A5, -"usmallkatakanahalfwidth", 0xFF69, -"ustraightcyrillic", 0x04AF, -"ustraightstrokecyrillic", 0x04B1, -"utilde", 0x0169, -"utildeacute", 0x1E79, -"utildebelow", 0x1E75, -"uubengali", 0x098A, -"uudeva", 0x090A, -"uugujarati", 0x0A8A, -"uugurmukhi", 0x0A0A, -"uumatragurmukhi", 0x0A42, -"uuvowelsignbengali", 0x09C2, -"uuvowelsigndeva", 0x0942, -"uuvowelsigngujarati", 0x0AC2, -"uvowelsignbengali", 0x09C1, -"uvowelsigndeva", 0x0941, -"uvowelsigngujarati", 0x0AC1, -"v", 0x0076, -"vadeva", 0x0935, -"vagujarati", 0x0AB5, -"vagurmukhi", 0x0A35, -"vakatakana", 0x30F7, -"vav", 0x05D5, -"vavdagesh", 0xFB35, -"vavdagesh65", 0xFB35, -"vavdageshhebrew", 0xFB35, -"vavhebrew", 0x05D5, -"vavholam", 0xFB4B, -"vavholamhebrew", 0xFB4B, -"vavvavhebrew", 0x05F0, -"vavyodhebrew", 0x05F1, -"vcircle", 0x24E5, -"vdotbelow", 0x1E7F, -"vecyrillic", 0x0432, -"veharabic", 0x06A4, -"vehfinalarabic", 0xFB6B, -"vehinitialarabic", 0xFB6C, -"vehmedialarabic", 0xFB6D, -"vekatakana", 0x30F9, -"venus", 0x2640, -"verticalbar", 0x007C, -"verticallineabovecmb", 0x030D, -"verticallinebelowcmb", 0x0329, -"verticallinelowmod", 0x02CC, -"verticallinemod", 0x02C8, -"vewarmenian", 0x057E, -"vhook", 0x028B, -"vikatakana", 0x30F8, -"viramabengali", 0x09CD, -"viramadeva", 0x094D, -"viramagujarati", 0x0ACD, -"visargabengali", 0x0983, -"visargadeva", 0x0903, -"visargagujarati", 0x0A83, -"vmonospace", 0xFF56, -"voarmenian", 0x0578, -"voicediterationhiragana", 0x309E, -"voicediterationkatakana", 0x30FE, -"voicedmarkkana", 0x309B, -"voicedmarkkanahalfwidth", 0xFF9E, -"vokatakana", 0x30FA, -"vparen", 0x24B1, -"vtilde", 0x1E7D, -"vturned", 0x028C, -"vuhiragana", 0x3094, -"vukatakana", 0x30F4, -"w", 0x0077, -"wacute", 0x1E83, -"waekorean", 0x3159, -"wahiragana", 0x308F, -"wakatakana", 0x30EF, -"wakatakanahalfwidth", 0xFF9C, -"wakorean", 0x3158, -"wasmallhiragana", 0x308E, -"wasmallkatakana", 0x30EE, -"wattosquare", 0x3357, -"wavedash", 0x301C, -"wavyunderscorevertical", 0xFE34, -"wawarabic", 0x0648, -"wawfinalarabic", 0xFEEE, -"wawhamzaabovearabic", 0x0624, -"wawhamzaabovefinalarabic", 0xFE86, -"wbsquare", 0x33DD, -"wcircle", 0x24E6, -"wcircumflex", 0x0175, -"wdieresis", 0x1E85, -"wdotaccent", 0x1E87, -"wdotbelow", 0x1E89, -"wehiragana", 0x3091, -"weierstrass", 0x2118, -"wekatakana", 0x30F1, -"wekorean", 0x315E, -"weokorean", 0x315D, -"wgrave", 0x1E81, -"whitebullet", 0x25E6, -"whitecircle", 0x25CB, -"whitecircleinverse", 0x25D9, -"whitecornerbracketleft", 0x300E, -"whitecornerbracketleftvertical", 0xFE43, -"whitecornerbracketright", 0x300F, -"whitecornerbracketrightvertical", 0xFE44, -"whitediamond", 0x25C7, -"whitediamondcontainingblacksmalldiamond", 0x25C8, -"whitedownpointingsmalltriangle", 0x25BF, -"whitedownpointingtriangle", 0x25BD, -"whiteleftpointingsmalltriangle", 0x25C3, -"whiteleftpointingtriangle", 0x25C1, -"whitelenticularbracketleft", 0x3016, -"whitelenticularbracketright", 0x3017, -"whiterightpointingsmalltriangle", 0x25B9, -"whiterightpointingtriangle", 0x25B7, -"whitesmallsquare", 0x25AB, -"whitesmilingface", 0x263A, -"whitesquare", 0x25A1, -"whitestar", 0x2606, -"whitetelephone", 0x260F, -"whitetortoiseshellbracketleft", 0x3018, -"whitetortoiseshellbracketright", 0x3019, -"whiteuppointingsmalltriangle", 0x25B5, -"whiteuppointingtriangle", 0x25B3, -"wihiragana", 0x3090, -"wikatakana", 0x30F0, -"wikorean", 0x315F, -"wmonospace", 0xFF57, -"wohiragana", 0x3092, -"wokatakana", 0x30F2, -"wokatakanahalfwidth", 0xFF66, -"won", 0x20A9, -"wonmonospace", 0xFFE6, -"wowaenthai", 0x0E27, -"wparen", 0x24B2, -"wring", 0x1E98, -"wsuperior", 0x02B7, -"wturned", 0x028D, -"wynn", 0x01BF, -"x", 0x0078, -"xabovecmb", 0x033D, -"xbopomofo", 0x3112, -"xcircle", 0x24E7, -"xdieresis", 0x1E8D, -"xdotaccent", 0x1E8B, -"xeharmenian", 0x056D, -"xi", 0x03BE, -"xmonospace", 0xFF58, -"xparen", 0x24B3, -"xsuperior", 0x02E3, -"y", 0x0079, -"yaadosquare", 0x334E, -"yabengali", 0x09AF, -"yacute", 0x00FD, -"yadeva", 0x092F, -"yaekorean", 0x3152, -"yagujarati", 0x0AAF, -"yagurmukhi", 0x0A2F, -"yahiragana", 0x3084, -"yakatakana", 0x30E4, -"yakatakanahalfwidth", 0xFF94, -"yakorean", 0x3151, -"yamakkanthai", 0x0E4E, -"yasmallhiragana", 0x3083, -"yasmallkatakana", 0x30E3, -"yasmallkatakanahalfwidth", 0xFF6C, -"yatcyrillic", 0x0463, -"ycircle", 0x24E8, -"ycircumflex", 0x0177, -"ydieresis", 0x00FF, -"ydotaccent", 0x1E8F, -"ydotbelow", 0x1EF5, -"yeharabic", 0x064A, -"yehbarreearabic", 0x06D2, -"yehbarreefinalarabic", 0xFBAF, -"yehfinalarabic", 0xFEF2, -"yehhamzaabovearabic", 0x0626, -"yehhamzaabovefinalarabic", 0xFE8A, -"yehhamzaaboveinitialarabic", 0xFE8B, -"yehhamzaabovemedialarabic", 0xFE8C, -"yehinitialarabic", 0xFEF3, -"yehmedialarabic", 0xFEF4, -"yehmeeminitialarabic", 0xFCDD, -"yehmeemisolatedarabic", 0xFC58, -"yehnoonfinalarabic", 0xFC94, -"yehthreedotsbelowarabic", 0x06D1, -"yekorean", 0x3156, -"yen", 0x00A5, -"yenmonospace", 0xFFE5, -"yeokorean", 0x3155, -"yeorinhieuhkorean", 0x3186, -"yerahbenyomohebrew", 0x05AA, -"yerahbenyomolefthebrew", 0x05AA, -"yericyrillic", 0x044B, -"yerudieresiscyrillic", 0x04F9, -"yesieungkorean", 0x3181, -"yesieungpansioskorean", 0x3183, -"yesieungsioskorean", 0x3182, -"yetivhebrew", 0x059A, -"ygrave", 0x1EF3, -"yhook", 0x01B4, -"yhookabove", 0x1EF7, -"yiarmenian", 0x0575, -"yicyrillic", 0x0457, -"yikorean", 0x3162, -"yinyang", 0x262F, -"yiwnarmenian", 0x0582, -"ymonospace", 0xFF59, -"yod", 0x05D9, -"yoddagesh", 0xFB39, -"yoddageshhebrew", 0xFB39, -"yodhebrew", 0x05D9, -"yodyodhebrew", 0x05F2, -"yodyodpatahhebrew", 0xFB1F, -"yohiragana", 0x3088, -"yoikorean", 0x3189, -"yokatakana", 0x30E8, -"yokatakanahalfwidth", 0xFF96, -"yokorean", 0x315B, -"yosmallhiragana", 0x3087, -"yosmallkatakana", 0x30E7, -"yosmallkatakanahalfwidth", 0xFF6E, -"yotgreek", 0x03F3, -"yoyaekorean", 0x3188, -"yoyakorean", 0x3187, -"yoyakthai", 0x0E22, -"yoyingthai", 0x0E0D, -"yparen", 0x24B4, -"ypogegrammeni", 0x037A, -"ypogegrammenigreekcmb", 0x0345, -"yr", 0x01A6, -"yring", 0x1E99, -"ysuperior", 0x02B8, -"ytilde", 0x1EF9, -"yturned", 0x028E, -"yuhiragana", 0x3086, -"yuikorean", 0x318C, -"yukatakana", 0x30E6, -"yukatakanahalfwidth", 0xFF95, -"yukorean", 0x3160, -"yusbigcyrillic", 0x046B, -"yusbigiotifiedcyrillic", 0x046D, -"yuslittlecyrillic", 0x0467, -"yuslittleiotifiedcyrillic", 0x0469, -"yusmallhiragana", 0x3085, -"yusmallkatakana", 0x30E5, -"yusmallkatakanahalfwidth", 0xFF6D, -"yuyekorean", 0x318B, -"yuyeokorean", 0x318A, -"yyabengali", 0x09DF, -"yyadeva", 0x095F, -"z", 0x007A, -"zaarmenian", 0x0566, -"zacute", 0x017A, -"zadeva", 0x095B, -"zagurmukhi", 0x0A5B, -"zaharabic", 0x0638, -"zahfinalarabic", 0xFEC6, -"zahinitialarabic", 0xFEC7, -"zahiragana", 0x3056, -"zahmedialarabic", 0xFEC8, -"zainarabic", 0x0632, -"zainfinalarabic", 0xFEB0, -"zakatakana", 0x30B6, -"zaqefgadolhebrew", 0x0595, -"zaqefqatanhebrew", 0x0594, -"zarqahebrew", 0x0598, -"zayin", 0x05D6, -"zayindagesh", 0xFB36, -"zayindageshhebrew", 0xFB36, -"zayinhebrew", 0x05D6, -"zbopomofo", 0x3117, -"zcaron", 0x017E, -"zcircle", 0x24E9, -"zcircumflex", 0x1E91, -"zcurl", 0x0291, -"zdot", 0x017C, -"zdotaccent", 0x017C, -"zdotbelow", 0x1E93, -"zecyrillic", 0x0437, -"zedescendercyrillic", 0x0499, -"zedieresiscyrillic", 0x04DF, -"zehiragana", 0x305C, -"zekatakana", 0x30BC, -"zero", 0x0030, -"zeroarabic", 0x0660, -"zerobengali", 0x09E6, -"zerodeva", 0x0966, -"zerogujarati", 0x0AE6, -"zerogurmukhi", 0x0A66, -"zerohackarabic", 0x0660, -"zeroinferior", 0x2080, -"zeromonospace", 0xFF10, -"zerooldstyle", 0xF730, -"zeropersian", 0x06F0, -"zerosuperior", 0x2070, -"zerothai", 0x0E50, -"zerowidthjoiner", 0xFEFF, -"zerowidthnonjoiner", 0x200C, -"zerowidthspace", 0x200B, -"zeta", 0x03B6, -"zhbopomofo", 0x3113, -"zhearmenian", 0x056A, -"zhebrevecyrillic", 0x04C2, -"zhecyrillic", 0x0436, -"zhedescendercyrillic", 0x0497, -"zhedieresiscyrillic", 0x04DD, -"zihiragana", 0x3058, -"zikatakana", 0x30B8, -"zinorhebrew", 0x05AE, -"zlinebelow", 0x1E95, -"zmonospace", 0xFF5A, -"zohiragana", 0x305E, -"zokatakana", 0x30BE, -"zparen", 0x24B5, -"zretroflexhook", 0x0290, -"zstroke", 0x01B6, -"zuhiragana", 0x305A, -"zukatakana", 0x30BA, -0x00 -}; - -double_glyph_list_t DoubleGlyphList[] = { -"dalethatafpatah", 0x05D3, 0x05B2, -"dalethatafpatahhebrew", 0x05D3, 0x05B2, -"dalethatafsegol", 0x05D3, 0x05B1, -"dalethatafsegolhebrew", 0x05D3, 0x05B1, -"dalethiriq", 0x05D3, 0x05B4, -"dalethiriqhebrew", 0x05D3, 0x05B4, -"daletholam", 0x05D3, 0x05B9, -"daletholamhebrew", 0x05D3, 0x05B9, -"daletpatah", 0x05D3, 0x05B7, -"daletpatahhebrew", 0x05D3, 0x05B7, -"daletqamats", 0x05D3, 0x05B8, -"daletqamatshebrew", 0x05D3, 0x05B8, -"daletqubuts", 0x05D3, 0x05BB, -"daletqubutshebrew", 0x05D3, 0x05BB, -"daletsegol", 0x05D3, 0x05B6, -"daletsegolhebrew", 0x05D3, 0x05B6, -"daletsheva", 0x05D3, 0x05B0, -"daletshevahebrew", 0x05D3, 0x05B0, -"dalettsere", 0x05D3, 0x05B5, -"dalettserehebrew", 0x05D3, 0x05B5, -"finalkafqamats", 0x05DA, 0x05B8, -"finalkafqamatshebrew", 0x05DA, 0x05B8, -"finalkafsheva", 0x05DA, 0x05B0, -"finalkafshevahebrew", 0x05DA, 0x05B0, -"hamzadammaarabic", 0x0621, 0x064F, -"hamzadammatanarabic", 0x0621, 0x064C, -"hamzafathaarabic", 0x0621, 0x064E, -"hamzafathatanarabic", 0x0621, 0x064B, -"hamzalowkasraarabic", 0x0621, 0x0650, -"hamzalowkasratanarabic", 0x0621, 0x064D, -"hamzasukunarabic", 0x0621, 0x0652, -"lamedholam", 0x05DC, 0x05B9, -"lamedholamhebrew", 0x05DC, 0x05B9, -"noonhehinitialarabic", 0xFEE7, 0xFEEC, -"qofhatafpatah", 0x05E7, 0x05B2, -"qofhatafpatahhebrew", 0x05E7, 0x05B2, -"qofhatafsegol", 0x05E7, 0x05B1, -"qofhatafsegolhebrew", 0x05E7, 0x05B1, -"qofhiriq", 0x05E7, 0x05B4, -"qofhiriqhebrew", 0x05E7, 0x05B4, -"qofholam", 0x05E7, 0x05B9, -"qofholamhebrew", 0x05E7, 0x05B9, -"qofpatah", 0x05E7, 0x05B7, -"qofpatahhebrew", 0x05E7, 0x05B7, -"qofqamats", 0x05E7, 0x05B8, -"qofqamatshebrew", 0x05E7, 0x05B8, -"qofqubuts", 0x05E7, 0x05BB, -"qofqubutshebrew", 0x05E7, 0x05BB, -"qofsegol", 0x05E7, 0x05B6, -"qofsegolhebrew", 0x05E7, 0x05B6, -"qofsheva", 0x05E7, 0x05B0, -"qofshevahebrew", 0x05E7, 0x05B0, -"qoftsere", 0x05E7, 0x05B5, -"qoftserehebrew", 0x05E7, 0x05B5, -"reshhatafpatah", 0x05E8, 0x05B2, -"reshhatafpatahhebrew", 0x05E8, 0x05B2, -"reshhatafsegol", 0x05E8, 0x05B1, -"reshhatafsegolhebrew", 0x05E8, 0x05B1, -"reshhiriq", 0x05E8, 0x05B4, -"reshhiriqhebrew", 0x05E8, 0x05B4, -"reshholam", 0x05E8, 0x05B9, -"reshholamhebrew", 0x05E8, 0x05B9, -"reshpatah", 0x05E8, 0x05B7, -"reshpatahhebrew", 0x05E8, 0x05B7, -"reshqamats", 0x05E8, 0x05B8, -"reshqamatshebrew", 0x05E8, 0x05B8, -"reshqubuts", 0x05E8, 0x05BB, -"reshqubutshebrew", 0x05E8, 0x05BB, -"reshsegol", 0x05E8, 0x05B6, -"reshsegolhebrew", 0x05E8, 0x05B6, -"reshsheva", 0x05E8, 0x05B0, -"reshshevahebrew", 0x05E8, 0x05B0, -"reshtsere", 0x05E8, 0x05B5, -"reshtserehebrew", 0x05E8, 0x05B5, -"shaddafathatanarabic", 0x0651, 0x064B, -"tchehmeeminitialarabic", 0xFB7C, 0xFEE4, -0x00 -}; - -treble_glyph_list_t TrebleGlyphList[] = { -"lamedholamdagesh", 0x05DC, 0x05B9, 0x05BC, -"lamedholamdageshhebrew", 0x05DC, 0x05B9, 0x05BC, -"lammeemjeeminitialarabic", 0xFEDF, 0xFEE4, 0xFEA0, -"lammeemkhahinitialarabic", 0xFEDF, 0xFEE4, 0xFEA8, -0x00 -}; - -quad_glyph_list_t QuadGlyphList[] = { -"rehyehaleflamarabic", 0x0631, 0xFEF3, 0xFE8E, 0x0644, -0x00 -}; diff -Nru ghostscript-9.04~dfsg/base/gdevbbox.c ghostscript-9.05~dfsg~20120125/base/gdevbbox.c --- ghostscript-9.04~dfsg/base/gdevbbox.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevbbox.c 2011-11-21 08:55:19.000000000 +0000 @@ -49,6 +49,7 @@ static dev_proc_draw_thin_line(bbox_draw_thin_line); static dev_proc_strip_tile_rectangle(bbox_strip_tile_rectangle); static dev_proc_strip_copy_rop(bbox_strip_copy_rop); +static dev_proc_strip_copy_rop2(bbox_strip_copy_rop2); static dev_proc_begin_typed_image(bbox_begin_typed_image); static dev_proc_create_compositor(bbox_create_compositor); static dev_proc_text_begin(bbox_text_begin); @@ -147,7 +148,12 @@ bbox_fillpage, /* fillpage */ NULL, /* push_transparency_state */ NULL, /* pop_transparency_state */ - NULL /* put_image */ + NULL, /* put_image */ + NULL, /* dev_spec_op */ + NULL, /* copy_planes */ + NULL, /* get_profile */ + NULL, /* set_graphics_type_tag */ + bbox_strip_copy_rop2 }, 0, /* target */ 1, /*true *//* free_standing */ @@ -494,6 +500,31 @@ return code; } +static int +bbox_strip_copy_rop2(gx_device * dev, + const byte * sdata, int sourcex, uint sraster, + gx_bitmap_id id, + const gx_color_index * scolors, + const gx_strip_bitmap * textures, + const gx_color_index * tcolors, + int x, int y, int w, int h, + int phase_x, int phase_y, gs_logical_operation_t lop, + uint planar_height) +{ + gx_device_bbox *const bdev = (gx_device_bbox *) dev; + /* gx_forward_strip_copy_rop doesn't exist */ + gx_device *tdev = bdev->target; + int code = + (tdev == 0 ? 0 : + dev_proc(tdev, strip_copy_rop2) + (tdev, sdata, sourcex, sraster, id, scolors, + textures, tcolors, x, y, w, h, phase_x, phase_y, lop, + planar_height)); + + BBOX_ADD_INT_RECT(bdev, x, y, x + w, y + h); + return code; +} + /* ---------------- Parameters ---------------- */ /* We implement get_params to provide a way to read out the bounding box. */ diff -Nru ghostscript-9.04~dfsg/base/gdevbit.c ghostscript-9.05~dfsg~20120125/base/gdevbit.c --- ghostscript-9.04~dfsg/base/gdevbit.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevbit.c 2011-11-12 18:29:08.000000000 +0000 @@ -369,9 +369,9 @@ bittag_rgb_map_rgb_color(gx_device * dev, const gx_color_value cv[]) { return - ((cv[2]) >> ((sizeof(gx_color_value) * 8) - 8)) + - ((uint) ((cv[1]) >> ((sizeof(gx_color_value) * 8) - 8)) << 8) + - ((ulong) ((cv[0]) >> ((sizeof(gx_color_value) * 8) - 8)) << 16) + + gx_color_value_to_byte(cv[2]) + + (((uint) gx_color_value_to_byte(cv[1])) << 8) + + (((ulong) gx_color_value_to_byte(cv[0])) << 16) + ((ulong)(dev->graphics_type_tag & ~GS_DEVICE_ENCODES_TAGS) << 24); } diff -Nru ghostscript-9.04~dfsg/base/gdevcdj.c ghostscript-9.05~dfsg~20120125/base/gdevcdj.c --- ghostscript-9.04~dfsg/base/gdevcdj.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevcdj.c 2011-11-12 18:29:08.000000000 +0000 @@ -2814,16 +2814,16 @@ ((cv) << (gx_color_value_bits - (b))) #define gx_cmyk_value_bits(c, m, y, k, b) \ - ((gx_color_value_to_bits((k), (b)) << (3 * (b))) | \ - (gx_color_value_to_bits((c), (b)) << (2 * (b))) | \ - (gx_color_value_to_bits((m), (b)) << (b)) | \ - (gx_color_value_to_bits((y), (b)))) + (((COLROUND_ROUND(k)) << (3 * (b))) | \ + ((COLROUND_ROUND(c)) << (2 * (b))) | \ + ((COLROUND_ROUND(m)) << (b)) | \ + ((COLROUND_ROUND(y)))) #define gx_value_cmyk_bits(v, c, m, y, k, b) \ - (k) = gx_bits_to_color_value(((v) >> (3 * (b))) & ((1 << (b)) - 1), (b)), \ - (c) = gx_bits_to_color_value(((v) >> (2 * (b))) & ((1 << (b)) - 1), (b)), \ - (m) = gx_bits_to_color_value(((v) >> (b)) & ((1 << (b)) - 1), (b)), \ - (y) = gx_bits_to_color_value((v) & ((1 << (b)) - 1), (b)) + (k) = COLDUP_DUP(((v) >> (3 * (b))) & ((1 << (b)) - 1)), \ + (c) = COLDUP_DUP(((v) >> (2 * (b))) & ((1 << (b)) - 1)), \ + (m) = COLDUP_DUP(((v) >> (b)) & ((1 << (b)) - 1)), \ + (y) = COLDUP_DUP((v) & ((1 << (b)) - 1)) static gx_color_index gdev_cmyk_map_cmyk_color(gx_device* pdev, const gx_color_value cv[]) @@ -2838,10 +2838,11 @@ break; default: { - int nbits = pdev->color_info.depth; + COLROUND_VARS; + int nbits = pdev->color_info.depth>>2; + COLROUND_SETUP(nbits); - color = gx_cmyk_value_bits(cyan, magenta, yellow, black, - nbits >> 2); + color = gx_cmyk_value_bits(cyan, magenta, yellow, black, nbits); } } @@ -2903,10 +2904,11 @@ default: { unsigned long bcyan, bmagenta, byellow, black; - int nbits = pdev->color_info.depth; + int nbits = pdev->color_info.depth>>2; + COLDUP_VARS; - gx_value_cmyk_bits(color, bcyan, bmagenta, byellow, black, - nbits >> 2); + COLDUP_SETUP(nbits); + gx_value_cmyk_bits(color, bcyan, bmagenta, byellow, black, nbits); prgb[0] = bcyan; prgb[1] = bmagenta; @@ -2988,6 +2990,7 @@ (ulong)y * blue_weight) >> (gx_color_value_bits + 2))); case 16: + /* FIXME: Simple truncation is not ideal. Should round really. */ #define gx_color_value_to_5bits(cv) ((cv) >> (gx_color_value_bits - 5)) #define gx_color_value_to_6bits(cv) ((cv) >> (gx_color_value_bits - 6)) return (gx_color_value_to_5bits(y) + diff -Nru ghostscript-9.04~dfsg/base/gdevcfax.c ghostscript-9.05~dfsg~20120125/base/gdevcfax.c --- ghostscript-9.04~dfsg/base/gdevcfax.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevcfax.c 2011-11-12 18:29:08.000000000 +0000 @@ -120,7 +120,7 @@ bool nul = !strcmp(pdev->fname, "nul"); /* Initialize the common part of the encoder state. */ - ss->template = temp; + ss->templat = temp; ss->memory = mem; /* Allocate the buffers. */ diff -Nru ghostscript-9.04~dfsg/base/gdevcgm.c ghostscript-9.05~dfsg~20120125/base/gdevcgm.c --- ghostscript-9.04~dfsg/base/gdevcgm.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevcgm.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,495 +0,0 @@ -/* Copyright (C) 2001-2006 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ -/* $Id$ */ -/* CGM (Computer Graphics Metafile) driver */ -#include "memory_.h" -#include "gx.h" -#include "gserrors.h" -#include "gxdevice.h" -#include "gp.h" -#include "gsparam.h" -#include "gsutil.h" -#include "gdevcgml.h" -#include "gdevpccm.h" - -/**************** Future optimizations: - Do tile_rectangle with pattern - Keep track of painted area, - do masked copy_mono with cell array if possible - ****************/ - -typedef struct gx_device_cgm_s { - gx_device_common; - char fname[gp_file_name_sizeof]; - FILE *file; - cgm_state *st; - bool in_picture; -} gx_device_cgm; - -/* GC descriptor */ -gs_private_st_suffix_add1_final(st_device_cgm, gx_device_cgm, - "gx_device_cgm", device_cgm_enum_ptrs, device_cgm_reloc_ptrs, - gx_device_finalize, st_device, st); - -/* Device procedures */ -static dev_proc_open_device(cgm_open); -static dev_proc_output_page(cgm_output_page); -static dev_proc_close_device(cgm_close); -static dev_proc_fill_rectangle(cgm_fill_rectangle); - -#if 0 -static dev_proc_tile_rectangle(cgm_tile_rectangle); - -#else -#define cgm_tile_rectangle NULL -#endif -static dev_proc_copy_mono(cgm_copy_mono); -static dev_proc_copy_color(cgm_copy_color); -static dev_proc_get_params(cgm_get_params); -static dev_proc_put_params(cgm_put_params); - -/* In principle, all the drawing operations should be polymorphic, */ -/* but it's just as easy just to test the depth, since we're not */ -/* very concerned about performance. */ -#define cgm_device(dname, depth, max_value, dither, map_rgb_color, map_color_rgb)\ -{ std_device_color_stype_body(gx_device_cgm, 0, dname, &st_device_cgm,\ - 850, 1100, 100, 100, depth, max_value, dither),\ - { cgm_open,\ - NULL, /* get_initial_matrix */\ - NULL, /* sync_output */\ - cgm_output_page,\ - cgm_close,\ - map_rgb_color,\ - map_color_rgb,\ - cgm_fill_rectangle,\ - cgm_tile_rectangle,\ - cgm_copy_mono,\ - cgm_copy_color,\ - NULL, /* draw_line */\ - NULL, /* get_bits */\ - cgm_get_params,\ - cgm_put_params\ - },\ - { 0 }, /* fname */\ - 0, /* file */\ - 0, /* st */\ - 0 /*false*/ /* in_picture */\ -} - -gx_device_cgm gs_cgmmono_device = -cgm_device("cgmmono", 1, 1, 2, - gx_default_map_rgb_color, gx_default_w_b_map_color_rgb); - -gx_device_cgm gs_cgm8_device = -cgm_device("cgm8", 8, 5, 6, - pc_8bit_map_rgb_color, pc_8bit_map_color_rgb); - -gx_device_cgm gs_cgm24_device = -cgm_device("cgm24", 24, 255, 255, - gx_default_rgb_map_rgb_color, gx_default_rgb_map_color_rgb); - -/* Define allocator procedures for the CGM library. */ -static void * -cgm_gs_alloc(void *private_data, uint size) -{ - gx_device_cgm *cdev = private_data; - - return gs_alloc_bytes(cdev->memory, size, "cgm_gs_alloc"); -} -static void -cgm_gs_free(void *private_data, void *obj) -{ - gx_device_cgm *cdev = private_data; - - gs_free_object(cdev->memory, obj, "cgm_gs_free"); -} - -/* ---------------- Utilities ---------------- */ - -/* Convert a CGM result code to our error values. */ -static int -cgm_error_code(cgm_result result) -{ - switch (result) { - default: - case cgm_result_wrong_state: - return gs_error_unknownerror; - case cgm_result_out_of_range: - return gs_error_rangecheck; - case cgm_result_io_error: - return gs_error_ioerror; - } -} -#define check_result(result)\ - if ( result != cgm_result_ok ) return_error(cgm_error_code(result)) - -/* ---------------- Device control ---------------- */ - -/* Open the device */ -static int -cgm_open(gx_device * dev) -{ - gx_device_cgm *cdev = (gx_device_cgm *) dev; - cgm_allocator cal; - static const int elements[] = - {-1, 1}; - cgm_metafile_elements meta; - cgm_result result; - - cdev->file = fopen(cdev->fname, "wb"); - if (cdev->file == 0) - return_error(gs_error_ioerror); - cal.private_data = cdev; - cal.alloc = cgm_gs_alloc; - cal.free = cgm_gs_free; - cdev->st = cgm_initialize(cdev->file, &cal); - if (cdev->st == 0) - return_error(gs_error_VMerror); - result = cgm_BEGIN_METAFILE(cdev->st, "", 0); - check_result(result); - meta.metafile_version = 1; - meta.vdc_type = cgm_vdc_integer; - meta.integer_precision = sizeof(cgm_int) * 8; - meta.index_precision = sizeof(cgm_int) * 8; - meta.color_precision = 8; - /* If we use color indices at all, they are only 1 byte. */ - meta.color_index_precision = 8; - meta.maximum_color_index = (1L << cdev->color_info.depth) - 1; - meta.metafile_element_list = elements, - meta.metafile_element_list_count = countof(elements) / 2; - result = cgm_set_metafile_elements(cdev->st, &meta, - cgm_set_METAFILE_VERSION | - cgm_set_VDC_TYPE | - cgm_set_INTEGER_PRECISION | - cgm_set_INDEX_PRECISION | - cgm_set_COLOR_PRECISION | - cgm_set_COLOR_INDEX_PRECISION | - cgm_set_MAXIMUM_COLOR_INDEX | - cgm_set_METAFILE_ELEMENT_LIST); - check_result(result); - cdev->in_picture = false; - return 0; -} - -/* Output a page */ -static int -cgm_output_page(gx_device * dev, int num_copies, int flush) -{ - gx_device_cgm *cdev = (gx_device_cgm *) dev; - - if (cdev->in_picture) { - cgm_result result = cgm_END_PICTURE(cdev->st); - - check_result(result); - cdev->in_picture = false; - return gx_finish_output_page(dev, num_copies, flush); - } - return 0; -} - -/* Close the device */ -static int -cgm_close(gx_device * dev) -{ - gx_device_cgm *cdev = (gx_device_cgm *) dev; - int code = cgm_output_page(dev, 1, 0); - cgm_result result; - - if (code < 0) - return code; - result = cgm_END_METAFILE(cdev->st); - check_result(result); - result = cgm_terminate(cdev->st); - check_result(result); - cdev->st = 0; - fclose(cdev->file); - cdev->file = 0; - return 0; -} - -/* Get parameters. CGM devices add OutputFile to the default set. */ -static int -cgm_get_params(gx_device * dev, gs_param_list * plist) -{ - gx_device_cgm *cdev = (gx_device_cgm *) dev; - int code = gx_default_get_params(dev, plist); - gs_param_string ofns; - - if (code < 0) - return code; - ofns.data = (const byte *)cdev->fname, - ofns.size = strlen(cdev->fname), - ofns.persistent = false; - return param_write_string(plist, "OutputFile", &ofns); -} - -/* Put parameters. */ -static int -cgm_put_params(gx_device * dev, gs_param_list * plist) -{ - gx_device_cgm *cdev = (gx_device_cgm *) dev; - int ecode = 0; - int code; - const char *param_name; - gs_param_string ofs; - - switch (code = param_read_string(plist, (param_name = "OutputFile"), &ofs)) { - case 0: - if (dev->LockSafetyParams && - bytes_compare(ofs.data, ofs.size, - (const byte *)cdev->fname, strlen(cdev->fname))) { - ecode = gs_note_error(gs_error_invalidaccess); - goto ofe; - } - if (ofs.size >= gp_file_name_sizeof) - ecode = gs_error_limitcheck; - else - break; - goto ofe; - default: - ecode = code; - ofe:param_signal_error(plist, param_name, ecode); - case 1: - ofs.data = 0; - break; - } - - if (ecode < 0) - return ecode; - code = gx_default_put_params(dev, plist); - if (code < 0) - return code; - - if (ofs.data != 0) { /* Close the file if it's open. */ - if (cdev->file != 0) { - fclose(cdev->file); - cdev->file = 0; - } - memcpy(cdev->fname, ofs.data, ofs.size); - cdev->fname[ofs.size] = 0; - cdev->file = fopen(cdev->fname, "wb"); - if (cdev->file == 0) - return_error(gs_error_ioerror); - } - return 0; -} - -/* ---------------- Drawing ---------------- */ - -/* Set the corner points for a rectangle. It appears (although */ -/* this is not obvious from the CGM specification) that rectangles */ -/* are specified with closed, rather than half-open, intervals. */ -#define cgm_set_rect(points, xo, yo, w, h)\ - points[1].integer.x = (points[0].integer.x = xo) + (w) - 1,\ - points[1].integer.y = (points[0].integer.y = yo) + (h) - 1 - -/* Set the points for a cell array. */ -#define cgm_set_cell_points(pqr, xo, yo, w, h)\ - pqr[0].integer.x = (xo),\ - pqr[0].integer.y = (yo),\ - pqr[1].integer.x = (xo) + (w),\ - pqr[1].integer.y = (yo) + (h),\ - pqr[2].integer.x = (xo) + (w),\ - pqr[2].integer.y = (yo) - -/* Begin a picture if necessary. */ -#define begin_picture(cdev)\ - if ( !cdev->in_picture ) cgm_begin_picture(cdev) -static int -cgm_begin_picture(gx_device_cgm * cdev) -{ - cgm_picture_elements pic; - cgm_result result; - cgm_edge_width edge; - - result = cgm_BEGIN_PICTURE(cdev->st, "", 0); - check_result(result); - pic.scaling_mode = cgm_scaling_abstract; - pic.color_selection_mode = - (cdev->color_info.depth <= 8 ? - cgm_color_selection_indexed : - cgm_color_selection_direct); - pic.line_width_specification_mode = cgm_line_marker_absolute; - pic.edge_width_specification_mode = cgm_line_marker_absolute; - cgm_set_rect(pic.vdc_extent, 0, 0, cdev->width, cdev->height); - result = cgm_set_picture_elements(cdev->st, &pic, - cgm_set_SCALING_MODE | - cgm_set_COLOR_SELECTION_MODE | - cgm_set_LINE_WIDTH_SPECIFICATION_MODE | - cgm_set_EDGE_WIDTH_SPECIFICATION_MODE | - cgm_set_VDC_EXTENT); - check_result(result); - result = cgm_BEGIN_PICTURE_BODY(cdev->st); - check_result(result); - result = cgm_VDC_INTEGER_PRECISION(cdev->st, - (cdev->width <= 0x7fff && - cdev->height <= 0x7fff ? - 16 : sizeof(cdev->width) * 8)); - check_result(result); - edge.absolute.integer = 0; - result = cgm_EDGE_WIDTH(cdev->st, &edge); - check_result(result); - if (cdev->color_info.depth <= 8) { - cgm_color colors[256]; - int i; - - for (i = 0; i < (1 << cdev->color_info.depth); i++) { - gx_color_value rgb[3]; - - (*dev_proc(cdev, map_color_rgb)) ((gx_device *) cdev, - (gx_color_index) i, rgb); - colors[i].rgb.r = - rgb[0] >> (gx_color_value_bits - 8); - colors[i].rgb.g = - rgb[1] >> (gx_color_value_bits - 8); - colors[i].rgb.b = - rgb[2] >> (gx_color_value_bits - 8); - } - result = cgm_COLOR_TABLE(cdev->st, 0, colors, - 1 << cdev->color_info.depth); - check_result(result); - } - cdev->in_picture = true; - return 0; -} - -/* Convert a gx_color_index to a CGM color. */ -static void -cgm_color_from_color_index(cgm_color * pcc, const gx_device_cgm * cdev, - gx_color_index color) -{ - if (cdev->color_info.depth <= 8) - pcc->index = color; - else { - pcc->rgb.r = color >> 16; - pcc->rgb.g = (color >> 8) & 255; - pcc->rgb.b = color & 255; - } -} - -/* Fill a rectangle. */ -static int -cgm_fill_rectangle(gx_device * dev, int x, int y, int w, int h, - gx_color_index color) -{ - gx_device_cgm *cdev = (gx_device_cgm *) dev; - cgm_color fill_color; - cgm_point points[2]; - cgm_result result; - - fit_fill(dev, x, y, w, h); - if (!cdev->in_picture) { /* Check for erasepage. */ - gx_color_value blank[3] = {gx_max_color_value, gx_max_color_value, - gx_max_color_value}; - if (color == (*dev_proc(dev, encode_color)) (dev, blank)) - return 0; - cgm_begin_picture(cdev); - } - cgm_color_from_color_index(&fill_color, cdev, color); - result = cgm_FILL_COLOR(cdev->st, &fill_color); - check_result(result); - result = cgm_INTERIOR_STYLE(cdev->st, cgm_interior_style_solid); - check_result(result); - cgm_set_rect(points, x, y, w, h); - result = cgm_RECTANGLE(cdev->st, &points[0], &points[1]); - check_result(result); - return 0; -} - -#if 0 -/* Tile a rectangle. We should do this with a pattern if possible. */ -static int -cgm_tile_rectangle(gx_device * dev, const gx_tile_bitmap * tile, - int x, int y, int w, int h, gx_color_index zero, gx_color_index one, - int px, int py) -{ -} -#endif - -/* Copy a monochrome bitmap. Unfortunately, CGM doesn't provide a */ -/* masked fill operation; if one of the colors is transparent, */ -/* we have to do the copy by filling lots of tiny little rectangles. */ -/* A much better way to implement this would be to remember whether */ -/* the destination region is still white; if so, we can use a cell array */ -/* (or, even better, a pattern). However, we still need the slow method */ -/* for the case where we don't know the background color or it isn't white. */ -static int -cgm_copy_mono(gx_device * dev, - const byte * base, int sourcex, int raster, gx_bitmap_id id, - int x, int y, int w, int h, gx_color_index zero, gx_color_index one) -{ - gx_device_cgm *cdev = (gx_device_cgm *) dev; - - /* The current implementation is about as inefficient as */ - /* one could possibly imagine! */ - int ix, iy; - cgm_result result; - - fit_copy(dev, base, sourcex, raster, id, x, y, w, h); - begin_picture(cdev); - if (zero == 0 && one == 1 && cdev->color_info.depth == 1) { - cgm_point pqr[3]; - - cgm_set_cell_points(pqr, x, y, w, h); - result = cgm_CELL_ARRAY(cdev->st, pqr, w, h, 1, - cgm_cell_mode_packed, - base, sourcex, raster); - check_result(result); - } else { - result = cgm_INTERIOR_STYLE(cdev->st, cgm_interior_style_solid); - check_result(result); - for (iy = 0; iy < h; iy++) - for (ix = 0; ix < w; ix++) { - int px = ix + sourcex; - const byte *pixel = &base[iy * raster + (px >> 3)]; - byte mask = 0x80 >> (px & 7); - gx_color_index color = (*pixel & mask ? one : zero); - - if (color != gx_no_color_index) { - cgm_color fill_color; - cgm_point points[2]; - - cgm_color_from_color_index(&fill_color, cdev, color); - cgm_set_rect(points, x, y, 1, 1); - result = cgm_RECTANGLE(cdev->st, &points[0], &points[1]); - check_result(result); - } - } - } - return 0; -} - -/* Copy a color bitmap. */ -static int -cgm_copy_color(gx_device * dev, - const byte * base, int sourcex, int raster, gx_bitmap_id id, - int x, int y, int w, int h) -{ - gx_device_cgm *cdev = (gx_device_cgm *) dev; - int depth = cdev->color_info.depth; - uint source_bit = sourcex * depth; - cgm_point pqr[3]; - cgm_result result; - - if (depth == 1) - return cgm_copy_mono(dev, base, sourcex, raster, id, - x, y, w, h, - (gx_color_index) 0, (gx_color_index) 1); - fit_copy(dev, base, sourcex, raster, id, x, y, w, h); - begin_picture(cdev); - cgm_set_cell_points(pqr, x, y, w, h); - result = cgm_CELL_ARRAY(cdev->st, pqr, w, h, 0, cgm_cell_mode_packed, - base, source_bit, raster); - check_result(result); - return 0; -} diff -Nru ghostscript-9.04~dfsg/base/gdevcgml.c ghostscript-9.05~dfsg~20120125/base/gdevcgml.c --- ghostscript-9.04~dfsg/base/gdevcgml.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevcgml.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1152 +0,0 @@ -/* Copyright (C) 2001-2006 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ -/* $Id$ */ -/* CGM-writing library */ -#include "memory_.h" -#include "stdio_.h" -#include "gdevcgmx.h" - -/* Forward references to command-writing procedures */ -static void begin_command(cgm_state *, cgm_op_index); - -#define OP(op) begin_command(st, op) -static cgm_result end_command(cgm_state *); - -#define END_OP (void)end_command(st) -#define DONE return end_command(st) -/* Parameters */ -static void put_int(cgm_state *, cgm_int, int); - -#define CI(ci) put_int(st, ci, st->metafile.color_index_precision) -#define I(i) put_int(st, i, st->metafile.integer_precision) -#define IX(ix) put_int(st, ix, st->metafile.index_precision) -#define E(e) put_int(st, (int)(e), 16) -static void put_real(cgm_state *, cgm_real, const cgm_precision *); - -#define R(r) put_real(st, r, &st->metafile.real_precision) -static void put_vdc(cgm_state *, const cgm_vdc *); - -#define VDC(vdc) put_vdc(st, vdc) -#define VDC2(vdc1, vdc2) VDC(vdc1); VDC(vdc2) -#define VDC4(vdc1, vdc2, vdc3, vdc4) VDC2(vdc1, vdc2); VDC2(vdc3, vdc4) -static void put_vdc_r(cgm_state *, const cgm_line_marker_extent *, cgm_line_marker_specification_mode); - -#define VDC_R(vdcr, mode) put_vdc_r(st, vdcr, mode) -static void put_point(cgm_state *, const cgm_point *); - -#define P(p) put_point(st, p) -static void put_points(cgm_state *, const cgm_point *, int); - -#define nP(p, n) put_points(st, p, n) -static void put_string(cgm_state *, const char *, uint); - -#define S(s, l) put_string(st, s, l) -static void put_color(cgm_state *, const cgm_color *); - -#define CO(co) put_color(st, co) -static void put_rgb(cgm_state *, const cgm_rgb *); - -#define CD(cd) put_rgb(st, cd) -/* Other data types */ -#define put_byte(st, b)\ - if ( st->command_count == command_max_count ) write_command(st, false);\ - st->command[st->command_count++] = (byte)(b) -static void put_bytes(cgm_state *, const byte *, uint); -static void write_command(cgm_state *, bool); -static void put_real_precision(cgm_state *, const cgm_precision *); - -/* ================ Public routines ================ */ - -/* ---------------- Initialize/terminate ---------------- */ - -/* Initialize a CGM writer. */ -cgm_state * -cgm_initialize(FILE * file, const cgm_allocator * cal) -{ - cgm_state *st = (*cal->alloc) (cal->private_data, sizeof(cgm_state)); - - if (st == 0) - return 0; - st->file = file; - st->allocator = *cal; - /* Initialize metafile elements. */ - st->metafile.vdc_type = cgm_vdc_integer; - st->metafile.integer_precision = 16; - st->metafile.real_precision.representation = cgm_representation_fixed; - st->metafile.real_precision.exponent_or_whole_width = 16; - st->metafile.real_precision.fraction_width = 16; - st->metafile.index_precision = 16; - st->metafile.color_precision = 8; - st->metafile.color_index_precision = 8; - st->metafile.maximum_color_index = 63; - /* color_value_extent */ - /*st->metafile.character_coding_announcer = 0; */ - /* Initialize picture elements. */ - st->picture.scaling_mode = cgm_scaling_abstract; - st->picture.color_selection_mode = cgm_color_selection_indexed; - st->picture.line_width_specification_mode = cgm_line_marker_absolute; - st->picture.marker_size_specification_mode = cgm_line_marker_absolute; - st->picture.edge_width_specification_mode = cgm_line_marker_absolute; - /* vdc_extent */ - /* background_color */ - /* Initialize control elements. */ - st->vdc_integer_precision = st->metafile.integer_precision; - st->vdc_real_precision = st->metafile.real_precision; - st->transparency = cgm_transparency_on; - /* clip_rectangle */ - st->clip_indicator = cgm_clip_on; - /* Initialize other state elements. */ - st->line_bundle_index = 1; - st->line_type = cgm_line_solid; - /* line_width */ - /* line_color */ - st->marker_bundle_index = 1; - st->marker_type = cgm_marker_asterisk; - /* marker_size */ - /* marker_color */ - st->text_bundle_index = 1; - st->text_font_index = 1; - st->text_precision = cgm_text_precision_string; - st->character_expansion_factor = 1.0; - st->character_spacing = 0.0; - /* text_color */ - /* character_height */ - /* character_orientation */ - st->text_path = cgm_text_path_right; - /* text_alignment */ - st->character_set_index = 1; - st->alternate_character_set_index = 1; - st->fill_bundle_index = 1; - st->interior_style = cgm_interior_style_hollow; - st->hatch_index = cgm_hatch_horizontal; - st->pattern_index = 1; - st->edge_bundle_index = 1; - st->edge_type = cgm_edge_solid; - /* edge_width */ - st->edge_visibility = false; - /* fill_reference_point */ - /* pattern_table */ - /* pattern_size */ - /* color_table */ - memset(st->source_flags, (byte) cgm_aspect_source_individual, - sizeof(st->source_flags)); - return st; -} - -/* Terminate a CGM writer. */ -cgm_result -cgm_terminate(cgm_state * st) -{ - (*st->allocator.free) (st->allocator.private_data, st); - return cgm_result_ok; -} - -/* ---------------- Metafile elements ---------------- */ - -cgm_result -cgm_BEGIN_METAFILE(cgm_state * st, const char *str, uint len) -{ - OP(BEGIN_METAFILE); - S(str, len); - DONE; -} - -cgm_result -cgm_set_metafile_elements(cgm_state * st, const cgm_metafile_elements * meta, long mask) -{ - if ((mask & cgm_set_METAFILE_VERSION)) { - OP(METAFILE_VERSION); - I(meta->metafile_version); - END_OP; - st->metafile.metafile_version = meta->metafile_version; - } - if ((mask & cgm_set_METAFILE_DESCRIPTION)) { - OP(METAFILE_DESCRIPTION); - S(meta->metafile_description.chars, meta->metafile_description.length); - END_OP; - st->metafile.metafile_description = meta->metafile_description; - } - if ((mask & cgm_set_VDC_TYPE)) { - OP(VDC_TYPE); - E(meta->vdc_type); - END_OP; - st->metafile.vdc_type = meta->vdc_type; - } - if ((mask & cgm_set_INTEGER_PRECISION)) { - OP(INTEGER_PRECISION); - I(meta->integer_precision); - END_OP; - st->metafile.integer_precision = meta->integer_precision; - } - if ((mask & cgm_set_REAL_PRECISION)) { - OP(REAL_PRECISION); - put_real_precision(st, &meta->real_precision); - END_OP; - st->metafile.real_precision = meta->real_precision; - } - if ((mask & cgm_set_INDEX_PRECISION)) { - OP(INDEX_PRECISION); - I(meta->index_precision); - END_OP; - st->metafile.index_precision = meta->index_precision; - } - if ((mask & cgm_set_COLOR_PRECISION)) { - OP(COLOR_PRECISION); - I(meta->color_precision); - END_OP; - st->metafile.color_index_precision = meta->color_index_precision; - } - if ((mask & cgm_set_COLOR_INDEX_PRECISION)) { - OP(COLOR_INDEX_PRECISION); - I(meta->color_index_precision); - END_OP; - st->metafile.color_index_precision = meta->color_index_precision; - } - if ((mask & cgm_set_MAXIMUM_COLOR_INDEX)) { - OP(MAXIMUM_COLOR_INDEX); - CI(meta->maximum_color_index); - END_OP; - st->metafile.maximum_color_index = meta->maximum_color_index; - } - if ((mask & cgm_set_METAFILE_ELEMENT_LIST)) { - int i; - const int *p; - - OP(METAFILE_ELEMENT_LIST); - for (i = 0, p = meta->metafile_element_list; - i < meta->metafile_element_list_count; - i++, p += 2 - ) { - I(p[0]); - I(p[1]); - } - END_OP; - st->metafile.metafile_element_list = - meta->metafile_element_list; - st->metafile.metafile_element_list_count = - meta->metafile_element_list_count; - } - /* element list */ - if ((mask & cgm_set_FONT_LIST)) { - int i; - - OP(FONT_LIST); - for (i = 0; i < meta->font_list_count; ++i) - S(meta->font_list[i].chars, meta->font_list[i].length); - END_OP; - st->metafile.font_list = meta->font_list; - st->metafile.font_list_count = meta->font_list_count; - } - /* character set list */ - /* character coding announcer */ - return st->result; -} - -cgm_result -cgm_END_METAFILE(cgm_state * st) -{ - OP(END_METAFILE); - DONE; -} - -/* ---------------- Picture elements ---------------- */ - -cgm_result -cgm_BEGIN_PICTURE(cgm_state * st, const char *str, uint len) -{ - OP(BEGIN_PICTURE); - S(str, len); - DONE; -} - -cgm_result -cgm_set_picture_elements(cgm_state * st, const cgm_picture_elements * pic, long mask) -{ - if ((mask & cgm_set_SCALING_MODE)) { - OP(SCALING_MODE); - E(pic->scaling_mode); - R(pic->scale_factor); - st->picture.scaling_mode = pic->scaling_mode; - st->picture.scale_factor = pic->scale_factor; - END_OP; - } - if ((mask & cgm_set_COLOR_SELECTION_MODE)) { - OP(COLOR_SELECTION_MODE); - E(pic->color_selection_mode); - END_OP; - st->picture.color_selection_mode = pic->color_selection_mode; - } - if ((mask & cgm_set_LINE_WIDTH_SPECIFICATION_MODE)) { - OP(LINE_WIDTH_SPECIFICATION_MODE); - E(pic->line_width_specification_mode); - END_OP; - st->picture.line_width_specification_mode = pic->line_width_specification_mode; - } - if ((mask & cgm_set_MARKER_SIZE_SPECIFICATION_MODE)) { - OP(MARKER_SIZE_SPECIFICATION_MODE); - E(pic->marker_size_specification_mode); - END_OP; - st->picture.marker_size_specification_mode = pic->marker_size_specification_mode; - } - if ((mask & cgm_set_EDGE_WIDTH_SPECIFICATION_MODE)) { - OP(EDGE_WIDTH_SPECIFICATION_MODE); - E(pic->edge_width_specification_mode); - END_OP; - st->picture.edge_width_specification_mode = pic->edge_width_specification_mode; - } - if ((mask & cgm_set_VDC_EXTENT)) { - OP(VDC_EXTENT); - P(&pic->vdc_extent[0]); - P(&pic->vdc_extent[1]); - END_OP; - st->picture.vdc_extent[0] = pic->vdc_extent[0]; - st->picture.vdc_extent[1] = pic->vdc_extent[1]; - } - if ((mask & cgm_set_BACKGROUND_COLOR)) { - OP(BACKGROUND_COLOR); - CD(&pic->background_color.rgb); - DONE; - st->picture.background_color = pic->background_color; - } - return st->result; -} - -cgm_result -cgm_BEGIN_PICTURE_BODY(cgm_state * st) -{ - OP(BEGIN_PICTURE_BODY); - DONE; -} - -cgm_result -cgm_END_PICTURE(cgm_state * st) -{ - OP(END_PICTURE); - DONE; -} - -/* ---------------- Control elements ---------------- */ - -cgm_result -cgm_VDC_INTEGER_PRECISION(cgm_state * st, int precision) -{ - if (st->vdc_integer_precision != precision) { - OP(VDC_INTEGER_PRECISION); - I(precision); - st->vdc_integer_precision = precision; - DONE; - } else - return cgm_result_ok; -} - -cgm_result -cgm_VDC_REAL_PRECISION(cgm_state * st, const cgm_precision * precision) -{ - OP(VDC_REAL_PRECISION); - put_real_precision(st, precision); - st->vdc_real_precision = *precision; - DONE; -} - -cgm_result -cgm_AUXILIARY_COLOR(cgm_state * st, const cgm_color * color) -{ - OP(AUXILIARY_COLOR); - CO(color); - st->auxiliary_color = *color; - DONE; -} - -cgm_result -cgm_TRANSPARENCY(cgm_state * st, cgm_transparency transparency) -{ - OP(TRANSPARENCY); - E(transparency); - st->transparency = transparency; - DONE; -} - -cgm_result -cgm_CLIP_RECTANGLE(cgm_state * st, const cgm_point rectangle[2]) -{ - OP(CLIP_RECTANGLE); - P(&rectangle[0]); - st->clip_rectangle[0] = rectangle[0]; - P(&rectangle[1]); - st->clip_rectangle[1] = rectangle[1]; - DONE; -} - -cgm_result -cgm_CLIP_INDICATOR(cgm_state * st, cgm_clip_indicator clip) -{ - OP(CLIP_INDICATOR); - E(clip); - st->clip_indicator = clip; - DONE; -} - -/* ---------------- Graphical primitive elements ---------------- */ - -cgm_result -cgm_POLYLINE(cgm_state * st, const cgm_point * vertices, int count) -{ - OP(POLYLINE); - nP(vertices, count); - DONE; -} - -cgm_result -cgm_DISJOINT_POLYLINE(cgm_state * st, const cgm_point * endpoints, int count) -{ - OP(DISJOINT_POLYLINE); - nP(endpoints, count); - DONE; -} - -cgm_result -cgm_POLYMARKER(cgm_state * st, const cgm_point * positions, int count) -{ - OP(POLYMARKER); - nP(positions, count); - DONE; -} - -cgm_result -cgm_TEXT(cgm_state * st, const cgm_point * position, bool final, const char *str, uint len) -{ - OP(TEXT); - P(position); - E(final); - S(str, len); - DONE; -} - -cgm_result -cgm_RESTRICTED_TEXT(cgm_state * st, const cgm_vdc * delta_width, const cgm_vdc * delta_height, const cgm_point * position, bool final, const char *str, uint len) -{ - OP(RESTRICTED_TEXT); - VDC2(delta_width, delta_height); - P(position); - E(final); - S(str, len); - DONE; -} - -cgm_result -cgm_APPEND_TEXT(cgm_state * st, bool final, const char *str, uint len) -{ - OP(APPEND_TEXT); - E(final); - S(str, len); - DONE; -} - -cgm_result -cgm_POLYGON(cgm_state * st, const cgm_point * vertices, int count) -{ - OP(POLYGON); - nP(vertices, count); - DONE; -} - -cgm_result -cgm_POLYGON_SET(cgm_state * st, const cgm_polygon_edge * vertices, int count) -{ - int i; - - OP(POLYGON); - for (i = 0; i < count; ++i) { - P(&vertices[i].vertex); - E(vertices[i].edge_out); - } - DONE; -} - -cgm_result -cgm_CELL_ARRAY(cgm_state * st, const cgm_point * pqr /*[3] */ , cgm_int nx, cgm_int ny, cgm_int local_color_precision, cgm_cell_representation_mode mode, const byte * values, uint source_bit, uint raster) -{ - int precision = local_color_precision; - int bits_per_pixel; - uint row_bytes; - const byte *row = values + (source_bit >> 3); - int bit = source_bit & 7; - int y; - - /* Currently we ignore the cell representation_mode, and always */ - /* produce cell arrays in 'packed' format. */ - mode = cgm_cell_mode_packed; - OP(CELL_ARRAY); - nP(pqr, 3); - I(nx); - I(ny); - I(local_color_precision); - E(mode); - if (precision == 0) - precision = (st->picture.color_selection_mode == - cgm_color_selection_indexed ? - st->metafile.color_index_precision : - st->metafile.color_precision); - bits_per_pixel = - (st->picture.color_selection_mode == cgm_color_selection_indexed ? - precision : precision * 3); - row_bytes = (bits_per_pixel * nx + 7) >> 3; - for (y = 0; y < ny; y++, row += raster) { - if (bit == 0) - put_bytes(st, row, row_bytes); - else { - uint i; - - for (i = 0; i < row_bytes; i++) { - byte b = (row[i] << bit) + - (row[i + 1] >> (8 - bit)); - - put_byte(st, b); - } - } - if ((row_bytes & 1)) { - put_byte(st, 0); - } - } - DONE; -} - -cgm_result -cgm_RECTANGLE(cgm_state * st, const cgm_point * corner1, const cgm_point * corner2) -{ - OP(RECTANGLE); - P(corner1); - P(corner2); - DONE; -} - -cgm_result -cgm_CIRCLE(cgm_state * st, const cgm_point * center, const cgm_vdc * radius) -{ - OP(CIRCLE); - P(center); - VDC(radius); - DONE; -} - -cgm_result -cgm_CIRCULAR_ARC_3_POINT(cgm_state * st, const cgm_point * start, const cgm_point * intermediate, const cgm_point * end) -{ - OP(CIRCULAR_ARC_3_POINT); - P(start); - P(intermediate); - P(end); - DONE; -} - -cgm_result -cgm_CIRCULAR_ARC_3_POINT_CLOSE(cgm_state * st, const cgm_point * start, const cgm_point * intermediate, const cgm_point * end, cgm_arc_closure closure) -{ - OP(CIRCULAR_ARC_3_POINT_CLOSE); - P(start); - P(intermediate); - P(end); - E(closure); - DONE; -} - -cgm_result -cgm_CIRCULAR_ARC_CENTER(cgm_state * st, const cgm_point * center, const cgm_vdc * dx_start, const cgm_vdc * dy_start, const cgm_vdc * dx_end, const cgm_vdc * dy_end, const cgm_vdc * radius) -{ - OP(CIRCULAR_ARC_CENTER); - P(center); - VDC4(dx_start, dy_start, dx_end, dy_end); - VDC(radius); - DONE; -} - -cgm_result -cgm_CIRCULAR_ARC_CENTER_CLOSE(cgm_state * st, const cgm_point * center, const cgm_vdc * dx_start, const cgm_vdc * dy_start, const cgm_vdc * dx_end, const cgm_vdc * dy_end, const cgm_vdc * radius, cgm_arc_closure closure) -{ - OP(CIRCULAR_ARC_CENTER_CLOSE); - P(center); - VDC4(dx_start, dy_start, dx_end, dy_end); - VDC(radius); - E(closure); - DONE; -} - -cgm_result -cgm_ELLIPSE(cgm_state * st, const cgm_point * center, const cgm_point * cd1_end, const cgm_point * cd2_end) -{ - OP(ELLIPSE); - P(center); - P(cd1_end); - P(cd2_end); - DONE; -} - -cgm_result -cgm_ELLIPTICAL_ARC(cgm_state * st, const cgm_point * center, const cgm_point * cd1_end, const cgm_point * cd2_end, const cgm_vdc * dx_start, const cgm_vdc * dy_start, const cgm_vdc * dx_end, const cgm_vdc * dy_end) -{ - OP(ELLIPTICAL_ARC); - P(center); - P(cd1_end); - P(cd2_end); - VDC4(dx_start, dy_start, dx_end, dy_end); - DONE; -} - -cgm_result -cgm_ELLIPTICAL_ARC_CLOSE(cgm_state * st, const cgm_point * center, const cgm_point * cd1_end, const cgm_point * cd2_end, const cgm_vdc * dx_start, const cgm_vdc * dy_start, const cgm_vdc * dx_end, const cgm_vdc * dy_end, cgm_arc_closure closure) -{ - OP(ELLIPTICAL_ARC_CLOSE); - P(center); - P(cd1_end); - P(cd2_end); - VDC4(dx_start, dy_start, dx_end, dy_end); - E(closure); - DONE; -} - -/* ---------------- Attribute elements ---------------- */ - -cgm_result -cgm_LINE_BUNDLE_INDEX(cgm_state * st, cgm_int index) -{ - OP(LINE_BUNDLE_INDEX); - IX(index); - st->line_bundle_index = index; - DONE; -} - -cgm_result -cgm_LINE_TYPE(cgm_state * st, cgm_line_type line_type) -{ - OP(LINE_TYPE); - IX((int)line_type); - st->line_type = line_type; - DONE; -} - -cgm_result -cgm_LINE_WIDTH(cgm_state * st, const cgm_line_width * line_width) -{ - OP(LINE_WIDTH); - VDC_R(line_width, st->picture.line_width_specification_mode); - st->line_width = *line_width; - DONE; -} - -cgm_result -cgm_LINE_COLOR(cgm_state * st, const cgm_color * color) -{ - OP(LINE_COLOR); - CO(color); - st->line_color = *color; - DONE; -} - -cgm_result -cgm_MARKER_BUNDLE_INDEX(cgm_state * st, cgm_int index) -{ - OP(MARKER_BUNDLE_INDEX); - IX(index); - st->marker_bundle_index = index; - DONE; -} - -cgm_result -cgm_MARKER_TYPE(cgm_state * st, cgm_marker_type marker_type) -{ - OP(MARKER_TYPE); - IX((int)marker_type); - st->marker_type = marker_type; - DONE; -} - -cgm_result -cgm_MARKER_SIZE(cgm_state * st, const cgm_marker_size * marker_size) -{ - OP(MARKER_SIZE); - VDC_R(marker_size, st->picture.marker_size_specification_mode); - st->marker_size = *marker_size; - DONE; -} - -cgm_result -cgm_MARKER_COLOR(cgm_state * st, const cgm_color * color) -{ - OP(MARKER_COLOR); - CO(color); - st->marker_color = *color; - DONE; -} - -cgm_result -cgm_TEXT_BUNDLE_INDEX(cgm_state * st, cgm_int index) -{ - OP(TEXT_BUNDLE_INDEX); - IX(index); - st->text_bundle_index = index; - DONE; -} - -cgm_result -cgm_TEXT_FONT_INDEX(cgm_state * st, cgm_int index) -{ - OP(TEXT_FONT_INDEX); - IX(index); - st->text_font_index = index; - DONE; -} - -cgm_result -cgm_TEXT_PRECISION(cgm_state * st, cgm_text_precision precision) -{ - OP(TEXT_PRECISION); - E(precision); - st->text_precision = precision; - DONE; -} - -cgm_result -cgm_CHARACTER_EXPANSION_FACTOR(cgm_state * st, cgm_real factor) -{ - OP(CHARACTER_EXPANSION_FACTOR); - R(factor); - st->character_expansion_factor = factor; - DONE; -} - -cgm_result -cgm_CHARACTER_SPACING(cgm_state * st, cgm_real spacing) -{ - OP(CHARACTER_SPACING); - R(spacing); - st->character_spacing = spacing; - DONE; -} - -cgm_result -cgm_TEXT_COLOR(cgm_state * st, const cgm_color * color) -{ - OP(TEXT_COLOR); - CO(color); - st->text_color = *color; - DONE; -} - -cgm_result -cgm_CHARACTER_HEIGHT(cgm_state * st, const cgm_vdc * height) -{ - OP(CHARACTER_HEIGHT); - VDC(height); - st->character_height = *height; - DONE; -} - -cgm_result -cgm_CHARACTER_ORIENTATION(cgm_state * st, const cgm_vdc * x_up, const cgm_vdc * y_up, const cgm_vdc * x_base, const cgm_vdc * y_base) -{ - OP(CHARACTER_ORIENTATION); - VDC4(x_up, y_up, x_base, y_base); - st->character_orientation[0] = *x_up; - st->character_orientation[1] = *y_up; - st->character_orientation[2] = *x_base; - st->character_orientation[3] = *y_base; - DONE; -} - -cgm_result -cgm_TEXT_PATH(cgm_state * st, cgm_text_path text_path) -{ - OP(TEXT_PATH); - E(text_path); - st->text_path = text_path; - DONE; -} - -cgm_result -cgm_TEXT_ALIGNMENT(cgm_state * st, cgm_text_alignment_horizontal align_h, cgm_text_alignment_vertical align_v, cgm_real align_cont_h, cgm_real align_cont_v) -{ - OP(TEXT_ALIGNMENT); - E(align_h); - E(align_v); - R(align_cont_h); - R(align_cont_v); - DONE; -} - -cgm_result -cgm_CHARACTER_SET_INDEX(cgm_state * st, cgm_int index) -{ - OP(CHARACTER_SET_INDEX); - IX(index); - st->character_set_index = index; - DONE; -} - -/* See gdevcgml.c for why this isn't named cgm_ALTERNATE_.... */ -cgm_result -cgm_ALT_CHARACTER_SET_INDEX(cgm_state * st, cgm_int index) -{ - OP(ALTERNATE_CHARACTER_SET_INDEX); - IX(index); - st->alternate_character_set_index = index; - DONE; -} - -cgm_result -cgm_FILL_BUNDLE_INDEX(cgm_state * st, cgm_int index) -{ - OP(FILL_BUNDLE_INDEX); - IX(index); - st->fill_bundle_index = index; - DONE; -} - -cgm_result -cgm_INTERIOR_STYLE(cgm_state * st, cgm_interior_style interior_style) -{ - OP(INTERIOR_STYLE); - E(interior_style); - st->interior_style = interior_style; - DONE; -} - -cgm_result -cgm_FILL_COLOR(cgm_state * st, const cgm_color * color) -{ - OP(FILL_COLOR); - CO(color); - st->fill_color = *color; - DONE; -} - -cgm_result -cgm_HATCH_INDEX(cgm_state * st, cgm_hatch_index hatch_index) -{ - OP(HATCH_INDEX); - IX((int)hatch_index); - st->hatch_index = hatch_index; - DONE; -} - -cgm_result -cgm_PATTERN_INDEX(cgm_state * st, cgm_int index) -{ - OP(PATTERN_INDEX); - IX(index); - st->pattern_index = index; - DONE; -} - -cgm_result -cgm_EDGE_BUNDLE_INDEX(cgm_state * st, cgm_int index) -{ - OP(EDGE_BUNDLE_INDEX); - IX(index); - st->edge_bundle_index = index; - DONE; -} - -cgm_result -cgm_EDGE_TYPE(cgm_state * st, cgm_edge_type edge_type) -{ - OP(EDGE_TYPE); - IX((int)edge_type); - st->edge_type = edge_type; - DONE; -} - -cgm_result -cgm_EDGE_WIDTH(cgm_state * st, const cgm_edge_width * edge_width) -{ - OP(EDGE_WIDTH); - VDC_R(edge_width, st->picture.edge_width_specification_mode); - st->edge_width = *edge_width; - DONE; -} - -cgm_result -cgm_EDGE_COLOR(cgm_state * st, const cgm_color * color) -{ - OP(EDGE_COLOR); - CO(color); - DONE; -} - -cgm_result -cgm_EDGE_VISIBILITY(cgm_state * st, bool visibility) -{ - OP(EDGE_VISIBILITY); - E(visibility); - st->edge_visibility = visibility; - DONE; -} - -cgm_result -cgm_FILL_REFERENCE_POINT(cgm_state * st, const cgm_point * reference_point) -{ - OP(FILL_REFERENCE_POINT); - P(reference_point); - st->fill_reference_point = *reference_point; - DONE; -} - -/* PATTERN_TABLE */ - -cgm_result -cgm_PATTERN_SIZE(cgm_state * st, const cgm_vdc * x_height, const cgm_vdc * y_height, const cgm_vdc * x_width, const cgm_vdc * y_width) -{ - OP(PATTERN_SIZE); - VDC4(x_height, y_height, x_width, y_width); - st->pattern_size[0] = *x_height; - st->pattern_size[1] = *y_height; - st->pattern_size[2] = *x_width; - st->pattern_size[3] = *y_width; - DONE; -} - -cgm_result -cgm_COLOR_TABLE(cgm_state * st, cgm_int index, const cgm_color * values, int count) -{ - int i; - - OP(COLOR_TABLE); - CI(index); - for (i = 0; i < count; ++i) - CD(&values[i].rgb); - DONE; -} - -cgm_result -cgm_ASPECT_SOURCE_FLAGS(cgm_state * st, const cgm_aspect_source_flag * flags, int count) -{ - int i; - - OP(ASPECT_SOURCE_FLAGS); - for (i = 0; i < count; ++i) { - E(flags[i].type); - E(flags[i].source); - st->source_flags[flags[i].type] = (byte) flags[i].source; - } - DONE; -} - -/* ================ Internal routines ================ */ - -/* Begin a command. */ -static void -begin_command(cgm_state * st, cgm_op_index op) -{ - uint op_word = (uint) op << cgm_op_id_shift; - - st->command[0] = (byte) (op_word >> 8); - st->command[1] = (byte) (op_word); - st->command_count = 4; /* leave room for extension */ - st->command_first = true; - st->result = cgm_result_ok; -} - -/* Write the buffer for a partial command. */ -/* Note that we always write an even number of bytes. */ -static void -write_command(cgm_state * st, bool last) -{ - byte *command = st->command; - int count = st->command_count; - - if (st->command_first) { - if (count <= 34) { - command[2] = command[0]; - command[3] = command[1] + count - 4; - command += 2, count -= 2; - } else { - int pcount = count - 4; - - command[1] |= 31; - command[2] = (byte) (pcount >> 8); - if (!last) - command[2] |= 0x80; - command[3] = (byte) pcount; - } - st->command_first = false; - } else { - int pcount = count - 2; - - command[0] = (byte) (pcount >> 8); - if (!last) - command[0] |= 0x80; - command[1] = (byte) pcount; - } - fwrite(command, sizeof(byte), count + (count & 1), st->file); - st->command_count = 2; /* leave room for extension header */ - if (ferror(st->file)) - st->result = cgm_result_io_error; -} - -/* End a command. */ -static cgm_result -end_command(cgm_state * st) -{ - write_command(st, true); - return st->result; -} - -/* Put an integer value. */ -static void -put_int(cgm_state * st, cgm_int value, int precision) -{ - switch (precision) { - case 32: - put_byte(st, value >> 24); - case 24: - put_byte(st, value >> 16); - case 16: - put_byte(st, value >> 8); - case 8: - put_byte(st, value); - } -} - -/* Put a real value. */ -static void -put_real(cgm_state * st, cgm_real value, const cgm_precision * pr) -{ - if (pr->representation == cgm_representation_floating) { - } else { /* Casting to integer simply discards the fraction, */ - /* so we need to be careful with negative values. */ - long whole = (long)value; - double fpart; - - if (value < whole) - --whole; - fpart = value - whole; - put_int(st, whole, pr->exponent_or_whole_width); - if (pr->fraction_width == 16) { - uint fraction = (uint) (fpart * (1.0 * 0x10000)); - - put_int(st, fraction, 16); - } else { /* pr->fraction_width == 32 */ - ulong fraction = - (ulong) (fpart * (1.0 * 0x10000 * 0x10000)); - - put_int(st, fraction, 32); - } - } -} - -/* Put a real precision. */ -static void -put_real_precision(cgm_state * st, const cgm_precision * precision) -{ - I((int)precision->representation); - I(precision->exponent_or_whole_width); - I(precision->fraction_width); -} - -/* Put a VDC. */ -static void -put_vdc(cgm_state * st, const cgm_vdc * pvdc) -{ - if (st->metafile.vdc_type == cgm_vdc_integer) - put_int(st, pvdc->integer, st->vdc_integer_precision); - else - put_real(st, pvdc->real, &st->vdc_real_precision); -} - -/* Put a VDC or a real. */ -static void -put_vdc_r(cgm_state * st, const cgm_line_marker_extent * extent, - cgm_line_marker_specification_mode mode) -{ - if (mode == cgm_line_marker_absolute) - VDC(&extent->absolute); - else - R(extent->scaled); -} - -/* Put a point (pair of VDCs). */ -static void -put_point(cgm_state * st, const cgm_point * ppt) -{ - if (st->metafile.vdc_type == cgm_vdc_integer) { - put_int(st, ppt->integer.x, st->vdc_integer_precision); - put_int(st, ppt->integer.y, st->vdc_integer_precision); - } else { - put_real(st, ppt->real.x, &st->vdc_real_precision); - put_real(st, ppt->real.y, &st->vdc_real_precision); - } -} - -/* Put a list of points. */ -static void -put_points(cgm_state * st, const cgm_point * ppt, int count) -{ - int i; - - for (i = 0; i < count; i++) - P(ppt + i); -} - -/* Put bytes. */ -static void -put_bytes(cgm_state * st, const byte * data, uint length) -{ - int count; - - while (length > (count = command_max_count - st->command_count)) { - memcpy(st->command + st->command_count, data, count); - st->command_count += count; - write_command(st, false); - data += count; - length -= count; - } - memcpy(st->command + st->command_count, data, length); - st->command_count += length; -} - -/* Put a string. */ -static void -put_string(cgm_state * st, const char *data, uint length) -{ /* The CGM specification seems to imply that the continuation */ - /* mechanism for commands and the mechanism for strings */ - /* are orthogonal; we take this interpretation. */ - if (length >= 255) { - put_byte(st, 255); - while (length > 32767) { - put_int(st, 65535, 2); - put_bytes(st, (const byte *)data, 32767); - data += 32767; - length -= 32767; - } - } - put_byte(st, length); - put_bytes(st, (const byte *)data, length); -} - -/* Put a color. */ -static void -put_color(cgm_state * st, const cgm_color * color) -{ - if (st->picture.color_selection_mode == cgm_color_selection_indexed) - CI(color->index); - else - CD(&color->rgb); -} - -/* Put an RGB value. */ -static void -put_rgb(cgm_state * st, const cgm_rgb * rgb) -{ - put_int(st, rgb->r, st->metafile.color_precision); - put_int(st, rgb->g, st->metafile.color_precision); - put_int(st, rgb->b, st->metafile.color_precision); -} diff -Nru ghostscript-9.04~dfsg/base/gdevcgml.h ghostscript-9.05~dfsg~20120125/base/gdevcgml.h --- ghostscript-9.04~dfsg/base/gdevcgml.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevcgml.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,404 +0,0 @@ -/* Copyright (C) 2001-2006 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ -/* $Id$ */ -/* Interface definitions for CGM-writing library */ - -#ifndef gdevcgml_INCLUDED -# define gdevcgml_INCLUDED - -/* The names in the following follow the CGM standard exactly, */ -/* except that we have substituted the American spellings of */ -/* color (colour) and center (centre). */ - -/* ================ Types ================ */ - -/* Define the abstract type for the CGM writer state. */ -typedef struct cgm_state_s cgm_state; - -/* Define the type for the allocator used by the CGM writer. */ -typedef struct cgm_allocator_s { - void *private_data; - void *(*alloc) (void *, uint); - void (*free) (void *, void *); -} cgm_allocator; - -/* Define types for CGM coordinates. */ -typedef int cgm_int; -typedef double cgm_real; -typedef union cgm_vdc_s { - cgm_int integer; - cgm_real real; -} cgm_vdc; -typedef struct cgm_int_point_s { - cgm_int x, y; -} cgm_int_point; -typedef struct cgm_real_point_s { - cgm_real x, y; -} cgm_real_point; -typedef union cgm_point_s { - cgm_int_point integer; - cgm_real_point real; -} cgm_point; - -/* Define types for colors. */ -typedef struct cgm_rgb_s { - cgm_int r, g, b; -} cgm_rgb; -typedef union cgm_color_s { - cgm_int index; - cgm_rgb rgb; -} cgm_color; - -/* - * Define other types used in CGM elements or API calls. - * If cgm_xxx is an enumerated type, let xxx' be xxx with any of the - * following words dropped: mode, specification, type; then the values - * of the enumerated type are named cgm_xxx'_yyy. - */ -typedef enum { - cgm_vdc_integer = 0, - cgm_vdc_real -} cgm_vdc_type; -typedef struct cgm_string_s { - const char *chars; - uint length; -} cgm_string; -typedef enum { - cgm_scaling_abstract = 0, - cgm_scaling_metric -} cgm_scaling_mode; -typedef enum { - cgm_color_selection_indexed = 0, - cgm_color_selection_direct -} cgm_color_selection_mode; -typedef enum { - cgm_line_marker_absolute = 0, - cgm_line_marker_scaled -} cgm_line_marker_specification_mode; -typedef cgm_line_marker_specification_mode - cgm_line_width_specification_mode, cgm_marker_size_specification_mode, - cgm_edge_width_specification_mode; -typedef union cgm_line_marker_extent_s { - cgm_vdc absolute; - cgm_real scaled; -} cgm_line_marker_extent; -typedef cgm_line_marker_extent - cgm_line_width, cgm_marker_size, cgm_edge_width; -typedef enum { - cgm_transparency_off = 0, - cgm_transparency_on -} cgm_transparency; -typedef enum { - cgm_clip_off = 0, - cgm_clip_on -} cgm_clip_indicator; -typedef struct cgm_precision_s { - enum { - cgm_representation_floating, cgm_representation_fixed - } representation; - int exponent_or_whole_width; - int fraction_width; -} cgm_precision; -typedef enum { - cgm_line_solid = 1, - cgm_line_dash, - cgm_line_dot, - cgm_line_dash_dot, - cgm_line_dash_dot_dot -} cgm_line_type; -typedef enum { - cgm_marker_dot = 1, - cgm_marker_plus, - cgm_marker_asterisk, - cgm_marker_circle, - cgm_marker_cross -} cgm_marker_type; -typedef enum { - cgm_text_precision_string = 0, - cgm_text_precision_character, - cgm_text_precision_stroke -} cgm_text_precision; -typedef enum { - cgm_text_path_right = 0, - cgm_text_path_left, - cgm_text_path_up, - cgm_text_path_down -} cgm_text_path; -typedef enum { - cgm_text_horizontal_normal = 0, - cgm_text_horizontal_left, - cgm_text_horizontal_center, - cgm_text_horizontal_right, - cgm_text_horizontal_continuous -} cgm_text_alignment_horizontal; -typedef enum { - cgm_text_vertical_normal = 0, - cgm_text_vertical_top, - cgm_text_vertical_cap, - cgm_text_vertical_half, - cgm_text_vertical_base, - cgm_text_vertical_bottom, - cgm_text_vertical_continuous -} cgm_text_alignment_vertical; -typedef enum { - cgm_interior_style_hollow = 0, - cgm_interior_style_solid, - cgm_interior_style_pattern, - cgm_interior_style_hatch, - cgm_interior_style_empty -} cgm_interior_style; -typedef enum { - cgm_hatch_horizontal = 1, - cgm_hatch_vertical, - cgm_hatch_positive_slope, - cgm_hatch_negative_slope, - cgm_hatch_combined_v_h_slant, - cgm_hatch_combined_l_r_slant -} cgm_hatch_index; -typedef enum { - cgm_arc_closure_pie = 0, - cgm_arc_closure_chord -} cgm_arc_closure; -typedef enum { - cgm_edge_out_invisible = 0, - cgm_edge_out_visible, - cgm_edge_out_close_invisible, - cgm_edge_out_close_visible -} cgm_edge_out; -typedef struct cgm_polygon_edge_s { - cgm_point vertex; - cgm_edge_out edge_out; -} cgm_polygon_edge; -typedef enum { - cgm_cell_mode_run_length = 0, - cgm_cell_mode_packed -} cgm_cell_representation_mode; -typedef enum { - cgm_edge_solid = 1, - cgm_edge_dash, - cgm_edge_dot, - cgm_edge_dash_dot, - cgm_edge_dash_dot_dot -} cgm_edge_type; -typedef enum { - cgm_aspect_source_individual = 0, - cgm_aspect_source_bundled -} cgm_aspect_source; -typedef enum { - cgm_aspect_line_type = 0, - cgm_aspect_line_width, - cgm_aspect_line_color, - cgm_aspect_marker_type, - cgm_aspect_marker_size, - cgm_aspect_marker_color, - cgm_aspect_text_font_index, - cgm_aspect_text_precision, - cgm_aspect_character_expansion_factor, - cgm_aspect_character_spacing, - cgm_aspect_text_color, - cgm_aspect_interior_style, - cgm_aspect_fill_color, - cgm_aspect_hatch_index, - cgm_aspect_pattern_index, - cgm_aspect_edge_type, - cgm_aspect_edge_width, - cgm_aspect_edge_color -} cgm_aspect_type; -typedef struct cgm_aspect_source_flag_s { - cgm_aspect_type type; - cgm_aspect_source source; -} cgm_aspect_source_flag; - -/* ================ API ================ */ - -typedef enum { - cgm_result_ok = 0, - cgm_result_wrong_state = -1, - cgm_result_out_of_range = -2, - cgm_result_io_error = -3, - cgm_result_out_of_memory = -4 -} cgm_result; - -/* ---------------- Initialize/terminate ---------------- */ - -cgm_state *cgm_initialize(FILE *, const cgm_allocator *); -cgm_result cgm_terminate(cgm_state *); - -/* ---------------- Metafile elements ---------------- */ - -typedef struct cgm_metafile_elements_s { - cgm_int metafile_version; - cgm_string metafile_description; - cgm_vdc_type vdc_type; - int integer_precision; - cgm_precision real_precision; - int index_precision; - int color_precision; - int color_index_precision; - cgm_int maximum_color_index; - cgm_color color_value_extent[2]; - const int *metafile_element_list; - int metafile_element_list_count; - const cgm_string *font_list; - int font_list_count; - /* character_set_list */ - /* character_coding_announcer */ -} cgm_metafile_elements; - -#define cgm_set_METAFILE_VERSION (1L<<0) -#define cgm_set_METAFILE_DESCRIPTION (1L<<1) -#define cgm_set_VDC_TYPE (1L<<2) -#define cgm_set_INTEGER_PRECISION (1L<<3) -#define cgm_set_REAL_PRECISION (1L<<4) -#define cgm_set_INDEX_PRECISION (1L<<5) -#define cgm_set_COLOR_PRECISION (1L<<6) -#define cgm_set_COLOR_INDEX_PRECISION (1L<<7) -#define cgm_set_MAXIMUM_COLOR_INDEX (1L<<8) -#define cgm_set_COLOR_VALUE_EXTENT (1L<<9) -#define cgm_set_METAFILE_ELEMENT_LIST (1L<<10) -#define cgm_set_FONT_LIST (1L<<11) -#define cgm_set_CHARACTER_SET_LIST (1L<<12) -#define cgm_set_CHARACTER_CODING_ANNOUNCER (1L<<13) - -cgm_result - cgm_BEGIN_METAFILE(cgm_state *, const char *, uint), - cgm_set_metafile_elements(cgm_state *, - const cgm_metafile_elements *, long), - cgm_END_METAFILE(cgm_state *); - -/* ---------------- Picture elements ---------------- */ - -typedef struct cgm_picture_elements_s { - cgm_scaling_mode scaling_mode; - cgm_real scale_factor; - cgm_color_selection_mode color_selection_mode; - cgm_line_width_specification_mode line_width_specification_mode; - cgm_marker_size_specification_mode marker_size_specification_mode; - cgm_edge_width_specification_mode edge_width_specification_mode; - cgm_point vdc_extent[2]; - cgm_color background_color; -} cgm_picture_elements; - -#define cgm_set_SCALING_MODE (1L<<0) -#define cgm_set_COLOR_SELECTION_MODE (1L<<1) -#define cgm_set_LINE_WIDTH_SPECIFICATION_MODE (1L<<2) -#define cgm_set_MARKER_SIZE_SPECIFICATION_MODE (1L<<3) -#define cgm_set_EDGE_WIDTH_SPECIFICATION_MODE (1L<<4) -#define cgm_set_VDC_EXTENT (1L<<5) -#define cgm_set_BACKGROUND_COLOR (1L<<6) - -cgm_result - cgm_BEGIN_PICTURE(cgm_state *, const char *, uint), - cgm_set_picture_elements(cgm_state *, - const cgm_picture_elements *, long), - cgm_BEGIN_PICTURE_BODY(cgm_state *), - cgm_END_PICTURE(cgm_state *); - -/* ---------------- Control elements ---------------- */ - -cgm_result - cgm_VDC_INTEGER_PRECISION(cgm_state *, int), - cgm_VDC_REAL_PRECISION(cgm_state *, const cgm_precision *), - cgm_AUXILIARY_COLOR(cgm_state *, const cgm_color *), - cgm_TRANSPARENCY(cgm_state *, cgm_transparency), - cgm_CLIP_RECTANGLE(cgm_state *, const cgm_point[2]), - cgm_CLIP_INDICATOR(cgm_state *, cgm_clip_indicator); - -/* ---------------- Graphical primitive elements ---------------- */ - -cgm_result - cgm_POLYLINE(cgm_state *, const cgm_point *, int), - cgm_DISJOINT_POLYLINE(cgm_state *, const cgm_point *, int), - cgm_POLYMARKER(cgm_state *, const cgm_point *, int), - cgm_TEXT(cgm_state *, const cgm_point *, bool, const char *, uint), - cgm_RESTRICTED_TEXT(cgm_state *, const cgm_vdc *, const cgm_vdc *, - const cgm_point *, bool, const char *, uint), - cgm_APPEND_TEXT(cgm_state *, bool, const char *, uint), - cgm_POLYGON(cgm_state *, const cgm_point *, int), - cgm_POLYGON_SET(cgm_state *, const cgm_polygon_edge *, int), - cgm_CELL_ARRAY(cgm_state *, const cgm_point * /*[3] */ , cgm_int, - cgm_int, cgm_int, cgm_cell_representation_mode, - const byte *, uint, uint), - cgm_RECTANGLE(cgm_state *, const cgm_point *, const cgm_point *), - cgm_CIRCLE(cgm_state *, const cgm_point *, const cgm_vdc *), - cgm_CIRCULAR_ARC_3_POINT(cgm_state *, const cgm_point *, - const cgm_point *, const cgm_point *), - cgm_CIRCULAR_ARC_3_POINT_CLOSE(cgm_state *, const cgm_point *, - const cgm_point *, - const cgm_point *, cgm_arc_closure), - cgm_CIRCULAR_ARC_CENTER(cgm_state *, const cgm_point *, - const cgm_vdc *, const cgm_vdc *, - const cgm_vdc *, const cgm_vdc *, - const cgm_vdc *), - cgm_CIRCULAR_ARC_CENTER_CLOSE(cgm_state *, const cgm_point *, - const cgm_vdc *, const cgm_vdc *, - const cgm_vdc *, const cgm_vdc *, - const cgm_vdc *, cgm_arc_closure), - cgm_ELLIPSE(cgm_state *, const cgm_point *, const cgm_point *, - const cgm_point *), - cgm_ELLIPTICAL_ARC(cgm_state *, const cgm_point *, - const cgm_point *, const cgm_point *, - const cgm_vdc *, const cgm_vdc *, - const cgm_vdc *, const cgm_vdc *), - cgm_ELLIPTICAL_ARC_CLOSE(cgm_state *, const cgm_point *, - const cgm_point *, const cgm_point *, - const cgm_vdc *, const cgm_vdc *, - const cgm_vdc *, const cgm_vdc *, - cgm_arc_closure); - -/* ---------------- Attribute elements ---------------- */ - -cgm_result - cgm_LINE_BUNDLE_INDEX(cgm_state *, cgm_int), - cgm_LINE_TYPE(cgm_state *, cgm_line_type), - cgm_LINE_WIDTH(cgm_state *, const cgm_line_width *), - cgm_LINE_COLOR(cgm_state *, const cgm_color *), - cgm_MARKER_BUNDLE_INDEX(cgm_state *, cgm_int), - cgm_MARKER_TYPE(cgm_state *, cgm_marker_type), - cgm_MARKER_SIZE(cgm_state *, const cgm_marker_size *), - cgm_MARKER_COLOR(cgm_state *, const cgm_color *), - cgm_TEXT_BUNDLE_INDEX(cgm_state *, cgm_int), - cgm_TEXT_FONT_INDEX(cgm_state *, cgm_int), - cgm_TEXT_PRECISION(cgm_state *, cgm_text_precision), - cgm_CHARACTER_EXPANSION_FACTOR(cgm_state *, cgm_real), - cgm_CHARACTER_SPACING(cgm_state *, cgm_real), - cgm_TEXT_COLOR(cgm_state *, const cgm_color *), - cgm_CHARACTER_HEIGHT(cgm_state *, const cgm_vdc *), - cgm_CHARACTER_ORIENTATION(cgm_state *, const cgm_vdc *, - const cgm_vdc *, const cgm_vdc *, - const cgm_vdc *), - cgm_TEXT_PATH(cgm_state *, cgm_text_path), - cgm_TEXT_ALIGNMENT(cgm_state *, cgm_text_alignment_horizontal, - cgm_text_alignment_vertical, cgm_real, cgm_real), - cgm_CHARACTER_SET_INDEX(cgm_state *, cgm_int), - /* The following should be cgm_ALTERNATE_..., but the VAX DEC C */ - /* compiler gives an error for names longer than 31 characters. */ - cgm_ALT_CHARACTER_SET_INDEX(cgm_state *, cgm_int), - cgm_FILL_BUNDLE_INDEX(cgm_state *, cgm_int), - cgm_INTERIOR_STYLE(cgm_state *, cgm_interior_style), - cgm_FILL_COLOR(cgm_state *, const cgm_color *), - cgm_HATCH_INDEX(cgm_state *, cgm_hatch_index), - cgm_PATTERN_INDEX(cgm_state *, cgm_int), - cgm_EDGE_BUNDLE_INDEX(cgm_state *, cgm_int), - cgm_EDGE_TYPE(cgm_state *, cgm_edge_type), - cgm_EDGE_WIDTH(cgm_state *, const cgm_edge_width *), - cgm_EDGE_COLOR(cgm_state *, const cgm_color *), - cgm_EDGE_VISIBILITY(cgm_state *, bool), - cgm_FILL_REFERENCE_POINT(cgm_state *, const cgm_point *), - /* PATTERN_TABLE */ - cgm_PATTERN_SIZE(cgm_state *, const cgm_vdc *, const cgm_vdc *, - const cgm_vdc *, const cgm_vdc *), - cgm_COLOR_TABLE(cgm_state *, cgm_int, const cgm_color *, int), - cgm_ASPECT_SOURCE_FLAGS(cgm_state *, const cgm_aspect_source_flag *, int); - -#endif /* gdevcgml_INCLUDED */ diff -Nru ghostscript-9.04~dfsg/base/gdevcgmx.h ghostscript-9.05~dfsg~20120125/base/gdevcgmx.h --- ghostscript-9.04~dfsg/base/gdevcgmx.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevcgmx.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,182 +0,0 @@ -/* Copyright (C) 2001-2006 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ -/* $Id$ */ -/* Internal definitions for CGM-writing library */ - -#ifndef gdevcgmx_INCLUDED -# define gdevcgmx_INCLUDED - -#include "gdevcgml.h" - -/* Define the internal representations of the CGM opcodes. */ -#define cgm_op_class_shift 7 -#define cgm_op_id_shift 5 -typedef enum { - /* Class 0 */ - BEGIN_METAFILE = (0 << cgm_op_class_shift) + 1, - END_METAFILE, - BEGIN_PICTURE, - BEGIN_PICTURE_BODY, - END_PICTURE, - /* Class 1 */ - METAFILE_VERSION = (1 << cgm_op_class_shift) + 1, - METAFILE_DESCRIPTION, - VDC_TYPE, - INTEGER_PRECISION, - REAL_PRECISION, - INDEX_PRECISION, - COLOR_PRECISION, - COLOR_INDEX_PRECISION, - MAXIMUM_COLOR_INDEX, - COLOR_VALUE_EXTENT, - METAFILE_ELEMENT_LIST, - METAFILE_DEFAULTS_REPLACEMENT, - FONT_LIST, - CHARACTER_SET_LIST, - CHARACTER_CODING_ANNOUNCER, - /* Class 2 */ - SCALING_MODE = (2 << cgm_op_class_shift) + 1, - COLOR_SELECTION_MODE, - LINE_WIDTH_SPECIFICATION_MODE, - MARKER_SIZE_SPECIFICATION_MODE, - EDGE_WIDTH_SPECIFICATION_MODE, - VDC_EXTENT, - BACKGROUND_COLOR, - /* Class 3 */ - VDC_INTEGER_PRECISION = (3 << cgm_op_class_shift) + 1, - VDC_REAL_PRECISION, - AUXILIARY_COLOR, - TRANSPARENCY, - CLIP_RECTANGLE, - CLIP_INDICATOR, - /* Class 4 */ - POLYLINE = (4 << cgm_op_class_shift) + 1, - DISJOINT_POLYLINE, - POLYMARKER, - TEXT, - RESTRICTED_TEXT, - APPEND_TEXT, - POLYGON, - POLYGON_SET, - CELL_ARRAY, - GENERALIZED_DRAWING_PRIMITIVE, - RECTANGLE, - CIRCLE, - CIRCULAR_ARC_3_POINT, - CIRCULAR_ARC_3_POINT_CLOSE, - CIRCULAR_ARC_CENTER, - CIRCULAR_ARC_CENTER_CLOSE, - ELLIPSE, - ELLIPTICAL_ARC, - ELLIPTICAL_ARC_CLOSE, - /* Class 5 */ - LINE_BUNDLE_INDEX = (5 << cgm_op_class_shift) + 1, - LINE_TYPE, - LINE_WIDTH, - LINE_COLOR, - MARKER_BUNDLE_INDEX, - MARKER_TYPE, - MARKER_SIZE, - MARKER_COLOR, - TEXT_BUNDLE_INDEX, - TEXT_FONT_INDEX, - TEXT_PRECISION, - CHARACTER_EXPANSION_FACTOR, - CHARACTER_SPACING, - TEXT_COLOR, - CHARACTER_HEIGHT, - CHARACTER_ORIENTATION, - TEXT_PATH, - TEXT_ALIGNMENT, - CHARACTER_SET_INDEX, - ALTERNATE_CHARACTER_SET_INDEX, - FILL_BUNDLE_INDEX, - INTERIOR_STYLE, - FILL_COLOR, - HATCH_INDEX, - PATTERN_INDEX, - EDGE_BUNDLE_INDEX, - EDGE_TYPE, - EDGE_WIDTH, - EDGE_COLOR, - EDGE_VISIBILITY, - FILL_REFERENCE_POINT, - PATTERN_TABLE, - PATTERN_SIZE, - COLOR_TABLE, - ASPECT_SOURCE_FLAGS, - /* Class 6 */ - ESCAPE = (6 << cgm_op_class_shift) + 1, - /* Class 7 */ - MESSAGE = (7 << cgm_op_class_shift) + 1, - APPLICATION_DATA -} cgm_op_index; - -/* Define the state of the CGM writer. */ - /*typedef struct cgm_state_s cgm_state; *//* in gdevcgml.h */ -struct cgm_state_s { - /* The following are set at initialization time. */ - FILE *file; - cgm_allocator allocator; - /* The following are set by specific calls. */ - cgm_metafile_elements metafile; - cgm_picture_elements picture; - int vdc_integer_precision; - cgm_precision vdc_real_precision; - cgm_color auxiliary_color; - cgm_transparency transparency; - cgm_point clip_rectangle[2]; - cgm_clip_indicator clip_indicator; - int line_bundle_index; - cgm_line_type line_type; - cgm_line_width line_width; - cgm_color line_color; - int marker_bundle_index; - cgm_marker_type marker_type; - cgm_marker_size marker_size; - cgm_color marker_color; - int text_bundle_index; - int text_font_index; - cgm_text_precision text_precision; - cgm_real character_expansion_factor; - cgm_real character_spacing; - cgm_color text_color; - cgm_vdc character_height; - cgm_vdc character_orientation[4]; - cgm_text_path text_path; -/****** text_alignment ******/ - int character_set_index; - int alternate_character_set_index; - int fill_bundle_index; - cgm_interior_style interior_style; - cgm_color fill_color; - cgm_hatch_index hatch_index; - int pattern_index; - int edge_bundle_index; - cgm_edge_type edge_type; - cgm_edge_width edge_width; - bool edge_visibility; - cgm_point fill_reference_point; -/****** pattern_table ******/ - cgm_vdc pattern_size[4]; -/****** color_table ******/ - byte /*cgm_aspect_source */ source_flags[18]; - /* The following change dynamically. */ -#define command_max_count 400 /* (must be even) */ - byte command[command_max_count]; - int command_count; - bool command_first; - cgm_result result; -}; - -#endif /* gdevcgmx_INCLUDED */ diff -Nru ghostscript-9.04~dfsg/base/gdevclj.c ghostscript-9.05~dfsg~20120125/base/gdevclj.c --- ghostscript-9.04~dfsg/base/gdevclj.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevclj.c 2011-11-21 08:55:19.000000000 +0000 @@ -76,9 +76,9 @@ */ static const clj_paper_size clj_paper_sizes[] = { /* U.S. letter size comes first so it will be the default. */ - { 2, 1, 11.00 * 72.0, 8.50 * 72.0, { .200 * 72.0, 0.0 } }, - { 1, 1, 10.50 * 72.0, 7.25 * 72.0, { .200 * 72.0, 0.0 } }, - { 26, 1, 11.69 * 72.0, 8.27 * 72.0, { .197 * 72.0, 0.0 } } + { 2, 1, 11.00f * 72.0f, 8.50f * 72.0f, { .200f * 72.0f, 0.0 } }, + { 1, 1, 10.50f * 72.0f, 7.25f * 72.0f, { .200f * 72.0f, 0.0 } }, + { 26, 1, 11.69f * 72.0f, 8.27f * 72.0f, { .197f * 72.0f, 0.0 } } }; /* @@ -436,12 +436,12 @@ * of page size into pdev->width & height has been done. We just use * rotate to access the correct offsets. */ if (pclj->rotated) { - imageable_width = pdev->width - (2 * psize->offsets.x) * fs_res; - imageable_height = pdev->height - (2 * psize->offsets.y) * ss_res; + imageable_width = pdev->width - (int)((2 * psize->offsets.x) * fs_res); + imageable_height = pdev->height - (int)((2 * psize->offsets.y) * ss_res); } else { - imageable_width = pdev->width - (2 * psize->offsets.y) * ss_res; - imageable_height = pdev->height - (2 * psize->offsets.x) * fs_res; + imageable_width = pdev->width - (int)((2 * psize->offsets.y) * ss_res); + imageable_height = pdev->height - (int)((2 * psize->offsets.x) * fs_res); } /* start the page. The pcl origin (0, 150 dots by default, y diff -Nru ghostscript-9.04~dfsg/base/gdevcp50.c ghostscript-9.05~dfsg~20120125/base/gdevcp50.c --- ghostscript-9.04~dfsg/base/gdevcp50.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevcp50.c 2011-11-12 18:29:08.000000000 +0000 @@ -177,10 +177,8 @@ /* Print the accumulated page description. */ outcode = (*ppdev->printer_procs.print_page)(ppdev, ppdev->file); - if ( code < 0 ) return code; closecode = gdev_prn_close_printer(pdev); - if ( code < 0 ) return code; if ( ppdev->buffer_space ) /* reinitialize clist for writing */ code = (*gs_clist_device_procs.output_page)(pdev, num_copies, flush); diff -Nru ghostscript-9.04~dfsg/base/gdevdbit.c ghostscript-9.05~dfsg~20120125/base/gdevdbit.c --- ghostscript-9.04~dfsg/base/gdevdbit.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevdbit.c 2011-10-06 06:43:10.000000000 +0000 @@ -14,7 +14,6 @@ /* Default device bitmap copying implementation */ #include "gx.h" #include "gpcheck.h" -#include "gserror.h" #include "gserrors.h" #include "gsbittab.h" #include "gsrect.h" @@ -36,6 +35,7 @@ *(gx_tile_bitmap *) & tiles = *tile; tiles.shift = tiles.rep_shift = 0; + tiles.num_planes = 1; return (*dev_proc(dev, strip_tile_rectangle)) (dev, &tiles, x, y, w, h, color0, color1, px, py); } diff -Nru ghostscript-9.04~dfsg/base/gdevddrw.c ghostscript-9.05~dfsg~20120125/base/gdevddrw.c --- ghostscript-9.04~dfsg/base/gdevddrw.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevddrw.c 2011-12-08 09:35:23.000000000 +0000 @@ -1016,7 +1016,7 @@ const gs_image_t *pim = (const gs_image_t *)pic; if (pmat == 0 || - (pis != 0 && !memcmp(pmat, &ctm_only(pis), sizeof(*pmat))) + (pis != 0 && !gs_matrix_compare(pmat, &ctm_only(pis))) ) { int code = (*dev_proc(dev, begin_image)) (dev, pis, pim, pim->format, prect, pdcolor, diff -Nru ghostscript-9.04~dfsg/base/gdevdevn.c ghostscript-9.05~dfsg~20120125/base/gdevdevn.c --- ghostscript-9.04~dfsg/base/gdevdevn.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevdevn.c 2011-12-08 09:35:23.000000000 +0000 @@ -39,7 +39,7 @@ { int i = dev->color_info.num_components - 1; - for(; i >= 0; i--) /* Clear colors */ + for(; i >= 0; i--) /* Clear colors */ out[i] = frac_0; if ((i = map[3]) != GX_DEVICE_COLOR_MAX_COMPONENTS) out[i] = frac_1 - gray; @@ -53,7 +53,7 @@ int i = dev->color_info.num_components - 1; frac cmyk[4]; - for(; i >= 0; i--) /* Clear colors */ + for(; i >= 0; i--) /* Clear colors */ out[i] = frac_0; color_rgb_to_cmyk(r, g, b, pis, cmyk, dev->memory); if ((i = map[0]) != GX_DEVICE_COLOR_MAX_COMPONENTS) @@ -73,7 +73,7 @@ { int i = dev->color_info.num_components - 1; - for(; i >= 0; i--) /* Clear colors */ + for(; i >= 0; i--) /* Clear colors */ out[i] = frac_0; if ((i = map[0]) != GX_DEVICE_COLOR_MAX_COMPONENTS) out[i] = c; @@ -93,9 +93,9 @@ * * The parameter are: * ncomp - The number of components (colorants) for the device. Valid - * values are 1 to GX_DEVICE_COLOR_MAX_COMPONENTS + * values are 1 to GX_DEVICE_COLOR_MAX_COMPONENTS * bpc - The number of bits per component. Valid values are 1, 2, 4, 5, - * and 8. + * and 8. * Input values are not tested for validity. */ int @@ -253,7 +253,7 @@ if (component_type != SEPARATION_NAME || auto_spot_colors == NO_AUTO_SPOT_COLORS || pdevn_params->num_separation_order_names != 0) - return -1; /* Do not add --> indicate colorant unknown. */ + return -1; /* Do not add --> indicate colorant unknown. */ /* * Check if we have room for another spot colorant. */ @@ -321,15 +321,15 @@ case 0:\ if ((pa).size != psize) {\ ecode = gs_note_error(gs_error_rangecheck);\ - (pa).data = 0; /* mark as not filled */\ + (pa).data = 0; /* mark as not filled */\ } else #define END_ARRAY_PARAM(pa, e)\ goto e;\ default:\ ecode = code;\ -e: param_signal_error(plist, param_name, ecode);\ +e: param_signal_error(plist, param_name, ecode);\ case 1:\ - (pa).data = 0; /* mark as not filled */\ + (pa).data = 0; /* mark as not filled */\ }\ END @@ -352,8 +352,8 @@ int num_order = pdevn_params->num_separation_order_names; int max_sep = pdevn_params->max_separations; int page_spot_colors = pdevn_params->page_spot_colors; - gs_param_string_array scna; /* SeparationColorNames array */ - gs_param_string_array sona; /* SeparationOrder names array */ + gs_param_string_array scna; /* SeparationColorNames array */ + gs_param_string_array sona; /* SeparationOrder names array */ /* Get the SeparationOrder names */ BEGIN_ARRAY_PARAM(param_read_name_array, "SeparationOrder", @@ -537,7 +537,7 @@ if (num_sub_levels > 0) { for (k = 0; k < num_sub_levels; k++) { des_color_list->u.sub_level_ptrs[k] = - alloc_compressed_color_list_elem(memory, + alloc_compressed_color_list_elem(src_color_list->mem, des_color_list->level_num_comp - 1); if (des_color_list->u.sub_level_ptrs[k] == NULL) { return gs_rethrow(-1, "copy_color_list allocation error"); @@ -572,16 +572,19 @@ gs_free_object(thread_cdev->memory, devn_params->separations.names[k].data, "devn_free_params"); + devn_params->separations.names[k].data = NULL; } - free_compressed_color_list(thread_cdev->memory, - devn_params->compressed_color_list); + free_compressed_color_list(devn_params->compressed_color_list); + devn_params->compressed_color_list = NULL; + for (k = 0; k < devn_params->pdf14_separations.num_separations; k++) { gs_free_object(thread_cdev->memory, devn_params->pdf14_separations.names[k].data, "devn_free_params"); + devn_params->pdf14_separations.names[k].data = NULL; } - free_compressed_color_list(thread_cdev->memory, - devn_params->pdf14_compressed_color_list); + free_compressed_color_list(devn_params->pdf14_compressed_color_list); + devn_params->pdf14_compressed_color_list = NULL; } /* This is used to copy the deviceN parameters from the parent clist device to the @@ -627,7 +630,7 @@ src_color_list = src_devn_params->compressed_color_list; if (src_color_list != NULL) { /* Take care of the initial one. Others are done recursively */ - des_color_list = alloc_compressed_color_list_elem(pdesdev->memory, + des_color_list = alloc_compressed_color_list_elem(src_color_list->mem, TOP_ENCODED_LEVEL); des_color_list->first_bit_map = src_color_list->first_bit_map; des_color_list->num_sub_level_ptrs = src_color_list->num_sub_level_ptrs; @@ -652,7 +655,7 @@ src_color_list = src_devn_params->pdf14_compressed_color_list; if (src_color_list != NULL) { /* Take care of the initial one. Others are done recursively */ - des_color_list = alloc_compressed_color_list_elem(pdesdev->memory, + des_color_list = alloc_compressed_color_list_elem(src_color_list->mem, TOP_ENCODED_LEVEL); des_color_list->first_bit_map = src_color_list->first_bit_map; des_color_list->num_sub_level_ptrs = src_color_list->num_sub_level_ptrs; @@ -664,6 +667,28 @@ return code; } +static int +compare_equivalent_cmyk_color_params(const equivalent_cmyk_color_params *pequiv_colors1, const equivalent_cmyk_color_params *pequiv_colors2) +{ + int i; + if (pequiv_colors1->all_color_info_valid != pequiv_colors2->all_color_info_valid) + return(1); + for (i=0; icolor[i].color_info_valid != pequiv_colors2->color[i].color_info_valid) + return(1); + if (pequiv_colors1->color[i].c != pequiv_colors2->color[i].c ) + return(1); + if (pequiv_colors1->color[i].m != pequiv_colors2->color[i].m ) + return(1); + if (pequiv_colors1->color[i].y != pequiv_colors2->color[i].y ) + return(1); + if (pequiv_colors1->color[i].k != pequiv_colors2->color[i].k ) + return(1); + } + return(0); +} + + /* * Utility routine for handling DeviceN related parameters in a * standard raster printer type device. @@ -702,8 +727,7 @@ memcmp(pdevn_params, &saved_devn_params, sizeof(gs_devn_params)) || (pequiv_colors != NULL && - memcmp(pequiv_colors, &saved_equiv_colors, - sizeof(equivalent_cmyk_color_params)))) { + compare_equivalent_cmyk_color_params(pequiv_colors, &saved_equiv_colors))) { gs_closedevice(pdev); /* Reset the sparable and linear shift, masks, bits. */ set_linear_color_bits_mask_shift(pdev); @@ -784,14 +808,14 @@ for (comp_num = num_comp - 1; comp_num >= 0; comp_num--) { comp = colorant_present(pcomp_bit_map, colorants, comp_num); dlprintf1("%d", comp); - if ((comp_num & 7) == 0) /* Separate into groups of 8 bits */ + if ((comp_num & 7) == 0) /* Separate into groups of 8 bits */ dlprintf(" "); } dlprintf(" "); for (comp_num = num_comp - 1; comp_num >= 0; comp_num--) { comp = colorant_present(pcomp_bit_map, solid_colorants, comp_num); dlprintf1("%d", comp); - if ((comp_num & 7) == 0) /* Separate into groups of 8 bits */ + if ((comp_num & 7) == 0) /* Separate into groups of 8 bits */ dlprintf(" "); } dlprintf("\n"); @@ -818,6 +842,7 @@ if (plist != NULL) { /* Initialize the data in the element. */ memset(plist, 0, size_of(*plist)); + plist->mem = mem->stable_memory; plist->level_num_comp = num_comps; plist->first_bit_map = NUM_ENCODE_LIST_ITEMS; } @@ -828,8 +853,7 @@ * Free the elements of a compressed color list. */ void -free_compressed_color_list(gs_memory_t * mem, - compressed_color_list_t * pcomp_list) +free_compressed_color_list(compressed_color_list_t * pcomp_list) { int i; @@ -839,10 +863,11 @@ /* Discard the sub levels. */ /* Allocation for this object is done in stable memory. Make sure that is done here too */ - for (i = 0; i < pcomp_list->num_sub_level_ptrs; i++) - free_compressed_color_list(mem->stable_memory, - pcomp_list->u.sub_level_ptrs[i]); - gs_free_object(mem->stable_memory, pcomp_list, "free_compressed_color_list"); + for (i = 0; i < pcomp_list->num_sub_level_ptrs; i++) { + free_compressed_color_list(pcomp_list->u.sub_level_ptrs[i]); + pcomp_list->u.sub_level_ptrs[i] = NULL; + } + gs_free_object(pcomp_list->mem->stable_memory, pcomp_list, "free_compressed_color_list"); return; } @@ -912,7 +937,7 @@ entry_num = pcomp_list->num_sub_level_ptrs; if (entry_num < pcomp_list->first_bit_map) { pcomp_list->u.sub_level_ptrs[entry_num] = - alloc_compressed_color_list_elem(mem, pcomp_list->level_num_comp - 1); + alloc_compressed_color_list_elem(pcomp_list->mem, pcomp_list->level_num_comp - 1); if (pcomp_list->u.sub_level_ptrs[entry_num] != NULL) { pcomp_list->num_sub_level_ptrs++; status = sub_level_add_compressed_color_list(mem, pnew_comp_bit_map, @@ -1046,21 +1071,21 @@ * must fit into a gx_color_index value. */ int num_comp_bits[MAX_ENCODED_COMPONENTS + 1] = { - 8, /* 0 colorants - not used */ - 8, /* 1 colorants */ - 8, /* 2 colorants */ - 8, /* 3 colorants */ - 8, /* 4 colorants */ - 8, /* 5 colorants */ - 8, /* 6 colorants */ - 8, /* 7 colorants */ - 7, /* 8 colorants */ - 6, /* 9 colorants */ - 5, /* 10 colorants */ - 5, /* 11 colorants */ - 4, /* 12 colorants */ - 4, /* 13 colorants */ - 4 /* 14 colorants */ + 8, /* 0 colorants - not used */ + 8, /* 1 colorants */ + 8, /* 2 colorants */ + 8, /* 3 colorants */ + 8, /* 4 colorants */ + 8, /* 5 colorants */ + 8, /* 6 colorants */ + 8, /* 7 colorants */ + 7, /* 8 colorants */ + 6, /* 9 colorants */ + 5, /* 10 colorants */ + 5, /* 11 colorants */ + 4, /* 12 colorants */ + 4, /* 13 colorants */ + 4 /* 14 colorants */ }; /* @@ -1074,21 +1099,21 @@ ((gx_max_color_value << 8) + 0xff) / ((1 << num_bits) - 1) int comp_bit_factor[MAX_ENCODED_COMPONENTS + 1] = { - gx_color_value_factor(8), /* 0 colorants (8 bits) */ - gx_color_value_factor(8), /* 1 colorants (8 bits) */ - gx_color_value_factor(8), /* 2 colorants (8 bits) */ - gx_color_value_factor(8), /* 3 colorants (8 bits) */ - gx_color_value_factor(8), /* 4 colorants (8 bits) */ - gx_color_value_factor(8), /* 5 colorants (8 bits) */ - gx_color_value_factor(8), /* 6 colorants (8 bits) */ - gx_color_value_factor(8), /* 7 colorants (8 bits) */ - gx_color_value_factor(7), /* 8 colorants (7 bits) */ - gx_color_value_factor(6), /* 9 colorants (6 bits) */ - gx_color_value_factor(5), /* 10 colorants (5 bits) */ - gx_color_value_factor(5), /* 11 colorants (5 bits) */ - gx_color_value_factor(4), /* 12 colorants (4 bits) */ - gx_color_value_factor(4), /* 13 colorants (4 bits) */ - gx_color_value_factor(4) /* 14 colorants (4 bits) */ + gx_color_value_factor(8), /* 0 colorants (8 bits) */ + gx_color_value_factor(8), /* 1 colorants (8 bits) */ + gx_color_value_factor(8), /* 2 colorants (8 bits) */ + gx_color_value_factor(8), /* 3 colorants (8 bits) */ + gx_color_value_factor(8), /* 4 colorants (8 bits) */ + gx_color_value_factor(8), /* 5 colorants (8 bits) */ + gx_color_value_factor(8), /* 6 colorants (8 bits) */ + gx_color_value_factor(8), /* 7 colorants (8 bits) */ + gx_color_value_factor(7), /* 8 colorants (7 bits) */ + gx_color_value_factor(6), /* 9 colorants (6 bits) */ + gx_color_value_factor(5), /* 10 colorants (5 bits) */ + gx_color_value_factor(5), /* 11 colorants (5 bits) */ + gx_color_value_factor(4), /* 12 colorants (4 bits) */ + gx_color_value_factor(4), /* 13 colorants (4 bits) */ + gx_color_value_factor(4) /* 14 colorants (4 bits) */ }; #undef gx_color_value_factor @@ -1104,7 +1129,7 @@ * pnew_comp_bit_map - Pointer to the bit map found to be encoded. * plist_index - Pointer to 'encode bits' (return value) * pcomp_bit_map - Pointer to pointer to the actual bit map found - * (return value). + * (return value). * returns true if the bit map is found. */ static bool @@ -1147,11 +1172,11 @@ if ((pnew_comp_bit_map->colorants[j] & (*pcomp_bit_map)->colorants[j]) != pnew_comp_bit_map->colorants[j]) - break; /* No match if a colorant is missing. */ + break; /* No match if a colorant is missing. */ if ((pnew_comp_bit_map->solid_colorants[j] & (*pcomp_bit_map)->solid_colorants[j]) != (*pcomp_bit_map)->solid_colorants[j]) - break; /* No match if extra solid colorants */ + break; /* No match if extra solid colorants */ } if (j == num_bit_map_elem) { #else @@ -1184,7 +1209,7 @@ * can find a match. */ if (pcomp_list->level_num_comp <= pnew_comp_bit_map->num_non_solid_comp) - return false; /* Exit if not enough colorants in the sub levels */ + return false; /* Exit if not enough colorants in the sub levels */ for (i = 0; i < pcomp_list->num_sub_level_ptrs; i++) { found = search_compressed_color_list(num_comp, @@ -1231,18 +1256,18 @@ * allocated to storing colorant values depends upon the number of colorant * being used. * - * Number of non zero colorant Index bits Bits per colorant - * 0 to 5 24 8 - * 6 16 8 - * 7 8 8 - * 8 8 7 - * 9 8 6 - * 10 8 5 - * 11 8 5 - * 12 8 4 - * 13 8 4 - * 14 8 4 - * More than 14 Not encodeable + * Number of non zero colorant Index bits Bits per colorant + * 0 to 5 24 8 + * 6 16 8 + * 7 8 8 + * 8 8 7 + * 9 8 6 + * 10 8 5 + * 11 8 5 + * 12 8 4 + * 13 8 4 + * 14 8 4 + * More than 14 Not encodeable * * The 'index' bits can be logically divided into groups of 8 bits. The * first (upper) group of 8 bits is used to select either one of 256 @@ -1260,12 +1285,13 @@ { int num_comp = pdev->color_info.num_components; int comp_num, comp_count = 0, solid_comp_count = 0, bit_pos = 0; - int bit_shift, bit_count, group = 0; + int bit_count, group = 0; int color_resolution = gx_max_color_value / STD_ENCODED_VALUE; bool found, added; comp_bit_map_list_t new_comp_bit_map = {0}; comp_bit_map_list_t * pbit_map; gx_color_index color = 0, list_index; + COLROUND_VARS; /* * Determine what colorants are being used (non zero). We bit pack @@ -1341,7 +1367,7 @@ pdevn_params->compressed_color_list = init_compressed_color_list(pdev->memory->stable_memory); if (pdevn_params->compressed_color_list == NULL) - return NON_ENCODEABLE_COLOR; /* Unable to initialize list */ + return NON_ENCODEABLE_COLOR; /* Unable to initialize list */ } /* @@ -1373,16 +1399,15 @@ * colorant values. */ bit_count = num_comp_bits[pbit_map->num_non_solid_comp]; - bit_shift = sizeof(gx_color_value) * 8 - bit_count; if (pbit_map->solid_not_100) { color = group >> (8 - bit_count); bit_pos += bit_count; } + COLROUND_SETUP(bit_count); for (comp_num = 0; comp_num < num_comp; comp_num++) { if (colorant_present(pbit_map, colorants, comp_num) && !colorant_present(pbit_map, solid_colorants, comp_num)) { - color |= - ((gx_color_index)(colors[comp_num] >> bit_shift)) << bit_pos; + color |= COLROUND_ROUND(colors[comp_num]) << bit_pos; bit_pos += bit_count; } } @@ -1509,9 +1534,10 @@ int factor, bit_count, bit_mask; comp_bit_map_list_t * pbitmap; gx_color_index color; - gx_color_value solid_color = gx_max_color_value; for (pixel_num = 0; pixel_num < width; pixel_num++) { + gx_color_value solid_color = gx_max_color_value; + /* * Get the encoded color value. */ @@ -1614,9 +1640,9 @@ /* we need to implement it separately because st_composite_final */ /* declares all 3 procedures as private. */ static void -spotcmyk_device_finalize(void *vpdev) +spotcmyk_device_finalize(const gs_memory_t *cmem, void *vpdev) { - gx_device_finalize(vpdev); + gx_device_finalize(cmem, vpdev); } gs_private_st_composite_final(st_spotcmyk_device, spotcmyk_device, @@ -1627,61 +1653,61 @@ * Macro definition for DeviceN procedures */ #define device_procs(get_color_mapping_procs)\ -{ spotcmyk_prn_open,\ +{ spotcmyk_prn_open,\ gx_default_get_initial_matrix,\ - NULL, /* sync_output */\ - gdev_prn_output_page, /* output_page */\ - gdev_prn_close, /* close */\ - NULL, /* map_rgb_color - not used */\ - NULL, /* map_color_rgb - not used */\ - NULL, /* fill_rectangle */\ - NULL, /* tile_rectangle */\ - NULL, /* copy_mono */\ - NULL, /* copy_color */\ - NULL, /* draw_line */\ - NULL, /* get_bits */\ - spotcmyk_get_params, /* get_params */\ - spotcmyk_put_params, /* put_params */\ - NULL, /* map_cmyk_color - not used */\ - NULL, /* get_xfont_procs */\ - NULL, /* get_xfont_device */\ - NULL, /* map_rgb_alpha_color */\ - gx_page_device_get_page_device, /* get_page_device */\ - NULL, /* get_alpha_bits */\ - NULL, /* copy_alpha */\ - NULL, /* get_band */\ - NULL, /* copy_rop */\ - NULL, /* fill_path */\ - NULL, /* stroke_path */\ - NULL, /* fill_mask */\ - NULL, /* fill_trapezoid */\ - NULL, /* fill_parallelogram */\ - NULL, /* fill_triangle */\ - NULL, /* draw_thin_line */\ - NULL, /* begin_image */\ - NULL, /* image_data */\ - NULL, /* end_image */\ - NULL, /* strip_tile_rectangle */\ - NULL, /* strip_copy_rop */\ - NULL, /* get_clipping_box */\ - NULL, /* begin_typed_image */\ - NULL, /* get_bits_rectangle */\ - NULL, /* map_color_rgb_alpha */\ - NULL, /* create_compositor */\ - NULL, /* get_hardware_params */\ - NULL, /* text_begin */\ - NULL, /* finish_copydevice */\ - NULL, /* begin_transparency_group */\ - NULL, /* end_transparency_group */\ - NULL, /* begin_transparency_mask */\ - NULL, /* end_transparency_mask */\ - NULL, /* discard_transparency_layer */\ - get_color_mapping_procs, /* get_color_mapping_procs */\ - spotcmyk_get_color_comp_index, /* get_color_comp_index */\ - spotcmyk_encode_color, /* encode_color */\ - spotcmyk_decode_color, /* decode_color */\ - NULL, /* pattern_manage */\ - NULL /* fill_rectangle_hl_color */\ + NULL, /* sync_output */\ + gdev_prn_output_page, /* output_page */\ + gdev_prn_close, /* close */\ + NULL, /* map_rgb_color - not used */\ + NULL, /* map_color_rgb - not used */\ + NULL, /* fill_rectangle */\ + NULL, /* tile_rectangle */\ + NULL, /* copy_mono */\ + NULL, /* copy_color */\ + NULL, /* draw_line */\ + NULL, /* get_bits */\ + spotcmyk_get_params, /* get_params */\ + spotcmyk_put_params, /* put_params */\ + NULL, /* map_cmyk_color - not used */\ + NULL, /* get_xfont_procs */\ + NULL, /* get_xfont_device */\ + NULL, /* map_rgb_alpha_color */\ + gx_page_device_get_page_device, /* get_page_device */\ + NULL, /* get_alpha_bits */\ + NULL, /* copy_alpha */\ + NULL, /* get_band */\ + NULL, /* copy_rop */\ + NULL, /* fill_path */\ + NULL, /* stroke_path */\ + NULL, /* fill_mask */\ + NULL, /* fill_trapezoid */\ + NULL, /* fill_parallelogram */\ + NULL, /* fill_triangle */\ + NULL, /* draw_thin_line */\ + NULL, /* begin_image */\ + NULL, /* image_data */\ + NULL, /* end_image */\ + NULL, /* strip_tile_rectangle */\ + NULL, /* strip_copy_rop */\ + NULL, /* get_clipping_box */\ + NULL, /* begin_typed_image */\ + NULL, /* get_bits_rectangle */\ + NULL, /* map_color_rgb_alpha */\ + NULL, /* create_compositor */\ + NULL, /* get_hardware_params */\ + NULL, /* text_begin */\ + NULL, /* finish_copydevice */\ + NULL, /* begin_transparency_group */\ + NULL, /* end_transparency_group */\ + NULL, /* begin_transparency_mask */\ + NULL, /* end_transparency_mask */\ + NULL, /* discard_transparency_layer */\ + get_color_mapping_procs, /* get_color_mapping_procs */\ + spotcmyk_get_color_comp_index, /* get_color_comp_index */\ + spotcmyk_encode_color, /* encode_color */\ + spotcmyk_decode_color, /* decode_color */\ + NULL, /* pattern_manage */\ + NULL /* fill_rectangle_hl_color */\ } fixed_colorant_name DeviceCMYKComponents[] = { @@ -1689,7 +1715,7 @@ "Magenta", "Yellow", "Black", - 0 /* List terminator */ + 0 /* List terminator */ }; #define spotcmyk_device_body(procs, dname, ncomp, pol, depth, mg, mc, cn)\ @@ -1698,16 +1724,16 @@ (int)((long)(DEFAULT_WIDTH_10THS) * (X_DPI) / 10),\ (int)((long)(DEFAULT_HEIGHT_10THS) * (Y_DPI) / 10),\ X_DPI, Y_DPI,\ - GX_DEVICE_COLOR_MAX_COMPONENTS, /* MaxComponents */\ - ncomp, /* NumComp */\ - pol, /* Polarity */\ - depth, 0, /* Depth, GrayIndex */\ - mg, mc, /* MaxGray, MaxColor */\ - mg + 1, mc + 1, /* DitherGray, DitherColor */\ - GX_CINFO_SEP_LIN, /* Linear & Separable */\ - cn, /* Process color model name */\ - 0, 0, /* offsets */\ - 0, 0, 0, 0 /* margins */\ + GX_DEVICE_COLOR_MAX_COMPONENTS, /* MaxComponents */\ + ncomp, /* NumComp */\ + pol, /* Polarity */\ + depth, 0, /* Depth, GrayIndex */\ + mg, mc, /* MaxGray, MaxColor */\ + mg + 1, mc + 1, /* DitherGray, DitherColor */\ + GX_CINFO_SEP_LIN, /* Linear & Separable */\ + cn, /* Process color model name */\ + 0, 0, /* offsets */\ + 0, 0, 0, 0 /* margins */\ ),\ prn_device_body_rest_(spotcmyk_print_page) @@ -1720,14 +1746,14 @@ { spotcmyk_device_body(spot_cmyk_procs, "spotcmyk", 4, GX_CINFO_POLARITY_SUBTRACTIVE, 4, 1, 1, "DeviceCMYK"), /* DeviceN device specific parameters */ - { 1, /* Bits per color - must match ncomp, depth, etc. above */ - DeviceCMYKComponents, /* Names of color model colorants */ - 4, /* Number colorants for CMYK */ - 0, /* MaxSeparations has not been specified */ - -1, /* PageSpotColors has not been specified */ - {0}, /* SeparationNames */ - 0, /* SeparationOrder names */ - {0, 1, 2, 3, 4, 5, 6, 7 } /* Initial component SeparationOrder */ + { 1, /* Bits per color - must match ncomp, depth, etc. above */ + DeviceCMYKComponents, /* Names of color model colorants */ + 4, /* Number colorants for CMYK */ + 0, /* MaxSeparations has not been specified */ + -1, /* PageSpotColors has not been specified */ + {0}, /* SeparationNames */ + 0, /* SeparationOrder names */ + {0, 1, 2, 3, 4, 5, 6, 7 } /* Initial component SeparationOrder */ } }; @@ -1740,14 +1766,14 @@ { spotcmyk_device_body(devicen_procs, "devicen", 4, GX_CINFO_POLARITY_SUBTRACTIVE, 32, 255, 255, "DeviceCMYK"), /* DeviceN device specific parameters */ - { 8, /* Bits per color - must match ncomp, depth, etc. above */ - NULL, /* No names for standard DeviceN color model */ - 0, /* No standard colorants for DeviceN */ - 0, /* MaxSeparations has not been specified */ - -1, /* PageSpotColors has not been specified */ - {0}, /* SeparationNames */ - 0, /* SeparationOrder names */ - {0, 1, 2, 3, 4, 5, 6, 7 } /* Initial component SeparationOrder */ + { 8, /* Bits per color - must match ncomp, depth, etc. above */ + NULL, /* No names for standard DeviceN color model */ + 0, /* No standard colorants for DeviceN */ + 0, /* MaxSeparations has not been specified */ + -1, /* PageSpotColors has not been specified */ + {0}, /* SeparationNames */ + 0, /* SeparationOrder names */ + {0, 1, 2, 3, 4, 5, 6, 7 } /* Initial component SeparationOrder */ } }; @@ -1814,14 +1840,15 @@ spotcmyk_encode_color(gx_device *dev, const gx_color_value colors[]) { int bpc = ((spotcmyk_device *)dev)->devn_params.bitspercomponent; - int drop = sizeof(gx_color_value) * 8 - bpc; gx_color_index color = 0; int i = 0; int ncomp = dev->color_info.num_components; + COLROUND_VARS; + COLROUND_SETUP(bpc); for (; i> drop); + color |= COLROUND_ROUND(colors[i]); } return (color == gx_no_color_index ? color ^ 1 : color); } @@ -1833,13 +1860,14 @@ spotcmyk_decode_color(gx_device * dev, gx_color_index color, gx_color_value * out) { int bpc = ((spotcmyk_device *)dev)->devn_params.bitspercomponent; - int drop = sizeof(gx_color_value) * 8 - bpc; int mask = (1 << bpc) - 1; int i = 0; int ncomp = dev->color_info.num_components; + COLDUP_VARS; + COLDUP_SETUP(bpc); for (; i>= bpc; } return 0; @@ -1908,8 +1936,8 @@ repack_data(byte * source, byte * dest, int depth, int first_bit, int bit_width, int npixel) { - int in_nbyte = depth >> 3; /* Number of bytes per input pixel */ - int out_nbyte = bit_width >> 3; /* Number of bytes per output pixel */ + int in_nbyte = depth >> 3; /* Number of bytes per input pixel */ + int out_nbyte = bit_width >> 3; /* Number of bytes per output pixel */ gx_color_index mask = 1; gx_color_index data; int i, j, length = 0; @@ -1922,16 +1950,16 @@ mask = (mask << bit_width) - 1; for (i=0; i>= in_byte_loc; in_byte_loc -= depth; - if (in_byte_loc < 0) { /* If finished with byte */ + if (in_byte_loc < 0) { /* If finished with byte */ in_byte_loc = in_bit_start; source++; } } - else { /* One or more bytes per pixel */ + else { /* One or more bytes per pixel */ data = *source++; for (j=1; j> ((out_nbyte - 1) * 8)); for (j=1; j> ((out_nbyte - 1 - j) * 8)); @@ -1957,8 +1985,8 @@ } } /* Return the number of bytes in the destination buffer. */ - if (out_byte_loc != out_bit_start) { /* If partially filled last byte */ - *out = *out & ((~0) << out_byte_loc); /* Mask unused part of last byte */ + if (out_byte_loc != out_bit_start) { /* If partially filled last byte */ + *out = *out & ((~0) << out_byte_loc); /* Mask unused part of last byte */ out++; } length = out - dest; @@ -2111,49 +2139,49 @@ #endif typedef struct pcx_header_s { - byte manuf; /* always 0x0a */ + byte manuf; /* always 0x0a */ byte version; -#define version_2_5 0 -#define version_2_8_with_palette 2 -#define version_2_8_without_palette 3 -#define version_3_0 /* with palette */ 5 - byte encoding; /* 1=RLE */ - byte bpp; /* bits per pixel per plane */ - ushort x1; /* X of upper left corner */ - ushort y1; /* Y of upper left corner */ - ushort x2; /* x1 + width - 1 */ - ushort y2; /* y1 + height - 1 */ - ushort hres; /* horz. resolution (dots per inch) */ - ushort vres; /* vert. resolution (dots per inch) */ - byte palette[16 * 3]; /* color palette */ +#define version_2_5 0 +#define version_2_8_with_palette 2 +#define version_2_8_without_palette 3 +#define version_3_0 /* with palette */ 5 + byte encoding; /* 1=RLE */ + byte bpp; /* bits per pixel per plane */ + ushort x1; /* X of upper left corner */ + ushort y1; /* Y of upper left corner */ + ushort x2; /* x1 + width - 1 */ + ushort y2; /* y1 + height - 1 */ + ushort hres; /* horz. resolution (dots per inch) */ + ushort vres; /* vert. resolution (dots per inch) */ + byte palette[16 * 3]; /* color palette */ byte reserved; - byte nplanes; /* number of color planes */ - ushort bpl; /* number of bytes per line (uncompressed) */ + byte nplanes; /* number of color planes */ + ushort bpl; /* number of bytes per line (uncompressed) */ ushort palinfo; -#define palinfo_color 1 -#define palinfo_gray 2 - byte xtra[58]; /* fill out header to 128 bytes */ +#define palinfo_color 1 +#define palinfo_gray 2 + byte xtra[58]; /* fill out header to 128 bytes */ } pcx_header; /* Define the prototype header. */ static const pcx_header pcx_header_prototype = { - 10, /* manuf */ - 0, /* version (variable) */ - 1, /* encoding */ - 0, /* bpp (variable) */ - 00, 00, /* x1, y1 */ - 00, 00, /* x2, y2 (variable) */ - 00, 00, /* hres, vres (variable) */ - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* palette (variable) */ + 10, /* manuf */ + 0, /* version (variable) */ + 1, /* encoding */ + 0, /* bpp (variable) */ + 00, 00, /* x1, y1 */ + 00, 00, /* x2, y2 (variable) */ + 00, 00, /* hres, vres (variable) */ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* palette (variable) */ 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, /* reserved */ - 0, /* nplanes (variable) */ - 00, /* bpl (variable) */ - 00, /* palinfo (variable) */ - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* xtra */ + 0, /* reserved */ + 0, /* nplanes (variable) */ + 00, /* bpl (variable) */ + 00, /* palinfo (variable) */ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* xtra */ 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} @@ -2212,56 +2240,56 @@ memcpy((byte *) phdr->palette, "\000\000\000\377\377\377", 6); planar = false; break; - case 2: /* Not defined */ + case 2: /* Not defined */ break; case 4: phdr->version = version_2_8_with_palette; memcpy((byte *) phdr->palette, pcx_ega_palette, sizeof(pcx_ega_palette)); planar = true; break; - case 5: /* Not defined */ + case 5: /* Not defined */ break; case 8: phdr->version = version_3_0; assign_ushort(phdr->palinfo, palinfo_gray); planar = false; break; - case 16: /* Not defined */ + case 16: /* Not defined */ break; } break; case 2: switch (bits_per_plane) { - case 1: /* Not defined */ + case 1: /* Not defined */ break; - case 2: /* Not defined */ + case 2: /* Not defined */ break; - case 4: /* Not defined */ + case 4: /* Not defined */ break; - case 5: /* Not defined */ + case 5: /* Not defined */ break; - case 8: /* Not defined */ + case 8: /* Not defined */ break; - case 16: /* Not defined */ + case 16: /* Not defined */ break; } break; case 3: switch (bits_per_plane) { - case 1: /* Not defined */ + case 1: /* Not defined */ break; - case 2: /* Not defined */ + case 2: /* Not defined */ break; - case 4: /* Not defined */ + case 4: /* Not defined */ break; - case 5: /* Not defined */ + case 5: /* Not defined */ break; case 8: phdr->version = version_3_0; assign_ushort(phdr->palinfo, palinfo_color); planar = true; break; - case 16: /* Not defined */ + case 16: /* Not defined */ break; } break; @@ -2275,15 +2303,15 @@ phdr->bpp = 4; phdr->nplanes = 1; break; - case 2: /* Not defined */ + case 2: /* Not defined */ break; - case 4: /* Not defined */ + case 4: /* Not defined */ break; - case 5: /* Not defined */ + case 5: /* Not defined */ break; - case 8: /* Not defined */ + case 8: /* Not defined */ break; - case 16: /* Not defined */ + case 16: /* Not defined */ break; } break; @@ -2328,66 +2356,66 @@ switch (num_planes) { case 1: switch (bits_per_plane) { - case 1: /* Do nothing */ + case 1: /* Do nothing */ break; - case 2: /* Not defined */ + case 2: /* Not defined */ break; - case 4: /* Do nothing */ + case 4: /* Do nothing */ break; - case 5: /* Not defined */ + case 5: /* Not defined */ break; case 8: fputc(0x0c, file); return pc_write_mono_palette((gx_device *) pdev, 256, file); - case 16: /* Not defined */ + case 16: /* Not defined */ break; } break; case 2: switch (bits_per_plane) { - case 1: /* Not defined */ + case 1: /* Not defined */ break; - case 2: /* Not defined */ + case 2: /* Not defined */ break; - case 4: /* Not defined */ + case 4: /* Not defined */ break; - case 5: /* Not defined */ + case 5: /* Not defined */ break; - case 8: /* Not defined */ + case 8: /* Not defined */ break; - case 16: /* Not defined */ + case 16: /* Not defined */ break; } break; case 3: switch (bits_per_plane) { - case 1: /* Not defined */ + case 1: /* Not defined */ break; - case 2: /* Not defined */ + case 2: /* Not defined */ break; - case 4: /* Not defined */ + case 4: /* Not defined */ break; - case 5: /* Not defined */ + case 5: /* Not defined */ break; - case 8: /* Do nothing */ + case 8: /* Do nothing */ break; - case 16: /* Not defined */ + case 16: /* Not defined */ break; } break; case 4: switch (bits_per_plane) { - case 1: /* Do nothing */ + case 1: /* Do nothing */ break; - case 2: /* Not defined */ + case 2: /* Not defined */ break; - case 4: /* Not defined */ + case 4: /* Not defined */ break; - case 5: /* Not defined */ + case 5: /* Not defined */ break; - case 8: /* Not defined */ + case 8: /* Not defined */ break; - case 16: /* Not defined */ + case 16: /* Not defined */ break; } break; @@ -2436,15 +2464,15 @@ pcx_header * phdr, bool planar, int depth) { int raster = linesize; - uint rsize = ROUND_UP((pdev->width * phdr->bpp + 7) >> 3, 2); /* PCX format requires even */ + uint rsize = ROUND_UP((pdev->width * phdr->bpp + 7) >> 3, 2); /* PCX format requires even */ int height = pdev->height; uint lsize = raster + rsize; byte *line = gs_alloc_bytes(pdev->memory, lsize, "pcx file buffer"); byte *plane = line + raster; int y; - int code = 0; /* return code */ + int code = 0; /* return code */ - if (line == 0) /* can't allocate line buffer */ + if (line == 0) /* can't allocate line buffer */ return_error(gs_error_VMerror); /* Fill in the other variable entries in the header struct. */ @@ -2471,8 +2499,8 @@ if (code < 0) break; end = row + raster; - if (!planar) { /* Just write the bits. */ - if (raster & 1) { /* Round to even, with predictable padding. */ + if (!planar) { /* Just write the bits. */ + if (raster & 1) { /* Round to even, with predictable padding. */ *end = end[-1]; ++end; } @@ -2518,7 +2546,7 @@ for (pnum = 0; pnum < 3; ++pnum) { devn_pcx_write_rle(row + pnum, row + raster, 3, outfile); if (pdev->width & 1) - fputc(0, outfile); /* pad to even */ + fputc(0, outfile); /* pad to even */ } } break; diff -Nru ghostscript-9.04~dfsg/base/gdevdevn.h ghostscript-9.05~dfsg~20120125/base/gdevdevn.h --- ghostscript-9.04~dfsg/base/gdevdevn.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevdevn.h 2011-11-12 18:29:08.000000000 +0000 @@ -453,6 +453,7 @@ * gx_color_index value. */ typedef struct compressed_color_list_s { + gs_memory_t * mem; /* the allocator used for this structure */ /* * The number of colorants for this level of the encoded color list. * Note: Each sub level encodes one fewer colorants. @@ -555,12 +556,11 @@ /* * Free the elements of a compressed color list. */ -void free_compressed_color_list(gs_memory_t * mem, - compressed_color_list_t * pcomp_list); +void free_compressed_color_list(compressed_color_list_t * pcomp_list); /* * Free a set of separation names */ -void free_separation_names(gs_memory_t * mem, gs_separations * pseparation); +void free_separation_names(gs_memory_t *mem, gs_separations * pseparation); #endif /* ifndef gdevdevn_INCLUDED */ diff -Nru ghostscript-9.04~dfsg/base/gdevdflt.c ghostscript-9.05~dfsg~20120125/base/gdevdflt.c --- ghostscript-9.04~dfsg/base/gdevdflt.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevdflt.c 2011-11-21 08:55:19.000000000 +0000 @@ -378,7 +378,7 @@ * a value of zero then the bits associated with that colorant are zero. * These criteria allows the graphics library to build gx_color_index values * from the colorant values and not using the encode_color routine. This is - * useful and necessary for overprinting, the WTS screeening, halftoning more + * useful and necessary for overprinting, halftoning more * than four colorants, and the fast shading logic. However this information * is not setup by the default device macros. Thus we attempt to derive this * information. @@ -559,6 +559,7 @@ #undef CHECK_NON_DEFAULT fill_dev_proc(dev, strip_tile_rectangle, gx_default_strip_tile_rectangle); fill_dev_proc(dev, strip_copy_rop, gx_default_strip_copy_rop); + fill_dev_proc(dev, strip_copy_rop2, gx_default_strip_copy_rop2); fill_dev_proc(dev, get_clipping_box, gx_default_get_clipping_box); fill_dev_proc(dev, begin_typed_image, gx_default_begin_typed_image); fill_dev_proc(dev, get_bits_rectangle, gx_default_get_bits_rectangle); @@ -669,7 +670,7 @@ /* NOT pop_transparency_state */ /* NOT put_image */ fill_dev_proc(dev, dev_spec_op, gx_default_dev_spec_op); - /* NOT copy_plane */ + /* NOT copy_planes */ } int diff -Nru ghostscript-9.04~dfsg/base/gdevdrop.c ghostscript-9.05~dfsg~20120125/base/gdevdrop.c --- ghostscript-9.04~dfsg/base/gdevdrop.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevdrop.c 2011-11-21 08:55:19.000000000 +0000 @@ -24,6 +24,7 @@ #include "gxdevrop.h" #include "gxgetbit.h" #include "gdevmem.h" /* for mem_default_strip_copy_rop prototype */ +#include "gdevmpla.h" #include "gdevmrop.h" #include "gxdevsop.h" @@ -98,6 +99,24 @@ int phase_x, int phase_y, gs_logical_operation_t lop) { + return gx_default_strip_copy_rop2(dev, sdata, sourcex, sraster, id, + scolors, textures, tcolors, + x, y, width, height, + phase_x, phase_y, lop, 0); +} + +int +gx_default_strip_copy_rop2(gx_device * dev, + const byte * sdata, int sourcex, + uint sraster, gx_bitmap_id id, + const gx_color_index * scolors, + const gx_strip_bitmap * textures, + const gx_color_index * tcolors, + int x, int y, int width, int height, + int phase_x, int phase_y, + gs_logical_operation_t lop, + uint planar_height) +{ int depth = dev->color_info.depth; gs_memory_t *mem = dev->memory; const gx_device_memory *mdproto = gdev_mem_device_for_bits(depth); @@ -109,6 +128,7 @@ int block_height; int code; int py; + int is_planar = 0; #ifdef DEBUG if (gs_debug_c('b')) @@ -129,11 +149,33 @@ if (max_height == 0) max_height = 1; block_height = min(height, max_height); + if (planar_height > 0) + block_height = planar_height; gs_make_mem_device_with_copydevice(&pmdev, mdproto, mem, -1, dev); pmdev->width = width; pmdev->height = block_height; pmdev->bitmap_memory = mem; pmdev->color_info = dev->color_info; + if (dev_proc(dev, dev_spec_op)(dev, gxdso_is_native_planar, NULL, 0)) + { + gx_render_plane_t planes[GX_DEVICE_COLOR_MAX_COMPONENTS]; + int num_comp = dev->color_info.num_components; + int depth = dev->color_info.depth/num_comp; + int i; + for (i = 0; i < num_comp; i++) + { + planes[i].shift = depth * (num_comp - 1 - i); + planes[i].depth = depth; + planes[i].index = i; + } + /* RJW: This code, like most of ghostscripts planar support, + * will only work if every plane has the same depth. */ + draster = bitmap_raster(width * planes[0].depth); + code = gdev_mem_set_planar(pmdev, num_comp, planes); + if (code < 0) + return code; + is_planar = 1; + } code = (*dev_proc(pmdev, open_device))((gx_device *)pmdev); pmdev->is_open = true; /* not sure why we need this, but we do. */ if (code < 0) @@ -172,16 +214,36 @@ if (code < 0) return code; } - code = (*dev_proc(pmdev, strip_copy_rop)) - ((gx_device *)pmdev, - sdata + (py - y) * sraster, sourcex, sraster, - gx_no_bitmap_id, scolors, textures, tcolors, - 0, 0, width, block_height, phase_x + x, phase_y + py, lop); + if (planar_height == 0) { + code = (*dev_proc(pmdev, strip_copy_rop)) + ((gx_device *)pmdev, + sdata + (py - y) * sraster, sourcex, sraster, + gx_no_bitmap_id, scolors, textures, tcolors, + 0, 0, width, block_height, + phase_x + x, phase_y + py, + lop); + } else { + code = (*dev_proc(pmdev, strip_copy_rop2)) + ((gx_device *)pmdev, + sdata + (py - y) * sraster, sourcex, sraster, + gx_no_bitmap_id, scolors, textures, tcolors, + 0, 0, width, block_height, + phase_x + x, phase_y + py, + lop, planar_height); + } if (code < 0) break; - code = (*dev_proc(dev, copy_color)) - (dev, scan_line_base(pmdev, 0), 0, draster, gx_no_bitmap_id, - x, py, width, block_height); + if (is_planar) { + code = (*dev_proc(dev, copy_planes)) + (dev, scan_line_base(pmdev, 0), 0, + draster, gx_no_bitmap_id, + x, py, width, block_height, block_height); + } else { + code = (*dev_proc(dev, copy_color)) + (dev, scan_line_base(pmdev, 0), 0, + draster, gx_no_bitmap_id, + x, py, width, block_height); + } if (code < 0) break; } @@ -458,6 +520,12 @@ *dp[3]++ = (byte)pixel; shift = 0; break; + case 24: + *dp[0]++ = (byte)(pixel >> 16); + *dp[1]++ = (byte)(pixel >> 8); + *dp[2]++ = (byte)pixel; + shift = 0; + break; case 16: *dp[0]++ = (byte)(pixel >> 8); *dp[1]++ = (byte)pixel; @@ -465,18 +533,38 @@ break; default: /* 1, 2, 4, 8 */ { - int pshift = 8-pdepth; int pmask = (1<= 0) { - for (plane = 0; plane < dev->num_planes; pshift+=8,plane++) - buf[plane] += (byte)(((pixel>>pshift) & pmask)<num_planes-1); +#endif + /* Can we fit another pdepth bits into our buffer? */ + shift -= pdepth; + if (shift < 0) { + /* No, so flush the buffer to the planes. */ for (plane = 0; plane < dev->num_planes; plane++) *dp[plane]++ = buf[plane]; shift += 8; - for (plane = 0; plane < dev->num_planes; pshift+=8,plane++) - buf[plane] = (byte)(((pixel>>pshift) & pmask)<num_planes; pshift+=8,plane++) + buf[plane] += (byte)(((pixel>>pshift) & pmask)<num_planes; pshift-=pdepth,plane++) + buf[plane] += (byte)(((pixel>>pshift) & pmask)<color_info.depth; int rop_depth = (gx_device_has_color(dev) ? 24 : 8); @@ -518,6 +622,11 @@ GB_COLORS_NATIVE | GB_ALPHA_NONE | GB_DEPTH_ALL | GB_PACKING_CHUNKY | GB_RETURN_ALL | GB_ALIGN_STANDARD | GB_OFFSET_0 | GB_OFFSET_ANY | GB_RASTER_STANDARD; + const gx_bitmap_format_t no_expand_t_options = + GB_COLORS_NATIVE | GB_ALPHA_NONE | GB_DEPTH_ALL | + GB_RETURN_ALL | GB_ALIGN_STANDARD | + GB_OFFSET_0 | GB_OFFSET_ANY | GB_RASTER_STANDARD | + ((textures && textures->num_planes > 1) ? GB_PACKING_PLANAR : GB_PACKING_CHUNKY); const gx_bitmap_format_t expand_options = (rop_depth > 8 ? GB_COLORS_RGB : GB_COLORS_GRAY) | GB_ALPHA_NONE | GB_DEPTH_8 | @@ -552,6 +661,7 @@ gs_get_bits_params_t bit_params; gs_get_bits_params_t expand_params; gs_get_bits_params_t no_expand_params; + gs_get_bits_params_t no_expand_t_params; int max_height; int block_height, loop_height; int code; @@ -611,6 +721,7 @@ expand_s = scolors == 0 && uses_s; expand_t = tcolors == 0 && uses_t; no_expand_params.options = no_expand_options; + no_expand_t_params.options = no_expand_t_options; if (expand_t) { /* * We don't want to wrap around more than once in Y when @@ -684,7 +795,7 @@ rect.q.y = py + loop_height; expand_params.data[0] = texture_row; gx_get_bits_copy(dev, 0, textures->rep_width, loop_height, - &expand_params, &no_expand_params, + &expand_params, &no_expand_t_params, textures->data + rep_y * textures->raster, textures->raster); /* @@ -760,6 +871,7 @@ else { *(gx_tile_bitmap *) & tiles = *texture; tiles.rep_shift = tiles.shift = 0; + tiles.num_planes = 1; textures = &tiles; } return (*dev_proc(dev, strip_copy_rop)) @@ -783,6 +895,7 @@ else { *(gx_tile_bitmap *) & tiles = *texture; tiles.rep_shift = tiles.shift = 0; + tiles.num_planes = 1; textures = &tiles; } return gx_strip_copy_rop_unaligned diff -Nru ghostscript-9.04~dfsg/base/gdevdsp.c ghostscript-9.05~dfsg~20120125/base/gdevdsp.c --- ghostscript-9.04~dfsg/base/gdevdsp.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevdsp.c 2011-11-12 18:29:08.000000000 +0000 @@ -444,6 +444,7 @@ gx_color_value r = cv[0]; gx_color_value g = cv[1]; gx_color_value b = cv[2]; + /* FIXME: Simple truncation isn't ideal. Should round really. */ if ((ddev->nFormat & DISPLAY_ENDIAN_MASK) == DISPLAY_BIGENDIAN) { if ((ddev->nFormat & DISPLAY_555_MASK) == DISPLAY_NATIVE_555) /* byte0=0RRRRRGG byte1=GGGBBBBB */ @@ -1112,10 +1113,12 @@ gx_color_index color = 0; int i = 0; int ncomp = dev->color_info.num_components; + COLROUND_VARS; + COLROUND_SETUP(bpc); for (; i> drop); + color |= COLROUND_ROUND(colors[i]); } if (bpc*ncomp < arch_sizeof_color_index * 8) color <<= (arch_sizeof_color_index * 8 - ncomp * bpc); @@ -1134,11 +1137,13 @@ int mask = (1 << bpc) - 1; int i = 0; int ncomp = dev->color_info.num_components; + COLDUP_VARS; + COLDUP_SETUP(bpc); if (bpc*ncomp < arch_sizeof_color_index * 8) color >>= (arch_sizeof_color_index * 8 - ncomp * bpc); for (; i>= bpc; } return 0; diff -Nru ghostscript-9.04~dfsg/base/gdevepsc.c ghostscript-9.05~dfsg~20120125/base/gdevepsc.c --- ghostscript-9.04~dfsg/base/gdevepsc.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevepsc.c 2011-09-29 11:01:33.000000000 +0000 @@ -329,7 +329,7 @@ ** but lets check anyway */ if (current_color) - fprintf(prn_stream,"\033r%d",current_color ^ 7); + fprintf(prn_stream,"\033r%c",current_color ^ 7); } /* We have to 'transpose' blocks of 8 pixels x 8 lines, */ diff -Nru ghostscript-9.04~dfsg/base/gdevfax.c ghostscript-9.05~dfsg~20120125/base/gdevfax.c --- ghostscript-9.04~dfsg/base/gdevfax.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevfax.c 2011-11-12 18:29:08.000000000 +0000 @@ -167,7 +167,7 @@ int min_feature_size = ((gx_device_fax *const)pdev)->MinFeatureSize; /* Initialize the common part of the encoder state. */ - ss->template = temp; + ss->templat = temp; ss->memory = mem; /* Now initialize the encoder. */ code = temp->init(ss); diff -Nru ghostscript-9.04~dfsg/base/gdevhit.c ghostscript-9.05~dfsg~20120125/base/gdevhit.c --- ghostscript-9.04~dfsg/base/gdevhit.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevhit.c 2011-09-29 11:01:33.000000000 +0000 @@ -13,7 +13,6 @@ /* $Id$ */ /* Hit detection device */ #include "std.h" -#include "gserror.h" #include "gserrors.h" #include "gstypes.h" #include "gsmemory.h" diff -Nru ghostscript-9.04~dfsg/base/gdevicov.c ghostscript-9.05~dfsg~20120125/base/gdevicov.c --- ghostscript-9.04~dfsg/base/gdevicov.c 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevicov.c 2012-01-07 20:18:22.000000000 +0000 @@ -0,0 +1,113 @@ +/* Copyright (C) 2011 Artifex Software, Inc. + All Rights Reserved. + + This software is provided AS-IS with no warranty, either express or + implied. + + This software is distributed under license and may not be copied, modified + or distributed except as expressly authorized under the terms of that + license. Refer to licensing information at http://www.artifex.com/ + or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. +*/ + +/* $Id$ */ + +/* inkcov: compute ink coverage of the document being rendered. + * originally copyright 2011 Sebastian Kapfer + * but assigned to Artifex Software, Inc. (see http://bugs.ghostscript.com/show_bug.cgi?id=692665) + * + * output is plain text; one line per page. + * columns 1 through 4 give the fraction of pixels containing + * c, m, y and black ink. + * column 5 is the string 'CMYK'. + * column 6 is 'OK' if everything went fine, 'ERROR' if there + * was a problem. + * + * the resolution defaults to 75 dpi (which gives good-enough estimates) + * but can be changed via the -r flag to Ghostscript. + */ + +#include "stdint_.h" +#include "stdio_.h" +#include "gdevprn.h" + +static int +cov_write_page(gx_device_printer *pdev, FILE *file) +{ + int code = 0; + int raster = gdev_prn_raster(pdev); + int height = pdev->height; + byte *line = gs_alloc_bytes(pdev->memory, raster, "ink coverage plugin buffer"); + int y; + uint64_t c_pix = 0, m_pix = 0, y_pix = 0, k_pix = 0, total_pix = 0; + + for (y = 0; y < height; y++) { + byte *row, *end; + + code = gdev_prn_get_bits(pdev, y, line, &row); + if (code < 0) + break; + end = row + raster; + + for (; row < end; row += 4) { + c_pix += !!row[0]; + m_pix += !!row[1]; + y_pix += !!row[2]; + k_pix += !!row[3]; + ++total_pix; + } + } + + if (pdev->width * height != total_pix) + code = 1; + + gs_free_object(pdev->memory, line, "ink coverage plugin buffer"); + + { + double c = -1., m = -1., y = -1., k = -1.; + if (code == 0) { + c = (double)c_pix / total_pix; + m = (double)m_pix / total_pix; + y = (double)y_pix / total_pix; + k = (double)k_pix / total_pix; + } + + fprintf (file, "%8.5f %8.5f %8.5f %8.5f CMYK %s\n", + c, m, y, k, code ? "ERROR" : "OK"); + } + + return 0; +} + +static const gx_device_procs cov_procs = +{ + gdev_prn_open, + NULL, /* get_initial_matrix */ + NULL, /* sync_output */ + gdev_prn_output_page, + gdev_prn_close, + NULL, /* map_rgb_color */ + cmyk_8bit_map_color_rgb, + NULL, /* fill_rectangle */ + NULL, /* tile_rectangle */ + NULL, /* copy_mono */ + NULL, /* copy_color */ + NULL, /* draw_line */ + NULL, /* get_bits */ + gdev_prn_get_params, + gdev_prn_put_params, + cmyk_8bit_map_cmyk_color, + NULL, /* get_xfont_procs */ + NULL, /* get_xfont_device */ + NULL, /* map_rgb_alpha_color */ + gx_page_device_get_page_device +}; + +const gx_device_printer gs_inkcov_device = prn_device( + cov_procs, "inkcov", + DEFAULT_WIDTH_10THS, DEFAULT_HEIGHT_10THS, + 75, 75, /* dpi */ + 0, 0, 0, 0, /* margins */ + 32, cov_write_page); + diff -Nru ghostscript-9.04~dfsg/base/gdevijs.c ghostscript-9.05~dfsg~20120125/base/gdevijs.c --- ghostscript-9.04~dfsg/base/gdevijs.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevijs.c 2011-11-12 18:29:08.000000000 +0000 @@ -830,6 +830,10 @@ platforms. In that case, this branch should be #ifdef'ed out. */ fd = dup(fileno(ijsdev->file)); + if (fd < 0) { + emprintf(ijsdev->memory, "dup() failed\n"); + return gs_note_error(gs_error_ioerror); + } } /* WARNING: Ghostscript should be run with -dSAFER to stop diff -Nru ghostscript-9.04~dfsg/base/gdevimdi.c ghostscript-9.05~dfsg~20120125/base/gdevimdi.c --- ghostscript-9.04~dfsg/base/gdevimdi.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevimdi.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,410 +0,0 @@ -/* Copyright (C) 1999 Aladdin Enterprises. All rights reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, - modified or distributed except as expressly authorized under the terms - of the license contained in the file LICENSE in this distribution. - - For more information about licensing, please refer to - http://www.ghostscript.com/licensing/. For information on - commercial licensing, go to http://www.artifex.com/licensing/ or - contact Artifex Software, Inc., 101 Lucas Valley Road #110, - San Rafael, CA 94903, U.S.A., +1(415)492-9861. -*/ - -/* $Id$ */ -/* IMDI Device. - * - * This is an RGB contone device, that outputs the raster - * converted to CMYK using CMM API - */ - -/* TODO: this should be configurable */ -#define LINK_ICC_NAME "link.icc" - -#include "errno_.h" -#include "string_.h" - -#include "gserror.h" -#include "gdevprn.h" -#include "gxfrac.h" -#include "gscms.h" -#include "gsicc_cache.h" -#include "gsicc_manage.h" - -#ifndef cmm_gcmmhlink_DEFINED - #define cmm_gcmmhlink_DEFINED - typedef void* gcmmhlink_t; -#endif - -#ifndef cmm_gcmmhprofile_DEFINED - #define cmm_gcmmhprofile_DEFINED - typedef void* gcmmhprofile_t; -#endif -/* - * Set up the device structures and function tables. - */ - -#ifndef X_DPI -# define X_DPI 72 -#endif -#ifndef Y_DPI -# define Y_DPI 72 -#endif - -typedef struct gx_device_imdi_s gx_device_imdi; - -static dev_proc_open_device(imdi_open_device); -static dev_proc_close_device(imdi_close_device); -static dev_proc_print_page(imdi_print_page); - -struct gx_device_imdi_s -{ - gx_device_common; - gx_prn_device_common; - - gcmmhlink_t icc_link; - cmm_profile_t *icc_link_profile; - -}; - -static const gx_device_procs imdi_procs = -{ - imdi_open_device, NULL, NULL, gdev_prn_output_page, imdi_close_device, - gx_default_rgb_map_rgb_color, gx_default_rgb_map_color_rgb, - NULL, NULL, NULL, NULL, NULL, NULL, - gdev_prn_get_params, gdev_prn_put_params, - NULL, NULL, NULL, NULL, gx_page_device_get_page_device -}; - -const gx_device_imdi gs_imdi_device = -{ - prn_device_body(gx_device_imdi, imdi_procs, "imdi", - DEFAULT_WIDTH_10THS, DEFAULT_HEIGHT_10THS, - X_DPI, Y_DPI, - 0, 0, 0, 0, /* Margins */ - 3, 24, 255, 255, 256, 256, imdi_print_page) -}; - -static double incurve(void *ctx, int ch, double val) -{ - return val; -} - -static double outcurve(void *ctx, int ch, double val) -{ - return val; -} - -/* - * Open IMDI device. - * Load ICC device link profile (to map sRGB to FOGRA CMYK). - */ - -static int -imdi_open_device(gx_device *dev) -{ - gx_device_imdi *idev = (gx_device_imdi*)dev; - gsicc_rendering_param_t rendering_params; - - /* Open and read profile */ - - idev->icc_link_profile = gsicc_get_profile_handle_file(LINK_ICC_NAME, - strlen(LINK_ICC_NAME), dev->memory); - - if (idev->icc_link_profile == NULL) - return gs_throw(-1, "Could not create link profile for imdi device"); - - if (idev->icc_link_profile->num_comps != 3) - return gs_throw1(-1, "profile must have 3 input channels. got %d.", - idev->icc_link_profile->num_comps); - if (idev->icc_link_profile->num_comps_out != 4) - return gs_throw1(-1, "profile must have 4 output channels. got %d.", - idev->icc_link_profile->num_comps_out); - - rendering_params.black_point_comp = false; - rendering_params.graphics_type_tag = GS_UNKNOWN_TAG; /* Already rendered */ - rendering_params.rendering_intent = gsPERCEPTUAL; - - idev->icc_link = gscms_get_link(idev->icc_link_profile, - NULL, &rendering_params); - - if (!idev->icc_link) - return gs_throw(-1, "could not create ICC link handle"); - - return gdev_prn_open(dev); - -} - -/* - * Close device and clean up ICC structures. - */ - -static int -imdi_close_device(gx_device *dev) -{ - gx_device_imdi *idev = (gx_device_imdi*)dev; - - gscms_release_link(idev->icc_link); - rc_decrement(idev->icc_link_profile, "imdi_close_device"); - - return gdev_prn_close(dev); -} - -/* - * Output the page raster. - */ - -static int -imdi_print_page(gx_device_printer *pdev, FILE *prn_stream) -{ - gx_device_imdi *idev = (gx_device_imdi*)pdev; - - gsicc_bufferdesc_t input_buff_desc; - gsicc_bufferdesc_t output_buff_desc; - - byte *srcbuffer = 0; - byte *dstbuffer = 0; - FILE *fp[4] = {0}; - - int srcstride; - int dststride; - int srcplanes; - int dstplanes; - - byte *srcdata; - - int code = 0; - int x, y, k; - - int nsame = 0, lsame = 0; - int ndiff = 0, ldiff = 0; - - /* - * Open auxiliary CMYK files. - */ - - fprintf(prn_stream, "P6\n%d %d\n255\n", pdev->width, pdev->height); - - for (k = 0; k < 4; k++) - { - char name[256]; - - sprintf(name, "%s.%c.pgm", pdev->fname, "cmyk"[k]); - - dprintf1("output file: %s\n", name); - - fp[k] = gp_fopen(name, "wb"); - if (!fp[k]) - { - code = gs_throw2(-1, "could not open file: %s (%s)", name, strerror(errno)); - goto cleanup; - } - - fprintf(fp[k], "P5\n%d %d\n255\n", pdev->width, pdev->height); - } - - /* - * Allocate scratch buffers. - */ - - srcplanes = pdev->color_info.num_components; - srcstride = gdev_mem_bytes_per_scan_line((gx_device*)pdev); - srcbuffer = gs_malloc(pdev->memory, srcstride, 1, "imdi_print_page(srcbuffer)"); - if (!srcbuffer) - { - code = gs_throw1(-1, "outofmem: src buffer %d", srcstride); - goto cleanup; - } - - dstplanes = 4; - dststride = dstplanes * pdev->width; - dstbuffer = gs_malloc(pdev->memory, dststride, 1, "imdi_print_page(dstbuffer)"); - if (!dstbuffer) - { - code = gs_throw1(-1, "outofmem: dst buffer %d", dststride); - goto cleanup; - } - - /* - * Extract pixels, convert colors and write data to files. - */ - - for (y = 0; y < pdev->height; y++) - { - gdev_prn_get_bits(pdev, y, srcbuffer, &srcdata); - - /* write rgb to original output file */ - fwrite(srcdata, 1, srcstride, prn_stream); - -#if 1 /* Collect runlengths */ - - { - void *inp[1]; - void *outp[1]; - int sx, ex; - int w = pdev->width; - - sx = ex = 0; - - while (sx < w) - { - inp[0] = srcdata + sx * 3; - outp[0] = dstbuffer + sx * 4; - - while (ex < w && - srcdata[ex * 3 + 0] == srcdata[sx * 3 + 0] && - srcdata[ex * 3 + 1] == srcdata[sx * 3 + 1] && - srcdata[ex * 3 + 2] == srcdata[sx * 3 + 2]) - { - ex ++; - } - - /* same-run */ - if (ex - sx > 1) - { - nsame ++; lsame += ex - sx; - - /* Transform the color */ - gscms_transform_color(idev->icc_link, inp, - outp, 1, NULL); - - for (x = sx + 1; x < ex; x++) - { - dstbuffer[x * 4 + 0] = dstbuffer[sx * 4 + 0]; - dstbuffer[x * 4 + 1] = dstbuffer[sx * 4 + 1]; - dstbuffer[x * 4 + 2] = dstbuffer[sx * 4 + 2]; - dstbuffer[x * 4 + 3] = dstbuffer[sx * 4 + 3]; - } - } - - /* diff-run */ - else - { - ndiff ++; - - while (ex < w && - srcdata[ex * 3 + 0] != srcdata[ex * 3 - 3] && - srcdata[ex * 3 + 1] != srcdata[ex * 3 - 2] && - srcdata[ex * 3 + 2] != srcdata[ex * 3 - 1]) - { - ex ++; - } - - ldiff += ex - sx; - - /* This needs to be done more efficiently */ - - gsicc_init_buffer(&input_buff_desc, 3, 1, - false, false, false, 0, (ex - sx)*3, - 1, ex - sx); - - gsicc_init_buffer(&output_buff_desc, 4, 1, - false, false, false, 0, (ex - sx)*4, - 1, ex - sx); - - gscms_transform_color_buffer(idev->icc_link, &input_buff_desc, - &output_buff_desc, inp, outp); - - } - - sx = ex; - } - } - -#endif - -#if 0 /* Call IMDI for entire scanline */ - void *inp[1]; - void *outp[1]; - - inp[0] = srcdata; - outp[0] = dstbuffer; - - gsicc_init_buffer(&input_buff_desc, 3, 1, - false, false, false, 0, width*3, - 1, width); - - gsicc_init_buffer(&output_buff_desc, 4, 1, - false, false, false, 0, width*4, - 1, width); - - gscms_transform_color_buffer(idev->icc_link, &input_buff_desc, - &output_buff_desc, inp, outp); - -#if 0 - /* output planar data to auxiliary output files */ - for (x = 0; x < pdev->width; x++) - for (k = 0; k < 4; k++) - putc(dstbuffer[x * 4 + k], fp[k]); -#endif -#endif - -#if 0 /* Call IMDI for every pixel */ - for (x = 0; x < pdev->width; x++) - { - void *inp[1]; - void *outp[1]; - - inp[0] = srcdata + x * 3; - outp[0] = dstbuffer + x * 4; - - /* Transform the color */ - gscms_transform_color(idev->icc_link, inp, - outp, 1, NULL); - - /* output planar data to auxiliary output files */ - for (k = 0; k < 4; k++) - putc(dstbuffer[x * 4 + k], fp[k]); - } -#endif - -#if 0 /* Slow but accurate every pixel */ - - for (x = 0; x < pdev->width; x++) - { - srcpixel[0] = srcdata[x * 3 + 0] / 255.0; - srcpixel[1] = srcdata[x * 3 + 1] / 255.0; - srcpixel[2] = srcdata[x * 3 + 2] / 255.0; - - code = idev->luo->lookup(idev->luo, dstpixel, srcpixel); - if (code > 1) - { - code = gs_throw1(-1, "icc lookup failed: %s", idev->icco->err); - goto cleanup; - } - - dstbuffer[x * 4 + 0] = dstpixel[0] * 255 + 0.5; - dstbuffer[x * 4 + 1] = dstpixel[1] * 255 + 0.5; - dstbuffer[x * 4 + 2] = dstpixel[2] * 255 + 0.5; - dstbuffer[x * 4 + 3] = dstpixel[3] * 255 + 0.5; - - /* output planar data to auxiliary output files */ - for (k = 0; k < 4; k++) - putc(dstbuffer[x * 4 + k], fp[k]); - } -#endif - } - - dprintf4("same=%d/%d diff=%d/%d\n", lsame, nsame, ldiff, ndiff); - - /* - * Cleanup memory and files. - */ - -cleanup: - - for (k = 0; k < 4; k++) - if (fp[k]) - fclose(fp[k]); - - if (dstbuffer) - gs_free(pdev->memory, dstbuffer, dststride, 1, "imdi_print_page(dstbuffer)"); - - if (srcbuffer) - gs_free(pdev->memory, srcbuffer, srcstride, 1, "imdi_print_page(srcbuffer)"); - - return code; -} diff -Nru ghostscript-9.04~dfsg/base/gdevjbig2.c ghostscript-9.05~dfsg~20120125/base/gdevjbig2.c --- ghostscript-9.04~dfsg/base/gdevjbig2.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevjbig2.c 2011-11-12 18:29:08.000000000 +0000 @@ -72,13 +72,13 @@ } /* Create the jbig2encode state. */ s_init_state((stream_state *)&state, &s_jbig2encode_template, 0); - if (state.template->set_defaults) - (*state.template->set_defaults) ((stream_state *) & state); + if (state.templat->set_defaults) + (*state.templat->set_defaults) ((stream_state *) & state); state.width = jdev->width; state.height = jdev->height; /* Set up the streams. */ - fbuf_size = max(512 /* arbitrary */ , state.template->min_out_size); - jbuf_size = state.template->min_in_size; + fbuf_size = max(512 /* arbitrary */ , state.templat->min_out_size); + jbuf_size = state.templat->min_in_size; if ((fbuf = gs_alloc_bytes(mem, fbuf_size, "jbig2_print_page(fbuf)")) == 0 || (jbuf = gs_alloc_bytes(mem, jbuf_size, "jbig2_print_page(jbuf)")) == 0 ) { @@ -91,10 +91,10 @@ s_std_init(&cstrm, jbuf, jbuf_size, &s_filter_write_procs, s_mode_write); cstrm.state = (stream_state *) & state; - cstrm.procs.process = state.template->process; + cstrm.procs.process = state.templat->process; cstrm.strm = &fstrm; - if (state.template->init) - (*state.template->init) (cstrm.state); + if (state.templat->init) + (*state.templat->init) (cstrm.state); /* Copy the data to the output. */ for (lnum = 0; lnum < jdev->height; ++lnum) { diff -Nru ghostscript-9.04~dfsg/base/gdevjpeg.c ghostscript-9.05~dfsg~20120125/base/gdevjpeg.c --- ghostscript-9.04~dfsg/base/gdevjpeg.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevjpeg.c 2011-12-08 09:35:23.000000000 +0000 @@ -421,11 +421,11 @@ goto fail; } /* Create the DCT encoder state. */ - jcdp->template = s_DCTE_template; - s_init_state((stream_state *)&state, &jcdp->template, 0); - if (state.template->set_defaults) { + jcdp->templat = s_DCTE_template; + s_init_state((stream_state *)&state, &jcdp->templat, 0); + if (state.templat->set_defaults) { state.memory = mem; - (*state.template->set_defaults) ((stream_state *) & state); + (*state.templat->set_defaults) ((stream_state *) & state); state.memory = NULL; } state.QFactor = 1.0; /* disable quality adjustment in zfdcte.c */ @@ -436,6 +436,14 @@ state.Markers.data = 0; state.Markers.size = 0; state.data.compress = jcdp; + /* Add in ICC profile */ + state.icc_profile = NULL; /* In case it is not set here */ + if (pdev->icc_struct != NULL && pdev->icc_struct->device_profile[0] != NULL) { + cmm_profile_t *icc_profile = pdev->icc_struct->device_profile[0]; + if (icc_profile->num_comps == pdev->color_info.num_components) { + state.icc_profile = icc_profile; + } + } jcdp->memory = state.jpeg_memory = mem; if ((code = gs_jpeg_create_compress(&state)) < 0) goto fail; @@ -478,15 +486,15 @@ /* Make sure we get at least a full scan line of input. */ state.scan_line_size = jcdp->cinfo.input_components * jcdp->cinfo.image_width; - jcdp->template.min_in_size = + jcdp->templat.min_in_size = max(s_DCTE_template.min_in_size, state.scan_line_size); /* Make sure we can write the user markers in a single go. */ - jcdp->template.min_out_size = + jcdp->templat.min_out_size = max(s_DCTE_template.min_out_size, state.Markers.size); /* Set up the streams. */ - fbuf_size = max(512 /* arbitrary */ , jcdp->template.min_out_size); - jbuf_size = jcdp->template.min_in_size; + fbuf_size = max(512 /* arbitrary */ , jcdp->templat.min_out_size); + jbuf_size = jcdp->templat.min_in_size; if ((fbuf = gs_alloc_bytes(mem, fbuf_size, "jpeg_print_page(fbuf)")) == 0 || (jbuf = gs_alloc_bytes(mem, jbuf_size, "jpeg_print_page(jbuf)")) == 0 ) { @@ -499,10 +507,10 @@ s_std_init(&jstrm, jbuf, jbuf_size, &s_filter_write_procs, s_mode_write); jstrm.state = (stream_state *) & state; - jstrm.procs.process = state.template->process; + jstrm.procs.process = state.templat->process; jstrm.strm = &fstrm; - if (state.template->init) - (*state.template->init) (jstrm.state); + if (state.templat->init) + (*state.templat->init) (jstrm.state); /* Copy the data to the output. */ for (lnum = 0; lnum < pdev->height; ++lnum) { @@ -534,3 +542,4 @@ gs_free_object(mem, in, "jpeg_print_page(in)"); return code; } + diff -Nru ghostscript-9.04~dfsg/base/gdevjpx.c ghostscript-9.05~dfsg~20120125/base/gdevjpx.c --- ghostscript-9.04~dfsg/base/gdevjpx.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevjpx.c 2011-11-12 18:29:08.000000000 +0000 @@ -154,8 +154,8 @@ } /* Create the jpx encoder state. */ s_init_state((stream_state *)&state, &s_jpxe_template, 0); - if (state.template->set_defaults) - (*state.template->set_defaults) ((stream_state *) & state); + if (state.templat->set_defaults) + (*state.templat->set_defaults) ((stream_state *) & state); state.width = jdev->width; state.height = jdev->height; switch (jdev->color_info.depth) { @@ -175,8 +175,8 @@ /* state.quality = 35; */ /* Set up the streams. */ - fbuf_size = max(512 /* arbitrary */ , state.template->min_out_size); - jbuf_size = state.template->min_in_size; + fbuf_size = max(512 /* arbitrary */ , state.templat->min_out_size); + jbuf_size = state.templat->min_in_size; if ((fbuf = gs_alloc_bytes(mem, fbuf_size, "jpx_print_page(fbuf)")) == 0 || (jbuf = gs_alloc_bytes(mem, jbuf_size, "jpx_print_page(jbuf)")) == 0 ) { @@ -189,10 +189,10 @@ s_std_init(&cstrm, jbuf, jbuf_size, &s_filter_write_procs, s_mode_write); cstrm.state = (stream_state *) & state; - cstrm.procs.process = state.template->process; + cstrm.procs.process = state.templat->process; cstrm.strm = &fstrm; - if (state.template->init) - (*state.template->init) (cstrm.state); + if (state.templat->init) + (*state.templat->init) (cstrm.state); /* Copy the data to the output. */ for (lnum = 0; lnum < jdev->height; ++lnum) { diff -Nru ghostscript-9.04~dfsg/base/gdevm1.c ghostscript-9.05~dfsg~20120125/base/gdevm1.c --- ghostscript-9.04~dfsg/base/gdevm1.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevm1.c 2011-09-29 11:01:33.000000000 +0000 @@ -13,6 +13,7 @@ /* $Id$ */ /* Monobit "memory" (stored bitmap) device */ #include "memory_.h" +#include "gserrors.h" #include "gx.h" #include "gxdevice.h" #include "gxdevmem.h" /* semi-public definitions */ diff -Nru ghostscript-9.04~dfsg/base/gdevmem.c ghostscript-9.05~dfsg~20120125/base/gdevmem.c --- ghostscript-9.04~dfsg/base/gdevmem.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevmem.c 2011-11-12 18:29:08.000000000 +0000 @@ -45,10 +45,14 @@ byte *base_old = mptr->base; long reloc; int y; + int h = mptr->height; + + if (mptr->num_planes > 0) + h *= mptr->num_planes; RELOC_PTR(gx_device_memory, base); reloc = base_old - mptr->base; - for (y = 0; y < mptr->height; y++) + for (y = 0; y < h; y++) mptr->line_ptrs[y] -= reloc; /* Relocate line_ptrs, which also points into the data area. */ mptr->line_ptrs = (byte **) ((byte *) mptr->line_ptrs - reloc); @@ -375,7 +379,7 @@ * processing the file. */ max_height = size / (bitmap_raster(width - * dev->color_info.depth + ESTIMATED_PDF14_ROW_SPACE(width)) + * dev->color_info.depth + ESTIMATED_PDF14_ROW_SPACE(width, dev->color_info.num_components)) + sizeof(byte *) * max(dev->num_planes, 1)); height = (int)min(max_height, max_int); } else { @@ -446,7 +450,7 @@ gdev_mem_bits_size(mdev, mdev->width, mdev->height, &size); mdev->line_ptrs = (byte **)(mdev->base + size); } - mdev->raster = gdev_mem_raster(mdev); + mdev->raster = gdev_mem_raster(mdev); /* RJW: Wrong for planar */ return gdev_mem_set_line_ptrs(mdev, NULL, 0, NULL, setup_height); } /* diff -Nru ghostscript-9.04~dfsg/base/gdevmem.h ghostscript-9.05~dfsg~20120125/base/gdevmem.h --- ghostscript-9.04~dfsg/base/gdevmem.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevmem.h 2011-11-21 08:55:19.000000000 +0000 @@ -97,8 +97,9 @@ /* The following are used for the non-true-color devices. */ dev_proc_map_rgb_color(mem_mapped_map_rgb_color); dev_proc_map_color_rgb(mem_mapped_map_color_rgb); -/* Default implementation */ +/* Default implementations */ dev_proc_strip_copy_rop(mem_default_strip_copy_rop); +dev_proc_strip_copy_rop2(mem_default_strip_copy_rop2); /* * Macro for generating the device descriptor. diff -Nru ghostscript-9.04~dfsg/base/gdevmpla.c ghostscript-9.05~dfsg~20120125/base/gdevmpla.c --- ghostscript-9.04~dfsg/base/gdevmpla.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevmpla.c 2011-11-21 08:55:19.000000000 +0000 @@ -28,11 +28,16 @@ declare_mem_procs(mem_planar_copy_mono, mem_planar_copy_color, mem_planar_fill_rectangle); static dev_proc_copy_color(mem_planar_copy_color_24to8); static dev_proc_copy_color(mem_planar_copy_color_4to1); -static dev_proc_copy_plane(mem_planar_copy_plane); +static dev_proc_copy_planes(mem_planar_copy_planes); static dev_proc_strip_tile_rectangle(mem_planar_strip_tile_rectangle); static dev_proc_strip_copy_rop(mem_planar_strip_copy_rop); +static dev_proc_strip_copy_rop2(mem_planar_strip_copy_rop2); static dev_proc_get_bits_rectangle(mem_planar_get_bits_rectangle); +/* It's a bit nasty to have to fork the planar dev_spec_op like this, but + * the forwarding nature of the device means that the function pointer test + * for the map_cmyk_color call fails if we let it fall through to the + * default device. */ static int mem_planar_dev_spec_op(gx_device *pdev, int dev_spec_op, void *data, int size) @@ -42,6 +47,17 @@ return gx_default_dev_spec_op(pdev, dev_spec_op, data, size); } +static int +mem_planar_dev_spec_op_cmyk4(gx_device *pdev, int dev_spec_op, + void *data, int size) +{ + if (dev_spec_op == gxdso_is_native_planar) + return 1; + if (dev_spec_op == gxdso_is_std_cmyk_1bit) + return 1; + return gx_default_dev_spec_op(pdev, dev_spec_op, data, size); +} + /* * Set up a planar memory device, after calling gs_make_mem_device but * before opening the device. The pre-existing device provides the color @@ -95,10 +111,12 @@ set_dev_proc(mdev, copy_alpha, dev_proc(mdproto, copy_alpha)); set_dev_proc(mdev, strip_tile_rectangle, dev_proc(mdproto, strip_tile_rectangle)); set_dev_proc(mdev, strip_copy_rop, dev_proc(mdproto, strip_copy_rop)); + set_dev_proc(mdev, strip_copy_rop2, dev_proc(mdproto, strip_copy_rop2)); set_dev_proc(mdev, get_bits_rectangle, dev_proc(mdproto, get_bits_rectangle)); } else { set_dev_proc(mdev, fill_rectangle, mem_planar_fill_rectangle); set_dev_proc(mdev, copy_mono, mem_planar_copy_mono); + set_dev_proc(mdev, dev_spec_op, mem_planar_dev_spec_op); if ((mdev->color_info.depth == 24) && (mdev->num_planes == 3) && (mdev->planes[0].depth == 8) && (mdev->planes[0].shift == 16) && @@ -110,16 +128,17 @@ (mdev->planes[0].depth == 1) && (mdev->planes[0].shift == 3) && (mdev->planes[1].depth == 1) && (mdev->planes[1].shift == 2) && (mdev->planes[2].depth == 1) && (mdev->planes[2].shift == 1) && - (mdev->planes[3].depth == 1) && (mdev->planes[3].shift == 0)) + (mdev->planes[3].depth == 1) && (mdev->planes[3].shift == 0)) { set_dev_proc(mdev, copy_color, mem_planar_copy_color_4to1); - else + set_dev_proc(mdev, dev_spec_op, mem_planar_dev_spec_op_cmyk4); + } else set_dev_proc(mdev, copy_color, mem_planar_copy_color); set_dev_proc(mdev, copy_alpha, gx_default_copy_alpha); - set_dev_proc(mdev, copy_plane, mem_planar_copy_plane); + set_dev_proc(mdev, copy_planes, mem_planar_copy_planes); set_dev_proc(mdev, strip_tile_rectangle, mem_planar_strip_tile_rectangle); set_dev_proc(mdev, strip_copy_rop, mem_planar_strip_copy_rop); + set_dev_proc(mdev, strip_copy_rop2, mem_planar_strip_copy_rop2); set_dev_proc(mdev, get_bits_rectangle, mem_planar_get_bits_rectangle); - set_dev_proc(mdev, dev_spec_op, mem_planar_dev_spec_op); } return 0; } @@ -152,11 +171,16 @@ msp.line_ptrs = mdev->line_ptrs) /* Previous versions of MEM_SET_PARAMS calculated raster as * bitmap_raster(mdev->width * plane_depth), but this restricts us to - * non interleaved frame buffers. */ + * non interleaved frame buffers. Now we calculate it from the difference + * between the first 2 line pointers; this clearly only works if there are + * at least 2 line pointers to use. Otherwise, we fall back to the old + * method. + */ +/* FIXME: Find a nicer way of calculating raster. */ #define MEM_SET_PARAMS(mdev, plane_depth)\ (mdev->color_info.depth = plane_depth, /* maybe not needed */\ mdev->base = mdev->line_ptrs[0],\ - mdev->raster = mdev->line_ptrs[1]-mdev->line_ptrs[0]) + mdev->raster = (mdev->height > 1 ? mdev->line_ptrs[1]-mdev->line_ptrs[0] : bitmap_raster(mdev->width * plane_depth))) #define MEM_RESTORE_PARAMS(mdev, msp)\ (mdev->color_info.depth = msp.depth,\ mdev->base = msp.base,\ @@ -297,6 +321,13 @@ } /* Copy color: Special case the 4 -> 1+1+1+1 case. */ +/* Two versions of this routine; the first does bit comparisons. This should + * work well on architectures with small cache and conditional execution + * (such as ARM). Hurts on x86 due to the ifs in the loop all causing small + * skips ahead that defeat the branch predictor. + * Second version uses a table lookup; 1K of table is nothing on x86, and + * so this runs much faster. */ +#ifdef PREFER_ALTERNATIION_TO_TABLES static int mem_planar_copy_color_4to1(gx_device * dev, const byte * base, int sourcex, int sraster, gx_bitmap_id id, @@ -314,6 +345,14 @@ uint plane_raster = bitmap_raster(w); int br, bw, bh, cx, cy, cw, ch, ix, iy; +#ifdef MEMENTO + /* Pacify valgrind */ + memset(buf0.l, 0, sizeof(ulong) * BUF_LONGS); + memset(buf1.l, 0, sizeof(ulong) * BUF_LONGS); + memset(buf2.l, 0, sizeof(ulong) * BUF_LONGS); + memset(buf3.l, 0, sizeof(ulong) * BUF_LONGS); +#endif + fit_copy(dev, base, sourcex, sraster, id, x, y, w, h); MEM_SAVE_PARAMS(mdev, save); MEM_SET_PARAMS(mdev, 1); @@ -470,6 +509,208 @@ MEM_RESTORE_PARAMS(mdev, save); return 0; } +#else + +static bits32 expand_4to1[256] = +{ +0x00000000,0x00000001,0x00000100,0x00000101, +0x00010000,0x00010001,0x00010100,0x00010101, +0x01000000,0x01000001,0x01000100,0x01000101, +0x01010000,0x01010001,0x01010100,0x01010101, +0x00000002,0x00000003,0x00000102,0x00000103, +0x00010002,0x00010003,0x00010102,0x00010103, +0x01000002,0x01000003,0x01000102,0x01000103, +0x01010002,0x01010003,0x01010102,0x01010103, +0x00000200,0x00000201,0x00000300,0x00000301, +0x00010200,0x00010201,0x00010300,0x00010301, +0x01000200,0x01000201,0x01000300,0x01000301, +0x01010200,0x01010201,0x01010300,0x01010301, +0x00000202,0x00000203,0x00000302,0x00000303, +0x00010202,0x00010203,0x00010302,0x00010303, +0x01000202,0x01000203,0x01000302,0x01000303, +0x01010202,0x01010203,0x01010302,0x01010303, +0x00020000,0x00020001,0x00020100,0x00020101, +0x00030000,0x00030001,0x00030100,0x00030101, +0x01020000,0x01020001,0x01020100,0x01020101, +0x01030000,0x01030001,0x01030100,0x01030101, +0x00020002,0x00020003,0x00020102,0x00020103, +0x00030002,0x00030003,0x00030102,0x00030103, +0x01020002,0x01020003,0x01020102,0x01020103, +0x01030002,0x01030003,0x01030102,0x01030103, +0x00020200,0x00020201,0x00020300,0x00020301, +0x00030200,0x00030201,0x00030300,0x00030301, +0x01020200,0x01020201,0x01020300,0x01020301, +0x01030200,0x01030201,0x01030300,0x01030301, +0x00020202,0x00020203,0x00020302,0x00020303, +0x00030202,0x00030203,0x00030302,0x00030303, +0x01020202,0x01020203,0x01020302,0x01020303, +0x01030202,0x01030203,0x01030302,0x01030303, +0x02000000,0x02000001,0x02000100,0x02000101, +0x02010000,0x02010001,0x02010100,0x02010101, +0x03000000,0x03000001,0x03000100,0x03000101, +0x03010000,0x03010001,0x03010100,0x03010101, +0x02000002,0x02000003,0x02000102,0x02000103, +0x02010002,0x02010003,0x02010102,0x02010103, +0x03000002,0x03000003,0x03000102,0x03000103, +0x03010002,0x03010003,0x03010102,0x03010103, +0x02000200,0x02000201,0x02000300,0x02000301, +0x02010200,0x02010201,0x02010300,0x02010301, +0x03000200,0x03000201,0x03000300,0x03000301, +0x03010200,0x03010201,0x03010300,0x03010301, +0x02000202,0x02000203,0x02000302,0x02000303, +0x02010202,0x02010203,0x02010302,0x02010303, +0x03000202,0x03000203,0x03000302,0x03000303, +0x03010202,0x03010203,0x03010302,0x03010303, +0x02020000,0x02020001,0x02020100,0x02020101, +0x02030000,0x02030001,0x02030100,0x02030101, +0x03020000,0x03020001,0x03020100,0x03020101, +0x03030000,0x03030001,0x03030100,0x03030101, +0x02020002,0x02020003,0x02020102,0x02020103, +0x02030002,0x02030003,0x02030102,0x02030103, +0x03020002,0x03020003,0x03020102,0x03020103, +0x03030002,0x03030003,0x03030102,0x03030103, +0x02020200,0x02020201,0x02020300,0x02020301, +0x02030200,0x02030201,0x02030300,0x02030301, +0x03020200,0x03020201,0x03020300,0x03020301, +0x03030200,0x03030201,0x03030300,0x03030301, +0x02020202,0x02020203,0x02020302,0x02020303, +0x02030202,0x02030203,0x02030302,0x02030303, +0x03020202,0x03020203,0x03020302,0x03020303, +0x03030202,0x03030203,0x03030302,0x03030303 +}; + +static int +mem_planar_copy_color_4to1(gx_device * dev, const byte * base, int sourcex, + int sraster, gx_bitmap_id id, + int x, int y, int w, int h) +{ + gx_device_memory * const mdev = (gx_device_memory *)dev; +#define BUF_LONGS 100 /* arbitrary, >= 1 */ +#define BUF_BYTES (BUF_LONGS * ARCH_SIZEOF_LONG) + union b_ { + ulong l[BUF_LONGS]; + byte b[BUF_BYTES]; + } buf0, buf1, buf2, buf3; + mem_save_params_t save; + const gx_device_memory *mdproto = gdev_mem_device_for_bits(1); + uint plane_raster = bitmap_raster(w); + int br, bw, bh, cx, cy, cw, ch, ix, iy; + + fit_copy(dev, base, sourcex, sraster, id, x, y, w, h); + MEM_SAVE_PARAMS(mdev, save); + MEM_SET_PARAMS(mdev, 1); + if (plane_raster > BUF_BYTES) { + br = BUF_BYTES; + bw = BUF_BYTES<<3; + bh = 1; + } else { + br = plane_raster; + bw = w; + bh = BUF_BYTES / plane_raster; + } + for (cy = y; cy < y + h; cy += ch) { + ch = min(bh, y + h - cy); + for (cx = x; cx < x + w; cx += cw) { + int sx = sourcex + cx - x; + const byte *source_base = base + sraster * (cy - y) + (sx>>1); + + cw = min(bw, x + w - cx); + if ((sx & 1) == 0) { + for (iy = 0; iy < ch; ++iy) { + const byte *sptr = source_base; + byte *dptr0 = buf0.b + br * iy; + byte *dptr1 = buf1.b + br * iy; + byte *dptr2 = buf2.b + br * iy; + byte *dptr3 = buf3.b + br * iy; + int roll = 6; + int cmyk = 0; + ix = cw; + do { + cmyk |= expand_4to1[*sptr++]<>24; + *dptr1++ = cmyk>>16; + *dptr2++ = cmyk>>8; + *dptr3++ = cmyk; + cmyk = 0; + roll = 6; + } + ix -= 2; + } while (ix > 0); + if (roll != 6) { + *dptr0++ = cmyk>>24; + *dptr1++ = cmyk>>16; + *dptr2++ = cmyk>>8; + *dptr3++ = cmyk; + } + source_base += sraster; + } + } else { + for (iy = 0; iy < ch; ++iy) { + const byte *sptr = source_base; + byte *dptr0 = buf0.b + br * iy; + byte *dptr1 = buf1.b + br * iy; + byte *dptr2 = buf2.b + br * iy; + byte *dptr3 = buf3.b + br * iy; + int roll = 7; + int cmyk = 0; + byte b = *sptr++ & 0x0f; + ix = cw; + goto loop_entry; + do { + b = *sptr++; + roll -= 2; + if (roll < 0) + { + cmyk |= expand_4to1[b & 0xf0]>>1; + *dptr0++ = cmyk>>24; + *dptr1++ = cmyk>>16; + *dptr2++ = cmyk>>8; + *dptr3++ = cmyk; + cmyk = 0; + roll = 7; + b &= 0x0f; + } +loop_entry: + cmyk |= expand_4to1[b]<= 0); /* ix == -2 means 1 extra done */ + if ((ix == -2) && (roll == 7)) { + /* We did an extra one, and it was the last thing + * we did. Nothing to store. */ + } else { + /* Flush the stored bytes */ + *dptr0++ = cmyk>>24; + *dptr1++ = cmyk>>16; + *dptr2++ = cmyk>>8; + *dptr3++ = cmyk; + } + source_base += sraster; + } + } + dev_proc(mdproto, copy_mono) + (dev, buf0.b, 0, br, gx_no_bitmap_id, cx, cy, cw, ch, + (gx_color_index)0, (gx_color_index)1); + mdev->line_ptrs += mdev->height; + dev_proc(mdproto, copy_mono) + (dev, buf1.b, 0, br, gx_no_bitmap_id, cx, cy, cw, ch, + (gx_color_index)0, (gx_color_index)1); + mdev->line_ptrs += mdev->height; + dev_proc(mdproto, copy_mono) + (dev, buf2.b, 0, br, gx_no_bitmap_id, cx, cy, cw, ch, + (gx_color_index)0, (gx_color_index)1); + mdev->line_ptrs += mdev->height; + dev_proc(mdproto, copy_mono) + (dev, buf3.b, 0, br, gx_no_bitmap_id, cx, cy, cw, ch, + (gx_color_index)0, (gx_color_index)1); + mdev->line_ptrs -= 3*mdev->height; + } + } + MEM_RESTORE_PARAMS(mdev, save); + return 0; +} +#endif /* Copy a color bitmap. */ /* This is slow and messy. */ @@ -577,30 +818,33 @@ /* Copy a given bitmap into a bitmap. */ static int -mem_planar_copy_plane(gx_device * dev, const byte * base, int sourcex, - int sraster, gx_bitmap_id id, - int x, int y, int w, int h, int plane) +mem_planar_copy_planes(gx_device * dev, const byte * base, int sourcex, + int sraster, gx_bitmap_id id, + int x, int y, int w, int h, int plane_height) { gx_device_memory * const mdev = (gx_device_memory *)dev; int plane_depth; mem_save_params_t save; const gx_device_memory *mdproto; - int code; + int code = 0; + int plane; - if ((plane < 0) || (plane >= mdev->num_planes)) - return gs_error_rangecheck; MEM_SAVE_PARAMS(mdev, save); - mdev->line_ptrs += mdev->height * plane; - plane_depth = mdev->planes[plane].depth; - mdproto = gdev_mem_device_for_bits(plane_depth); - if (plane_depth == 1) - code = dev_proc(mdproto, copy_mono)(dev, base, sourcex, sraster, id, - x, y, w, h, - (gx_color_index)0, - (gx_color_index)1); - else - code = dev_proc(mdproto, copy_color)(dev, base, sourcex, sraster, - id, x, y, w, h); + for (plane = 0; plane < mdev->num_planes; plane++) + { + plane_depth = mdev->planes[plane].depth; + mdproto = gdev_mem_device_for_bits(plane_depth); + if (plane_depth == 1) + code = dev_proc(mdproto, copy_mono)(dev, base, sourcex, sraster, id, + x, y, w, h, + (gx_color_index)0, + (gx_color_index)1); + else + code = dev_proc(mdproto, copy_color)(dev, base, sourcex, sraster, + id, x, y, w, h); + base += sraster * plane_height; + mdev->line_ptrs += mdev->height; + } MEM_RESTORE_PARAMS(mdev, save); return code; } @@ -653,43 +897,643 @@ } static int -mem_planar_strip_copy_rop(gx_device * dev, - const byte * sdata, int sourcex, uint sraster, - gx_bitmap_id id, const gx_color_index * scolors, - const gx_strip_bitmap * textures, - const gx_color_index * tcolors, - int x, int y, int width, int height, - int phase_x, int phase_y, - gs_logical_operation_t lop) +planar_cmyk4bit_strip_copy_rop(gx_device_memory * mdev, + const byte * srow, int sourcex, uint sraster, + gx_bitmap_id id, const gx_color_index * scolors, + const gx_strip_bitmap * textures, + const gx_color_index * tcolors, + int x, int y, int width, int height, + int phase_x, int phase_y, + gs_logical_operation_t lop) +{ + gs_rop3_t rop = (gs_rop3_t)lop; + uint draster = mdev->raster; + int line_count; + byte *cdrow, *mdrow, *ydrow, *kdrow; + byte lmask, rmask; + rop_proc cproc, mproc, yproc; + int dbit; + int cscolor, mscolor, yscolor, kscolor; + int ctcolor, mtcolor, ytcolor, ktcolor; + int constant_s = 0; + + /* Modify the raster operation according to the source palette. */ + fit_copy(mdev, srow, sourcex, sraster, id, x, y, width, height); + + /* This function assumes constant (or unused) scolors and tcolors */ + if (scolors) + { + if (scolors[0] == scolors[1]) { + kscolor = ((scolors[0] & 1) ? -1 : 0); + cscolor = ((scolors[0] & 8) ? -1 : 0) | kscolor; + mscolor = ((scolors[0] & 4) ? -1 : 0) | kscolor; + yscolor = ((scolors[0] & 2) ? -1 : 0) | kscolor; + constant_s = 1; + } else { + kscolor = (scolors[0] & 1) | ((scolors[1] & 1)<<1); + cscolor = ((scolors[0] & 8)>>3) | ((scolors[1] & 8)>>2) | kscolor; + mscolor = ((scolors[0] & 4)>>2) | ((scolors[1] & 4)>>1) | kscolor; + yscolor = ((scolors[0] & 2)>>1) | (scolors[1] & 2) | kscolor; + switch (cscolor) { + case 0: + cproc = rop_proc_table[rop3_know_S_0(rop)]; + break; + case 1: + cproc = rop_proc_table[rop3_invert_S(rop)]; + break; + case 2: + cproc = rop_proc_table[rop]; + break; + default: /* 3 */ + cproc = rop_proc_table[rop3_know_S_1(rop)]; + break; + } + switch (mscolor) { + case 0: + mproc = rop_proc_table[rop3_know_S_0(rop)]; + break; + case 1: + mproc = rop_proc_table[rop3_invert_S(rop)]; + break; + case 2: + mproc = rop_proc_table[rop]; + break; + default: /* 3 */ + mproc = rop_proc_table[rop3_know_S_1(rop)]; + break; + } + switch (yscolor) { + case 0: + yproc = rop_proc_table[rop3_know_S_0(rop)]; + break; + case 1: + yproc = rop_proc_table[rop3_invert_S(rop)]; + break; + case 2: + yproc = rop_proc_table[rop]; + break; + default: /* 3 */ + yproc = rop_proc_table[rop3_know_S_1(rop)]; + break; + } + } + } + if (tcolors) + { + ktcolor = ((tcolors[0] & 1) ? -1 : 0); + ctcolor = ((tcolors[0] & 8) ? -1 : 0) | ktcolor; + mtcolor = ((tcolors[0] & 4) ? -1 : 0) | ktcolor; + ytcolor = ((tcolors[0] & 2) ? -1 : 0) | ktcolor; + } + + /* Set up transfer parameters. */ + line_count = height; + if (lop_uses_T(lop) && (tcolors == NULL)) { /* && (textures != NULL) */ + /* Pixmap textures. For now we'll only get into this routine if + * textures is a pixmap (or constant, in which case we'll do it + * below). */ + int ty; + uint traster; + +/* Calculate the X offset for a given Y value, */ +/* taking shift into account if necessary. */ +#define x_offset(px, ty, textures)\ + ((textures)->shift == 0 ? (px) :\ + (px) + (ty) / (textures)->rep_height * (textures)->rep_shift) + + cdrow = scan_line_base(mdev, y); + mdrow = cdrow + mdev->height * draster; + ydrow = mdrow + mdev->height * draster; + kdrow = ydrow + mdev->height * draster; + traster = (textures ? textures->raster : 0); + ty = y + phase_y; + for (; line_count-- > 0; cdrow += draster, mdrow += draster, ydrow += draster, kdrow += draster, srow += sraster, ++ty) { + int sx = sourcex; + int dx = x; + int w = width; + const byte *trow = textures->data + (ty % textures->rep_height) * traster; + int xoff = x_offset(phase_x, ty, textures); + int nw; + int tx = (dx + xoff) % textures->rep_width; + + /* Loop over (horizontal) copies of the tile. */ + for (; w > 0; sx += nw, dx += nw, w -= nw, tx = 0) { + /* sptr and tptr point to bytes of cmykcmyk. Need to convert + * these to planar format. */ + int dbit = dx & 7; + int tbit = tx & 1; + int tskew = tbit - dbit; /* -7 >= tskew >= 1 */ + int left = (nw = min(w, textures->size.x - tx))-8+dbit; + int sbit = sx & 1; + int sskew = sbit - dbit; /* -7 >= sskew >= 1 */ + byte lmask = 0xff >> dbit; + byte rmask = 0xff << (~(dbit + nw - 1) & 7); + byte *cdptr = cdrow + (dx>>3); + byte *mdptr = mdrow + (dx>>3); + byte *ydptr = ydrow + (dx>>3); + byte *kdptr = kdrow + (dx>>3); + const byte *tptr = trow; + const rop_proc proc = rop_proc_table[rop]; + const byte *sptr = srow; + sptr += (sskew>>1); /* Backtrack sptr if required. */ + sptr += (sx>>1); + tptr += (tskew>>1); /* Backtrack tptr if required. */ + tptr += (tx>>1); + if (left < 0) + lmask &= rmask; + { + /* Left hand bytes */ + byte kdbyte = *kdptr; + byte cdbyte = *cdptr; + byte mdbyte = *mdptr; + byte ydbyte = *ydptr; + byte cresult, mresult, yresult, kresult; + bits32 scol = 0, tcol = 0; + if ((sskew & 1) == 0) { + if (sskew >= 0) + scol = expand_4to1[sptr[0]]<<6; + if ((sskew >= -2) && (left > -6)) + scol |= expand_4to1[sptr[1]]<<4; + if ((sskew >= -4) && (left > -4)) + scol |= expand_4to1[sptr[2]]<<2; + if (left > -2) + scol |= expand_4to1[sptr[3]]; + } else { + if (sskew >= 0) + scol = expand_4to1[sptr[0] & 0x0f]<<7; + if ((sskew >= -2) && (left > -7)) + scol |= expand_4to1[sptr[1]]<<5; + if ((sskew >= -4) && (left > -5)) + scol |= expand_4to1[sptr[2]]<<3; + if ((sskew >= -6) && (left > -3)) + scol |= expand_4to1[sptr[3]]<<1; + if (left > -1) + scol |= expand_4to1[sptr[4] & 0xf0]>>1; + } + if ((tskew & 1) == 0) { + if (tskew >= 0) + tcol = expand_4to1[tptr[0]]<<6; + if ((tskew >= -2) && (left > -6)) + tcol |= expand_4to1[tptr[1]]<<4; + if ((tskew >= -4) && (left > -4)) + tcol |= expand_4to1[tptr[2]]<<2; + if (left > -2) + tcol |= expand_4to1[tptr[3]]; + } else { + if (tskew >= 0) + tcol = expand_4to1[tptr[0] & 0x0f]<<7; + if ((tskew >= -2) && (left > -7)) + tcol |= expand_4to1[tptr[1]]<<5; + if ((tskew >= -4) && (left > -5)) + tcol |= expand_4to1[tptr[2]]<<3; + if ((tskew >= -6) && (left > -3)) + tcol |= expand_4to1[tptr[3]]<<1; + if (left > -1) + tcol |= expand_4to1[tptr[4] & 0xf0]>>1; + } + cresult = (*proc)(cdbyte | kdbyte,scol|(scol>>24),tcol|(tcol>>24)); + mresult = (*proc)(mdbyte | kdbyte,scol|(scol>>16),tcol|(tcol>>16)); + yresult = (*proc)(ydbyte | kdbyte,scol|(scol>> 8),tcol|(tcol>> 8)); + kresult = cresult & mresult & yresult; + cresult &= ~kresult; + mresult &= ~kresult; + yresult &= ~kresult; + *cdptr++ = (cresult & lmask) | (cdbyte & ~lmask); + *mdptr++ = (mresult & lmask) | (mdbyte & ~lmask); + *ydptr++ = (yresult & lmask) | (ydbyte & ~lmask); + *kdptr++ = (kresult & lmask) | (kdbyte & ~lmask); + } + if (left <= 0) /* if (width <= 8) we're done */ + continue; + sptr += 4; + tptr += 4; + left -= 8; /* left = bits to go - 8 */ + while (left > 0) + { + byte kdbyte = *kdptr; + byte cdbyte = *cdptr | kdbyte; + byte mdbyte = *mdptr | kdbyte; + byte ydbyte = *ydptr | kdbyte; + byte cresult, mresult, yresult, kresult; + bits32 scol, tcol; + if ((sskew & 1) == 0) { + scol = expand_4to1[sptr[0]]<<6; + scol |= expand_4to1[sptr[1]]<<4; + scol |= expand_4to1[sptr[2]]<<2; + scol |= expand_4to1[sptr[3]]; + } else { + scol = expand_4to1[sptr[0] & 0x0f]<<7; + scol |= expand_4to1[sptr[1]]<<5; + scol |= expand_4to1[sptr[2]]<<3; + scol |= expand_4to1[sptr[3]]<<1; + scol |= expand_4to1[sptr[4] & 0xf0]>>1; + } + if ((tskew & 1) == 0) { + tcol = expand_4to1[tptr[0]]<<6; + tcol |= expand_4to1[tptr[1]]<<4; + tcol |= expand_4to1[tptr[2]]<<2; + tcol |= expand_4to1[tptr[3]]; + } else { + tcol = expand_4to1[tptr[0] & 0x0f]<<7; + tcol |= expand_4to1[tptr[1]]<<5; + tcol |= expand_4to1[tptr[2]]<<3; + tcol |= expand_4to1[tptr[3]]<<1; + tcol |= expand_4to1[tptr[4] & 0xf0]>>1; + } + cresult = (*proc)(cdbyte | kdbyte,scol|(scol>>24),tcol|(tcol>>24)); + mresult = (*proc)(mdbyte | kdbyte,scol|(scol>>16),tcol|(tcol>>16)); + yresult = (*proc)(ydbyte | kdbyte,scol|(scol>> 8),tcol|(tcol>> 8)); + kresult = cresult & mresult & yresult; + cresult &= ~kresult; + mresult &= ~kresult; + yresult &= ~kresult; + *cdptr++ = cresult & ~kresult; + *mdptr++ = mresult & ~kresult; + *ydptr++ = yresult & ~kresult; + *kdptr++ = kresult; + sptr += 4; + tptr += 4; + left -= 8; + } + { + byte kdbyte = *kdptr; + byte cdbyte = *cdptr; + byte mdbyte = *mdptr; + byte ydbyte = *ydptr; + byte cresult, mresult, yresult, kresult; + bits32 scol, tcol; + if ((sskew & 1) == 0) { + scol = expand_4to1[sptr[0]]<<6; + if (left > -6) + scol |= expand_4to1[sptr[1]]<<4; + if (left > -4) + scol |= expand_4to1[sptr[2]]<<2; + if (left > -2) + scol |= expand_4to1[sptr[3]]; + } else { + scol = expand_4to1[sptr[0] & 0x0f]<<7; + if (left > -7) + scol |= expand_4to1[sptr[1]]<<5; + if (left > -5) + scol |= expand_4to1[sptr[2]]<<3; + if (left > -3) + scol |= expand_4to1[sptr[3]]<<1; + if (left > -1) + scol |= expand_4to1[sptr[4] & 0xf0]>>1; + } + if ((tskew & 1) == 0) { + tcol = expand_4to1[tptr[0]]<<6; + if (left > -6) + tcol |= expand_4to1[tptr[1]]<<4; + if (left > -4) + tcol |= expand_4to1[tptr[2]]<<2; + if (left > -2) + tcol |= expand_4to1[tptr[3]]; + } else { + tcol = expand_4to1[tptr[0] & 0x0f]<<7; + if (left > -7) + tcol |= expand_4to1[tptr[1]]<<5; + if (left > -5) + tcol |= expand_4to1[tptr[2]]<<3; + if (left > -3) + tcol |= expand_4to1[tptr[3]]<<1; + if (left > -1) + tcol |= expand_4to1[tptr[4] & 0xf0]>>1; + } + cresult = (*proc)(cdbyte | kdbyte,scol|(scol>>24),tcol|(tcol>>24)); + mresult = (*proc)(mdbyte | kdbyte,scol|(scol>>16),tcol|(tcol>>16)); + yresult = (*proc)(ydbyte | kdbyte,scol|(scol>> 8),tcol|(tcol>> 8)); + kresult = cresult & mresult & yresult; + cresult &= ~kresult; + mresult &= ~kresult; + yresult &= ~kresult; + *cdptr++ = (cresult & rmask) | (cdbyte & ~rmask); + *mdptr++ = (mresult & rmask) | (mdbyte & ~rmask); + *ydptr++ = (yresult & rmask) | (ydbyte & ~rmask); + *kdptr++ = (kresult & rmask) | (kdbyte & ~rmask); + } + } + } + return 0; + } + /* Texture constant (or unimportant) cases */ + dbit = x & 7; + cdrow = scan_line_base(mdev, y) + (x>>3); + mdrow = cdrow + mdev->height * draster; + ydrow = mdrow + mdev->height * draster; + kdrow = ydrow + mdev->height * draster; + lmask = 0xff >> dbit; + width += dbit; + rmask = 0xff << (~(width - 1) & 7); + if (width < 8) + lmask &= rmask; + if (scolors == NULL) { + /* sptr points to bytes of cmykcmyk. Need to convert these to + * planar format. */ + const rop_proc proc = rop_proc_table[rop]; + int sbit = sourcex & 1; + int sskew = sbit - dbit; /* -7 >= sskew >= 1 */ + srow += (sskew>>1); /* Backtrack srow if required. */ + srow += (sourcex>>1); + for (; line_count-- > 0; cdrow += draster, mdrow += draster, ydrow += draster, kdrow += draster, srow += sraster) { + byte *cdptr = cdrow; + byte *mdptr = mdrow; + byte *ydptr = ydrow; + byte *kdptr = kdrow; + const byte *sptr = srow; + int left = width-8; + { + /* Left hand bytes */ + byte kdbyte = *kdptr; + byte cdbyte = *cdptr; + byte mdbyte = *mdptr; + byte ydbyte = *ydptr; + byte cresult, mresult, yresult, kresult; + bits32 scol = 0; + if ((sskew & 1) == 0) { + if (sskew >= 0) + scol = expand_4to1[sptr[0]]<<6; + if ((sskew >= -2) && (left > -6)) + scol |= expand_4to1[sptr[1]]<<4; + if ((sskew >= -4) && (left > -4)) + scol |= expand_4to1[sptr[2]]<<2; + if (left > -2) + scol |= expand_4to1[sptr[3]]; + } else { + if (sskew >= 0) + scol = expand_4to1[sptr[0] & 0x0f]<<7; + if ((sskew >= -2) && (left > -7)) + scol |= expand_4to1[sptr[1]]<<5; + if ((sskew >= -4) && (left > -5)) + scol |= expand_4to1[sptr[2]]<<3; + if ((sskew >= -6) && (left > -3)) + scol |= expand_4to1[sptr[3]]<<1; + if (left > -1) + scol |= expand_4to1[sptr[4] & 0xf0]>>1; + } + cresult = (*proc)(cdbyte | kdbyte,scol|(scol>>24),ctcolor); + mresult = (*proc)(mdbyte | kdbyte,scol|(scol>>16),mtcolor); + yresult = (*proc)(ydbyte | kdbyte,scol|(scol>> 8),ytcolor); + kresult = cresult & mresult & yresult; + cresult &= ~kresult; + mresult &= ~kresult; + yresult &= ~kresult; + *cdptr++ = (cresult & lmask) | (cdbyte & ~lmask); + *mdptr++ = (mresult & lmask) | (mdbyte & ~lmask); + *ydptr++ = (yresult & lmask) | (ydbyte & ~lmask); + *kdptr++ = (kresult & lmask) | (kdbyte & ~lmask); + } + if (left <= 0) /* if (width <= 8) we're done */ + continue; + sptr += 4; + left -= 8; /* left = bits to go - 8 */ + while (left > 0) + { + byte kdbyte = *kdptr; + byte cdbyte = *cdptr | kdbyte; + byte mdbyte = *mdptr | kdbyte; + byte ydbyte = *ydptr | kdbyte; + byte cresult, mresult, yresult, kresult; + bits32 scol; + if ((sskew & 1) == 0) { + scol = expand_4to1[sptr[0]]<<6; + scol |= expand_4to1[sptr[1]]<<4; + scol |= expand_4to1[sptr[2]]<<2; + scol |= expand_4to1[sptr[3]]; + } else { + scol = expand_4to1[sptr[0] & 0x0f]<<7; + scol |= expand_4to1[sptr[1]]<<5; + scol |= expand_4to1[sptr[2]]<<3; + scol |= expand_4to1[sptr[3]]<<1; + scol |= expand_4to1[sptr[4] & 0xf0]>>1; + } + cresult = (*proc)(cdbyte | kdbyte,scol|(scol>>24),ctcolor); + mresult = (*proc)(mdbyte | kdbyte,scol|(scol>>16),mtcolor); + yresult = (*proc)(ydbyte | kdbyte,scol|(scol>> 8),ytcolor); + kresult = cresult & mresult & yresult; + cresult &= ~kresult; + mresult &= ~kresult; + yresult &= ~kresult; + *cdptr++ = cresult & ~kresult; + *mdptr++ = mresult & ~kresult; + *ydptr++ = yresult & ~kresult; + *kdptr++ = kresult; + sptr += 4; + left -= 8; + } + { + byte kdbyte = *kdptr; + byte cdbyte = *cdptr; + byte mdbyte = *mdptr; + byte ydbyte = *ydptr; + byte cresult, mresult, yresult, kresult; + bits32 scol; + if ((sskew & 1) == 0) { + scol = expand_4to1[sptr[0]]<<6; + if (left > -6) + scol |= expand_4to1[sptr[1]]<<4; + if (left > -4) + scol |= expand_4to1[sptr[2]]<<2; + if (left > -2) + scol |= expand_4to1[sptr[3]]; + } else { + scol = expand_4to1[sptr[0] & 0x0f]<<7; + if (left > -7) + scol |= expand_4to1[sptr[1]]<<5; + if (left > -5) + scol |= expand_4to1[sptr[2]]<<3; + if (left > -3) + scol |= expand_4to1[sptr[3]]<<1; + if (left > -1) + scol |= expand_4to1[sptr[4] & 0xf0]>>1; + } + cresult = (*proc)(cdbyte | kdbyte,scol|(scol>>24),ctcolor); + mresult = (*proc)(mdbyte | kdbyte,scol|(scol>>16),mtcolor); + yresult = (*proc)(ydbyte | kdbyte,scol|(scol>> 8),ytcolor); + kresult = cresult & mresult & yresult; + cresult &= ~kresult; + mresult &= ~kresult; + yresult &= ~kresult; + *cdptr++ = (cresult & rmask) | (cdbyte & ~rmask); + *mdptr++ = (mresult & rmask) | (mdbyte & ~rmask); + *ydptr++ = (yresult & rmask) | (ydbyte & ~rmask); + *kdptr++ = (kresult & rmask) | (kdbyte & ~rmask); + } + } + } else if (constant_s) { + const rop_proc proc = rop_proc_table[rop]; + for (; line_count-- > 0; cdrow += draster, mdrow += draster, ydrow += draster, kdrow += draster) { + byte *cdptr = cdrow; + byte *mdptr = mdrow; + byte *ydptr = ydrow; + byte *kdptr = kdrow; + int left = width-8; + { + /* Left hand bytes */ + byte kdbyte = *kdptr; + byte cdbyte = *cdptr; + byte mdbyte = *mdptr; + byte ydbyte = *ydptr; + byte cresult = (*proc)(cdbyte | kdbyte,cscolor,ctcolor); + byte mresult = (*proc)(mdbyte | kdbyte,mscolor,mtcolor); + byte yresult = (*proc)(ydbyte | kdbyte,yscolor,ytcolor); + byte kresult = cresult & mresult & yresult; + cresult &= ~kresult; + mresult &= ~kresult; + yresult &= ~kresult; + *cdptr++ = (cresult & lmask) | (cdbyte & ~lmask); + *mdptr++ = (mresult & lmask) | (mdbyte & ~lmask); + *ydptr++ = (yresult & lmask) | (ydbyte & ~lmask); + *kdptr++ = (kresult & lmask) | (kdbyte & ~lmask); + } + if (left <= 0) /* if (width <= 8) we're done */ + continue; + left -= 8; /* left = bits to go - 8 */ + while (left > 0) + { + byte kdbyte = *kdptr; + byte cdbyte = *cdptr | kdbyte; + byte mdbyte = *mdptr | kdbyte; + byte ydbyte = *ydptr | kdbyte; + byte cresult = (*proc)(cdbyte,cscolor,ctcolor); + byte mresult = (*proc)(mdbyte,mscolor,mtcolor); + byte yresult = (*proc)(ydbyte,yscolor,ytcolor); + byte kresult = cresult & mresult & yresult; + cresult &= ~kresult; + mresult &= ~kresult; + yresult &= ~kresult; + *cdptr++ = cresult & ~kresult; + *mdptr++ = mresult & ~kresult; + *ydptr++ = yresult & ~kresult; + *kdptr++ = kresult; + left -= 8; + } + { + byte kdbyte = *kdptr; + byte cdbyte = *cdptr; + byte mdbyte = *mdptr; + byte ydbyte = *ydptr; + byte cresult = (*proc)(cdbyte | kdbyte,cscolor,ctcolor); + byte mresult = (*proc)(mdbyte | kdbyte,mscolor,mtcolor); + byte yresult = (*proc)(ydbyte | kdbyte,yscolor,ytcolor); + byte kresult = cresult & mresult & yresult; + cresult &= ~kresult; + mresult &= ~kresult; + yresult &= ~kresult; + *cdptr++ = (cresult & rmask) | (cdbyte & ~rmask); + *mdptr++ = (mresult & rmask) | (mdbyte & ~rmask); + *ydptr++ = (yresult & rmask) | (ydbyte & ~rmask); + *kdptr++ = (kresult & rmask) | (kdbyte & ~rmask); + } + } + } else { + /* Constant T, bitmap S */ + int sbit = sourcex & 7; + int sskew = sbit - dbit; + if (sskew < 0) + --srow, sskew += 8; + srow += (sourcex>>3); + for (; line_count-- > 0; cdrow += draster, mdrow += draster, ydrow += draster, kdrow += draster, srow += sraster) { + const byte *sptr = srow; + byte *cdptr = cdrow; + byte *mdptr = mdrow; + byte *ydptr = ydrow; + byte *kdptr = kdrow; + int left = width-8; + { + /* Left hand byte (maybe the only one) */ + byte kdbyte = *kdptr; + byte cdbyte = *cdptr; + byte mdbyte = *mdptr; + byte ydbyte = *ydptr; +#define fetch1(ptr, skew)\ + (skew ? (ptr[0] << skew) + (ptr[1] >> (8 - skew)) : *ptr) + byte sbyte = fetch1(sptr, sskew); + byte cresult = (*cproc)(cdbyte|kdbyte,sbyte,ctcolor); + byte mresult = (*mproc)(mdbyte|kdbyte,sbyte,mtcolor); + byte yresult = (*yproc)(ydbyte|kdbyte,sbyte,ytcolor); + byte kresult = cresult & mresult & yresult; + cresult &= ~kresult; + mresult &= ~kresult; + yresult &= ~kresult; + *cdptr++ = (cresult & lmask) | (cdbyte & ~lmask); + *mdptr++ = (mresult & lmask) | (mdbyte & ~lmask); + *ydptr++ = (yresult & lmask) | (ydbyte & ~lmask); + *kdptr++ = (kresult & lmask) | (kdbyte & ~lmask); + sptr++; + left -= 8; + } + while (left > 0) { + /* Bytes where all 8 bits of S are needed */ + byte kdbyte = *kdptr; + byte cdbyte = *cdptr | kdbyte; + byte mdbyte = *mdptr | kdbyte; + byte ydbyte = *ydptr | kdbyte; + byte sbyte = fetch1(sptr, sskew); + byte cresult = (*cproc)(cdbyte,sbyte,ctcolor); + byte mresult = (*mproc)(mdbyte,sbyte,mtcolor); + byte yresult = (*yproc)(ydbyte,sbyte,ytcolor); + byte kresult = cresult & mresult & yresult; + *cdptr++ = cresult & ~kresult; + *mdptr++ = mresult & ~kresult; + *ydptr++ = yresult & ~kresult; + *kdptr++ = kresult; + sptr++; + left -= 8; + } + /* Final byte */ + if (left > -8) { + byte kdbyte = *kdptr; + byte cdbyte = *cdptr; + byte mdbyte = *mdptr; + byte ydbyte = *ydptr; + byte sbyte = fetch1(sptr, sskew); +#undef fetch1 + byte cresult = (*cproc)(cdbyte | kdbyte,sbyte,ctcolor); + byte mresult = (*mproc)(mdbyte | kdbyte,sbyte,mtcolor); + byte yresult = (*yproc)(ydbyte | kdbyte,sbyte,ytcolor); + byte kresult = cresult & mresult & yresult; + cresult &= ~kresult; + mresult &= ~kresult; + yresult &= ~kresult; + *cdptr++ = (cresult & rmask) | (cdbyte & ~rmask); + *mdptr++ = (mresult & rmask) | (mdbyte & ~rmask); + *ydptr++ = (yresult & rmask) | (ydbyte & ~rmask); + *kdptr++ = (kresult & rmask) | (kdbyte & ~rmask); + } + } + } + return 0; +} + +static int +plane_strip_copy_rop(gx_device_memory * mdev, + const byte * sdata, int sourcex, uint sraster, + gx_bitmap_id id, const gx_color_index * scolors, + const gx_strip_bitmap * textures, + const gx_color_index * tcolors, + int x, int y, int width, int height, + int phase_x, int phase_y, + gs_logical_operation_t lop, int plane) { - gx_device_memory * const mdev = (gx_device_memory *)dev; mem_save_params_t save; - int plane, code; + int code; const gx_device_memory *mdproto; - if ((lop & lop_planar) == 0) { - mdproto = gdev_mem_device_for_bits(mdev->color_info.depth); - return dev_proc(mdproto, strip_copy_rop)(dev, sdata, sourcex, sraster, - id, scolors, textures, tcolors, - x, y, width, height, - phase_x, phase_y, lop); - } - /* Extract the plane, and sanitise the lop */ - plane = lop>>lop_planar_shift; - lop &= ~((plane<= mdev->num_planes)) - return gs_error_rangecheck; MEM_SAVE_PARAMS(mdev, save); mdev->line_ptrs += mdev->height * plane; mdproto = gdev_mem_device_for_bits(mdev->planes[plane].depth); - /* strip_copy_rop might end up calling get_bits_rectangle, so ensure we - * have the right one in there. */ + /* strip_copy_rop might end up calling get_bits_rectangle or fill_rectangle, + * so ensure we have the right ones in there. */ set_dev_proc(mdev, get_bits_rectangle, dev_proc(mdproto, get_bits_rectangle)); - code = dev_proc(mdproto, strip_copy_rop)(dev, sdata, sourcex, sraster, + set_dev_proc(mdev, fill_rectangle, dev_proc(mdproto, fill_rectangle)); + code = dev_proc(mdproto, strip_copy_rop)((gx_device *)mdev, sdata, sourcex, sraster, id, scolors, textures, tcolors, x, y, width, height, phase_x, phase_y, lop); set_dev_proc(mdev, get_bits_rectangle, mem_planar_get_bits_rectangle); + set_dev_proc(mdev, fill_rectangle, mem_planar_fill_rectangle); + /* The following effectively does: mdev->line_ptrs -= mdev->height * plane; */ MEM_RESTORE_PARAMS(mdev, save); return code; } @@ -701,7 +1545,8 @@ */ static int planar_to_chunky(gx_device_memory *mdev, int x, int y, int w, int h, - int offset, uint draster, byte *dest) + int offset, uint draster, byte *dest, byte **line_ptrs, + int plane_height) { int num_planes = mdev->num_planes; sample_load_declare(sptr[GX_DEVICE_COLOR_MAX_COMPONENTS], @@ -727,9 +1572,9 @@ } } for (iy = y; iy < y + h; ++iy) { - byte **line_ptr = mdev->line_ptrs + iy; + byte **line_ptr = line_ptrs + iy; - for (pi = 0; pi < num_planes; ++pi, line_ptr += mdev->height) { + for (pi = 0; pi < num_planes; ++pi, line_ptr += plane_height) { int plane_depth = mdev->planes[pi].depth; int xbit = x * plane_depth; @@ -787,6 +1632,228 @@ return 0; } +static byte cmykrop[256] = +{ + 255,127,191,63,223,95,159,31,239,111,175,47,207,79,143,15, + 247,119,183,55,215,87,151,23,231,103,167,39,199,71,135,7, + 251,123,187,59,219,91,155,27,235,107,171,43,203,75,139,11, + 243,115,179,51,211,83,147,19,227,99,163,35,195,67,131,3, + 253,125,189,61,221,93,157,29,237,109,173,45,205,77,141,13, + 245,117,181,53,213,85,149,21,229,101,165,37,197,69,133,5, + 249,121,185,57,217,89,153,25,233,105,169,41,201,73,137,9, + 241,113,177,49,209,81,145,17,225,97,161,33,193,65,129,1, + 254,126,190,62,222,94,158,30,238,110,174,46,206,78,142,14, + 246,118,182,54,214,86,150,22,230,102,166,38,198,70,134,6, + 250,122,186,58,218,90,154,26,234,106,170,42,202,74,138,10, + 242,114,178,50,210,82,146,18,226,98,162,34,194,66,130,2, + 252,124,188,60,220,92,156,28,236,108,172,44,204,76,140,12, + 244,116,180,52,212,84,148,20,228,100,164,36,196,68,132,4, + 248,120,184,56,216,88,152,24,232,104,168,40,200,72,136,8, + 240,112,176,48,208,80,144,16,224,96,160,32,192,64,128,0 +}; + +static int +mem_planar_strip_copy_rop(gx_device * dev, + const byte * sdata, int sourcex, uint sraster, + gx_bitmap_id id, const gx_color_index * scolors, + const gx_strip_bitmap * textures, + const gx_color_index * tcolors, + int x, int y, int width, int height, + int phase_x, int phase_y, + gs_logical_operation_t lop) +{ + return mem_planar_strip_copy_rop2(dev, sdata, sourcex, sraster, + id, scolors, textures, tcolors, + x, y, width, height, + phase_x, phase_y, lop, 0); +} + +static int +mem_planar_strip_copy_rop2(gx_device * dev, + const byte * sdata, int sourcex, uint sraster, + gx_bitmap_id id, const gx_color_index * scolors, + const gx_strip_bitmap * textures, + const gx_color_index * tcolors, + int x, int y, int width, int height, + int phase_x, int phase_y, + gs_logical_operation_t lop, + uint planar_height) +{ + gx_device_memory * const mdev = (gx_device_memory *)dev; + int code; + + if (planar_height != 0) { + /* S is in planar format; expand it to a temporary buffer, then + * call ourselves back with a modified rop to use it, then free + * the temporary buffer, and return. */ + /* Make a temporary buffer that contains both the raster and the line + * pointers for the buffer. For now, for the sake of sanity, we + * convert whole lines of s, but only as many lines as we have to. */ + /* We assume that scolors == NULL here */ + int i, j; + uint chunky_sraster; + uint nbytes; + byte **line_ptrs; + byte *sbuf, *buf; + + chunky_sraster = sraster * mdev->num_planes; + nbytes = height * chunky_sraster; + buf = gs_alloc_bytes(mdev->memory, nbytes, "mem_planar_strip_copy_rop(buf)"); + if (buf == NULL) { + return gs_note_error(gs_error_VMerror); + } + nbytes = sizeof(byte *) * mdev->num_planes * height; + line_ptrs = (byte **)gs_alloc_bytes(mdev->memory, nbytes, "mem_planar_strip_copy_rop(line_ptrs)"); + if (line_ptrs == NULL) { + gs_free_object(mdev->memory, buf, "mem_planar_strip_copy_rop(buf)"); + return gs_note_error(gs_error_VMerror); + } + for (j = 0; j < mdev->num_planes; j++) { + sbuf = sdata + j * sraster; + for (i = height; i > 0; i--) { + *line_ptrs++ = sbuf; + sbuf += sraster; + } + } + line_ptrs -= height * mdev->num_planes; + planar_to_chunky(mdev, sourcex, 0, width, height, + 0, chunky_sraster, buf, line_ptrs, planar_height); + gs_free_object(mdev->memory, line_ptrs, "mem_planar_strip_copy_rop(line_ptrs)"); + code = mem_planar_strip_copy_rop2(dev, buf, 0, chunky_sraster, + id, scolors, textures, tcolors, + x, y, width, height, phase_x, phase_y, + lop, 0); + gs_free_object(mdev->memory, buf, "mem_planar_strip_copy_rop(buf)"); + return code; + } + + if (textures && textures->num_planes > 1) { + /* T is in planar format; expand it to a temporary buffer, then + * call ourselves back with a modified rop to use it, then free + * the temporary buffer, and return. */ + /* Make a temporary buffer that contains both the raster and the line + * pointers for the buffer. For now, for the sake of sanity, we + * convert whole lines of t, but only as many lines as we have to + * (unless it loops). */ + /* We assume that tcolors == NULL here */ + int ty, i; + uint chunky_t_raster; + uint chunky_t_height; + uint nbytes; + byte **line_ptrs; + byte *tbuf, *buf; + gx_strip_bitmap newtex; + + ty = (y + phase_y) % textures->rep_height; + if (ty < 0) + ty += textures->rep_height; + chunky_t_raster = bitmap_raster(textures->rep_width * mdev->color_info.depth); + if (ty + height <= textures->rep_height) { + chunky_t_height = height; + phase_y = -y; + } else { + ty = 0; + chunky_t_height = textures->rep_height; + } + nbytes = chunky_t_height * chunky_t_raster; + buf = gs_alloc_bytes(mdev->memory, nbytes, "mem_planar_strip_copy_rop(buf)"); + if (buf == NULL) { + return gs_note_error(gs_error_VMerror); + } + nbytes = sizeof(byte *) * mdev->num_planes * textures->rep_height; + line_ptrs = (byte **)gs_alloc_bytes(mdev->memory, nbytes, "mem_planar_strip_copy_rop(line_ptrs)"); + if (line_ptrs == NULL) { + gs_free_object(mdev->memory, buf, "mem_planar_strip_copy_rop(buf)"); + return gs_note_error(gs_error_VMerror); + } + tbuf = textures->data; + for (i = textures->rep_height * mdev->num_planes; i > 0; i--) { + *line_ptrs++ = tbuf; + tbuf += textures->raster; + } + line_ptrs -= textures->rep_height * mdev->num_planes; + planar_to_chunky(mdev, 0, ty, textures->rep_width, chunky_t_height, + 0, chunky_t_raster, buf, line_ptrs, textures->rep_height); + gs_free_object(mdev->memory, line_ptrs, "mem_planar_strip_copy_rop(line_ptrs)"); + newtex = *textures; + newtex.data = buf; + newtex.raster = chunky_t_raster; + newtex.num_planes = 1; + newtex.size.x = textures->rep_width; + newtex.size.y = textures->rep_height; + code = mem_planar_strip_copy_rop2(dev, sdata, sourcex, sraster, + id, scolors, &newtex, tcolors, + x, y, width, height, phase_x, phase_y, + lop, planar_height); + gs_free_object(mdev->memory, buf, "mem_planar_strip_copy_rop(buf)"); + return code; + } + + /* Not doing a planar lop. If we carry on down the default path here, + * we'll end up doing a planar_to_chunky; we may be able to sidestep + * that by spotting cases where we can operate directly. */ + if (!lop_uses_T(lop) || (tcolors && (tcolors[0] == tcolors[1]))) { + /* No T in use, or constant T. */ + if ((!lop_uses_S(lop) || (scolors && (scolors[0] == scolors[1]))) && + ((mdev->num_planes == 1) || (mdev->num_planes == 3))) { + int plane; + /* No S in use, or constant S. And either greyscale or rgb, + * so we can just do the rop on each plane in turn. */ + for (plane=0; plane < mdev->num_planes; plane++) + { + gx_color_index tcolors2[2], scolors2[2]; + int shift = mdev->planes[plane].shift; + int mask = (1<planes[plane].depth)-1; + + if (tcolors) { + tcolors2[0] = (tcolors[0] >> shift) & mask; + tcolors2[1] = (tcolors[1] >> shift) & mask; + } + if (scolors) { + scolors2[0] = (scolors[0] >> shift) & mask; + scolors2[1] = (scolors[1] >> shift) & mask; + } + code = plane_strip_copy_rop(mdev, sdata, sourcex, sraster, + id, (scolors ? scolors2 : NULL), + textures, (tcolors ? tcolors2 : NULL), + x, y, width, height, + phase_x, phase_y, lop, plane); + if (code < 0) + return code; + } + return 0; + } + if ((mdev->num_planes == 4) && (mdev->plane_depth == 1) && + ((lop & (lop_S_transparent | lop_T_transparent)) == 0)) + { + lop = cmykrop[lop & 0xff] | (lop & ~0xff); + return planar_cmyk4bit_strip_copy_rop(mdev, sdata, sourcex, + sraster, id, scolors, + textures, tcolors, + x, y, width, height, + phase_x, phase_y, + lop); + } + } + if (!tcolors && !scolors && + (mdev->num_planes == 4) && (mdev->plane_depth == 1) && + ((lop & (lop_S_transparent | lop_T_transparent)) == 0)) { + lop = cmykrop[lop & 0xff] | (lop & ~0xff); + return planar_cmyk4bit_strip_copy_rop(mdev, sdata, sourcex, + sraster, id, scolors, + textures, tcolors, + x, y, width, height, + phase_x, phase_y, + lop); + } + /* Fall back to the default implementation (the only one that + * guarantees to properly cope with D being planar). */ + return mem_default_strip_copy_rop(dev, sdata, sourcex, sraster, + id, scolors, textures, tcolors, + x, y, width, height, + phase_x, phase_y, lop); +} + /* Copy bits back from a planar memory device. */ static int mem_planar_get_bits_rectangle(gx_device * dev, const gs_int_rect * prect, @@ -906,7 +1973,8 @@ (options & GB_RASTER_SPECIFIED ? params->raster : bitmap_raster((offset + w) * mdev->color_info.depth)); - planar_to_chunky(mdev, x, y, w, h, offset, draster, params->data[0]); + planar_to_chunky(mdev, x, y, w, h, offset, draster, params->data[0], + mdev->line_ptrs, mdev->height); } else { /* * Do the transfer through an intermediate buffer. @@ -960,7 +2028,8 @@ ch = min(bh, y + h - cy); for (cx = x; cx < x + w; cx += cw) { cw = min(bw, x + w - cx); - planar_to_chunky(mdev, cx, cy, cw, ch, 0, br, buf.b); + planar_to_chunky(mdev, cx, cy, cw, ch, 0, br, buf.b, + mdev->line_ptrs, mdev->height); code = gx_get_bits_copy(dev, 0, cw, ch, &dest_params, ©_params, buf.b, br); if (code < 0) diff -Nru ghostscript-9.04~dfsg/base/gdevmr2n.c ghostscript-9.05~dfsg~20120125/base/gdevmr2n.c --- ghostscript-9.04~dfsg/base/gdevmr2n.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevmr2n.c 2011-10-06 06:43:10.000000000 +0000 @@ -112,6 +112,7 @@ texture2.rep_width <<= log2_depth; texture2.shift <<= log2_depth; texture2.rep_shift <<= log2_depth; + texture2.num_planes = 1; real_texture = &texture2; } if (tcolors) { diff -Nru ghostscript-9.04~dfsg/base/gdevnfwd.c ghostscript-9.05~dfsg~20120125/base/gdevnfwd.c --- ghostscript-9.04~dfsg/base/gdevnfwd.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevnfwd.c 2011-11-21 08:55:19.000000000 +0000 @@ -110,6 +110,7 @@ fill_dev_proc(dev, fillpage, gx_forward_fillpage); fill_dev_proc(dev, get_profile, gx_forward_get_profile); fill_dev_proc(dev, set_graphics_type_tag, gx_forward_set_graphics_type_tag); + fill_dev_proc(dev, strip_copy_rop2, gx_forward_strip_copy_rop2); gx_device_fill_in_procs((gx_device *) dev); } @@ -556,6 +557,38 @@ phase_x, phase_y, lop); } +int +gx_forward_strip_copy_rop2(gx_device * dev, const byte * sdata, int sourcex, + uint sraster, gx_bitmap_id id, + const gx_color_index * scolors, + const gx_strip_bitmap * textures, + const gx_color_index * tcolors, + int x, int y, int width, int height, + int phase_x, int phase_y, gs_logical_operation_t lop, + uint planar_height) +{ + gx_device_forward * const fdev = (gx_device_forward *)dev; + gx_device *tdev = fdev->target; + + if (planar_height != 0) { + dev_proc_strip_copy_rop2((*proc2)) = + (tdev == 0 ? (tdev = dev, gx_default_strip_copy_rop2) : + dev_proc(tdev, strip_copy_rop2)); + + return proc2(tdev, sdata, sourcex, sraster, id, scolors, + textures, tcolors, x, y, width, height, + phase_x, phase_y, lop, planar_height); + } else { + dev_proc_strip_copy_rop((*proc)) = + (tdev == 0 ? (tdev = dev, gx_default_strip_copy_rop) : + dev_proc(tdev, strip_copy_rop)); + + return proc(tdev, sdata, sourcex, sraster, id, scolors, + textures, tcolors, x, y, width, height, + phase_x, phase_y, lop); + } +} + void gx_forward_get_clipping_box(gx_device * dev, gs_fixed_rect * pbox) { @@ -956,6 +989,7 @@ /* but we can't do this, because image_data must keep track of the */ /* Y position so it can return 1 when done. */ static dev_proc_strip_copy_rop(null_strip_copy_rop); +static dev_proc_strip_copy_rop2(null_strip_copy_rop2); #define null_procs(get_initial_matrix, get_page_device) {\ gx_default_open_device,\ @@ -1023,7 +1057,11 @@ NULL, /* push_transparency_state */\ NULL, /* pop_transparency_state */\ NULL, /* put_image */\ - gx_default_dev_spec_op /* dev_spec_op */\ + gx_default_dev_spec_op, /* dev_spec_op */\ + NULL, /* copy_planes */\ + NULL, /* get_profile */\ + NULL, /* set_graphics_type_tag */\ + null_strip_copy_rop2\ } #define NULLD_X_RES 72 @@ -1176,6 +1214,18 @@ { return 0; } +static int +null_strip_copy_rop2(gx_device * dev, const byte * sdata, int sourcex, + uint sraster, gx_bitmap_id id, + const gx_color_index * scolors, + const gx_strip_bitmap * textures, + const gx_color_index * tcolors, + int x, int y, int width, int height, + int phase_x, int phase_y, gs_logical_operation_t lop, + uint plane_height) +{ + return 0; +} bool fwd_uses_fwd_cmap_procs(gx_device * dev) diff -Nru ghostscript-9.04~dfsg/base/gdevokii.c ghostscript-9.05~dfsg~20120125/base/gdevokii.c --- ghostscript-9.04~dfsg/base/gdevokii.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevokii.c 2011-09-29 11:01:33.000000000 +0000 @@ -258,7 +258,7 @@ int xcount = count / y_mult; fputc(033, prn_stream); - fputc((int)("KLYZ"[start_graphics]), prn_stream); + fputc((int)("KLYZ"[(int)start_graphics]), prn_stream); fputc(xcount & 0xff, prn_stream); fputc(xcount >> 8, prn_stream); if ( !pass ) diff -Nru ghostscript-9.04~dfsg/base/gdevp14.c ghostscript-9.05~dfsg~20120125/base/gdevp14.c --- ghostscript-9.04~dfsg/base/gdevp14.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevp14.c 2012-01-25 08:44:24.000000000 +0000 @@ -63,6 +63,8 @@ unsigned int clist_band_count = 0; #endif +#define DUMP_MASK_STACK 0 + /* Static prototypes */ /* Used for filling rects when we are doing a fill with a pattern that has transparency */ @@ -72,9 +74,9 @@ const gx_device_color * pdevc, const gx_clip_path * pcpath); static pdf14_mask_t *pdf14_mask_element_new(gs_memory_t *memory); static void pdf14_free_smask_color(pdf14_device * pdev); -static int compute_group_device_int_rect(pdf14_device *pdev, gs_int_rect *rect, +static int compute_group_device_int_rect(pdf14_device *pdev, gs_int_rect *rect, const gs_rect *pbbox, gs_imager_state *pis); -static int pdf14_clist_update_params(pdf14_clist_device * pdev, +static int pdf14_clist_update_params(pdf14_clist_device * pdev, const gs_imager_state * pis, bool crop_blend_params, gs_pdf14trans_params_t *group_params); @@ -106,6 +108,9 @@ const gx_fill_params * params, const gx_device_color * pdevc, const gx_clip_path * pcpath); static pdf14_mask_t * pdf14_mask_element_new(gs_memory_t * memory); +#ifdef DEBUG +static void pdf14_debug_mask_stack_state(pdf14_ctx *ctx); +#endif /* Buffer stack data structure */ gs_private_st_ptrs5(st_pdf14_buf, pdf14_buf, "pdf14_buf", @@ -778,11 +783,14 @@ int num_noncolor_planes, new_num_planes; int num_cols, num_rows, num_newcolor_planes; bool icc_match; - gsicc_rendering_param_t rendering_params; gsicc_link_t *icc_link; gsicc_bufferdesc_t input_buff_desc; gsicc_bufferdesc_t output_buff_desc; + +#ifdef DEBUG + pdf14_debug_mask_stack_state(ctx); +#endif if ( mask_stack == NULL) { maskbuf = NULL; } else { @@ -875,8 +883,7 @@ and the child will have the same color space anyway */ icc_link = gsicc_get_link_profile(pis, dev, curr_icc_profile, nos->parent_color_info_procs->icc_profile, - &rendering_params, pis->memory, false, - false); + &rendering_params, pis->memory, false); /* If the link is the identity, then we don't need to do any color conversions */ if ( !(icc_link->is_identity) ) { @@ -922,7 +929,7 @@ does not need to worry about the cmap procs of the target device. Those are handled when we do the pdf14 put image operation */ - gscms_transform_color_buffer(icc_link, &input_buff_desc, + (icc_link->procs.map_buffer)(dev, icc_link, &input_buff_desc, &output_buff_desc, tos->data, new_data_buf); } @@ -1217,12 +1224,11 @@ rendering_params.graphics_type_tag = GS_IMAGE_TAG; rendering_params.rendering_intent = gsPERCEPTUAL; icc_link = gsicc_get_link_profile(pis, dev, des_profile, - src_profile, &rendering_params, pis->memory, false, - false); - smask_icc(tos->rect.q.y - tos->rect.p.y , - tos->rect.q.x - tos->rect.p.x,tos->n_chan, - tos->rowstride, tos->planestride, - tos->data, new_data_buf, icc_link); + src_profile, &rendering_params, pis->memory, false); + smask_icc(dev, tos->rect.q.y - tos->rect.p.y, + tos->rect.q.x - tos->rect.p.x,tos->n_chan, + tos->rowstride, tos->planestride, + tos->data, new_data_buf, icc_link); /* Release the link */ gsicc_release_link(icc_link); } @@ -1282,7 +1288,10 @@ rc_increment(new_mask->rc_mask); ctx->mask_stack->previous = new_mask; } - return(0); +#ifdef DEBUG + pdf14_debug_mask_stack_state(pdev->ctx); +#endif + return(0); } static int @@ -1315,7 +1324,10 @@ } } } - return(0); +#ifdef DEBUG + pdf14_debug_mask_stack_state(pdev->ctx); +#endif + return 0; } static int @@ -1366,6 +1378,9 @@ if ( pdev->ctx == NULL){ return 0; /* this can occur if the pattern is a clist */ } +#ifdef DEBUG + pdf14_debug_mask_stack_state(pdev->ctx); +#endif buf = pdev->ctx->stack; rect = buf->rect; transbuff->dirty = &buf->dirty; @@ -1565,6 +1580,7 @@ &(pcs->cmm_icc_profile_data), &rendering_intent); /* pcs takes a reference to the profile data it just retrieved. */ rc_increment(pcs->cmm_icc_profile_data); + gscms_set_icc_range(&(pcs->cmm_icc_profile_data)); gs_image_t_init_adjust(&image, pcs, false); image.ImageMatrix.xx = (float)width; image.ImageMatrix.yy = (float)height; @@ -2006,13 +2022,6 @@ int aa_raster, gx_bitmap_id id, int x, int y, int w, int h, gx_color_index color, int depth) { - /* Because of the way that alpha blending occurs in the pdf14 device, - we have to take care in doing the copy alpha operation. We could - end up with some weird renderings if the blend mode is set to - something odd. What we want is to go ahead and just do our own - blending here and now in the color planes and not mix up the - anti-aliasing blending with any of the transparency group blendings. */ - const byte *aa_row; pdf14_device *pdev = (pdf14_device *)dev; pdf14_buf *buf = pdev->ctx->stack; @@ -2020,7 +2029,6 @@ byte *line, *dst_ptr; byte src[PDF14_MAX_PLANES]; byte dst[PDF14_MAX_PLANES]; - byte src_aa[PDF14_MAX_PLANES]; gs_blend_mode_t blend_mode = pdev->blend_mode; bool additive = pdev->ctx->additive; int rowstride = buf->rowstride; @@ -2029,6 +2037,7 @@ bool has_alpha_g = buf->has_alpha_g; bool has_shape = buf->has_shape; bool has_tags = buf->has_tags; + bool knockout = buf->knockout; int num_chan = buf->n_chan; int num_comp = num_chan - 1; int shape_off = num_chan * planestride; @@ -2041,8 +2050,7 @@ byte src_alpha; int alpha2_aa, alpha_aa, sx; int alpha_aa_act; - byte *src_use; - byte white[PDF14_MAX_PLANES]; + int xoff; if (buf->data == NULL) return 0; @@ -2056,8 +2064,11 @@ shape = (byte)floor (255 * pdev->shape + 0.5); /* Limit the area we write to the bounding rectangle for this buffer */ if (x < buf->rect.p.x) { + xoff = data_x + buf->rect.p.x - x; w += x - buf->rect.p.x; x = buf->rect.p.x; + } else { + xoff = data_x; } if (y < buf->rect.p.y) { h += y - buf->rect.p.y; @@ -2072,14 +2083,9 @@ if (y + h > buf->dirty.q.y) buf->dirty.q.y = y + h; line = buf->data + (x - buf->rect.p.x) + (y - buf->rect.p.y) * rowstride; - memset(&(white[0]), 255, num_comp); - if (pdev->ctx->smask_depth > 0) { - memset(&(white[0]), 0, num_comp); - } - for (j = 0; j < h; ++j, aa_row += aa_raster) { dst_ptr = line; - sx = data_x; + sx = xoff; for (i = 0; i < w; ++i, ++sx) { /* Complement the components for subtractive color spaces */ if (additive) { @@ -2097,33 +2103,35 @@ alpha2_aa = aa_row[sx >> 1], alpha_aa = (sx & 1 ? alpha2_aa & 0xf : alpha2_aa >> 4); } - /* Apply the alpha value if needed, updating our source color - Note that we probably could do this better */ - if (!(alpha_aa == 0 || alpha_aa == 15)) { - if (dst[num_comp] == 0) { /* nothing at destination yet */ + if (alpha_aa != 0) { /* This does happen */ + if (!(alpha_aa == 15)) { + /* We have an alpha value from aa */ alpha_aa_act = (255 * alpha_aa) / 15; - for (k = 0; k < num_comp; ++k) { - src_aa[k] = (byte)(((float) alpha_aa_act * (float) src[k] - + (float) white[k] * (255.0 - (float) alpha_aa_act))/255.0); + if (src_alpha != 255) { + /* Need to combine it with the existing alpha */ + int tmp = src_alpha * alpha_aa_act + 0x80; + alpha_aa_act = (tmp + (tmp >> 8)) >> 8; } - src_use = &(src_aa[0]); - src_aa[num_comp] = src_alpha; + /* Set our source alpha value appropriately */ + src[num_comp] = alpha_aa_act; } else { - alpha_aa_act = (255 * alpha_aa) / 15; - for (k = 0; k < num_comp; ++k) { - src_aa[k] = (byte)(((float) alpha_aa_act * (float) src[k] - + (float) dst[k] * (255.0 - (float) alpha_aa_act))/255.0); + /* We may have to reset this is it was changed as we + moved across the row */ + src[num_comp] = src_alpha; + } + if (knockout) { + if (has_shape) { + art_pdf_composite_knockout_simple_8(dst, + has_shape ? dst_ptr + shape_off : NULL, + has_tags ? dst_ptr + tag_off : NULL, + src, curr_tag, num_comp, 255); + } else { + art_pdf_knockoutisolated_group_8(dst, src, num_comp); } - src_use = &(src_aa[0]); - src_aa[num_comp] = src_alpha; + } else { + art_pdf_composite_pixel_alpha_8(dst, src, num_comp, + blend_mode, pdev->blend_procs); } - } else { - src_use = &(src[0]); - } - if (alpha_aa != 0) { - /* Then do what ever composing we need to do */ - art_pdf_composite_pixel_alpha_8(dst, src_use, num_comp, - blend_mode, pdev->blend_procs); /* Complement the results for subtractive color spaces */ if (additive) { for (k = 0; k < num_chan; ++k) @@ -2145,7 +2153,7 @@ } } if (has_alpha_g) { - int tmp = (255 - dst_ptr[alpha_g_off]) * (255 - src_alpha) + 0x80; + int tmp = (255 - dst_ptr[alpha_g_off]) * (255 - src[num_comp]) + 0x80; dst_ptr[alpha_g_off] = 255 - ((tmp + (tmp >> 8)) >> 8); } if (has_shape) { @@ -2287,7 +2295,7 @@ gx_path path_ttrans; if (pcpath != NULL) { - code = gx_cpath_init_local_shared(&cpath_intersection, pcpath, ppath->memory); + code = gx_cpath_init_local_shared_nested(&cpath_intersection, pcpath, ppath->memory, 1); if (code < 0) return code; } else { @@ -2801,6 +2809,9 @@ ptempdevproto->color_info.max_components = 1; ptempdevproto->color_info.num_components = ptempdevproto->color_info.max_components; + ptempdevproto->color_info.max_gray = 255; + ptempdevproto->color_info.gray_index = 0; /* Avoid halftoning */ + ptempdevproto->color_info.dither_grays = 256; *pdevproto = ptempdevproto; break; case PDF14_DeviceRGB: @@ -3329,6 +3340,9 @@ code = pdf14_pop_transparency_group(pis, pdev->ctx, pdev->blend_procs, pdev->color_info.num_components, group_profile, (gx_device *) pdev); +#ifdef DEBUG + pdf14_debug_mask_stack_state(pdev->ctx); +#endif /* May need to reset some color stuff related * to a mismatch between the parents color space * and the group blending space */ @@ -4004,6 +4018,9 @@ if_debug0('v', "pdf14_end_transparency_mask\n"); ok = pdf14_pop_transparency_mask(pdev->ctx, pis, dev); +#ifdef DEBUG + pdf14_debug_mask_stack_state(pdev->ctx); +#endif /* May need to reset some color stuff related * to a mismatch between the Smask color space * and the Smask blending space */ @@ -4402,7 +4419,8 @@ static void pdf14_cmap_cmyk_direct(frac c, frac m, frac y, frac k, gx_device_color * pdc, - const gs_imager_state * pis, gx_device * dev, gs_color_select_t select) + const gs_imager_state * pis, gx_device * dev, gs_color_select_t select, + const gs_color_space *pcs) { int i,ncomps; frac cm_comps[GX_DEVICE_COLOR_MAX_COMPONENTS]; @@ -4528,7 +4546,8 @@ /* color mapping for when we have an smask or a isolated transparency group with another color space */ static void pdf14_cmap_cmyk_direct_group(frac c, frac m, frac y, frac k, gx_device_color * pdc, - const gs_imager_state * pis, gx_device * dev, gs_color_select_t select) + const gs_imager_state * pis, gx_device * dev, gs_color_select_t select, + const gs_color_space *pcs) { int i, ncomps = dev->color_info.num_components; frac cm_comps[GX_DEVICE_COLOR_MAX_COMPONENTS]; @@ -5733,6 +5752,9 @@ ptempdevproto->color_info.max_components = 1; ptempdevproto->color_info.num_components = ptempdevproto->color_info.max_components; + ptempdevproto->color_info.max_gray = 255; + ptempdevproto->color_info.gray_index = 0; /* Avoid halftoning */ + ptempdevproto->color_info.dither_grays = 256; *pdevproto = ptempdevproto; break; case PDF14_DeviceRGB: @@ -6876,28 +6898,20 @@ * The transfer functions will be applied at the end after we * have done our PDF 1.4 blend operations. */ - - /* - * Also if the bit depth is not 8 per channel we need to adjust - * as all the pdf14 compositing code is for 8 bits per channel. - * The clist writer device uses this information to make sure - * the proper bit depth is written. If we are using compressed - * color enconding, the color is written in a gx_color_index - * even for more than 8 components. - */ p14dev = (pdf14_clist_device *)(*pcdev); - if (cdev->clist_color_info.num_components * 8 != cdev->clist_color_info.depth && - p14dev->my_encode_color != pdf14_compressed_encode_color) { - int i = (cdev->clist_color_info.num_components); - - i += (cdev->graphics_type_tag & GS_DEVICE_ENCODES_TAGS) == 0 ? 0 : 1; - cdev->clist_color_info.depth = 8 * i; - } p14dev->saved_target_color_info = dev->color_info; dev->color_info = (*pcdev)->color_info; /* Make sure that we keep the anti-alias information though */ dev->color_info.anti_alias = p14dev->saved_target_color_info.anti_alias; p14dev->color_info.anti_alias = dev->color_info.anti_alias; + + /* adjust the clist_color_info now */ + cdev->clist_color_info.depth = p14dev->color_info.depth; + cdev->clist_color_info.polarity = p14dev->color_info.polarity; + cdev->clist_color_info.num_components = p14dev->color_info.num_components; + cdev->clist_color_info.max_color = p14dev->color_info.max_color; + cdev->clist_color_info.max_gray = p14dev->color_info.max_gray; + p14dev->saved_target_encode_color = dev->procs.encode_color; p14dev->saved_target_decode_color = dev->procs.decode_color; dev->procs.encode_color = p14dev->procs.encode_color = @@ -7261,7 +7275,7 @@ int color_component_number; byte * sep_name; - sep_name = gs_alloc_bytes(dev->memory, + sep_name = gs_alloc_bytes(dev->memory->stable_memory, name_size, "pdf14_cmykspot_get_color_comp_index"); memcpy(sep_name, pname, name_size); pseparations->names[sep_num].size = name_size; @@ -7443,3 +7457,49 @@ pdev->smaskcolor = NULL; } } + +#if DUMP_MASK_STACK + +static void +dump_mask_stack(pdf14_mask_t *mask_stack) +{ + pdf14_mask_t *curr_mask = mask_stack; + int level = 0; + + while (curr_mask != NULL) { + if_debug1('v', "[v]mask_level, %d\n", level); + if_debug1('v', "[v]mask_buf, %x\n", curr_mask->rc_mask->mask_buf); + if_debug1('v', "[v]rc_count, %d\n", curr_mask->rc_mask->rc); + level++; + curr_mask = curr_mask->previous; + } +} + +/* A function to display the current state of the mask stack */ +static void +pdf14_debug_mask_stack_state(pdf14_ctx *ctx) +{ + if_debug1('v', "[v]ctx_maskstack, %x\n", ctx->mask_stack); + if (ctx->mask_stack != NULL) { + dump_mask_stack(ctx->mask_stack); + } + if_debug1('v', "[v]ctx_stack, %x\n", ctx->stack); + if (ctx->stack != NULL) { + if_debug1('v', "[v]ctx_stack_maskstack, %x\n", ctx->stack->mask_stack); + if (ctx->stack->mask_stack != NULL) { + dump_mask_stack(ctx->stack->mask_stack); + } + } +} + +#else + +#ifdef DEBUG +static void +pdf14_debug_mask_stack_state(pdf14_ctx *ctx) +{ + return; +} +#endif + +#endif diff -Nru ghostscript-9.04~dfsg/base/gdevpbm.c ghostscript-9.05~dfsg~20120125/base/gdevpbm.c --- ghostscript-9.04~dfsg/base/gdevpbm.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpbm.c 2011-09-29 11:01:33.000000000 +0000 @@ -645,7 +645,7 @@ code = gs_note_error(gs_error_ioerror); goto punt; } - if (fprintf(pstream, "MAXVAL %d\n", pdev->color_info.max_gray) < 0) { + if (fprintf(pstream, "MAXVAL %d\n", 255) < 0) { /* force MAXVAL to 255 */ code = gs_note_error(gs_error_ioerror); goto punt; } @@ -661,8 +661,7 @@ goto punt; } } else { - if (fprintf(pstream, "# Image generated by %s (device=%s)\n", - gs_product, pdev->dname) < 0) { + if (fprintf(pstream, "# Image generated by %s\n", gs_product) < 0) { code = gs_note_error(gs_error_ioerror); goto punt; } @@ -1012,10 +1011,10 @@ byte C = *data++; for (s = 7; s >= 0; s -= 4) { - fputc((C>>s )&1, pstream); - fputc((C>>(s-1))&1, pstream); - fputc((C>>(s-2))&1, pstream); - fputc((C>>(s-3))&1, pstream); + fputc(((C>>s )&1)*0xff, pstream); + fputc(((C>>(s-1))&1)*0xff, pstream); + fputc(((C>>(s-2))&1)*0xff, pstream); + fputc(((C>>(s-3))&1)*0xff, pstream); w--; if (w == 0) break; diff -Nru ghostscript-9.04~dfsg/base/gdevpdfb.h ghostscript-9.05~dfsg~20120125/base/gdevpdfb.h --- ghostscript-9.04~dfsg/base/gdevpdfb.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdfb.h 2011-10-17 13:34:52.000000000 +0000 @@ -155,6 +155,8 @@ {-1, -1}, /* page_dsc_info */ 0 /*false*/, /* fill_overprint */ 0 /*false*/, /* stroke_overprint */ + 0 /*false*/, /* remap_fill_coilor */ + 0 /*false*/, /* remap_stroke_coilor */ 0, /* overprint_mode */ gs_no_id, /* halftone_id */ {gs_no_id, gs_no_id, gs_no_id, gs_no_id}, /* transfer_ids */ diff -Nru ghostscript-9.04~dfsg/base/gdevpdf.c ghostscript-9.05~dfsg~20120125/base/gdevpdf.c --- ghostscript-9.04~dfsg/base/gdevpdf.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdf.c 2012-01-25 08:44:24.000000000 +0000 @@ -102,9 +102,9 @@ /* we need to implement it separately because st_composite_final */ /* declares all 3 procedures as private. */ static void -device_pdfwrite_finalize(void *vpdev) +device_pdfwrite_finalize(const gs_memory_t *cmem, void *vpdev) { - gx_device_finalize(vpdev); + gx_device_finalize(cmem, vpdev); } /* Driver procedures */ @@ -994,7 +994,7 @@ } pdf_print_orientation(pdev, page); pprintld1(s, "/Parent %ld 0 R\n", pdev->Pages->id); - if (pdev->ForOPDFRead) { + if (pdev->ForOPDFRead && pdev->DoNumCopies && !pdev->ProduceDSC) { if (page->NumCopies_set) pprintld1(s, "/NumCopies %ld\n", page->NumCopies); } @@ -1049,15 +1049,29 @@ } /* Wrap up ("output") a page. */ +/* if we are doing separate pages, call pdf_close to emit the file, then */ +/* pdf_open to open the next page as a new file */ +/* NB: converting an input PDF with offpage links will generate warnings */ static int pdf_output_page(gx_device * dev, int num_copies, int flush) { gx_device_pdf *const pdev = (gx_device_pdf *) dev; int code = pdf_close_page(pdev, num_copies); - return (code < 0 ? code : - pdf_ferror(pdev) ? gs_note_error(gs_error_ioerror) : - gx_finish_output_page(dev, num_copies, flush)); + if (code < 0) + return code; + if (pdf_ferror(pdev)) + gs_note_error(gs_error_ioerror); + + if ((code = gx_finish_output_page(dev, num_copies, flush)) < 0) + return code; + + if (gx_outputfile_is_separate_pages(((gx_device_vector *)dev)->fname, dev->memory)) { + if ((code = pdf_close(dev)) < 0) + return code; + code = pdf_open(dev); + } + return code; } static int find_end_xref_section (gx_device_pdf *pdev, FILE *tfile, int64_t start, int resource_pos) diff -Nru ghostscript-9.04~dfsg/base/gdevpdfc.c ghostscript-9.05~dfsg~20120125/base/gdevpdfc.c --- ghostscript-9.04~dfsg/base/gdevpdfc.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdfc.c 2011-09-29 11:01:33.000000000 +0000 @@ -430,9 +430,9 @@ { float RGB[3]; - RGB[0] = in[0] + in[4]; - RGB[1] = in[1] + in[4]; - RGB[2] = in[2] + in[4]; + RGB[0] = in[0] + in[3]; + RGB[1] = in[1] + in[3]; + RGB[2] = in[2] + in[3]; if (RGB[0] > 1) out[0] = 0.0f; @@ -508,14 +508,23 @@ code = pdf_make_base_space_function(pdev, &new_pfn, 4, out_low, out_high); if (code < 0) return code; - if ((code = cos_array_add(pca, cos_c_string_value(&v, csname))) < 0 || - (code = cos_array_add_no_copy(pca, snames)) < 0 || - (code = (int)cos_c_string_value(&v, (const char *)pcsn->DeviceCMYK)) < 0 || - (code = cos_array_add(pca, &v)) < 0 || - (code = pdf_function_scaled(pdev, new_pfn, 0x00, &v)) < 0 || - (code = cos_array_add(pca, &v)) < 0 || - (v_attributes != NULL ? code = cos_array_add(pca, v_attributes) : 0) < 0 - ) {} + + code = cos_array_add(pca, cos_c_string_value(&v, csname)); + if (code >= 0) { + code = cos_array_add_no_copy(pca, snames); + if (code >= 0) { + cos_c_string_value(&v, (const char *)pcsn->DeviceCMYK); + code = cos_array_add(pca, &v); + if (code >= 0) { + code = pdf_function_scaled(pdev, new_pfn, 0x00, &v); + if (code >= 0) { + code = cos_array_add(pca, &v); + if (code >= 0 && v_attributes != NULL) + code = cos_array_add(pca, v_attributes); + } + } + } + } pdf_delete_base_space_function(pdev, new_pfn); return code; } @@ -543,14 +552,23 @@ code = pdf_make_base_space_function(pdev, &new_pfn, 3, out_low, out_high); if (code < 0) return code; - if ((code = cos_array_add(pca, cos_c_string_value(&v, csname))) < 0 || - (code = cos_array_add_no_copy(pca, snames)) < 0 || - (code = (int)cos_c_string_value(&v, pcsn->DeviceRGB)) < 0 || - (code = cos_array_add(pca, &v)) < 0 || - (code = pdf_function_scaled(pdev, new_pfn, 0x00, &v)) < 0 || - (code = cos_array_add(pca, &v)) < 0 || - (v_attributes != NULL ? code = cos_array_add(pca, v_attributes) : 0) < 0 - ) {} + + code = cos_array_add(pca, cos_c_string_value(&v, csname)); + if (code >= 0) { + code = cos_array_add_no_copy(pca, snames); + if (code >= 0) { + cos_c_string_value(&v, pcsn->DeviceRGB); + code = cos_array_add(pca, &v); + if (code >= 0) { + code = pdf_function_scaled(pdev, new_pfn, 0x00, &v); + if (code >= 0) { + code = cos_array_add(pca, &v); + if (code >= 0 && v_attributes != NULL) + code = cos_array_add(pca, v_attributes); + } + } + } + } pdf_delete_base_space_function(pdev, new_pfn); return code; } diff -Nru ghostscript-9.04~dfsg/base/gdevpdfd.c ghostscript-9.05~dfsg~20120125/base/gdevpdfd.c --- ghostscript-9.04~dfsg/base/gdevpdfd.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdfd.c 2012-01-25 08:44:24.000000000 +0000 @@ -494,6 +494,17 @@ public_st_pdf_lcvd_t(); static int +lcvd_copy_color_shifted(gx_device * dev, + const byte * base, int sourcex, int sraster, gx_bitmap_id id, + int x, int y, int w, int h) +{ + pdf_lcvd_t *cvd = (pdf_lcvd_t *)dev; + + return cvd->std_copy_color((gx_device *)&cvd->mdev, base, sourcex, sraster, id, + x - cvd->mdev.mapped_x, y - cvd->mdev.mapped_y, w, h); +} + +static int lcvd_fill_rectangle_shifted(gx_device *dev, int x, int y, int width, int height, gx_color_index color) { pdf_lcvd_t *cvd = (pdf_lcvd_t *)dev; @@ -832,13 +843,13 @@ s.ctm.ty = cvd->m.ty; memset(&inst, 0, sizeof(inst)); inst.saved = (gs_state *)&s; /* HACK : will use s.ctm only. */ - inst.template.PaintType = 1; - inst.template.TilingType = 1; - inst.template.BBox.p.x = inst.template.BBox.p.y = 0; - inst.template.BBox.q.x = cvd->mdev.width; - inst.template.BBox.q.y = cvd->mdev.height; - inst.template.XStep = (float)cvd->mdev.width; - inst.template.YStep = (float)cvd->mdev.height; + inst.templat.PaintType = 1; + inst.templat.TilingType = 1; + inst.templat.BBox.p.x = inst.templat.BBox.p.y = 0; + inst.templat.BBox.q.x = cvd->mdev.width; + inst.templat.BBox.q.y = cvd->mdev.height; + inst.templat.XStep = (float)cvd->mdev.width; + inst.templat.YStep = (float)cvd->mdev.height; code = (*dev_proc(pdev, dev_spec_op))((gx_device *)pdev, gxdso_pattern_start_accum, &inst, id); if (code >= 0) { @@ -980,6 +991,7 @@ return code; } } + cvd->std_copy_color = dev_proc(&cvd->mdev, copy_color); cvd->std_fill_rectangle = dev_proc(&cvd->mdev, fill_rectangle); cvd->std_close_device = dev_proc(&cvd->mdev, close_device); cvd->std_get_clipping_box = dev_proc(&cvd->mdev, get_clipping_box); @@ -992,6 +1004,7 @@ dev_proc(&cvd->mdev, fill_rectangle) = lcvd_fill_rectangle_shifted; dev_proc(&cvd->mdev, get_clipping_box) = lcvd_get_clipping_box_shifted_from_mdev; } + dev_proc(&cvd->mdev, copy_color) = lcvd_copy_color_shifted; dev_proc(&cvd->mdev, dev_spec_op) = lcvd_dev_spec_op; dev_proc(&cvd->mdev, fill_path) = lcvd_handle_fill_path_as_shading_coverage; cvd->m = *m; @@ -1150,12 +1163,12 @@ code = gdev_vector_dopath((gx_device_vector *)pdev, ppath, gx_path_type_clip, NULL); if (code >= 0) - stream_puts(pdev->strm, "W n\n"); + stream_puts(pdev->strm, (params->rule < 0 ? "W n\n" : "W* n\n")); } pdf_put_matrix(pdev, NULL, &cvd.m, " cm q\n"); cvd.write_matrix = false; if (code >= 0) - code = gs_shading_do_fill_rectangle(pi.template.Shading, + code = gs_shading_do_fill_rectangle(pi.templat.Shading, NULL, (gx_device *)&cvd.mdev, (gs_imager_state *)pgs, !pi.shfill); if (code >= 0) code = pdf_dump_converted_image(pdev, &cvd); @@ -1219,7 +1232,7 @@ if (pdf_must_put_clip_path(pdev, pcpath)) code = pdf_unclip(pdev); else if ((pdev->last_charpath_op & TEXT_DO_FALSE_CHARPATH) && ppath->current_subpath && - (ppath->last_charpath_segment == ppath->current_subpath->last)) { + (ppath->last_charpath_segment == ppath->current_subpath->last) && !pdev->ForOPDFRead) { bool hl_color = pdf_can_handle_hl_color((gx_device_vector *)pdev, pis, pdcolor); const gs_imager_state *pis_for_hl_color = (hl_color ? pis : NULL); diff -Nru ghostscript-9.04~dfsg/base/gdevpdfe.c ghostscript-9.05~dfsg~20120125/base/gdevpdfe.c --- ghostscript-9.04~dfsg/base/gdevpdfe.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdfe.c 2011-09-29 11:01:33.000000000 +0000 @@ -485,7 +485,7 @@ static void pdf_make_uuid(const byte node[6], uint64_t uuid_time, ulong time_seq, char *buf, int buf_length) { - char b[40], *p = b; + char b[45], *p = b; ulong uuid_time_lo = (ulong)(uuid_time & 0xFFFFFFFF); /* MSVC 7.1.3088 */ ushort uuid_time_md = (ushort)((uuid_time >> 32) & 0xFFFF); /* cannot compile this */ ushort uuid_time_hi = (ushort)((uuid_time >> 48) & 0x0FFF); /* as function arguments. */ @@ -521,7 +521,7 @@ memcpy(buf+5, pdev->InstanceUUID.data, l); buf[l] = 0; } else - pdf_make_uuid(digest, pdf_uuid_time(pdev), pdev->DocumentTimeSeq, buf, buf_length - 5); + pdf_make_uuid(digest, pdf_uuid_time(pdev), pdev->DocumentTimeSeq, buf + 5, buf_length - 5); return 0; } @@ -549,7 +549,7 @@ static int pdf_write_document_metadata(gx_device_pdf *pdev, const byte digest[6]) { - char instance_uuid[40], document_uuid[40], cre_date_time[40], mod_date_time[40], date_time_buf[40]; + char instance_uuid[45], document_uuid[45], cre_date_time[40], mod_date_time[40], date_time_buf[40]; int cre_date_time_len, mod_date_time_len; int code; stream *s = pdev->strm; diff -Nru ghostscript-9.04~dfsg/base/gdevpdfg.c ghostscript-9.05~dfsg~20120125/base/gdevpdfg.c --- ghostscript-9.04~dfsg/base/gdevpdfg.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdfg.c 2011-12-08 09:35:23.000000000 +0000 @@ -234,6 +234,8 @@ } pdev->fill_overprint = false; pdev->stroke_overprint = false; + pdev->remap_fill_color = false; + pdev->remap_stroke_color = false; pdf_reset_text(pdev); } @@ -417,8 +419,14 @@ else if (pdc->type == &gx_dc_pure_masked) { code = pdf_put_uncolored_pattern(pdev, pdc, pcs, ppscc, pis->have_pattern_streams, &pres); - if (code < 0 || pres == 0) + if (code < 0 || pres == 0) { + /* replaced a pattern with a flat fill, but we still + * need to change the 'saved' colour or we will + * get out of step with the PDF content. + */ + *psc = temp; return code; + } if (pis->have_pattern_streams) code = pdf_write_ccolor(pdev, pis, pcc); } else if (pdc->type == &gx_dc_pattern2) { @@ -878,6 +886,18 @@ gs_free_object(mem, values, "pdf_write_spot_function"); return code; } + +/* if (memcmp(order.levels, porder->levels, order.num_levels * sizeof(*order.levels))) */ +static int +compare_gx_ht_order_levels(const gx_ht_order *order1, const gx_ht_order *order2) { + int i; + for (i=0; inum_levels; i++) { + if (order1->levels[i] != order2->levels[i]) + return(1); + } + return(0); +} + static int pdf_write_spot_halftone(gx_device_pdf *pdev, const gs_spot_halftone *psht, const gx_ht_order *porder, long *pid) @@ -916,8 +936,7 @@ if (code < 0) continue; /* Compare the bits and levels arrays. */ - if (memcmp(order.levels, porder->levels, - order.num_levels * sizeof(*order.levels))) + if (compare_gx_ht_order_levels(&order,porder)) continue; if (memcmp(order.bit_data, porder->bit_data, order.num_bits * porder->procs->bit_data_elt_size)) diff -Nru ghostscript-9.04~dfsg/base/gdevpdfi.c ghostscript-9.05~dfsg~20120125/base/gdevpdfi.c --- ghostscript-9.04~dfsg/base/gdevpdfi.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdfi.c 2012-01-25 08:44:24.000000000 +0000 @@ -33,6 +33,7 @@ #include "gxcolor2.h" #include "gxhldevc.h" #include "gxdevsop.h" +#include "gsicc_manage.h" /* Forward references */ static image_enum_proc_plane_data(pdf_image_plane_data); @@ -130,7 +131,7 @@ gx_drawing_color *pdcolor) { if (pim4->BitsPerComponent == 1 && - pim4->ColorSpace->type->num_components == gx_num_components_1 && + pim4->ColorSpace->type->num_components(pim4->ColorSpace) == 1 && (pim4->MaskColor_is_range ? pim4->MaskColor[0] | pim4->MaskColor[1] : pim4->MaskColor[0]) <= 1 @@ -543,8 +544,18 @@ if (pim->Width == 0 || pim->Height == 0) goto nyi; /* PDF doesn't support images with more than 8 bits per component. */ - if (pim->BitsPerComponent > 8) - goto nyi; + switch (pim->BitsPerComponent) { + case 1: + case 2: + case 4: + case 8: + break; + case 12: + case 16: + goto nyi; + default: + return_error(gs_error_rangecheck); + } pcs = pim->ColorSpace; num_components = (is_mask ? 1 : gs_color_space_num_components(pcs)); @@ -657,9 +668,17 @@ */ cos_c_string_value(&cs_value, names->DeviceRGB); } else { - code = pdf_color_space_named(pdev, &cs_value, &pranges, - pcs, - names, in_line, NULL, 0); + /* A minor hack to deal with CIELAB images. */ + if (pcs->cmm_icc_profile_data != NULL && + pcs->cmm_icc_profile_data->islab) { + gscms_set_icc_range(&(pcs->cmm_icc_profile_data)); + } + code = pdf_color_space_named(pdev, &cs_value, &pranges, pcs, names, + in_line, NULL, 0); + if (pcs->cmm_icc_profile_data != NULL && + pcs->cmm_icc_profile_data->islab) { + gsicc_setrange_lab(pcs->cmm_icc_profile_data); + } if (code < 0) convert_to_process_colors = true; } @@ -1004,13 +1023,13 @@ s.ctm.ty = pmat->ty; memset(&inst, 0, sizeof(inst)); inst.saved = (gs_state *)&s; /* HACK : will use s.ctm only. */ - inst.template.PaintType = 1; - inst.template.TilingType = 1; - inst.template.BBox.p.x = inst.template.BBox.p.y = 0; - inst.template.BBox.q.x = 1; - inst.template.BBox.q.y = 1; - inst.template.XStep = 2; /* Set 2 times bigger step against artifacts. */ - inst.template.YStep = 2; + inst.templat.PaintType = 1; + inst.templat.TilingType = 1; + inst.templat.BBox.p.x = inst.templat.BBox.p.y = 0; + inst.templat.BBox.q.x = 1; + inst.templat.BBox.q.y = 1; + inst.templat.XStep = 2; /* Set 2 times bigger step against artifacts. */ + inst.templat.YStep = 2; code = (*dev_proc(pdev, dev_spec_op))((gx_device *)pdev, gxdso_pattern_start_accum, &inst, id); if (code >= 0) diff -Nru ghostscript-9.04~dfsg/base/gdevpdfk.c ghostscript-9.05~dfsg~20120125/base/gdevpdfk.c --- ghostscript-9.04~dfsg/base/gdevpdfk.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdfk.c 2012-01-07 20:18:22.000000000 +0000 @@ -79,6 +79,8 @@ dev_profile.device_profile[1] = NULL; dev_profile.device_profile[2] = NULL; dev_profile.device_profile[3] = NULL; + dev_profile.link_profile = NULL; + dev_profile.proof_profile = NULL; dev.icc_struct = &(dev_profile); for (i = 0; i < ncomp; ++i) diff -Nru ghostscript-9.04~dfsg/base/gdevpdfm.c ghostscript-9.05~dfsg~20120125/base/gdevpdfm.c --- ghostscript-9.04~dfsg/base/gdevpdfm.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdfm.c 2011-11-12 18:29:08.000000000 +0000 @@ -305,7 +305,7 @@ static const pdf_filter_names_t fnames = { PDF_FILTER_NAMES }; - const stream_template *template = + const stream_template *templat = (pdev->params.UseFlateCompression && pdev->version >= psdf_version_ll3 ? &s_zlibE_template : &s_LZWE_template); @@ -325,13 +325,13 @@ return_error(gs_error_VMerror); } } - st = s_alloc_state(mem, template->stype, + st = s_alloc_state(mem, templat->stype, "setup_pdfmark_stream_compression"); if (st == 0) return_error(gs_error_VMerror); - if (template->set_defaults) - (*template->set_defaults) (st); - if (s_add_filter(&pco->input_strm, template, st, mem) == 0) { + if (templat->set_defaults) + (*templat->set_defaults) (st); + if (s_add_filter(&pco->input_strm, templat, st, mem) == 0) { gs_free_object(mem, st, "setup_image_compression"); return_error(gs_error_VMerror); } diff -Nru ghostscript-9.04~dfsg/base/gdevpdfo.c ghostscript-9.05~dfsg~20120125/base/gdevpdfo.c --- ghostscript-9.04~dfsg/base/gdevpdfo.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdfo.c 2011-11-21 08:55:19.000000000 +0000 @@ -1372,7 +1372,7 @@ if (!pco0->stream_md5_valid) { code = hash_cos_stream(pco0, (gs_md5_state_t *)&pco0->md5, (gs_md5_byte_t *)&pco0->stream_hash, pdev); if (code < 0) - return false; + return code; pcs0->stream_md5_valid = 1; } gs_md5_append(md5, (byte *)&pco0->stream_hash, sizeof(pco0->stream_hash)); @@ -1403,7 +1403,7 @@ return false; code = cos_dict_equal(pco0, pco1, pdev); if (code < 0) - return code; + return false; if (!code) return false; return true; @@ -1650,7 +1650,7 @@ if (s == 0 || ss == 0 || buf == 0) goto fail; - ss->template = &cos_write_stream_template; + ss->templat = &cos_write_stream_template; ss->pcs = pcs; ss->pcs->stream_md5_valid = 0; gs_md5_init(&ss->pcs->md5); diff -Nru ghostscript-9.04~dfsg/base/gdevpdft.c ghostscript-9.05~dfsg~20120125/base/gdevpdft.c --- ghostscript-9.04~dfsg/base/gdevpdft.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdft.c 2011-09-29 11:01:33.000000000 +0000 @@ -210,7 +210,6 @@ pdev->FormDepth++; return pdf_make_form_dict(pdev, pparams, pis, group_dict, (cos_dict_t *)pres->object); } - pdev->FormDepth++; return 0; } @@ -219,7 +218,6 @@ { int bottom = (pdev->ResourcesBeforeUsage ? 1 : 0); - pdev->FormDepth--; if (!is_in_page(pdev)) return 0; /* corresponds to check in pdf_begin_transparency_group */ if (pdev->image_with_SMask) { @@ -237,6 +235,7 @@ int code; uint ignore; + pdev->FormDepth--; code = pdf_exit_substream(pdev); if (code < 0) return code; diff -Nru ghostscript-9.04~dfsg/base/gdevpdfu.c ghostscript-9.05~dfsg~20120125/base/gdevpdfu.c --- ghostscript-9.04~dfsg/base/gdevpdfu.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdfu.c 2011-12-08 09:35:23.000000000 +0000 @@ -45,11 +45,13 @@ #endif #include "opdfread.h" -#include "gs_agl.h" +#include "gdevagl.h" #include "gs_mgl_e.h" #include "gs_mro_e.h" -/* Define the size of internal stream buffers. */ +extern single_glyph_list_t *SingleGlyphList; + + /* Define the size of internal stream buffers. */ /* (This is not a limitation, it only affects performance.) */ #define sbuf_size 512 @@ -334,13 +336,18 @@ } while (1); if (HaveTrueTypes) { - index = 0; - do { - if (gs_agl_ps[index] == 0x00) - break; - stream_write(s, gs_agl_ps[index], strlen(gs_agl_ps[index])); - index++; - } while (1); + char Buffer[256]; + single_glyph_list_t *entry = (single_glyph_list_t *)&SingleGlyphList; + + sprintf(Buffer, "/AdobeGlyphList mark\n"); + stream_write(s, Buffer, strlen(Buffer)); + while (entry->Glyph) { + sprintf(Buffer, "/%s 16#%04x\n", entry->Glyph, entry->Unicode); + stream_write(s, Buffer, strlen(Buffer)); + entry++; + }; + sprintf(Buffer, ".dicttomark readonly def\n"); + stream_write(s, Buffer, strlen(Buffer)); index = 0; do { @@ -870,47 +877,47 @@ return code; pdev->strm = s; if (pdev->compression == pdf_compress_Flate) { /* Set up the Flate filter. */ - const stream_template *template; + const stream_template *templat; stream *es; byte *buf; compression_filter_state *st; if (!pdev->binary_ok) { /* Set up the A85 filter */ - const stream_template *template = &s_A85E_template; + const stream_template *templat2 = &s_A85E_template; stream *as = s_alloc(pdev->pdf_memory, "PDF contents stream"); byte *buf = gs_alloc_bytes(pdev->pdf_memory, sbuf_size, "PDF contents buffer"); stream_A85E_state *ast = gs_alloc_struct(pdev->pdf_memory, stream_A85E_state, - template->stype, "PDF contents state"); + templat2->stype, "PDF contents state"); if (as == 0 || ast == 0 || buf == 0) return_error(gs_error_VMerror); s_std_init(as, buf, sbuf_size, &s_filter_write_procs, s_mode_write); ast->memory = pdev->pdf_memory; - ast->template = template; + ast->templat = templat2; as->state = (stream_state *) ast; - as->procs.process = template->process; + as->procs.process = templat2->process; as->strm = s; - (*template->init) ((stream_state *) ast); + (*templat2->init) ((stream_state *) ast); pdev->strm = s = as; } - template = &compression_filter_template; + templat = &compression_filter_template; es = s_alloc(pdev->pdf_memory, "PDF compression stream"); buf = gs_alloc_bytes(pdev->pdf_memory, sbuf_size, "PDF compression buffer"); st = gs_alloc_struct(pdev->pdf_memory, compression_filter_state, - template->stype, "PDF compression state"); + templat->stype, "PDF compression state"); if (es == 0 || st == 0 || buf == 0) return_error(gs_error_VMerror); s_std_init(es, buf, sbuf_size, &s_filter_write_procs, s_mode_write); st->memory = pdev->pdf_memory; - st->template = template; + st->templat = templat; es->state = (stream_state *) st; - es->procs.process = template->process; + es->procs.process = templat->process; es->strm = s; - (*template->set_defaults) ((stream_state *) st); - (*template->init) ((stream_state *) st); + (*templat->set_defaults) ((stream_state *) st); + (*templat->init) ((stream_state *) st); pdev->strm = s = es; } } @@ -1898,7 +1905,26 @@ oct += str[i+3] - 0x30; i+=3; } else { - oct = str[++i]; + switch (str[++i]) { + case 'b' : + oct = 8; + break; + case 't' : + oct = 9; + break; + case 'n' : + oct = 10; + break; + case 'f' : + oct = 12; + break; + case 'r' : + oct = 13; + break; + default: + oct = str[i]; + break; + } } if (width > 252 && pdev->ForOPDFRead && pdev->ProduceDSC) { stream_write(pdev->strm, "\n", 1); @@ -2074,10 +2100,10 @@ for (; fs != 0; fs = fs->strm) { const stream_state *st = fs->state; - const stream_template *template = st->template; + const stream_template *templat = st->templat; #define TEMPLATE_IS(atemp)\ - (template->process == (atemp).process) + (templat->process == (atemp).process) if (TEMPLATE_IS(s_A85E_template)) binary_ok = false; else if (TEMPLATE_IS(s_CFE_template)) { @@ -2172,16 +2198,16 @@ static int pdf_flate_binary(gx_device_pdf *pdev, psdf_binary_writer *pbw) { - const stream_template *template = (pdev->CompatibilityLevel < 1.3 ? + const stream_template *templat = (pdev->CompatibilityLevel < 1.3 ? &s_LZWE_template : &s_zlibE_template); - stream_state *st = s_alloc_state(pdev->pdf_memory, template->stype, + stream_state *st = s_alloc_state(pdev->pdf_memory, templat->stype, "pdf_write_function"); if (st == 0) return_error(gs_error_VMerror); - if (template->set_defaults) - template->set_defaults(st); - return psdf_encode_binary(pbw, template, st); + if (templat->set_defaults) + templat->set_defaults(st); + return psdf_encode_binary(pbw, templat, st); } /* diff -Nru ghostscript-9.04~dfsg/base/gdevpdfv.c ghostscript-9.05~dfsg~20120125/base/gdevpdfv.c --- ghostscript-9.04~dfsg/base/gdevpdfv.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdfv.c 2011-11-12 18:29:08.000000000 +0000 @@ -199,7 +199,7 @@ pdf_store_pattern1_params(gx_device_pdf *pdev, pdf_resource_t *pres, gs_pattern1_instance_t *pinst) { - gs_pattern1_template_t *t = &pinst->template; + gs_pattern1_template_t *t = &pinst->templat; gs_matrix smat2 = ctm_only((gs_imager_state *)pinst->saved), smat; double scale_x = pdev->HWResolution[0] / 72.0; double scale_y = pdev->HWResolution[1] / 72.0; @@ -226,7 +226,7 @@ * form is nested inside a form, the default space is the space of the * first form, and therefore we do *not* remove the resolution scaling. */ - if (pdev->FormDepth <= 1) { + if (pdev->FormDepth == 0) { gs_matrix scaled; gs_make_scaling(1 / scale_x, 1 / scale_y, &scaled); @@ -903,7 +903,7 @@ { const gs_pattern2_instance_t *pinst = (gs_pattern2_instance_t *)pdc->ccolor.pattern; - const gs_shading_t *psh = pinst->template.Shading; + const gs_shading_t *psh = pinst->templat.Shading; cos_value_t v; pdf_resource_t *pres; pdf_resource_t *psres; @@ -949,7 +949,7 @@ gs_currentmatrix(pinst->saved, &smat); { double xscale = 1.0, yscale = 1.0; - if (pdev->FormDepth <= 1) { + if (pdev->FormDepth == 0) { xscale = 72.0 / pdev->HWResolution[0]; yscale = 72.0 / pdev->HWResolution[1]; } diff -Nru ghostscript-9.04~dfsg/base/gdevpdfx.h ghostscript-9.05~dfsg~20120125/base/gdevpdfx.h --- ghostscript-9.04~dfsg/base/gdevpdfx.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdfx.h 2012-01-07 20:18:22.000000000 +0000 @@ -496,6 +496,7 @@ pdf_page_dsc_info_t page_dsc_info; /* current page */ /* Additional graphics state */ bool fill_overprint, stroke_overprint; + bool remap_fill_color, remap_stroke_color; int overprint_mode; gs_id halftone_id; gs_id transfer_ids[4]; @@ -993,6 +994,7 @@ gx_device_memory mdev; gx_device_memory *mask; gx_device_pdf *pdev; + dev_t_proc_copy_color((*std_copy_color), gx_device); dev_t_proc_fill_rectangle((*std_fill_rectangle), gx_device); dev_t_proc_close_device((*std_close_device), gx_device); dev_t_proc_get_clipping_box((*std_get_clipping_box), gx_device); diff -Nru ghostscript-9.04~dfsg/base/gdevpdtb.c ghostscript-9.05~dfsg~20120125/base/gdevpdtb.c --- ghostscript-9.04~dfsg/base/gdevpdtb.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdtb.c 2011-11-21 09:14:46.000000000 +0000 @@ -46,6 +46,78 @@ #define SUBSET_PREFIX_SIZE 7 /* XXXXXX+ */ +typedef struct pdf_base14_font_info_s { + const char *urwname; + const char *stdname; +} pdf_base14_font_info_t; + +static const pdf_base14_font_info_t base14_font_info[] = { + /* Standard mapping of URW fonts */ + {"NimbusMonL-Regu", "Courier" }, + {"NimbusMonL-Bold", "Courier-Bold" }, + {"NimbusMonL-ReguObli", "Courier-Oblique" }, + {"NimbusMonL-BoldObli", "Courier-BoldOblique" }, + {"NimbusSanL-Regu", "Helvetica" }, + {"NimbusSanL-Bold", "Helvetica-Bold" }, + {"NimbusSanL-ReguItal", "Helvetica-Oblique" }, + {"NimbusSanL-BoldItal", "Helvetica-BoldOblique"}, + {"StandardSymL", "Symbol" }, + {"NimbusRomNo9L-Regu", "Times-Roman" }, + {"NimbusRomNo9L-Medi", "Times-Bold" }, + {"NimbusRomNo9L-ReguItal","Times-Italic" }, + {"NimbusRomNo9L-MediItal","Times-BoldItalic" }, + {"Dingbats", "ZapfDingbats" }, + /* A few other mappings of URW fonts */ + {"NimbusMono-Reg", "Courier" }, + {"NimbusMono-Bol", "Courier-Bold" }, + {"NimbusMono-Ita", "Courier-Oblique" }, + {"NimbusMono-BolIta", "Courier-BoldOblique" }, + {"NimbusSan-Reg", "Helvetica" }, + {"NimbusSan-Bol", "Helvetica-Bold" }, + {"NimbusSan-Ita", "Helvetica-Oblique" }, + {"NimbusSan-BolIta", "Helvetica-BoldOblique"}, + {"A030-Reg", "Helvetica" }, + {"A030-Bol", "Helvetica-Bold" }, + {"A030-Ita", "Helvetica-Oblique" }, + {"A030-BolIta", "Helvetica-BoldOblique"}, + {"NimbusSanNo2-Reg", "Helvetica" }, + {"NimbusSanNo2-Bol", "Helvetica-Bold" }, + {"NimbusSanNo2-Ita", "Helvetica-Oblique" }, + {"NimbusSanNo2-BolIta", "Helvetica-BoldOblique"}, + {"NimbusRomanNo4-Lig", "Times-Roman" }, + {"NimbusRomanNo4-Bol", "Times-Bold" }, + {"NimbusRomanNo4-LigIta", "Times-Italic" }, + {"NimbusRomanNo4-BolIta", "Times-BoldItalic" }, + {"NimbusRomanNo9-Reg", "Times-Roman" }, + {"NimbusRomanNo9-Med", "Times-Bold" }, + {"NimbusRomanNo9-Ita", "Times-Italic" }, + {"NimbusRomanNo9-MedIta", "Times-BoldItalic" }, + {"NimbusRom-Reg", "Times-Roman" }, + {"NimbusRom-Med", "Times-Bold" }, + {"NimbusRom-Ita", "Times-Italic" }, + {"NimbusRom-MedIta", "Times-BoldItalic" }, + {"NimbusRomNo9-Reg", "Times-Roman" }, + {"NimbusRomNo9-Bol", "Times-Bold" }, + {"NimbusRomNo9-Ita", "Times-Italic" }, + {"NimbusRomNo9-MedIta", "Times-BoldItalic" }, + {0} +}; + +/* Given a pointer to a font name, return a pointer to an + * equivalent base 14 font name, of NULL if there is no + * equivalent. + */ +const char *pdf_find_base14_name(const byte *str, uint size) +{ + const pdf_base14_font_info_t *ppsf; + + for (ppsf = base14_font_info; ppsf->urwname; ++ppsf) + if (!memcmp(ppsf->urwname, (const char *)str, size)) + return ppsf->stdname; + return NULL; +} + + /* * Determine whether a font is a subset font by examining the name. */ diff -Nru ghostscript-9.04~dfsg/base/gdevpdtb.h ghostscript-9.05~dfsg~20120125/base/gdevpdtb.h --- ghostscript-9.04~dfsg/base/gdevpdtb.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdtb.h 2011-11-12 18:29:08.000000000 +0000 @@ -153,4 +153,6 @@ void pdf_set_FontFile_object(pdf_base_font_t *bfont, cos_dict_t *pcd); const cos_dict_t * pdf_get_FontFile_object(pdf_base_font_t *bfont); +const char *pdf_find_base14_name(const byte *str, uint size); + #endif /* gdevpdtb_INCLUDED */ diff -Nru ghostscript-9.04~dfsg/base/gdevpdtd.c ghostscript-9.05~dfsg~20120125/base/gdevpdtd.c --- ghostscript-9.04~dfsg/base/gdevpdtd.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdtd.c 2011-12-08 09:35:23.000000000 +0000 @@ -155,18 +155,27 @@ /* Write the common part of a FontDescriptor, aside from the final >>. */ static int write_FontDescriptor_common(gx_device_pdf *pdev, - const pdf_font_descriptor_common_t *pfd) + const pdf_font_descriptor_common_t *pfd, bool embed) { stream *s; int code; param_printer_params_t params; printer_param_list_t rlist; gs_param_list *const plist = (gs_param_list *)&rlist; + char *base14_name = NULL; pdf_open_separate(pdev, pdf_font_descriptor_common_id(pfd), resourceFontDescriptor); s = pdev->strm; stream_puts(s, "<values.FontName.data, pfd->values.FontName.size); + if (!embed) { + base14_name = (char *)pdf_find_base14_name(pfd->values.FontName.data, pfd->values.FontName.size); + if(base14_name) + pdf_put_name(pdev, (byte *)base14_name, strlen(base14_name)); + else + pdf_put_name(pdev, pfd->values.FontName.data, pfd->values.FontName.size); + } else + pdf_put_name(pdev, pfd->values.FontName.data, pfd->values.FontName.size); + pdf_write_font_bbox(pdev, &pfd->values.FontBBox); params = param_printer_params_default; code = s_init_param_printer(&rlist, ¶ms, s); @@ -194,6 +203,9 @@ int Flags = pfd->values.Flags; pdf_font_descriptor_t defaults; + if (base14_name) + Flags |=FONT_USES_STANDARD_ENCODING; + code = param_write_int(plist, "Flags", &Flags); if (code < 0) return code; @@ -646,7 +658,7 @@ ) fd.values.Flags = (fd.values.Flags & ~(FONT_IS_ADOBE_ROMAN)) | FONT_IS_SYMBOLIC; - code = write_FontDescriptor_common(pdev, &fd); + code = write_FontDescriptor_common(pdev, &fd, pfd->embed); } if (code < 0) return code; @@ -728,8 +740,8 @@ /* Save the simple font descriptor data because CID font data overlap them. */ int FirstChar = pdfont->u.simple.FirstChar, LastChar = pdfont->u.simple.LastChar; pdf_encoding_element_t *Encoding = pdfont->u.simple.Encoding; - int length_CIDSet = (pbfont->num_glyphs > LastChar ? (pbfont->num_glyphs + 7) / 8 : (LastChar + 7 / 8)); - int length_CIDToGIDMap = (pbfont->num_glyphs > LastChar ? pbfont->num_glyphs * sizeof(ushort) : LastChar * sizeof(ushort)); + int length_CIDSet = (pbfont->num_glyphs > LastChar ? (pbfont->num_glyphs + 7) / 8 : ((LastChar + 1) + 7 / 8)); + int length_CIDToGIDMap = (pbfont->num_glyphs > LastChar ? pbfont->num_glyphs * sizeof(ushort) : (LastChar + 1) * sizeof(ushort)); pfd->FontType = ft_CID_TrueType; pdfont->u.simple.Encoding = NULL; /* Drop due to overlapping against a garbager problem. */ diff -Nru ghostscript-9.04~dfsg/base/gdevpdti.c ghostscript-9.05~dfsg~20120125/base/gdevpdti.c --- ghostscript-9.04~dfsg/base/gdevpdti.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdti.c 2011-12-08 09:35:23.000000000 +0000 @@ -889,8 +889,7 @@ continue; /* Need same Encoding to generate a proper ToUnicode. */ if (pdfont->u.simple.s.type3.bitmap_font != pcpo->font->u.simple.s.type3.bitmap_font) continue; - if (memcmp(&pdfont->u.simple.s.type3.FontMatrix, &pcpo->font->u.simple.s.type3.FontMatrix, - sizeof(pdfont->u.simple.s.type3.FontMatrix))) + if (gs_matrix_compare(&pdfont->u.simple.s.type3.FontMatrix, &pcpo->font->u.simple.s.type3.FontMatrix)) continue; if (data->cgp != NULL) { if (!pdf_check_encoding_compatibility(pcpo->font, data->cgp->s, data->cgp->num_all_chars)) diff -Nru ghostscript-9.04~dfsg/base/gdevpdts.c ghostscript-9.05~dfsg~20120125/base/gdevpdts.c --- ghostscript-9.04~dfsg/base/gdevpdts.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdts.c 2011-12-08 09:35:23.000000000 +0000 @@ -433,7 +433,7 @@ /* * Transition from string context to text context. */ -static int +int sync_text_state(gx_device_pdf *pdev) { pdf_text_state_t *pts = pdev->text->text_state; @@ -475,7 +475,7 @@ return code; } - if (memcmp(&pts->in.matrix, &pts->out.matrix, sizeof(pts->in.matrix)) || + if (gs_matrix_compare(&pts->in.matrix, &pts->out.matrix) || ((pts->start.x != pts->out_pos.x || pts->start.y != pts->out_pos.y) && (pts->buffer.count_chars != 0 || pts->buffer.count_moves != 0))) { /* pdf_set_text_matrix sets out.matrix = in.matrix */ @@ -571,8 +571,7 @@ pts->in.render_mode == ptsv->render_mode && pts->in.word_spacing == ptsv->word_spacing ) { - if (!memcmp(&pts->in.matrix, &ptsv->matrix, - sizeof(pts->in.matrix))) + if (!gs_matrix_compare(&pts->in.matrix, &ptsv->matrix)) return 0; /* add_text_delta_move sets pts->in.matrix if successful */ code = add_text_delta_move(pdev, &ptsv->matrix); diff -Nru ghostscript-9.04~dfsg/base/gdevpdts.h ghostscript-9.05~dfsg~20120125/base/gdevpdts.h --- ghostscript-9.04~dfsg/base/gdevpdts.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdts.h 2011-10-17 13:34:52.000000000 +0000 @@ -134,4 +134,5 @@ int pdf_set_PaintType0_params (gx_device_pdf *pdev, gs_imager_state *pis, float size, double scaled_width, const pdf_text_state_values_t *ptsv); +int sync_text_state(gx_device_pdf *pdev); #endif /* gdevpdts_INCLUDED */ diff -Nru ghostscript-9.04~dfsg/base/gdevpdtt.c ghostscript-9.05~dfsg~20120125/base/gdevpdtt.c --- ghostscript-9.04~dfsg/base/gdevpdtt.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdtt.c 2012-01-07 20:18:22.000000000 +0000 @@ -275,7 +275,7 @@ penum->charproc_accum = false; } } - if (pdev->PS_accumulator) { + if (pdev->PS_accumulator && penum->pte_default) { if (penum->pte_default->text.operation & TEXT_DO_CHARWIDTH /* See process_cmap_text.*/) return gs_text_set_cache(penum->pte_default, pw, TEXT_SET_CHAR_WIDTH); else @@ -323,15 +323,85 @@ pdf_text_release }; +/* Ideally we would set the stroke and fill colours in pdf_prepare_text_drawing + * but this is called from pdf_process_text, not pdf_begin_text. The problem is + * that if we get a pattern colour we need to exit to the interpreter and run + * the PaintProc, we do this by retunring e_ReampColor. But the 'process' routines + * aren't set up to accept this, and just throw an error. Trying to rework the + * interpreter routines began turning into a gigantic task, so I chose instead + * to 'set' the colours here, which is called from text_begin, where the code + * allows us to return e_RemapColor. Attempting to write the colour to the PDF file + * in this routine as well caused trouble keeping the graphics states synchronised, + * so this functionality was left in pdf_prepare_text_drawing. + */ +static int +pdf_prepare_text_color(gx_device_pdf *const pdev, gs_imager_state *pis, const gs_text_params_t *text, gs_font *font) +{ + int code=0; + if (text->operation & TEXT_DO_DRAW) { + gs_state *pgs = (gs_state *)pis; + if (!pdev->ForOPDFRead) { + if (pis->text_rendering_mode != 3 && pis->text_rendering_mode != 7) { + if (font->PaintType == 2) { + /* Bit awkward, if the PaintType is 2 then we want to set the + * current ie 'fill' colour, but as a stroke colour because we + * will later change the text rendering mode to 1 (stroke). + */ + code = gx_set_dev_color(pgs); + if (code != 0) + return code; + code = pdf_set_drawing_color(pdev, pis, pgs->color[0].dev_color, &pdev->saved_stroke_color, + &pdev->stroke_used_process_color, + &psdf_set_stroke_color_commands); + if (code < 0) + return code; + } else { + if ((pis->text_rendering_mode == 0 || pis->text_rendering_mode == 2 || + pis->text_rendering_mode == 4 || pis->text_rendering_mode == 6) && + !pdev->remap_stroke_color) { + code = gx_set_dev_color(pgs); + if (code != 0) + return code; + } + if (pis->text_rendering_mode == 1 || pis->text_rendering_mode == 2 || + pis->text_rendering_mode == 5 || pis->text_rendering_mode == 6) { + if (!pdev->remap_fill_color) { + if (pdev->remap_stroke_color) { + pdev->remap_stroke_color = false; + } else { + gs_swapcolors_quick(pgs); + code = gx_set_dev_color(pgs); + if (code == gs_error_Remap_Color) + pdev->remap_stroke_color = true; + if (code != 0) + return code; + } + } else + pdev->remap_fill_color = false; + gs_swapcolors_quick(pgs); + code = gx_set_dev_color(pgs); + if (code == gs_error_Remap_Color) + pdev->remap_fill_color = true; + if (code != 0) + return code; + } + } + } + } + } + return code; +} + static int pdf_prepare_text_drawing(gx_device_pdf *const pdev, gs_text_enum_t *pte) { gs_imager_state * pis = pte->pis; - const gx_device_color * pdcolor = pte->pdcolor; + gs_state *pgs = (gs_state *)pis; const gx_clip_path * pcpath = pte->pcpath; const gs_text_params_t *text = &pte->text; bool new_clip = false; /* Quiet compiler. */ int code; + gs_font *font = pte->current_font; if (!(text->operation & TEXT_DO_NONE) || pis->text_rendering_mode == 3) { new_clip = pdf_must_put_clip_path(pdev, pcpath); @@ -362,16 +432,65 @@ return code; } - if ((code = - pdf_set_drawing_color(pdev, pis, pdcolor, &pdev->saved_stroke_color, - &pdev->stroke_used_process_color, - &psdf_set_stroke_color_commands)) < 0 || - (code = - pdf_set_drawing_color(pdev, pis, pdcolor, &pdev->saved_fill_color, - &pdev->fill_used_process_color, - &psdf_set_fill_color_commands)) < 0 - ) - return code; + if (!pdev->ForOPDFRead) { + if (pis->text_rendering_mode != 3 && pis->text_rendering_mode != 7) { + if (font->PaintType == 2) { + /* Bit awkward, if the PaintType is 2 then we want to set the + * current ie 'fill' colour, but as a stroke colour because we + * will later change the text rendering mode to 1 (stroke). + */ + code = gx_set_dev_color(pgs); + if (code != 0) + return code; + code = pdf_set_drawing_color(pdev, pis, pgs->color[0].dev_color, &pdev->saved_stroke_color, + &pdev->stroke_used_process_color, + &psdf_set_stroke_color_commands); + if (code < 0) + return code; + } else { + if (pis->text_rendering_mode == 0 || pis->text_rendering_mode == 2 || + pis->text_rendering_mode == 4 || pis->text_rendering_mode == 6) { + code = gx_set_dev_color(pgs); + if (code != 0) + return code; + code = pdf_set_drawing_color(pdev, pis, pgs->color[0].dev_color, &pdev->saved_fill_color, + &pdev->fill_used_process_color, + &psdf_set_fill_color_commands); + if (code < 0) + return code; + } + if (pis->text_rendering_mode == 1 || pis->text_rendering_mode == 2 || + pis->text_rendering_mode == 5 || pis->text_rendering_mode == 6) { + gs_swapcolors_quick(pgs); + code = gx_set_dev_color(pgs); + if (code != 0) + return code; + code = pdf_set_drawing_color(pdev, pis, pgs->color[0].dev_color, &pdev->saved_stroke_color, + &pdev->stroke_used_process_color, + &psdf_set_stroke_color_commands); + if (code < 0) + return code; + + gs_swapcolors_quick(pgs); + } + } + } + } else { + code = gx_set_dev_color(pgs); + if (code != 0) + return code; + + if ((code = + pdf_set_drawing_color(pdev, pis, pgs->color[0].dev_color, &pdev->saved_stroke_color, + &pdev->stroke_used_process_color, + &psdf_set_stroke_color_commands)) < 0 || + (code = + pdf_set_drawing_color(pdev, pis, pgs->color[0].dev_color, &pdev->saved_fill_color, + &pdev->fill_used_process_color, + &psdf_set_fill_color_commands)) < 0 + ) + return code; + } } return 0; } @@ -459,7 +578,8 @@ if (!user_defined || !(text->operation & TEXT_DO_ANY_CHARPATH)) { if (user_defined && - (text->operation & TEXT_DO_NONE) && (text->operation & TEXT_RETURN_WIDTH)) { + (text->operation & TEXT_DO_NONE) && (text->operation & TEXT_RETURN_WIDTH) + && pis->text_rendering_mode != 3) { /* This is stringwidth, see gx_default_text_begin. * We need to prevent writing characters to PS cache, * otherwise the font converts to bitmaps. @@ -478,6 +598,12 @@ pcpath, mem, ppte); } + if (!pdev->ForOPDFRead) { + code = pdf_prepare_text_color(pdev, pis, text, font); + if (code != 0) + return code; + } + /* Allocate and initialize the enumerator. */ rc_alloc_struct_1(penum, pdf_text_enum_t, &st_pdf_text_enum, mem, @@ -614,7 +740,7 @@ *num_widths = *num_chars = 256; /* Assuming access to glyph_usage by character codes */ break; case ft_CID_encrypted: - *num_widths = *num_chars = ((gs_font_cid0 *)font)->cidata.common.CIDCount; + *num_widths = *num_chars = ((gs_font_cid0 *)font)->cidata.common.MaxCID + 1; break; case ft_CID_TrueType: *num_widths = *num_chars = ((gs_font_cid2 *)font)->cidata.common.CIDCount; @@ -1193,10 +1319,26 @@ bfont->nearest_encoding_index, true); pdfont->u.simple.s.type3.char_procs = NULL; pdfont->u.simple.s.type3.cached = cached; - pdfont->u.simple.s.type3.FontBBox.p.x = bfont->FontBBox.p.x; - pdfont->u.simple.s.type3.FontBBox.p.y = bfont->FontBBox.p.y; - pdfont->u.simple.s.type3.FontBBox.q.x = bfont->FontBBox.q.x; - pdfont->u.simple.s.type3.FontBBox.q.y = bfont->FontBBox.q.y; + if (pdfont->FontType == ft_user_defined && bfont->FontBBox.p.x == 0.0 && + bfont->FontBBox.p.y == 0.00 && bfont->FontBBox.q.x == 0.00 && + bfont->FontBBox.q.y == 0.0) { + /* I think this can only happen with a type 3 (bitmap) font from PCL. + * If we leave the BBox as 0 then we end up putting a 0 0 1000 1000 in + * the PDF. This causes Acrobat to be unable to search or highlight + * the search results. I think that we will always get a consistent + * type of font from the PCL interpreter, and if so the correct BBox + * sould always is 0 0 1 -1. + */ + pdfont->u.simple.s.type3.FontBBox.p.x = 0; + pdfont->u.simple.s.type3.FontBBox.p.y = 0; + pdfont->u.simple.s.type3.FontBBox.q.x = 1; + pdfont->u.simple.s.type3.FontBBox.q.y = -1; + } else { + pdfont->u.simple.s.type3.FontBBox.p.x = bfont->FontBBox.p.x; + pdfont->u.simple.s.type3.FontBBox.p.y = bfont->FontBBox.p.y; + pdfont->u.simple.s.type3.FontBBox.q.x = bfont->FontBBox.q.x; + pdfont->u.simple.s.type3.FontBBox.q.y = bfont->FontBBox.q.y; + } pdfont->u.simple.s.type3.FontMatrix = bfont->FontMatrix; pdfont->u.simple.s.type3.Resources = cos_dict_alloc(pdev, "pdf_make_font3_resource"); if (pdfont->u.simple.s.type3.Resources == NULL) @@ -2278,6 +2420,12 @@ float save_width = pis->line_params.half_width; int code; + if (pdev->context == PDF_IN_STRING) { + code = sync_text_state(pdev); + if (code < 0) + return code; + } + code = pdf_open_contents(pdev, PDF_IN_STRING); if (code < 0) return code; @@ -2286,6 +2434,7 @@ if (code >= 0) code = gdev_vector_prepare_stroke((gx_device_vector *)pdev, pis, NULL, NULL, 1); + pis->line_params.half_width = save_width; if (code < 0) return code; diff -Nru ghostscript-9.04~dfsg/base/gdevpdtw.c ghostscript-9.05~dfsg~20120125/base/gdevpdtw.c --- ghostscript-9.04~dfsg/base/gdevpdtw.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpdtw.c 2011-11-12 18:29:08.000000000 +0000 @@ -558,6 +558,7 @@ { stream *s; cos_dict_t *pcd_Resources = NULL; + char *base14_name = NULL; if (pdfont->cmap_ToUnicode != NULL && pdfont->res_ToUnicode == NULL) if (pdfont->FontType == ft_composite || @@ -594,7 +595,11 @@ stream_puts(s, "<<"); if (pdfont->BaseFont.size > 0) { stream_puts(s, "/BaseFont"); - pdf_put_name(pdev, pdfont->BaseFont.data, pdfont->BaseFont.size); + if (pdfont->FontDescriptor && !pdf_font_descriptor_embedding(pdfont->FontDescriptor) + && (base14_name = (char *)pdf_find_base14_name((byte *)pdfont->BaseFont.data, (unsigned int)pdfont->BaseFont.size))) + pdf_put_name(pdev, (byte *)base14_name, (unsigned int)strlen(base14_name)); + else + pdf_put_name(pdev, (byte *)pdfont->BaseFont.data, pdfont->BaseFont.size); } if (pdfont->FontDescriptor) pprintld1(s, "/FontDescriptor %ld 0 R", diff -Nru ghostscript-9.04~dfsg/base/gdevperm.c ghostscript-9.05~dfsg~20120125/base/gdevperm.c --- ghostscript-9.04~dfsg/base/gdevperm.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevperm.c 2011-11-12 18:29:08.000000000 +0000 @@ -312,14 +312,15 @@ perm_encode_color(gx_device *dev, const gx_color_value colors[]) { int bpc = 8; - int drop = sizeof(gx_color_value) * 8 - bpc; gx_color_index color = 0; int i = 0; int ncomp = dev->color_info.num_components; + COLROUND_VARS; + COLROUND_SETUP(bpc); for (; i> drop); + color |= COLROUND_ROUND(colors[i]); } return (color == gx_no_color_index ? color ^ 1 : color); } @@ -335,9 +336,11 @@ int mask = (1 << bpc) - 1; int i = 0; int ncomp = dev->color_info.num_components; + COLDUP_VARS; + COLDUP_SETUP(bpc); for (; i>= bpc; } return 0; diff -Nru ghostscript-9.04~dfsg/base/gdevphex.c ghostscript-9.05~dfsg~20120125/base/gdevphex.c --- ghostscript-9.04~dfsg/base/gdevphex.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevphex.c 2011-09-29 11:01:33.000000000 +0000 @@ -925,8 +925,8 @@ static int photoex_open( gx_device *pdev ); static int photoex_print_page( PDEV *dev, FILE *prn_stream ); -static CINX photoex_map_rgb_color( DEV *dev, CVAL r, CVAL g, CVAL b ); -static int photoex_map_color_rgb( DEV *dev, CINX index, CVAL prgb[3] ); +static CINX photoex_map_rgb_color( DEV *dev, const CVAL prgb[] ); +static int photoex_map_color_rgb( DEV *dev, CINX index, CVAL prgb[] ); static int photoex_get_params( DEV *dev, PLIST *plist ); static int photoex_put_params( DEV *dev, PLIST *plist ); @@ -1004,7 +1004,7 @@ * define here are the photoex_ functions. */ -static gx_device_procs photoex_device_procs = prn_color_params_procs( +static const gx_device_procs photoex_device_procs = prn_color_params_procs( photoex_open, /* Opens the device */ gdev_prn_output_page, @@ -1366,8 +1366,9 @@ * color_index being at least 32 bit !!! */ -static CINX photoex_map_rgb_color( DEV *dev, CVAL r, CVAL g, CVAL b ) +static CINX photoex_map_rgb_color( DEV *dev, const CVAL prgb[] ) { +CVAL r = prgb[0], g = prgb[1], b = prgb[2]; int c, y, m, k; int a, s, f; EDEV *edev; @@ -1433,7 +1434,7 @@ * It does not do any ink transfer compensation, colour compensation etc. */ -static int photoex_map_color_rgb( DEV *dev, CINX index, CVAL prgb[3] ) +static int photoex_map_color_rgb( DEV *dev, CINX index, CVAL prgb[] ) { uint c, m, y, k; CVAL r, g, b; @@ -2355,7 +2356,7 @@ RAWLINE *line ) { byte bits; -char *result; +byte *result; int i, j, k; result = line->data; diff -Nru ghostscript-9.04~dfsg/base/gdevpipe.c ghostscript-9.05~dfsg~20120125/base/gdevpipe.c --- ghostscript-9.04~dfsg/base/gdevpipe.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpipe.c 2011-09-29 11:01:33.000000000 +0000 @@ -17,7 +17,6 @@ #include "pipe_.h" #include "stdio_.h" #include "string_.h" -#include "gserror.h" #include "gserrors.h" #include "gstypes.h" #include "gsmemory.h" /* for gxiodev.h */ diff -Nru ghostscript-9.04~dfsg/base/gdevplan.c ghostscript-9.05~dfsg~20120125/base/gdevplan.c --- ghostscript-9.04~dfsg/base/gdevplan.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevplan.c 2011-11-12 18:29:08.000000000 +0000 @@ -52,12 +52,12 @@ #define Y_DPI 600 /* For all but mono, we need our own color mapping and alpha procedures. */ -static dev_proc_map_color_rgb(plan_map_color_rgb); -static dev_proc_map_rgb_color(plang_map_rgb_color); -static dev_proc_map_color_rgb(plang_map_color_rgb); -static dev_proc_map_rgb_color(planc_map_rgb_color); -static dev_proc_map_color_rgb(planc_map_color_cmyk); -static dev_proc_map_cmyk_color(planc_map_cmyk_color); +static dev_proc_decode_color(plan_decode_color); +static dev_proc_encode_color(plang_encode_color); +static dev_proc_decode_color(plang_decode_color); +static dev_proc_encode_color(planc_encode_color); +static dev_proc_decode_color(planc_decode_color); +static dev_proc_map_color_rgb(planc_map_color_rgb); static dev_proc_open_device(plan_open); static dev_proc_close_device(plan_close); @@ -74,14 +74,14 @@ /* The device procedures */ /* See gdevprn.h for the template for the following. */ -#define pgpm_procs(p_map_rgb_color, p_map_color_rgb) {\ +#define pgpm_procs(p_color_rgb, encode_color, decode_color) {\ plan_open,\ NULL, /* get_initial_matrix */ \ NULL, /* sync output */ \ gdev_prn_output_page, \ plan_close,\ - p_map_rgb_color, /* map_rgb_color */ \ - p_map_color_rgb, /* map_color_rgb */ \ + NULL, /* map_rgb_color */ \ + p_color_rgb, /* map_color_rgb */ \ NULL, /* fill_rectangle */ \ NULL, /* tile_rectangle */ \ NULL, /* copy_mono */ \ @@ -90,7 +90,7 @@ NULL, /* get_bits */ \ gdev_prn_get_params, \ gdev_prn_put_params,\ - p_map_rgb_color, /* map_cmyk_color */ \ + NULL, /* map_cmyk_color */ \ NULL, /* get_xfont_procs */ \ NULL, /* get_xfont_device */ \ NULL, /* map_rgb_alpha_color */ \ @@ -126,8 +126,8 @@ NULL, /* discard_transparency_layer */\ NULL, /* get_color_mapping_procs */\ NULL, /* get_color_comp_index */\ - p_map_rgb_color, /* encode_color */\ - p_map_color_rgb, /* decode_color */\ + encode_color, /* encode_color */\ + decode_color, /* decode_color */\ NULL, /* pattern_manage */\ NULL, /* fill_rectangle_hl_color */\ NULL, /* include_color_space */\ @@ -144,15 +144,15 @@ } static const gx_device_procs planm_procs = - pgpm_procs(gdev_prn_map_rgb_color, gdev_prn_map_color_rgb); + pgpm_procs(gdev_prn_map_color_rgb, gdev_prn_map_rgb_color, gdev_prn_map_color_rgb); static const gx_device_procs plang_procs = - pgpm_procs(plang_map_rgb_color, plang_map_color_rgb); + pgpm_procs(plang_decode_color, plang_encode_color, plang_decode_color); static const gx_device_procs plan_procs = - pgpm_procs(gx_default_rgb_map_rgb_color, plan_map_color_rgb); + pgpm_procs(plan_decode_color, gx_default_rgb_map_rgb_color, plan_decode_color); static const gx_device_procs planc_procs = - pgpm_procs(planc_map_cmyk_color, planc_map_color_cmyk); + pgpm_procs(planc_map_color_rgb, planc_encode_color, planc_decode_color); static const gx_device_procs plank_procs = - pgpm_procs(planc_map_cmyk_color, planc_map_color_cmyk); + pgpm_procs(planc_map_color_rgb, planc_encode_color, planc_decode_color); /* Macro for generating device descriptors. */ #define plan_prn_device(procs, dev_name, num_comp, depth, max_gray, max_rgb, print_page) \ @@ -284,10 +284,11 @@ else if (num_comps == 4) { if (log2bits == 0) fprintf(dump_file, "P7\nWIDTH %d\nHEIGHT %d\nDEPTH 4\n" - "MAXVAL 255\nTUPLTYPE CMYK\nENDHDR\n", w, h); + "MAXVAL 255\nTUPLTYPE CMYK\n# Image generated by %s\nENDHDR\n", w, h, gs_product); + else fprintf(dump_file, "P7\nWIDTH %d\nHEIGHT %d\nDEPTH 4\n" - "MAXVAL 255\nTUPLTYPE CMYK\nENDHDR\n", w, h); + "MAXVAL 255\nTUPLTYPE CMYK\n# Image generated by %s\nENDHDR\n", w, h, gs_product); } else if (log2bits == 0) fprintf(dump_file, "P4 %d %d\n", w, h); else @@ -333,7 +334,7 @@ /* Map an RGB color to a gray value. */ static gx_color_index -plang_map_rgb_color(gx_device * pdev, const gx_color_value cv[]) +plang_encode_color(gx_device * pdev, const gx_color_value cv[]) { /* We round the value rather than truncating it. */ gx_color_value gray; gx_color_value r, g, b; @@ -350,8 +351,8 @@ /* Map a gray value back to an RGB color. */ static int -plang_map_color_rgb(gx_device * dev, gx_color_index color, - gx_color_value prgb[3]) +plang_decode_color(gx_device * dev, gx_color_index color, + gx_color_value prgb[3]) { gx_color_value gray = color * gx_max_color_value / dev->color_info.max_gray; @@ -364,7 +365,7 @@ /* Map an rgb color tuple back to an RGB color. */ static int -plan_map_color_rgb(gx_device * dev, gx_color_index color, +plan_decode_color(gx_device * dev, gx_color_index color, gx_color_value prgb[3]) { uint bitspercolor = dev->color_info.depth / 3; @@ -380,14 +381,13 @@ return 0; } -/* Map a cmyk color tuple back to an RGB color. */ +/* Map a cmyk color tuple back to an gs color. */ static int -planc_map_color_cmyk(gx_device * dev, gx_color_index color, - gx_color_value prgb[4]) +planc_decode_color(gx_device * dev, gx_color_index color, + gx_color_value prgb[4]) { uint bitspercolor = dev->color_info.depth / 4; uint colormask = (1 << bitspercolor) - 1; - uint max_cmyk = dev->color_info.max_color; uint c, m, y, k; #define cvalue(c) ((gx_color_value)((ulong)(c) * gx_max_color_value / colormask)) @@ -398,7 +398,31 @@ color >>= bitspercolor; m = color & colormask; c = color >> bitspercolor; - k = colormask-k; + prgb[0] = cvalue(c); + prgb[1] = cvalue(m); + prgb[2] = cvalue(y); + prgb[3] = cvalue(k); + return 0; +} + +/* Map a cmyk color back to an rgb tuple. */ +static int +planc_map_color_rgb(gx_device * dev, gx_color_index color, + gx_color_value prgb[3]) +{ + uint bitspercolor = dev->color_info.depth / 4; + uint colormask = (1 << bitspercolor) - 1; + uint c, m, y, k; + +#define cvalue(c) ((gx_color_value)((ulong)(c) * gx_max_color_value / colormask)) + + k = color & colormask; + color >>= bitspercolor; + y = color & colormask; + color >>= bitspercolor; + m = color & colormask; + c = color >> bitspercolor; + k = colormask - k; prgb[0] = cvalue((colormask - c) * k / colormask); prgb[1] = cvalue((colormask - m) * k / colormask); prgb[2] = cvalue((colormask - y) * k / colormask); @@ -407,21 +431,19 @@ /* Map CMYK to color. */ static gx_color_index -planc_map_cmyk_color(gx_device * dev, const gx_color_value cv[]) +planc_encode_color(gx_device * dev, const gx_color_value cv[]) { int bpc = dev->color_info.depth / 4; - int drop = sizeof(gx_color_value) * 8 - bpc; - gx_color_index color = - (((((((gx_color_index) cv[0] >> drop) << bpc) + - (cv[1] >> drop)) << bpc) + - (cv[2] >> drop)) << bpc) + - (cv[3] >> drop); - - /* The bitcmyk device does this: - * return (color == gx_no_color_index ? color ^ 1 : color); - * But I don't understand why. - */ - return color; + gx_color_index color; + COLROUND_VARS; + + COLROUND_SETUP(bpc); + color = ((((((COLROUND_ROUND(cv[0]) << bpc) + + COLROUND_ROUND(cv[1])) << bpc) + + COLROUND_ROUND(cv[2])) << bpc) + + COLROUND_ROUND(cv[3])); + + return (color == gx_no_color_index ? color ^ 1 : color); } /* ------ Internal routines ------ */ diff -Nru ghostscript-9.04~dfsg/base/gdevplib.c ghostscript-9.05~dfsg~20120125/base/gdevplib.c --- ghostscript-9.04~dfsg/base/gdevplib.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevplib.c 2011-11-12 18:29:08.000000000 +0000 @@ -239,12 +239,12 @@ #define Y_DPI 600 /* For all but mono, we need our own color mapping and alpha procedures. */ -static dev_proc_map_color_rgb(plib_map_color_rgb); -static dev_proc_map_rgb_color(plibg_map_rgb_color); -static dev_proc_map_color_rgb(plibg_map_color_rgb); -static dev_proc_map_rgb_color(plibc_map_rgb_color); -static dev_proc_map_color_rgb(plibc_map_color_cmyk); -static dev_proc_map_cmyk_color(plibc_map_cmyk_color); +static dev_proc_decode_color(plib_decode_color); +static dev_proc_encode_color(plibg_encode_color); +static dev_proc_decode_color(plibg_decode_color); +static dev_proc_decode_color(plibc_decode_color); +static dev_proc_encode_color(plibc_encode_color); +static dev_proc_map_color_rgb(plibc_map_color_rgb); static dev_proc_open_device(plib_open); static dev_proc_close_device(plib_close); @@ -266,14 +266,14 @@ /* The device procedures */ /* See gdevprn.h for the template for the following. */ -#define pgpm_procs(p_map_rgb_color, p_map_color_rgb) {\ +#define pgpm_procs(p_color_rgb, p_encode_color, p_decode_color) {\ plib_open,\ NULL, /* get_initial_matrix */ \ NULL, /* sync output */ \ gdev_prn_output_page, \ plib_close,\ - p_map_rgb_color, /* map_rgb_color */ \ - p_map_color_rgb, /* map_color_rgb */ \ + NULL, /* map_rgb_color */ \ + p_color_rgb, /* map_color_rgb */ \ NULL, /* fill_rectangle */ \ NULL, /* tile_rectangle */ \ NULL, /* copy_mono */ \ @@ -282,7 +282,7 @@ NULL, /* get_bits */ \ gdev_prn_get_params, \ plib_put_params,\ - p_map_rgb_color, /* map_cmyk_color */ \ + NULL, /* map_cmyk_color */ \ NULL, /* get_xfont_procs */ \ NULL, /* get_xfont_device */ \ NULL, /* map_rgb_alpha_color */ \ @@ -318,8 +318,8 @@ NULL, /* discard_transparency_layer */\ NULL, /* get_color_mapping_procs */\ NULL, /* get_color_comp_index */\ - p_map_rgb_color, /* encode_color */\ - p_map_color_rgb, /* decode_color */\ + p_encode_color, /* encode_color */\ + p_decode_color, /* decode_color */\ NULL, /* pattern_manage */\ NULL, /* fill_rectangle_hl_color */\ NULL, /* include_color_space */\ @@ -336,15 +336,15 @@ } static const gx_device_procs plibm_procs = - pgpm_procs(gdev_prn_map_rgb_color, gdev_prn_map_color_rgb); + pgpm_procs(NULL, gdev_prn_map_rgb_color, gdev_prn_map_color_rgb); static const gx_device_procs plibg_procs = - pgpm_procs(plibg_map_rgb_color, plibg_map_color_rgb); + pgpm_procs(NULL, plibg_encode_color, plibg_decode_color); static const gx_device_procs plib_procs = - pgpm_procs(gx_default_rgb_map_rgb_color, plib_map_color_rgb); + pgpm_procs(NULL, gx_default_rgb_map_rgb_color, plib_decode_color); static const gx_device_procs plibc_procs = - pgpm_procs(plibc_map_cmyk_color, plibc_map_color_cmyk); + pgpm_procs(plibc_map_color_rgb, plibc_encode_color, plibc_decode_color); static const gx_device_procs plibk_procs = - pgpm_procs(plibc_map_cmyk_color, plibc_map_color_cmyk); + pgpm_procs(plibc_map_color_rgb, plibc_encode_color, plibc_decode_color); /* Macro for generating device descriptors. */ /* Ideally we'd use something like: @@ -761,7 +761,7 @@ /* Map an RGB color to a gray value. */ static gx_color_index -plibg_map_rgb_color(gx_device * pdev, const gx_color_value cv[]) +plibg_encode_color(gx_device * pdev, const gx_color_value cv[]) { /* We round the value rather than truncating it. */ gx_color_value gray; gx_color_value r, g, b; @@ -778,8 +778,8 @@ /* Map a gray value back to an RGB color. */ static int -plibg_map_color_rgb(gx_device * dev, gx_color_index color, - gx_color_value prgb[3]) +plibg_decode_color(gx_device * dev, gx_color_index color, + gx_color_value prgb[3]) { gx_color_value gray = color * gx_max_color_value / dev->color_info.max_gray; @@ -792,7 +792,7 @@ /* Map an rgb color tuple back to an RGB color. */ static int -plib_map_color_rgb(gx_device * dev, gx_color_index color, +plib_decode_color(gx_device * dev, gx_color_index color, gx_color_value prgb[3]) { uint bitspercolor = dev->color_info.depth / 3; @@ -808,10 +808,10 @@ return 0; } -/* Map a cmyk color tuple back to an RGB color. */ +/* Map a cmyk color tuple back to CMYK colorants. */ static int -plibc_map_color_cmyk(gx_device * dev, gx_color_index color, - gx_color_value prgb[4]) +plibc_decode_color(gx_device * dev, gx_color_index color, + gx_color_value prgb[4]) { uint bitspercolor = dev->color_info.depth / 4; uint colormask = (1 << bitspercolor) - 1; @@ -826,24 +826,26 @@ color >>= bitspercolor; m = color & colormask; c = color >> bitspercolor; - k = colormask-k; - prgb[0] = cvalue((colormask - c) * k / colormask); - prgb[1] = cvalue((colormask - m) * k / colormask); - prgb[2] = cvalue((colormask - y) * k / colormask); + prgb[0] = cvalue(c); + prgb[1] = cvalue(m); + prgb[2] = cvalue(y); + prgb[3] = cvalue(k); return 0; } /* Map CMYK to color. */ static gx_color_index -plibc_map_cmyk_color(gx_device * dev, const gx_color_value cv[]) +plibc_encode_color(gx_device * dev, const gx_color_value cv[]) { int bpc = dev->color_info.depth / 4; - int drop = sizeof(gx_color_value) * 8 - bpc; - gx_color_index color = - (((((((gx_color_index) cv[0] >> drop) << bpc) + - (cv[1] >> drop)) << bpc) + - (cv[2] >> drop)) << bpc) + - (cv[3] >> drop); + gx_color_index color; + COLROUND_VARS; + + COLROUND_SETUP(bpc); + color = ((((((COLROUND_ROUND(cv[0]) << bpc) + + COLROUND_ROUND(cv[1])) << bpc) + + COLROUND_ROUND(cv[2])) << bpc) + + COLROUND_ROUND(cv[3])); /* The bitcmyk device does this: * return (color == gx_no_color_index ? color ^ 1 : color); @@ -852,6 +854,31 @@ return color; } +/* Map a cmyk color back to an rgb tuple. */ +static int +plibc_map_color_rgb(gx_device * dev, gx_color_index color, + gx_color_value prgb[3]) +{ + uint bitspercolor = dev->color_info.depth / 4; + uint colormask = (1 << bitspercolor) - 1; + uint max_cmyk = dev->color_info.max_color; + uint c, m, y, k; + +#define cvalue(c) ((gx_color_value)((ulong)(c) * gx_max_color_value / colormask)) + + k = color & colormask; + color >>= bitspercolor; + y = color & colormask; + color >>= bitspercolor; + m = color & colormask; + c = color >> bitspercolor; + k = colormask - k; + prgb[0] = cvalue((colormask - c) * k / colormask); + prgb[1] = cvalue((colormask - m) * k / colormask); + prgb[2] = cvalue((colormask - y) * k / colormask); + return 0; +} + /* ------ Internal routines ------ */ /* Print a page using a given row printing routine. */ diff -Nru ghostscript-9.04~dfsg/base/gdevplnx.c ghostscript-9.05~dfsg~20120125/base/gdevplnx.c --- ghostscript-9.04~dfsg/base/gdevplnx.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevplnx.c 2011-09-29 11:01:33.000000000 +0000 @@ -860,7 +860,8 @@ } static void plane_cmap_cmyk(frac c, frac m, frac y, frac k, gx_device_color * pdc, - const gs_imager_state *pis_image, gx_device *dev, gs_color_select_t select) + const gs_imager_state *pis_image, gx_device *dev, gs_color_select_t select, + const gs_color_space *source_pcs) { const plane_image_enum_t *ppie = (const plane_image_enum_t *)pis_image->client_data; @@ -870,7 +871,7 @@ gx_device_color dcolor; gx_remap_concrete_cmyk(c, m, y, k, &dcolor, ppie->pis, - (gx_device *)edev, select); + (gx_device *)edev, select, NULL); reduce_drawing_color(pdc, edev, &dcolor, &lop); } static void diff -Nru ghostscript-9.04~dfsg/base/gdevpng.c ghostscript-9.05~dfsg~20120125/base/gdevpng.c --- ghostscript-9.04~dfsg/base/gdevpng.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpng.c 2011-11-21 08:55:19.000000000 +0000 @@ -67,7 +67,7 @@ static dev_proc_encode_color(pngalpha_encode_color); static dev_proc_decode_color(pngalpha_decode_color); static dev_proc_copy_alpha(pngalpha_copy_alpha); -static dev_proc_fill_rectangle(pngalpha_fill_rectangle); +static dev_proc_fillpage(pngalpha_fillpage); static dev_proc_get_params(pngalpha_get_params); static dev_proc_put_params(pngalpha_put_params); static dev_proc_create_buf_device(pngalpha_create_buf_device); @@ -193,7 +193,6 @@ gx_prn_device_common; int downscale_factor; int min_feature_size; - dev_t_proc_fill_rectangle((*orig_fill_rectangle), gx_device); int background; }; static const gx_device_procs pngalpha_procs = @@ -205,7 +204,7 @@ gdev_prn_close, pngalpha_encode_color, /* map_rgb_color */ pngalpha_decode_color, /* map_color_rgb */ - pngalpha_fill_rectangle, + NULL, /* fill_rectangle */ NULL, /* tile_rectangle */ NULL, /* copy_mono */ NULL, /* copy_color */ @@ -250,7 +249,16 @@ gx_default_DevRGB_get_color_mapping_procs, gx_default_DevRGB_get_color_comp_index, pngalpha_encode_color, - pngalpha_decode_color + pngalpha_decode_color, + NULL, /* pattern_manage */ + NULL, /* fill_rectangle_hl_color */ + NULL, /* include_color_space */ + NULL, /* fill_linear_color_scanline */ + NULL, /* fill_linear_color_trapezoid */ + NULL, /* fill_linear_color_triangle */ + NULL, /* update_spot_equivalent_colors */ + NULL, /* ret_devn_params */ + pngalpha_fillpage }; const gx_device_pngalpha gs_pngalpha_device = { @@ -285,7 +293,6 @@ prn_device_body_rest_(png_print_page), 1, /* downscale_factor */ 0, /* min_feature_size */ - NULL, 0xffffff /* white background */ }; @@ -597,8 +604,20 @@ info_ptr->valid |= valid; info_ptr->text = &text_png; info_ptr->num_text = 1; + /* Set up the ICC information */ + if (pdev->icc_struct != NULL && pdev->icc_struct->device_profile[0] != NULL) { + cmm_profile_t *icc_profile = pdev->icc_struct->device_profile[0]; + /* PNG can only be RGB or gray. No CIELAB :( */ + if (icc_profile->data_cs == gsRGB || icc_profile->data_cs == gsGRAY) { + if (icc_profile->num_comps == pdev->color_info.num_components) { + info_ptr->iccp_name = icc_profile->name; + info_ptr->iccp_profile = icc_profile->buffer; + info_ptr->iccp_proflen = icc_profile->buffer_size; + info_ptr->valid |= PNG_INFO_iCCP; + } + } + } #endif - if (invert) { if (depth == 32) png_set_invert_alpha(png_ptr); @@ -698,20 +717,12 @@ gx_device_pngalpha *ppdev = (gx_device_pngalpha *)pdev; int code; /* We replace create_buf_device so we can replace copy_alpha - * for memory device, but not clist. + * for memory device, but not clist. We also replace the fillpage + * proc with our own to fill with transparent. */ ppdev->printer_procs.buf_procs.create_buf_device = pngalpha_create_buf_device; code = gdev_prn_open(pdev); - /* We intercept fill_rectangle to translate "fill page with white" - * into "fill page with transparent". We then call the original - * implementation of fill_page. - */ - if ((ppdev->procs.fill_rectangle != pngalpha_fill_rectangle) && - (ppdev->procs.fill_rectangle != NULL)) { - ppdev->orig_fill_rectangle = ppdev->procs.fill_rectangle; - ppdev->procs.fill_rectangle = pngalpha_fill_rectangle; - } return code; } @@ -725,6 +736,7 @@ render_plane, mem, band_complexity); /* Now set copy_alpha to one that handles RGBA */ set_dev_proc(*pbdev, copy_alpha, ptarget->orig_procs.copy_alpha); + set_dev_proc(*pbdev, fillpage, pngalpha_fillpage); return code; } @@ -750,15 +762,6 @@ if (code == 0) { code = gdev_prn_put_params(pdev, plist); - if ((ppdev->procs.fill_rectangle != pngalpha_fill_rectangle) && - (ppdev->procs.fill_rectangle != NULL)) { - /* Get current implementation of fill_rectangle and restore ours. - * Implementation is either clist or memory and can change - * during put_params. - */ - ppdev->orig_fill_rectangle = ppdev->procs.fill_rectangle; - ppdev->procs.fill_rectangle = pngalpha_fill_rectangle; - } } return code; } @@ -803,17 +806,11 @@ return 0; } +/* fill the page fills with transparent */ static int -pngalpha_fill_rectangle(gx_device * dev, int x, int y, int w, int h, - gx_color_index color) +pngalpha_fillpage(gx_device *dev, gs_imager_state * pis, gx_device_color *pdevc) { - gx_device_pngalpha *pdev = (gx_device_pngalpha *)dev; - if ((color == 0xffffff00) && (x==0) && (y==0) - && (w==dev->width) && (h==dev->height)) { - /* If filling whole page with white, make it transparent */ - return pdev->orig_fill_rectangle(dev, x, y, w, h, 0xffffffff); - } - return pdev->orig_fill_rectangle(dev, x, y, w, h, color); + return (*dev_proc(dev, fill_rectangle))(dev, 0, 0, dev->width, dev->height, 0xffffffff); } /* Implementation for 32-bit RGBA in a memory buffer */ diff -Nru ghostscript-9.04~dfsg/base/gdevprn.c ghostscript-9.05~dfsg~20120125/base/gdevprn.c --- ghostscript-9.04~dfsg/base/gdevprn.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevprn.c 2011-12-08 09:35:23.000000000 +0000 @@ -281,9 +281,9 @@ (&buf_space, pdev, NULL, pdev->height, false) >= 0; mem_space = buf_space.bits + buf_space.line_ptrs; if (ppdev->page_uses_transparency) { - pdf14_trans_buffer_size = (ESTIMATED_PDF14_ROW_SPACE(max(1, new_width)) >> 3); + pdf14_trans_buffer_size = (ESTIMATED_PDF14_ROW_SPACE(max(1, pdev->width), pdev->color_info.num_components) >> 3); if (new_height < (max_ulong - mem_space) / pdf14_trans_buffer_size) { - pdf14_trans_buffer_size *= new_height; + pdf14_trans_buffer_size *= pdev->height; mem_space += pdf14_trans_buffer_size; } else { size_ok = 0; @@ -720,6 +720,8 @@ if (ppdev->file != NULL) gx_device_close_output_file(pdev, ppdev->fname, ppdev->file); ppdev->file = NULL; + if (sizeof(ppdev->fname) <= ofs.size) + return_error(gs_error_limitcheck); memcpy(ppdev->fname, ofs.data, ofs.size); ppdev->fname[ofs.size] = 0; } @@ -1277,6 +1279,31 @@ return 0; } +/* compare two space_params, we can't do this with memcmp since there is padding in the structure */ +static int +compare_gdev_prn_space_params(const gdev_prn_space_params sp1, + const gdev_prn_space_params sp2) { + if (sp1.MaxBitmap != sp2.MaxBitmap) + return(1); + if (sp1.BufferSpace != sp2.BufferSpace) + return(1); + if (sp1.band.page_uses_transparency != sp2.band.page_uses_transparency) + return(1); + if (sp1.band.BandWidth != sp2.band.BandWidth) + return(1); + if (sp1.band.BandHeight != sp2.band.BandHeight) + return(1); + if (sp1.band.BandBufferSpace != sp2.band.BandBufferSpace) + return(1); + if (sp1.params_are_read_only != sp2.params_are_read_only) + return(1); + if (sp1.banding_type != sp2.banding_type) + return(1); + + return(0); +} + + /* If necessary, free and reallocate the printer memory after changing params */ int gdev_prn_maybe_realloc_memory(gx_device_printer *prdev, @@ -1297,7 +1324,7 @@ * for these filesets. */ if (prdev->is_open && - (memcmp(&prdev->space_params, old_sp, sizeof(*old_sp)) != 0 || + (compare_gdev_prn_space_params(prdev->space_params, *old_sp) != 0 || prdev->width != old_width || prdev->height != old_height || prdev->page_uses_transparency != old_page_uses_transparency) ) { diff -Nru ghostscript-9.04~dfsg/base/gdevprn.h ghostscript-9.05~dfsg~20120125/base/gdevprn.h --- ghostscript-9.04~dfsg/base/gdevprn.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevprn.h 2011-09-29 11:01:33.000000000 +0000 @@ -209,10 +209,14 @@ BandingAlways, BandingNever } gdev_prn_banding_type; + +/* if you make any additions/changes to this structure you need to make + the appropriate additions/changes to the compare_gdev_prn_space_params() + function in gdevprn.c */ struct gdev_prn_space_params_s { long MaxBitmap; /* max size of non-buffered bitmap */ long BufferSpace; /* space to use for buffer */ - gx_band_params_t band; /* see gxclist.h */ + gx_band_params_t band; /* see gxband.h */ bool params_are_read_only; /* true if put_params may not modify this struct */ gdev_prn_banding_type banding_type; /* used to force banding or bitmap */ }; diff -Nru ghostscript-9.04~dfsg/base/gdevps.c ghostscript-9.05~dfsg~20120125/base/gdevps.c --- ghostscript-9.04~dfsg/base/gdevps.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevps.c 2012-01-25 08:44:24.000000000 +0000 @@ -646,18 +646,6 @@ return code_;\ END -/* Check if we write each page into separate file. */ -static bool -psw_is_separate_pages(gx_device_vector *const vdev) -{ - const char *fmt; - gs_parsed_file_name_t parsed; - int code = gx_parse_output_file_name(&parsed, &fmt, vdev->fname, - strlen(vdev->fname), vdev->memory); - - return (code >= 0 && fmt != 0); -} - /* ---------------- Vector device implementation ---------------- */ static int @@ -678,7 +666,8 @@ } code = psw_write_page_header(s, (gx_device *)vdev, &pdev->pswrite_common, true, - (psw_is_separate_pages(vdev) ? 1 : vdev->PageCount + 1), + (gx_outputfile_is_separate_pages(vdev->fname, vdev->memory) ? + 1 : vdev->PageCount + 1), image_cache_size); if (code < 0) return code; @@ -994,7 +983,7 @@ return_error(gs_error_ioerror); dev->PageCount ++; - if (psw_is_separate_pages(vdev)) { + if (gx_outputfile_is_separate_pages(vdev->fname, vdev->memory)) { code = psw_close_printer(dev); if (code < 0) @@ -1188,7 +1177,8 @@ } } code = psw_end_file(f, dev, &pdev->pswrite_common, &bbox, - (psw_is_separate_pages(vdev) ? 1 : vdev->PageCount)); + (gx_outputfile_is_separate_pages(vdev->fname, vdev->memory) ? + 1 : vdev->PageCount)); if(code < 0) return code; diff -Nru ghostscript-9.04~dfsg/base/gdevpsd.c ghostscript-9.05~dfsg~20120125/base/gdevpsd.c --- ghostscript-9.04~dfsg/base/gdevpsd.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpsd.c 2012-01-25 08:44:24.000000000 +0000 @@ -150,12 +150,12 @@ /* we need to implement it separately because st_composite_final */ /* declares all 3 procedures as private. */ static void -psd_device_finalize(void *vpdev) +psd_device_finalize(const gs_memory_t *cmem, void *vpdev) { /* We need to deallocate the compressed_color_list. and the names. */ devn_free_params((gx_device*) vpdev); - gx_device_finalize(vpdev); + gx_device_finalize(cmem, vpdev); } gs_private_st_composite_final(st_psd_device, psd_device, @@ -458,8 +458,8 @@ in[2] = frac2ushort(y); in[3] = frac2ushort(k); - gscms_transform_color(link, &(in[0]), - &(tmp[0]), 2, NULL); + gscms_transform_color(dev, link, &(in[0]), + &(tmp[0]), 2); for (i = 0; i < outn; i++) out[i] = ushort2frac(tmp[i]); @@ -502,8 +502,8 @@ in[1] = frac2ushort(g); in[2] = frac2ushort(b); - gscms_transform_color(link, &(in[0]), - &(tmp[0]), 2, NULL); + gscms_transform_color(dev, link, &(in[0]), + &(tmp[0]), 2); for (i = 0; i < outn; i++) out[i] = ushort2frac(tmp[i]); @@ -569,14 +569,15 @@ psd_encode_color(gx_device *dev, const gx_color_value colors[]) { int bpc = ((psd_device *)dev)->devn_params.bitspercomponent; - int drop = sizeof(gx_color_value) * 8 - bpc; gx_color_index color = 0; int i = 0; int ncomp = dev->color_info.num_components; + COLROUND_VARS; + COLROUND_SETUP(bpc); for (; i> drop); + color |= COLROUND_ROUND(colors[i]); } return (color == gx_no_color_index ? color ^ 1 : color); } @@ -588,13 +589,14 @@ psd_decode_color(gx_device * dev, gx_color_index color, gx_color_value * out) { int bpc = ((psd_device *)dev)->devn_params.bitspercomponent; - int drop = sizeof(gx_color_value) * 8 - bpc; int mask = (1 << bpc) - 1; int i = 0; int ncomp = dev->color_info.num_components; + COLDUP_VARS; + COLDUP_SETUP(bpc); for (; i>= bpc; } return 0; @@ -1123,7 +1125,7 @@ } static void -psd_calib_row(psd_write_ctx *xc, byte **tile_data, const byte *row, +psd_calib_row(gx_device *dev, psd_write_ctx *xc, byte **tile_data, const byte *row, int channel, gcmmhlink_t link, int inn, int outn) { int base_bytes_pp = xc->base_bytes_pp; @@ -1139,8 +1141,8 @@ for (plane_idx = 0; plane_idx < inn; plane_idx++) in[plane_idx] = row[x*channels+plane_idx]; - gscms_transform_color(link, &(in[0]), - &((*tile_data)[x]), 1, NULL); + gscms_transform_color(dev, link, &(in[0]), + &((*tile_data)[x]), 1); } else { (*tile_data)[x] = 255 ^ row[x*channels+base_bytes_pp+channel]; @@ -1241,7 +1243,7 @@ } } } else { - psd_calib_row(xc, &sep_line, unpacked, data_pos, + psd_calib_row((gx_device*) xdev, xc, &sep_line, unpacked, data_pos, link, xdev->output_profile->num_comps, xdev->output_profile->num_comps_out); } diff -Nru ghostscript-9.04~dfsg/base/gdevpsdi.c ghostscript-9.05~dfsg~20120125/base/gdevpsdi.c --- ghostscript-9.04~dfsg/base/gdevpsdi.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpsdi.c 2011-11-21 08:55:19.000000000 +0000 @@ -16,6 +16,7 @@ #include "stdio_.h" /* for jpeglib.h */ #include "jpeglib_.h" /* for sdct.h */ #include "math_.h" +#include "string_.h" #include "gx.h" #include "gserrors.h" #include "gscspace.h" @@ -52,7 +53,7 @@ int bpc_in, int bpc_out) { gs_memory_t *mem = pbw->dev->v_memory; - const stream_template *template; + const stream_template *templat; stream_1248_state *st; int code; @@ -64,19 +65,19 @@ 0, 0, 0, 0, 0, 0, 0, &s_12_8_template }; - template = exts[bpc_in]; + templat = exts[bpc_in]; } else { static const stream_template *const rets[5] = { 0, &s_8_1_template, &s_8_2_template, 0, &s_8_4_template }; - template = rets[bpc_out]; + templat = rets[bpc_out]; } st = (stream_1248_state *) - s_alloc_state(mem, template->stype, "pixel_resize state"); + s_alloc_state(mem, templat->stype, "pixel_resize state"); if (st == 0) return_error(gs_error_VMerror); - code = psdf_encode_binary(pbw, template, (stream_state *) st); + code = psdf_encode_binary(pbw, templat, (stream_state *) st); if (code < 0) { gs_free_object(mem, st, "pixel_resize state"); return code; @@ -160,7 +161,7 @@ Replace ColorTransform with 1. */ code = param_write_int((gs_param_list *)list, "ColorTransform", &one); if (code < 0) - return code; + goto error; goto done; } @@ -186,7 +187,7 @@ Replace ColorTransform with 0. */ code = param_write_int((gs_param_list *)list, "ColorTransform", &zero); if (code < 0) - return code; + goto error; } else { /* Unknown color space type. Replace /HSamples [1 1 1 1] /VSamples [1 1 1 1] to avoid quality degradation. */ @@ -198,14 +199,18 @@ a.persistent = true; code = param_write_string((gs_param_list *)list, "HSamples", &a); if (code < 0) - return code; + goto error; code = param_write_string((gs_param_list *)list, "VSamples", &a); if (code < 0) - return code; + goto error; } done: gs_c_param_list_read(list); + gx_device_finalize(pdev->memory, &mdev); return 0; +error: + gx_device_finalize(pdev->memory, &mdev); + return code; } /* Add the appropriate image compression filter, if any. */ @@ -216,7 +221,7 @@ { gx_device_psdf *pdev = pbw->dev; gs_memory_t *mem = pdev->v_memory; - const stream_template *template = pdip->filter_template; + const stream_template *templat = pdip->filter_template; const stream_template *lossless_template = (pdev->params.UseFlateCompression && pdev->version >= psdf_version_ll3 ? @@ -231,7 +236,7 @@ int code; # ifdef USE_LWF_JP2 - if (lossless && template == &s_jpxe_template && !Indexed) + if (lossless && templat == &s_jpxe_template && !Indexed) lossless_template = &s_jpxe_template; # endif if (!pdip->Encode) /* no compression */ @@ -247,25 +252,25 @@ * called 2 times with different values of the 'lossless' argument. */ if (lossless) { - template = lossless_template; - } else if (template == NULL || template == &s_zlibE_template || - template == &s_LZWE_template) { - template = &s_DCTE_template; + templat = lossless_template; + } else if (templat == NULL || templat == &s_zlibE_template || + templat == &s_LZWE_template) { + templat = &s_DCTE_template; } dict = pdip->ACSDict; } else if (!lossless) return gs_error_rangecheck; /* Reject the alternative stream. */ - if (pdev->version < psdf_version_ll3 && template == &s_zlibE_template) - template = lossless_template; + if (pdev->version < psdf_version_ll3 && templat == &s_zlibE_template) + templat = lossless_template; if (dict != NULL) /* Some interpreters don't supply filter parameters. */ gs_c_param_list_read(dict); /* ensure param list is in read mode */ - if (template == 0) /* no compression */ + if (templat == 0) /* no compression */ return 0; if (pim->Width < 200 && pim->Height < 200) /* Prevent a fixed overflow. */ if (pim->Width * pim->Height * Colors * pim->BitsPerComponent <= 160) return 0; /* not worth compressing */ /* Only use DCTE for 8-bit, non-Indexed data. */ - if (template == &s_DCTE_template) { + if (templat == &s_DCTE_template) { if (Indexed || !(pdip->Downsample ? pdip->Depth == 8 || @@ -273,18 +278,18 @@ pim->BitsPerComponent == 8) ) { /* Use LZW/Flate instead. */ - template = lossless_template; + templat = lossless_template; } } - st = s_alloc_state(mem, template->stype, "setup_image_compression"); + st = s_alloc_state(mem, templat->stype, "setup_image_compression"); if (st == 0) return_error(gs_error_VMerror); - if (template->set_defaults) - (*template->set_defaults) (st); - if (template == &s_CFE_template) { + if (templat->set_defaults) + (*templat->set_defaults) (st); + if (templat == &s_CFE_template) { stream_CFE_state *const ss = (stream_CFE_state *) st; - if (pdip->Dict != 0 && pdip->filter_template == template) { + if (pdip->Dict != 0 && pdip->filter_template == templat) { s_CF_put_params((gs_param_list *)pdip->Dict, (stream_CF_state *)ss); /* ignore errors */ } else { @@ -293,22 +298,22 @@ } ss->Columns = pim->Width; ss->Rows = (ss->EndOfBlock ? 0 : pim->Height); - } else if ((template == &s_LZWE_template || - template == &s_zlibE_template) && + } else if ((templat == &s_LZWE_template || + templat == &s_zlibE_template) && pdev->version >= psdf_version_ll3) { /* If not Indexed, add a PNGPredictor filter. */ if (!Indexed) { - code = psdf_encode_binary(pbw, template, st); + code = psdf_encode_binary(pbw, templat, st); if (code < 0) goto fail; - template = &s_PNGPE_template; - st = s_alloc_state(mem, template->stype, "setup_image_compression"); + templat = &s_PNGPE_template; + st = s_alloc_state(mem, templat->stype, "setup_image_compression"); if (st == 0) { code = gs_note_error(gs_error_VMerror); goto fail; } - if (template->set_defaults) - (*template->set_defaults) (st); + if (templat->set_defaults) + (*templat->set_defaults) (st); { stream_PNGP_state *const ss = (stream_PNGP_state *) st; @@ -316,7 +321,7 @@ ss->Columns = pim->Width; } } - } else if (template == &s_DCTE_template) { + } else if (templat == &s_DCTE_template) { gs_c_param_list list, *param = dict; gs_c_param_list_write(&list, mem); @@ -334,7 +339,7 @@ return 0; } else { # ifdef USE_LDF_JB2 - if (template == &s_jbig2encode_template) { + if (templat == &s_jbig2encode_template) { stream_jbig2encode_state *state = (stream_jbig2encode_state *)st; state->width = pim->Width; @@ -342,7 +347,7 @@ } # endif # ifdef USE_LWF_JP2 - if (template == &s_jpxe_template) { + if (templat == &s_jpxe_template) { stream_jpxe_state *state = (stream_jpxe_state *)st; int ncomps = pim->ColorSpace->type->num_components(pim->ColorSpace); @@ -368,7 +373,7 @@ } # endif } - code = psdf_encode_binary(pbw, template, st); + code = psdf_encode_binary(pbw, templat, st); if (code >= 0) return 0; fail: @@ -397,7 +402,7 @@ { gx_device_psdf *pdev = pbw->dev; /* Note: Bicubic is currently interpreted as Average. */ - const stream_template *template = + const stream_template *templat = (pdip->DownsampleType == ds_Subsample ? &s_Subsample_template : &s_Average_template); int factor = (int)(resolution / pdip->Resolution); @@ -407,12 +412,12 @@ stream_state *st; int code; - st = s_alloc_state(pdev->v_memory, template->stype, + st = s_alloc_state(pdev->v_memory, templat->stype, "setup_downsampling"); if (st == 0) return_error(gs_error_VMerror); - if (template->set_defaults) - template->set_defaults(st); + if (templat->set_defaults) + templat->set_defaults(st); { stream_Downsample_state *const ss = (stream_Downsample_state *) st; @@ -424,8 +429,8 @@ ss->XFactor = ss->YFactor = factor; ss->AntiAlias = pdip->AntiAlias; ss->padX = ss->padY = false; /* should be true */ - if (template->init) - template->init(st); + if (templat->init) + templat->init(st); pim->Width = s_Downsample_size_out(pim->Width, factor, ss->padX); pim->Height = s_Downsample_size_out(pim->Height, factor, ss->padY); pim->BitsPerComponent = pdip->Depth; @@ -436,7 +441,7 @@ if ((code = setup_image_compression(pbw, pdip, pim, pis, lossless)) < 0 || (code = pixel_resize(pbw, pim->Width, ss->Colors, 8, pdip->Depth)) < 0 || - (code = psdf_encode_binary(pbw, template, st)) < 0 || + (code = psdf_encode_binary(pbw, templat, st)) < 0 || (code = pixel_resize(pbw, orig_width, ss->Colors, orig_bpc, 8)) < 0 ) { diff -Nru ghostscript-9.04~dfsg/base/gdevpsdp.c ghostscript-9.05~dfsg~20120125/base/gdevpsdp.c --- ghostscript-9.04~dfsg/base/gdevpsdp.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpsdp.c 2011-11-12 18:29:08.000000000 +0000 @@ -87,7 +87,7 @@ typedef struct psdf_image_filter_name_s { const char *pname; - const stream_template *template; + const stream_template *templat; psdf_version min_version; } psdf_image_filter_name; @@ -643,7 +643,7 @@ static int psdf_put_image_dict_param(gs_param_list * plist, const gs_param_name pname, gs_c_param_list **pplvalue, - const stream_template * template, + const stream_template * templat, ss_put_params_t put_params, gs_memory_t * mem) { gs_param_dict dict; @@ -659,16 +659,16 @@ return 0; case 0: { /* Check the parameter values now. */ - stream_state *ss = s_alloc_state(mem, template->stype, pname); + stream_state *ss = s_alloc_state(mem, templat->stype, pname); if (ss == 0) return_error(gs_error_VMerror); - ss->template = template; - if (template->set_defaults) - template->set_defaults(ss); + ss->templat = templat; + if (templat->set_defaults) + templat->set_defaults(ss); code = put_params(dict.list, ss); - if (template->release) - template->release(ss); + if (templat->release) + templat->release(ss); gs_free_object(mem, ss, pname); if (code < 0) { param_signal_error(plist, pname, code); @@ -726,18 +726,18 @@ /* (AutoFilter) */ /* (Depth) */ if ((pname = pnames->Dict) != 0) { - const stream_template *template; + const stream_template *templat; ss_put_params_t put_params; /* Hack to determine what kind of a Dict we want: */ if (pnames->Dict[0] == 'M') - template = &s_CFE_template, + templat = &s_CFE_template, put_params = psdf_CF_put_params; else - template = &s_DCTE_template, + templat = &s_DCTE_template, put_params = psdf_DCT_put_params; code = psdf_put_image_dict_param(plist, pname, ¶ms->Dict, - template, put_params, mem); + templat, put_params, mem); if (code < 0) ecode = code; } @@ -772,7 +772,7 @@ pn++; if (pn->pname != 0 && pn->min_version <= pdev->version) { params->Filter = pn->pname; - params->filter_template = pn->template; + params->filter_template = pn->templat; } break; } @@ -796,7 +796,7 @@ goto ipe; } params->Filter = pn->pname; - params->filter_template = pn->template; + params->filter_template = pn->templat; break; } default: diff -Nru ghostscript-9.04~dfsg/base/gdevpsds.c ghostscript-9.05~dfsg~20120125/base/gdevpsds.c --- ghostscript-9.04~dfsg/base/gdevpsds.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpsds.c 2011-11-12 18:29:08.000000000 +0000 @@ -34,7 +34,7 @@ s_1248_init(stream_1248_state *ss, int Columns, int samples_per_pixel) { ss->samples_per_row = Columns * samples_per_pixel; - return ss->template->init((stream_state *)ss); + return ss->templat->init((stream_state *)ss); } /* Initialize the state. */ @@ -523,7 +523,7 @@ void test_IE(void) { - const stream_template *const template = &s_IE_template; + const stream_templat *const template = &s_IE_template; stream_IE_state state; stream_state *const ss = (stream_state *)&state; static const float decode[6] = {1, 0, 1, 0, 1, 0}; @@ -540,7 +540,7 @@ byte table[3 * 5]; int n; - template->set_defaults(ss); + templat->set_defaults(ss); state.BitsPerComponent = 4; state.NumComponents = 3; state.Width = 3; @@ -561,7 +561,7 @@ memset(table, 0xcc, sizeof(table)); memset(out, 0xff, sizeof(out)); dprintf1("processing %d bytes\n", n); - status = template->process(ss, &r, &w, true); + status = templat->process(ss, &r, &w, true); dprintf3("%d bytes read, %d bytes written, status = %d\n", (int)(r.ptr + 1 - in), (int)(w.ptr + 1 - out), status); debug_dump_bytes(table, table + sizeof(table), "table"); diff -Nru ghostscript-9.04~dfsg/base/gdevpsdu.c ghostscript-9.05~dfsg~20120125/base/gdevpsdu.c --- ghostscript-9.04~dfsg/base/gdevpsdu.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpsdu.c 2011-12-08 09:35:23.000000000 +0000 @@ -323,7 +323,7 @@ gs_free_object(mem, buf, "psdf_begin_binary(buf)"); return_error(gs_error_VMerror); } - ss->template = &s_A85E_template; + ss->templat = &s_A85E_template; s_init_filter(s, (stream_state *)ss, buf, BUF_SIZE, pdev->strm); #undef BUF_SIZE pbw->strm = s; @@ -336,10 +336,10 @@ /* Add an encoding filter. The client must have allocated the stream state, */ /* if any, using pdev->v_memory. */ int -psdf_encode_binary(psdf_binary_writer * pbw, const stream_template * template, +psdf_encode_binary(psdf_binary_writer * pbw, const stream_template * templat, stream_state * ss) { - return (s_add_filter(&pbw->strm, template, ss, pbw->memory) == 0 ? + return (s_add_filter(&pbw->strm, templat, ss, pbw->memory) == 0 ? gs_note_error(gs_error_VMerror) : 0); } @@ -392,17 +392,19 @@ if (code < 0) return code; /* Create the filter. */ - jcdp->template = s_DCTE_template; + jcdp->templat = s_DCTE_template; /* Make sure we get at least a full scan line of input. */ ss->scan_line_size = jcdp->cinfo.input_components * jcdp->cinfo.image_width; - jcdp->template.min_in_size = + /* Profile not used in pdfwrite output */ + ss->icc_profile = NULL; + jcdp->templat.min_in_size = max(s_DCTE_template.min_in_size, ss->scan_line_size); /* Make sure we can write the user markers in a single go. */ - jcdp->template.min_out_size = + jcdp->templat.min_out_size = max(s_DCTE_template.min_out_size, ss->Markers.size); if (pbw) - code = psdf_encode_binary(pbw, &jcdp->template, st); + code = psdf_encode_binary(pbw, &jcdp->templat, st); if (code >= 0) { gs_c_param_list_release(&rcc_list); return 0; @@ -421,21 +423,21 @@ psdf_CFE_binary(psdf_binary_writer * pbw, int w, int h, bool invert) { gs_memory_t *mem = pbw->memory; - const stream_template *template = &s_CFE_template; + const stream_template *templat = &s_CFE_template; stream_CFE_state *st = - gs_alloc_struct(mem, stream_CFE_state, template->stype, + gs_alloc_struct(mem, stream_CFE_state, templat->stype, "psdf_CFE_binary"); int code; if (st == 0) return_error(gs_error_VMerror); - (*template->set_defaults) ((stream_state *) st); + (*templat->set_defaults) ((stream_state *) st); st->K = -1; st->Columns = w; st->Rows = 0; st->BlackIs1 = !invert; - st->EndOfBlock = pbw->strm->state->template != &s_A85E_template; - code = psdf_encode_binary(pbw, template, (stream_state *) st); + st->EndOfBlock = pbw->strm->state->templat != &s_A85E_template; + code = psdf_encode_binary(pbw, templat, (stream_state *) st); if (code < 0) gs_free_object(mem, st, "psdf_CFE_binary"); return code; diff -Nru ghostscript-9.04~dfsg/base/gdevpsf1.c ghostscript-9.05~dfsg~20120125/base/gdevpsf1.c --- ghostscript-9.04~dfsg/base/gdevpsf1.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpsf1.c 2011-09-29 11:01:33.000000000 +0000 @@ -13,6 +13,7 @@ /* $Id$ */ /* Write an embedded Type 1 font */ +#include "math.h" #include "memory_.h" #include "gx.h" #include "gserrors.h" @@ -179,6 +180,295 @@ return 0; } +static int WriteNumber (byte *dest, int value) +{ + if (value >= -107 && value <= 107) { + *dest = value + 139; + return 1; + } else { + if (value >= 108 && value <= 1131) { + int quotient = (int)floor((value - 108) / (double)256); + dest[0] = quotient + 247; + dest[1] = value - 108 - quotient * 256; + return 2; + } else { + if (value <= -108 && value >= -1131) { + int quotient = (int)floor((value + 108) / -256); + int newval = value + 256 * quotient + 108; + dest[0] = quotient + 251; + dest[1] = newval * -1; + return 2; + } else { + dest[0] = 255; + dest[1] = value >> 24; + dest[2] = (value & 0xFF0000) >> 16; + dest[3] = (value & 0xFF00) >> 8; + dest[4] = value & 0xFF; + return 5; + } + } + } + return 0; +} + +/* The following 2 routines attempt to parse out Multiple Master 'OtherSubrs' + * calls, and replace the multiple arguments to $Blend with the two 'base' + * parameters. This works reasonably well but can be defeated. FOr example a + * CharString which puts some parameters on the operand stack, then calls a + * Subr which puts the remaining parameters on the stack, and calls a MM + * OtherSubr (constructions like this have been observed). In general we + * work around this by storing the operands on the stack, but it is possible + * that the values are calculated (eg x y div) which is a common way to get + * float values into the interpreter. This will defeat the code below. + * + * The only way to solve this is to actually fully interpret the CharString + * and any /Subrs it calls, and then emit the result as a non-MM CharString + * by blending the values. This would mean writing a new routine like + * 'psf_convert_type1_to_type2' (see gdevpsfx.c) or modifying that routine + * so that it outputs type 1 CharStrings (which is probably simpler to do). + */ +static int CheckSubrForMM (gs_glyph_data_t *gdata, gs_font_type1 *pfont) +{ + crypt_state state = crypt_charstring_seed; + int code = 0; + gs_bytestring *data = (gs_bytestring *)&gdata->bits; + byte *source = data->data, *end = source + data->size; + int CurrentNumberIndex = 0, Stack[32]; + + gs_type1_decrypt(source, source, data->size, &state); + + if(pfont->data.lenIV) + source += pfont->data.lenIV; + + while (source < end) { + if (*source < 32) { + /* Command */ + switch (*source) { + case 12: + if (*(source + 1) == 16) { + switch(Stack[CurrentNumberIndex-1]) { + case 18: + code = 6; + break; + case 17: + code = 4; + break; + case 16: + code = 3; + break; + case 15: + code = 2; + break; + case 14: + code = 1; + break; + default: + code = 0; + break; + } + source += 2; + } else { + source +=2; + } + break; + default: + source++; + break; + } + CurrentNumberIndex = 0; + } else { + /* Number */ + if (*source < 247) { + Stack[CurrentNumberIndex++] = *source++ - 139; + } else { + if (*source < 251) { + Stack[CurrentNumberIndex] = ((*source++ - 247) * 256) + 108; + Stack[CurrentNumberIndex++] += *source++; + } else { + if (*source < 255) { + Stack[CurrentNumberIndex] = ((*source++ - 251) * -256) - 108; + Stack[CurrentNumberIndex++] -= *source++; + } else { + Stack[CurrentNumberIndex] = *source++ << 24; + Stack[CurrentNumberIndex] += *source++ << 16; + Stack[CurrentNumberIndex] += *source++ << 8; + Stack[CurrentNumberIndex] += *source++; + } + } + } + } + } + state = crypt_charstring_seed; + source = data->data; + gs_type1_encrypt(source, source, data->size, &state); + return code; +} + +static int strip_othersubrs(gs_glyph_data_t *gdata, gs_font_type1 *pfont, byte *stripped, byte *SubrsWithMM) +{ + crypt_state state = crypt_charstring_seed; + gs_bytestring *data = (gs_bytestring *)&gdata->bits; + byte *source = data->data, *dest = stripped, *end = source + data->size; + int i, dest_length = 0, CurrentNumberIndex = 0, Stack[64], written; + + gs_type1_decrypt(source, source, data->size, &state); + + if(pfont->data.lenIV >= 0) { + for (i=0;idata.lenIV;i++) + *dest++ = *source++; + dest_length += pfont->data.lenIV; + } + while (source < end) { + if (*source < 32) { + /* Command */ + switch (*source) { + case 12: + if (*(source + 1) == 16) { + /* Callothersubsr, the only thing we care about */ + switch(Stack[CurrentNumberIndex-1]) { + /* If we find a Multiple Master call, remove all but the + * first set of arguments. Mimics the result of a call. + * Adobe 'encourages' the use of Subrs to do MM, but + * the spec doens't say you have to, so we need to be + * prepared, just in case. I doubt we will ever execute + * this code. + */ + case 14: + CurrentNumberIndex -= pfont->data.WeightVector.count - 1; + for (i = 0;i < CurrentNumberIndex;i++) { + written = WriteNumber(dest, Stack[i]); + dest_length += written; + dest += written; + } + source += 2; + break; + case 15: + CurrentNumberIndex -= (pfont->data.WeightVector.count - 1) * 2; + for (i = 0;i < CurrentNumberIndex;i++) { + written = WriteNumber(dest, Stack[i]); + dest_length += written; + dest += written; + } + source += 2; + break; + case 16: + CurrentNumberIndex -= (pfont->data.WeightVector.count - 1) * 3; + for (i = 0;i < CurrentNumberIndex;i++) { + written = WriteNumber(dest, Stack[i]); + dest_length += written; + dest += written; + } + source += 2; + break; + case 17: + CurrentNumberIndex -= (pfont->data.WeightVector.count - 1) * 4; + for (i = 0;i < CurrentNumberIndex;i++) { + written = WriteNumber(dest, Stack[i]); + dest_length += written; + dest += written; + } + source += 2; + break; + case 18: + CurrentNumberIndex -= (pfont->data.WeightVector.count - 1) * 6; + for (i = 0;i < CurrentNumberIndex;i++) { + written = WriteNumber(dest, Stack[i]); + dest_length += written; + dest += written; + } + source += 2; + break; + default: + for (i = 0;i < CurrentNumberIndex;i++) { + written = WriteNumber(dest, Stack[i]); + dest_length += written; + dest += written; + } + *dest++ = *source++; + *dest++ = *source++; + dest_length += 2; + break; + } + } else { + for (i = 0;i < CurrentNumberIndex;i++) { + written = WriteNumber(dest, Stack[i]); + dest_length += written; + dest += written; + } + *dest++ = *source++; + *dest++ = *source++; + dest_length += 2; + } + break; + case 10: + if (SubrsWithMM[Stack[CurrentNumberIndex - 1]] != 0) { + int index = Stack[CurrentNumberIndex - 1]; + int StackBase = CurrentNumberIndex - 1 - pfont->data.WeightVector.count * SubrsWithMM[index]; + + CurrentNumberIndex--; /* Remove the subr index */ + + for (i=0;i < StackBase; i++) { + written = WriteNumber(dest, Stack[i]); + dest_length += written; + dest += written; + } + for (i=0;idata; + state = crypt_charstring_seed; + gs_type1_encrypt(source, source, data->size, &state); + state = crypt_charstring_seed; + gs_type1_encrypt(stripped, stripped, dest_length, &state); + return dest_length; +} + /* * Write the Private dictionary. This is a separate procedure only for * readability. write_CharString is a parameter so that we can encrypt @@ -196,6 +486,7 @@ printer_param_list_t rlist; gs_param_list *const plist = (gs_param_list *)&rlist; int code = s_init_param_printer(&rlist, ppp, s); + byte *SubrsWithMM = 0; if (code < 0) return 0; @@ -278,15 +569,52 @@ if (code >= 0) gs_glyph_data_free(&gdata, "write_Private(Subrs)"); } + if (pfont->data.WeightVector.count != 0) + SubrsWithMM = gs_alloc_bytes(pfont->memory, n, "Subrs record"); + pprintd1(s, "/Subrs %d array\n", n); + + /* prescan the /Subrs array to see if any of the Subrs call out to OtherSubrs */ + if (pfont->data.WeightVector.count != 0) { + for (i = 0; i < n; ++i) { + if ((code = pdata->procs.subr_data(pfont, i, false, &gdata)) >= 0) { + code = CheckSubrForMM(&gdata, pfont); + if (code < 0) { + if (SubrsWithMM != 0) + gs_free_object(pfont->memory, SubrsWithMM, "free Subrs record"); + return code; + } + if (SubrsWithMM != 0) + SubrsWithMM[i] = code; + } + } + } + for (i = 0; i < n; ++i) if ((code = pdata->procs.subr_data(pfont, i, false, &gdata)) >= 0) { char buf[50]; if (gdata.bits.size) { - sprintf(buf, "dup %d %u -| ", i, gdata.bits.size); - stream_puts(s, buf); - write_CharString(s, gdata.bits.data, gdata.bits.size); + if (pfont->data.WeightVector.count != 0) { + byte *stripped; + gs_bytestring *data = (gs_bytestring *)&gdata.bits; + + stripped = gs_alloc_bytes(pfont->memory, data->size, "Subrs copy for OtherSubrs"); + code = strip_othersubrs(&gdata, pfont, stripped, SubrsWithMM); + if (code < 0) { + if (SubrsWithMM != 0) + gs_free_object(pfont->memory, SubrsWithMM, "free Subrs record"); + return code; + } + sprintf(buf, "dup %d %u -| ", i, code); + stream_puts(s, buf); + write_CharString(s, stripped, code); + gs_free_object(pfont->memory, stripped, "free Subrs copy for OtherSubrs"); + } else { + sprintf(buf, "dup %d %u -| ", i, gdata.bits.size); + stream_puts(s, buf); + write_CharString(s, gdata.bits.data, gdata.bits.size); + } stream_puts(s, " |\n"); } gs_glyph_data_free(&gdata, "write_Private(Subrs)"); @@ -328,18 +656,42 @@ ) { gs_const_string gstr; int code; + byte *stripped; code = pfont->procs.glyph_name((gs_font *)pfont, glyph, &gstr); - if (code < 0) + if (code < 0) { + if (SubrsWithMM != 0) + gs_free_object(pfont->memory, SubrsWithMM, "free Subrs record"); return code; + } + stream_puts(s, "/"); stream_write(s, gstr.data, gstr.size); - pprintd1(s, " %d -| ", gdata.bits.size); - write_CharString(s, gdata.bits.data, gdata.bits.size); + + if (pfont->data.WeightVector.count != 0) { + gs_bytestring *data = (gs_bytestring *)&gdata.bits; + + stripped = gs_alloc_bytes(pfont->memory, data->size, "CharStrings copy for OtherSubrs"); + code = strip_othersubrs(&gdata, pfont, stripped, SubrsWithMM); + if (code < 0) { + if (SubrsWithMM != 0) + gs_free_object(pfont->memory, SubrsWithMM, "free Subrs record"); + return code; + } + pprintd1(s, " %d -| ", code); + write_CharString(s, stripped, code); + gs_free_object(pfont->memory, stripped, "free CharStrings copy for OtherSubrs"); + } else { + pprintd1(s, " %d -| ", gdata.bits.size); + write_CharString(s, gdata.bits.data, gdata.bits.size); + } + stream_puts(s, " |-\n"); gs_glyph_data_free(&gdata, "write_Private(CharStrings)"); } } + if (SubrsWithMM != 0) + gs_free_object(pfont->memory, SubrsWithMM, "free Subrs record"); /* Wrap up. */ @@ -476,12 +828,19 @@ if (code < 0) return code; } + + /* + * This is nonsense. We cna't write the WeightVector alonr from a Multiple + * Master and expect any sensible results. Since its useless alone, there's + * no point in emitting it at all. Leaving the code in place in case we + * decide to write MM fonts one day. { const gs_type1_data *const pdata = &pfont->data; write_float_array(plist, "WeightVector", pdata->WeightVector.values, pdata->WeightVector.count); } + */ stream_puts(s, "currentdict end\n"); /* Write the Private dictionary. */ diff -Nru ghostscript-9.04~dfsg/base/gdevpsim.c ghostscript-9.05~dfsg~20120125/base/gdevpsim.c --- ghostscript-9.04~dfsg/base/gdevpsim.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpsim.c 2011-11-12 18:29:08.000000000 +0000 @@ -369,7 +369,7 @@ s_mode_write); a85s.memory = 0; a85state.memory = 0; - a85state.template = &s_A85E_template; + a85state.templat = &s_A85E_template; (*s_A85E_template.init) ((stream_state *) & a85state); a85s.state = (stream_state *) & a85state; a85s.procs.process = s_A85E_template.process; @@ -381,7 +381,7 @@ s_mode_write); rls.memory = 0; rlstate.memory = 0; - rlstate.template = &s_RLE_template; + rlstate.templat = &s_RLE_template; (*s_RLE_template.init) ((stream_state *) & rlstate); rls.state = (stream_state *) & rlstate; rls.procs.process = s_RLE_template.process; diff -Nru ghostscript-9.04~dfsg/base/gdevpx.c ghostscript-9.05~dfsg~20120125/base/gdevpx.c --- ghostscript-9.04~dfsg/base/gdevpx.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpx.c 2012-01-25 08:44:24.000000000 +0000 @@ -1397,6 +1397,7 @@ { gx_device_pclxl *const xdev = (gx_device_pclxl *)dev; stream *s; + int code; /* Note that unlike close_device, end_page must not omit blank pages. */ if (!xdev->in_page) @@ -1408,7 +1409,15 @@ pclxl_page_init(xdev); if (ferror(xdev->file)) return_error(gs_error_ioerror); - return gx_finish_output_page(dev, num_copies, flush); + if ((code = gx_finish_output_page(dev, num_copies, flush)) < 0) + return code; + /* Check if we need to change the output file for separate pages */ + if (gx_outputfile_is_separate_pages(((gx_device_vector *)dev)->fname, dev->memory)) { + if ((code = pclxl_close_device(dev)) < 0) + return code; + code = pclxl_open_device(dev); + } + return code; } /* Close the device. */ diff -Nru ghostscript-9.04~dfsg/base/gdevpxut.c ghostscript-9.05~dfsg~20120125/base/gdevpxut.c --- ghostscript-9.04~dfsg/base/gdevpxut.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevpxut.c 2011-09-29 11:01:33.000000000 +0000 @@ -115,11 +115,7 @@ int px_write_page_header(stream *s, const gx_device *dev) { - static const byte page_header_1[] = { - DUB(ePortraitOrientation), DA(pxaOrientation) - }; - - PX_PUT_LIT(s, page_header_1); + /* Orientation is deferred until px_write_select_media... */ return 0; } @@ -145,6 +141,7 @@ int i; pxeMediaSize_t size = eDefaultPaperSize; byte tray = eAutoSelect; + byte orientation = ePortraitOrientation; bool match_found = false; /* The default is eDefaultPaperSize (=96), but we'll emit CustomMediaSize */ @@ -156,11 +153,19 @@ match_found = true; size = media_sizes[i].ms; break; + } else if (fabs(media_sizes[i].height - w) < 0.05 && + fabs(media_sizes[i].width - h) < 0.05 + ) { + match_found = true; + size = media_sizes[i].ms; + orientation = eLandscapeOrientation; + break; } /* * According to the PCL XL documentation, MediaSize/CustomMediaSize must always * be specified, but MediaSource is optional. */ + px_put_uba(s, orientation, pxaOrientation); if (match_found) { /* standard media */ px_put_uba(s, (byte)size, pxaMediaSize); diff -Nru ghostscript-9.04~dfsg/base/gdevrinkj.c ghostscript-9.05~dfsg~20120125/base/gdevrinkj.c --- ghostscript-9.04~dfsg/base/gdevrinkj.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevrinkj.c 2012-01-25 08:44:24.000000000 +0000 @@ -403,14 +403,15 @@ rinkj_encode_color(gx_device *dev, const gx_color_value colors[]) { int bpc = ((rinkj_device *)dev)->bitspercomponent; - int drop = sizeof(gx_color_value) * 8 - bpc; gx_color_index color = 0; int i = 0; int ncomp = dev->color_info.num_components; + COLROUND_VARS; + COLROUND_SETUP(bpc); for (; i> drop); + color |= COLROUND_ROUND(colors[i]); } return (color == gx_no_color_index ? color ^ 1 : color); } @@ -1086,9 +1087,8 @@ if (cache[hash].key != color) { /* 3 channel to CMYK */ - gscms_transform_color(rdev->icc_link, &cbuf, - &(vbuf), 1, NULL); - + gscms_transform_color((gx_device *)rdev, rdev->icc_link, + &cbuf, &(vbuf), 1); cache[hash].key = color; cache[hash].value = ((bits32 *)vbuf)[0]; @@ -1113,9 +1113,8 @@ ((bits32 *)cbuf)[0] = color; /* 4 channel to CMYK */ - gscms_transform_color(rdev->icc_link, &cbuf, - &(vbuf), 1, NULL); - + gscms_transform_color((gx_device *)rdev, rdev->icc_link, + &cbuf, &(vbuf), 1); cache[hash].key = color; cache[hash].value = ((bits32 *)vbuf)[0]; } else { @@ -1146,9 +1145,8 @@ code was still working with 4 to 4 conversion. Replacing with new ICC AMP call */ - gscms_transform_color(rdev->icc_link, &cbuf, - &(vbuf), 1, NULL); - + gscms_transform_color((gx_device *) rdev, rdev->icc_link, + &cbuf, &(vbuf), 1); cache[hash].key = color; cache[hash].value = ((bits32 *)vbuf)[0]; } else { diff -Nru ghostscript-9.04~dfsg/base/gdevrops.c ghostscript-9.05~dfsg~20120125/base/gdevrops.c --- ghostscript-9.04~dfsg/base/gdevrops.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevrops.c 2011-11-21 08:55:19.000000000 +0000 @@ -41,7 +41,7 @@ static dev_proc_fill_rectangle(rop_texture_fill_rectangle); static dev_proc_copy_mono(rop_texture_copy_mono); static dev_proc_copy_color(rop_texture_copy_color); -static dev_proc_copy_plane(rop_texture_copy_plane); +static dev_proc_copy_planes(rop_texture_copy_planes); /* The device descriptor. */ static const gx_device_rop_texture gs_rop_texture_device = { @@ -113,7 +113,7 @@ NULL, /* pop_transparency_state */ NULL, /* put_image */ gx_forward_dev_spec_op, - rop_texture_copy_plane, /* copy plane */ + rop_texture_copy_planes, /* copy planes */ gx_forward_get_profile, gx_forward_set_graphics_type_tag }, @@ -163,6 +163,7 @@ source.sraster = 0; source.id = gx_no_bitmap_id; source.scolors[0] = source.scolors[1] = color; + source.planar_height = 0; source.use_scolors = true; return gx_device_color_fill_rectangle(&rtdev->texture, x, y, w, h, rtdev->target, @@ -186,6 +187,7 @@ source.id = id; source.scolors[0] = color0; source.scolors[1] = color1; + source.planar_height = 0; source.use_scolors = true; /* Adjust the logical operation per transparent colors. */ if (color0 == gx_no_color_index) @@ -211,6 +213,7 @@ source.sraster = raster; source.id = id; source.scolors[0] = source.scolors[1] = gx_no_color_index; + source.planar_height = 0; source.use_scolors = false; return gx_device_color_fill_rectangle(&rtdev->texture, x, y, w, h, rtdev->target, @@ -219,9 +222,10 @@ /* Copy a color rectangle */ static int -rop_texture_copy_plane(gx_device * dev, - const byte * data, int sourcex, int raster, gx_bitmap_id id, - int x, int y, int w, int h, int plane) +rop_texture_copy_planes(gx_device * dev, + const byte * data, int sourcex, int raster, + gx_bitmap_id id, int x, int y, int w, int h, + int plane_height) { gx_device_rop_texture *const rtdev = (gx_device_rop_texture *)dev; gx_rop_source_t source; @@ -231,10 +235,10 @@ source.sraster = raster; source.id = id; source.scolors[0] = source.scolors[1] = gx_no_color_index; + source.planar_height = plane_height; source.use_scolors = false; return gx_device_color_fill_rectangle(&rtdev->texture, x, y, w, h, rtdev->target, - (rtdev->log_op | lop_planar | - (plane<log_op, &source); } diff -Nru ghostscript-9.04~dfsg/base/gdevsunr.c ghostscript-9.05~dfsg~20120125/base/gdevsunr.c --- ghostscript-9.04~dfsg/base/gdevsunr.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevsunr.c 2011-09-29 11:01:33.000000000 +0000 @@ -57,7 +57,7 @@ /* Output bytes have to be padded to 16 bits. */ int rasLineBytes = ROUND_UP(gsLineBytes, 2); int lineCnt; - char *lineStorage; /* Allocated for passing storage to gdev_prn_get_bits() */ + byte *lineStorage; /* Allocated for passing storage to gdev_prn_get_bits() */ byte *data; sun_rasterfile_t ras; int code = 0; diff -Nru ghostscript-9.04~dfsg/base/gdevsvg.c ghostscript-9.05~dfsg~20120125/base/gdevsvg.c --- ghostscript-9.04~dfsg/base/gdevsvg.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevsvg.c 2012-01-25 08:44:24.000000000 +0000 @@ -257,6 +257,7 @@ svg_output_page(gx_device *dev, int num_copies, int flush) { gx_device_svg *const svg = (gx_device_svg*)dev; + int code; svg->page_count++; @@ -264,7 +265,15 @@ if (ferror(svg->file)) return gs_throw_code(gs_error_ioerror); - return gx_finish_output_page(dev, num_copies, flush); + if ((code=gx_finish_output_page(dev, num_copies, flush)) < 0) + return code; + /* Check if we need to change the output file for separate pages */ + if (gx_outputfile_is_separate_pages(((gx_device_vector *)dev)->fname, dev->memory)) { + if ((code = svg_close_device(dev)) < 0) + return code; + code = svg_open_device(dev); + } + return code; } /* Close the device */ diff -Nru ghostscript-9.04~dfsg/base/gdevtifs.c ghostscript-9.05~dfsg~20120125/base/gdevtifs.c --- ghostscript-9.04~dfsg/base/gdevtifs.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevtifs.c 2011-11-21 08:55:19.000000000 +0000 @@ -367,6 +367,16 @@ TIFFSetField(tif, TIFFTAG_SUBFILETYPE, FILETYPE_PAGE); TIFFSetField(tif, TIFFTAG_PAGENUMBER, pdev->PageCount, 0); + /* Set the ICC profile. Test to avoid issues with separations and also + if the color space is set to LAB, we do that as an enumerated type */ + if (pdev->icc_struct != NULL && pdev->icc_struct->device_profile[0] != NULL) { + cmm_profile_t *icc_profile = pdev->icc_struct->device_profile[0]; + if (icc_profile->num_comps == pdev->color_info.num_components && + icc_profile->data_cs != gsCIELAB) { + TIFFSetField(tif, TIFFTAG_ICCPROFILE, icc_profile->buffer_size, + icc_profile->buffer); + } + } return 0; } diff -Nru ghostscript-9.04~dfsg/base/gdevtrac.c ghostscript-9.05~dfsg~20120125/base/gdevtrac.c --- ghostscript-9.04~dfsg/base/gdevtrac.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevtrac.c 2011-11-21 08:55:19.000000000 +0000 @@ -280,6 +280,20 @@ return 0; } +static int +trace_strip_copy_rop2(gx_device * dev, const byte * sdata, int sourcex, + uint sraster, gx_bitmap_id id, + const gx_color_index * scolors, + const gx_strip_bitmap * textures, + const gx_color_index * tcolors, + int x, int y, int width, int height, + int phase_x, int phase_y, gs_logical_operation_t lop, + uint plane_height) +{ + dputs("**strip_copy_rop2**\n"); + return 0; +} + /* ---------------- High-level driver procedures ---------------- */ static int @@ -635,7 +649,33 @@ NULL, /* create_compositor */\ NULL, /* get_hardware_params */\ trace_text_begin,\ - NULL /* finish_copydevice */\ + NULL, /* finish_copydevice */\ + NULL, /* begin_transparency_group */\ + NULL, /* end_transparency_group */\ + NULL, /* begin_transparency_mask */\ + NULL, /* end_transparency_mask */\ + NULL, /* discard_transparency_layer */\ + NULL, /* get_color_mapping_procs */\ + NULL, /* get_color_comp_index */\ + NULL, /* encode_color */\ + NULL, /* decode_color */\ + NULL, /* pattern_manage */\ + NULL, /* fill_rectangle_hl_color */\ + NULL, /* include_color_space */\ + NULL, /* fill_linear_color_scanline */\ + NULL, /* fill_linear_color_trapezoid */\ + NULL, /* fill_linear_color_triangle */\ + NULL, /* update_spot_equivalent_colors */\ + NULL, /* ret_devn_params */\ + NULL, /* fillpage */\ + NULL, /* push_transparency_state */\ + NULL, /* pop_transparency_state */\ + NULL, /* put_image */\ + NULL, /* dev_spec_op */\ + NULL, /* copy_planes */\ + NULL, /* get_profile */\ + NULL, /* set_graphics_type_tag */\ + trace_strip_copy_rop2\ } const gx_device gs_tr_mono_device = { diff -Nru ghostscript-9.04~dfsg/base/gdevtsep.c ghostscript-9.05~dfsg~20120125/base/gdevtsep.c --- ghostscript-9.04~dfsg/base/gdevtsep.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevtsep.c 2011-11-21 08:55:19.000000000 +0000 @@ -385,10 +385,13 @@ static dev_proc_print_page(tiffsep_print_page); static dev_proc_get_color_mapping_procs(tiffsep_get_color_mapping_procs); static dev_proc_get_color_comp_index(tiffsep_get_color_comp_index); -static dev_proc_encode_color(tiffsep_encode_color); -static dev_proc_decode_color(tiffsep_decode_color); +#if USE_COMPRESSED_ENCODING static dev_proc_encode_color(tiffsep_encode_compressed_color); static dev_proc_decode_color(tiffsep_decode_compressed_color); +#else +static dev_proc_encode_color(tiffsep_encode_color); +#endif +static dev_proc_decode_color(tiffsep_decode_color); static dev_proc_update_spot_equivalent_colors(tiffsep_update_spot_equivalent_colors); static dev_proc_ret_devn_params(tiffsep_ret_devn_params); static dev_proc_open_device(tiffsep1_prn_open); @@ -463,12 +466,12 @@ /* we need to implement it separately because st_composite_final */ /* declares all 3 procedures as private. */ static void -tiffsep_device_finalize(void *vpdev) +tiffsep_device_finalize(const gs_memory_t *cmem, void *vpdev) { /* We need to deallocate the compressed_color_list. and the names. */ devn_free_params((gx_device*) vpdev); - gx_device_finalize(vpdev); + gx_device_finalize(cmem, vpdev); } gs_private_st_composite_final(st_tiffsep_device, tiffsep_device, @@ -697,6 +700,7 @@ return &tiffsep_cm_procs; } +#if USE_COMPRESSED_ENCODING /* * Encode a list of colorant values into a gx_color_index_value. * With 64 bit gx_color_index values, we compress the colorant values. This @@ -719,7 +723,7 @@ return devn_decode_compressed_color(dev, color, out, &(((tiffsep_device *)dev)->devn_params)); } - +#else /* * Encode a list of colorant values into a gx_color_index_value. * With 32 bit gx_color_index values, we simply pack values. @@ -728,17 +732,19 @@ tiffsep_encode_color(gx_device *dev, const gx_color_value colors[]) { int bpc = ((tiffsep_device *)dev)->devn_params.bitspercomponent; - int drop = sizeof(gx_color_value) * 8 - bpc; gx_color_index color = 0; int i = 0; int ncomp = dev->color_info.num_components; + COLROUND_VARS; + COLROUND_SETUP(bpc); for (; i < ncomp; i++) { color <<= bpc; - color |= (colors[i] >> drop); + color |= COLROUND_ROUND(colors[i]); } return (color == gx_no_color_index ? color ^ 1 : color); } +#endif /* * Decode a gx_color_index value back to a list of colorant values. @@ -1438,6 +1444,14 @@ int i, j, l, prev_l; unsigned char *thresh; gx_ht_bit *bits = (gx_ht_bit *)d_order->bit_data; + int num_repeat, shift; + int row_kk, col_kk, kk; + + /* We can have simple or complete orders. Simple ones tile the threshold + with shifts. To handle those we simply loop over the number of + repeats making sure to shift columns when we set our threshold values */ + num_repeat = d_order->full_height / d_order->height; + shift = d_order->shift; #ifdef DEBUG if ( gs_debug_c('h') ) { @@ -1448,7 +1462,7 @@ } #endif - thresh = (byte *)gs_malloc(memory, d_order->num_bits, 1, + thresh = (byte *)gs_malloc(memory, d_order->width * d_order->full_height, 1, "tiffsep1_threshold_array"); if( thresh == NULL ) { #ifdef DEBUG @@ -1464,7 +1478,7 @@ thresh[i] = 1; *Width = d_order->width; - *Height = d_order->height; + *Height = d_order->full_height; prev_l = 0; l = 1; @@ -1493,8 +1507,14 @@ dprintf3("row=%2d, col=%2d, t_level=%3d\n", row, col, t_level); #endif - if( col < (int)d_order->width ) - *(thresh+col+(row * d_order->width)) = t_level; + if( col < (int)d_order->width ) { + for (kk = 0; kk < num_repeat; kk++) { + row_kk = row + kk * d_order->height; + col_kk = col + kk * shift; + col_kk = col_kk % d_order->width; + *(thresh + col_kk + (row_kk * d_order->width)) = t_level; + } + } } prev_l = l; } @@ -1502,7 +1522,7 @@ } #ifdef DEBUG - if ( gs_debug_c('h') ) { + if (gs_debug_c('h')) { for( i=0; i<(int)d_order->height; i++ ) { dprintf1("threshold array row %3d= ", i); for( j=(int)d_order->width-1; j>=0; j-- ) @@ -1535,6 +1555,7 @@ char name[MAX_FILE_NAME_SIZE]; int base_filename_length = length_base_file_name(tfdev); int save_depth = pdev->color_info.depth; + int save_numcomps = pdev->color_info.num_components; const char *fmt; gs_parsed_file_name_t parsed; int non_encodable_count = 0; @@ -1609,12 +1630,14 @@ } pdev->color_info.depth = 8; /* Create files for 8 bit gray */ + pdev->color_info.num_components = 1; if (pdev->height > (max_long - ftell(file))/(pdev->width)) /* note width is never 0 in print_page */ return_error(gs_error_rangecheck); /* this will overflow max_long */ code = tiff_set_fields_for_printer(pdev, tfdev->tiff[comp_num], 1, 0); tiff_set_gray_fields(pdev, tfdev->tiff[comp_num], 8, tfdev->Compression, tfdev->MaxStripSize); pdev->color_info.depth = save_depth; + pdev->color_info.num_components = save_numcomps; if (code < 0) return code; } @@ -1709,6 +1732,7 @@ short map_comp_to_sep[GX_DEVICE_COLOR_MAX_COMPONENTS]; char name[MAX_FILE_NAME_SIZE]; int save_depth = pdev->color_info.depth; + int save_numcomps = pdev->color_info.num_components; const char *fmt; gs_parsed_file_name_t parsed; int non_encodable_count = 0; @@ -1785,9 +1809,11 @@ } pdev->color_info.depth = 8; /* Create files for 8 bit gray */ + pdev->color_info.num_components = 1; code = tiff_set_fields_for_printer(pdev, tfdev->tiff[comp_num], 1, 0); tiff_set_gray_fields(pdev, tfdev->tiff[comp_num], 1, tfdev->Compression, tfdev->MaxStripSize); pdev->color_info.depth = save_depth; + pdev->color_info.num_components = save_numcomps; if (code < 0) return code; diff -Nru ghostscript-9.04~dfsg/base/gdevtxtw.c ghostscript-9.05~dfsg~20120125/base/gdevtxtw.c --- ghostscript-9.04~dfsg/base/gdevtxtw.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevtxtw.c 2012-01-07 20:18:22.000000000 +0000 @@ -11,8 +11,9 @@ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. */ /*$Id: gdevtxtw.c 7795 2007-03-23 13:56:11Z tim $ */ -/* Device for ASCII or Unicode text extraction */ +/* Device for Unicode (UTF-8 or UCS2) text extraction */ #include "memory_.h" +#include "string_.h" #include "gp.h" /* for gp_file_name_sizeof */ #include "gx.h" #include "gserrors.h" @@ -25,9 +26,15 @@ #include "gstext.h" #include "gxfcid.h" #include "gxistate.h" +#include "gxpath.h" #include "gdevagl.h" -#include "string.h" +/* #define TRACE_TXTWRITE 1 */ + +extern single_glyph_list_t *SingleGlyphList; +extern double_glyph_list_t *DoubleGlyphList; +extern treble_glyph_list_t *TrebleGlyphList; +extern quad_glyph_list_t *QuadGlyphList; /* * Define the structure used to return glyph width information. Note that * there are two different sets of width information: real-number (x,y) @@ -52,14 +59,14 @@ * rendering mode, writing mode etc. These are stored as a series of x-ordered * entries in a list, using the starting x co-ordinate. */ -typedef struct text_list_entry_s text_list_entry_t; typedef struct text_list_entry_s { - text_list_entry_t *previous; - text_list_entry_t *next; + struct text_list_entry_s *previous; + struct text_list_entry_s *next; gs_point start; gs_point end; - gs_point topleft, topright; + gs_point FontBBox_bottomleft, FontBBox_topright; + float *Widths; unsigned short *Unicode_Text; int Unicode_Text_Size; int render_mode; @@ -71,19 +78,18 @@ int wmode; /* WMode of font */ double PaintType0Width; double size; -}; +} text_list_entry_t; /* Structure to maintain a list of text fragments, ordered by X co-ordinate. - * These strucutres are themselves maintained in a Y-ordered list. + * These structures are themselves maintained in a Y-ordered list. */ -typedef struct page_text_list_s page_text_list_t; typedef struct page_text_list_s { - page_text_list_t *previous; - page_text_list_t *next; + struct page_text_list_s *previous; + struct page_text_list_s *next; gs_point start; float MinY, MaxY; text_list_entry_t *x_ordered_list; -}; +} page_text_list_t; /* A simple structure to maintain the lists of text fragments, it is also * a convenient place to record the page number and anything else we may @@ -102,7 +108,7 @@ char fname[gp_file_name_sizeof]; /* OutputFile */ FILE *file; int TextFormat; -#if DEBUG +#ifdef TRACE_TXTWRITE FILE *DebugFile; #endif } gx_device_txtwrite_t; @@ -119,19 +125,8 @@ static dev_proc_fill_rectangle(txtwrite_fill_rectangle); static dev_proc_get_params(txtwrite_get_params); static dev_proc_put_params(txtwrite_put_params); -static dev_proc_copy_alpha(txtwrite_copy_alpha); -static dev_proc_copy_mono(txtwrite_copy_mono); -static dev_proc_copy_color(txtwrite_copy_color); static dev_proc_fill_path(txtwrite_fill_path); static dev_proc_stroke_path(txtwrite_stroke_path); -static dev_proc_fill_mask(txtwrite_fill_mask); -static dev_proc_fill_trapezoid(txtwrite_fill_trapezoid); -static dev_proc_fill_parallelogram(txtwrite_fill_parallelogram); -static dev_proc_fill_triangle(txtwrite_fill_triangle); -static dev_proc_draw_thin_line(txtwrite_draw_thin_line); -static dev_proc_strip_tile_rectangle(txtwrite_strip_tile_rectangle); -static dev_proc_strip_copy_rop(txtwrite_strip_copy_rop); -static dev_proc_begin_typed_image(txtwrite_begin_typed_image); static dev_proc_text_begin(txtwrite_text_begin); /* The device prototype */ @@ -145,6 +140,7 @@ bool charproc_accum; bool cdevproc_callout; double cdevproc_result[10]; + float *Widths; unsigned short *TextBuffer; int TextBufferIndex; text_list_entry_t *text_state; @@ -166,45 +162,45 @@ X_DPI, Y_DPI, 1, 8, 255, 0, 256, 1), {txtwrite_open_device, - NULL, //gx_upright_get_initial_matrix, - NULL, //gx_default_sync_output, + NULL, /*gx_upright_get_initial_matrix,*/ + NULL, /*gx_default_sync_output,*/ txtwrite_output_page, txtwrite_close_device, - NULL, //gx_default_gray_map_rgb_color, - NULL, //gx_default_gray_map_color_rgb, + NULL, /*gx_default_gray_map_rgb_color,*/ + NULL, /*gx_default_gray_map_color_rgb,*/ txtwrite_fill_rectangle, /* Can't be NULL and there is no gx_default_fill_rectangle! */ - NULL, //gx_default_tile_rectangle, - NULL, //gx_default_copy_mono, - NULL, //gx_default_copy_color, - NULL, //gx_default_draw_line, - NULL, //gx_default_get_bits, + NULL, /*gx_default_tile_rectangle,*/ + NULL, /*gx_default_copy_mono,*/ + NULL, /*gx_default_copy_color,*/ + NULL, /*gx_default_draw_line,*/ + NULL, /*gx_default_get_bits,*/ txtwrite_get_params, txtwrite_put_params, - NULL, //gx_default_map_cmyk_color, - NULL, //gx_default_get_xfont_procs, - NULL, //gx_default_get_xfont_device, - NULL, //gx_default_map_rgb_alpha_color, - NULL, //gx_page_device_get_page_device, + NULL, /*gx_default_map_cmyk_color,*/ + NULL, /*gx_default_get_xfont_procs,*/ + NULL, /*gx_default_get_xfont_device,*/ + NULL, /*gx_default_map_rgb_alpha_color,*/ + gx_page_device_get_page_device, /*gx_page_device_get_page_device,*/ NULL, /* get_alpha_bits */ - NULL, //gx_default_copy_alpha, + NULL, /*gx_default_copy_alpha,*/ NULL, /* get_band */ NULL, /* copy_rop */ txtwrite_fill_path, txtwrite_stroke_path, - NULL, //gx_default_fill_mask, - NULL, //gx_default_fill_trapezoid, - NULL, //gx_default_fill_parallelogram, - NULL, //gx_default_fill_triangle, - NULL, //gx_default_draw_thin_line, + NULL, /*gx_default_fill_mask,*/ + NULL, /*gx_default_fill_trapezoid,*/ + NULL, /*gx_default_fill_parallelogram,*/ + NULL, /*gx_default_fill_triangle,*/ + NULL, /*gx_default_draw_thin_line,*/ NULL, /* begin image */ NULL, /* image_data */ NULL, /* end_image */ - NULL, //gx_default_strip_tile_rectangle, - NULL, //gx_default_strip_copy_rop, + NULL, /*gx_default_strip_tile_rectangle,*/ + NULL, /*gx_default_strip_copy_rop,*/ NULL, /* get_clipping_box */ NULL, /* txtwrite_begin_typed_image */ NULL, /* get_bits_rectangle */ - NULL, //gx_default_map_color_rgb_alpha, + NULL, /*gx_default_map_color_rgb_alpha,*/ gx_null_create_compositor, NULL, /* get_hardware_params */ txtwrite_text_begin, @@ -219,12 +215,10 @@ NULL, /* encode_color */ NULL /* decode_color */ }, - 0, /* example_data */ - { 0 }, /* LastFont */ - 0, /* LastSize */ - 0, /* Page */ - { 0 }, /* OutputFile */ - 0 /* FILE *file */ + { 0 }, /* Page Data */ + { 0 }, /* Output Filename */ + 0, /* Output FILE * */ + 3 /* TextFormat */ }; #ifndef gx_device_textw_DEFINED @@ -244,7 +238,6 @@ static int txtwrite_open_device(gx_device * dev) { - int code; gx_device_txtwrite_t *const tdev = (gx_device_txtwrite_t *) dev; gx_device_fill_in_procs(dev); @@ -254,7 +247,7 @@ tdev->PageData.PageNum = 0; tdev->PageData.y_ordered_list = NULL; tdev->file = NULL; -#if DEBUG +#ifdef TRACE_TXTWRITE tdev->DebugFile = fopen("/temp/txtw_dbg.txt", "wb+"); #endif return 0; @@ -269,35 +262,23 @@ if (tdev->file) code = gx_device_close_output_file(dev, tdev->fname, tdev->file); -#if DEBUG +#ifdef TRACE_TXTWRITE fclose(tdev->DebugFile); #endif return code; } -static int simple_text_output(gx_device_txtwrite_t *tdev) +/* Routine inspects horizontal lines of text to see if they can be collapsed + * into a single line. This essentially detects superscripts and subscripts + * as well as lines which are slightly mis-aligned. + */ +static int merge_vertically(gx_device_txtwrite_t *tdev) { - int code, chars_wide; - float char_size, min_size, min_width_size; -#if DEBUG +#ifdef TRACE_TXTWRITE text_list_entry_t *debug_x; #endif - text_list_entry_t * x_entry; - page_text_list_t *y_list; - char PageNum[32], *p; - unsigned short UnicodeSpace = 0x20, UnicodeTab = 0x09, BOM=0xFEFF, UnicodeEOL[2] = {0x00D, 0x0a}, u; - - /* Write out the page number as a unicode string */ - sprintf(PageNum, "PAGE:%d\n", tdev->PageData.PageNum++); - p = (char *)&PageNum; - fwrite(&BOM, sizeof(unsigned short), 1, tdev->file); - while(*p != 0x00){ - u = *p++; - fwrite(&u, sizeof(unsigned short), 1, tdev->file); - } + page_text_list_t *y_list = tdev->PageData.y_ordered_list; - /* First lets try and consolidate horizontal lines of text */ - y_list = tdev->PageData.y_ordered_list; while (y_list && y_list->next) { page_text_list_t *next = y_list->next; bool collision = false; @@ -305,7 +286,7 @@ if (overlap >= (y_list->MaxY - y_list->MinY) / 4) { /* At least a 25% overlap, lets test for x collisions */ - text_list_entry_t *upper = y_list->x_ordered_list, *lower, *next_x; + text_list_entry_t *upper = y_list->x_ordered_list, *lower; while (upper && !collision) { lower = next->x_ordered_list; while (lower && !collision) { @@ -327,11 +308,11 @@ upper = upper->next; } if (!collision) { - text_list_entry_t *from, *to, *new_order, *next_from, *next_to, *current; + text_list_entry_t *from, *to, *new_order, *current; /* Consolidate y lists */ to = y_list->x_ordered_list; from = next->x_ordered_list; -#if DEBUG +#ifdef TRACE_TXTWRITE fprintf(tdev->DebugFile, "\nConsolidating two horizontal lines, line 1:"); debug_x = from; while (debug_x) { @@ -376,7 +357,7 @@ } } y_list->x_ordered_list = new_order; -#if DEBUG +#ifdef TRACE_TXTWRITE fprintf(tdev->DebugFile, "\nAfter:"); debug_x = new_order; while (debug_x) { @@ -395,9 +376,22 @@ } else y_list = next; } + return 0; +} + +/* Routine to merge horizontally adjacent text fragments. If the distance + * between two horizontal fragments is small, then they are treated as one + * frament of text, if its larger then we insert a space (and set the Width + * entry appropriately). Otherwise we leave them as separate. + */ +static int merge_horizontally(gx_device_txtwrite_t *tdev) +{ +#ifdef TRACE_TXTWRITE + text_list_entry_t *debug_x; +#endif + unsigned short UnicodeSpace = 0x20; + page_text_list_t *y_list = tdev->PageData.y_ordered_list; - /* Now lets try and merge horizontal fragments */ - y_list = tdev->PageData.y_ordered_list; while (y_list) { float average_width; text_list_entry_t *from, *to; @@ -410,15 +404,20 @@ if (to->start.x - from->end.x < average_width / 2) { /* consolidate fragments */ unsigned short *NewText; + float *NewWidths; NewText = (unsigned short *)gs_malloc(tdev->memory->stable_memory, - (from->Unicode_Text_Size + to->Unicode_Text_Size), sizeof(unsigned short), "txtwrite alloc text state"); - if (!NewText) { + (from->Unicode_Text_Size + to->Unicode_Text_Size), sizeof(unsigned short), "txtwrite alloc working text buffer"); + NewWidths = (float *)gs_malloc(tdev->memory->stable_memory, + (from->Unicode_Text_Size + to->Unicode_Text_Size), sizeof(float), "txtwrite alloc Widths array"); + if (!NewText || !NewWidths) { + if (NewText) + gs_free(tdev->memory, NewText, from->Unicode_Text_Size + to->Unicode_Text_Size, sizeof (unsigned short), "free working text fragment"); /* ran out of memory, don't consolidate */ from = from->next; to = to->next; } else { -#if DEBUG +#ifdef TRACE_TXTWRITE fprintf(tdev->DebugFile, "Consolidating two horizontal fragments in one line, before:\n\t"); fwrite(from->Unicode_Text, sizeof(unsigned short), from->Unicode_Text_Size, tdev->DebugFile); fprintf(tdev->DebugFile, "\n\t"); @@ -426,12 +425,17 @@ #endif memcpy(NewText, from->Unicode_Text, from->Unicode_Text_Size * sizeof(unsigned short)); memcpy(&NewText[from->Unicode_Text_Size], to->Unicode_Text, to->Unicode_Text_Size * sizeof(unsigned short)); + memcpy(NewWidths, from->Widths, from->Unicode_Text_Size * sizeof(float)); + memcpy(&NewWidths[from->Unicode_Text_Size], to->Widths, to->Unicode_Text_Size * sizeof(float)); gs_free(tdev->memory, from->Unicode_Text, from->Unicode_Text_Size, sizeof (unsigned short), "free consolidated text fragment"); gs_free(tdev->memory, to->Unicode_Text, to->Unicode_Text_Size, sizeof (unsigned short), "free consolidated text fragment"); + gs_free(tdev->memory, from->Widths, from->Unicode_Text_Size, sizeof (float), "free consolidated Widths array"); + gs_free(tdev->memory, to->Widths, to->Unicode_Text_Size, sizeof (float), "free consolidated Widths array"); gs_free(tdev->memory, to->FontName, 1, strlen(from->FontName) + 1, "free FontName"); from->Unicode_Text = NewText; from->Unicode_Text_Size += to->Unicode_Text_Size; -#if DEBUG + from->Widths = NewWidths; +#ifdef TRACE_TXTWRITE fprintf(tdev->DebugFile, "After:\n\t"); fwrite(from->Unicode_Text, sizeof(unsigned short), from->Unicode_Text_Size, tdev->DebugFile); #endif @@ -445,10 +449,15 @@ } else { if (to->start.x - from->end.x < average_width *2){ unsigned short *NewText; + float *NewWidths; NewText = (unsigned short *)gs_malloc(tdev->memory->stable_memory, (from->Unicode_Text_Size + to->Unicode_Text_Size + 1), sizeof(unsigned short), "txtwrite alloc text state"); - if (!NewText) { + NewWidths = (float *)gs_malloc(tdev->memory->stable_memory, + (from->Unicode_Text_Size + to->Unicode_Text_Size + 1), sizeof(float), "txtwrite alloc Widths array"); + if (!NewText || !NewWidths) { + if (NewText) + gs_free(tdev->memory, NewText, from->Unicode_Text_Size + to->Unicode_Text_Size, sizeof (unsigned short), "free working text fragment"); /* ran out of memory, don't consolidate */ from = from->next; to = to->next; @@ -456,11 +465,17 @@ memcpy(NewText, from->Unicode_Text, from->Unicode_Text_Size * sizeof(unsigned short)); memcpy(&NewText[from->Unicode_Text_Size], &UnicodeSpace, sizeof(unsigned short)); memcpy(&NewText[from->Unicode_Text_Size + 1], to->Unicode_Text, to->Unicode_Text_Size * sizeof(unsigned short)); + memcpy(NewWidths, from->Widths, from->Unicode_Text_Size * sizeof(float)); + NewWidths[from->Unicode_Text_Size] = to->start.x - from->end.x; + memcpy(&NewWidths[from->Unicode_Text_Size + 1], to->Widths, to->Unicode_Text_Size * sizeof(float)); gs_free(tdev->memory, from->Unicode_Text, from->Unicode_Text_Size, sizeof (unsigned short), "free consolidated text fragment"); gs_free(tdev->memory, to->Unicode_Text, to->Unicode_Text_Size, sizeof (unsigned short), "free consolidated text fragment"); + gs_free(tdev->memory, from->Widths, from->Unicode_Text_Size, sizeof (float), "free consolidated Widths array"); + gs_free(tdev->memory, to->Widths, to->Unicode_Text_Size, sizeof (float), "free consolidated Widths array"); gs_free(tdev->memory, to->FontName, 1, strlen(from->FontName) + 1, "free FontName"); from->Unicode_Text = NewText; from->Unicode_Text_Size += to->Unicode_Text_Size + 1; + from->Widths = NewWidths; from->end = to->end; from->next = to->next; if (from->next) @@ -476,6 +491,62 @@ } y_list = y_list->next; } + return 0; +} + +static int write_simple_text(unsigned short *text, int count, gx_device_txtwrite_t *tdev) +{ + switch(tdev->TextFormat) { + case 2: + fwrite(text, sizeof (unsigned short), count, tdev->file); + break; + case 3: + { + int i; + unsigned short *UTF16 = (unsigned short *)text; + unsigned char UTF8[3]; + + for (i=0;ifile); + } else { + if (*UTF16 < 0x800) { + UTF8[0] = (*UTF16 >> 11) + 0xC0; + UTF8[1] = (*UTF16 & 0x3F) + 0x80; + fwrite (UTF8, sizeof(unsigned char), 2, tdev->file); + } else { + UTF8[0] = (*UTF16 >> 12) + 0xE0; + UTF8[1] = ((*UTF16 >> 6) & 0x3F) + 0x80; + UTF8[2] = (*UTF16 & 0x3F) + 0x80; + fwrite (UTF8, sizeof(unsigned char), 3, tdev->file); + } + } + UTF16++; + } + } + break; + default: + return gs_note_error(gs_error_rangecheck); + break; + } + return 0; +} + +static int simple_text_output(gx_device_txtwrite_t *tdev) +{ + int chars_wide; + float char_size, min_size, min_width_size; +#ifdef TRACE_TXTWRITE + text_list_entry_t *debug_x; +#endif + text_list_entry_t * x_entry; + page_text_list_t *y_list; + unsigned short UnicodeSpace = 0x20, UnicodeEOL[2] = {0x00D, 0x0a}; + + merge_vertically(tdev); + + merge_horizontally(tdev); min_size = (float)tdev->width; /* Estimate maximum text density */ @@ -515,10 +586,10 @@ x_entry = y_list->x_ordered_list; while (x_entry) { while (xpos < x_entry->start.x) { - fwrite(&UnicodeSpace, sizeof (unsigned short), 1, tdev->file); + write_simple_text(&UnicodeSpace, 1, tdev); xpos += char_size; } - fwrite(x_entry->Unicode_Text, sizeof (unsigned short), x_entry->Unicode_Text_Size, tdev->file); + write_simple_text(x_entry->Unicode_Text, x_entry->Unicode_Text_Size, tdev); xpos += x_entry->Unicode_Text_Size * char_size; if (x_entry->next) { x_entry = x_entry->next; @@ -526,7 +597,7 @@ x_entry = NULL; } } - fwrite(&UnicodeEOL, sizeof(unsigned short), 2, tdev->file); + write_simple_text((unsigned short *)&UnicodeEOL, 2, tdev); if (y_list->next) { y_list = y_list->next; } else { @@ -536,24 +607,187 @@ return 0; } +static int escaped_Unicode (unsigned short Unicode, char *Buf) +{ + switch (Unicode) + { + case 0x3C: sprintf(Buf, "<"); break; + case 0x3E: sprintf(Buf, ">"); break; + case 0x26: sprintf(Buf, "&"); break; + case 0x22: sprintf(Buf, """); break; + case 0x27: sprintf(Buf, "'"); break; + default: + if (Unicode >= 32 && Unicode <= 127) + sprintf(Buf, "%c", Unicode); + else + sprintf(Buf, "&#x%x;", Unicode); + break; + } + + return 0; +} + static int decorated_text_output(gx_device_txtwrite_t *tdev) { - int code; + int i; text_list_entry_t * x_entry, *next_x; - unsigned short UnicodeEOL[2] = {0x00D, 0x0a}; - char TextBuffer[512], Fontname[256]; - gs_font *base; + char TextBuffer[512], Escaped[32]; + float xpos; + page_text_list_t *y_list; +#ifdef TRACE_TXTWRITE + text_list_entry_t *debug_x; +#endif - x_entry = tdev->PageData.unsorted_text_list; - while (x_entry) { - next_x = x_entry->next; - sprintf(TextBuffer, " ", - x_entry->FontName, x_entry->size, x_entry->render_mode, x_entry->wmode, x_entry->start.x, - x_entry->start.y, x_entry->end.x,x_entry->end.y); - fwrite(TextBuffer, 1, strlen(TextBuffer), tdev->file); - fwrite(x_entry->Unicode_Text, sizeof (unsigned short), x_entry->Unicode_Text_Size, tdev->file); - fwrite(&UnicodeEOL, sizeof(unsigned short), 2, tdev->file); - x_entry = next_x; + if (tdev->TextFormat == 0) { + fwrite("\n", sizeof(unsigned char), 7, tdev->file); + x_entry = tdev->PageData.unsorted_text_list; + while (x_entry) { + next_x = x_entry->next; + sprintf(TextBuffer, "\n", x_entry->start.x, x_entry->start.y, + x_entry->end.x, x_entry->end.y, x_entry->FontName,x_entry->size); + fwrite(TextBuffer, 1, strlen(TextBuffer), tdev->file); + xpos = x_entry->start.x; + for (i=0;iUnicode_Text_Size;i++) { + escaped_Unicode(x_entry->Unicode_Text[i], (char *)&Escaped); + sprintf(TextBuffer, "\n", xpos, + x_entry->start.y, xpos + x_entry->Widths[i], x_entry->end.y, Escaped); + fwrite(TextBuffer, 1, strlen(TextBuffer), tdev->file); + xpos += x_entry->Widths[i]; + } + fwrite("\n", sizeof(unsigned char), 8, tdev->file); + + x_entry = next_x; + } + fwrite("\n", sizeof(unsigned char), 8, tdev->file); + } else { + + merge_vertically(tdev); + merge_horizontally(tdev); + + y_list = tdev->PageData.y_ordered_list; + fwrite("\n", sizeof(unsigned char), 7, tdev->file); + /* Walk the list looking for 'blocks' */ + do { + page_text_list_t *temp; + page_text_t block; + page_text_list_t *block_line; + float BBox[4]; + + memset(&block, 0x00, sizeof(page_text_t)); + memset(BBox, 0x00, sizeof(float) * 4); + + while (y_list) { + if (block.y_ordered_list) { + text_list_entry_t *x_entry = y_list->x_ordered_list; + + block_line = block.y_ordered_list; + while (x_entry) { + if (x_entry->start.x > BBox[2] || x_entry->end.x < BBox[0] || + x_entry->start.y > (BBox[1] + (BBox[3] - BBox[1]))) { + ; + } else { + block_line->next = (page_text_list_t *)gs_malloc(tdev->memory->stable_memory, 1, + sizeof(page_text_list_t), "txtwrite alloc Y-list"); + memset(block_line->next, 0x00, sizeof(page_text_list_t)); + block_line = block_line->next; + block_line->x_ordered_list = x_entry; + if(x_entry->next) + x_entry->next->previous = x_entry->previous; + if (x_entry->previous) + x_entry->previous->next = x_entry->next; + else { + if (x_entry->next == 0x00) { + /* remove Y entry */ + temp = y_list->next; + if (y_list->previous) + y_list->previous->next = y_list->next; + if (y_list->next) + y_list->next->previous = y_list->previous; + else { + if (y_list->previous == 0x00) { + tdev->PageData.y_ordered_list = 0x00; + } + } + gs_free(tdev->memory, y_list, 1, sizeof(page_text_list_t), "txtwrite free text list"); + if (tdev->PageData.y_ordered_list == y_list) + tdev->PageData.y_ordered_list = temp; + y_list = temp; + x_entry = x_entry->next; + continue; + } + } + if (block_line->x_ordered_list->start.x < BBox[0]) + BBox[0] = block_line->x_ordered_list->start.x; + if (block_line->x_ordered_list->start.y < BBox[1]) + BBox[1] = block_line->x_ordered_list->start.y; + if (block_line->x_ordered_list->end.x < BBox[2]) + BBox[2] = block_line->x_ordered_list->end.x; + if (block_line->x_ordered_list->end.y + block_line->x_ordered_list->FontBBox_topright.y < BBox[3]) + BBox[3] = block_line->x_ordered_list->end.y + block_line->x_ordered_list->FontBBox_topright.y; + } + x_entry = x_entry->next; + } + } else { + block.y_ordered_list = block_line = (page_text_list_t *)gs_malloc(tdev->memory->stable_memory, 1, + sizeof(page_text_list_t), "txtwrite alloc Y-list"); + memset(block_line, 0x00, sizeof(page_text_list_t)); + block_line->x_ordered_list = y_list->x_ordered_list; + y_list->x_ordered_list = y_list->x_ordered_list->next; + if (y_list->x_ordered_list == 0x00) { + temp = y_list->next; + if (y_list->previous) + y_list->previous->next = y_list->next; + if (y_list->next) + y_list->next->previous = y_list->previous; + else { + if (y_list->previous == 0x00) { + tdev->PageData.y_ordered_list = 0x00; + } + } + gs_free(tdev->memory, y_list, 1, sizeof(page_text_list_t), "txtwrite free text list"); + if (tdev->PageData.y_ordered_list == y_list) + tdev->PageData.y_ordered_list = temp; + y_list = temp; + continue; + } + block_line->x_ordered_list->next = block_line->x_ordered_list->previous = 0x00; + BBox[0] = block_line->x_ordered_list->start.x; + BBox[1] = block_line->x_ordered_list->start.y; + BBox[2] = block_line->x_ordered_list->end.x; + BBox[3] = block_line->x_ordered_list->end.y + block_line->x_ordered_list->FontBBox_topright.y; + } + if (y_list) + y_list = y_list->next; + } + /* FIXME - need to free the used memory in here */ + fwrite("\n", sizeof(unsigned char), 8, tdev->file); + block_line = block.y_ordered_list; + while (block_line) { + fwrite("\n", sizeof(unsigned char), 7, tdev->file); + x_entry = block_line->x_ordered_list; + while(x_entry) { + sprintf(TextBuffer, "\n", x_entry->start.x, x_entry->start.y, + x_entry->end.x, x_entry->end.y, x_entry->FontName,x_entry->size); + fwrite(TextBuffer, 1, strlen(TextBuffer), tdev->file); + xpos = x_entry->start.x; + for (i=0;iUnicode_Text_Size;i++) { + escaped_Unicode(x_entry->Unicode_Text[i], (char *)&Escaped); + sprintf(TextBuffer, "\n", xpos, + x_entry->start.y, xpos + x_entry->Widths[i], x_entry->end.y, Escaped); + fwrite(TextBuffer, 1, strlen(TextBuffer), tdev->file); + xpos += x_entry->Widths[i]; + } + fwrite("\n", sizeof(unsigned char), 8, tdev->file); + x_entry = x_entry->next; + } + fwrite("\n", sizeof(unsigned char), 8, tdev->file); + block_line = block_line->next; + } + fwrite("\n", sizeof(unsigned char), 9, tdev->file); + y_list = tdev->PageData.y_ordered_list; + } while (y_list); + + fwrite("\n", sizeof(unsigned char), 8, tdev->file); } return 0; } @@ -578,13 +812,15 @@ switch(tdev->TextFormat) { case 0: - code = simple_text_output(tdev); + case 1: + code = decorated_text_output(tdev); if (code < 0) return code; break; - case 1: - code = decorated_text_output(tdev); + case 2: + case 3: + code = simple_text_output(tdev); if (code < 0) return code; break; @@ -604,6 +840,7 @@ x_entry = y_list->x_ordered_list; while (x_entry) { gs_free(tdev->memory, x_entry->Unicode_Text, x_entry->Unicode_Text_Size, sizeof (usnigned short), "txtwrite free text fragment text buffer"); + gs_free(tdev->memory, x_entry->Widths, x_entry->Unicode_Text_Size, sizeof (float), "txtwrite free widths array"); gs_free(tdev->memory, x_entry->FontName, 1, strlen(x_entry->FontName) + 1, "txtwrite free Font Name"); if (x_entry->next) { x_entry = x_entry->next; @@ -628,6 +865,7 @@ while (x_entry) { next_x = x_entry->next; gs_free(tdev->memory, x_entry->Unicode_Text, x_entry->Unicode_Text_Size, sizeof (usnigned short), "txtwrite free unsorted text fragment text buffer"); + gs_free(tdev->memory, x_entry->Widths, x_entry->Unicode_Text_Size, sizeof (float), "txtwrite free widths array"); gs_free(tdev->memory, x_entry->FontName, 1, strlen(x_entry->FontName) + 1, "txtwrite free Font Name"); gs_free(tdev->memory, x_entry, 1, sizeof(text_list_entry_t), "txtwrite free unsorted text fragment"); x_entry = next_x; @@ -744,6 +982,7 @@ int code; const char *param_name; gs_param_string ofs; + bool dummy; switch (code = param_read_string(plist, (param_name = "OutputFile"), &ofs)) { case 0: @@ -773,6 +1012,18 @@ if (code < 0) return code; + code = param_read_bool(plist, "WantsToUnicode", &dummy); + if (code < 0) + return code; + + code = param_read_bool(plist, "HighLevelDevice", &dummy); + if (code < 0) + return code; + + code = param_read_bool(plist, "PreserveTrMode", &dummy); + if (code < 0) + return code; + code = gx_default_put_params(dev, plist); if (code < 0) return code; @@ -1206,7 +1457,7 @@ * Return TEXT_PROCESS_CDEVPROC if a CDevProc callout is needed. * cdevproc_result != NULL if we restart after a CDevProc callout. */ -int +static int txt_glyph_widths(gs_font *font, int wmode, gs_glyph glyph, gs_font *orig_font, txt_glyph_widths_t *pwidths, const double cdevproc_result[10]) @@ -1245,7 +1496,8 @@ to be equal to half glyph width, and AR5 takes it from W, DW. So make a compatibe data here. */ - if (code == gs_error_undefined || !(info.members & (GLYPH_INFO_WIDTH0 << wmode))) { + if (font->FontType != ft_PCL_user_defined && font->FontType != ft_GL2_stick_user_defined + && (code == gs_error_undefined || !(info.members & (GLYPH_INFO_WIDTH0 << wmode)))) { code = get_missing_width(font, wmode, &scale_c, pwidths); if (code < 0) v.y = 0; @@ -1290,14 +1542,10 @@ } } pwidths->Width.v = v; -#if 0 - if (code > 0) - pwidths->Width.xy.x = pwidths->Width.xy.y = pwidths->Width.w = 0; -#else /* Skip only if not paralel to the axis. */ + /* Skip only if not paralel to the axis. */ if (code > 0 && ofont->FontType != ft_CID_encrypted && ofont->FontType != ft_CID_TrueType) pwidths->Width.xy.x = pwidths->Width.xy.y = pwidths->Width.w = 0; -#endif if (cdevproc_result == NULL) { info.members = 0; code = ofont->procs.glyph_info(ofont, glyph, NULL, @@ -1369,7 +1617,7 @@ /* Simple routine to update the current point by the accumulated width of the * text. */ -int +static int txt_shift_text_currentpoint(textw_text_enum_t *penum, gs_point *wpt) { gs_state *pgs; @@ -1419,7 +1667,6 @@ } } if (unicode == GS_NO_CHAR) { - char *Glyph; int index = 0; /* Search glyph to single Unicode value table */ @@ -1504,25 +1751,22 @@ * text rendering mode, writing mode, etc. */ -int txtwrite_process_cmap_text(gs_text_enum_t *pte) +static int +txtwrite_process_cmap_text(gs_text_enum_t *pte) { textw_text_enum_t *const penum = (textw_text_enum_t *)pte; - gx_device_txtwrite_t *const tdev = (gx_device_txtwrite_t *) pte->dev; - unsigned int unicode, rcode = 0; + unsigned int rcode = 0; gs_text_enum_t scan = *(gs_text_enum_t *)pte; /* Composite font using a CMap */ for ( ; ; ) { gs_glyph glyph; - gs_glyph_info_t info; int font_code, font_index, code; - gs_font *subfont;//new_font = 0; + gs_font *subfont; gs_char chr; - gs_matrix scale_c, scale_o; - gs_font_info_t finfo; txt_glyph_widths_t widths; gs_matrix m3; - gs_point did, wanted, tpt; /* user space */ + gs_point wanted; /* user space */ gs_point dpt = {0,0}; font_code = scan.orig_font->procs.next_char_glyph @@ -1556,6 +1800,7 @@ &penum->text_state->matrix, &wanted); pte->returned.total_width.x += wanted.x; pte->returned.total_width.y += wanted.y; + penum->Widths[pte->index - 1] = wanted.x; if (pte->text.operation & TEXT_ADD_TO_ALL_WIDTHS) { gs_point tpt; @@ -1577,6 +1822,7 @@ pte->returned.total_width.y += dpt.y; penum->TextBufferIndex += get_unicode((gs_font *)pte->orig_font, glyph, chr, &penum->TextBuffer[penum->TextBufferIndex]); + penum->Widths[pte->index - 1] += dpt.x; break; case 2: /* end of string */ return 0; @@ -1589,24 +1835,19 @@ return rcode; } -int txtwrite_process_plain_text(gs_text_enum_t *pte) +static int +txtwrite_process_plain_text(gs_text_enum_t *pte) { /* one byte regular font */ textw_text_enum_t *const penum = (textw_text_enum_t *)pte; - gx_device_txtwrite_t *const tdev = (gx_device_txtwrite_t *) pte->dev; - uint size = pte->text.size - pte->index; - char *ptr; gs_font *font = pte->orig_font; const gs_glyph *gdata = NULL; gs_glyph glyph; - gs_const_string gnstr; gs_char ch; - unsigned int unicode; int i, code; uint operation = pte->text.operation; txt_glyph_widths_t widths; - gs_matrix m3; - gs_point did, wanted, tpt; /* user space */ + gs_point wanted; /* user space */ gs_point dpt = {0,0}; for (i=0;itext.size;i++) { @@ -1634,6 +1875,7 @@ &penum->text_state->matrix, &wanted); pte->returned.total_width.x += wanted.x; pte->returned.total_width.y += wanted.y; + penum->Widths[pte->index - 1] = wanted.x; if (pte->text.operation & TEXT_ADD_TO_ALL_WIDTHS) { gs_point tpt; @@ -1655,6 +1897,7 @@ pte->returned.total_width.y += dpt.y; penum->TextBufferIndex += get_unicode((gs_font *)pte->orig_font, glyph, ch, &penum->TextBuffer[penum->TextBufferIndex]); + penum->Widths[pte->index - 1] += dpt.x; } return 0; } @@ -1666,7 +1909,8 @@ * properties, at least when outputting a simple representation. We won't * do this for languages which don't read left/right or right/left though. */ -int txt_add_sorted_fragment(gx_device_txtwrite_t *tdev, textw_text_enum_t *penum) +static int +txt_add_sorted_fragment(gx_device_txtwrite_t *tdev, textw_text_enum_t *penum) { if (!tdev->PageData.y_ordered_list) { /* first entry, no need to sort, just store it */ @@ -1709,14 +1953,14 @@ if (penum->text_state->next) penum->text_state->next->previous = penum->text_state; } - if (penum->text_state->topleft.y < Y_List->MinY) - Y_List->MinY = penum->text_state->topleft.y; - if (penum->text_state->topleft.y > Y_List->MaxY) - Y_List->MaxY = penum->text_state->topleft.y; - if (penum->text_state->topright.y < Y_List->MinY) - Y_List->MinY = penum->text_state->topright.y; - if (penum->text_state->topright.y > Y_List->MaxY) - Y_List->MaxY = penum->text_state->topright.y; + if (penum->text_state->FontBBox_bottomleft.y < Y_List->MinY) + Y_List->MinY = penum->text_state->FontBBox_bottomleft.y; + if (penum->text_state->FontBBox_bottomleft.y > Y_List->MaxY) + Y_List->MaxY = penum->text_state->FontBBox_bottomleft.y; + if (penum->text_state->FontBBox_topright.y < Y_List->MinY) + Y_List->MinY = penum->text_state->FontBBox_topright.y; + if (penum->text_state->FontBBox_topright.y > Y_List->MaxY) + Y_List->MaxY = penum->text_state->FontBBox_topright.y; } else { /* New y-position, make a Y list new record */ page_text_list_t *Y_Entry = (page_text_list_t *)gs_malloc(tdev->memory->stable_memory, 1, @@ -1726,12 +1970,12 @@ Y_Entry->x_ordered_list = penum->text_state; Y_Entry->start = penum->text_state->start; - if (penum->text_state->topleft.y > penum->text_state->topright.y) { - Y_Entry->MinY = penum->text_state->topright.y; - Y_Entry->MaxY = penum->text_state->topleft.y; + if (penum->text_state->FontBBox_bottomleft.y > penum->text_state->FontBBox_topright.y) { + Y_Entry->MinY = penum->text_state->FontBBox_topright.y; + Y_Entry->MaxY = penum->text_state->FontBBox_bottomleft.y; } else { - Y_Entry->MaxY = penum->text_state->topright.y; - Y_Entry->MinY = penum->text_state->topleft.y; + Y_Entry->MaxY = penum->text_state->FontBBox_topright.y; + Y_Entry->MinY = penum->text_state->FontBBox_bottomleft.y; } if (Y_List->start.y > penum->text_state->start.y) { @@ -1758,7 +2002,8 @@ return 0; } -int txt_add_fragment(gx_device_txtwrite_t *tdev, textw_text_enum_t *penum) +static int +txt_add_fragment(gx_device_txtwrite_t *tdev, textw_text_enum_t *penum) { text_list_entry_t *unsorted_entry, *t; @@ -1785,12 +2030,24 @@ return gs_note_error(gs_error_VMerror); memcpy(penum->text_state->Unicode_Text, penum->TextBuffer, penum->TextBufferIndex * sizeof(unsigned short)); + penum->text_state->Widths = (float *)gs_malloc(tdev->memory->stable_memory, + penum->TextBufferIndex, sizeof(float), "txtwrite alloc widths array"); + if (!penum->text_state->Widths) + return gs_note_error(gs_error_VMerror); + memcpy(penum->text_state->Widths, penum->Widths, penum->TextBufferIndex * sizeof(float)); + unsorted_entry->Unicode_Text = (unsigned short *)gs_malloc(tdev->memory->stable_memory, penum->TextBufferIndex, sizeof(unsigned short), "txtwrite alloc sorted text buffer"); if (!unsorted_entry->Unicode_Text) return gs_note_error(gs_error_VMerror); memcpy(unsorted_entry->Unicode_Text, penum->TextBuffer, penum->TextBufferIndex * sizeof(unsigned short)); + unsorted_entry->Widths = (float *)gs_malloc(tdev->memory->stable_memory, + penum->TextBufferIndex, sizeof(float), "txtwrite alloc widths array"); + if (!unsorted_entry->Widths) + return gs_note_error(gs_error_VMerror); + memcpy(unsorted_entry->Widths, penum->Widths, penum->TextBufferIndex * sizeof(float)); + unsorted_entry->FontName = (char *)gs_malloc(tdev->memory->stable_memory, (strlen(penum->text_state->FontName) + 1), sizeof(unsigned short), "txtwrite alloc sorted text buffer"); if (!unsorted_entry->Unicode_Text) @@ -1820,19 +2077,14 @@ * because there are ways that regular text can be handled that aren't possible * with CIDFonts. */ -int +static int textw_text_process(gs_text_enum_t *pte) { textw_text_enum_t *const penum = (textw_text_enum_t *)pte; gx_device_txtwrite_t *const tdev = (gx_device_txtwrite_t *) pte->dev; - uint operation = pte->text.operation; - uint size = pte->text.size - pte->index; gs_font *font = pte->orig_font; gs_font_base *font_base = (gs_font_base *)pte->current_font; - char *ptr; - unsigned short BOM=0xFEFF; int code = 0; - gs_state *pgs; if (!penum->TextBuffer) { /* We can get up to 4 Unicode points per glyph, and a glyph can be @@ -1846,6 +2098,10 @@ pte->text.size * 4, sizeof(unsigned short), "txtwrite temporary text buffer"); if (!penum->TextBuffer) return gs_note_error(gs_error_VMerror); + penum->Widths = (float *)gs_malloc(tdev->memory->stable_memory, + pte->text.size, sizeof(float), "txtwrite temporary widths array"); + if (!penum->Widths) + return gs_note_error(gs_error_VMerror); } { switch (font->FontType) { @@ -1879,8 +2135,10 @@ gs_point_transform(font_base->FontBBox.p.x, font_base->FontBBox.q.y, &m, &p1); gs_point_transform(font_base->FontBBox.q.x, font_base->FontBBox.p.y, &m, &p2); gs_point_transform(font_base->FontBBox.q.x, font_base->FontBBox.q.y, &m, &p3); - penum->text_state->topleft.y = min(min(p0.y, p1.y), min(p1.y, p2.y)); - penum->text_state->topright.y = max(max(p0.y, p1.y), max(p1.y, p2.y)); + penum->text_state->FontBBox_bottomleft.x = min(min(p0.x, p1.x), min(p1.x, p2.x)); + penum->text_state->FontBBox_topright.x = max(max(p0.x, p1.x), max(p1.x, p2.x)); + penum->text_state->FontBBox_bottomleft.y = min(min(p0.y, p1.y), min(p1.y, p2.y)); + penum->text_state->FontBBox_topright.y = max(max(p0.y, p1.y), max(p1.y, p2.y)); } code = txt_shift_text_currentpoint(penum, &penum->returned.total_width); if (code != 0) @@ -1946,6 +2204,8 @@ /* Free the working buffer where the Unicode was assembled from the enumerated text */ if (penum->TextBuffer) gs_free(tdev->memory, penum->TextBuffer, 1, penum->TextBufferIndex, "txtwrite free temporary text buffer"); + if (penum->Widths) + gs_free(tdev->memory, penum->Widths, sizeof(float), pte->text.size, "txtwrite free temporary widths array"); /* If this is copied away when we complete the text enumeration succesfully, then * we set the pointer to NULL, if we get here with it non-NULL , then there was * an error. diff -Nru ghostscript-9.04~dfsg/base/gdevvec.c ghostscript-9.05~dfsg~20120125/base/gdevvec.c --- ghostscript-9.04~dfsg/base/gdevvec.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevvec.c 2012-01-25 08:44:24.000000000 +0000 @@ -278,7 +278,7 @@ code = gx_device_open_output_file((gx_device *)vdev, vdev->fname, binary, false, &vdev->file); } - if (code >= 0) { + if ((code >= 0) && (dev_proc(vdev, get_profile) != NULL)) { code = dev_proc(vdev, get_profile)((gx_device *)vdev, &icc_struct); } @@ -962,6 +962,8 @@ int code; gs_param_name param_name; gs_param_string ofns; + bool open = dev->is_open; + switch (code = param_read_string(plist, (param_name = "OutputFile"), &ofns)) { case 0: @@ -979,18 +981,14 @@ /* The new name is the same as the old name. Do nothing. */ ofns.data = 0; break; - } else if (dev->LockSafetyParams || - (dev->is_open && vdev->strm != 0 && - stell(vdev->strm) != 0) - ) - ecode = (dev->LockSafetyParams) ? gs_error_invalidaccess : - gs_error_rangecheck; - else - break; - goto ofe; + } else if (dev->LockSafetyParams) { + ecode = gs_error_invalidaccess; + goto ofe; + } + break; default: ecode = code; - ofe:param_signal_error(plist, param_name, ecode); +ofe: param_signal_error(plist, param_name, ecode); case 1: ofns.data = 0; break; @@ -999,8 +997,6 @@ if (ecode < 0) return ecode; { - bool open = dev->is_open; - /* Don't let gx_default_put_params close the device. */ dev->is_open = false; code = gx_default_put_params(dev, plist); @@ -1010,18 +1006,35 @@ return code; if (ofns.data != 0) { + /* If ofns.data is not NULL, then we have a different file name */ memcpy(vdev->fname, ofns.data, ofns.size); vdev->fname[ofns.size] = 0; - if (vdev->file != 0) { - gx_device_bbox *bbdev = vdev->bbox_device; + if (dev->is_open && vdev->strm != 0 && stell(vdev->strm) != 0) { + /* we want to close and re-open the device so we can change the file */ + ecode = gs_closedevice(dev); + if (ecode < 0) { + param_signal_error(plist, param_name, ecode); + return ecode; /* THIS MAY CAUSE PROBLEMS SINCE THE DEVICE MAY BE CLOSED */ + } + if (vdev->file != 0) { + gx_device_bbox *bbdev = vdev->bbox_device; - vdev->bbox_device = 0; /* don't let it be freed */ - code = gdev_vector_close_file(vdev); - vdev->bbox_device = bbdev; - if (code < 0) - return code; + vdev->bbox_device = 0; /* don't let it be freed */ + code = gdev_vector_close_file(vdev); + vdev->bbox_device = bbdev; + if (code < 0) + return code; + } + ecode = gs_opendevice(dev); /* opendevice is expected to open the new file */ + if (ecode < 0) { + param_signal_error(plist, param_name, ecode); + return ecode; + } + } + /* device is open and hasn't written data yet, so open the file */ + else if (dev->is_open) { return gdev_vector_open_file_options(vdev, vdev->strmbuf_size, - vdev->open_options); + vdev->open_options); } } return 0; diff -Nru ghostscript-9.04~dfsg/base/gdevwts.c ghostscript-9.05~dfsg~20120125/base/gdevwts.c --- ghostscript-9.04~dfsg/base/gdevwts.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevwts.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1129 +0,0 @@ -/* Copyright (C) 2006-2007 Artifex Software, Inc. All rights reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, - modified or distributed except as expressly authorized under the terms - of the license contained in the file LICENSE in this distribution. - - For more information about licensing, please refer to - http://www.ghostscript.com/licensing/. For information on - commercial licensing, go to http://www.artifex.com/licensing/ or - contact Artifex Software, Inc., 101 Lucas Valley Road #110, - San Rafael, CA 94903, U.S.A., +1(415)492-9861. -*/ - -/* $Id$ */ -/* ALPHA: Sample Device that provides WTS screening and IMDI color management */ -/* TODO: this should be configurable */ - -#include "errno_.h" -#include "string_.h" - -#include "gdevprn.h" -#include "gdevmem.h" -#include "gsdevice.h" -#include "gxfrac.h" -#include "gsht.h" -#include "gxwts.h" -#include "gswts.h" -#include "gxgetbit.h" -#include "gscms.h" -#include "gsicc_cache.h" -#include "gsicc_manage.h" - -#ifndef cmm_gcmmhlink_DEFINED - #define cmm_gcmmhlink_DEFINED - typedef void* gcmmhlink_t; -#endif - -#ifndef cmm_gcmmhprofile_DEFINED - #define cmm_gcmmhprofile_DEFINED - typedef void* gcmmhprofile_t; -#endif - -/* Memory arg is included in ghostpcl branch but not main branch. */ -#define GS_NOTE_ERROR(m, e) gs_note_error(e) - -#ifndef X_DPI -# define X_DPI 72 -#endif -#ifndef Y_DPI -# define Y_DPI 72 -#endif - -typedef struct { - wts_screen_t *wts; - byte *cell; - int width_padded; -} wts_cooked_halftone; - -typedef struct gx_device_wts_s { - gx_device_common; - gx_prn_device_common; - wts_cooked_halftone wcooked[4]; -} gx_device_wts; - -static dev_proc_print_page(wtscmyk_print_page); - -/* 8-bit-per-plane separated CMYK color. */ - -static const gx_device_procs wtscmyk_procs = { - gdev_prn_open, NULL, NULL, gdev_prn_output_page, gdev_prn_close, - NULL, cmyk_8bit_map_color_cmyk, NULL, NULL, NULL, NULL, NULL, NULL, - gdev_prn_get_params, gdev_prn_put_params, - cmyk_8bit_map_cmyk_color, NULL, NULL, NULL, gx_page_device_get_page_device -}; - -const gx_device_wts gs_wtscmyk_device = { - prn_device_body(gx_device_wts, wtscmyk_procs, "wtscmyk", - DEFAULT_WIDTH_10THS, DEFAULT_HEIGHT_10THS, - X_DPI, Y_DPI, - 0, 0, 0, 0, /* Margins */ - 4, 32, 255, 255, 256, 256, wtscmyk_print_page) -}; - -/* RGB with imdi conversion to CMYK and wts halftoning */ - -static dev_proc_open_device(wtsimdi_open_device); -static dev_proc_close_device(wtsimdi_close_device); -static dev_proc_print_page(wtsimdi_print_page); -static dev_proc_create_buf_device(wtsimdi_create_buf_device); -static dev_proc_get_bits(wtsimdi_get_bits); -static dev_proc_get_bits_rectangle(wtsimdi_contone_get_bits_rectangle); -static dev_proc_get_bits_rectangle(wtsimdi_halftoned_get_bits_rectangle); - -typedef struct cached_color_s { - gx_color_index color_index; - byte cmyk[4]; -} cached_color; - -#define COLOR_CACHE_SIZE 4096 -/* - * Hash function should preserve low bits (for images) and MUST map white and - * black to different slots - */ -#if COLOR_CACHE_SIZE == 256 -# define COLOR_TO_CACHE_INDEX(color) (((color + 0x000001) ^ (color >> 8) ^ (color >> 16)) & 0xff) -#elif COLOR_CACHE_SIZE == 4096 -# define COLOR_TO_CACHE_INDEX(color) ((color ^ (color>>4) ^ (color>>8)) & 0xfff) -#elif COLOR_CACHE_SIZE == 8192 -# define COLOR_TO_CACHE_INDEX(color) (((color + 0x010204) ^ (((color << 24) | color) >> 11)) & 0x1fff) -#elif COLOR_CACHE_SIZE == 16384 -# define COLOR_TO_CACHE_INDEX(color) (((color + 0x010204) ^ (((color << 24) | color) >> 10)) & 0x3fff) -#elif COLOR_CACHE_SIZE == 32768 -# define COLOR_TO_CACHE_INDEX(color) (((color + 0x010204) ^ (((color << 24) | color) >> 9)) & 0x7fff) -#elif COLOR_CACHE_SIZE == 65536 -# define COLOR_TO_CACHE_INDEX(color) (((color + 0x010204) ^ (((color << 24) | color) >> 8)) & 0xffff) -#else -# define COLOR_TO_CACHE_INDEX(color) 0 -#endif - -typedef struct gx_device_wtsimdi_s { - gx_device_common; - gx_prn_device_common; - wts_cooked_halftone wcooked[4]; - gsicc_device_cm_t *postrender_cm; - gsicc_link_t *icc_link; - cached_color *color_cache; - cached_color current_color; -#ifdef DEBUG - long color_cache_hit, color_cache_collision, cache_fill_empty, color_is_current; -#endif -} gx_device_wtsimdi; - -static const gx_device_procs wtsimdi_procs = -{ - wtsimdi_open_device, NULL, NULL, gdev_prn_output_page, wtsimdi_close_device, - gx_default_rgb_map_rgb_color, gx_default_rgb_map_color_rgb, - NULL, NULL, NULL, NULL, NULL, wtsimdi_get_bits, - gdev_prn_get_params, gdev_prn_put_params, - NULL, NULL, NULL, NULL, gx_page_device_get_page_device -}; - -const gx_device_wtsimdi gs_wtsimdi_device = { - prn_device_body(gx_device_wtsimdi, wtsimdi_procs, "wtsimdi", - DEFAULT_WIDTH_10THS, DEFAULT_HEIGHT_10THS, - X_DPI, Y_DPI, - 0, 0, 0, 0, /* Margins */ - 3, 24, 255, 255, 256, 256, wtsimdi_print_page) -}; - -#if DUMMY_WTS_HALFTONE_LINE -static void -wts_halftone_line(void **wts, int y, int width, int n_planes, - long band_offset_x, long band_offset_y, - byte **dst, const byte *src) -{ - int x; - int plane_ix; - - for (plane_ix = 0; plane_ix < n_planes; plane_ix++) { - byte *dline = dst[plane_ix]; - for (x = 0; x < width; x += 8) { - byte b = 0; - if (src[(x + 0) * n_planes + plane_ix] > 0x20) b |= 0x80; - if (src[(x + 1) * n_planes + plane_ix] > 0x40) b |= 0x40; - if (src[(x + 2) * n_planes + plane_ix] > 0x60) b |= 0x20; - if (src[(x + 3) * n_planes + plane_ix] > 0x80) b |= 0x10; - if (src[(x + 4) * n_planes + plane_ix] > 0xa0) b |= 0x08; - if (src[(x + 5) * n_planes + plane_ix] > 0xc0) b |= 0x04; - if (src[(x + 6) * n_planes + plane_ix] > 0xe0) b |= 0x02; - if (src[(x + 7) * n_planes + plane_ix] > 0xfe) b |= 0x01; - dline[x >> 3] = b; - } - } -} -#endif - -#if 0 -/* RJW: Not used currently */ -static void -wts_halftone_line_16(wts_cooked_halftone *wch, int y, int width, int n_planes, - long band_offset_x, long band_offset_y, - byte **dst, const byte *src) -{ - int x; - int plane_ix; - wts_screen_sample_t *samples; - - for (plane_ix = 0; plane_ix < n_planes; plane_ix++) { - wts_screen_t *w = wch[plane_ix].wts; - byte *dline = dst[plane_ix]; - int imax; - - for (x = 0; x < width;) { - int i; - int n_samples; - int cx, cy; - - wts_get_samples(w, band_offset_x + x, band_offset_y + y, &cx, &cy, &n_samples); - samples = w->samples + cy * w->cell_width + cx; - - imax = min(width - x, n_samples); - for (i = 0; i < imax; i += 8) { - byte b = 0; - int src_ix = x * 4 + plane_ix; -#if 0 - if (src[src_ix + 0 * 4] > (samples[i + 0] >> 7)) b |= 0x80; - if (src[src_ix + 1 * 4] > (samples[i + 1] >> 7)) b |= 0x40; - if (src[src_ix + 2 * 4] > (samples[i + 2] >> 7)) b |= 0x20; - if (src[src_ix + 3 * 4] > (samples[i + 3] >> 7)) b |= 0x10; - if (src[src_ix + 4 * 4] > (samples[i + 4] >> 7)) b |= 0x08; - if (src[src_ix + 5 * 4] > (samples[i + 5] >> 7)) b |= 0x04; - if (src[src_ix + 6 * 4] > (samples[i + 6] >> 7)) b |= 0x02; - if (src[src_ix + 7 * 4] > (samples[i + 7] >> 7)) b |= 0x01; -#else -#if 0 - b |= (src[src_ix + 0 * 4] > (samples[i + 0] >> 7)) << 7; - b |= (src[src_ix + 1 * 4] > (samples[i + 1] >> 7)) << 6; - b |= (src[src_ix + 2 * 4] > (samples[i + 2] >> 7)) << 5; - b |= (src[src_ix + 3 * 4] > (samples[i + 3] >> 7)) << 4; - b |= (src[src_ix + 4 * 4] > (samples[i + 4] >> 7)) << 3; - b |= (src[src_ix + 5 * 4] > (samples[i + 5] >> 7)) << 2; - b |= (src[src_ix + 6 * 4] > (samples[i + 6] >> 7)) << 1; - b |= (src[src_ix + 7 * 4] > (samples[i + 7] >> 7)) << 0; -#else - b = (((unsigned int)(((int)(samples[i + 0] >> 7)) - ((int)src[src_ix + 0 * 4]))) >> 24) & 0x80; - b |= (((unsigned int)(((int)(samples[i + 1] >> 7)) - ((int)src[src_ix + 1 * 4]))) >> 24) & 0x40; - b |= (((unsigned int)(((int)(samples[i + 2] >> 7)) - ((int)src[src_ix + 2 * 4]))) >> 24) & 0x20; - b |= (((unsigned int)(((int)(samples[i + 3] >> 7)) - ((int)src[src_ix + 3 * 4]))) >> 24) & 0x10; - b |= (((unsigned int)(((int)(samples[i + 4] >> 7)) - ((int)src[src_ix + 4 * 4]))) >> 24) & 0x08; - b |= (((unsigned int)(((int)(samples[i + 5] >> 7)) - ((int)src[src_ix + 5 * 4]))) >> 24) & 0x04; - b |= (((unsigned int)(((int)(samples[i + 6] >> 7)) - ((int)src[src_ix + 6 * 4]))) >> 24) & 0x02; - b |= (((unsigned int)(((int)(samples[i + 7] >> 7)) - ((int)src[src_ix + 7 * 4]))) >> 24) & 0x01; -#endif -#endif - dline[x >> 3] = b; - x += 8; - } - } - } -} -#endif - -static void -wts_halftone_line_8(wts_cooked_halftone *wch, int y, int width, int n_planes, - long band_offset_x, long band_offset_y, - byte * dst, const byte * src) -{ - int x; - int plane_ix; - byte *samples; - int halftoned_bytes = (width + 7) >> 3; - - for (plane_ix = 0; plane_ix < n_planes; plane_ix++) { - wts_screen_t *w = wch[plane_ix].wts; - int width_padded = wch[plane_ix].width_padded; - byte * dline = dst + plane_ix * halftoned_bytes; - /*byte * dline = dst[plane_ix];*/ - int imax; - - for (x = 0; x < width;) { - int i; - int n_samples; - int cx, cy; - - wts_get_samples(w, band_offset_x + x, band_offset_y + y, &cx, &cy, &n_samples); - samples = wch[plane_ix].cell + cy * width_padded + cx; - - imax = min(width - x, n_samples); - for (i = 0; i < imax; i += 8) { - byte b = 0; - int src_ix = x * 4 + plane_ix; - b = (((unsigned int)(((int)(samples[i + 0])) - ((int)src[src_ix + 0 * 4]))) >> 24) & 0x80; - b |= (((unsigned int)(((int)(samples[i + 1])) - ((int)src[src_ix + 1 * 4]))) >> 24) & 0x40; - b |= (((unsigned int)(((int)(samples[i + 2])) - ((int)src[src_ix + 2 * 4]))) >> 24) & 0x20; - b |= (((unsigned int)(((int)(samples[i + 3])) - ((int)src[src_ix + 3 * 4]))) >> 24) & 0x10; - b |= (((unsigned int)(((int)(samples[i + 4])) - ((int)src[src_ix + 4 * 4]))) >> 24) & 0x08; - b |= (((unsigned int)(((int)(samples[i + 5])) - ((int)src[src_ix + 5 * 4]))) >> 24) & 0x04; - b |= (((unsigned int)(((int)(samples[i + 6])) - ((int)src[src_ix + 6 * 4]))) >> 24) & 0x02; - b |= (((unsigned int)(((int)(samples[i + 7])) - ((int)src[src_ix + 7 * 4]))) >> 24) & 0x01; - *dline++ = b; - x += 8; - } - } - } -} - -static int -wts_load_halftone(gs_memory_t *mem, wts_cooked_halftone *wch, const char *fn) -{ - FILE *f = gp_fopen(fn, "rb"); - int size; - byte *buf; - wts_screen_t *wts; - int width_padded; - byte *cooked_cell; - int y; - - if (f == 0) return gs_error_undefinedfilename; - fseek(f, 0, 2); - size = ftell(f); - fseek(f, 0, 0); - buf = gs_malloc(mem, size, 1, "wts_load_halftone"); - if (buf == 0) { - return gs_error_VMerror; - } - (void)fread(buf, 1, size, f); - fclose(f); - wts = gs_wts_from_buf(buf, size); - gs_free(mem, buf, size, 1, "wts_load_halftone"); - wch->wts = wts; - width_padded = wts->cell_width + 7; - wch->width_padded = width_padded; - cooked_cell = gs_malloc(mem, width_padded * wts->cell_height, 1, - "wts_load_halftone"); - if (cooked_cell == 0) { - return gs_error_VMerror; - } - - wch->cell = cooked_cell; - for (y = 0; y < wts->cell_height; y++) { - wts_screen_sample_t *line = &wts->samples[y * wts->cell_width]; - byte *dstline = cooked_cell + y * width_padded; - int x; - for (x = 0; x < width_padded; x++) { - wts_screen_sample_t sample = line[x % wts->cell_width]; - dstline[x] = (254 * (int)sample + 0x7fc0) / 0x8ff0; - } - } - -#if 0 - /* Note: we'll need to fix the free discipline here when we change it - in gswts.c */ - free(wts->samples); - wts->samples = NULL; -#endif - - return 0; -} - -static int -wts_init_halftones(gx_device_wts *wdev, int n_planes) -{ - int i; - int code; - - for (i = 0; i < n_planes; i++) { - if (wdev->wcooked[i].wts == 0) { - char wts_fn[256]; - - sprintf(wts_fn, "wts_plane_%d", i); - { - FILE *f; - if ((f=gp_fopen(wts_fn,"r"))) { - fclose(f); - } else { - sprintf(wts_fn, "/usr/local/lib/ghostscript/wts_plane_%d", i); - } - } - code = wts_load_halftone(wdev->memory, &wdev->wcooked[i], wts_fn); - if (code < 0) - return gs_throw1(code, "could not open file '%s'", wts_fn); - } - } - return 0; -} - -static int -wtscmyk_print_page(gx_device_printer *pdev, FILE *prn_stream) -{ - gx_device_wts *wdev = (gx_device_wts *)pdev; - int cmyk_bytes = gdev_mem_bytes_per_scan_line((gx_device *)pdev); - /* Output bytes have to be padded to 16 bits. */ - int y; - byte *cmyk_line = 0; - byte *data; - int code = 0; - int pbm_bytes; - int n_planes = pdev->color_info.num_components; - byte *dst = NULL; - FILE *ostream[4] = {0}; - int i; - - /* Initialize the wts halftones. */ - code = wts_init_halftones(wdev, n_planes); - if (code < 0) goto out; - - cmyk_line = (byte *)gs_malloc(pdev->memory, cmyk_bytes, 1, "wtscmyk_print_page(in)"); - if (cmyk_line == 0) { - code = GS_NOTE_ERROR(pdev->memory, gs_error_VMerror); - goto out; - } - pbm_bytes = (pdev->width + 7) >> 3; - dst = gs_malloc(pdev->memory, pbm_bytes * n_planes, 1, - "wtscmyk_print_page"); - if (dst == 0) { - code = GS_NOTE_ERROR(pdev->memory, gs_error_VMerror); - goto out; - } - - /* Create additional output streams. */ - for (i = 0; i < n_planes; i++) { - if (i == 0) { - ostream[i] = prn_stream; - } else { - char fn[256]; - char plane_name[4] = "cmyk"; - int fname_len = strlen(pdev->fname); - - if (fname_len >= 5 && fname_len < 256) { - strcpy(fn, pdev->fname); - if (!strcmp(fn + fname_len - 5, "c.pbm")) - fn[fname_len - 5] = plane_name[i]; - } - ostream[i] = gp_fopen(fn, "wb"); - } - fprintf(ostream[i], "P4\n%d %d\n", pdev->width, pdev->height); - } -#if 0 - dprintf2(OPTIONAL_MEM(pdev->memory) "Output file name: %s %d\n", pdev->fname, sizeof(dst)); -#endif - - /* For each raster line */ - for (y = 0; y < pdev->height; y++) { - code = gdev_prn_get_bits(pdev, y, cmyk_line, &data); - if (code < 0) - break; /* return the code below after cleanup */ - wts_halftone_line_8(wdev->wcooked, y, pdev->width, n_planes, - wdev->band_offset_x, wdev->band_offset_y, dst, data); - for (i = 0; i < n_planes; i++) - if (ostream[i]) - fwrite(dst + i * pbm_bytes, 1, pbm_bytes, ostream[i]); - } -out: - /* Clean up... */ - gs_free(pdev->memory, cmyk_line, cmyk_bytes, 1, "wtscmyk_print_page(in)"); - gs_free(pdev->memory, dst, pbm_bytes, 1, "wtscmyk_print_page"); - for (i = 1; i < n_planes; i++) { - /* Don't close ostream[0], because gdev_prn_close will. */ - if (ostream[i]) - fclose(ostream[i]); - } - return code; -} - -/* - * Open IMDI device. - * Load ICC device link profile (to map sRGB to FOGRA CMYK). - */ - -static int -wtsimdi_open_device(gx_device *dev) -{ - gx_device_wtsimdi *idev = (gx_device_wtsimdi*)dev; - int i; - gsicc_rendering_param_t rendering_params; - gsicc_device_cm_t *postrender_cm; - - /* - * We replace create_buf_device so we can replace copy_alpha - * for memory device, but not clist. - */ - - idev->printer_procs.buf_procs.create_buf_device = - wtsimdi_create_buf_device; - - idev->postrender_cm = - (gsicc_device_cm_t*) gs_malloc(dev->memory->non_gc_memory, - 1, sizeof(gsicc_device_cm_t), - "wtsimdi_open_device"); - idev->icc_link = - (gsicc_link_t*) gs_malloc(dev->memory->non_gc_memory, - 1, sizeof(gsicc_link_t), - "wtsimdi_open_device"); - - idev->postrender_cm->device_link_profile = NULL; /* not used now. could be later */ - postrender_cm = idev->postrender_cm; - postrender_cm->memory = dev->memory->non_gc_memory; - if (postrender_cm == NULL) - return gs_throw(-1, "Could not create post render cm object for WTS device"); - - /* Get the profile handles and create the link. We probably want - to make this settable rather than using the defaults but that will come */ - postrender_cm->rgb_profile = gsicc_get_profile_handle_file(DEFAULT_RGB_ICC, - strlen(DEFAULT_RGB_ICC)+1, postrender_cm->memory); - if (postrender_cm->rgb_profile == NULL) - return gs_throw(-1, "Could not create RGB input profile for WTS device"); - - postrender_cm->cmyk_profile = gsicc_get_profile_handle_file(DEFAULT_CMYK_ICC, - strlen(DEFAULT_CMYK_ICC)+1, postrender_cm->memory); - if (postrender_cm->cmyk_profile == NULL) - return gs_throw(-1, "Could not create CMYK output profile for WTS device"); - - if (postrender_cm->rgb_profile->num_comps != 3) - return gs_throw1(-1, "WTS input profile must have 3 input channels. got %d.", - postrender_cm->rgb_profile->num_comps); - if (postrender_cm->cmyk_profile->num_comps != 4) - return gs_throw1(-1, "WTS output profile must have 4 output channels. got %d.", - postrender_cm->cmyk_profile->num_comps); - - /* Set up the rendering parameters */ - rendering_params.black_point_comp = true; - rendering_params.graphics_type_tag = GS_UNKNOWN_TAG; /* Already rendered */ - rendering_params.rendering_intent = gsRELATIVECOLORIMETRIC; - - idev->icc_link->link_handle = gscms_get_link(postrender_cm->rgb_profile->profile_handle, - postrender_cm->cmyk_profile->profile_handle, &rendering_params); - idev->icc_link->is_identity = 0; - idev->icc_link->contextptr = NULL; - idev->icc_link->icc_link_cache = NULL; - idev->icc_link->includes_softproof = false; - - if (idev->icc_link->link_handle == NULL) - return gs_throw(-1, "Could not create ICC link for WTS device"); - - /* Not sure this is the best way to do this with most CMMs. Since CMM has a cache usually */ - /* Allocate at least 1 for sytems that return NULL if requested count is 0 */ - idev->color_cache = (cached_color *)gs_malloc(idev->memory, max(COLOR_CACHE_SIZE, 1), - sizeof(cached_color), "wtsimdi_open_device(color_cache)"); - if (idev->color_cache == NULL) { - return_error(gs_error_VMerror); - } - for (i=0; icolor_cache[i].color_index = gx_no_color_index; - idev->current_color.color_index = gx_no_color_index; - - /* guarantee the device bands */ - ((gx_device_printer *)dev)->space_params.banding_type = BandingAlways; - return gdev_prn_open(dev); - - return(-1); -} - -/* - * Close device and clean up ICC structures. - */ - -static int -wtsimdi_close_device(gx_device *dev) -{ - gx_device_wtsimdi *idev = (gx_device_wtsimdi*)dev; - gsicc_device_cm_t *postrender_cm = idev->postrender_cm; - - gscms_release_link(idev->icc_link); - rc_decrement(postrender_cm->rgb_profile, "wtsimdi_close_device"); - rc_decrement(postrender_cm->cmyk_profile, "wtsimdi_close_device"); - - gs_free(postrender_cm->memory, postrender_cm, 1, sizeof(gsicc_device_cm_t), - "wtsimidi_close"); - gs_free(dev->memory->non_gc_memory, idev->icc_link, 1, sizeof(gsicc_link_t), - "wtsimidi_close"); - gs_free(dev->memory, idev->color_cache, COLOR_CACHE_SIZE, - sizeof(cached_color), "wtsimdi_close_device(color_cache)"); - return gdev_prn_close(dev); -} - -/* Resolve a color to cmyk values, using the one-element cache. */ -static int -wtsimdi_resolve_one(gx_device_wtsimdi *idev, gx_color_index color) -{ - if (color != idev->current_color.color_index) { /* quick out for same color */ - int hash = COLOR_TO_CACHE_INDEX(color); /* 24 bits down to cache index */ - - if (idev->color_cache[hash].color_index == color) { - /* cache hit */ -#ifdef DEBUG - idev->color_cache_hit++; -#endif - idev->current_color = idev->color_cache[hash]; - } else { - - /* cache collision or empty, fill it */ - -#ifdef DEBUG - if (idev->color_cache[hash].color_index == gx_no_color_index) - idev->cache_fill_empty++; - else - idev->color_cache_collision++; -#endif - - /* Transform the color */ - gscms_transform_color(idev->icc_link, &color, - &(idev->current_color.cmyk), 1, NULL); - - idev->color_cache[hash] = idev->current_color; - - } - } -#ifdef DEBUG - else - idev->color_is_current++; -#endif - return 0; -} - -/* Fill a rectangle with a color. */ -static int -wtsimdi_fill_rectangle(gx_device * dev, - int x, int y, int w, int h, gx_color_index color) -{ - gx_device_memory * const mdev = (gx_device_memory *)dev; - gx_device_wtsimdi * idev = (gx_device_wtsimdi *) - ((mdev->target) ? (gx_device_wts *)(mdev->target) - : (gx_device_wts *)dev); - wts_cooked_halftone * wch = idev->wcooked; - int code, comp_value; - int halftoned_bytes = (idev-> width + 7) >> 3; - int width_padded, imax; - byte * dst, * base; - byte * samples; - uint raster, plane_ix; - int first_byte, end_x; - - fit_fill(dev, x, y, w, h); - - base = scan_line_base(mdev, y); - raster = mdev->raster; - - end_x = x + w - 1; - first_byte = x >> 3; - - /* - * Check if this is a new color. To minimize color conversion - * time, we keep a couple of values cached in the wtsimdi device. - */ - if ((code = wtsimdi_resolve_one(idev, color)) < 0) - return code; - - for (; h--; y++) { - base = scan_line_base(mdev, y); - for (plane_ix = 0; plane_ix < 4; plane_ix++) { - int nfill = (end_x >> 3) - first_byte; - - width_padded = wch[plane_ix].width_padded; - dst = base + first_byte + plane_ix * halftoned_bytes; - comp_value = idev->current_color.cmyk[plane_ix]; - if (comp_value == 0) { - if (nfill == 0) { - dst[0] &= (0xff << (8 - (x & 7))) | - ((1 << (7 - (end_x & 7))) - 1); - } else { - dst[0] &= (0xff << (8 - (x & 7))); - memset(&dst[1], 0, nfill-1); - dst[nfill] &= ((1 << (7 - (end_x & 7))) - 1); - } - } else if (comp_value == 0xff) { - if (nfill == 0) { - dst[0] |= ~((0xff << (8 - (x & 7))) | - ((1 << (7 - (end_x & 7))) - 1)); - } else { - dst[0] |= ~(0xff << (8 - (x & 7))); - memset(&dst[1], 0xff, nfill-1); - dst[nfill] |= ~((1 << (7 - (end_x & 7))) - 1); - } - } else { - byte save_left = dst[0]; - byte save_right = dst[nfill]; - int i; - - for (i = 0; i < nfill + 1;) { - int n_samples; - int cx, cy; - int j; - - wts_get_samples(wch[plane_ix].wts, ((dev->band_offset_x + x) & -8) + (i << 3), - (dev->band_offset_y + y), &cx, &cy, &n_samples); - samples = wch[plane_ix].cell + cy * width_padded + cx; - - imax = min((nfill + 1 - i) << 3, n_samples); - for (j = 0; j < imax; j += 8) { - int b; - b = (((unsigned int)(((int)(samples[j + 0])) - comp_value) >> 24)) & 0x80; - b |= (((unsigned int)(((int)(samples[j + 1])) - comp_value) >> 24)) & 0x40; - b |= (((unsigned int)(((int)(samples[j + 2])) - comp_value) >> 24)) & 0x20; - b |= (((unsigned int)(((int)(samples[j + 3])) - comp_value) >> 24)) & 0x10; - b |= (((unsigned int)(((int)(samples[j + 4])) - comp_value) >> 24)) & 0x08; - b |= (((unsigned int)(((int)(samples[j + 5])) - comp_value) >> 24)) & 0x04; - b |= (((unsigned int)(((int)(samples[j + 6])) - comp_value) >> 24)) & 0x02; - b |= (((unsigned int)(((int)(samples[j + 7])) - comp_value) >> 24)) & 0x01; - dst[i + (j >> 3)] = b; - } - dst[0] = (save_left & (0xff << (8 - (x & 7)))) | - (dst[0] & ~(0xff << (8 - (x & 7)))); - dst[nfill] = (save_right & ((1 << (7 - (end_x & 7))) - 1)) | - (dst[nfill] & ~((1 << (7 - (end_x & 7))) - 1)); - i += (j >> 3); - } - } - } - } - return 0; -} - -static int -wtsimdi_copy_mono(gx_device * dev, - const byte * data, int sourcex, int sraster, gx_bitmap_id id, - int x, int y, int w, int h, gx_color_index zero, gx_color_index one) -{ - gx_device_memory * const mdev = (gx_device_memory *)dev; - gx_device_wtsimdi * idev = (gx_device_wtsimdi *) - ((mdev->target) ? (gx_device_wts *)(mdev->target) - : (gx_device_wts *)dev); - wts_cooked_halftone * wch = idev->wcooked; - int code, comp_value; - int halftoned_bytes = (idev-> width + 7) >> 3; - int width_padded, imax; - byte * dst, * base; - byte * samples; - uint raster, plane_ix; - int first_byte, end_x; - const byte *src; - int sshift; - - if (zero != gx_no_color_index) - return gx_default_copy_mono(dev, data, sourcex, sraster, id, - x, y, w, h, zero, one); - if (x < 0) { - sourcex -= x; - w += x; - x = 0; - } - src = data + ((sourcex - (x & 7)) >> 3); - if (y < 0) { - src -= sraster * y; - h += y; - y = 0; - } - fit_fill(dev, x, y, w, h); - - base = scan_line_base(mdev, y); - raster = mdev->raster; - - end_x = x + w - 1; - first_byte = x >> 3; - - /* - * Check if this is a new color. To minimize color conversion - * time, we keep a couple of values cached in the wtsimdi device. - */ -#define COPY_MONO_BLACK_IS_K -#define COPY_MONO_OPTIMIZATION - -#ifdef COPY_MONO_BLACK_IS_K - if (one == 0) { - /* FIXME: This should rely on tag bits, but copy_mono black is (probably) only used for text */ - idev->current_color.cmyk[0] =idev->current_color.cmyk[1] = idev->current_color.cmyk[2] = 0; - idev->current_color.cmyk[3] = 0xff; /* 100% K channel, 0% C, M, Y */ - idev->current_color.color_index = 0; - } else -#endif - if ((code = wtsimdi_resolve_one(idev, one)) < 0) - return code; - - sshift = 8 - ((sourcex - x) & 7); - - for (; h--; y++) { - base = scan_line_base(mdev, y); - for (plane_ix = 0; plane_ix < 4; plane_ix++) { - int nfill = (end_x >> 3) - first_byte; - int i; - byte smask, save_left, save_right; - - width_padded = wch[plane_ix].width_padded; - dst = base + first_byte + plane_ix * halftoned_bytes; - save_left = dst[0]; - save_right = dst[nfill]; - comp_value = idev->current_color.cmyk[plane_ix]; -#ifdef COPY_MONO_OPTIMIZATION - if (comp_value == 0) { - for (i = 0; i < nfill + 1; i++) { - if ((smask = (src[i] << 8 | src[i + 1]) >> sshift) != 0) - dst[i] = dst[i] & ~smask; - } - } else if (comp_value == 0xff) { - for (i = 0; i < nfill + 1; i++) { - if ((smask = (src[i] << 8 | src[i + 1]) >> sshift) != 0) - dst[i] = smask | (dst[i] & ~smask) ; - } - } else -#endif - { - for (i = 0; i < nfill + 1;) { - int n_samples; - int cx, cy; - int j; - - wts_get_samples(wch[plane_ix].wts, ((dev->band_offset_x + x) & -8) + (i << 3), - (dev->band_offset_y + y), &cx, &cy, &n_samples); - samples = wch[plane_ix].cell + cy * width_padded + cx; - - imax = min((nfill + 1 - i) << 3, n_samples); - for (j = 0; j < imax; j += 8) { - smask = (src[i] << 8 | src[i + 1]) >> sshift; - if (smask) { - byte b; - b = (((unsigned int)(((int)(samples[j + 0])) - comp_value) >> 24)) & 0x80; - b |= (((unsigned int)(((int)(samples[j + 1])) - comp_value) >> 24)) & 0x40; - b |= (((unsigned int)(((int)(samples[j + 2])) - comp_value) >> 24)) & 0x20; - b |= (((unsigned int)(((int)(samples[j + 3])) - comp_value) >> 24)) & 0x10; - b |= (((unsigned int)(((int)(samples[j + 4])) - comp_value) >> 24)) & 0x08; - b |= (((unsigned int)(((int)(samples[j + 5])) - comp_value) >> 24)) & 0x04; - b |= (((unsigned int)(((int)(samples[j + 6])) - comp_value) >> 24)) & 0x02; - b |= (((unsigned int)(((int)(samples[j + 7])) - comp_value) >> 24)) & 0x01; - dst[i] = (b & smask) | (dst[i] & ~smask); - } - i++; - } - } - } - /* Restore edge areas on left and right that may have been overwritten */ - dst[0] = (save_left & (0xff << (8 - (x & 7)))) | - (dst[0] & ~(0xff << (8 - (x & 7)))); - dst[nfill] = (save_right & ((1 << (7 - (end_x & 7))) - 1)) | - (dst[nfill] & ~((1 << (7 - (end_x & 7))) - 1)); - } - src += sraster; - } - return 0; -} - -/* - * This is a clone of gx_default_get_bits except that we are adding - * GB_HALFTONED to the parameter options. This will tell the buffer - * device to halftone the data (if it is not already halftoned). - */ -int -wtsimdi_get_bits(gx_device * dev, int y, byte * data, byte ** actual_data) -{ /* - * Hand off to get_bits_rectangle, being careful to avoid a - * possible recursion loop. - */ - dev_proc_get_bits((*save_get_bits)) = dev_proc(dev, get_bits); - gs_int_rect rect; - gs_get_bits_params_t params; - int code; - - rect.p.x = 0, rect.p.y = y; - rect.q.x = dev->width, rect.q.y = y + 1; - params.options = - (actual_data ? GB_RETURN_POINTER : 0) | GB_RETURN_COPY | - (GB_ALIGN_STANDARD | GB_OFFSET_0 | GB_RASTER_STANDARD | - /* No depth specified, we always use native colors. */ - GB_PACKING_CHUNKY | GB_COLORS_NATIVE | GB_ALPHA_NONE | - GB_HALFTONED); - params.x_offset = 0; - params.raster = bitmap_raster(dev->width * dev->color_info.depth); - params.data[0] = data; - params.original_y = y; - set_dev_proc(dev, get_bits, gx_no_get_bits); - code = (*dev_proc(dev, get_bits_rectangle)) - (dev, &rect, ¶ms, NULL); - if (actual_data) - *actual_data = params.data[0]; - set_dev_proc(dev, get_bits, save_get_bits); - return code; -} - -int -wtsimdi_halftoned_get_bits_rectangle(gx_device * dev, const gs_int_rect * prect, - gs_get_bits_params_t * params, gs_int_rect ** unread) -{ - /* - * We should only get to this routine if the caller wants the halftoned - * version of our output. In all other cases we should be in - * wtsimdi_contone_get_bits_rectangle. - */ - if (!(params->options & GB_HALFTONED)) - return_error(gs_error_unknownerror); - return mem_get_bits_rectangle(dev, prect, params, unread); -} - -int -wtsimdi_contone_get_bits_rectangle(gx_device * dev, const gs_int_rect * prect, - gs_get_bits_params_t * params, gs_int_rect ** unread) -{ - /* - * Save the options since mem_get_bits_rectangle will change them to - * indicate what it actually did. We need the unmodified values. - */ - gs_get_bits_options_t options = params->options; - int original_y = params->original_y; - byte * buffer = params->data[0]; - int code = mem_get_bits_rectangle(dev, prect, params, unread); - - if (code < 0) - return code; - if (options & GB_HALFTONED) { - gx_device_memory * const mdev = (gx_device_memory *)dev; - gx_device_wtsimdi * idev = (gx_device_wtsimdi *) - ((mdev->target) ? (gx_device_wts *)(mdev->target) - : (gx_device_wts *)dev); - int width = dev->width; - int n_planes = 4; - int r_last = -1, g_last = -1, b_last = -1, r, g, b; - int x; - byte * src = params->data[0]; - /* Note that the following relies on objects being allocated to - * at least a 4-byte boundary for efficiency on x86 and to prevent - * alignment errors on CPU's that gripe about it. We know this is - * true due to object headers requiring alignment. In the future - * if we want to remove this invariant, we can use 'obj_align_mod' - * to allocate a slightly larger buffer and offset 'cmyk_data' - * to the proper alignment within the buffer. - */ - uint32_t * cmyk_buffer = gs_malloc(dev->memory, - (width + 7), sizeof(uint32_t), - "wtsimdi_contone_get_bits(cmyk_buffer)"); - uint32_t* cmyk_data = cmyk_buffer; - - if (cmyk_data == NULL) - return_error(gs_error_VMerror); - - for (x = 0; x < width; x++) { - r = *src++; - g = *src++; - b = *src++; - if (r != r_last || g != g_last || b != b_last) { - gx_color_index color = (((b<<8) | g) << 8) | r; - - r_last = r, g_last = g, b_last = b; - wtsimdi_resolve_one(idev, color); - } - *cmyk_data++ = *((uint32_t *)idev->current_color.cmyk); - } - wts_halftone_line_8(idev->wcooked, original_y, width, n_planes, - idev->band_offset_x, idev->band_offset_y, buffer, (const byte *)cmyk_buffer); - params->data[0] = buffer; - gs_free(dev->memory, cmyk_buffer, halftoned_bytes * n_planes, 1, - "wtsimdi_print_page(halftoned_data)"); - } - return code; -} - -/* Unfortunately there are many bugs associated with optimizing away - * raster operations to avoid creating a contone buffer (ie bug - * #691154). Until those are fixed the following should remain true. - */ - -const bool ALWAYS_CONTONE = true; - -/* - * We need to create custom memory buffer devices. We use the default - * create_buf_device routine and then we set our custom device procedures. - */ -static int -wtsimdi_create_buf_device(gx_device **pbdev, gx_device *target, int y, - const gx_render_plane_t *render_plane, gs_memory_t *mem, - gx_band_complexity_t *band_complexity) -{ - int code = gx_default_create_buf_device(pbdev, target, y, - render_plane, mem, band_complexity); - /* Now set our custom device procedures. */ - if ((band_complexity && band_complexity->nontrivial_rops) || ALWAYS_CONTONE) { - set_dev_proc(*pbdev, get_bits_rectangle, - wtsimdi_contone_get_bits_rectangle); - } else { - set_dev_proc(*pbdev, get_bits_rectangle, - wtsimdi_halftoned_get_bits_rectangle); - set_dev_proc(*pbdev, fill_rectangle, wtsimdi_fill_rectangle); - set_dev_proc(*pbdev, copy_mono, wtsimdi_copy_mono); - /* All procedures which are defined as mem_true24_* need to be either - implemented or replaced with a default implementation. The following - three don't have significant usage in testing with Altona. - */ - set_dev_proc(*pbdev, copy_alpha, gx_default_copy_alpha); - set_dev_proc(*pbdev, copy_color, gx_default_copy_color); - } - return code; -} - -/* - * Create a row of output data. The output is the same as the pkmraw - * device. This a pseudo 1 bit CMYK output. Actually the output is - * 3 byte RGB with each byte being either 0 or 255. - * - * The input data is 1 bit per component CMYK. The data is separated - * into planes. - */ -static void -write_pkmraw_row(int width, byte * data, FILE * pstream) -{ - if (pstream == NULL) - return; - { - int x, bit; - int halftoned_bytes = (width + 7) >> 3; - byte * cdata = data; - byte * mdata = data + halftoned_bytes; - byte * ydata = mdata + halftoned_bytes; - byte * kdata = ydata + halftoned_bytes; - byte c = *cdata++; - byte m = *mdata++; - byte y = *ydata++; - byte k = *kdata++; - - /* - * Contrary to what the documentation implies, gcc compiles putc - * as a procedure call. This is ridiculous, but since we can't - * change it, we buffer groups of pixels ourselves and use fwrite. - */ - for (bit = 7, x = 0; x < width;) { - byte raw[80 * 3]; /* 80 is arbitrary, must be a multiple of 8 */ - int end = min(x + sizeof(raw) / 3, width); - byte *outp = raw; - - for (; x < end; x++) { - - if ((k >> bit) & 1) { - *outp++ = 0; /* Set output color = black */ - *outp++ = 0; - *outp++ = 0; - } else { - *outp++ = 255 & (255 + ((c >> bit) & 1)); - *outp++ = 255 & (255 + ((m >> bit) & 1)); - *outp++ = 255 & (255 + ((y >> bit) & 1)); - } - if (bit == 0) { - c = *cdata++; - m = *mdata++; - y = *ydata++; - k = *kdata++; - bit = 7; - } else - bit--; - } - fwrite(raw, 1, outp - raw, pstream); - } - return; - } -} - -/* - * Output the page raster. - */ - -static int -wtsimdi_print_page(gx_device_printer *pdev, FILE *prn_stream) -{ - gx_device_wtsimdi *idev = (gx_device_wtsimdi*)pdev; - int n_planes = 4; - byte * halftoned_data; - byte * halftoned_buffer = NULL; - int halftoned_bytes, y; - int code = 0; - int width = pdev->width; - int height = pdev->height; - dev_proc_get_bits((*save_get_bits)) = dev_proc(pdev, get_bits); - int output_is_nul = !strncmp(pdev->fname, "nul:", min(strlen(pdev->fname), 4)) || - !strncmp(pdev->fname, "/dev/null", min(strlen(pdev->fname), 9)); - - /* - * The printer device setup changed the get_bits routine to - * gx_default_get_bits. We want to use our own. - */ - set_dev_proc(pdev, get_bits, wtsimdi_get_bits); - - /* - * Initialize the WTS halftones. - */ - code = wts_init_halftones((gx_device_wts *)idev, n_planes); - if (code < 0) goto cleanup; - - /* - * Allocate a buffer to hold the halftoned data. This is 1 bit per - * component CMYK data. - */ - halftoned_bytes = (width + 7) >> 3; /* bytes per component */ - halftoned_buffer = gs_malloc(pdev->memory, halftoned_bytes * n_planes, 1, - "wtsimdi_print_page(halftoned_data)"); - if (halftoned_buffer == NULL) { - code = GS_NOTE_ERROR(pdev->memory, gs_error_VMerror); - goto cleanup; - } -#ifdef DEBUG - /* Collect stats on each page. With the allocation now done once in 'open' the - * statistics won't be the same if other pages have been printed */ - idev->color_cache_hit = idev->color_cache_collision = - idev->color_is_current = idev->cache_fill_empty = 0; -#endif - - /* Initialize output file header. */ - if (!output_is_nul) { - fprintf(prn_stream, "P6\n%d %d\n", width, height); - fprintf(prn_stream, "# Image generated by %s %ld.%02ld (device=wtsimdi)\n", - gs_program_name(), gs_revision_number() / 100, - gs_revision_number() % 100); - fprintf(prn_stream, "%d\n", 255); - } - - /* - * Get raster data and then write data to output file. - */ - for (y = 0; y < height; y++) { - /* - * The get_bit routines for our device returns a halftoned copy of - * the output data. Print this data to the output file. - */ - code = gdev_prn_get_bits(pdev, y, halftoned_buffer, &halftoned_data); - if (code < 0) - break; /* return code below after cleanup */ - if (!output_is_nul) - write_pkmraw_row(width, halftoned_data, prn_stream); - } -cleanup: - if (idev->color_cache != NULL) { -#ifdef DEBUG - { - int i, unused_color_cache_slots; - - for (i=0,unused_color_cache_slots=0; icolor_cache[i].color_index == gx_no_color_index) - unused_color_cache_slots++; - if_debug5(':',"wtsimdi_print_page color cache stats:" - " current=%ld, hits=%ld," - " collisions=%ld, fill=%ld, unused_slots=%d\n", - idev->color_is_current, idev->color_cache_hit, - idev->color_cache_collision, idev->cache_fill_empty, - unused_color_cache_slots); - } -#endif - } - if (halftoned_buffer != NULL) - gs_free(pdev->memory, halftoned_buffer, halftoned_bytes * n_planes, 1, - "wtsimdi_print_page(halftoned_buffer)"); - set_dev_proc(pdev, get_bits, save_get_bits); - return code; -} diff -Nru ghostscript-9.04~dfsg/base/gdevxcf.c ghostscript-9.05~dfsg~20120125/base/gdevxcf.c --- ghostscript-9.04~dfsg/base/gdevxcf.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gdevxcf.c 2012-01-25 08:44:24.000000000 +0000 @@ -377,9 +377,7 @@ in[2] = frac2ushort(y); in[3] = frac2ushort(k); - gscms_transform_color(link, &(in[0]), - &(tmp[0]), 2, NULL); - + gscms_transform_color(dev, link, &(in[0]), &(tmp[0]), 2); for (i = 0; i < outn; i++) out[i] = ushort2frac(tmp[i]); for (; i < n + 4; i++) @@ -423,8 +421,7 @@ in[1] = frac2ushort(g); in[2] = frac2ushort(b); - gscms_transform_color(link, &(in[0]), - &(tmp[0]), 2, NULL); + gscms_transform_color(dev, link, &(in[0]), &(tmp[0]), 2); for (i = 0; i < outn; i++) out[i] = ushort2frac(tmp[i]); @@ -491,14 +488,15 @@ xcf_encode_color(gx_device *dev, const gx_color_value colors[]) { int bpc = ((xcf_device *)dev)->bitspercomponent; - int drop = sizeof(gx_color_value) * 8 - bpc; gx_color_index color = 0; int i = 0; int ncomp = dev->color_info.num_components; + COLROUND_VARS; + COLROUND_SETUP(bpc); for (; i> drop); + color |= COLROUND_ROUND(colors[i]); } return (color == gx_no_color_index ? color ^ 1 : color); } @@ -510,13 +508,14 @@ xcf_decode_color(gx_device * dev, gx_color_index color, gx_color_value * out) { int bpc = ((xcf_device *)dev)->bitspercomponent; - int drop = sizeof(gx_color_value) * 8 - bpc; int mask = (1 << bpc) - 1; int i = 0; int ncomp = dev->color_info.num_components; + COLDUP_VARS; + COLDUP_SETUP(bpc); for (; i>= bpc; } return 0; @@ -1273,7 +1272,7 @@ } static void -xcf_icc_to_tile(xcf_write_ctx *xc, byte **tile_data, const byte *row, +xcf_icc_to_tile(gx_device_printer *pdev, xcf_write_ctx *xc, byte **tile_data, const byte *row, int y, gcmmhlink_t link) { int tile_j = y / TILE_HEIGHT; @@ -1303,8 +1302,9 @@ understand what is going on in the loop with the 255^row[row_idx++] operation */ - gscms_transform_color(link, &(row[row_idx]), - &(base_ptr[base_idx]), 1, NULL); + gscms_transform_color((gx_device*) pdev, link, + (void *) (&(row[row_idx])), + &(base_ptr[base_idx]), 1); for (plane_idx = 0; plane_idx < n_extra_channels; plane_idx++) extra_ptr[plane_idx * extra_stride + x] = 255 ^ row[row_idx++]; @@ -1349,7 +1349,7 @@ if (link == NULL) xcf_shuffle_to_tile(xc, tile_data, row, y); else - xcf_icc_to_tile(xc, tile_data, row, y, link); + xcf_icc_to_tile(pdev, xc, tile_data, row, y, link); } for (tile_i = 0; tile_i < xc->n_tiles_x; tile_i++) { int tile_idx = tile_j * xc->n_tiles_x + tile_i; diff -Nru ghostscript-9.04~dfsg/base/genarch.c ghostscript-9.05~dfsg~20120125/base/genarch.c --- ghostscript-9.04~dfsg/base/genarch.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/genarch.c 2011-09-29 11:01:33.000000000 +0000 @@ -75,10 +75,33 @@ return i; } +static int +copy_existing_file(FILE *f, char *infname) +{ + FILE *in = fopen(infname, "r"); + char buffer[1024]; + size_t l; + + if (in == NULL) { + fprintf(stderr, "genarch.c: can't open %s for reading\n", infname); + fclose(f); + return exit_FAILED; + } + while (!feof(in)) { + l = fread(buffer, 1, 1024, in); + if (l > 0) + fwrite(buffer, 1, l, f); + } + fclose(in); + fclose(f); + + return exit_OK; +} + int main(int argc, char *argv[]) { - char *fname = argv[1]; + char *fname; long one = 1; struct { char c; @@ -119,12 +142,25 @@ long l; } f0, f1, fm1; int floats_are_IEEE; - FILE *f = fopen(fname, "w"); + FILE *f; + + if (argc < 2 || argc > 3) { + fprintf(stderr, "genarch: Invalid invocation\n" + "genarch [ ]\n"); + return exit_FAILED; + } + fname = argv[1]; + f = fopen(fname, "w"); if (f == NULL) { fprintf(stderr, "genarch.c: can't open %s for writing\n", fname); return exit_FAILED; } + + if (argc == 3) { + return copy_existing_file(f, argv[2]); + } + fprintf(f, "/* Parameters derived from machine and compiler architecture. */\n"); fprintf(f, "/* This file is generated mechanically by genarch.c. */\n"); diff -Nru ghostscript-9.04~dfsg/base/genconf.c ghostscript-9.05~dfsg~20120125/base/genconf.c --- ghostscript-9.04~dfsg/base/genconf.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/genconf.c 2011-11-12 18:29:08.000000000 +0000 @@ -472,12 +472,12 @@ fputs("/* This file was generated automatically by genconf.c. */\n", out); fputs("/* For documentation, see gsconfig.c. */\n", out); { - char template[80]; + char templat[80]; - sprintf(template, + sprintf(templat, "font_(\"0.font_%%s\",%sf_%%s,zf_%%s)\n", conf.name_prefix); - write_list(out, &conf.lists.named.fonts, template); + write_list(out, &conf.lists.named.fonts, templat); } break; case 'h': @@ -747,7 +747,7 @@ return 0; } else { /* add to current category */ char str[MAX_STR]; - char template[80]; + char templat[80]; const char *pat = 0; string_list_t *list = &pconf->lists.named.resources; @@ -770,8 +770,8 @@ else goto err; list = &pconf->lists.named.devs; -pre: sprintf(template, pat, pconf->name_prefix); - pat = template; +pre: sprintf(templat, pat, pconf->name_prefix); + pat = templat; break; case 'e': if (IS_CAT("emulator")) { @@ -828,9 +828,9 @@ case 'o': if (IS_CAT("obj")) { list = &pconf->lists.named.objs; - strcpy(template, pconf->file_prefix); - strcat(template, "%s"); - pat = template; + strcpy(templat, pconf->file_prefix); + strcat(templat, "%s"); + pat = templat; break; } if (IS_CAT("oper")) { diff -Nru ghostscript-9.04~dfsg/base/gp_dvx.c ghostscript-9.05~dfsg~20120125/base/gp_dvx.c --- ghostscript-9.04~dfsg/base/gp_dvx.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gp_dvx.c 2011-11-12 18:29:08.000000000 +0000 @@ -48,6 +48,14 @@ return strerror(errnum); } +/* We don't have a good way to get a serial number here, so just */ +/* return what we always used to: GS_SERIALNUMBER. */ +int +gp_serialnumber(void) +{ + return (int)(gs_serialnumber); +} + /* ------ Date and time ------ */ /* Read the current time (in seconds since Jan. 1, 1970) */ diff -Nru ghostscript-9.04~dfsg/base/gp.h ghostscript-9.05~dfsg~20120125/base/gp.h --- ghostscript-9.04~dfsg/base/gp.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gp.h 2011-11-21 08:55:19.000000000 +0000 @@ -19,6 +19,7 @@ # define gp_INCLUDED #include "gstypes.h" +#include "gscdefs.h" /* for gs_serialnumber */ /* * This file defines the interface to ***ALL*** platform-specific routines, * with the exception of the thread/synchronization interface (gpsync.h) @@ -95,6 +96,14 @@ */ int gp_defaultpapersize(char *ptr, int *plen); +/* + * Return a serialnumber. Clients that want to can modify the appropriate + * gp_***.c file(s) for their platform and Digital Rights Management (DRM) + * of choice. Default handlers for common platforms use info from the OS + * and unsupported or old platforms simply return GS_SERIALNUMBER. + */ +int gp_serialnumber(void); + /* ------ Date and time ------ */ /* @@ -340,8 +349,6 @@ /* cache data types */ #define GP_CACHE_TYPE_TEST 0 #define GP_CACHE_TYPE_FONTMAP 1 -#define GP_CACHE_TYPE_WTS_SIZE 2 -#define GP_CACHE_TYPE_WTS_CELL 3 /* ------ Printer accessing ------ */ diff -Nru ghostscript-9.04~dfsg/base/gp_mac.c ghostscript-9.05~dfsg~20120125/base/gp_mac.c --- ghostscript-9.04~dfsg/base/gp_mac.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gp_mac.c 2011-11-12 18:29:08.000000000 +0000 @@ -172,6 +172,15 @@ return NULL; } + +/* We don't have a good way to get a serial number here, so just */ +/* return what we always used to: GS_SERIALNUMBER. */ +int +gp_serialnumber(void) +{ + return (int)(gs_serialnumber); +} + /* ------ Date and time ------ */ /* Read the current date (in days since Jan. 1, 1980) */ diff -Nru ghostscript-9.04~dfsg/base/gp_msdos.c ghostscript-9.05~dfsg~20120125/base/gp_msdos.c --- ghostscript-9.04~dfsg/base/gp_msdos.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gp_msdos.c 2011-11-12 18:29:08.000000000 +0000 @@ -31,6 +31,15 @@ return strerror(errnum); } + +/* We don't have a good way to get a serial number here, so just */ +/* return what we always used to: GS_SERIALNUMBER. */ +int +gp_serialnumber(void) +{ + return (int)(gs_serialnumber); +} + /* ------ Date and time ------ */ /* Read the current time (in seconds since Jan. 1, 1980) */ diff -Nru ghostscript-9.04~dfsg/base/gp_mshdl.c ghostscript-9.05~dfsg~20120125/base/gp_mshdl.c --- ghostscript-9.04~dfsg/base/gp_mshdl.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gp_mshdl.c 2011-09-29 11:01:33.000000000 +0000 @@ -18,10 +18,10 @@ #include "string_.h" #include "ctype_.h" #include -#include "gserror.h" #include "gstypes.h" #include "gsmemory.h" /* for gxiodev.h */ #include "gxiodev.h" +#include "gserrors.h" /* The MS-Windows handle IODevice */ diff -Nru ghostscript-9.04~dfsg/base/gp_msprn.c ghostscript-9.05~dfsg~20120125/base/gp_msprn.c --- ghostscript-9.04~dfsg/base/gp_msprn.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gp_msprn.c 2011-09-29 11:01:33.000000000 +0000 @@ -24,7 +24,6 @@ #include "gp.h" #include "gscdefs.h" #include "gserrors.h" -#include "gserror.h" #include "gstypes.h" #include "gsmemory.h" /* for gxiodev.h */ #include "gxiodev.h" diff -Nru ghostscript-9.04~dfsg/base/gp_nsync.c ghostscript-9.05~dfsg~20120125/base/gp_nsync.c --- ghostscript-9.04~dfsg/base/gp_nsync.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gp_nsync.c 2011-09-29 11:01:33.000000000 +0000 @@ -14,7 +14,6 @@ /* $Id$ */ /* Dummy thread / semaphore / monitor implementation */ #include "std.h" -#include "gserror.h" #include "gserrors.h" #include "gpsync.h" diff -Nru ghostscript-9.04~dfsg/base/gp_os2.c ghostscript-9.05~dfsg~20120125/base/gp_os2.c --- ghostscript-9.04~dfsg/base/gp_os2.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gp_os2.c 2011-11-12 18:29:08.000000000 +0000 @@ -91,6 +91,14 @@ return strerror(errnum); } +/* We don't have a good way to get a serial number here, so just */ +/* return what we always used to: GS_SERIALNUMBER. */ +int +gp_serialnumber(void) +{ + return (int)(gs_serialnumber); +} + /* use Unix version for date and time */ /* ------ Date and time ------ */ diff -Nru ghostscript-9.04~dfsg/base/gp_os2pr.c ghostscript-9.05~dfsg~20120125/base/gp_os2pr.c --- ghostscript-9.04~dfsg/base/gp_os2pr.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gp_os2pr.c 2011-09-29 11:01:33.000000000 +0000 @@ -29,7 +29,6 @@ #include "gp.h" #include "gscdefs.h" #include "gserrors.h" -#include "gserror.h" #include "gstypes.h" #include "gsmemory.h" /* for gxiodev.h */ #include "gxiodev.h" diff -Nru ghostscript-9.04~dfsg/base/gp_psync.c ghostscript-9.05~dfsg~20120125/base/gp_psync.c --- ghostscript-9.04~dfsg/base/gp_psync.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gp_psync.c 2011-09-29 11:01:33.000000000 +0000 @@ -16,7 +16,6 @@ #include "std.h" #include "malloc_.h" #include -#include "gserror.h" #include "gserrors.h" #include "gpsync.h" diff -Nru ghostscript-9.04~dfsg/base/gp_unix.c ghostscript-9.05~dfsg~20120125/base/gp_unix.c --- ghostscript-9.04~dfsg/base/gp_unix.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gp_unix.c 2011-11-12 18:29:08.000000000 +0000 @@ -115,6 +115,14 @@ return NULL; } +/* We don't have a good way to get a serial number here, so just */ +/* return what we always used to: GS_SERIALNUMBER. */ +int +gp_serialnumber(void) +{ + return (int)(gs_serialnumber); +} + /* read in a MacOS 'resource' from an extended attribute. */ /* we don't try to implemented this since it requires support */ /* for Apple's HFS(+) filesystem */ diff -Nru ghostscript-9.04~dfsg/base/gp_unix_cache.c ghostscript-9.05~dfsg~20120125/base/gp_unix_cache.c --- ghostscript-9.04~dfsg/base/gp_unix_cache.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gp_unix_cache.c 2011-11-12 18:29:08.000000000 +0000 @@ -102,6 +102,7 @@ prefix = path; } else { dlprintf1("file_name_combine failed with code %d\n", result); + free(path); } free(home); } @@ -377,6 +378,7 @@ /* save it to disk */ path = gp_cache_itempath(prefix, &item); file = fopen(path, "wb"); + free(path); if (file != NULL) { gp_cache_saveitem(file, &item); fclose(file); @@ -466,6 +468,7 @@ /* look for it on the disk */ path = gp_cache_itempath(prefix, &item); file = fopen(path, "rb"); + free(path); if (file != NULL) { hit = gp_cache_loaditem(file, &item, alloc, userdata); fclose(file); diff -Nru ghostscript-9.04~dfsg/base/gp_vms.c ghostscript-9.05~dfsg~20120125/base/gp_vms.c --- ghostscript-9.04~dfsg/base/gp_vms.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gp_vms.c 2011-11-12 18:29:08.000000000 +0000 @@ -425,6 +425,14 @@ return NULL; } +/* We don't have a good way to get a serial number here, so just */ +/* return what we always used to: GS_SERIALNUMBER. */ +int +gp_serialnumber(void) +{ + return (int)(gs_serialnumber); +} + /* -------------- Helpers for gp_file_name_combine_generic ------------- */ uint gp_file_name_root(const char *fname, uint len) diff -Nru ghostscript-9.04~dfsg/base/gp_wgetv.c ghostscript-9.05~dfsg~20120125/base/gp_wgetv.c --- ghostscript-9.04~dfsg/base/gp_wgetv.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gp_wgetv.c 2011-11-12 18:29:08.000000000 +0000 @@ -12,13 +12,13 @@ */ /* $Id$ */ -/* MS Windows implementation of gp_getenv */ +/* MS Windows implementation of gp_getenv, and gp_serialnumber */ #include "windows_.h" #include #include /* for getenv */ #include -#include "gscdefs.h" /* for gs_productfamily and gs_revision */ +#include "gscdefs.h" /* for gs_productfamily and gs_revision and gs_serialnumber */ #ifdef __WIN32__ /* @@ -32,19 +32,18 @@ char *ptr, int *plen) { HKEY hkey; - DWORD cbData, keytype; + DWORD cbData; BYTE b; LONG rc; BYTE *bptr = (BYTE *)ptr; if (RegOpenKeyEx(hkeyroot, key, 0, KEY_READ, &hkey) == ERROR_SUCCESS) { - keytype = REG_SZ; cbData = *plen; if (bptr == (char *)NULL) bptr = &b; /* Registry API won't return ERROR_MORE_DATA */ /* if ptr is NULL */ - rc = RegQueryValueEx(hkey, (char *)name, 0, &keytype, bptr, &cbData); + rc = RegQueryValueEx(hkey, (char *)name, 0, NULL, bptr, &cbData); RegCloseKey(hkey); if (rc == ERROR_SUCCESS) { *plen = cbData; @@ -57,8 +56,8 @@ } return 1; /* not found */ } -#else -static int +#else /* ifdef WINDOWS_NO_UNICODE */ +int gp_getenv_registry(HKEY hkeyroot, const wchar_t *key, const char *name, char *ptr, int *plen) { @@ -134,8 +133,8 @@ free(wname); return 1; /* environment variable does not exist */ } -#endif -#endif +#endif /* ifdef WINDOWS_NO_UNICODE */ +#endif /* ifdef __WIN32__ */ /* ------ Environment variables ------ */ @@ -209,3 +208,37 @@ *plen = 1; return 1; } + +/* If we aren't on WIN32, We don't have a good way to get a serial */ +/* number here, so just return what we always used to */ +int +gp_serialnumber(void) +{ +#ifdef __WIN32__ +#define SERIALNUMBER_BUFSIZE 512 + byte buf[SERIALNUMBER_BUFSIZE]; + int buflen = SERIALNUMBER_BUFSIZE; + int code, i; +#ifdef WINDOWS_NO_UNICODE + char key[256]; + + sprintf(key, "Software\\Microsoft\\MSLicensing\\HardwareID"); +#else /* WINDOWS_NO_UNICODE */ + wchar_t key[256]; + + wsprintfW(key, L"Software\\Microsoft\\MSLicensing\\HardwareID"); +#endif /* WINDOWS_NO_UNICODE */ + code = gp_getenv_registry(HKEY_LOCAL_MACHINE, key, "ClientHWID", (char *)buf, &buflen); + if ( code != 0 ) + return (int)(gs_serialnumber); /* error - just return the default */ + + /* now turn the buffer into a 31-bit (avoid negative values) integer */ + for (i=0, code=0; i> 31); /* a cheap checksum */ + + return code & 0x7fffffff; /* strip the high bit */ + +#endif /* __WIN32__ */ + + return (int)(gs_serialnumber); +} diff -Nru ghostscript-9.04~dfsg/base/gp_win32.c ghostscript-9.05~dfsg~20120125/base/gp_win32.c --- ghostscript-9.04~dfsg/base/gp_win32.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gp_win32.c 2011-09-29 11:01:33.000000000 +0000 @@ -19,7 +19,6 @@ #include "string_.h" /* for strerror */ #include "gstypes.h" #include "gsmemory.h" /* for gp.h */ -#include "gserror.h" #include "gserrors.h" #include "gp.h" #include "windows_.h" diff -Nru ghostscript-9.04~dfsg/base/gp_wsync.c ghostscript-9.05~dfsg~20120125/base/gp_wsync.c --- ghostscript-9.04~dfsg/base/gp_wsync.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gp_wsync.c 2011-09-29 11:01:33.000000000 +0000 @@ -15,7 +15,6 @@ /* MS Windows (Win32) thread / semaphore / monitor implementation */ /* original multi-threading code by John Desrosiers */ #include "malloc_.h" -#include "gserror.h" #include "gserrors.h" #include "gpsync.h" #include "windows_.h" diff -Nru ghostscript-9.04~dfsg/base/gs_agl.h ghostscript-9.05~dfsg~20120125/base/gs_agl.h --- ghostscript-9.04~dfsg/base/gs_agl.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gs_agl.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,4227 +0,0 @@ -/* Copyright (C) 2001-2011 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ - -/* $Id: gs_agl_e.h 11951 2010-12-15 08:22:58Z ken */ -/* Originally stored in gs/Resource/Init as gs_agl_e.ps and built into - * the ROM file system, this file was referenced by ps2write when - * writing PostScript output. With the inclusion of ps2write in the - * PCL and XPS interpreters we can no longer rely on the PostScript - * resources being present, and so this file has been converted to - * 'C' and included as a header. The original file is now stored - * in gs/lib with the comments intact. - */ -const char *gs_agl_ps [] = { -"/AdobeGlyphList mark\n", -"/A 16#0041\n", -"/AE 16#00C6\n", -"/AEacute 16#01FC\n", -"/AEmacron 16#01E2\n", -"/AEsmall 16#F7E6\n", -"/Aacute 16#00C1\n", -"/Aacutesmall 16#F7E1\n", -"/Abreve 16#0102\n", -"/Abreveacute 16#1EAE\n", -"/Abrevecyrillic 16#04D0\n", -"/Abrevedotbelow 16#1EB6\n", -"/Abrevegrave 16#1EB0\n", -"/Abrevehookabove 16#1EB2\n", -"/Abrevetilde 16#1EB4\n", -"/Acaron 16#01CD\n", -"/Acircle 16#24B6\n", -"/Acircumflex 16#00C2\n", -"/Acircumflexacute 16#1EA4\n", -"/Acircumflexdotbelow 16#1EAC\n", -"/Acircumflexgrave 16#1EA6\n", -"/Acircumflexhookabove 16#1EA8\n", -"/Acircumflexsmall 16#F7E2\n", -"/Acircumflextilde 16#1EAA\n", -"/Acute 16#F6C9\n", -"/Acutesmall 16#F7B4\n", -"/Acyrillic 16#0410\n", -"/Adblgrave 16#0200\n", -"/Adieresis 16#00C4\n", -"/Adieresiscyrillic 16#04D2\n", -"/Adieresismacron 16#01DE\n", -"/Adieresissmall 16#F7E4\n", -"/Adotbelow 16#1EA0\n", -"/Adotmacron 16#01E0\n", -"/Agrave 16#00C0\n", -"/Agravesmall 16#F7E0\n", -"/Ahookabove 16#1EA2\n", -"/Aiecyrillic 16#04D4\n", -"/Ainvertedbreve 16#0202\n", -"/Alpha 16#0391\n", -"/Alphatonos 16#0386\n", -"/Amacron 16#0100\n", -"/Amonospace 16#FF21\n", -"/Aogonek 16#0104\n", -"/Aring 16#00C5\n", -"/Aringacute 16#01FA\n", -"/Aringbelow 16#1E00\n", -"/Aringsmall 16#F7E5\n", -"/Asmall 16#F761\n", -"/Atilde 16#00C3\n", -"/Atildesmall 16#F7E3\n", -"/Aybarmenian 16#0531\n", -"/B 16#0042\n", -"/Bcircle 16#24B7\n", -"/Bdotaccent 16#1E02\n", -"/Bdotbelow 16#1E04\n", -"/Becyrillic 16#0411\n", -"/Benarmenian 16#0532\n", -"/Beta 16#0392\n", -"/Bhook 16#0181\n", -"/Blinebelow 16#1E06\n", -"/Bmonospace 16#FF22\n", -"/Brevesmall 16#F6F4\n", -"/Bsmall 16#F762\n", -"/Btopbar 16#0182\n", -"/C 16#0043\n", -"/Caarmenian 16#053E\n", -"/Cacute 16#0106\n", -"/Caron 16#F6CA\n", -"/Caronsmall 16#F6F5\n", -"/Ccaron 16#010C\n", -"/Ccedilla 16#00C7\n", -"/Ccedillaacute 16#1E08\n", -"/Ccedillasmall 16#F7E7\n", -"/Ccircle 16#24B8\n", -"/Ccircumflex 16#0108\n", -"/Cdot 16#010A\n", -"/Cdotaccent 16#010A\n", -"/Cedillasmall 16#F7B8\n", -"/Chaarmenian 16#0549\n", -"/Cheabkhasiancyrillic 16#04BC\n", -"/Checyrillic 16#0427\n", -"/Chedescenderabkhasiancyrillic 16#04BE\n", -"/Chedescendercyrillic 16#04B6\n", -"/Chedieresiscyrillic 16#04F4\n", -"/Cheharmenian 16#0543\n", -"/Chekhakassiancyrillic 16#04CB\n", -"/Cheverticalstrokecyrillic 16#04B8\n", -"/Chi 16#03A7\n", -"/Chook 16#0187\n", -"/Circumflexsmall 16#F6F6\n", -"/Cmonospace 16#FF23\n", -"/Coarmenian 16#0551\n", -"/Csmall 16#F763\n", -"/D 16#0044\n", -"/DZ 16#01F1\n", -"/DZcaron 16#01C4\n", -"/Daarmenian 16#0534\n", -"/Dafrican 16#0189\n", -"/Dcaron 16#010E\n", -"/Dcedilla 16#1E10\n", -"/Dcircle 16#24B9\n", -"/Dcircumflexbelow 16#1E12\n", -"/Dcroat 16#0110\n", -"/Ddotaccent 16#1E0A\n", -"/Ddotbelow 16#1E0C\n", -"/Decyrillic 16#0414\n", -"/Deicoptic 16#03EE\n", -"/Delta 16#2206\n", -"/Deltagreek 16#0394\n", -"/Dhook 16#018A\n", -"/Dieresis 16#F6CB\n", -"/DieresisAcute 16#F6CC\n", -"/DieresisGrave 16#F6CD\n", -"/Dieresissmall 16#F7A8\n", -"/Digammagreek 16#03DC\n", -"/Djecyrillic 16#0402\n", -"/Dlinebelow 16#1E0E\n", -"/Dmonospace 16#FF24\n", -"/Dotaccentsmall 16#F6F7\n", -"/Dslash 16#0110\n", -"/Dsmall 16#F764\n", -"/Dtopbar 16#018B\n", -"/Dz 16#01F2\n", -"/Dzcaron 16#01C5\n", -"/Dzeabkhasiancyrillic 16#04E0\n", -"/Dzecyrillic 16#0405\n", -"/Dzhecyrillic 16#040F\n", -"/E 16#0045\n", -"/Eacute 16#00C9\n", -"/Eacutesmall 16#F7E9\n", -"/Ebreve 16#0114\n", -"/Ecaron 16#011A\n", -"/Ecedillabreve 16#1E1C\n", -"/Echarmenian 16#0535\n", -"/Ecircle 16#24BA\n", -"/Ecircumflex 16#00CA\n", -"/Ecircumflexacute 16#1EBE\n", -"/Ecircumflexbelow 16#1E18\n", -"/Ecircumflexdotbelow 16#1EC6\n", -"/Ecircumflexgrave 16#1EC0\n", -"/Ecircumflexhookabove 16#1EC2\n", -"/Ecircumflexsmall 16#F7EA\n", -"/Ecircumflextilde 16#1EC4\n", -"/Ecyrillic 16#0404\n", -"/Edblgrave 16#0204\n", -"/Edieresis 16#00CB\n", -"/Edieresissmall 16#F7EB\n", -"/Edot 16#0116\n", -"/Edotaccent 16#0116\n", -"/Edotbelow 16#1EB8\n", -"/Efcyrillic 16#0424\n", -"/Egrave 16#00C8\n", -"/Egravesmall 16#F7E8\n", -"/Eharmenian 16#0537\n", -"/Ehookabove 16#1EBA\n", -"/Eightroman 16#2167\n", -"/Einvertedbreve 16#0206\n", -"/Eiotifiedcyrillic 16#0464\n", -"/Elcyrillic 16#041B\n", -"/Elevenroman 16#216A\n", -"/Emacron 16#0112\n", -"/Emacronacute 16#1E16\n", -"/Emacrongrave 16#1E14\n", -"/Emcyrillic 16#041C\n", -"/Emonospace 16#FF25\n", -"/Encyrillic 16#041D\n", -"/Endescendercyrillic 16#04A2\n", -"/Eng 16#014A\n", -"/Enghecyrillic 16#04A4\n", -"/Enhookcyrillic 16#04C7\n", -"/Eogonek 16#0118\n", -"/Eopen 16#0190\n", -"/Epsilon 16#0395\n", -"/Epsilontonos 16#0388\n", -"/Ercyrillic 16#0420\n", -"/Ereversed 16#018E\n", -"/Ereversedcyrillic 16#042D\n", -"/Escyrillic 16#0421\n", -"/Esdescendercyrillic 16#04AA\n", -"/Esh 16#01A9\n", -"/Esmall 16#F765\n", -"/Eta 16#0397\n", -"/Etarmenian 16#0538\n", -"/Etatonos 16#0389\n", -"/Eth 16#00D0\n", -"/Ethsmall 16#F7F0\n", -"/Etilde 16#1EBC\n", -"/Etildebelow 16#1E1A\n", -"/Euro 16#20AC\n", -"/Ezh 16#01B7\n", -"/Ezhcaron 16#01EE\n", -"/Ezhreversed 16#01B8\n", -"/F 16#0046\n", -"/Fcircle 16#24BB\n", -"/Fdotaccent 16#1E1E\n", -"/Feharmenian 16#0556\n", -"/Feicoptic 16#03E4\n", -"/Fhook 16#0191\n", -"/Fitacyrillic 16#0472\n", -"/Fiveroman 16#2164\n", -"/Fmonospace 16#FF26\n", -"/Fourroman 16#2163\n", -"/Fsmall 16#F766\n", -"/G 16#0047\n", -"/GBsquare 16#3387\n", -"/Gacute 16#01F4\n", -"/Gamma 16#0393\n", -"/Gammaafrican 16#0194\n", -"/Gangiacoptic 16#03EA\n", -"/Gbreve 16#011E\n", -"/Gcaron 16#01E6\n", -"/Gcedilla 16#0122\n", -"/Gcircle 16#24BC\n", -"/Gcircumflex 16#011C\n", -"/Gcommaaccent 16#0122\n", -"/Gdot 16#0120\n", -"/Gdotaccent 16#0120\n", -"/Gecyrillic 16#0413\n", -"/Ghadarmenian 16#0542\n", -"/Ghemiddlehookcyrillic 16#0494\n", -"/Ghestrokecyrillic 16#0492\n", -"/Gheupturncyrillic 16#0490\n", -"/Ghook 16#0193\n", -"/Gimarmenian 16#0533\n", -"/Gjecyrillic 16#0403\n", -"/Gmacron 16#1E20\n", -"/Gmonospace 16#FF27\n", -"/Grave 16#F6CE\n", -"/Gravesmall 16#F760\n", -"/Gsmall 16#F767\n", -"/Gsmallhook 16#029B\n", -"/Gstroke 16#01E4\n", -"/H 16#0048\n", -"/H18533 16#25CF\n", -"/H18543 16#25AA\n", -"/H18551 16#25AB\n", -"/H22073 16#25A1\n", -"/HPsquare 16#33CB\n", -"/Haabkhasiancyrillic 16#04A8\n", -"/Hadescendercyrillic 16#04B2\n", -"/Hardsigncyrillic 16#042A\n", -"/Hbar 16#0126\n", -"/Hbrevebelow 16#1E2A\n", -"/Hcedilla 16#1E28\n", -"/Hcircle 16#24BD\n", -"/Hcircumflex 16#0124\n", -"/Hdieresis 16#1E26\n", -"/Hdotaccent 16#1E22\n", -"/Hdotbelow 16#1E24\n", -"/Hmonospace 16#FF28\n", -"/Hoarmenian 16#0540\n", -"/Horicoptic 16#03E8\n", -"/Hsmall 16#F768\n", -"/Hungarumlaut 16#F6CF\n", -"/Hungarumlautsmall 16#F6F8\n", -"/Hzsquare 16#3390\n", -"/I 16#0049\n", -"/IAcyrillic 16#042F\n", -"/IJ 16#0132\n", -"/IUcyrillic 16#042E\n", -"/Iacute 16#00CD\n", -"/Iacutesmall 16#F7ED\n", -"/Ibreve 16#012C\n", -"/Icaron 16#01CF\n", -"/Icircle 16#24BE\n", -"/Icircumflex 16#00CE\n", -"/Icircumflexsmall 16#F7EE\n", -"/Icyrillic 16#0406\n", -"/Idblgrave 16#0208\n", -"/Idieresis 16#00CF\n", -"/Idieresisacute 16#1E2E\n", -"/Idieresiscyrillic 16#04E4\n", -"/Idieresissmall 16#F7EF\n", -"/Idot 16#0130\n", -"/Idotaccent 16#0130\n", -"/Idotbelow 16#1ECA\n", -"/Iebrevecyrillic 16#04D6\n", -"/Iecyrillic 16#0415\n", -"/Ifraktur 16#2111\n", -"/Igrave 16#00CC\n", -"/Igravesmall 16#F7EC\n", -"/Ihookabove 16#1EC8\n", -"/Iicyrillic 16#0418\n", -"/Iinvertedbreve 16#020A\n", -"/Iishortcyrillic 16#0419\n", -"/Imacron 16#012A\n", -"/Imacroncyrillic 16#04E2\n", -"/Imonospace 16#FF29\n", -"/Iniarmenian 16#053B\n", -"/Iocyrillic 16#0401\n", -"/Iogonek 16#012E\n", -"/Iota 16#0399\n", -"/Iotaafrican 16#0196\n", -"/Iotadieresis 16#03AA\n", -"/Iotatonos 16#038A\n", -"/Ismall 16#F769\n", -"/Istroke 16#0197\n", -"/Itilde 16#0128\n", -"/Itildebelow 16#1E2C\n", -"/Izhitsacyrillic 16#0474\n", -"/Izhitsadblgravecyrillic 16#0476\n", -"/J 16#004A\n", -"/Jaarmenian 16#0541\n", -"/Jcircle 16#24BF\n", -"/Jcircumflex 16#0134\n", -"/Jecyrillic 16#0408\n", -"/Jheharmenian 16#054B\n", -"/Jmonospace 16#FF2A\n", -"/Jsmall 16#F76A\n", -"/K 16#004B\n", -"/KBsquare 16#3385\n", -"/KKsquare 16#33CD\n", -"/Kabashkircyrillic 16#04A0\n", -"/Kacute 16#1E30\n", -"/Kacyrillic 16#041A\n", -"/Kadescendercyrillic 16#049A\n", -"/Kahookcyrillic 16#04C3\n", -"/Kappa 16#039A\n", -"/Kastrokecyrillic 16#049E\n", -"/Kaverticalstrokecyrillic 16#049C\n", -"/Kcaron 16#01E8\n", -"/Kcedilla 16#0136\n", -"/Kcircle 16#24C0\n", -"/Kcommaaccent 16#0136\n", -"/Kdotbelow 16#1E32\n", -"/Keharmenian 16#0554\n", -"/Kenarmenian 16#053F\n", -"/Khacyrillic 16#0425\n", -"/Kheicoptic 16#03E6\n", -"/Khook 16#0198\n", -"/Kjecyrillic 16#040C\n", -"/Klinebelow 16#1E34\n", -"/Kmonospace 16#FF2B\n", -"/Koppacyrillic 16#0480\n", -"/Koppagreek 16#03DE\n", -"/Ksicyrillic 16#046E\n", -"/Ksmall 16#F76B\n", -"/L 16#004C\n", -"/LJ 16#01C7\n", -"/LL 16#F6BF\n", -"/Lacute 16#0139\n", -"/Lambda 16#039B\n", -"/Lcaron 16#013D\n", -"/Lcedilla 16#013B\n", -"/Lcircle 16#24C1\n", -"/Lcircumflexbelow 16#1E3C\n", -"/Lcommaaccent 16#013B\n", -"/Ldot 16#013F\n", -"/Ldotaccent 16#013F\n", -"/Ldotbelow 16#1E36\n", -"/Ldotbelowmacron 16#1E38\n", -"/Liwnarmenian 16#053C\n", -"/Lj 16#01C8\n", -"/Ljecyrillic 16#0409\n", -"/Llinebelow 16#1E3A\n", -"/Lmonospace 16#FF2C\n", -"/Lslash 16#0141\n", -"/Lslashsmall 16#F6F9\n", -"/Lsmall 16#F76C\n", -"/M 16#004D\n", -"/MBsquare 16#3386\n", -"/Macron 16#F6D0\n", -"/Macronsmall 16#F7AF\n", -"/Macute 16#1E3E\n", -"/Mcircle 16#24C2\n", -"/Mdotaccent 16#1E40\n", -"/Mdotbelow 16#1E42\n", -"/Menarmenian 16#0544\n", -"/Mmonospace 16#FF2D\n", -"/Msmall 16#F76D\n", -"/Mturned 16#019C\n", -"/Mu 16#039C\n", -"/N 16#004E\n", -"/NJ 16#01CA\n", -"/Nacute 16#0143\n", -"/Ncaron 16#0147\n", -"/Ncedilla 16#0145\n", -"/Ncircle 16#24C3\n", -"/Ncircumflexbelow 16#1E4A\n", -"/Ncommaaccent 16#0145\n", -"/Ndotaccent 16#1E44\n", -"/Ndotbelow 16#1E46\n", -"/Nhookleft 16#019D\n", -"/Nineroman 16#2168\n", -"/Nj 16#01CB\n", -"/Njecyrillic 16#040A\n", -"/Nlinebelow 16#1E48\n", -"/Nmonospace 16#FF2E\n", -"/Nowarmenian 16#0546\n", -"/Nsmall 16#F76E\n", -"/Ntilde 16#00D1\n", -"/Ntildesmall 16#F7F1\n", -"/Nu 16#039D\n", -"/O 16#004F\n", -"/OE 16#0152\n", -"/OEsmall 16#F6FA\n", -"/Oacute 16#00D3\n", -"/Oacutesmall 16#F7F3\n", -"/Obarredcyrillic 16#04E8\n", -"/Obarreddieresiscyrillic 16#04EA\n", -"/Obreve 16#014E\n", -"/Ocaron 16#01D1\n", -"/Ocenteredtilde 16#019F\n", -"/Ocircle 16#24C4\n", -"/Ocircumflex 16#00D4\n", -"/Ocircumflexacute 16#1ED0\n", -"/Ocircumflexdotbelow 16#1ED8\n", -"/Ocircumflexgrave 16#1ED2\n", -"/Ocircumflexhookabove 16#1ED4\n", -"/Ocircumflexsmall 16#F7F4\n", -"/Ocircumflextilde 16#1ED6\n", -"/Ocyrillic 16#041E\n", -"/Odblacute 16#0150\n", -"/Odblgrave 16#020C\n", -"/Odieresis 16#00D6\n", -"/Odieresiscyrillic 16#04E6\n", -"/Odieresissmall 16#F7F6\n", -"/Odotbelow 16#1ECC\n", -"/Ogoneksmall 16#F6FB\n", -"/Ograve 16#00D2\n", -"/Ogravesmall 16#F7F2\n", -"/Oharmenian 16#0555\n", -"/Ohm 16#2126\n", -"/Ohookabove 16#1ECE\n", -"/Ohorn 16#01A0\n", -"/Ohornacute 16#1EDA\n", -"/Ohorndotbelow 16#1EE2\n", -"/Ohorngrave 16#1EDC\n", -"/Ohornhookabove 16#1EDE\n", -"/Ohorntilde 16#1EE0\n", -"/Ohungarumlaut 16#0150\n", -"/Oi 16#01A2\n", -"/Oinvertedbreve 16#020E\n", -"/Omacron 16#014C\n", -"/Omacronacute 16#1E52\n", -"/Omacrongrave 16#1E50\n", -"/Omega 16#2126\n", -"/Omegacyrillic 16#0460\n", -"/Omegagreek 16#03A9\n", -"/Omegaroundcyrillic 16#047A\n", -"/Omegatitlocyrillic 16#047C\n", -"/Omegatonos 16#038F\n", -"/Omicron 16#039F\n", -"/Omicrontonos 16#038C\n", -"/Omonospace 16#FF2F\n", -"/Oneroman 16#2160\n", -"/Oogonek 16#01EA\n", -"/Oogonekmacron 16#01EC\n", -"/Oopen 16#0186\n", -"/Oslash 16#00D8\n", -"/Oslashacute 16#01FE\n", -"/Oslashsmall 16#F7F8\n", -"/Osmall 16#F76F\n", -"/Ostrokeacute 16#01FE\n", -"/Otcyrillic 16#047E\n", -"/Otilde 16#00D5\n", -"/Otildeacute 16#1E4C\n", -"/Otildedieresis 16#1E4E\n", -"/Otildesmall 16#F7F5\n", -"/P 16#0050\n", -"/Pacute 16#1E54\n", -"/Pcircle 16#24C5\n", -"/Pdotaccent 16#1E56\n", -"/Pecyrillic 16#041F\n", -"/Peharmenian 16#054A\n", -"/Pemiddlehookcyrillic 16#04A6\n", -"/Phi 16#03A6\n", -"/Phook 16#01A4\n", -"/Pi 16#03A0\n", -"/Piwrarmenian 16#0553\n", -"/Pmonospace 16#FF30\n", -"/Psi 16#03A8\n", -"/Psicyrillic 16#0470\n", -"/Psmall 16#F770\n", -"/Q 16#0051\n", -"/Qcircle 16#24C6\n", -"/Qmonospace 16#FF31\n", -"/Qsmall 16#F771\n", -"/R 16#0052\n", -"/Raarmenian 16#054C\n", -"/Racute 16#0154\n", -"/Rcaron 16#0158\n", -"/Rcedilla 16#0156\n", -"/Rcircle 16#24C7\n", -"/Rcommaaccent 16#0156\n", -"/Rdblgrave 16#0210\n", -"/Rdotaccent 16#1E58\n", -"/Rdotbelow 16#1E5A\n", -"/Rdotbelowmacron 16#1E5C\n", -"/Reharmenian 16#0550\n", -"/Rfraktur 16#211C\n", -"/Rho 16#03A1\n", -"/Ringsmall 16#F6FC\n", -"/Rinvertedbreve 16#0212\n", -"/Rlinebelow 16#1E5E\n", -"/Rmonospace 16#FF32\n", -"/Rsmall 16#F772\n", -"/Rsmallinverted 16#0281\n", -"/Rsmallinvertedsuperior 16#02B6\n", -"/S 16#0053\n", -"/SF010000 16#250C\n", -"/SF020000 16#2514\n", -"/SF030000 16#2510\n", -"/SF040000 16#2518\n", -"/SF050000 16#253C\n", -"/SF060000 16#252C\n", -"/SF070000 16#2534\n", -"/SF080000 16#251C\n", -"/SF090000 16#2524\n", -"/SF100000 16#2500\n", -"/SF110000 16#2502\n", -"/SF190000 16#2561\n", -"/SF200000 16#2562\n", -"/SF210000 16#2556\n", -"/SF220000 16#2555\n", -"/SF230000 16#2563\n", -"/SF240000 16#2551\n", -"/SF250000 16#2557\n", -"/SF260000 16#255D\n", -"/SF270000 16#255C\n", -"/SF280000 16#255B\n", -"/SF360000 16#255E\n", -"/SF370000 16#255F\n", -"/SF380000 16#255A\n", -"/SF390000 16#2554\n", -"/SF400000 16#2569\n", -"/SF410000 16#2566\n", -"/SF420000 16#2560\n", -"/SF430000 16#2550\n", -"/SF440000 16#256C\n", -"/SF450000 16#2567\n", -"/SF460000 16#2568\n", -"/SF470000 16#2564\n", -"/SF480000 16#2565\n", -"/SF490000 16#2559\n", -"/SF500000 16#2558\n", -"/SF510000 16#2552\n", -"/SF520000 16#2553\n", -"/SF530000 16#256B\n", -"/SF540000 16#256A\n", -"/Sacute 16#015A\n", -"/Sacutedotaccent 16#1E64\n", -"/Sampigreek 16#03E0\n", -"/Scaron 16#0160\n", -"/Scarondotaccent 16#1E66\n", -"/Scaronsmall 16#F6FD\n", -"/Scedilla 16#015E\n", -"/Schwa 16#018F\n", -"/Schwacyrillic 16#04D8\n", -"/Schwadieresiscyrillic 16#04DA\n", -"/Scircle 16#24C8\n", -"/Scircumflex 16#015C\n", -"/Scommaaccent 16#0218\n", -"/Sdotaccent 16#1E60\n", -"/Sdotbelow 16#1E62\n", -"/Sdotbelowdotaccent 16#1E68\n", -"/Seharmenian 16#054D\n", -"/Sevenroman 16#2166\n", -"/Shaarmenian 16#0547\n", -"/Shacyrillic 16#0428\n", -"/Shchacyrillic 16#0429\n", -"/Sheicoptic 16#03E2\n", -"/Shhacyrillic 16#04BA\n", -"/Shimacoptic 16#03EC\n", -"/Sigma 16#03A3\n", -"/Sixroman 16#2165\n", -"/Smonospace 16#FF33\n", -"/Softsigncyrillic 16#042C\n", -"/Ssmall 16#F773\n", -"/Stigmagreek 16#03DA\n", -"/T 16#0054\n", -"/Tau 16#03A4\n", -"/Tbar 16#0166\n", -"/Tcaron 16#0164\n", -"/Tcedilla 16#0162\n", -"/Tcircle 16#24C9\n", -"/Tcircumflexbelow 16#1E70\n", -"/Tcommaaccent 16#0162\n", -"/Tdotaccent 16#1E6A\n", -"/Tdotbelow 16#1E6C\n", -"/Tecyrillic 16#0422\n", -"/Tedescendercyrillic 16#04AC\n", -"/Tenroman 16#2169\n", -"/Tetsecyrillic 16#04B4\n", -"/Theta 16#0398\n", -"/Thook 16#01AC\n", -"/Thorn 16#00DE\n", -"/Thornsmall 16#F7FE\n", -"/Threeroman 16#2162\n", -"/Tildesmall 16#F6FE\n", -"/Tiwnarmenian 16#054F\n", -"/Tlinebelow 16#1E6E\n", -"/Tmonospace 16#FF34\n", -"/Toarmenian 16#0539\n", -"/Tonefive 16#01BC\n", -"/Tonesix 16#0184\n", -"/Tonetwo 16#01A7\n", -"/Tretroflexhook 16#01AE\n", -"/Tsecyrillic 16#0426\n", -"/Tshecyrillic 16#040B\n", -"/Tsmall 16#F774\n", -"/Twelveroman 16#216B\n", -"/Tworoman 16#2161\n", -"/U 16#0055\n", -"/Uacute 16#00DA\n", -"/Uacutesmall 16#F7FA\n", -"/Ubreve 16#016C\n", -"/Ucaron 16#01D3\n", -"/Ucircle 16#24CA\n", -"/Ucircumflex 16#00DB\n", -"/Ucircumflexbelow 16#1E76\n", -"/Ucircumflexsmall 16#F7FB\n", -"/Ucyrillic 16#0423\n", -"/Udblacute 16#0170\n", -"/Udblgrave 16#0214\n", -"/Udieresis 16#00DC\n", -"/Udieresisacute 16#01D7\n", -"/Udieresisbelow 16#1E72\n", -"/Udieresiscaron 16#01D9\n", -"/Udieresiscyrillic 16#04F0\n", -"/Udieresisgrave 16#01DB\n", -"/Udieresismacron 16#01D5\n", -"/Udieresissmall 16#F7FC\n", -"/Udotbelow 16#1EE4\n", -"/Ugrave 16#00D9\n", -"/Ugravesmall 16#F7F9\n", -"/Uhookabove 16#1EE6\n", -"/Uhorn 16#01AF\n", -"/Uhornacute 16#1EE8\n", -"/Uhorndotbelow 16#1EF0\n", -"/Uhorngrave 16#1EEA\n", -"/Uhornhookabove 16#1EEC\n", -"/Uhorntilde 16#1EEE\n", -"/Uhungarumlaut 16#0170\n", -"/Uhungarumlautcyrillic 16#04F2\n", -"/Uinvertedbreve 16#0216\n", -"/Ukcyrillic 16#0478\n", -"/Umacron 16#016A\n", -"/Umacroncyrillic 16#04EE\n", -"/Umacrondieresis 16#1E7A\n", -"/Umonospace 16#FF35\n", -"/Uogonek 16#0172\n", -"/Upsilon 16#03A5\n", -"/Upsilon1 16#03D2\n", -"/Upsilonacutehooksymbolgreek 16#03D3\n", -"/Upsilonafrican 16#01B1\n", -"/Upsilondieresis 16#03AB\n", -"/Upsilondieresishooksymbolgreek 16#03D4\n", -"/Upsilonhooksymbol 16#03D2\n", -"/Upsilontonos 16#038E\n", -"/Uring 16#016E\n", -"/Ushortcyrillic 16#040E\n", -"/Usmall 16#F775\n", -"/Ustraightcyrillic 16#04AE\n", -"/Ustraightstrokecyrillic 16#04B0\n", -"/Utilde 16#0168\n", -"/Utildeacute 16#1E78\n", -"/Utildebelow 16#1E74\n", -"/V 16#0056\n", -"/Vcircle 16#24CB\n", -"/Vdotbelow 16#1E7E\n", -"/Vecyrillic 16#0412\n", -"/Vewarmenian 16#054E\n", -"/Vhook 16#01B2\n", -"/Vmonospace 16#FF36\n", -"/Voarmenian 16#0548\n", -"/Vsmall 16#F776\n", -"/Vtilde 16#1E7C\n", -"/W 16#0057\n", -"/Wacute 16#1E82\n", -"/Wcircle 16#24CC\n", -"/Wcircumflex 16#0174\n", -"/Wdieresis 16#1E84\n", -"/Wdotaccent 16#1E86\n", -"/Wdotbelow 16#1E88\n", -"/Wgrave 16#1E80\n", -"/Wmonospace 16#FF37\n", -"/Wsmall 16#F777\n", -"/X 16#0058\n", -"/Xcircle 16#24CD\n", -"/Xdieresis 16#1E8C\n", -"/Xdotaccent 16#1E8A\n", -"/Xeharmenian 16#053D\n", -"/Xi 16#039E\n", -"/Xmonospace 16#FF38\n", -"/Xsmall 16#F778\n", -"/Y 16#0059\n", -"/Yacute 16#00DD\n", -"/Yacutesmall 16#F7FD\n", -"/Yatcyrillic 16#0462\n", -"/Ycircle 16#24CE\n", -"/Ycircumflex 16#0176\n", -"/Ydieresis 16#0178\n", -"/Ydieresissmall 16#F7FF\n", -"/Ydotaccent 16#1E8E\n", -"/Ydotbelow 16#1EF4\n", -"/Yericyrillic 16#042B\n", -"/Yerudieresiscyrillic 16#04F8\n", -"/Ygrave 16#1EF2\n", -"/Yhook 16#01B3\n", -"/Yhookabove 16#1EF6\n", -"/Yiarmenian 16#0545\n", -"/Yicyrillic 16#0407\n", -"/Yiwnarmenian 16#0552\n", -"/Ymonospace 16#FF39\n", -"/Ysmall 16#F779\n", -"/Ytilde 16#1EF8\n", -"/Yusbigcyrillic 16#046A\n", -"/Yusbigiotifiedcyrillic 16#046C\n", -"/Yuslittlecyrillic 16#0466\n", -"/Yuslittleiotifiedcyrillic 16#0468\n", -"/Z 16#005A\n", -"/Zaarmenian 16#0536\n", -"/Zacute 16#0179\n", -"/Zcaron 16#017D\n", -"/Zcaronsmall 16#F6FF\n", -"/Zcircle 16#24CF\n", -"/Zcircumflex 16#1E90\n", -"/Zdot 16#017B\n", -"/Zdotaccent 16#017B\n", -"/Zdotbelow 16#1E92\n", -"/Zecyrillic 16#0417\n", -"/Zedescendercyrillic 16#0498\n", -"/Zedieresiscyrillic 16#04DE\n", -"/Zeta 16#0396\n", -"/Zhearmenian 16#053A\n", -"/Zhebrevecyrillic 16#04C1\n", -"/Zhecyrillic 16#0416\n", -"/Zhedescendercyrillic 16#0496\n", -"/Zhedieresiscyrillic 16#04DC\n", -"/Zlinebelow 16#1E94\n", -"/Zmonospace 16#FF3A\n", -"/Zsmall 16#F77A\n", -"/Zstroke 16#01B5\n", -"/a 16#0061\n", -"/aabengali 16#0986\n", -"/aacute 16#00E1\n", -"/aadeva 16#0906\n", -"/aagujarati 16#0A86\n", -"/aagurmukhi 16#0A06\n", -"/aamatragurmukhi 16#0A3E\n", -"/aarusquare 16#3303\n", -"/aavowelsignbengali 16#09BE\n", -"/aavowelsigndeva 16#093E\n", -"/aavowelsigngujarati 16#0ABE\n", -"/abbreviationmarkarmenian 16#055F\n", -"/abbreviationsigndeva 16#0970\n", -"/abengali 16#0985\n", -"/abopomofo 16#311A\n", -"/abreve 16#0103\n", -"/abreveacute 16#1EAF\n", -"/abrevecyrillic 16#04D1\n", -"/abrevedotbelow 16#1EB7\n", -"/abrevegrave 16#1EB1\n", -"/abrevehookabove 16#1EB3\n", -"/abrevetilde 16#1EB5\n", -"/acaron 16#01CE\n", -"/acircle 16#24D0\n", -"/acircumflex 16#00E2\n", -"/acircumflexacute 16#1EA5\n", -"/acircumflexdotbelow 16#1EAD\n", -"/acircumflexgrave 16#1EA7\n", -"/acircumflexhookabove 16#1EA9\n", -"/acircumflextilde 16#1EAB\n", -"/acute 16#00B4\n", -"/acutebelowcmb 16#0317\n", -"/acutecmb 16#0301\n", -"/acutecomb 16#0301\n", -"/acutedeva 16#0954\n", -"/acutelowmod 16#02CF\n", -"/acutetonecmb 16#0341\n", -"/acyrillic 16#0430\n", -"/adblgrave 16#0201\n", -"/addakgurmukhi 16#0A71\n", -"/adeva 16#0905\n", -"/adieresis 16#00E4\n", -"/adieresiscyrillic 16#04D3\n", -"/adieresismacron 16#01DF\n", -"/adotbelow 16#1EA1\n", -"/adotmacron 16#01E1\n", -"/ae 16#00E6\n", -"/aeacute 16#01FD\n", -"/aekorean 16#3150\n", -"/aemacron 16#01E3\n", -"/afii00208 16#2015\n", -"/afii08941 16#20A4\n", -"/afii10017 16#0410\n", -"/afii10018 16#0411\n", -"/afii10019 16#0412\n", -"/afii10020 16#0413\n", -"/afii10021 16#0414\n", -"/afii10022 16#0415\n", -"/afii10023 16#0401\n", -"/afii10024 16#0416\n", -"/afii10025 16#0417\n", -"/afii10026 16#0418\n", -"/afii10027 16#0419\n", -"/afii10028 16#041A\n", -"/afii10029 16#041B\n", -"/afii10030 16#041C\n", -"/afii10031 16#041D\n", -"/afii10032 16#041E\n", -"/afii10033 16#041F\n", -"/afii10034 16#0420\n", -"/afii10035 16#0421\n", -"/afii10036 16#0422\n", -"/afii10037 16#0423\n", -"/afii10038 16#0424\n", -"/afii10039 16#0425\n", -"/afii10040 16#0426\n", -"/afii10041 16#0427\n", -"/afii10042 16#0428\n", -"/afii10043 16#0429\n", -"/afii10044 16#042A\n", -"/afii10045 16#042B\n", -"/afii10046 16#042C\n", -"/afii10047 16#042D\n", -"/afii10048 16#042E\n", -"/afii10049 16#042F\n", -"/afii10050 16#0490\n", -"/afii10051 16#0402\n", -"/afii10052 16#0403\n", -"/afii10053 16#0404\n", -"/afii10054 16#0405\n", -"/afii10055 16#0406\n", -"/afii10056 16#0407\n", -"/afii10057 16#0408\n", -"/afii10058 16#0409\n", -"/afii10059 16#040A\n", -"/afii10060 16#040B\n", -"/afii10061 16#040C\n", -"/afii10062 16#040E\n", -"/afii10063 16#F6C4\n", -"/afii10064 16#F6C5\n", -"/afii10065 16#0430\n", -"/afii10066 16#0431\n", -"/afii10067 16#0432\n", -"/afii10068 16#0433\n", -"/afii10069 16#0434\n", -"/afii10070 16#0435\n", -"/afii10071 16#0451\n", -"/afii10072 16#0436\n", -"/afii10073 16#0437\n", -"/afii10074 16#0438\n", -"/afii10075 16#0439\n", -"/afii10076 16#043A\n", -"/afii10077 16#043B\n", -"/afii10078 16#043C\n", -"/afii10079 16#043D\n", -"/afii10080 16#043E\n", -"/afii10081 16#043F\n", -"/afii10082 16#0440\n", -"/afii10083 16#0441\n", -"/afii10084 16#0442\n", -"/afii10085 16#0443\n", -"/afii10086 16#0444\n", -"/afii10087 16#0445\n", -"/afii10088 16#0446\n", -"/afii10089 16#0447\n", -"/afii10090 16#0448\n", -"/afii10091 16#0449\n", -"/afii10092 16#044A\n", -"/afii10093 16#044B\n", -"/afii10094 16#044C\n", -"/afii10095 16#044D\n", -"/afii10096 16#044E\n", -"/afii10097 16#044F\n", -"/afii10098 16#0491\n", -"/afii10099 16#0452\n", -"/afii10100 16#0453\n", -"/afii10101 16#0454\n", -"/afii10102 16#0455\n", -"/afii10103 16#0456\n", -"/afii10104 16#0457\n", -"/afii10105 16#0458\n", -"/afii10106 16#0459\n", -"/afii10107 16#045A\n", -"/afii10108 16#045B\n", -"/afii10109 16#045C\n", -"/afii10110 16#045E\n", -"/afii10145 16#040F\n", -"/afii10146 16#0462\n", -"/afii10147 16#0472\n", -"/afii10148 16#0474\n", -"/afii10192 16#F6C6\n", -"/afii10193 16#045F\n", -"/afii10194 16#0463\n", -"/afii10195 16#0473\n", -"/afii10196 16#0475\n", -"/afii10831 16#F6C7\n", -"/afii10832 16#F6C8\n", -"/afii10846 16#04D9\n", -"/afii299 16#200E\n", -"/afii300 16#200F\n", -"/afii301 16#200D\n", -"/afii57381 16#066A\n", -"/afii57388 16#060C\n", -"/afii57392 16#0660\n", -"/afii57393 16#0661\n", -"/afii57394 16#0662\n", -"/afii57395 16#0663\n", -"/afii57396 16#0664\n", -"/afii57397 16#0665\n", -"/afii57398 16#0666\n", -"/afii57399 16#0667\n", -"/afii57400 16#0668\n", -"/afii57401 16#0669\n", -"/afii57403 16#061B\n", -"/afii57407 16#061F\n", -"/afii57409 16#0621\n", -"/afii57410 16#0622\n", -"/afii57411 16#0623\n", -"/afii57412 16#0624\n", -"/afii57413 16#0625\n", -"/afii57414 16#0626\n", -"/afii57415 16#0627\n", -"/afii57416 16#0628\n", -"/afii57417 16#0629\n", -"/afii57418 16#062A\n", -"/afii57419 16#062B\n", -"/afii57420 16#062C\n", -"/afii57421 16#062D\n", -"/afii57422 16#062E\n", -"/afii57423 16#062F\n", -"/afii57424 16#0630\n", -"/afii57425 16#0631\n", -"/afii57426 16#0632\n", -"/afii57427 16#0633\n", -"/afii57428 16#0634\n", -"/afii57429 16#0635\n", -"/afii57430 16#0636\n", -"/afii57431 16#0637\n", -"/afii57432 16#0638\n", -"/afii57433 16#0639\n", -"/afii57434 16#063A\n", -"/afii57440 16#0640\n", -"/afii57441 16#0641\n", -"/afii57442 16#0642\n", -"/afii57443 16#0643\n", -"/afii57444 16#0644\n", -"/afii57445 16#0645\n", -"/afii57446 16#0646\n", -"/afii57448 16#0648\n", -"/afii57449 16#0649\n", -"/afii57450 16#064A\n", -"/afii57451 16#064B\n", -"/afii57452 16#064C\n", -"/afii57453 16#064D\n", -"/afii57454 16#064E\n", -"/afii57455 16#064F\n", -"/afii57456 16#0650\n", -"/afii57457 16#0651\n", -"/afii57458 16#0652\n", -"/afii57470 16#0647\n", -"/afii57505 16#06A4\n", -"/afii57506 16#067E\n", -"/afii57507 16#0686\n", -"/afii57508 16#0698\n", -"/afii57509 16#06AF\n", -"/afii57511 16#0679\n", -"/afii57512 16#0688\n", -"/afii57513 16#0691\n", -"/afii57514 16#06BA\n", -"/afii57519 16#06D2\n", -"/afii57534 16#06D5\n", -"/afii57636 16#20AA\n", -"/afii57645 16#05BE\n", -"/afii57658 16#05C3\n", -"/afii57664 16#05D0\n", -"/afii57665 16#05D1\n", -"/afii57666 16#05D2\n", -"/afii57667 16#05D3\n", -"/afii57668 16#05D4\n", -"/afii57669 16#05D5\n", -"/afii57670 16#05D6\n", -"/afii57671 16#05D7\n", -"/afii57672 16#05D8\n", -"/afii57673 16#05D9\n", -"/afii57674 16#05DA\n", -"/afii57675 16#05DB\n", -"/afii57676 16#05DC\n", -"/afii57677 16#05DD\n", -"/afii57678 16#05DE\n", -"/afii57679 16#05DF\n", -"/afii57680 16#05E0\n", -"/afii57681 16#05E1\n", -"/afii57682 16#05E2\n", -"/afii57683 16#05E3\n", -"/afii57684 16#05E4\n", -"/afii57685 16#05E5\n", -"/afii57686 16#05E6\n", -"/afii57687 16#05E7\n", -"/afii57688 16#05E8\n", -"/afii57689 16#05E9\n", -"/afii57690 16#05EA\n", -"/afii57694 16#FB2A\n", -"/afii57695 16#FB2B\n", -"/afii57700 16#FB4B\n", -"/afii57705 16#FB1F\n", -"/afii57716 16#05F0\n", -"/afii57717 16#05F1\n", -"/afii57718 16#05F2\n", -"/afii57723 16#FB35\n", -"/afii57793 16#05B4\n", -"/afii57794 16#05B5\n", -"/afii57795 16#05B6\n", -"/afii57796 16#05BB\n", -"/afii57797 16#05B8\n", -"/afii57798 16#05B7\n", -"/afii57799 16#05B0\n", -"/afii57800 16#05B2\n", -"/afii57801 16#05B1\n", -"/afii57802 16#05B3\n", -"/afii57803 16#05C2\n", -"/afii57804 16#05C1\n", -"/afii57806 16#05B9\n", -"/afii57807 16#05BC\n", -"/afii57839 16#05BD\n", -"/afii57841 16#05BF\n", -"/afii57842 16#05C0\n", -"/afii57929 16#02BC\n", -"/afii61248 16#2105\n", -"/afii61289 16#2113\n", -"/afii61352 16#2116\n", -"/afii61573 16#202C\n", -"/afii61574 16#202D\n", -"/afii61575 16#202E\n", -"/afii61664 16#200C\n", -"/afii63167 16#066D\n", -"/afii64937 16#02BD\n", -"/agrave 16#00E0\n", -"/agujarati 16#0A85\n", -"/agurmukhi 16#0A05\n", -"/ahiragana 16#3042\n", -"/ahookabove 16#1EA3\n", -"/aibengali 16#0990\n", -"/aibopomofo 16#311E\n", -"/aideva 16#0910\n", -"/aiecyrillic 16#04D5\n", -"/aigujarati 16#0A90\n", -"/aigurmukhi 16#0A10\n", -"/aimatragurmukhi 16#0A48\n", -"/ainarabic 16#0639\n", -"/ainfinalarabic 16#FECA\n", -"/aininitialarabic 16#FECB\n", -"/ainmedialarabic 16#FECC\n", -"/ainvertedbreve 16#0203\n", -"/aivowelsignbengali 16#09C8\n", -"/aivowelsigndeva 16#0948\n", -"/aivowelsigngujarati 16#0AC8\n", -"/akatakana 16#30A2\n", -"/akatakanahalfwidth 16#FF71\n", -"/akorean 16#314F\n", -"/alef 16#05D0\n", -"/alefarabic 16#0627\n", -"/alefdageshhebrew 16#FB30\n", -"/aleffinalarabic 16#FE8E\n", -"/alefhamzaabovearabic 16#0623\n", -"/alefhamzaabovefinalarabic 16#FE84\n", -"/alefhamzabelowarabic 16#0625\n", -"/alefhamzabelowfinalarabic 16#FE88\n", -"/alefhebrew 16#05D0\n", -"/aleflamedhebrew 16#FB4F\n", -"/alefmaddaabovearabic 16#0622\n", -"/alefmaddaabovefinalarabic 16#FE82\n", -"/alefmaksuraarabic 16#0649\n", -"/alefmaksurafinalarabic 16#FEF0\n", -"/alefmaksurainitialarabic 16#FEF3\n", -"/alefmaksuramedialarabic 16#FEF4\n", -"/alefpatahhebrew 16#FB2E\n", -"/alefqamatshebrew 16#FB2F\n", -"/aleph 16#2135\n", -"/allequal 16#224C\n", -"/alpha 16#03B1\n", -"/alphatonos 16#03AC\n", -"/amacron 16#0101\n", -"/amonospace 16#FF41\n", -"/ampersand 16#0026\n", -"/ampersandmonospace 16#FF06\n", -"/ampersandsmall 16#F726\n", -"/amsquare 16#33C2\n", -"/anbopomofo 16#3122\n", -"/angbopomofo 16#3124\n", -"/angkhankhuthai 16#0E5A\n", -"/angle 16#2220\n", -"/anglebracketleft 16#3008\n", -"/anglebracketleftvertical 16#FE3F\n", -"/anglebracketright 16#3009\n", -"/anglebracketrightvertical 16#FE40\n", -"/angleleft 16#2329\n", -"/angleright 16#232A\n", -"/angstrom 16#212B\n", -"/anoteleia 16#0387\n", -"/anudattadeva 16#0952\n", -"/anusvarabengali 16#0982\n", -"/anusvaradeva 16#0902\n", -"/anusvaragujarati 16#0A82\n", -"/aogonek 16#0105\n", -"/apaatosquare 16#3300\n", -"/aparen 16#249C\n", -"/apostrophearmenian 16#055A\n", -"/apostrophemod 16#02BC\n", -"/apple 16#F8FF\n", -"/approaches 16#2250\n", -"/approxequal 16#2248\n", -"/approxequalorimage 16#2252\n", -"/approximatelyequal 16#2245\n", -"/araeaekorean 16#318E\n", -"/araeakorean 16#318D\n", -"/arc 16#2312\n", -"/arighthalfring 16#1E9A\n", -"/aring 16#00E5\n", -"/aringacute 16#01FB\n", -"/aringbelow 16#1E01\n", -"/arrowboth 16#2194\n", -"/arrowdashdown 16#21E3\n", -"/arrowdashleft 16#21E0\n", -"/arrowdashright 16#21E2\n", -"/arrowdashup 16#21E1\n", -"/arrowdblboth 16#21D4\n", -"/arrowdbldown 16#21D3\n", -"/arrowdblleft 16#21D0\n", -"/arrowdblright 16#21D2\n", -"/arrowdblup 16#21D1\n", -"/arrowdown 16#2193\n", -"/arrowdownleft 16#2199\n", -"/arrowdownright 16#2198\n", -"/arrowdownwhite 16#21E9\n", -"/arrowheaddownmod 16#02C5\n", -"/arrowheadleftmod 16#02C2\n", -"/arrowheadrightmod 16#02C3\n", -"/arrowheadupmod 16#02C4\n", -"/arrowhorizex 16#F8E7\n", -"/arrowleft 16#2190\n", -"/arrowleftdbl 16#21D0\n", -"/arrowleftdblstroke 16#21CD\n", -"/arrowleftoverright 16#21C6\n", -"/arrowleftwhite 16#21E6\n", -"/arrowright 16#2192\n", -"/arrowrightdblstroke 16#21CF\n", -"/arrowrightheavy 16#279E\n", -"/arrowrightoverleft 16#21C4\n", -"/arrowrightwhite 16#21E8\n", -"/arrowtableft 16#21E4\n", -"/arrowtabright 16#21E5\n", -"/arrowup 16#2191\n", -"/arrowupdn 16#2195\n", -"/arrowupdnbse 16#21A8\n", -"/arrowupdownbase 16#21A8\n", -"/arrowupleft 16#2196\n", -"/arrowupleftofdown 16#21C5\n", -"/arrowupright 16#2197\n", -"/arrowupwhite 16#21E7\n", -"/arrowvertex 16#F8E6\n", -"/asciicircum 16#005E\n", -"/asciicircummonospace 16#FF3E\n", -"/asciitilde 16#007E\n", -"/asciitildemonospace 16#FF5E\n", -"/ascript 16#0251\n", -"/ascriptturned 16#0252\n", -"/asmallhiragana 16#3041\n", -"/asmallkatakana 16#30A1\n", -"/asmallkatakanahalfwidth 16#FF67\n", -"/asterisk 16#002A\n", -"/asteriskaltonearabic 16#066D\n", -"/asteriskarabic 16#066D\n", -"/asteriskmath 16#2217\n", -"/asteriskmonospace 16#FF0A\n", -"/asterisksmall 16#FE61\n", -"/asterism 16#2042\n", -"/asuperior 16#F6E9\n", -"/asymptoticallyequal 16#2243\n", -"/at 16#0040\n", -"/atilde 16#00E3\n", -"/atmonospace 16#FF20\n", -"/atsmall 16#FE6B\n", -"/aturned 16#0250\n", -"/aubengali 16#0994\n", -"/aubopomofo 16#3120\n", -"/audeva 16#0914\n", -"/augujarati 16#0A94\n", -"/augurmukhi 16#0A14\n", -"/aulengthmarkbengali 16#09D7\n", -"/aumatragurmukhi 16#0A4C\n", -"/auvowelsignbengali 16#09CC\n", -"/auvowelsigndeva 16#094C\n", -"/auvowelsigngujarati 16#0ACC\n", -"/avagrahadeva 16#093D\n", -"/aybarmenian 16#0561\n", -"/ayin 16#05E2\n", -"/ayinaltonehebrew 16#FB20\n", -"/ayinhebrew 16#05E2\n", -"/b 16#0062\n", -"/babengali 16#09AC\n", -"/backslash 16#005C\n", -"/backslashmonospace 16#FF3C\n", -"/badeva 16#092C\n", -"/bagujarati 16#0AAC\n", -"/bagurmukhi 16#0A2C\n", -"/bahiragana 16#3070\n", -"/bahtthai 16#0E3F\n", -"/bakatakana 16#30D0\n", -"/bar 16#007C\n", -"/barmonospace 16#FF5C\n", -"/bbopomofo 16#3105\n", -"/bcircle 16#24D1\n", -"/bdotaccent 16#1E03\n", -"/bdotbelow 16#1E05\n", -"/beamedsixteenthnotes 16#266C\n", -"/because 16#2235\n", -"/becyrillic 16#0431\n", -"/beharabic 16#0628\n", -"/behfinalarabic 16#FE90\n", -"/behinitialarabic 16#FE91\n", -"/behiragana 16#3079\n", -"/behmedialarabic 16#FE92\n", -"/behmeeminitialarabic 16#FC9F\n", -"/behmeemisolatedarabic 16#FC08\n", -"/behnoonfinalarabic 16#FC6D\n", -"/bekatakana 16#30D9\n", -"/benarmenian 16#0562\n", -"/bet 16#05D1\n", -"/beta 16#03B2\n", -"/betasymbolgreek 16#03D0\n", -"/betdagesh 16#FB31\n", -"/betdageshhebrew 16#FB31\n", -"/bethebrew 16#05D1\n", -"/betrafehebrew 16#FB4C\n", -"/bhabengali 16#09AD\n", -"/bhadeva 16#092D\n", -"/bhagujarati 16#0AAD\n", -"/bhagurmukhi 16#0A2D\n", -"/bhook 16#0253\n", -"/bihiragana 16#3073\n", -"/bikatakana 16#30D3\n", -"/bilabialclick 16#0298\n", -"/bindigurmukhi 16#0A02\n", -"/birusquare 16#3331\n", -"/blackcircle 16#25CF\n", -"/blackdiamond 16#25C6\n", -"/blackdownpointingtriangle 16#25BC\n", -"/blackleftpointingpointer 16#25C4\n", -"/blackleftpointingtriangle 16#25C0\n", -"/blacklenticularbracketleft 16#3010\n", -"/blacklenticularbracketleftvertical 16#FE3B\n", -"/blacklenticularbracketright 16#3011\n", -"/blacklenticularbracketrightvertical 16#FE3C\n", -"/blacklowerlefttriangle 16#25E3\n", -"/blacklowerrighttriangle 16#25E2\n", -"/blackrectangle 16#25AC\n", -"/blackrightpointingpointer 16#25BA\n", -"/blackrightpointingtriangle 16#25B6\n", -"/blacksmallsquare 16#25AA\n", -"/blacksmilingface 16#263B\n", -"/blacksquare 16#25A0\n", -"/blackstar 16#2605\n", -"/blackupperlefttriangle 16#25E4\n", -"/blackupperrighttriangle 16#25E5\n", -"/blackuppointingsmalltriangle 16#25B4\n", -"/blackuppointingtriangle 16#25B2\n", -"/blank 16#2423\n", -"/blinebelow 16#1E07\n", -"/block 16#2588\n", -"/bmonospace 16#FF42\n", -"/bobaimaithai 16#0E1A\n", -"/bohiragana 16#307C\n", -"/bokatakana 16#30DC\n", -"/bparen 16#249D\n", -"/bqsquare 16#33C3\n", -"/braceex 16#F8F4\n", -"/braceleft 16#007B\n", -"/braceleftbt 16#F8F3\n", -"/braceleftmid 16#F8F2\n", -"/braceleftmonospace 16#FF5B\n", -"/braceleftsmall 16#FE5B\n", -"/bracelefttp 16#F8F1\n", -"/braceleftvertical 16#FE37\n", -"/braceright 16#007D\n", -"/bracerightbt 16#F8FE\n", -"/bracerightmid 16#F8FD\n", -"/bracerightmonospace 16#FF5D\n", -"/bracerightsmall 16#FE5C\n", -"/bracerighttp 16#F8FC\n", -"/bracerightvertical 16#FE38\n", -"/bracketleft 16#005B\n", -"/bracketleftbt 16#F8F0\n", -"/bracketleftex 16#F8EF\n", -"/bracketleftmonospace 16#FF3B\n", -"/bracketlefttp 16#F8EE\n", -"/bracketright 16#005D\n", -"/bracketrightbt 16#F8FB\n", -"/bracketrightex 16#F8FA\n", -"/bracketrightmonospace 16#FF3D\n", -"/bracketrighttp 16#F8F9\n", -"/breve 16#02D8\n", -"/brevebelowcmb 16#032E\n", -"/brevecmb 16#0306\n", -"/breveinvertedbelowcmb 16#032F\n", -"/breveinvertedcmb 16#0311\n", -"/breveinverteddoublecmb 16#0361\n", -"/bridgebelowcmb 16#032A\n", -"/bridgeinvertedbelowcmb 16#033A\n", -"/brokenbar 16#00A6\n", -"/bstroke 16#0180\n", -"/bsuperior 16#F6EA\n", -"/btopbar 16#0183\n", -"/buhiragana 16#3076\n", -"/bukatakana 16#30D6\n", -"/bullet 16#2022\n", -"/bulletinverse 16#25D8\n", -"/bulletoperator 16#2219\n", -"/bullseye 16#25CE\n", -"/c 16#0063\n", -"/caarmenian 16#056E\n", -"/cabengali 16#099A\n", -"/cacute 16#0107\n", -"/cadeva 16#091A\n", -"/cagujarati 16#0A9A\n", -"/cagurmukhi 16#0A1A\n", -"/calsquare 16#3388\n", -"/candrabindubengali 16#0981\n", -"/candrabinducmb 16#0310\n", -"/candrabindudeva 16#0901\n", -"/candrabindugujarati 16#0A81\n", -"/capslock 16#21EA\n", -"/careof 16#2105\n", -"/caron 16#02C7\n", -"/caronbelowcmb 16#032C\n", -"/caroncmb 16#030C\n", -"/carriagereturn 16#21B5\n", -"/cbopomofo 16#3118\n", -"/ccaron 16#010D\n", -"/ccedilla 16#00E7\n", -"/ccedillaacute 16#1E09\n", -"/ccircle 16#24D2\n", -"/ccircumflex 16#0109\n", -"/ccurl 16#0255\n", -"/cdot 16#010B\n", -"/cdotaccent 16#010B\n", -"/cdsquare 16#33C5\n", -"/cedilla 16#00B8\n", -"/cedillacmb 16#0327\n", -"/cent 16#00A2\n", -"/centigrade 16#2103\n", -"/centinferior 16#F6DF\n", -"/centmonospace 16#FFE0\n", -"/centoldstyle 16#F7A2\n", -"/centsuperior 16#F6E0\n", -"/chaarmenian 16#0579\n", -"/chabengali 16#099B\n", -"/chadeva 16#091B\n", -"/chagujarati 16#0A9B\n", -"/chagurmukhi 16#0A1B\n", -"/chbopomofo 16#3114\n", -"/cheabkhasiancyrillic 16#04BD\n", -"/checkmark 16#2713\n", -"/checyrillic 16#0447\n", -"/chedescenderabkhasiancyrillic 16#04BF\n", -"/chedescendercyrillic 16#04B7\n", -"/chedieresiscyrillic 16#04F5\n", -"/cheharmenian 16#0573\n", -"/chekhakassiancyrillic 16#04CC\n", -"/cheverticalstrokecyrillic 16#04B9\n", -"/chi 16#03C7\n", -"/chieuchacirclekorean 16#3277\n", -"/chieuchaparenkorean 16#3217\n", -"/chieuchcirclekorean 16#3269\n", -"/chieuchkorean 16#314A\n", -"/chieuchparenkorean 16#3209\n", -"/chochangthai 16#0E0A\n", -"/chochanthai 16#0E08\n", -"/chochingthai 16#0E09\n", -"/chochoethai 16#0E0C\n", -"/chook 16#0188\n", -"/cieucacirclekorean 16#3276\n", -"/cieucaparenkorean 16#3216\n", -"/cieuccirclekorean 16#3268\n", -"/cieuckorean 16#3148\n", -"/cieucparenkorean 16#3208\n", -"/cieucuparenkorean 16#321C\n", -"/circle 16#25CB\n", -"/circlemultiply 16#2297\n", -"/circleot 16#2299\n", -"/circleplus 16#2295\n", -"/circlepostalmark 16#3036\n", -"/circlewithlefthalfblack 16#25D0\n", -"/circlewithrighthalfblack 16#25D1\n", -"/circumflex 16#02C6\n", -"/circumflexbelowcmb 16#032D\n", -"/circumflexcmb 16#0302\n", -"/clear 16#2327\n", -"/clickalveolar 16#01C2\n", -"/clickdental 16#01C0\n", -"/clicklateral 16#01C1\n", -"/clickretroflex 16#01C3\n", -"/club 16#2663\n", -"/clubsuitblack 16#2663\n", -"/clubsuitwhite 16#2667\n", -"/cmcubedsquare 16#33A4\n", -"/cmonospace 16#FF43\n", -"/cmsquaredsquare 16#33A0\n", -"/coarmenian 16#0581\n", -"/colon 16#003A\n", -"/colonmonetary 16#20A1\n", -"/colonmonospace 16#FF1A\n", -"/colonsign 16#20A1\n", -"/colonsmall 16#FE55\n", -"/colontriangularhalfmod 16#02D1\n", -"/colontriangularmod 16#02D0\n", -"/comma 16#002C\n", -"/commaabovecmb 16#0313\n", -"/commaaboverightcmb 16#0315\n", -"/commaaccent 16#F6C3\n", -"/commaarabic 16#060C\n", -"/commaarmenian 16#055D\n", -"/commainferior 16#F6E1\n", -"/commamonospace 16#FF0C\n", -"/commareversedabovecmb 16#0314\n", -"/commareversedmod 16#02BD\n", -"/commasmall 16#FE50\n", -"/commasuperior 16#F6E2\n", -"/commaturnedabovecmb 16#0312\n", -"/commaturnedmod 16#02BB\n", -"/compass 16#263C\n", -"/congruent 16#2245\n", -"/contourintegral 16#222E\n", -"/control 16#2303\n", -"/controlACK 16#0006\n", -"/controlBEL 16#0007\n", -"/controlBS 16#0008\n", -"/controlCAN 16#0018\n", -"/controlCR 16#000D\n", -"/controlDC1 16#0011\n", -"/controlDC2 16#0012\n", -"/controlDC3 16#0013\n", -"/controlDC4 16#0014\n", -"/controlDEL 16#007F\n", -"/controlDLE 16#0010\n", -"/controlEM 16#0019\n", -"/controlENQ 16#0005\n", -"/controlEOT 16#0004\n", -"/controlESC 16#001B\n", -"/controlETB 16#0017\n", -"/controlETX 16#0003\n", -"/controlFF 16#000C\n", -"/controlFS 16#001C\n", -"/controlGS 16#001D\n", -"/controlHT 16#0009\n", -"/controlLF 16#000A\n", -"/controlNAK 16#0015\n", -"/controlRS 16#001E\n", -"/controlSI 16#000F\n", -"/controlSO 16#000E\n", -"/controlSOT 16#0002\n", -"/controlSTX 16#0001\n", -"/controlSUB 16#001A\n", -"/controlSYN 16#0016\n", -"/controlUS 16#001F\n", -"/controlVT 16#000B\n", -"/copyright 16#00A9\n", -"/copyrightsans 16#F8E9\n", -"/copyrightserif 16#F6D9\n", -"/cornerbracketleft 16#300C\n", -"/cornerbracketlefthalfwidth 16#FF62\n", -"/cornerbracketleftvertical 16#FE41\n", -"/cornerbracketright 16#300D\n", -"/cornerbracketrighthalfwidth 16#FF63\n", -"/cornerbracketrightvertical 16#FE42\n", -"/corporationsquare 16#337F\n", -"/cosquare 16#33C7\n", -"/coverkgsquare 16#33C6\n", -"/cparen 16#249E\n", -"/cruzeiro 16#20A2\n", -"/cstretched 16#0297\n", -"/curlyand 16#22CF\n", -"/curlyor 16#22CE\n", -"/currency 16#00A4\n", -"/cyrBreve 16#F6D1\n", -"/cyrFlex 16#F6D2\n", -"/cyrbreve 16#F6D4\n", -"/cyrflex 16#F6D5\n", -"/d 16#0064\n", -"/daarmenian 16#0564\n", -"/dabengali 16#09A6\n", -"/dadarabic 16#0636\n", -"/dadeva 16#0926\n", -"/dadfinalarabic 16#FEBE\n", -"/dadinitialarabic 16#FEBF\n", -"/dadmedialarabic 16#FEC0\n", -"/dagesh 16#05BC\n", -"/dageshhebrew 16#05BC\n", -"/dagger 16#2020\n", -"/daggerdbl 16#2021\n", -"/dagujarati 16#0AA6\n", -"/dagurmukhi 16#0A26\n", -"/dahiragana 16#3060\n", -"/dakatakana 16#30C0\n", -"/dalarabic 16#062F\n", -"/dalet 16#05D3\n", -"/daletdagesh 16#FB33\n", -"/daletdageshhebrew 16#FB33\n", -"/dalethebrew 16#05D3\n", -"/dalfinalarabic 16#FEAA\n", -"/dammaarabic 16#064F\n", -"/dammalowarabic 16#064F\n", -"/dammatanaltonearabic 16#064C\n", -"/dammatanarabic 16#064C\n", -"/danda 16#0964\n", -"/dargahebrew 16#05A7\n", -"/dargalefthebrew 16#05A7\n", -"/dasiapneumatacyrilliccmb 16#0485\n", -"/dblGrave 16#F6D3\n", -"/dblanglebracketleft 16#300A\n", -"/dblanglebracketleftvertical 16#FE3D\n", -"/dblanglebracketright 16#300B\n", -"/dblanglebracketrightvertical 16#FE3E\n", -"/dblarchinvertedbelowcmb 16#032B\n", -"/dblarrowleft 16#21D4\n", -"/dblarrowright 16#21D2\n", -"/dbldanda 16#0965\n", -"/dblgrave 16#F6D6\n", -"/dblgravecmb 16#030F\n", -"/dblintegral 16#222C\n", -"/dbllowline 16#2017\n", -"/dbllowlinecmb 16#0333\n", -"/dbloverlinecmb 16#033F\n", -"/dblprimemod 16#02BA\n", -"/dblverticalbar 16#2016\n", -"/dblverticallineabovecmb 16#030E\n", -"/dbopomofo 16#3109\n", -"/dbsquare 16#33C8\n", -"/dcaron 16#010F\n", -"/dcedilla 16#1E11\n", -"/dcircle 16#24D3\n", -"/dcircumflexbelow 16#1E13\n", -"/dcroat 16#0111\n", -"/ddabengali 16#09A1\n", -"/ddadeva 16#0921\n", -"/ddagujarati 16#0AA1\n", -"/ddagurmukhi 16#0A21\n", -"/ddalarabic 16#0688\n", -"/ddalfinalarabic 16#FB89\n", -"/dddhadeva 16#095C\n", -"/ddhabengali 16#09A2\n", -"/ddhadeva 16#0922\n", -"/ddhagujarati 16#0AA2\n", -"/ddhagurmukhi 16#0A22\n", -"/ddotaccent 16#1E0B\n", -"/ddotbelow 16#1E0D\n", -"/decimalseparatorarabic 16#066B\n", -"/decimalseparatorpersian 16#066B\n", -"/decyrillic 16#0434\n", -"/degree 16#00B0\n", -"/dehihebrew 16#05AD\n", -"/dehiragana 16#3067\n", -"/deicoptic 16#03EF\n", -"/dekatakana 16#30C7\n", -"/deleteleft 16#232B\n", -"/deleteright 16#2326\n", -"/delta 16#03B4\n", -"/deltaturned 16#018D\n", -"/denominatorminusonenumeratorbengali 16#09F8\n", -"/dezh 16#02A4\n", -"/dhabengali 16#09A7\n", -"/dhadeva 16#0927\n", -"/dhagujarati 16#0AA7\n", -"/dhagurmukhi 16#0A27\n", -"/dhook 16#0257\n", -"/dialytikatonos 16#0385\n", -"/dialytikatonoscmb 16#0344\n", -"/diamond 16#2666\n", -"/diamondsuitwhite 16#2662\n", -"/dieresis 16#00A8\n", -"/dieresisacute 16#F6D7\n", -"/dieresisbelowcmb 16#0324\n", -"/dieresiscmb 16#0308\n", -"/dieresisgrave 16#F6D8\n", -"/dieresistonos 16#0385\n", -"/dihiragana 16#3062\n", -"/dikatakana 16#30C2\n", -"/dittomark 16#3003\n", -"/divide 16#00F7\n", -"/divides 16#2223\n", -"/divisionslash 16#2215\n", -"/djecyrillic 16#0452\n", -"/dkshade 16#2593\n", -"/dlinebelow 16#1E0F\n", -"/dlsquare 16#3397\n", -"/dmacron 16#0111\n", -"/dmonospace 16#FF44\n", -"/dnblock 16#2584\n", -"/dochadathai 16#0E0E\n", -"/dodekthai 16#0E14\n", -"/dohiragana 16#3069\n", -"/dokatakana 16#30C9\n", -"/dollar 16#0024\n", -"/dollarinferior 16#F6E3\n", -"/dollarmonospace 16#FF04\n", -"/dollaroldstyle 16#F724\n", -"/dollarsmall 16#FE69\n", -"/dollarsuperior 16#F6E4\n", -"/dong 16#20AB\n", -"/dorusquare 16#3326\n", -"/dotaccent 16#02D9\n", -"/dotaccentcmb 16#0307\n", -"/dotbelowcmb 16#0323\n", -"/dotbelowcomb 16#0323\n", -"/dotkatakana 16#30FB\n", -"/dotlessi 16#0131\n", -"/dotlessj 16#F6BE\n", -"/dotlessjstrokehook 16#0284\n", -"/dotmath 16#22C5\n", -"/dottedcircle 16#25CC\n", -"/doubleyodpatah 16#FB1F\n", -"/doubleyodpatahhebrew 16#FB1F\n", -"/downtackbelowcmb 16#031E\n", -"/downtackmod 16#02D5\n", -"/dparen 16#249F\n", -"/dsuperior 16#F6EB\n", -"/dtail 16#0256\n", -"/dtopbar 16#018C\n", -"/duhiragana 16#3065\n", -"/dukatakana 16#30C5\n", -"/dz 16#01F3\n", -"/dzaltone 16#02A3\n", -"/dzcaron 16#01C6\n", -"/dzcurl 16#02A5\n", -"/dzeabkhasiancyrillic 16#04E1\n", -"/dzecyrillic 16#0455\n", -"/dzhecyrillic 16#045F\n", -"/e 16#0065\n", -"/eacute 16#00E9\n", -"/earth 16#2641\n", -"/ebengali 16#098F\n", -"/ebopomofo 16#311C\n", -"/ebreve 16#0115\n", -"/ecandradeva 16#090D\n", -"/ecandragujarati 16#0A8D\n", -"/ecandravowelsigndeva 16#0945\n", -"/ecandravowelsigngujarati 16#0AC5\n", -"/ecaron 16#011B\n", -"/ecedillabreve 16#1E1D\n", -"/echarmenian 16#0565\n", -"/echyiwnarmenian 16#0587\n", -"/ecircle 16#24D4\n", -"/ecircumflex 16#00EA\n", -"/ecircumflexacute 16#1EBF\n", -"/ecircumflexbelow 16#1E19\n", -"/ecircumflexdotbelow 16#1EC7\n", -"/ecircumflexgrave 16#1EC1\n", -"/ecircumflexhookabove 16#1EC3\n", -"/ecircumflextilde 16#1EC5\n", -"/ecyrillic 16#0454\n", -"/edblgrave 16#0205\n", -"/edeva 16#090F\n", -"/edieresis 16#00EB\n", -"/edot 16#0117\n", -"/edotaccent 16#0117\n", -"/edotbelow 16#1EB9\n", -"/eegurmukhi 16#0A0F\n", -"/eematragurmukhi 16#0A47\n", -"/efcyrillic 16#0444\n", -"/egrave 16#00E8\n", -"/egujarati 16#0A8F\n", -"/eharmenian 16#0567\n", -"/ehbopomofo 16#311D\n", -"/ehiragana 16#3048\n", -"/ehookabove 16#1EBB\n", -"/eibopomofo 16#311F\n", -"/eight 16#0038\n", -"/eightarabic 16#0668\n", -"/eightbengali 16#09EE\n", -"/eightcircle 16#2467\n", -"/eightcircleinversesansserif 16#2791\n", -"/eightdeva 16#096E\n", -"/eighteencircle 16#2471\n", -"/eighteenparen 16#2485\n", -"/eighteenperiod 16#2499\n", -"/eightgujarati 16#0AEE\n", -"/eightgurmukhi 16#0A6E\n", -"/eighthackarabic 16#0668\n", -"/eighthangzhou 16#3028\n", -"/eighthnotebeamed 16#266B\n", -"/eightideographicparen 16#3227\n", -"/eightinferior 16#2088\n", -"/eightmonospace 16#FF18\n", -"/eightoldstyle 16#F738\n", -"/eightparen 16#247B\n", -"/eightperiod 16#248F\n", -"/eightpersian 16#06F8\n", -"/eightroman 16#2177\n", -"/eightsuperior 16#2078\n", -"/eightthai 16#0E58\n", -"/einvertedbreve 16#0207\n", -"/eiotifiedcyrillic 16#0465\n", -"/ekatakana 16#30A8\n", -"/ekatakanahalfwidth 16#FF74\n", -"/ekonkargurmukhi 16#0A74\n", -"/ekorean 16#3154\n", -"/elcyrillic 16#043B\n", -"/element 16#2208\n", -"/elevencircle 16#246A\n", -"/elevenparen 16#247E\n", -"/elevenperiod 16#2492\n", -"/elevenroman 16#217A\n", -"/ellipsis 16#2026\n", -"/ellipsisvertical 16#22EE\n", -"/emacron 16#0113\n", -"/emacronacute 16#1E17\n", -"/emacrongrave 16#1E15\n", -"/emcyrillic 16#043C\n", -"/emdash 16#2014\n", -"/emdashvertical 16#FE31\n", -"/emonospace 16#FF45\n", -"/emphasismarkarmenian 16#055B\n", -"/emptyset 16#2205\n", -"/enbopomofo 16#3123\n", -"/encyrillic 16#043D\n", -"/endash 16#2013\n", -"/endashvertical 16#FE32\n", -"/endescendercyrillic 16#04A3\n", -"/eng 16#014B\n", -"/engbopomofo 16#3125\n", -"/enghecyrillic 16#04A5\n", -"/enhookcyrillic 16#04C8\n", -"/enspace 16#2002\n", -"/eogonek 16#0119\n", -"/eokorean 16#3153\n", -"/eopen 16#025B\n", -"/eopenclosed 16#029A\n", -"/eopenreversed 16#025C\n", -"/eopenreversedclosed 16#025E\n", -"/eopenreversedhook 16#025D\n", -"/eparen 16#24A0\n", -"/epsilon 16#03B5\n", -"/epsilontonos 16#03AD\n", -"/equal 16#003D\n", -"/equalmonospace 16#FF1D\n", -"/equalsmall 16#FE66\n", -"/equalsuperior 16#207C\n", -"/equivalence 16#2261\n", -"/erbopomofo 16#3126\n", -"/ercyrillic 16#0440\n", -"/ereversed 16#0258\n", -"/ereversedcyrillic 16#044D\n", -"/escyrillic 16#0441\n", -"/esdescendercyrillic 16#04AB\n", -"/esh 16#0283\n", -"/eshcurl 16#0286\n", -"/eshortdeva 16#090E\n", -"/eshortvowelsigndeva 16#0946\n", -"/eshreversedloop 16#01AA\n", -"/eshsquatreversed 16#0285\n", -"/esmallhiragana 16#3047\n", -"/esmallkatakana 16#30A7\n", -"/esmallkatakanahalfwidth 16#FF6A\n", -"/estimated 16#212E\n", -"/esuperior 16#F6EC\n", -"/eta 16#03B7\n", -"/etarmenian 16#0568\n", -"/etatonos 16#03AE\n", -"/eth 16#00F0\n", -"/etilde 16#1EBD\n", -"/etildebelow 16#1E1B\n", -"/etnahtafoukhhebrew 16#0591\n", -"/etnahtafoukhlefthebrew 16#0591\n", -"/etnahtahebrew 16#0591\n", -"/etnahtalefthebrew 16#0591\n", -"/eturned 16#01DD\n", -"/eukorean 16#3161\n", -"/euro 16#20AC\n", -"/evowelsignbengali 16#09C7\n", -"/evowelsigndeva 16#0947\n", -"/evowelsigngujarati 16#0AC7\n", -"/exclam 16#0021\n", -"/exclamarmenian 16#055C\n", -"/exclamdbl 16#203C\n", -"/exclamdown 16#00A1\n", -"/exclamdownsmall 16#F7A1\n", -"/exclammonospace 16#FF01\n", -"/exclamsmall 16#F721\n", -"/existential 16#2203\n", -"/ezh 16#0292\n", -"/ezhcaron 16#01EF\n", -"/ezhcurl 16#0293\n", -"/ezhreversed 16#01B9\n", -"/ezhtail 16#01BA\n", -"/f 16#0066\n", -"/fadeva 16#095E\n", -"/fagurmukhi 16#0A5E\n", -"/fahrenheit 16#2109\n", -"/fathaarabic 16#064E\n", -"/fathalowarabic 16#064E\n", -"/fathatanarabic 16#064B\n", -"/fbopomofo 16#3108\n", -"/fcircle 16#24D5\n", -"/fdotaccent 16#1E1F\n", -"/feharabic 16#0641\n", -"/feharmenian 16#0586\n", -"/fehfinalarabic 16#FED2\n", -"/fehinitialarabic 16#FED3\n", -"/fehmedialarabic 16#FED4\n", -"/feicoptic 16#03E5\n", -"/female 16#2640\n", -"/ff 16#FB00\n", -"/ffi 16#FB03\n", -"/ffl 16#FB04\n", -"/fi 16#FB01\n", -"/fifteencircle 16#246E\n", -"/fifteenparen 16#2482\n", -"/fifteenperiod 16#2496\n", -"/figuredash 16#2012\n", -"/filledbox 16#25A0\n", -"/filledrect 16#25AC\n", -"/finalkaf 16#05DA\n", -"/finalkafdagesh 16#FB3A\n", -"/finalkafdageshhebrew 16#FB3A\n", -"/finalkafhebrew 16#05DA\n", -"/finalmem 16#05DD\n", -"/finalmemhebrew 16#05DD\n", -"/finalnun 16#05DF\n", -"/finalnunhebrew 16#05DF\n", -"/finalpe 16#05E3\n", -"/finalpehebrew 16#05E3\n", -"/finaltsadi 16#05E5\n", -"/finaltsadihebrew 16#05E5\n", -"/firsttonechinese 16#02C9\n", -"/fisheye 16#25C9\n", -"/fitacyrillic 16#0473\n", -"/five 16#0035\n", -"/fivearabic 16#0665\n", -"/fivebengali 16#09EB\n", -"/fivecircle 16#2464\n", -"/fivecircleinversesansserif 16#278E\n", -"/fivedeva 16#096B\n", -"/fiveeighths 16#215D\n", -"/fivegujarati 16#0AEB\n", -"/fivegurmukhi 16#0A6B\n", -"/fivehackarabic 16#0665\n", -"/fivehangzhou 16#3025\n", -"/fiveideographicparen 16#3224\n", -"/fiveinferior 16#2085\n", -"/fivemonospace 16#FF15\n", -"/fiveoldstyle 16#F735\n", -"/fiveparen 16#2478\n", -"/fiveperiod 16#248C\n", -"/fivepersian 16#06F5\n", -"/fiveroman 16#2174\n", -"/fivesuperior 16#2075\n", -"/fivethai 16#0E55\n", -"/fl 16#FB02\n", -"/florin 16#0192\n", -"/fmonospace 16#FF46\n", -"/fmsquare 16#3399\n", -"/fofanthai 16#0E1F\n", -"/fofathai 16#0E1D\n", -"/fongmanthai 16#0E4F\n", -"/forall 16#2200\n", -"/four 16#0034\n", -"/fourarabic 16#0664\n", -"/fourbengali 16#09EA\n", -"/fourcircle 16#2463\n", -"/fourcircleinversesansserif 16#278D\n", -"/fourdeva 16#096A\n", -"/fourgujarati 16#0AEA\n", -"/fourgurmukhi 16#0A6A\n", -"/fourhackarabic 16#0664\n", -"/fourhangzhou 16#3024\n", -"/fourideographicparen 16#3223\n", -"/fourinferior 16#2084\n", -"/fourmonospace 16#FF14\n", -"/fournumeratorbengali 16#09F7\n", -"/fouroldstyle 16#F734\n", -"/fourparen 16#2477\n", -"/fourperiod 16#248B\n", -"/fourpersian 16#06F4\n", -"/fourroman 16#2173\n", -"/foursuperior 16#2074\n", -"/fourteencircle 16#246D\n", -"/fourteenparen 16#2481\n", -"/fourteenperiod 16#2495\n", -"/fourthai 16#0E54\n", -"/fourthtonechinese 16#02CB\n", -"/fparen 16#24A1\n", -"/fraction 16#2044\n", -"/franc 16#20A3\n", -"/g 16#0067\n", -"/gabengali 16#0997\n", -"/gacute 16#01F5\n", -"/gadeva 16#0917\n", -"/gafarabic 16#06AF\n", -"/gaffinalarabic 16#FB93\n", -"/gafinitialarabic 16#FB94\n", -"/gafmedialarabic 16#FB95\n", -"/gagujarati 16#0A97\n", -"/gagurmukhi 16#0A17\n", -"/gahiragana 16#304C\n", -"/gakatakana 16#30AC\n", -"/gamma 16#03B3\n", -"/gammalatinsmall 16#0263\n", -"/gammasuperior 16#02E0\n", -"/gangiacoptic 16#03EB\n", -"/gbopomofo 16#310D\n", -"/gbreve 16#011F\n", -"/gcaron 16#01E7\n", -"/gcedilla 16#0123\n", -"/gcircle 16#24D6\n", -"/gcircumflex 16#011D\n", -"/gcommaaccent 16#0123\n", -"/gdot 16#0121\n", -"/gdotaccent 16#0121\n", -"/gecyrillic 16#0433\n", -"/gehiragana 16#3052\n", -"/gekatakana 16#30B2\n", -"/geometricallyequal 16#2251\n", -"/gereshaccenthebrew 16#059C\n", -"/gereshhebrew 16#05F3\n", -"/gereshmuqdamhebrew 16#059D\n", -"/germandbls 16#00DF\n", -"/gershayimaccenthebrew 16#059E\n", -"/gershayimhebrew 16#05F4\n", -"/getamark 16#3013\n", -"/ghabengali 16#0998\n", -"/ghadarmenian 16#0572\n", -"/ghadeva 16#0918\n", -"/ghagujarati 16#0A98\n", -"/ghagurmukhi 16#0A18\n", -"/ghainarabic 16#063A\n", -"/ghainfinalarabic 16#FECE\n", -"/ghaininitialarabic 16#FECF\n", -"/ghainmedialarabic 16#FED0\n", -"/ghemiddlehookcyrillic 16#0495\n", -"/ghestrokecyrillic 16#0493\n", -"/gheupturncyrillic 16#0491\n", -"/ghhadeva 16#095A\n", -"/ghhagurmukhi 16#0A5A\n", -"/ghook 16#0260\n", -"/ghzsquare 16#3393\n", -"/gihiragana 16#304E\n", -"/gikatakana 16#30AE\n", -"/gimarmenian 16#0563\n", -"/gimel 16#05D2\n", -"/gimeldagesh 16#FB32\n", -"/gimeldageshhebrew 16#FB32\n", -"/gimelhebrew 16#05D2\n", -"/gjecyrillic 16#0453\n", -"/glottalinvertedstroke 16#01BE\n", -"/glottalstop 16#0294\n", -"/glottalstopinverted 16#0296\n", -"/glottalstopmod 16#02C0\n", -"/glottalstopreversed 16#0295\n", -"/glottalstopreversedmod 16#02C1\n", -"/glottalstopreversedsuperior 16#02E4\n", -"/glottalstopstroke 16#02A1\n", -"/glottalstopstrokereversed 16#02A2\n", -"/gmacron 16#1E21\n", -"/gmonospace 16#FF47\n", -"/gohiragana 16#3054\n", -"/gokatakana 16#30B4\n", -"/gparen 16#24A2\n", -"/gpasquare 16#33AC\n", -"/gradient 16#2207\n", -"/grave 16#0060\n", -"/gravebelowcmb 16#0316\n", -"/gravecmb 16#0300\n", -"/gravecomb 16#0300\n", -"/gravedeva 16#0953\n", -"/gravelowmod 16#02CE\n", -"/gravemonospace 16#FF40\n", -"/gravetonecmb 16#0340\n", -"/greater 16#003E\n", -"/greaterequal 16#2265\n", -"/greaterequalorless 16#22DB\n", -"/greatermonospace 16#FF1E\n", -"/greaterorequivalent 16#2273\n", -"/greaterorless 16#2277\n", -"/greateroverequal 16#2267\n", -"/greatersmall 16#FE65\n", -"/gscript 16#0261\n", -"/gstroke 16#01E5\n", -"/guhiragana 16#3050\n", -"/guillemotleft 16#00AB\n", -"/guillemotright 16#00BB\n", -"/guilsinglleft 16#2039\n", -"/guilsinglright 16#203A\n", -"/gukatakana 16#30B0\n", -"/guramusquare 16#3318\n", -"/gysquare 16#33C9\n", -"/h 16#0068\n", -"/haabkhasiancyrillic 16#04A9\n", -"/haaltonearabic 16#06C1\n", -"/habengali 16#09B9\n", -"/hadescendercyrillic 16#04B3\n", -"/hadeva 16#0939\n", -"/hagujarati 16#0AB9\n", -"/hagurmukhi 16#0A39\n", -"/haharabic 16#062D\n", -"/hahfinalarabic 16#FEA2\n", -"/hahinitialarabic 16#FEA3\n", -"/hahiragana 16#306F\n", -"/hahmedialarabic 16#FEA4\n", -"/haitusquare 16#332A\n", -"/hakatakana 16#30CF\n", -"/hakatakanahalfwidth 16#FF8A\n", -"/halantgurmukhi 16#0A4D\n", -"/hamzaarabic 16#0621\n", -"/hamzalowarabic 16#0621\n", -"/hangulfiller 16#3164\n", -"/hardsigncyrillic 16#044A\n", -"/harpoonleftbarbup 16#21BC\n", -"/harpoonrightbarbup 16#21C0\n", -"/hasquare 16#33CA\n", -"/hatafpatah 16#05B2\n", -"/hatafpatah16 16#05B2\n", -"/hatafpatah23 16#05B2\n", -"/hatafpatah2f 16#05B2\n", -"/hatafpatahhebrew 16#05B2\n", -"/hatafpatahnarrowhebrew 16#05B2\n", -"/hatafpatahquarterhebrew 16#05B2\n", -"/hatafpatahwidehebrew 16#05B2\n", -"/hatafqamats 16#05B3\n", -"/hatafqamats1b 16#05B3\n", -"/hatafqamats28 16#05B3\n", -"/hatafqamats34 16#05B3\n", -"/hatafqamatshebrew 16#05B3\n", -"/hatafqamatsnarrowhebrew 16#05B3\n", -"/hatafqamatsquarterhebrew 16#05B3\n", -"/hatafqamatswidehebrew 16#05B3\n", -"/hatafsegol 16#05B1\n", -"/hatafsegol17 16#05B1\n", -"/hatafsegol24 16#05B1\n", -"/hatafsegol30 16#05B1\n", -"/hatafsegolhebrew 16#05B1\n", -"/hatafsegolnarrowhebrew 16#05B1\n", -"/hatafsegolquarterhebrew 16#05B1\n", -"/hatafsegolwidehebrew 16#05B1\n", -"/hbar 16#0127\n", -"/hbopomofo 16#310F\n", -"/hbrevebelow 16#1E2B\n", -"/hcedilla 16#1E29\n", -"/hcircle 16#24D7\n", -"/hcircumflex 16#0125\n", -"/hdieresis 16#1E27\n", -"/hdotaccent 16#1E23\n", -"/hdotbelow 16#1E25\n", -"/he 16#05D4\n", -"/heart 16#2665\n", -"/heartsuitblack 16#2665\n", -"/heartsuitwhite 16#2661\n", -"/hedagesh 16#FB34\n", -"/hedageshhebrew 16#FB34\n", -"/hehaltonearabic 16#06C1\n", -"/heharabic 16#0647\n", -"/hehebrew 16#05D4\n", -"/hehfinalaltonearabic 16#FBA7\n", -"/hehfinalalttwoarabic 16#FEEA\n", -"/hehfinalarabic 16#FEEA\n", -"/hehhamzaabovefinalarabic 16#FBA5\n", -"/hehhamzaaboveisolatedarabic 16#FBA4\n", -"/hehinitialaltonearabic 16#FBA8\n", -"/hehinitialarabic 16#FEEB\n", -"/hehiragana 16#3078\n", -"/hehmedialaltonearabic 16#FBA9\n", -"/hehmedialarabic 16#FEEC\n", -"/heiseierasquare 16#337B\n", -"/hekatakana 16#30D8\n", -"/hekatakanahalfwidth 16#FF8D\n", -"/hekutaarusquare 16#3336\n", -"/henghook 16#0267\n", -"/herutusquare 16#3339\n", -"/het 16#05D7\n", -"/hethebrew 16#05D7\n", -"/hhook 16#0266\n", -"/hhooksuperior 16#02B1\n", -"/hieuhacirclekorean 16#327B\n", -"/hieuhaparenkorean 16#321B\n", -"/hieuhcirclekorean 16#326D\n", -"/hieuhkorean 16#314E\n", -"/hieuhparenkorean 16#320D\n", -"/hihiragana 16#3072\n", -"/hikatakana 16#30D2\n", -"/hikatakanahalfwidth 16#FF8B\n", -"/hiriq 16#05B4\n", -"/hiriq14 16#05B4\n", -"/hiriq21 16#05B4\n", -"/hiriq2d 16#05B4\n", -"/hiriqhebrew 16#05B4\n", -"/hiriqnarrowhebrew 16#05B4\n", -"/hiriqquarterhebrew 16#05B4\n", -"/hiriqwidehebrew 16#05B4\n", -"/hlinebelow 16#1E96\n", -"/hmonospace 16#FF48\n", -"/hoarmenian 16#0570\n", -"/hohipthai 16#0E2B\n", -"/hohiragana 16#307B\n", -"/hokatakana 16#30DB\n", -"/hokatakanahalfwidth 16#FF8E\n", -"/holam 16#05B9\n", -"/holam19 16#05B9\n", -"/holam26 16#05B9\n", -"/holam32 16#05B9\n", -"/holamhebrew 16#05B9\n", -"/holamnarrowhebrew 16#05B9\n", -"/holamquarterhebrew 16#05B9\n", -"/holamwidehebrew 16#05B9\n", -"/honokhukthai 16#0E2E\n", -"/hookabovecomb 16#0309\n", -"/hookcmb 16#0309\n", -"/hookpalatalizedbelowcmb 16#0321\n", -"/hookretroflexbelowcmb 16#0322\n", -"/hoonsquare 16#3342\n", -"/horicoptic 16#03E9\n", -"/horizontalbar 16#2015\n", -"/horncmb 16#031B\n", -"/hotsprings 16#2668\n", -"/house 16#2302\n", -"/hparen 16#24A3\n", -"/hsuperior 16#02B0\n", -"/hturned 16#0265\n", -"/huhiragana 16#3075\n", -"/huiitosquare 16#3333\n", -"/hukatakana 16#30D5\n", -"/hukatakanahalfwidth 16#FF8C\n", -"/hungarumlaut 16#02DD\n", -"/hungarumlautcmb 16#030B\n", -"/hv 16#0195\n", -"/hyphen 16#002D\n", -"/hypheninferior 16#F6E5\n", -"/hyphenmonospace 16#FF0D\n", -"/hyphensmall 16#FE63\n", -"/hyphensuperior 16#F6E6\n", -"/hyphentwo 16#2010\n", -"/i 16#0069\n", -"/iacute 16#00ED\n", -"/iacyrillic 16#044F\n", -"/ibengali 16#0987\n", -"/ibopomofo 16#3127\n", -"/ibreve 16#012D\n", -"/icaron 16#01D0\n", -"/icircle 16#24D8\n", -"/icircumflex 16#00EE\n", -"/icyrillic 16#0456\n", -"/idblgrave 16#0209\n", -"/ideographearthcircle 16#328F\n", -"/ideographfirecircle 16#328B\n", -"/ideographicallianceparen 16#323F\n", -"/ideographiccallparen 16#323A\n", -"/ideographiccentrecircle 16#32A5\n", -"/ideographicclose 16#3006\n", -"/ideographiccomma 16#3001\n", -"/ideographiccommaleft 16#FF64\n", -"/ideographiccongratulationparen 16#3237\n", -"/ideographiccorrectcircle 16#32A3\n", -"/ideographicearthparen 16#322F\n", -"/ideographicenterpriseparen 16#323D\n", -"/ideographicexcellentcircle 16#329D\n", -"/ideographicfestivalparen 16#3240\n", -"/ideographicfinancialcircle 16#3296\n", -"/ideographicfinancialparen 16#3236\n", -"/ideographicfireparen 16#322B\n", -"/ideographichaveparen 16#3232\n", -"/ideographichighcircle 16#32A4\n", -"/ideographiciterationmark 16#3005\n", -"/ideographiclaborcircle 16#3298\n", -"/ideographiclaborparen 16#3238\n", -"/ideographicleftcircle 16#32A7\n", -"/ideographiclowcircle 16#32A6\n", -"/ideographicmedicinecircle 16#32A9\n", -"/ideographicmetalparen 16#322E\n", -"/ideographicmoonparen 16#322A\n", -"/ideographicnameparen 16#3234\n", -"/ideographicperiod 16#3002\n", -"/ideographicprintcircle 16#329E\n", -"/ideographicreachparen 16#3243\n", -"/ideographicrepresentparen 16#3239\n", -"/ideographicresourceparen 16#323E\n", -"/ideographicrightcircle 16#32A8\n", -"/ideographicsecretcircle 16#3299\n", -"/ideographicselfparen 16#3242\n", -"/ideographicsocietyparen 16#3233\n", -"/ideographicspace 16#3000\n", -"/ideographicspecialparen 16#3235\n", -"/ideographicstockparen 16#3231\n", -"/ideographicstudyparen 16#323B\n", -"/ideographicsunparen 16#3230\n", -"/ideographicsuperviseparen 16#323C\n", -"/ideographicwaterparen 16#322C\n", -"/ideographicwoodparen 16#322D\n", -"/ideographiczero 16#3007\n", -"/ideographmetalcircle 16#328E\n", -"/ideographmooncircle 16#328A\n", -"/ideographnamecircle 16#3294\n", -"/ideographsuncircle 16#3290\n", -"/ideographwatercircle 16#328C\n", -"/ideographwoodcircle 16#328D\n", -"/ideva 16#0907\n", -"/idieresis 16#00EF\n", -"/idieresisacute 16#1E2F\n", -"/idieresiscyrillic 16#04E5\n", -"/idotbelow 16#1ECB\n", -"/iebrevecyrillic 16#04D7\n", -"/iecyrillic 16#0435\n", -"/ieungacirclekorean 16#3275\n", -"/ieungaparenkorean 16#3215\n", -"/ieungcirclekorean 16#3267\n", -"/ieungkorean 16#3147\n", -"/ieungparenkorean 16#3207\n", -"/igrave 16#00EC\n", -"/igujarati 16#0A87\n", -"/igurmukhi 16#0A07\n", -"/ihiragana 16#3044\n", -"/ihookabove 16#1EC9\n", -"/iibengali 16#0988\n", -"/iicyrillic 16#0438\n", -"/iideva 16#0908\n", -"/iigujarati 16#0A88\n", -"/iigurmukhi 16#0A08\n", -"/iimatragurmukhi 16#0A40\n", -"/iinvertedbreve 16#020B\n", -"/iishortcyrillic 16#0439\n", -"/iivowelsignbengali 16#09C0\n", -"/iivowelsigndeva 16#0940\n", -"/iivowelsigngujarati 16#0AC0\n", -"/ij 16#0133\n", -"/ikatakana 16#30A4\n", -"/ikatakanahalfwidth 16#FF72\n", -"/ikorean 16#3163\n", -"/ilde 16#02DC\n", -"/iluyhebrew 16#05AC\n", -"/imacron 16#012B\n", -"/imacroncyrillic 16#04E3\n", -"/imageorapproximatelyequal 16#2253\n", -"/imatragurmukhi 16#0A3F\n", -"/imonospace 16#FF49\n", -"/increment 16#2206\n", -"/infinity 16#221E\n", -"/iniarmenian 16#056B\n", -"/integral 16#222B\n", -"/integralbottom 16#2321\n", -"/integralbt 16#2321\n", -"/integralex 16#F8F5\n", -"/integraltop 16#2320\n", -"/integraltp 16#2320\n", -"/intersection 16#2229\n", -"/intisquare 16#3305\n", -"/invbullet 16#25D8\n", -"/invcircle 16#25D9\n", -"/invsmileface 16#263B\n", -"/iocyrillic 16#0451\n", -"/iogonek 16#012F\n", -"/iota 16#03B9\n", -"/iotadieresis 16#03CA\n", -"/iotadieresistonos 16#0390\n", -"/iotalatin 16#0269\n", -"/iotatonos 16#03AF\n", -"/iparen 16#24A4\n", -"/irigurmukhi 16#0A72\n", -"/ismallhiragana 16#3043\n", -"/ismallkatakana 16#30A3\n", -"/ismallkatakanahalfwidth 16#FF68\n", -"/issharbengali 16#09FA\n", -"/istroke 16#0268\n", -"/isuperior 16#F6ED\n", -"/iterationhiragana 16#309D\n", -"/iterationkatakana 16#30FD\n", -"/itilde 16#0129\n", -"/itildebelow 16#1E2D\n", -"/iubopomofo 16#3129\n", -"/iucyrillic 16#044E\n", -"/ivowelsignbengali 16#09BF\n", -"/ivowelsigndeva 16#093F\n", -"/ivowelsigngujarati 16#0ABF\n", -"/izhitsacyrillic 16#0475\n", -"/izhitsadblgravecyrillic 16#0477\n", -"/j 16#006A\n", -"/jaarmenian 16#0571\n", -"/jabengali 16#099C\n", -"/jadeva 16#091C\n", -"/jagujarati 16#0A9C\n", -"/jagurmukhi 16#0A1C\n", -"/jbopomofo 16#3110\n", -"/jcaron 16#01F0\n", -"/jcircle 16#24D9\n", -"/jcircumflex 16#0135\n", -"/jcrossedtail 16#029D\n", -"/jdotlessstroke 16#025F\n", -"/jecyrillic 16#0458\n", -"/jeemarabic 16#062C\n", -"/jeemfinalarabic 16#FE9E\n", -"/jeeminitialarabic 16#FE9F\n", -"/jeemmedialarabic 16#FEA0\n", -"/jeharabic 16#0698\n", -"/jehfinalarabic 16#FB8B\n", -"/jhabengali 16#099D\n", -"/jhadeva 16#091D\n", -"/jhagujarati 16#0A9D\n", -"/jhagurmukhi 16#0A1D\n", -"/jheharmenian 16#057B\n", -"/jis 16#3004\n", -"/jmonospace 16#FF4A\n", -"/jparen 16#24A5\n", -"/jsuperior 16#02B2\n", -"/k 16#006B\n", -"/kabashkircyrillic 16#04A1\n", -"/kabengali 16#0995\n", -"/kacute 16#1E31\n", -"/kacyrillic 16#043A\n", -"/kadescendercyrillic 16#049B\n", -"/kadeva 16#0915\n", -"/kaf 16#05DB\n", -"/kafarabic 16#0643\n", -"/kafdagesh 16#FB3B\n", -"/kafdageshhebrew 16#FB3B\n", -"/kaffinalarabic 16#FEDA\n", -"/kafhebrew 16#05DB\n", -"/kafinitialarabic 16#FEDB\n", -"/kafmedialarabic 16#FEDC\n", -"/kafrafehebrew 16#FB4D\n", -"/kagujarati 16#0A95\n", -"/kagurmukhi 16#0A15\n", -"/kahiragana 16#304B\n", -"/kahookcyrillic 16#04C4\n", -"/kakatakana 16#30AB\n", -"/kakatakanahalfwidth 16#FF76\n", -"/kappa 16#03BA\n", -"/kappasymbolgreek 16#03F0\n", -"/kapyeounmieumkorean 16#3171\n", -"/kapyeounphieuphkorean 16#3184\n", -"/kapyeounpieupkorean 16#3178\n", -"/kapyeounssangpieupkorean 16#3179\n", -"/karoriisquare 16#330D\n", -"/kashidaautoarabic 16#0640\n", -"/kashidaautonosidebearingarabic 16#0640\n", -"/kasmallkatakana 16#30F5\n", -"/kasquare 16#3384\n", -"/kasraarabic 16#0650\n", -"/kasratanarabic 16#064D\n", -"/kastrokecyrillic 16#049F\n", -"/katahiraprolongmarkhalfwidth 16#FF70\n", -"/kaverticalstrokecyrillic 16#049D\n", -"/kbopomofo 16#310E\n", -"/kcalsquare 16#3389\n", -"/kcaron 16#01E9\n", -"/kcedilla 16#0137\n", -"/kcircle 16#24DA\n", -"/kcommaaccent 16#0137\n", -"/kdotbelow 16#1E33\n", -"/keharmenian 16#0584\n", -"/kehiragana 16#3051\n", -"/kekatakana 16#30B1\n", -"/kekatakanahalfwidth 16#FF79\n", -"/kenarmenian 16#056F\n", -"/kesmallkatakana 16#30F6\n", -"/kgreenlandic 16#0138\n", -"/khabengali 16#0996\n", -"/khacyrillic 16#0445\n", -"/khadeva 16#0916\n", -"/khagujarati 16#0A96\n", -"/khagurmukhi 16#0A16\n", -"/khaharabic 16#062E\n", -"/khahfinalarabic 16#FEA6\n", -"/khahinitialarabic 16#FEA7\n", -"/khahmedialarabic 16#FEA8\n", -"/kheicoptic 16#03E7\n", -"/khhadeva 16#0959\n", -"/khhagurmukhi 16#0A59\n", -"/khieukhacirclekorean 16#3278\n", -"/khieukhaparenkorean 16#3218\n", -"/khieukhcirclekorean 16#326A\n", -"/khieukhkorean 16#314B\n", -"/khieukhparenkorean 16#320A\n", -"/khokhaithai 16#0E02\n", -"/khokhonthai 16#0E05\n", -"/khokhuatthai 16#0E03\n", -"/khokhwaithai 16#0E04\n", -"/khomutthai 16#0E5B\n", -"/khook 16#0199\n", -"/khorakhangthai 16#0E06\n", -"/khzsquare 16#3391\n", -"/kihiragana 16#304D\n", -"/kikatakana 16#30AD\n", -"/kikatakanahalfwidth 16#FF77\n", -"/kiroguramusquare 16#3315\n", -"/kiromeetorusquare 16#3316\n", -"/kirosquare 16#3314\n", -"/kiyeokacirclekorean 16#326E\n", -"/kiyeokaparenkorean 16#320E\n", -"/kiyeokcirclekorean 16#3260\n", -"/kiyeokkorean 16#3131\n", -"/kiyeokparenkorean 16#3200\n", -"/kiyeoksioskorean 16#3133\n", -"/kjecyrillic 16#045C\n", -"/klinebelow 16#1E35\n", -"/klsquare 16#3398\n", -"/kmcubedsquare 16#33A6\n", -"/kmonospace 16#FF4B\n", -"/kmsquaredsquare 16#33A2\n", -"/kohiragana 16#3053\n", -"/kohmsquare 16#33C0\n", -"/kokaithai 16#0E01\n", -"/kokatakana 16#30B3\n", -"/kokatakanahalfwidth 16#FF7A\n", -"/kooposquare 16#331E\n", -"/koppacyrillic 16#0481\n", -"/koreanstandardsymbol 16#327F\n", -"/koroniscmb 16#0343\n", -"/kparen 16#24A6\n", -"/kpasquare 16#33AA\n", -"/ksicyrillic 16#046F\n", -"/ktsquare 16#33CF\n", -"/kturned 16#029E\n", -"/kuhiragana 16#304F\n", -"/kukatakana 16#30AF\n", -"/kukatakanahalfwidth 16#FF78\n", -"/kvsquare 16#33B8\n", -"/kwsquare 16#33BE\n", -"/l 16#006C\n", -"/labengali 16#09B2\n", -"/lacute 16#013A\n", -"/ladeva 16#0932\n", -"/lagujarati 16#0AB2\n", -"/lagurmukhi 16#0A32\n", -"/lakkhangyaothai 16#0E45\n", -"/lamaleffinalarabic 16#FEFC\n", -"/lamalefhamzaabovefinalarabic 16#FEF8\n", -"/lamalefhamzaaboveisolatedarabic 16#FEF7\n", -"/lamalefhamzabelowfinalarabic 16#FEFA\n", -"/lamalefhamzabelowisolatedarabic 16#FEF9\n", -"/lamalefisolatedarabic 16#FEFB\n", -"/lamalefmaddaabovefinalarabic 16#FEF6\n", -"/lamalefmaddaaboveisolatedarabic 16#FEF5\n", -"/lamarabic 16#0644\n", -"/lambda 16#03BB\n", -"/lambdastroke 16#019B\n", -"/lamed 16#05DC\n", -"/lameddagesh 16#FB3C\n", -"/lameddageshhebrew 16#FB3C\n", -"/lamedhebrew 16#05DC\n", -"/lamfinalarabic 16#FEDE\n", -"/lamhahinitialarabic 16#FCCA\n", -"/laminitialarabic 16#FEDF\n", -"/lamjeeminitialarabic 16#FCC9\n", -"/lamkhahinitialarabic 16#FCCB\n", -"/lamlamhehisolatedarabic 16#FDF2\n", -"/lammedialarabic 16#FEE0\n", -"/lammeemhahinitialarabic 16#FD88\n", -"/lammeeminitialarabic 16#FCCC\n", -"/largecircle 16#25EF\n", -"/lbar 16#019A\n", -"/lbelt 16#026C\n", -"/lbopomofo 16#310C\n", -"/lcaron 16#013E\n", -"/lcedilla 16#013C\n", -"/lcircle 16#24DB\n", -"/lcircumflexbelow 16#1E3D\n", -"/lcommaaccent 16#013C\n", -"/ldot 16#0140\n", -"/ldotaccent 16#0140\n", -"/ldotbelow 16#1E37\n", -"/ldotbelowmacron 16#1E39\n", -"/leftangleabovecmb 16#031A\n", -"/lefttackbelowcmb 16#0318\n", -"/less 16#003C\n", -"/lessequal 16#2264\n", -"/lessequalorgreater 16#22DA\n", -"/lessmonospace 16#FF1C\n", -"/lessorequivalent 16#2272\n", -"/lessorgreater 16#2276\n", -"/lessoverequal 16#2266\n", -"/lesssmall 16#FE64\n", -"/lezh 16#026E\n", -"/lfblock 16#258C\n", -"/lhookretroflex 16#026D\n", -"/lira 16#20A4\n", -"/liwnarmenian 16#056C\n", -"/lj 16#01C9\n", -"/ljecyrillic 16#0459\n", -"/ll 16#F6C0\n", -"/lladeva 16#0933\n", -"/llagujarati 16#0AB3\n", -"/llinebelow 16#1E3B\n", -"/llladeva 16#0934\n", -"/llvocalicbengali 16#09E1\n", -"/llvocalicdeva 16#0961\n", -"/llvocalicvowelsignbengali 16#09E3\n", -"/llvocalicvowelsigndeva 16#0963\n", -"/lmiddletilde 16#026B\n", -"/lmonospace 16#FF4C\n", -"/lmsquare 16#33D0\n", -"/lochulathai 16#0E2C\n", -"/logicaland 16#2227\n", -"/logicalnot 16#00AC\n", -"/logicalnotreversed 16#2310\n", -"/logicalor 16#2228\n", -"/lolingthai 16#0E25\n", -"/longs 16#017F\n", -"/lowlinecenterline 16#FE4E\n", -"/lowlinecmb 16#0332\n", -"/lowlinedashed 16#FE4D\n", -"/lozenge 16#25CA\n", -"/lparen 16#24A7\n", -"/lslash 16#0142\n", -"/lsquare 16#2113\n", -"/lsuperior 16#F6EE\n", -"/ltshade 16#2591\n", -"/luthai 16#0E26\n", -"/lvocalicbengali 16#098C\n", -"/lvocalicdeva 16#090C\n", -"/lvocalicvowelsignbengali 16#09E2\n", -"/lvocalicvowelsigndeva 16#0962\n", -"/lxsquare 16#33D3\n", -"/m 16#006D\n", -"/mabengali 16#09AE\n", -"/macron 16#00AF\n", -"/macronbelowcmb 16#0331\n", -"/macroncmb 16#0304\n", -"/macronlowmod 16#02CD\n", -"/macronmonospace 16#FFE3\n", -"/macute 16#1E3F\n", -"/madeva 16#092E\n", -"/magujarati 16#0AAE\n", -"/magurmukhi 16#0A2E\n", -"/mahapakhhebrew 16#05A4\n", -"/mahapakhlefthebrew 16#05A4\n", -"/mahiragana 16#307E\n", -"/maichattawalowleftthai 16#F895\n", -"/maichattawalowrightthai 16#F894\n", -"/maichattawathai 16#0E4B\n", -"/maichattawaupperleftthai 16#F893\n", -"/maieklowleftthai 16#F88C\n", -"/maieklowrightthai 16#F88B\n", -"/maiekthai 16#0E48\n", -"/maiekupperleftthai 16#F88A\n", -"/maihanakatleftthai 16#F884\n", -"/maihanakatthai 16#0E31\n", -"/maitaikhuleftthai 16#F889\n", -"/maitaikhuthai 16#0E47\n", -"/maitholowleftthai 16#F88F\n", -"/maitholowrightthai 16#F88E\n", -"/maithothai 16#0E49\n", -"/maithoupperleftthai 16#F88D\n", -"/maitrilowleftthai 16#F892\n", -"/maitrilowrightthai 16#F891\n", -"/maitrithai 16#0E4A\n", -"/maitriupperleftthai 16#F890\n", -"/maiyamokthai 16#0E46\n", -"/makatakana 16#30DE\n", -"/makatakanahalfwidth 16#FF8F\n", -"/male 16#2642\n", -"/mansyonsquare 16#3347\n", -"/maqafhebrew 16#05BE\n", -"/mars 16#2642\n", -"/masoracirclehebrew 16#05AF\n", -"/masquare 16#3383\n", -"/mbopomofo 16#3107\n", -"/mbsquare 16#33D4\n", -"/mcircle 16#24DC\n", -"/mcubedsquare 16#33A5\n", -"/mdotaccent 16#1E41\n", -"/mdotbelow 16#1E43\n", -"/meemarabic 16#0645\n", -"/meemfinalarabic 16#FEE2\n", -"/meeminitialarabic 16#FEE3\n", -"/meemmedialarabic 16#FEE4\n", -"/meemmeeminitialarabic 16#FCD1\n", -"/meemmeemisolatedarabic 16#FC48\n", -"/meetorusquare 16#334D\n", -"/mehiragana 16#3081\n", -"/meizierasquare 16#337E\n", -"/mekatakana 16#30E1\n", -"/mekatakanahalfwidth 16#FF92\n", -"/mem 16#05DE\n", -"/memdagesh 16#FB3E\n", -"/memdageshhebrew 16#FB3E\n", -"/memhebrew 16#05DE\n", -"/menarmenian 16#0574\n", -"/merkhahebrew 16#05A5\n", -"/merkhakefulahebrew 16#05A6\n", -"/merkhakefulalefthebrew 16#05A6\n", -"/merkhalefthebrew 16#05A5\n", -"/mhook 16#0271\n", -"/mhzsquare 16#3392\n", -"/middledotkatakanahalfwidth 16#FF65\n", -"/middot 16#00B7\n", -"/mieumacirclekorean 16#3272\n", -"/mieumaparenkorean 16#3212\n", -"/mieumcirclekorean 16#3264\n", -"/mieumkorean 16#3141\n", -"/mieumpansioskorean 16#3170\n", -"/mieumparenkorean 16#3204\n", -"/mieumpieupkorean 16#316E\n", -"/mieumsioskorean 16#316F\n", -"/mihiragana 16#307F\n", -"/mikatakana 16#30DF\n", -"/mikatakanahalfwidth 16#FF90\n", -"/minus 16#2212\n", -"/minusbelowcmb 16#0320\n", -"/minuscircle 16#2296\n", -"/minusmod 16#02D7\n", -"/minusplus 16#2213\n", -"/minute 16#2032\n", -"/miribaarusquare 16#334A\n", -"/mirisquare 16#3349\n", -"/mlonglegturned 16#0270\n", -"/mlsquare 16#3396\n", -"/mmcubedsquare 16#33A3\n", -"/mmonospace 16#FF4D\n", -"/mmsquaredsquare 16#339F\n", -"/mohiragana 16#3082\n", -"/mohmsquare 16#33C1\n", -"/mokatakana 16#30E2\n", -"/mokatakanahalfwidth 16#FF93\n", -"/molsquare 16#33D6\n", -"/momathai 16#0E21\n", -"/moverssquare 16#33A7\n", -"/moverssquaredsquare 16#33A8\n", -"/mparen 16#24A8\n", -"/mpasquare 16#33AB\n", -"/mssquare 16#33B3\n", -"/msuperior 16#F6EF\n", -"/mturned 16#026F\n", -"/mu 16#00B5\n", -"/mu1 16#00B5\n", -"/muasquare 16#3382\n", -"/muchgreater 16#226B\n", -"/muchless 16#226A\n", -"/mufsquare 16#338C\n", -"/mugreek 16#03BC\n", -"/mugsquare 16#338D\n", -"/muhiragana 16#3080\n", -"/mukatakana 16#30E0\n", -"/mukatakanahalfwidth 16#FF91\n", -"/mulsquare 16#3395\n", -"/multiply 16#00D7\n", -"/mumsquare 16#339B\n", -"/munahhebrew 16#05A3\n", -"/munahlefthebrew 16#05A3\n", -"/musicalnote 16#266A\n", -"/musicalnotedbl 16#266B\n", -"/musicflatsign 16#266D\n", -"/musicsharpsign 16#266F\n", -"/mussquare 16#33B2\n", -"/muvsquare 16#33B6\n", -"/muwsquare 16#33BC\n", -"/mvmegasquare 16#33B9\n", -"/mvsquare 16#33B7\n", -"/mwmegasquare 16#33BF\n", -"/mwsquare 16#33BD\n", -"/n 16#006E\n", -"/nabengali 16#09A8\n", -"/nabla 16#2207\n", -"/nacute 16#0144\n", -"/nadeva 16#0928\n", -"/nagujarati 16#0AA8\n", -"/nagurmukhi 16#0A28\n", -"/nahiragana 16#306A\n", -"/nakatakana 16#30CA\n", -"/nakatakanahalfwidth 16#FF85\n", -"/napostrophe 16#0149\n", -"/nasquare 16#3381\n", -"/nbopomofo 16#310B\n", -"/nbspace 16#00A0\n", -"/ncaron 16#0148\n", -"/ncedilla 16#0146\n", -"/ncircle 16#24DD\n", -"/ncircumflexbelow 16#1E4B\n", -"/ncommaaccent 16#0146\n", -"/ndotaccent 16#1E45\n", -"/ndotbelow 16#1E47\n", -"/nehiragana 16#306D\n", -"/nekatakana 16#30CD\n", -"/nekatakanahalfwidth 16#FF88\n", -"/newsheqelsign 16#20AA\n", -"/nfsquare 16#338B\n", -"/ngabengali 16#0999\n", -"/ngadeva 16#0919\n", -"/ngagujarati 16#0A99\n", -"/ngagurmukhi 16#0A19\n", -"/ngonguthai 16#0E07\n", -"/nhiragana 16#3093\n", -"/nhookleft 16#0272\n", -"/nhookretroflex 16#0273\n", -"/nieunacirclekorean 16#326F\n", -"/nieunaparenkorean 16#320F\n", -"/nieuncieuckorean 16#3135\n", -"/nieuncirclekorean 16#3261\n", -"/nieunhieuhkorean 16#3136\n", -"/nieunkorean 16#3134\n", -"/nieunpansioskorean 16#3168\n", -"/nieunparenkorean 16#3201\n", -"/nieunsioskorean 16#3167\n", -"/nieuntikeutkorean 16#3166\n", -"/nihiragana 16#306B\n", -"/nikatakana 16#30CB\n", -"/nikatakanahalfwidth 16#FF86\n", -"/nikhahitleftthai 16#F899\n", -"/nikhahitthai 16#0E4D\n", -"/nine 16#0039\n", -"/ninearabic 16#0669\n", -"/ninebengali 16#09EF\n", -"/ninecircle 16#2468\n", -"/ninecircleinversesansserif 16#2792\n", -"/ninedeva 16#096F\n", -"/ninegujarati 16#0AEF\n", -"/ninegurmukhi 16#0A6F\n", -"/ninehackarabic 16#0669\n", -"/ninehangzhou 16#3029\n", -"/nineideographicparen 16#3228\n", -"/nineinferior 16#2089\n", -"/ninemonospace 16#FF19\n", -"/nineoldstyle 16#F739\n", -"/nineparen 16#247C\n", -"/nineperiod 16#2490\n", -"/ninepersian 16#06F9\n", -"/nineroman 16#2178\n", -"/ninesuperior 16#2079\n", -"/nineteencircle 16#2472\n", -"/nineteenparen 16#2486\n", -"/nineteenperiod 16#249A\n", -"/ninethai 16#0E59\n", -"/nj 16#01CC\n", -"/njecyrillic 16#045A\n", -"/nkatakana 16#30F3\n", -"/nkatakanahalfwidth 16#FF9D\n", -"/nlegrightlong 16#019E\n", -"/nlinebelow 16#1E49\n", -"/nmonospace 16#FF4E\n", -"/nmsquare 16#339A\n", -"/nnabengali 16#09A3\n", -"/nnadeva 16#0923\n", -"/nnagujarati 16#0AA3\n", -"/nnagurmukhi 16#0A23\n", -"/nnnadeva 16#0929\n", -"/nohiragana 16#306E\n", -"/nokatakana 16#30CE\n", -"/nokatakanahalfwidth 16#FF89\n", -"/nonbreakingspace 16#00A0\n", -"/nonenthai 16#0E13\n", -"/nonuthai 16#0E19\n", -"/noonarabic 16#0646\n", -"/noonfinalarabic 16#FEE6\n", -"/noonghunnaarabic 16#06BA\n", -"/noonghunnafinalarabic 16#FB9F\n", -"/nooninitialarabic 16#FEE7\n", -"/noonjeeminitialarabic 16#FCD2\n", -"/noonjeemisolatedarabic 16#FC4B\n", -"/noonmedialarabic 16#FEE8\n", -"/noonmeeminitialarabic 16#FCD5\n", -"/noonmeemisolatedarabic 16#FC4E\n", -"/noonnoonfinalarabic 16#FC8D\n", -"/notcontains 16#220C\n", -"/notelement 16#2209\n", -"/notelementof 16#2209\n", -"/notequal 16#2260\n", -"/notgreater 16#226F\n", -"/notgreaternorequal 16#2271\n", -"/notgreaternorless 16#2279\n", -"/notidentical 16#2262\n", -"/notless 16#226E\n", -"/notlessnorequal 16#2270\n", -"/notparallel 16#2226\n", -"/notprecedes 16#2280\n", -"/notsubset 16#2284\n", -"/notsucceeds 16#2281\n", -"/notsuperset 16#2285\n", -"/nowarmenian 16#0576\n", -"/nparen 16#24A9\n", -"/nssquare 16#33B1\n", -"/nsuperior 16#207F\n", -"/ntilde 16#00F1\n", -"/nu 16#03BD\n", -"/nuhiragana 16#306C\n", -"/nukatakana 16#30CC\n", -"/nukatakanahalfwidth 16#FF87\n", -"/nuktabengali 16#09BC\n", -"/nuktadeva 16#093C\n", -"/nuktagujarati 16#0ABC\n", -"/nuktagurmukhi 16#0A3C\n", -"/numbersign 16#0023\n", -"/numbersignmonospace 16#FF03\n", -"/numbersignsmall 16#FE5F\n", -"/numeralsigngreek 16#0374\n", -"/numeralsignlowergreek 16#0375\n", -"/numero 16#2116\n", -"/nun 16#05E0\n", -"/nundagesh 16#FB40\n", -"/nundageshhebrew 16#FB40\n", -"/nunhebrew 16#05E0\n", -"/nvsquare 16#33B5\n", -"/nwsquare 16#33BB\n", -"/nyabengali 16#099E\n", -"/nyadeva 16#091E\n", -"/nyagujarati 16#0A9E\n", -"/nyagurmukhi 16#0A1E\n", -"/o 16#006F\n", -"/oacute 16#00F3\n", -"/oangthai 16#0E2D\n", -"/obarred 16#0275\n", -"/obarredcyrillic 16#04E9\n", -"/obarreddieresiscyrillic 16#04EB\n", -"/obengali 16#0993\n", -"/obopomofo 16#311B\n", -"/obreve 16#014F\n", -"/ocandradeva 16#0911\n", -"/ocandragujarati 16#0A91\n", -"/ocandravowelsigndeva 16#0949\n", -"/ocandravowelsigngujarati 16#0AC9\n", -"/ocaron 16#01D2\n", -"/ocircle 16#24DE\n", -"/ocircumflex 16#00F4\n", -"/ocircumflexacute 16#1ED1\n", -"/ocircumflexdotbelow 16#1ED9\n", -"/ocircumflexgrave 16#1ED3\n", -"/ocircumflexhookabove 16#1ED5\n", -"/ocircumflextilde 16#1ED7\n", -"/ocyrillic 16#043E\n", -"/odblacute 16#0151\n", -"/odblgrave 16#020D\n", -"/odeva 16#0913\n", -"/odieresis 16#00F6\n", -"/odieresiscyrillic 16#04E7\n", -"/odotbelow 16#1ECD\n", -"/oe 16#0153\n", -"/oekorean 16#315A\n", -"/ogonek 16#02DB\n", -"/ogonekcmb 16#0328\n", -"/ograve 16#00F2\n", -"/ogujarati 16#0A93\n", -"/oharmenian 16#0585\n", -"/ohiragana 16#304A\n", -"/ohookabove 16#1ECF\n", -"/ohorn 16#01A1\n", -"/ohornacute 16#1EDB\n", -"/ohorndotbelow 16#1EE3\n", -"/ohorngrave 16#1EDD\n", -"/ohornhookabove 16#1EDF\n", -"/ohorntilde 16#1EE1\n", -"/ohungarumlaut 16#0151\n", -"/oi 16#01A3\n", -"/oinvertedbreve 16#020F\n", -"/okatakana 16#30AA\n", -"/okatakanahalfwidth 16#FF75\n", -"/okorean 16#3157\n", -"/olehebrew 16#05AB\n", -"/omacron 16#014D\n", -"/omacronacute 16#1E53\n", -"/omacrongrave 16#1E51\n", -"/omdeva 16#0950\n", -"/omega 16#03C9\n", -"/omega1 16#03D6\n", -"/omegacyrillic 16#0461\n", -"/omegalatinclosed 16#0277\n", -"/omegaroundcyrillic 16#047B\n", -"/omegatitlocyrillic 16#047D\n", -"/omegatonos 16#03CE\n", -"/omgujarati 16#0AD0\n", -"/omicron 16#03BF\n", -"/omicrontonos 16#03CC\n", -"/omonospace 16#FF4F\n", -"/one 16#0031\n", -"/onearabic 16#0661\n", -"/onebengali 16#09E7\n", -"/onecircle 16#2460\n", -"/onecircleinversesansserif 16#278A\n", -"/onedeva 16#0967\n", -"/onedotenleader 16#2024\n", -"/oneeighth 16#215B\n", -"/onefitted 16#F6DC\n", -"/onegujarati 16#0AE7\n", -"/onegurmukhi 16#0A67\n", -"/onehackarabic 16#0661\n", -"/onehalf 16#00BD\n", -"/onehangzhou 16#3021\n", -"/oneideographicparen 16#3220\n", -"/oneinferior 16#2081\n", -"/onemonospace 16#FF11\n", -"/onenumeratorbengali 16#09F4\n", -"/oneoldstyle 16#F731\n", -"/oneparen 16#2474\n", -"/oneperiod 16#2488\n", -"/onepersian 16#06F1\n", -"/onequarter 16#00BC\n", -"/oneroman 16#2170\n", -"/onesuperior 16#00B9\n", -"/onethai 16#0E51\n", -"/onethird 16#2153\n", -"/oogonek 16#01EB\n", -"/oogonekmacron 16#01ED\n", -"/oogurmukhi 16#0A13\n", -"/oomatragurmukhi 16#0A4B\n", -"/oopen 16#0254\n", -"/oparen 16#24AA\n", -"/openbullet 16#25E6\n", -"/option 16#2325\n", -"/ordfeminine 16#00AA\n", -"/ordmasculine 16#00BA\n", -"/orthogonal 16#221F\n", -"/oshortdeva 16#0912\n", -"/oshortvowelsigndeva 16#094A\n", -"/oslash 16#00F8\n", -"/oslashacute 16#01FF\n", -"/osmallhiragana 16#3049\n", -"/osmallkatakana 16#30A9\n", -"/osmallkatakanahalfwidth 16#FF6B\n", -"/ostrokeacute 16#01FF\n", -"/osuperior 16#F6F0\n", -"/otcyrillic 16#047F\n", -"/otilde 16#00F5\n", -"/otildeacute 16#1E4D\n", -"/otildedieresis 16#1E4F\n", -"/oubopomofo 16#3121\n", -"/overline 16#203E\n", -"/overlinecenterline 16#FE4A\n", -"/overlinecmb 16#0305\n", -"/overlinedashed 16#FE49\n", -"/overlinedblwavy 16#FE4C\n", -"/overlinewavy 16#FE4B\n", -"/overscore 16#00AF\n", -"/ovowelsignbengali 16#09CB\n", -"/ovowelsigndeva 16#094B\n", -"/ovowelsigngujarati 16#0ACB\n", -"/p 16#0070\n", -"/paampssquare 16#3380\n", -"/paasentosquare 16#332B\n", -"/pabengali 16#09AA\n", -"/pacute 16#1E55\n", -"/padeva 16#092A\n", -"/pagedown 16#21DF\n", -"/pageup 16#21DE\n", -"/pagujarati 16#0AAA\n", -"/pagurmukhi 16#0A2A\n", -"/pahiragana 16#3071\n", -"/paiyannoithai 16#0E2F\n", -"/pakatakana 16#30D1\n", -"/palatalizationcyrilliccmb 16#0484\n", -"/palochkacyrillic 16#04C0\n", -"/pansioskorean 16#317F\n", -"/paragraph 16#00B6\n", -"/parallel 16#2225\n", -"/parenleft 16#0028\n", -"/parenleftaltonearabic 16#FD3E\n", -"/parenleftbt 16#F8ED\n", -"/parenleftex 16#F8EC\n", -"/parenleftinferior 16#208D\n", -"/parenleftmonospace 16#FF08\n", -"/parenleftsmall 16#FE59\n", -"/parenleftsuperior 16#207D\n", -"/parenlefttp 16#F8EB\n", -"/parenleftvertical 16#FE35\n", -"/parenright 16#0029\n", -"/parenrightaltonearabic 16#FD3F\n", -"/parenrightbt 16#F8F8\n", -"/parenrightex 16#F8F7\n", -"/parenrightinferior 16#208E\n", -"/parenrightmonospace 16#FF09\n", -"/parenrightsmall 16#FE5A\n", -"/parenrightsuperior 16#207E\n", -"/parenrighttp 16#F8F6\n", -"/parenrightvertical 16#FE36\n", -"/partialdiff 16#2202\n", -"/paseqhebrew 16#05C0\n", -"/pashtahebrew 16#0599\n", -"/pasquare 16#33A9\n", -"/patah 16#05B7\n", -"/patah11 16#05B7\n", -"/patah1d 16#05B7\n", -"/patah2a 16#05B7\n", -"/patahhebrew 16#05B7\n", -"/patahnarrowhebrew 16#05B7\n", -"/patahquarterhebrew 16#05B7\n", -"/patahwidehebrew 16#05B7\n", -"/pazerhebrew 16#05A1\n", -"/pbopomofo 16#3106\n", -"/pcircle 16#24DF\n", -"/pdotaccent 16#1E57\n", -"/pe 16#05E4\n", -"/pecyrillic 16#043F\n", -"/pedagesh 16#FB44\n", -"/pedageshhebrew 16#FB44\n", -"/peezisquare 16#333B\n", -"/pefinaldageshhebrew 16#FB43\n", -"/peharabic 16#067E\n", -"/peharmenian 16#057A\n", -"/pehebrew 16#05E4\n", -"/pehfinalarabic 16#FB57\n", -"/pehinitialarabic 16#FB58\n", -"/pehiragana 16#307A\n", -"/pehmedialarabic 16#FB59\n", -"/pekatakana 16#30DA\n", -"/pemiddlehookcyrillic 16#04A7\n", -"/perafehebrew 16#FB4E\n", -"/percent 16#0025\n", -"/percentarabic 16#066A\n", -"/percentmonospace 16#FF05\n", -"/percentsmall 16#FE6A\n", -"/period 16#002E\n", -"/periodarmenian 16#0589\n", -"/periodcentered 16#00B7\n", -"/periodhalfwidth 16#FF61\n", -"/periodinferior 16#F6E7\n", -"/periodmonospace 16#FF0E\n", -"/periodsmall 16#FE52\n", -"/periodsuperior 16#F6E8\n", -"/perispomenigreekcmb 16#0342\n", -"/perpendicular 16#22A5\n", -"/perthousand 16#2030\n", -"/peseta 16#20A7\n", -"/pfsquare 16#338A\n", -"/phabengali 16#09AB\n", -"/phadeva 16#092B\n", -"/phagujarati 16#0AAB\n", -"/phagurmukhi 16#0A2B\n", -"/phi 16#03C6\n", -"/phi1 16#03D5\n", -"/phieuphacirclekorean 16#327A\n", -"/phieuphaparenkorean 16#321A\n", -"/phieuphcirclekorean 16#326C\n", -"/phieuphkorean 16#314D\n", -"/phieuphparenkorean 16#320C\n", -"/philatin 16#0278\n", -"/phinthuthai 16#0E3A\n", -"/phisymbolgreek 16#03D5\n", -"/phook 16#01A5\n", -"/phophanthai 16#0E1E\n", -"/phophungthai 16#0E1C\n", -"/phosamphaothai 16#0E20\n", -"/pi 16#03C0\n", -"/pieupacirclekorean 16#3273\n", -"/pieupaparenkorean 16#3213\n", -"/pieupcieuckorean 16#3176\n", -"/pieupcirclekorean 16#3265\n", -"/pieupkiyeokkorean 16#3172\n", -"/pieupkorean 16#3142\n", -"/pieupparenkorean 16#3205\n", -"/pieupsioskiyeokkorean 16#3174\n", -"/pieupsioskorean 16#3144\n", -"/pieupsiostikeutkorean 16#3175\n", -"/pieupthieuthkorean 16#3177\n", -"/pieuptikeutkorean 16#3173\n", -"/pihiragana 16#3074\n", -"/pikatakana 16#30D4\n", -"/pisymbolgreek 16#03D6\n", -"/piwrarmenian 16#0583\n", -"/plus 16#002B\n", -"/plusbelowcmb 16#031F\n", -"/pluscircle 16#2295\n", -"/plusminus 16#00B1\n", -"/plusmod 16#02D6\n", -"/plusmonospace 16#FF0B\n", -"/plussmall 16#FE62\n", -"/plussuperior 16#207A\n", -"/pmonospace 16#FF50\n", -"/pmsquare 16#33D8\n", -"/pohiragana 16#307D\n", -"/pointingindexdownwhite 16#261F\n", -"/pointingindexleftwhite 16#261C\n", -"/pointingindexrightwhite 16#261E\n", -"/pointingindexupwhite 16#261D\n", -"/pokatakana 16#30DD\n", -"/poplathai 16#0E1B\n", -"/postalmark 16#3012\n", -"/postalmarkface 16#3020\n", -"/pparen 16#24AB\n", -"/precedes 16#227A\n", -"/prescription 16#211E\n", -"/primemod 16#02B9\n", -"/primereversed 16#2035\n", -"/product 16#220F\n", -"/projective 16#2305\n", -"/prolongedkana 16#30FC\n", -"/propellor 16#2318\n", -"/propersubset 16#2282\n", -"/propersuperset 16#2283\n", -"/proportion 16#2237\n", -"/proportional 16#221D\n", -"/psi 16#03C8\n", -"/psicyrillic 16#0471\n", -"/psilipneumatacyrilliccmb 16#0486\n", -"/pssquare 16#33B0\n", -"/puhiragana 16#3077\n", -"/pukatakana 16#30D7\n", -"/pvsquare 16#33B4\n", -"/pwsquare 16#33BA\n", -"/q 16#0071\n", -"/qadeva 16#0958\n", -"/qadmahebrew 16#05A8\n", -"/qafarabic 16#0642\n", -"/qaffinalarabic 16#FED6\n", -"/qafinitialarabic 16#FED7\n", -"/qafmedialarabic 16#FED8\n", -"/qamats 16#05B8\n", -"/qamats10 16#05B8\n", -"/qamats1a 16#05B8\n", -"/qamats1c 16#05B8\n", -"/qamats27 16#05B8\n", -"/qamats29 16#05B8\n", -"/qamats33 16#05B8\n", -"/qamatsde 16#05B8\n", -"/qamatshebrew 16#05B8\n", -"/qamatsnarrowhebrew 16#05B8\n", -"/qamatsqatanhebrew 16#05B8\n", -"/qamatsqatannarrowhebrew 16#05B8\n", -"/qamatsqatanquarterhebrew 16#05B8\n", -"/qamatsqatanwidehebrew 16#05B8\n", -"/qamatsquarterhebrew 16#05B8\n", -"/qamatswidehebrew 16#05B8\n", -"/qarneyparahebrew 16#059F\n", -"/qbopomofo 16#3111\n", -"/qcircle 16#24E0\n", -"/qhook 16#02A0\n", -"/qmonospace 16#FF51\n", -"/qof 16#05E7\n", -"/qofdagesh 16#FB47\n", -"/qofdageshhebrew 16#FB47\n", -"/qofhebrew 16#05E7\n", -"/qparen 16#24AC\n", -"/quarternote 16#2669\n", -"/qubuts 16#05BB\n", -"/qubuts18 16#05BB\n", -"/qubuts25 16#05BB\n", -"/qubuts31 16#05BB\n", -"/qubutshebrew 16#05BB\n", -"/qubutsnarrowhebrew 16#05BB\n", -"/qubutsquarterhebrew 16#05BB\n", -"/qubutswidehebrew 16#05BB\n", -"/question 16#003F\n", -"/questionarabic 16#061F\n", -"/questionarmenian 16#055E\n", -"/questiondown 16#00BF\n", -"/questiondownsmall 16#F7BF\n", -"/questiongreek 16#037E\n", -"/questionmonospace 16#FF1F\n", -"/questionsmall 16#F73F\n", -"/quotedbl 16#0022\n", -"/quotedblbase 16#201E\n", -"/quotedblleft 16#201C\n", -"/quotedblmonospace 16#FF02\n", -"/quotedblprime 16#301E\n", -"/quotedblprimereversed 16#301D\n", -"/quotedblright 16#201D\n", -"/quoteleft 16#2018\n", -"/quoteleftreversed 16#201B\n", -"/quotereversed 16#201B\n", -"/quoteright 16#2019\n", -"/quoterightn 16#0149\n", -"/quotesinglbase 16#201A\n", -"/quotesingle 16#0027\n", -"/quotesinglemonospace 16#FF07\n", -"/r 16#0072\n", -"/raarmenian 16#057C\n", -"/rabengali 16#09B0\n", -"/racute 16#0155\n", -"/radeva 16#0930\n", -"/radical 16#221A\n", -"/radicalex 16#F8E5\n", -"/radoverssquare 16#33AE\n", -"/radoverssquaredsquare 16#33AF\n", -"/radsquare 16#33AD\n", -"/rafe 16#05BF\n", -"/rafehebrew 16#05BF\n", -"/ragujarati 16#0AB0\n", -"/ragurmukhi 16#0A30\n", -"/rahiragana 16#3089\n", -"/rakatakana 16#30E9\n", -"/rakatakanahalfwidth 16#FF97\n", -"/ralowerdiagonalbengali 16#09F1\n", -"/ramiddlediagonalbengali 16#09F0\n", -"/ramshorn 16#0264\n", -"/ratio 16#2236\n", -"/rbopomofo 16#3116\n", -"/rcaron 16#0159\n", -"/rcedilla 16#0157\n", -"/rcircle 16#24E1\n", -"/rcommaaccent 16#0157\n", -"/rdblgrave 16#0211\n", -"/rdotaccent 16#1E59\n", -"/rdotbelow 16#1E5B\n", -"/rdotbelowmacron 16#1E5D\n", -"/referencemark 16#203B\n", -"/reflexsubset 16#2286\n", -"/reflexsuperset 16#2287\n", -"/registered 16#00AE\n", -"/registersans 16#F8E8\n", -"/registerserif 16#F6DA\n", -"/reharabic 16#0631\n", -"/reharmenian 16#0580\n", -"/rehfinalarabic 16#FEAE\n", -"/rehiragana 16#308C\n", -"/rekatakana 16#30EC\n", -"/rekatakanahalfwidth 16#FF9A\n", -"/resh 16#05E8\n", -"/reshdageshhebrew 16#FB48\n", -"/reshhebrew 16#05E8\n", -"/reversedtilde 16#223D\n", -"/reviahebrew 16#0597\n", -"/reviamugrashhebrew 16#0597\n", -"/revlogicalnot 16#2310\n", -"/rfishhook 16#027E\n", -"/rfishhookreversed 16#027F\n", -"/rhabengali 16#09DD\n", -"/rhadeva 16#095D\n", -"/rho 16#03C1\n", -"/rhook 16#027D\n", -"/rhookturned 16#027B\n", -"/rhookturnedsuperior 16#02B5\n", -"/rhosymbolgreek 16#03F1\n", -"/rhotichookmod 16#02DE\n", -"/rieulacirclekorean 16#3271\n", -"/rieulaparenkorean 16#3211\n", -"/rieulcirclekorean 16#3263\n", -"/rieulhieuhkorean 16#3140\n", -"/rieulkiyeokkorean 16#313A\n", -"/rieulkiyeoksioskorean 16#3169\n", -"/rieulkorean 16#3139\n", -"/rieulmieumkorean 16#313B\n", -"/rieulpansioskorean 16#316C\n", -"/rieulparenkorean 16#3203\n", -"/rieulphieuphkorean 16#313F\n", -"/rieulpieupkorean 16#313C\n", -"/rieulpieupsioskorean 16#316B\n", -"/rieulsioskorean 16#313D\n", -"/rieulthieuthkorean 16#313E\n", -"/rieultikeutkorean 16#316A\n", -"/rieulyeorinhieuhkorean 16#316D\n", -"/rightangle 16#221F\n", -"/righttackbelowcmb 16#0319\n", -"/righttriangle 16#22BF\n", -"/rihiragana 16#308A\n", -"/rikatakana 16#30EA\n", -"/rikatakanahalfwidth 16#FF98\n", -"/ring 16#02DA\n", -"/ringbelowcmb 16#0325\n", -"/ringcmb 16#030A\n", -"/ringhalfleft 16#02BF\n", -"/ringhalfleftarmenian 16#0559\n", -"/ringhalfleftbelowcmb 16#031C\n", -"/ringhalfleftcentered 16#02D3\n", -"/ringhalfright 16#02BE\n", -"/ringhalfrightbelowcmb 16#0339\n", -"/ringhalfrightcentered 16#02D2\n", -"/rinvertedbreve 16#0213\n", -"/rittorusquare 16#3351\n", -"/rlinebelow 16#1E5F\n", -"/rlongleg 16#027C\n", -"/rlonglegturned 16#027A\n", -"/rmonospace 16#FF52\n", -"/rohiragana 16#308D\n", -"/rokatakana 16#30ED\n", -"/rokatakanahalfwidth 16#FF9B\n", -"/roruathai 16#0E23\n", -"/rparen 16#24AD\n", -"/rrabengali 16#09DC\n", -"/rradeva 16#0931\n", -"/rragurmukhi 16#0A5C\n", -"/rreharabic 16#0691\n", -"/rrehfinalarabic 16#FB8D\n", -"/rrvocalicbengali 16#09E0\n", -"/rrvocalicdeva 16#0960\n", -"/rrvocalicgujarati 16#0AE0\n", -"/rrvocalicvowelsignbengali 16#09C4\n", -"/rrvocalicvowelsigndeva 16#0944\n", -"/rrvocalicvowelsigngujarati 16#0AC4\n", -"/rsuperior 16#F6F1\n", -"/rtblock 16#2590\n", -"/rturned 16#0279\n", -"/rturnedsuperior 16#02B4\n", -"/ruhiragana 16#308B\n", -"/rukatakana 16#30EB\n", -"/rukatakanahalfwidth 16#FF99\n", -"/rupeemarkbengali 16#09F2\n", -"/rupeesignbengali 16#09F3\n", -"/rupiah 16#F6DD\n", -"/ruthai 16#0E24\n", -"/rvocalicbengali 16#098B\n", -"/rvocalicdeva 16#090B\n", -"/rvocalicgujarati 16#0A8B\n", -"/rvocalicvowelsignbengali 16#09C3\n", -"/rvocalicvowelsigndeva 16#0943\n", -"/rvocalicvowelsigngujarati 16#0AC3\n", -"/s 16#0073\n", -"/sabengali 16#09B8\n", -"/sacute 16#015B\n", -"/sacutedotaccent 16#1E65\n", -"/sadarabic 16#0635\n", -"/sadeva 16#0938\n", -"/sadfinalarabic 16#FEBA\n", -"/sadinitialarabic 16#FEBB\n", -"/sadmedialarabic 16#FEBC\n", -"/sagujarati 16#0AB8\n", -"/sagurmukhi 16#0A38\n", -"/sahiragana 16#3055\n", -"/sakatakana 16#30B5\n", -"/sakatakanahalfwidth 16#FF7B\n", -"/sallallahoualayhewasallamarabic 16#FDFA\n", -"/samekh 16#05E1\n", -"/samekhdagesh 16#FB41\n", -"/samekhdageshhebrew 16#FB41\n", -"/samekhhebrew 16#05E1\n", -"/saraaathai 16#0E32\n", -"/saraaethai 16#0E41\n", -"/saraaimaimalaithai 16#0E44\n", -"/saraaimaimuanthai 16#0E43\n", -"/saraamthai 16#0E33\n", -"/saraathai 16#0E30\n", -"/saraethai 16#0E40\n", -"/saraiileftthai 16#F886\n", -"/saraiithai 16#0E35\n", -"/saraileftthai 16#F885\n", -"/saraithai 16#0E34\n", -"/saraothai 16#0E42\n", -"/saraueeleftthai 16#F888\n", -"/saraueethai 16#0E37\n", -"/saraueleftthai 16#F887\n", -"/sarauethai 16#0E36\n", -"/sarauthai 16#0E38\n", -"/sarauuthai 16#0E39\n", -"/sbopomofo 16#3119\n", -"/scaron 16#0161\n", -"/scarondotaccent 16#1E67\n", -"/scedilla 16#015F\n", -"/schwa 16#0259\n", -"/schwacyrillic 16#04D9\n", -"/schwadieresiscyrillic 16#04DB\n", -"/schwahook 16#025A\n", -"/scircle 16#24E2\n", -"/scircumflex 16#015D\n", -"/scommaaccent 16#0219\n", -"/sdotaccent 16#1E61\n", -"/sdotbelow 16#1E63\n", -"/sdotbelowdotaccent 16#1E69\n", -"/seagullbelowcmb 16#033C\n", -"/second 16#2033\n", -"/secondtonechinese 16#02CA\n", -"/section 16#00A7\n", -"/seenarabic 16#0633\n", -"/seenfinalarabic 16#FEB2\n", -"/seeninitialarabic 16#FEB3\n", -"/seenmedialarabic 16#FEB4\n", -"/segol 16#05B6\n", -"/segol13 16#05B6\n", -"/segol1f 16#05B6\n", -"/segol2c 16#05B6\n", -"/segolhebrew 16#05B6\n", -"/segolnarrowhebrew 16#05B6\n", -"/segolquarterhebrew 16#05B6\n", -"/segoltahebrew 16#0592\n", -"/segolwidehebrew 16#05B6\n", -"/seharmenian 16#057D\n", -"/sehiragana 16#305B\n", -"/sekatakana 16#30BB\n", -"/sekatakanahalfwidth 16#FF7E\n", -"/semicolon 16#003B\n", -"/semicolonarabic 16#061B\n", -"/semicolonmonospace 16#FF1B\n", -"/semicolonsmall 16#FE54\n", -"/semivoicedmarkkana 16#309C\n", -"/semivoicedmarkkanahalfwidth 16#FF9F\n", -"/sentisquare 16#3322\n", -"/sentosquare 16#3323\n", -"/seven 16#0037\n", -"/sevenarabic 16#0667\n", -"/sevenbengali 16#09ED\n", -"/sevencircle 16#2466\n", -"/sevencircleinversesansserif 16#2790\n", -"/sevendeva 16#096D\n", -"/seveneighths 16#215E\n", -"/sevengujarati 16#0AED\n", -"/sevengurmukhi 16#0A6D\n", -"/sevenhackarabic 16#0667\n", -"/sevenhangzhou 16#3027\n", -"/sevenideographicparen 16#3226\n", -"/seveninferior 16#2087\n", -"/sevenmonospace 16#FF17\n", -"/sevenoldstyle 16#F737\n", -"/sevenparen 16#247A\n", -"/sevenperiod 16#248E\n", -"/sevenpersian 16#06F7\n", -"/sevenroman 16#2176\n", -"/sevensuperior 16#2077\n", -"/seventeencircle 16#2470\n", -"/seventeenparen 16#2484\n", -"/seventeenperiod 16#2498\n", -"/seventhai 16#0E57\n", -"/sfthyphen 16#00AD\n", -"/shaarmenian 16#0577\n", -"/shabengali 16#09B6\n", -"/shacyrillic 16#0448\n", -"/shaddaarabic 16#0651\n", -"/shaddadammaarabic 16#FC61\n", -"/shaddadammatanarabic 16#FC5E\n", -"/shaddafathaarabic 16#FC60\n", -"/shaddakasraarabic 16#FC62\n", -"/shaddakasratanarabic 16#FC5F\n", -"/shade 16#2592\n", -"/shadedark 16#2593\n", -"/shadelight 16#2591\n", -"/shademedium 16#2592\n", -"/shadeva 16#0936\n", -"/shagujarati 16#0AB6\n", -"/shagurmukhi 16#0A36\n", -"/shalshelethebrew 16#0593\n", -"/shbopomofo 16#3115\n", -"/shchacyrillic 16#0449\n", -"/sheenarabic 16#0634\n", -"/sheenfinalarabic 16#FEB6\n", -"/sheeninitialarabic 16#FEB7\n", -"/sheenmedialarabic 16#FEB8\n", -"/sheicoptic 16#03E3\n", -"/sheqel 16#20AA\n", -"/sheqelhebrew 16#20AA\n", -"/sheva 16#05B0\n", -"/sheva115 16#05B0\n", -"/sheva15 16#05B0\n", -"/sheva22 16#05B0\n", -"/sheva2e 16#05B0\n", -"/shevahebrew 16#05B0\n", -"/shevanarrowhebrew 16#05B0\n", -"/shevaquarterhebrew 16#05B0\n", -"/shevawidehebrew 16#05B0\n", -"/shhacyrillic 16#04BB\n", -"/shimacoptic 16#03ED\n", -"/shin 16#05E9\n", -"/shindagesh 16#FB49\n", -"/shindageshhebrew 16#FB49\n", -"/shindageshshindot 16#FB2C\n", -"/shindageshshindothebrew 16#FB2C\n", -"/shindageshsindot 16#FB2D\n", -"/shindageshsindothebrew 16#FB2D\n", -"/shindothebrew 16#05C1\n", -"/shinhebrew 16#05E9\n", -"/shinshindot 16#FB2A\n", -"/shinshindothebrew 16#FB2A\n", -"/shinsindot 16#FB2B\n", -"/shinsindothebrew 16#FB2B\n", -"/shook 16#0282\n", -"/sigma 16#03C3\n", -"/sigma1 16#03C2\n", -"/sigmafinal 16#03C2\n", -"/sigmalunatesymbolgreek 16#03F2\n", -"/sihiragana 16#3057\n", -"/sikatakana 16#30B7\n", -"/sikatakanahalfwidth 16#FF7C\n", -"/siluqhebrew 16#05BD\n", -"/siluqlefthebrew 16#05BD\n", -"/similar 16#223C\n", -"/sindothebrew 16#05C2\n", -"/siosacirclekorean 16#3274\n", -"/siosaparenkorean 16#3214\n", -"/sioscieuckorean 16#317E\n", -"/sioscirclekorean 16#3266\n", -"/sioskiyeokkorean 16#317A\n", -"/sioskorean 16#3145\n", -"/siosnieunkorean 16#317B\n", -"/siosparenkorean 16#3206\n", -"/siospieupkorean 16#317D\n", -"/siostikeutkorean 16#317C\n", -"/six 16#0036\n", -"/sixarabic 16#0666\n", -"/sixbengali 16#09EC\n", -"/sixcircle 16#2465\n", -"/sixcircleinversesansserif 16#278F\n", -"/sixdeva 16#096C\n", -"/sixgujarati 16#0AEC\n", -"/sixgurmukhi 16#0A6C\n", -"/sixhackarabic 16#0666\n", -"/sixhangzhou 16#3026\n", -"/sixideographicparen 16#3225\n", -"/sixinferior 16#2086\n", -"/sixmonospace 16#FF16\n", -"/sixoldstyle 16#F736\n", -"/sixparen 16#2479\n", -"/sixperiod 16#248D\n", -"/sixpersian 16#06F6\n", -"/sixroman 16#2175\n", -"/sixsuperior 16#2076\n", -"/sixteencircle 16#246F\n", -"/sixteencurrencydenominatorbengali 16#09F9\n", -"/sixteenparen 16#2483\n", -"/sixteenperiod 16#2497\n", -"/sixthai 16#0E56\n", -"/slash 16#002F\n", -"/slashmonospace 16#FF0F\n", -"/slong 16#017F\n", -"/slongdotaccent 16#1E9B\n", -"/smileface 16#263A\n", -"/smonospace 16#FF53\n", -"/sofpasuqhebrew 16#05C3\n", -"/softhyphen 16#00AD\n", -"/softsigncyrillic 16#044C\n", -"/sohiragana 16#305D\n", -"/sokatakana 16#30BD\n", -"/sokatakanahalfwidth 16#FF7F\n", -"/soliduslongoverlaycmb 16#0338\n", -"/solidusshortoverlaycmb 16#0337\n", -"/sorusithai 16#0E29\n", -"/sosalathai 16#0E28\n", -"/sosothai 16#0E0B\n", -"/sosuathai 16#0E2A\n", -"/space 16#0020\n", -"/spacehackarabic 16#0020\n", -"/spade 16#2660\n", -"/spadesuitblack 16#2660\n", -"/spadesuitwhite 16#2664\n", -"/sparen 16#24AE\n", -"/squarebelowcmb 16#033B\n", -"/squarecc 16#33C4\n", -"/squarecm 16#339D\n", -"/squarediagonalcrosshatchfill 16#25A9\n", -"/squarehorizontalfill 16#25A4\n", -"/squarekg 16#338F\n", -"/squarekm 16#339E\n", -"/squarekmcapital 16#33CE\n", -"/squareln 16#33D1\n", -"/squarelog 16#33D2\n", -"/squaremg 16#338E\n", -"/squaremil 16#33D5\n", -"/squaremm 16#339C\n", -"/squaremsquared 16#33A1\n", -"/squareorthogonalcrosshatchfill 16#25A6\n", -"/squareupperlefttolowerrightfill 16#25A7\n", -"/squareupperrighttolowerleftfill 16#25A8\n", -"/squareverticalfill 16#25A5\n", -"/squarewhitewithsmallblack 16#25A3\n", -"/srsquare 16#33DB\n", -"/ssabengali 16#09B7\n", -"/ssadeva 16#0937\n", -"/ssagujarati 16#0AB7\n", -"/ssangcieuckorean 16#3149\n", -"/ssanghieuhkorean 16#3185\n", -"/ssangieungkorean 16#3180\n", -"/ssangkiyeokkorean 16#3132\n", -"/ssangnieunkorean 16#3165\n", -"/ssangpieupkorean 16#3143\n", -"/ssangsioskorean 16#3146\n", -"/ssangtikeutkorean 16#3138\n", -"/ssuperior 16#F6F2\n", -"/sterling 16#00A3\n", -"/sterlingmonospace 16#FFE1\n", -"/strokelongoverlaycmb 16#0336\n", -"/strokeshortoverlaycmb 16#0335\n", -"/subset 16#2282\n", -"/subsetnotequal 16#228A\n", -"/subsetorequal 16#2286\n", -"/succeeds 16#227B\n", -"/suchthat 16#220B\n", -"/suhiragana 16#3059\n", -"/sukatakana 16#30B9\n", -"/sukatakanahalfwidth 16#FF7D\n", -"/sukunarabic 16#0652\n", -"/summation 16#2211\n", -"/sun 16#263C\n", -"/superset 16#2283\n", -"/supersetnotequal 16#228B\n", -"/supersetorequal 16#2287\n", -"/svsquare 16#33DC\n", -"/syouwaerasquare 16#337C\n", -"/t 16#0074\n", -"/tabengali 16#09A4\n", -"/tackdown 16#22A4\n", -"/tackleft 16#22A3\n", -"/tadeva 16#0924\n", -"/tagujarati 16#0AA4\n", -"/tagurmukhi 16#0A24\n", -"/taharabic 16#0637\n", -"/tahfinalarabic 16#FEC2\n", -"/tahinitialarabic 16#FEC3\n", -"/tahiragana 16#305F\n", -"/tahmedialarabic 16#FEC4\n", -"/taisyouerasquare 16#337D\n", -"/takatakana 16#30BF\n", -"/takatakanahalfwidth 16#FF80\n", -"/tatweelarabic 16#0640\n", -"/tau 16#03C4\n", -"/tav 16#05EA\n", -"/tavdages 16#FB4A\n", -"/tavdagesh 16#FB4A\n", -"/tavdageshhebrew 16#FB4A\n", -"/tavhebrew 16#05EA\n", -"/tbar 16#0167\n", -"/tbopomofo 16#310A\n", -"/tcaron 16#0165\n", -"/tccurl 16#02A8\n", -"/tcedilla 16#0163\n", -"/tcheharabic 16#0686\n", -"/tchehfinalarabic 16#FB7B\n", -"/tchehinitialarabic 16#FB7C\n", -"/tchehmedialarabic 16#FB7D\n", -"/tcircle 16#24E3\n", -"/tcircumflexbelow 16#1E71\n", -"/tcommaaccent 16#0163\n", -"/tdieresis 16#1E97\n", -"/tdotaccent 16#1E6B\n", -"/tdotbelow 16#1E6D\n", -"/tecyrillic 16#0442\n", -"/tedescendercyrillic 16#04AD\n", -"/teharabic 16#062A\n", -"/tehfinalarabic 16#FE96\n", -"/tehhahinitialarabic 16#FCA2\n", -"/tehhahisolatedarabic 16#FC0C\n", -"/tehinitialarabic 16#FE97\n", -"/tehiragana 16#3066\n", -"/tehjeeminitialarabic 16#FCA1\n", -"/tehjeemisolatedarabic 16#FC0B\n", -"/tehmarbutaarabic 16#0629\n", -"/tehmarbutafinalarabic 16#FE94\n", -"/tehmedialarabic 16#FE98\n", -"/tehmeeminitialarabic 16#FCA4\n", -"/tehmeemisolatedarabic 16#FC0E\n", -"/tehnoonfinalarabic 16#FC73\n", -"/tekatakana 16#30C6\n", -"/tekatakanahalfwidth 16#FF83\n", -"/telephone 16#2121\n", -"/telephoneblack 16#260E\n", -"/telishagedolahebrew 16#05A0\n", -"/telishaqetanahebrew 16#05A9\n", -"/tencircle 16#2469\n", -"/tenideographicparen 16#3229\n", -"/tenparen 16#247D\n", -"/tenperiod 16#2491\n", -"/tenroman 16#2179\n", -"/tesh 16#02A7\n", -"/tet 16#05D8\n", -"/tetdagesh 16#FB38\n", -"/tetdageshhebrew 16#FB38\n", -"/tethebrew 16#05D8\n", -"/tetsecyrillic 16#04B5\n", -"/tevirhebrew 16#059B\n", -"/tevirlefthebrew 16#059B\n", -"/thabengali 16#09A5\n", -"/thadeva 16#0925\n", -"/thagujarati 16#0AA5\n", -"/thagurmukhi 16#0A25\n", -"/thalarabic 16#0630\n", -"/thalfinalarabic 16#FEAC\n", -"/thanthakhatlowleftthai 16#F898\n", -"/thanthakhatlowrightthai 16#F897\n", -"/thanthakhatthai 16#0E4C\n", -"/thanthakhatupperleftthai 16#F896\n", -"/theharabic 16#062B\n", -"/thehfinalarabic 16#FE9A\n", -"/thehinitialarabic 16#FE9B\n", -"/thehmedialarabic 16#FE9C\n", -"/thereexists 16#2203\n", -"/therefore 16#2234\n", -"/theta 16#03B8\n", -"/theta1 16#03D1\n", -"/thetasymbolgreek 16#03D1\n", -"/thieuthacirclekorean 16#3279\n", -"/thieuthaparenkorean 16#3219\n", -"/thieuthcirclekorean 16#326B\n", -"/thieuthkorean 16#314C\n", -"/thieuthparenkorean 16#320B\n", -"/thirteencircle 16#246C\n", -"/thirteenparen 16#2480\n", -"/thirteenperiod 16#2494\n", -"/thonangmonthothai 16#0E11\n", -"/thook 16#01AD\n", -"/thophuthaothai 16#0E12\n", -"/thorn 16#00FE\n", -"/thothahanthai 16#0E17\n", -"/thothanthai 16#0E10\n", -"/thothongthai 16#0E18\n", -"/thothungthai 16#0E16\n", -"/thousandcyrillic 16#0482\n", -"/thousandsseparatorarabic 16#066C\n", -"/thousandsseparatorpersian 16#066C\n", -"/three 16#0033\n", -"/threearabic 16#0663\n", -"/threebengali 16#09E9\n", -"/threecircle 16#2462\n", -"/threecircleinversesansserif 16#278C\n", -"/threedeva 16#0969\n", -"/threeeighths 16#215C\n", -"/threegujarati 16#0AE9\n", -"/threegurmukhi 16#0A69\n", -"/threehackarabic 16#0663\n", -"/threehangzhou 16#3023\n", -"/threeideographicparen 16#3222\n", -"/threeinferior 16#2083\n", -"/threemonospace 16#FF13\n", -"/threenumeratorbengali 16#09F6\n", -"/threeoldstyle 16#F733\n", -"/threeparen 16#2476\n", -"/threeperiod 16#248A\n", -"/threepersian 16#06F3\n", -"/threequarters 16#00BE\n", -"/threequartersemdash 16#F6DE\n", -"/threeroman 16#2172\n", -"/threesuperior 16#00B3\n", -"/threethai 16#0E53\n", -"/thzsquare 16#3394\n", -"/tihiragana 16#3061\n", -"/tikatakana 16#30C1\n", -"/tikatakanahalfwidth 16#FF81\n", -"/tikeutacirclekorean 16#3270\n", -"/tikeutaparenkorean 16#3210\n", -"/tikeutcirclekorean 16#3262\n", -"/tikeutkorean 16#3137\n", -"/tikeutparenkorean 16#3202\n", -"/tilde 16#02DC\n", -"/tildebelowcmb 16#0330\n", -"/tildecmb 16#0303\n", -"/tildecomb 16#0303\n", -"/tildedoublecmb 16#0360\n", -"/tildeoperator 16#223C\n", -"/tildeoverlaycmb 16#0334\n", -"/tildeverticalcmb 16#033E\n", -"/timescircle 16#2297\n", -"/tipehahebrew 16#0596\n", -"/tipehalefthebrew 16#0596\n", -"/tippigurmukhi 16#0A70\n", -"/titlocyrilliccmb 16#0483\n", -"/tiwnarmenian 16#057F\n", -"/tlinebelow 16#1E6F\n", -"/tmonospace 16#FF54\n", -"/toarmenian 16#0569\n", -"/tohiragana 16#3068\n", -"/tokatakana 16#30C8\n", -"/tokatakanahalfwidth 16#FF84\n", -"/tonebarextrahighmod 16#02E5\n", -"/tonebarextralowmod 16#02E9\n", -"/tonebarhighmod 16#02E6\n", -"/tonebarlowmod 16#02E8\n", -"/tonebarmidmod 16#02E7\n", -"/tonefive 16#01BD\n", -"/tonesix 16#0185\n", -"/tonetwo 16#01A8\n", -"/tonos 16#0384\n", -"/tonsquare 16#3327\n", -"/topatakthai 16#0E0F\n", -"/tortoiseshellbracketleft 16#3014\n", -"/tortoiseshellbracketleftsmall 16#FE5D\n", -"/tortoiseshellbracketleftvertical 16#FE39\n", -"/tortoiseshellbracketright 16#3015\n", -"/tortoiseshellbracketrightsmall 16#FE5E\n", -"/tortoiseshellbracketrightvertical 16#FE3A\n", -"/totaothai 16#0E15\n", -"/tpalatalhook 16#01AB\n", -"/tparen 16#24AF\n", -"/trademark 16#2122\n", -"/trademarksans 16#F8EA\n", -"/trademarkserif 16#F6DB\n", -"/tretroflexhook 16#0288\n", -"/triagdn 16#25BC\n", -"/triaglf 16#25C4\n", -"/triagrt 16#25BA\n", -"/triagup 16#25B2\n", -"/ts 16#02A6\n", -"/tsadi 16#05E6\n", -"/tsadidagesh 16#FB46\n", -"/tsadidageshhebrew 16#FB46\n", -"/tsadihebrew 16#05E6\n", -"/tsecyrillic 16#0446\n", -"/tsere 16#05B5\n", -"/tsere12 16#05B5\n", -"/tsere1e 16#05B5\n", -"/tsere2b 16#05B5\n", -"/tserehebrew 16#05B5\n", -"/tserenarrowhebrew 16#05B5\n", -"/tserequarterhebrew 16#05B5\n", -"/tserewidehebrew 16#05B5\n", -"/tshecyrillic 16#045B\n", -"/tsuperior 16#F6F3\n", -"/ttabengali 16#099F\n", -"/ttadeva 16#091F\n", -"/ttagujarati 16#0A9F\n", -"/ttagurmukhi 16#0A1F\n", -"/tteharabic 16#0679\n", -"/ttehfinalarabic 16#FB67\n", -"/ttehinitialarabic 16#FB68\n", -"/ttehmedialarabic 16#FB69\n", -"/tthabengali 16#09A0\n", -"/tthadeva 16#0920\n", -"/tthagujarati 16#0AA0\n", -"/tthagurmukhi 16#0A20\n", -"/tturned 16#0287\n", -"/tuhiragana 16#3064\n", -"/tukatakana 16#30C4\n", -"/tukatakanahalfwidth 16#FF82\n", -"/tusmallhiragana 16#3063\n", -"/tusmallkatakana 16#30C3\n", -"/tusmallkatakanahalfwidth 16#FF6F\n", -"/twelvecircle 16#246B\n", -"/twelveparen 16#247F\n", -"/twelveperiod 16#2493\n", -"/twelveroman 16#217B\n", -"/twentycircle 16#2473\n", -"/twentyhangzhou 16#5344\n", -"/twentyparen 16#2487\n", -"/twentyperiod 16#249B\n", -"/two 16#0032\n", -"/twoarabic 16#0662\n", -"/twobengali 16#09E8\n", -"/twocircle 16#2461\n", -"/twocircleinversesansserif 16#278B\n", -"/twodeva 16#0968\n", -"/twodotenleader 16#2025\n", -"/twodotleader 16#2025\n", -"/twodotleadervertical 16#FE30\n", -"/twogujarati 16#0AE8\n", -"/twogurmukhi 16#0A68\n", -"/twohackarabic 16#0662\n", -"/twohangzhou 16#3022\n", -"/twoideographicparen 16#3221\n", -"/twoinferior 16#2082\n", -"/twomonospace 16#FF12\n", -"/twonumeratorbengali 16#09F5\n", -"/twooldstyle 16#F732\n", -"/twoparen 16#2475\n", -"/twoperiod 16#2489\n", -"/twopersian 16#06F2\n", -"/tworoman 16#2171\n", -"/twostroke 16#01BB\n", -"/twosuperior 16#00B2\n", -"/twothai 16#0E52\n", -"/twothirds 16#2154\n", -"/u 16#0075\n", -"/uacute 16#00FA\n", -"/ubar 16#0289\n", -"/ubengali 16#0989\n", -"/ubopomofo 16#3128\n", -"/ubreve 16#016D\n", -"/ucaron 16#01D4\n", -"/ucircle 16#24E4\n", -"/ucircumflex 16#00FB\n", -"/ucircumflexbelow 16#1E77\n", -"/ucyrillic 16#0443\n", -"/udattadeva 16#0951\n", -"/udblacute 16#0171\n", -"/udblgrave 16#0215\n", -"/udeva 16#0909\n", -"/udieresis 16#00FC\n", -"/udieresisacute 16#01D8\n", -"/udieresisbelow 16#1E73\n", -"/udieresiscaron 16#01DA\n", -"/udieresiscyrillic 16#04F1\n", -"/udieresisgrave 16#01DC\n", -"/udieresismacron 16#01D6\n", -"/udotbelow 16#1EE5\n", -"/ugrave 16#00F9\n", -"/ugujarati 16#0A89\n", -"/ugurmukhi 16#0A09\n", -"/uhiragana 16#3046\n", -"/uhookabove 16#1EE7\n", -"/uhorn 16#01B0\n", -"/uhornacute 16#1EE9\n", -"/uhorndotbelow 16#1EF1\n", -"/uhorngrave 16#1EEB\n", -"/uhornhookabove 16#1EED\n", -"/uhorntilde 16#1EEF\n", -"/uhungarumlaut 16#0171\n", -"/uhungarumlautcyrillic 16#04F3\n", -"/uinvertedbreve 16#0217\n", -"/ukatakana 16#30A6\n", -"/ukatakanahalfwidth 16#FF73\n", -"/ukcyrillic 16#0479\n", -"/ukorean 16#315C\n", -"/umacron 16#016B\n", -"/umacroncyrillic 16#04EF\n", -"/umacrondieresis 16#1E7B\n", -"/umatragurmukhi 16#0A41\n", -"/umonospace 16#FF55\n", -"/underscore 16#005F\n", -"/underscoredbl 16#2017\n", -"/underscoremonospace 16#FF3F\n", -"/underscorevertical 16#FE33\n", -"/underscorewavy 16#FE4F\n", -"/union 16#222A\n", -"/universal 16#2200\n", -"/uogonek 16#0173\n", -"/uparen 16#24B0\n", -"/upblock 16#2580\n", -"/upperdothebrew 16#05C4\n", -"/upsilon 16#03C5\n", -"/upsilondieresis 16#03CB\n", -"/upsilondieresistonos 16#03B0\n", -"/upsilonlatin 16#028A\n", -"/upsilontonos 16#03CD\n", -"/uptackbelowcmb 16#031D\n", -"/uptackmod 16#02D4\n", -"/uragurmukhi 16#0A73\n", -"/uring 16#016F\n", -"/ushortcyrillic 16#045E\n", -"/usmallhiragana 16#3045\n", -"/usmallkatakana 16#30A5\n", -"/usmallkatakanahalfwidth 16#FF69\n", -"/ustraightcyrillic 16#04AF\n", -"/ustraightstrokecyrillic 16#04B1\n", -"/utilde 16#0169\n", -"/utildeacute 16#1E79\n", -"/utildebelow 16#1E75\n", -"/uubengali 16#098A\n", -"/uudeva 16#090A\n", -"/uugujarati 16#0A8A\n", -"/uugurmukhi 16#0A0A\n", -"/uumatragurmukhi 16#0A42\n", -"/uuvowelsignbengali 16#09C2\n", -"/uuvowelsigndeva 16#0942\n", -"/uuvowelsigngujarati 16#0AC2\n", -"/uvowelsignbengali 16#09C1\n", -"/uvowelsigndeva 16#0941\n", -"/uvowelsigngujarati 16#0AC1\n", -"/v 16#0076\n", -"/vadeva 16#0935\n", -"/vagujarati 16#0AB5\n", -"/vagurmukhi 16#0A35\n", -"/vakatakana 16#30F7\n", -"/vav 16#05D5\n", -"/vavdagesh 16#FB35\n", -"/vavdagesh65 16#FB35\n", -"/vavdageshhebrew 16#FB35\n", -"/vavhebrew 16#05D5\n", -"/vavholam 16#FB4B\n", -"/vavholamhebrew 16#FB4B\n", -"/vavvavhebrew 16#05F0\n", -"/vavyodhebrew 16#05F1\n", -"/vcircle 16#24E5\n", -"/vdotbelow 16#1E7F\n", -"/vecyrillic 16#0432\n", -"/veharabic 16#06A4\n", -"/vehfinalarabic 16#FB6B\n", -"/vehinitialarabic 16#FB6C\n", -"/vehmedialarabic 16#FB6D\n", -"/vekatakana 16#30F9\n", -"/venus 16#2640\n", -"/verticalbar 16#007C\n", -"/verticallineabovecmb 16#030D\n", -"/verticallinebelowcmb 16#0329\n", -"/verticallinelowmod 16#02CC\n", -"/verticallinemod 16#02C8\n", -"/vewarmenian 16#057E\n", -"/vhook 16#028B\n", -"/vikatakana 16#30F8\n", -"/viramabengali 16#09CD\n", -"/viramadeva 16#094D\n", -"/viramagujarati 16#0ACD\n", -"/visargabengali 16#0983\n", -"/visargadeva 16#0903\n", -"/visargagujarati 16#0A83\n", -"/vmonospace 16#FF56\n", -"/voarmenian 16#0578\n", -"/voicediterationhiragana 16#309E\n", -"/voicediterationkatakana 16#30FE\n", -"/voicedmarkkana 16#309B\n", -"/voicedmarkkanahalfwidth 16#FF9E\n", -"/vokatakana 16#30FA\n", -"/vparen 16#24B1\n", -"/vtilde 16#1E7D\n", -"/vturned 16#028C\n", -"/vuhiragana 16#3094\n", -"/vukatakana 16#30F4\n", -"/w 16#0077\n", -"/wacute 16#1E83\n", -"/waekorean 16#3159\n", -"/wahiragana 16#308F\n", -"/wakatakana 16#30EF\n", -"/wakatakanahalfwidth 16#FF9C\n", -"/wakorean 16#3158\n", -"/wasmallhiragana 16#308E\n", -"/wasmallkatakana 16#30EE\n", -"/wattosquare 16#3357\n", -"/wavedash 16#301C\n", -"/wavyunderscorevertical 16#FE34\n", -"/wawarabic 16#0648\n", -"/wawfinalarabic 16#FEEE\n", -"/wawhamzaabovearabic 16#0624\n", -"/wawhamzaabovefinalarabic 16#FE86\n", -"/wbsquare 16#33DD\n", -"/wcircle 16#24E6\n", -"/wcircumflex 16#0175\n", -"/wdieresis 16#1E85\n", -"/wdotaccent 16#1E87\n", -"/wdotbelow 16#1E89\n", -"/wehiragana 16#3091\n", -"/weierstrass 16#2118\n", -"/wekatakana 16#30F1\n", -"/wekorean 16#315E\n", -"/weokorean 16#315D\n", -"/wgrave 16#1E81\n", -"/whitebullet 16#25E6\n", -"/whitecircle 16#25CB\n", -"/whitecircleinverse 16#25D9\n", -"/whitecornerbracketleft 16#300E\n", -"/whitecornerbracketleftvertical 16#FE43\n", -"/whitecornerbracketright 16#300F\n", -"/whitecornerbracketrightvertical 16#FE44\n", -"/whitediamond 16#25C7\n", -"/whitediamondcontainingblacksmalldiamond 16#25C8\n", -"/whitedownpointingsmalltriangle 16#25BF\n", -"/whitedownpointingtriangle 16#25BD\n", -"/whiteleftpointingsmalltriangle 16#25C3\n", -"/whiteleftpointingtriangle 16#25C1\n", -"/whitelenticularbracketleft 16#3016\n", -"/whitelenticularbracketright 16#3017\n", -"/whiterightpointingsmalltriangle 16#25B9\n", -"/whiterightpointingtriangle 16#25B7\n", -"/whitesmallsquare 16#25AB\n", -"/whitesmilingface 16#263A\n", -"/whitesquare 16#25A1\n", -"/whitestar 16#2606\n", -"/whitetelephone 16#260F\n", -"/whitetortoiseshellbracketleft 16#3018\n", -"/whitetortoiseshellbracketright 16#3019\n", -"/whiteuppointingsmalltriangle 16#25B5\n", -"/whiteuppointingtriangle 16#25B3\n", -"/wihiragana 16#3090\n", -"/wikatakana 16#30F0\n", -"/wikorean 16#315F\n", -"/wmonospace 16#FF57\n", -"/wohiragana 16#3092\n", -"/wokatakana 16#30F2\n", -"/wokatakanahalfwidth 16#FF66\n", -"/won 16#20A9\n", -"/wonmonospace 16#FFE6\n", -"/wowaenthai 16#0E27\n", -"/wparen 16#24B2\n", -"/wring 16#1E98\n", -"/wsuperior 16#02B7\n", -"/wturned 16#028D\n", -"/wynn 16#01BF\n", -"/x 16#0078\n", -"/xabovecmb 16#033D\n", -"/xbopomofo 16#3112\n", -"/xcircle 16#24E7\n", -"/xdieresis 16#1E8D\n", -"/xdotaccent 16#1E8B\n", -"/xeharmenian 16#056D\n", -"/xi 16#03BE\n", -"/xmonospace 16#FF58\n", -"/xparen 16#24B3\n", -"/xsuperior 16#02E3\n", -"/y 16#0079\n", -"/yaadosquare 16#334E\n", -"/yabengali 16#09AF\n", -"/yacute 16#00FD\n", -"/yadeva 16#092F\n", -"/yaekorean 16#3152\n", -"/yagujarati 16#0AAF\n", -"/yagurmukhi 16#0A2F\n", -"/yahiragana 16#3084\n", -"/yakatakana 16#30E4\n", -"/yakatakanahalfwidth 16#FF94\n", -"/yakorean 16#3151\n", -"/yamakkanthai 16#0E4E\n", -"/yasmallhiragana 16#3083\n", -"/yasmallkatakana 16#30E3\n", -"/yasmallkatakanahalfwidth 16#FF6C\n", -"/yatcyrillic 16#0463\n", -"/ycircle 16#24E8\n", -"/ycircumflex 16#0177\n", -"/ydieresis 16#00FF\n", -"/ydotaccent 16#1E8F\n", -"/ydotbelow 16#1EF5\n", -"/yeharabic 16#064A\n", -"/yehbarreearabic 16#06D2\n", -"/yehbarreefinalarabic 16#FBAF\n", -"/yehfinalarabic 16#FEF2\n", -"/yehhamzaabovearabic 16#0626\n", -"/yehhamzaabovefinalarabic 16#FE8A\n", -"/yehhamzaaboveinitialarabic 16#FE8B\n", -"/yehhamzaabovemedialarabic 16#FE8C\n", -"/yehinitialarabic 16#FEF3\n", -"/yehmedialarabic 16#FEF4\n", -"/yehmeeminitialarabic 16#FCDD\n", -"/yehmeemisolatedarabic 16#FC58\n", -"/yehnoonfinalarabic 16#FC94\n", -"/yehthreedotsbelowarabic 16#06D1\n", -"/yekorean 16#3156\n", -"/yen 16#00A5\n", -"/yenmonospace 16#FFE5\n", -"/yeokorean 16#3155\n", -"/yeorinhieuhkorean 16#3186\n", -"/yerahbenyomohebrew 16#05AA\n", -"/yerahbenyomolefthebrew 16#05AA\n", -"/yericyrillic 16#044B\n", -"/yerudieresiscyrillic 16#04F9\n", -"/yesieungkorean 16#3181\n", -"/yesieungpansioskorean 16#3183\n", -"/yesieungsioskorean 16#3182\n", -"/yetivhebrew 16#059A\n", -"/ygrave 16#1EF3\n", -"/yhook 16#01B4\n", -"/yhookabove 16#1EF7\n", -"/yiarmenian 16#0575\n", -"/yicyrillic 16#0457\n", -"/yikorean 16#3162\n", -"/yinyang 16#262F\n", -"/yiwnarmenian 16#0582\n", -"/ymonospace 16#FF59\n", -"/yod 16#05D9\n", -"/yoddagesh 16#FB39\n", -"/yoddageshhebrew 16#FB39\n", -"/yodhebrew 16#05D9\n", -"/yodyodhebrew 16#05F2\n", -"/yodyodpatahhebrew 16#FB1F\n", -"/yohiragana 16#3088\n", -"/yoikorean 16#3189\n", -"/yokatakana 16#30E8\n", -"/yokatakanahalfwidth 16#FF96\n", -"/yokorean 16#315B\n", -"/yosmallhiragana 16#3087\n", -"/yosmallkatakana 16#30E7\n", -"/yosmallkatakanahalfwidth 16#FF6E\n", -"/yotgreek 16#03F3\n", -"/yoyaekorean 16#3188\n", -"/yoyakorean 16#3187\n", -"/yoyakthai 16#0E22\n", -"/yoyingthai 16#0E0D\n", -"/yparen 16#24B4\n", -"/ypogegrammeni 16#037A\n", -"/ypogegrammenigreekcmb 16#0345\n", -"/yr 16#01A6\n", -"/yring 16#1E99\n", -"/ysuperior 16#02B8\n", -"/ytilde 16#1EF9\n", -"/yturned 16#028E\n", -"/yuhiragana 16#3086\n", -"/yuikorean 16#318C\n", -"/yukatakana 16#30E6\n", -"/yukatakanahalfwidth 16#FF95\n", -"/yukorean 16#3160\n", -"/yusbigcyrillic 16#046B\n", -"/yusbigiotifiedcyrillic 16#046D\n", -"/yuslittlecyrillic 16#0467\n", -"/yuslittleiotifiedcyrillic 16#0469\n", -"/yusmallhiragana 16#3085\n", -"/yusmallkatakana 16#30E5\n", -"/yusmallkatakanahalfwidth 16#FF6D\n", -"/yuyekorean 16#318B\n", -"/yuyeokorean 16#318A\n", -"/yyabengali 16#09DF\n", -"/yyadeva 16#095F\n", -"/z 16#007A\n", -"/zaarmenian 16#0566\n", -"/zacute 16#017A\n", -"/zadeva 16#095B\n", -"/zagurmukhi 16#0A5B\n", -"/zaharabic 16#0638\n", -"/zahfinalarabic 16#FEC6\n", -"/zahinitialarabic 16#FEC7\n", -"/zahiragana 16#3056\n", -"/zahmedialarabic 16#FEC8\n", -"/zainarabic 16#0632\n", -"/zainfinalarabic 16#FEB0\n", -"/zakatakana 16#30B6\n", -"/zaqefgadolhebrew 16#0595\n", -"/zaqefqatanhebrew 16#0594\n", -"/zarqahebrew 16#0598\n", -"/zayin 16#05D6\n", -"/zayindagesh 16#FB36\n", -"/zayindageshhebrew 16#FB36\n", -"/zayinhebrew 16#05D6\n", -"/zbopomofo 16#3117\n", -"/zcaron 16#017E\n", -"/zcircle 16#24E9\n", -"/zcircumflex 16#1E91\n", -"/zcurl 16#0291\n", -"/zdot 16#017C\n", -"/zdotaccent 16#017C\n", -"/zdotbelow 16#1E93\n", -"/zecyrillic 16#0437\n", -"/zedescendercyrillic 16#0499\n", -"/zedieresiscyrillic 16#04DF\n", -"/zehiragana 16#305C\n", -"/zekatakana 16#30BC\n", -"/zero 16#0030\n", -"/zeroarabic 16#0660\n", -"/zerobengali 16#09E6\n", -"/zerodeva 16#0966\n", -"/zerogujarati 16#0AE6\n", -"/zerogurmukhi 16#0A66\n", -"/zerohackarabic 16#0660\n", -"/zeroinferior 16#2080\n", -"/zeromonospace 16#FF10\n", -"/zerooldstyle 16#F730\n", -"/zeropersian 16#06F0\n", -"/zerosuperior 16#2070\n", -"/zerothai 16#0E50\n", -"/zerowidthjoiner 16#FEFF\n", -"/zerowidthnonjoiner 16#200C\n", -"/zerowidthspace 16#200B\n", -"/zeta 16#03B6\n", -"/zhbopomofo 16#3113\n", -"/zhearmenian 16#056A\n", -"/zhebrevecyrillic 16#04C2\n", -"/zhecyrillic 16#0436\n", -"/zhedescendercyrillic 16#0497\n", -"/zhedieresiscyrillic 16#04DD\n", -"/zihiragana 16#3058\n", -"/zikatakana 16#30B8\n", -"/zinorhebrew 16#05AE\n", -"/zlinebelow 16#1E95\n", -"/zmonospace 16#FF5A\n", -"/zohiragana 16#305E\n", -"/zokatakana 16#30BE\n", -"/zparen 16#24B5\n", -"/zretroflexhook 16#0290\n", -"/zstroke 16#01B6\n", -"/zuhiragana 16#305A\n", -"/zukatakana 16#30BA\n", -".dicttomark readonly def\n", -0x00 -}; diff -Nru ghostscript-9.04~dfsg/base/gsalloc.c ghostscript-9.05~dfsg~20120125/base/gsalloc.c --- ghostscript-9.04~dfsg/base/gsalloc.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsalloc.c 2011-09-29 11:01:33.000000000 +0000 @@ -537,6 +537,11 @@ obj_header_t *obj; obj_header_t **pfl; +#ifdef MEMENTO + if (Memento_failThisEvent()) + return NULL; +#endif + IF_FREELIST_ALLOC(obj, imem, size, &st_bytes, pfl) alloc_trace(":+bf", imem, cname, NULL, size, obj); ELSEIF_BIG_FREELIST_ALLOC(obj, imem, size, &st_bytes) @@ -559,9 +564,15 @@ i_alloc_bytes_immovable(gs_memory_t * mem, uint size, client_name_t cname) { gs_ref_memory_t * const imem = (gs_ref_memory_t *)mem; - obj_header_t *obj = alloc_obj(imem, size, &st_bytes, - ALLOC_IMMOVABLE | ALLOC_DIRECT, cname); + obj_header_t *obj; +#ifdef MEMENTO + if (Memento_failThisEvent()) + return NULL; +#endif + + obj = alloc_obj(imem, size, &st_bytes, + ALLOC_IMMOVABLE | ALLOC_DIRECT, cname); if (obj == 0) return 0; alloc_trace("|+b.", imem, cname, NULL, size, obj); @@ -576,6 +587,11 @@ obj_header_t *obj; obj_header_t **pfl; +#ifdef MEMENTO + if (Memento_failThisEvent()) + return NULL; +#endif + ALLOC_CHECK_SIZE(pstype); IF_FREELIST_ALLOC(obj, imem, size, pstype, pfl) alloc_trace(":+ssize; obj_header_t *obj; +#ifdef MEMENTO + if (Memento_failThisEvent()) + return NULL; +#endif + ALLOC_CHECK_SIZE(pstype); obj = alloc_obj(imem, size, pstype, ALLOC_IMMOVABLE | ALLOC_DIRECT, cname); alloc_trace("|+<.", imem, cname, pstype, size, obj); @@ -613,8 +634,15 @@ client_name_t cname) { gs_ref_memory_t * const imem = (gs_ref_memory_t *)mem; - obj_header_t *obj = alloc_obj(imem, (ulong) num_elements * elt_size, - &st_bytes, ALLOC_DIRECT, cname); + obj_header_t *obj; + +#ifdef MEMENTO + if (Memento_failThisEvent()) + return NULL; +#endif + + obj = alloc_obj(imem, (ulong) num_elements * elt_size, + &st_bytes, ALLOC_DIRECT, cname); if_debug6('A', "[a%d:+b.]%s -bytes-*(%lu=%u*%u) = 0x%lx\n", alloc_trace_space(imem), client_name_string(cname), @@ -627,9 +655,16 @@ uint elt_size, client_name_t cname) { gs_ref_memory_t * const imem = (gs_ref_memory_t *)mem; - obj_header_t *obj = alloc_obj(imem, (ulong) num_elements * elt_size, - &st_bytes, ALLOC_IMMOVABLE | ALLOC_DIRECT, - cname); + obj_header_t *obj; + +#ifdef MEMENTO + if (Memento_failThisEvent()) + return NULL; +#endif + + obj = alloc_obj(imem, (ulong) num_elements * elt_size, + &st_bytes, ALLOC_IMMOVABLE | ALLOC_DIRECT, + cname); if_debug6('A', "[a%d|+b.]%s -bytes-*(%lu=%u*%u) = 0x%lx\n", alloc_trace_space(imem), client_name_string(cname), @@ -644,6 +679,11 @@ gs_ref_memory_t * const imem = (gs_ref_memory_t *)mem; obj_header_t *obj; +#ifdef MEMENTO + if (Memento_failThisEvent()) + return NULL; +#endif + ALLOC_CHECK_SIZE(pstype); #ifdef DEBUG if (pstype->enum_ptrs == basic_enum_ptrs) { @@ -669,6 +709,11 @@ gs_ref_memory_t * const imem = (gs_ref_memory_t *)mem; obj_header_t *obj; +#ifdef MEMENTO + if (Memento_failThisEvent()) + return NULL; +#endif + ALLOC_CHECK_SIZE(pstype); obj = alloc_obj(imem, (ulong) num_elements * pstype->ssize, @@ -693,6 +738,11 @@ ulong new_size_rounded = obj_align_round(new_size); void *new_obj = NULL; +#ifdef MEMENTO + if (Memento_failThisEvent()) + return NULL; +#endif + if (old_size_rounded == new_size_rounded) { pp->o_size = new_size; new_obj = obj; @@ -793,7 +843,7 @@ if_debug3('u', "[u]finalizing %s 0x%lx (%s)\n", struct_type_name_string(pstype), (ulong) ptr, client_name_string(cname)); - (*finalize) (ptr); + (*finalize) (mem, ptr); if (gs_debug['a'] || gs_debug['A']) pstype = &saved_stype; @@ -881,12 +931,17 @@ { gs_ref_memory_t * const imem = (gs_ref_memory_t *)mem; byte *str; + /* * Cycle through the chunks at the current save level, starting * with the currently open one. */ chunk_t *cp_orig = imem->pcc; +#ifdef MEMENTO + if (Memento_failThisEvent()) + return NULL; +#endif if (cp_orig == 0) { /* Open an arbitrary chunk. */ cp_orig = imem->pcc = imem->cfirst; @@ -939,9 +994,16 @@ { gs_ref_memory_t * const imem = (gs_ref_memory_t *)mem; byte *str; + uint asize; + chunk_t *cp; + +#ifdef MEMENTO + if (Memento_failThisEvent()) + return NULL; +#endif /* Give it a chunk all its own. */ - uint asize = string_chunk_space(nbytes) + sizeof(chunk_head_t); - chunk_t *cp = alloc_acquire_chunk(imem, (ulong) asize, true, + asize = string_chunk_space(nbytes) + sizeof(chunk_head_t); + cp = alloc_acquire_chunk(imem, (ulong) asize, true, "large string chunk"); if (cp == 0) diff -Nru ghostscript-9.04~dfsg/base/gsbitops.c ghostscript-9.05~dfsg~20120125/base/gsbitops.c --- ghostscript-9.04~dfsg/base/gsbitops.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsbitops.c 2011-09-29 11:01:33.000000000 +0000 @@ -16,7 +16,6 @@ #include "stdio_.h" #include "memory_.h" #include "gdebug.h" -#include "gserror.h" #include "gserrors.h" #include "gstypes.h" #include "gsbittab.h" @@ -224,7 +223,7 @@ ++ptr; for (i = 0; i < last; i++, ptr++) *ptr = (*ptr & src_mask) | pattern; - *ptr = (*ptr & ~right_mask) | (pattern & right_mask); ); + *ptr = (*ptr & ~right_mask) | (pattern & right_mask); ); } } } diff -Nru ghostscript-9.04~dfsg/base/gscdef.c ghostscript-9.05~dfsg~20120125/base/gscdef.c --- ghostscript-9.04~dfsg/base/gscdef.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gscdef.c 2011-09-29 11:01:33.000000000 +0000 @@ -31,7 +31,7 @@ #ifndef GS_COPYRIGHT # define GS_COPYRIGHT\ - "Copyright (C) 2011 Artifex Software, Inc. All rights reserved." + "Copyright (C) 2010 Artifex Software, Inc. All rights reserved." #endif const char *const gs_copyright = GS_COPYRIGHT; @@ -43,7 +43,7 @@ #ifndef GS_PRODUCT # define GS_PRODUCT\ - GS_PRODUCTFAMILY "" + GS_PRODUCTFAMILY " GIT PRERELEASE" #endif const char *const gs_product = GS_PRODUCT; diff -Nru ghostscript-9.04~dfsg/base/gscdevn.c ghostscript-9.05~dfsg~20120125/base/gscdevn.c --- ghostscript-9.04~dfsg/base/gscdevn.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gscdevn.c 2011-09-29 11:01:33.000000000 +0000 @@ -384,7 +384,7 @@ { int code, tcode = 0; gs_client_color cc; - const gs_color_space *pacs = pcs->base_space; + gs_color_space *pacs = (gs_color_space*) (pcs->base_space); gs_device_n_map *map = pcs->params.device_n.map; bool is_lab; @@ -587,7 +587,14 @@ gx_set_overprint_DeviceN(const gs_color_space * pcs, gs_state * pgs) { gs_devicen_color_map * pcmap = &pgs->color_component_map; + int code; + /* It is possible that the color map information in the graphic state + is not current due to save/restore and or if we are coming from + a color space that is inside a PatternType 2 */ + code = check_DeviceN_component_names(pcs, pgs); + if (code < 0) + return code; if (pcmap->use_alt_cspace) { const gs_color_space_type* base_type = pcs->base_space->type; diff -Nru ghostscript-9.04~dfsg/base/gscencs.c ghostscript-9.05~dfsg~20120125/base/gscencs.c --- ghostscript-9.04~dfsg/base/gscencs.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gscencs.c 2011-09-29 11:01:33.000000000 +0000 @@ -17,7 +17,6 @@ #include "memory_.h" #include "gscedata.h" #include "gscencs.h" -#include "gserror.h" #include "gserrors.h" /* diff -Nru ghostscript-9.04~dfsg/base/gscicach.c ghostscript-9.05~dfsg~20120125/base/gscicach.c --- ghostscript-9.04~dfsg/base/gscicach.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gscicach.c 2011-11-12 18:29:08.000000000 +0000 @@ -109,14 +109,14 @@ } static inline int -hash_paint_values(const gs_color_index_cache_t *this, const float *paint_values) +hash_paint_values(const gs_color_index_cache_t *self, const float *paint_values) { int i; float v = 0; uint k = 0; const uint a_prime = 79; - for (i = 0; i < this->client_num_components; i++) + for (i = 0; i < self->client_num_components; i++) v = v * a_prime + paint_values[i]; /* Don't know the range of v, so hash its bytes : */ for(i = 0; i < sizeof(v); i++) @@ -125,88 +125,88 @@ } static inline void -exclude_from_chain(gs_color_index_cache_t *this, uint i) +exclude_from_chain(gs_color_index_cache_t *self, uint i) { - uint co = this->buf[i].chain; - uint ip = this->buf[i].prev, in = this->buf[i].next; + uint co = self->buf[i].chain; + uint ip = self->buf[i].prev, in = self->buf[i].next; - this->buf[ip].next = in; - this->buf[in].prev = ip; - if (this->chains[co] == i) - this->chains[co] = in; + self->buf[ip].next = in; + self->buf[in].prev = ip; + if (self->chains[co] == i) + self->chains[co] = in; } static inline void -include_into_chain(gs_color_index_cache_t *this, uint i, uint c) +include_into_chain(gs_color_index_cache_t *self, uint i, uint c) { - if (this->chains[c] != MYNULL) { - uint in = this->chains[c], ip = this->buf[in].prev; + if (self->chains[c] != MYNULL) { + uint in = self->chains[c], ip = self->buf[in].prev; - this->buf[i].next = in; - this->buf[i].prev = ip; - this->buf[in].prev = i; - this->buf[ip].next = i; + self->buf[i].next = in; + self->buf[i].prev = ip; + self->buf[in].prev = i; + self->buf[ip].next = i; } else - this->buf[i].prev = this->buf[i].next = i; - this->chains[c] = i; - this->buf[i].chain = c; + self->buf[i].prev = self->buf[i].next = i; + self->chains[c] = i; + self->buf[i].chain = c; } static inline void -exclude_from_touch_list(gs_color_index_cache_t *this, uint i) +exclude_from_touch_list(gs_color_index_cache_t *self, uint i) { - uint ip = this->buf[i].touch_prev, in = this->buf[i].touch_next; + uint ip = self->buf[i].touch_prev, in = self->buf[i].touch_next; - this->buf[ip].touch_next = in; - this->buf[in].touch_prev = ip; - if (this->recent_touch == i) { + self->buf[ip].touch_next = in; + self->buf[in].touch_prev = ip; + if (self->recent_touch == i) { if (i == in) - this->recent_touch = MYNULL; + self->recent_touch = MYNULL; else - this->recent_touch = in; + self->recent_touch = in; } } static inline void -include_into_touch_list(gs_color_index_cache_t *this, uint i) +include_into_touch_list(gs_color_index_cache_t *self, uint i) { - if (this->recent_touch != MYNULL) { - uint in = this->recent_touch, ip = this->buf[in].touch_prev; + if (self->recent_touch != MYNULL) { + uint in = self->recent_touch, ip = self->buf[in].touch_prev; - this->buf[i].touch_next = in; - this->buf[i].touch_prev = ip; - this->buf[in].touch_prev = i; - this->buf[ip].touch_next = i; + self->buf[i].touch_next = in; + self->buf[i].touch_prev = ip; + self->buf[in].touch_prev = i; + self->buf[ip].touch_next = i; } else - this->buf[i].touch_prev = this->buf[i].touch_next = i; - this->recent_touch = i; + self->buf[i].touch_prev = self->buf[i].touch_next = i; + self->recent_touch = i; } static int -get_color_index_cache_elem(gs_color_index_cache_t *this, const float *paint_values, uint *pi) +get_color_index_cache_elem(gs_color_index_cache_t *self, const float *paint_values, uint *pi) { - int client_num_components = this->client_num_components; - uint c = hash_paint_values(this, paint_values); - uint i = this->chains[c], j; + int client_num_components = self->client_num_components; + uint c = hash_paint_values(self, paint_values); + uint i = self->chains[c], j; if (i != MYNULL) { uint tries = 16; /* Arbitrary. */ - if (!memcmp(paint_values, this->paint_values + i * client_num_components, sizeof(*paint_values) * client_num_components)) { - if (this->recent_touch != i) { - exclude_from_touch_list(this, i); - include_into_touch_list(this, i); + if (!memcmp(paint_values, self->paint_values + i * client_num_components, sizeof(*paint_values) * client_num_components)) { + if (self->recent_touch != i) { + exclude_from_touch_list(self, i); + include_into_touch_list(self, i); } *pi = i; return 1; } - for (j = this->buf[i].next; tries -- && j != i; j = this->buf[j].next) { - if (!memcmp(paint_values, this->paint_values + j * client_num_components, sizeof(*paint_values) * client_num_components)) { - exclude_from_chain(this, j); - include_into_chain(this, j, c); - if (this->recent_touch != j) { - exclude_from_touch_list(this, j); - include_into_touch_list(this, j); + for (j = self->buf[i].next; tries -- && j != i; j = self->buf[j].next) { + if (!memcmp(paint_values, self->paint_values + j * client_num_components, sizeof(*paint_values) * client_num_components)) { + exclude_from_chain(self, j); + include_into_chain(self, j, c); + if (self->recent_touch != j) { + exclude_from_touch_list(self, j); + include_into_touch_list(self, j); } *pi = j; return 1; @@ -214,80 +214,80 @@ } tries+=0; } - if (this->used < COLOR_INDEX_CACHE_SIZE) { + if (self->used < COLOR_INDEX_CACHE_SIZE) { /* Use a new one */ - i = this->used++; - include_into_touch_list(this, i); + i = self->used++; + include_into_touch_list(self, i); } else { - i = this->recent_touch; - this->recent_touch = this->buf[i].touch_prev; /* Assuming the cyclic list, + i = self->recent_touch; + self->recent_touch = self->buf[i].touch_prev; /* Assuming the cyclic list, just move the head pointer to the last element. */ - exclude_from_chain(this, i); + exclude_from_chain(self, i); } - include_into_chain(this, i, c); + include_into_chain(self, i, c); *pi = i; return 0; } static inline void -compute_frac_values(gs_color_index_cache_t *this, uint i) +compute_frac_values(gs_color_index_cache_t *self, uint i) { - gx_color_index c = this->buf[i].cindex; - const gx_device_color_info *cinfo = &this->trans_dev->color_info; - int device_num_components = this->device_num_components; + gx_color_index c = self->buf[i].cindex; + const gx_device_color_info *cinfo = &self->trans_dev->color_info; + int device_num_components = self->device_num_components; int j; for (j = 0; j < device_num_components; j++) { int shift = cinfo->comp_shift[j]; int bits = cinfo->comp_bits[j]; - this->frac_values[i * device_num_components + j] = ((c >> shift) & ((1 << bits) - 1)) << (sizeof(frac31) * 8 - 1 - bits); + self->frac_values[i * device_num_components + j] = ((c >> shift) & ((1 << bits) - 1)) << (sizeof(frac31) * 8 - 1 - bits); } - this->buf[i].frac_values_done = true; + self->buf[i].frac_values_done = true; } int -gs_cached_color_index(gs_color_index_cache_t *this, const float *paint_values, gx_device_color *pdevc, frac31 *frac_values) +gs_cached_color_index(gs_color_index_cache_t *self, const float *paint_values, gx_device_color *pdevc, frac31 *frac_values) { /* Must return 2 if the color is not pure. See patch_color_to_device_color. */ - const gs_color_space *pcs = this->direct_space; - int client_num_components = this->client_num_components; - int device_num_components = this->device_num_components; + const gs_color_space *pcs = self->direct_space; + int client_num_components = self->client_num_components; + int device_num_components = self->device_num_components; uint i; int code; - if (get_color_index_cache_elem(this, paint_values, &i)) { + if (get_color_index_cache_elem(self, paint_values, &i)) { if (pdevc != NULL) { - pdevc->colors.pure = this->buf[i].cindex; + pdevc->colors.pure = self->buf[i].cindex; pdevc->type = &gx_dc_type_data_pure; memcpy(pdevc->ccolor.paint.values, paint_values, sizeof(*paint_values) * client_num_components); pdevc->ccolor_valid = true; } - if (frac_values != NULL && !this->buf[i].frac_values_done) - compute_frac_values(this, i); + if (frac_values != NULL && !self->buf[i].frac_values_done) + compute_frac_values(self, i); } else { gx_device_color devc_local; gs_client_color fcc; if (pdevc == NULL) pdevc = &devc_local; - memcpy(this->paint_values + i * client_num_components, paint_values, sizeof(*paint_values) * client_num_components); + memcpy(self->paint_values + i * client_num_components, paint_values, sizeof(*paint_values) * client_num_components); memcpy(fcc.paint.values, paint_values, sizeof(*paint_values) * client_num_components); - code = pcs->type->remap_color(&fcc, pcs, pdevc, this->pis, this->trans_dev, + code = pcs->type->remap_color(&fcc, pcs, pdevc, self->pis, self->trans_dev, gs_color_select_texture); if (code < 0) return code; if (pdevc->type != &gx_dc_type_data_pure) return 2; - this->buf[i].cindex = pdevc->colors.pure; + self->buf[i].cindex = pdevc->colors.pure; if (frac_values != NULL) - compute_frac_values(this, i); + compute_frac_values(self, i); else - this->buf[i].frac_values_done = false; + self->buf[i].frac_values_done = false; } if (frac_values != NULL) - memcpy(frac_values, this->frac_values + i * device_num_components, sizeof(*frac_values) * device_num_components); + memcpy(frac_values, self->frac_values + i * device_num_components, sizeof(*frac_values) * device_num_components); return 0; } diff -Nru ghostscript-9.04~dfsg/base/gsciemap.c ghostscript-9.05~dfsg~20120125/base/gsciemap.c --- ghostscript-9.04~dfsg/base/gsciemap.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsciemap.c 2012-01-07 20:18:22.000000000 +0000 @@ -146,8 +146,8 @@ } static void -rescale_input_color(gs_range *ranges, int num_colorants, gs_client_color *src, - gs_client_color *des) +rescale_input_color(gs_range *ranges, int num_colorants, + const gs_client_color *src, gs_client_color *des) { int k; @@ -199,6 +199,7 @@ gx_cie_scalar_cache *lmn_caches = &(pcs->params.abc->common.caches.DecodeLMN[0]); gx_cie_scalar_cache *defg_caches = &(pcs->params.defg->caches_defg.DecodeDEFG[0]); + if_debug0(gs_debug_flag_icc,"[icc] Creating ICC profile from defg object"); /* build the ICC color space object */ code = gs_cspace_build_ICC(ppcs_icc, NULL, memory->stable_memory); /* record the cie alt space as the icc alternative color space */ @@ -211,17 +212,19 @@ gsicc_init_profile_info((*ppcs_icc)->cmm_icc_profile_data); (*ppcs_icc)->cmm_icc_profile_data->default_match = CIE_DEFG; pcs->icc_equivalent = *ppcs_icc; + pcs->icc_equivalent->cmm_icc_profile_data->data_cs = gsCMYK; return(0); } int -gx_remap_CIEDEFG(const gs_client_color * pc, const gs_color_space * pcs, +gx_remap_CIEDEFG(const gs_client_color * pc, const gs_color_space * pcs_in, gx_device_color * pdc, const gs_imager_state * pis, gx_device * dev, gs_color_select_t select) { gs_color_space *pcs_icc; int code, i; gs_client_color scale_pc; + gs_color_space *pcs = (gs_color_space *) pcs_in; if_debug4('c', "[c]remap CIEDEFG [%g %g %g %g]\n", pc->paint.values[0], pc->paint.values[1], @@ -252,13 +255,13 @@ /* Render a CIEBasedDEFG color. */ int -gx_concretize_CIEDEFG(const gs_client_color * pc, const gs_color_space * pcs, +gx_concretize_CIEDEFG(const gs_client_color * pc, const gs_color_space * pcs_in, frac * pconc, const gs_imager_state * pis, gx_device *dev) { - const gs_cie_defg *pcie = pcs->params.defg; int code; gs_color_space *pcs_icc; gs_client_color scale_pc; + gs_color_space *pcs = (gs_color_space *) pcs_in; if_debug4('c', "[c]concretize DEFG [%g %g %g %g]\n", pc->paint.values[0], pc->paint.values[1], @@ -467,6 +470,7 @@ gx_cie_scalar_cache *lmn_caches = &(pcs->params.abc->common.caches.DecodeLMN[0]); gx_cie_scalar_cache *def_caches = &(pcs->params.def->caches_def.DecodeDEF[0]); + if_debug0(gs_debug_flag_icc,"[icc] Creating ICC profile from def object"); /* build the ICC color space object */ code = gs_cspace_build_ICC(ppcs_icc, NULL, memory->stable_memory); /* record the cie alt space as the icc alternative color space */ @@ -480,17 +484,19 @@ (*ppcs_icc)->cmm_icc_profile_data->default_match = CIE_DEF; /* Assign to the icc_equivalent member variable */ pcs->icc_equivalent = *ppcs_icc; + pcs->icc_equivalent->cmm_icc_profile_data->data_cs = gsUNDEFINED; return(0); } int -gx_remap_CIEDEF(const gs_client_color * pc, const gs_color_space * pcs, +gx_remap_CIEDEF(const gs_client_color * pc, const gs_color_space * pcs_in, gx_device_color * pdc, const gs_imager_state * pis, gx_device * dev, gs_color_select_t select) { gs_color_space *pcs_icc; gs_client_color scale_pc; int i,code; + gs_color_space *pcs = (gs_color_space *) pcs_in; if_debug3('c', "[c]remap CIEDEF [%g %g %g]\n", pc->paint.values[0], pc->paint.values[1], @@ -521,13 +527,13 @@ /* Render a CIEBasedDEF color. */ int -gx_concretize_CIEDEF(const gs_client_color * pc, const gs_color_space * pcs, +gx_concretize_CIEDEF(const gs_client_color * pc, const gs_color_space * pcs_in, frac * pconc, const gs_imager_state * pis, gx_device *dev) { - const gs_cie_def *pcie = pcs->params.def; int code; gs_color_space *pcs_icc; gs_client_color scale_pc; + gs_color_space *pcs = (gs_color_space *) pcs_in; if_debug3('c', "[c]concretize DEF [%g %g %g]\n", pc->paint.values[0], pc->paint.values[1], @@ -562,6 +568,7 @@ gx_cie_vector_cache *abc_caches = &(pcs->params.abc->caches.DecodeABC.caches[0]); gx_cie_scalar_cache *lmn_caches = &(pcs->params.abc->common.caches.DecodeLMN[0]); + if_debug0(gs_debug_flag_icc,"[icc] Creating ICC profile from abc object"); /* build the ICC color space object */ code = gs_cspace_build_ICC(ppcs_icc, NULL, memory); /* record the cie alt space as the icc alternative color space */ @@ -575,14 +582,15 @@ (*ppcs_icc)->cmm_icc_profile_data->default_match = CIE_ABC; /* Assign to the icc_equivalent member variable */ pcs->icc_equivalent = *ppcs_icc; - return(0); + pcs->icc_equivalent->cmm_icc_profile_data->data_cs = gsRGB; + return(0); } /* Render a CIEBasedABC color. */ /* We provide both remap and concretize, but only the former */ /* needs to be efficient. */ int -gx_remap_CIEABC(const gs_client_color * pc, const gs_color_space * pcs, +gx_remap_CIEABC(const gs_client_color * pc, const gs_color_space * pcs_in, gx_device_color * pdc, const gs_imager_state * pis, gx_device * dev, gs_color_select_t select) { @@ -590,6 +598,8 @@ gs_client_color scale_pc; bool islab; int i,code; + gs_color_space *pcs = (gs_color_space *) pcs_in; + if_debug3('c', "[c]remap CIEABC [%g %g %g]\n", pc->paint.values[0], pc->paint.values[1], @@ -620,12 +630,13 @@ } int -gx_concretize_CIEABC(const gs_client_color * pc, const gs_color_space * pcs, +gx_concretize_CIEABC(const gs_client_color * pc, const gs_color_space * pcs_in, frac * pconc, const gs_imager_state * pis, gx_device *dev) { gs_color_space *pcs_icc; gs_client_color scale_pc; bool islab; + gs_color_space *pcs = (gs_color_space *) pcs_in; if_debug3('c', "[c]concretize CIEABC [%g %g %g]\n", pc->paint.values[0], pc->paint.values[1], @@ -658,6 +669,7 @@ gx_cie_vector_cache *a_cache = &(pcs->params.a->caches.DecodeA); gx_cie_scalar_cache *lmn_caches = &(pcs->params.a->common.caches.DecodeLMN[0]); + if_debug0(gs_debug_flag_icc,"[icc] Creating ICC profile from CIEA object"); /* build the ICC color space object */ code = gs_cspace_build_ICC(ppcs_icc, NULL, memory); /* record the cie alt space as the icc alternative color space */ @@ -671,17 +683,19 @@ (*ppcs_icc)->cmm_icc_profile_data->default_match = CIE_A; /* Assign to the icc_equivalent member variable */ pcs->icc_equivalent = *ppcs_icc; + pcs->icc_equivalent->cmm_icc_profile_data->data_cs = gsGRAY; return(code); } int -gx_remap_CIEA(const gs_client_color * pc, const gs_color_space * pcs, +gx_remap_CIEA(const gs_client_color * pc, const gs_color_space * pcs_in, gx_device_color * pdc, const gs_imager_state * pis, gx_device * dev, gs_color_select_t select) { int code; gs_color_space *pcs_icc; gs_client_color scale_pc; + gs_color_space *pcs = (gs_color_space *) pcs_in; if_debug1('c', "[c]remap CIEA [%g]\n",pc->paint.values[0]); /* If we are coming in here then we may have not completed @@ -710,12 +724,13 @@ /* Render a CIEBasedA color. */ int -gx_concretize_CIEA(const gs_client_color * pc, const gs_color_space * pcs, +gx_concretize_CIEA(const gs_client_color * pc, const gs_color_space * pcs_in, frac * pconc, const gs_imager_state * pis, gx_device *dev) { int code; gs_color_space *pcs_icc; gs_client_color scale_pc; + gs_color_space *pcs = (gs_color_space *) pcs_in; if_debug1('c', "[c]concretize CIEA %g\n", pc->paint.values[0]); /* If we are comming in here then we have not completed diff -Nru ghostscript-9.04~dfsg/base/gscms.h ghostscript-9.05~dfsg~20120125/base/gscms.h --- ghostscript-9.04~dfsg/base/gscms.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gscms.h 2012-01-25 08:44:24.000000000 +0000 @@ -88,6 +88,25 @@ int pixels_per_row; } gsicc_bufferdesc_t; +/* Mapping procedures to allow easy vectoring depending upon if we are using + the CMM or doing "dumb" color transforms */ +typedef void (*gscms_trans_color_proc_t) (gx_device * dev, gsicc_link_t *icclink, + void *inputcolor, void *outputcolor, + int num_bytes); + +typedef void (*gscms_trans_buffer_proc_t) (gx_device * dev, gsicc_link_t *icclink, + gsicc_bufferdesc_t *input_buff_desc, + gsicc_bufferdesc_t *output_buff_desc, + void *inputbuffer, void *outputbuffer); + +typedef void (*gscms_link_free_proc_t) (gsicc_link_t *icclink); + +typedef struct gscms_procs_s { + gscms_trans_buffer_proc_t map_buffer; + gscms_trans_color_proc_t map_color; + gscms_link_free_proc_t free_link; +} gscms_procs_t; + /* Enumerate the ICC rendering intents */ typedef enum { gsPERCEPTUAL = 0, @@ -109,6 +128,8 @@ gsGRAPHICPROFILE, gsIMAGEPROFILE, gsTEXTPROFILE, + gsPROOFPROFILE, + gsLINKPROFILE } gsicc_profile_types_t; typedef enum { @@ -133,24 +154,15 @@ /* Destination profiles for different objects */ typedef struct cmm_dev_profile_s { cmm_profile_t *device_profile[NUM_DEVICE_PROFILES]; + cmm_profile_t *proof_profile; + cmm_profile_t *link_profile; gsicc_rendering_intents_t intent[NUM_DEVICE_PROFILES]; bool devicegraytok; /* Used for forcing gray to pure black */ + bool usefastcolor; /* Used when we want to use no cm */ gs_memory_t *memory; rc_header rc; } cmm_dev_profile_t; -typedef struct cmm_dev_profile_name_s { - char *name; - unsigned int name_length; -} cmm_dev_profile_name_t; - -typedef struct cmm_dev_profile_name_array_s { - cmm_dev_profile_name_t file_names[NUM_DEVICE_PROFILES]; - rc_header rc; - gs_memory_t *memory; - char *icc_output_dir; -} cmm_dev_profile_name_array_t; - /* Doing this an an enum type for now. There is alot going on with respect * to this and V2 versus V4 profiles */ @@ -173,9 +185,7 @@ DEFAULT_GRAY, /* The default DeviceGray profile */ DEFAULT_RGB, /* The default DeviceRGB profile */ DEFAULT_CMYK, /* The default DeviceCMYK profile */ - PROOF_TYPE, /* The proofing profile */ NAMED_TYPE, /* The named color profile */ - LINKED_TYPE, /* The linked profile */ LAB_TYPE, /* The CIELAB profile */ DEVICEN_TYPE, /* A special device N profile */ DEFAULT_GRAY_s, /* Same as default but a source profile from document */ @@ -310,6 +320,7 @@ struct gsicc_link_s { void *link_handle; void *contextptr; + gscms_procs_t procs; gsicc_hashlink_t hashcode; struct gsicc_link_cache_s *icc_link_cache; int ref_count; @@ -317,6 +328,7 @@ gx_semaphore_t *wait; /* semaphore used by waiting threads */ int num_waiting; bool includes_softproof; + bool includes_devlink; bool is_identity; /* Used for noting that this is an identity profile */ bool valid; /* true once link is completely built and usable */ }; @@ -382,8 +394,6 @@ cmm_profile_t *default_gray; /* Default gray profile for device gray */ cmm_profile_t *default_rgb; /* Default RGB profile for device RGB */ cmm_profile_t *default_cmyk; /* Default CMYK profile for device CMKY */ - cmm_profile_t *proof_profile; /* Proofing profile */ - cmm_profile_t *output_link; /* Output device Link profile */ cmm_profile_t *lab_profile; /* Colorspace type ICC profile from LAB to LAB */ cmm_profile_t *graytok_profile; /* A specialized profile for mapping gray to K */ gsicc_devicen_t *device_n; /* A linked list of profiles used for DeviceN support */ diff -Nru ghostscript-9.04~dfsg/base/gscoord.c ghostscript-9.05~dfsg~20120125/base/gscoord.c --- ghostscript-9.04~dfsg/base/gscoord.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gscoord.c 2011-11-12 18:29:08.000000000 +0000 @@ -242,6 +242,24 @@ } int +gs_translate_untransformed(gs_state * pgs, floatp dx, floatp dy) +{ + gs_point pt; + int code; + + pt.x = (float)dx + pgs->ctm.tx; + pt.y = (float)dy + pgs->ctm.ty; + update_ctm(pgs, pt.x, pt.y); +#ifdef DEBUG + if (gs_debug_c('x')) + dlprintf4("[x]translate_untransformed: %f %f -> %f %f\n", + dx, dy, pt.x, pt.y), + trace_ctm(pgs); +#endif + return 0; +} + +int gs_scale(gs_state * pgs, floatp sx, floatp sy) { pgs->ctm.xx *= sx; diff -Nru ghostscript-9.04~dfsg/base/gscoord.h ghostscript-9.05~dfsg~20120125/base/gscoord.h --- ghostscript-9.04~dfsg/base/gscoord.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gscoord.h 2011-11-12 18:29:08.000000000 +0000 @@ -24,6 +24,7 @@ gs_currentmatrix(const gs_state *, gs_matrix *), gs_setmatrix(gs_state *, const gs_matrix *), gs_translate(gs_state *, floatp, floatp), + gs_translate_untransformed(gs_state *, floatp, floatp), gs_scale(gs_state *, floatp, floatp), gs_rotate(gs_state *, floatp), gs_concat(gs_state *, const gs_matrix *); diff -Nru ghostscript-9.04~dfsg/base/gscsepr.c ghostscript-9.05~dfsg~20120125/base/gscsepr.c --- ghostscript-9.04~dfsg/base/gscsepr.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gscsepr.c 2012-01-25 08:44:24.000000000 +0000 @@ -330,7 +330,7 @@ &pname, &name_size); code = gsicc_transform_named_color(pc->paint.values[0], pname, name_size, device_values, pis, dev, NULL, - &rendering_params, false); + &rendering_params); if (code == 0) { for (k = 0; k < num_des_comps; k++){ pconc[k] = float2frac(((float) device_values[k])/65535.0); diff -Nru ghostscript-9.04~dfsg/base/gscspace.c ghostscript-9.05~dfsg~20120125/base/gscspace.c --- ghostscript-9.04~dfsg/base/gscspace.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gscspace.c 2011-10-06 06:43:10.000000000 +0000 @@ -88,9 +88,10 @@ /* ------ Create/copy/destroy ------ */ static void -gs_cspace_final(void *vptr) +gs_cspace_final(const gs_memory_t *cmem, void *vptr) { gs_color_space *pcs = (gs_color_space *)vptr; + (void)cmem; /* unused */ if (pcs->type->final) pcs->type->final(pcs); @@ -483,6 +484,19 @@ return gx_set_overprint_cmyk(pcs, pgs); } +/* A few comments about ICC profiles and overprint simulation. In order + to do proper overprint simulation, the source ICC profile and the + destination ICC profile must be the same. If they are not, then + we end up mapping the source CMYK data to a different CMYK value. In + this case, the non-zero components, which with overprint mode = 1 specify + which are to be overprinted will not be correct to produce the proper + overprint simulation. This is seen with AR when doing output preview, + overprint simulation enabled of the file overprint_icc.pdf (see our + test files) which has SWOP ICC based CMYK fills. In AR, if we use a + simluation ICC profile that is different than the source profile, + overprinting is no longer previewed. We follow the same logic here. + If the source and destination ICC profiles do not match, then there is + effectively no overprinting enabled. This is bug 692433 */ int gx_set_overprint_cmyk(const gs_color_space * pcs, gs_state * pgs) { gx_device * dev = pgs->device; @@ -490,6 +504,15 @@ gx_color_index drawn_comps = 0; gs_overprint_params_t params; gx_device_color *pdc; + cmm_dev_profile_t *dev_profile; + cmm_profile_t *output_profile; + int code; + bool profile_ok = false; + gsicc_rendering_intents_t rendering_intent; + + code = dev_proc(dev, get_profile)(dev, &dev_profile); + gsicc_extract_profile(dev->graphics_type_tag, dev_profile, &(output_profile), + &rendering_intent); /* check if color model behavior must be determined */ if (pcinfo->opmode == GX_CINFO_OPMODE_UNKNOWN) @@ -499,17 +522,63 @@ if (drawn_comps == 0) return gx_spot_colors_set_overprint(pcs, pgs); - /* correct for any zero'ed color components */ + /* correct for any zero'ed color components. But only if profiles + match */ + if (pcs->cmm_icc_profile_data != NULL && output_profile != NULL) { + if (output_profile->hashcode == + pcs->cmm_icc_profile_data->hashcode) { + profile_ok = true; + } + } + pgs->effective_overprint_mode = 1; pdc = gs_currentdevicecolor_inline(pgs); - if (color_is_set(pdc)) { - gx_color_index nz_comps; + if (color_is_set(pdc) && profile_ok) { + gx_color_index nz_comps, one, temp; int code; + int num_colorant[4], k; + bool colorant_ok; + dev_color_proc_get_nonzero_comps((*procp)); procp = pdc->type->get_nonzero_comps; - if ((code = procp(pdc, dev, &nz_comps)) < 0) - return code; + if (pdc->ccolor_valid) { + /* If we have the source colors, then use those in making the + decision as to which ones are non-zero. Then we avoid + accidently looking at small values that get quantized to zero + Note that to get here in the code, the source color data color + space has to be CMYK. Trick is that we do need to worry about + the colorant order on the target device */ + num_colorant[0] = (dev_proc(dev, get_color_comp_index))\ + (dev, "Cyan", strlen("Cyan"), NO_COMP_NAME_TYPE); + num_colorant[1] = (dev_proc(dev, get_color_comp_index))\ + (dev, "Magenta", strlen("Magenta"), NO_COMP_NAME_TYPE); + num_colorant[2] = (dev_proc(dev, get_color_comp_index))\ + (dev, "Yellow", strlen("Yellow"), NO_COMP_NAME_TYPE); + num_colorant[3] = (dev_proc(dev, get_color_comp_index))\ + (dev, "Black", strlen("Black"), NO_COMP_NAME_TYPE); + nz_comps = 0; + one = 1; + colorant_ok = true; + for (k = 0; k < 4; k++) { + if (pdc->ccolor.paint.values[k] != 0) { + if (num_colorant[k] == -1) { + colorant_ok = false; + } else { + temp = one << num_colorant[k]; + nz_comps = nz_comps | temp; + } + } + } + /* For some reason we don't have one of the standard colorants */ + if (!colorant_ok) { + if ((code = procp(pdc, dev, &nz_comps)) < 0) + return code; + } + } else { + if ((code = procp(pdc, dev, &nz_comps)) < 0) + return code; + } drawn_comps &= nz_comps; } params.retain_any_comps = true; diff -Nru ghostscript-9.04~dfsg/base/gsdcolor.h ghostscript-9.05~dfsg~20120125/base/gsdcolor.h --- ghostscript-9.04~dfsg/base/gsdcolor.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsdcolor.h 2011-11-21 08:55:19.000000000 +0000 @@ -22,7 +22,6 @@ #include "gxbitmap.h" #include "gxhttile.h" #include "gxcindex.h" -#include "gxwts.h" #ifndef gx_device_color_DEFINED # define gx_device_color_DEFINED @@ -290,14 +289,6 @@ #endif #endif } colored; - struct _wts { - const gx_device_halftone *w_ht; - wts_screen_sample_t levels[GX_DEVICE_COLOR_MAX_COMPONENTS]; - ushort num_components; - - /* plane_mask and base_color would be an optimization */ - gx_color_index plane_vector[GX_DEVICE_COLOR_MAX_COMPONENTS]; - } wts; struct _pat { gx_color_tile *p_tile; } /*(colored) */ pattern; @@ -385,9 +376,6 @@ uint c_level[GX_DEVICE_COLOR_MAX_COMPONENTS]; ushort alpha; } colored; - struct _swts { - wts_screen_sample_t levels[GX_DEVICE_COLOR_MAX_COMPONENTS]; - } wts; struct _pattern { gs_id id; gs_int_point phase; @@ -431,8 +419,5 @@ #ifndef gx_dc_type_ht_colored extern const gx_device_color_type_t *const gx_dc_type_ht_colored; /* gxcht.c */ #endif -#ifndef gx_dc_type_ht_colored -extern const gx_device_color_type_t *const gx_dc_type_wts; /* gxwts.c */ -#endif #endif /* gsdcolor_INCLUDED */ diff -Nru ghostscript-9.04~dfsg/base/gsdevice.c ghostscript-9.05~dfsg~20120125/base/gsdevice.c --- ghostscript-9.04~dfsg/base/gsdevice.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsdevice.c 2012-01-25 08:44:24.000000000 +0000 @@ -44,9 +44,10 @@ * descriptor if it is dynamic. */ void -gx_device_finalize(void *vptr) +gx_device_finalize(const gs_memory_t *cmem, void *vptr) { gx_device * const dev = (gx_device *)vptr; + (void)cmem; /* unused */ if (dev->icc_struct != NULL) { rc_decrement(dev->icc_struct, "gx_device_finalize(icc_profile)"); @@ -63,7 +64,7 @@ void gx_device_free_local(gx_device *dev) { - gx_device_finalize(dev); + gx_device_finalize(dev->memory, dev); } /* GC procedures */ @@ -962,6 +963,18 @@ return 0; } +/* Check if we write each page into separate file. */ +bool +gx_outputfile_is_separate_pages(const char *fname, gs_memory_t *memory) +{ + const char *fmt; + gs_parsed_file_name_t parsed; + int code = gx_parse_output_file_name(&parsed, &fmt, fname, + strlen(fname), memory); + + return (code >= 0 && fmt != 0); +} + /* Open the output file for a device. */ int gx_device_open_output_file(const gx_device * dev, char *fname, diff -Nru ghostscript-9.04~dfsg/base/gsdparam.c ghostscript-9.05~dfsg~20120125/base/gsdparam.c --- ghostscript-9.04~dfsg/base/gsdparam.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsdparam.c 2012-01-07 20:18:22.000000000 +0000 @@ -78,13 +78,14 @@ bool seprs = false; gs_param_string dns, pcms, profile_array[NUM_DEVICE_PROFILES]; + gs_param_string proof_profile, link_profile; gsicc_rendering_intents_t profile_intents[NUM_DEVICE_PROFILES]; bool devicegraytok = true; /* Default if device profile stuct not set */ + bool usefastcolor = false; /* set for unmanaged color */ int k; gs_param_float_array msa, ibba, hwra, ma; gs_param_string_array scna; char null_str[1]={'\0'}; - gs_param_string temp_str; #define set_param_array(a, d, s)\ (a.data = d, a.size = s, a.persistent = false); @@ -134,8 +135,13 @@ code = gsicc_init_device_profile_struct(dev, NULL, 0); code = dev_proc(dev, get_profile)(dev, &dev_profile); } + /* It is possible that the current device profile name is NULL if we + have a pdf14 device in line with a transparency group that is in a + color space specified from a source defined ICC profile. Check for + that here to avoid any access violations. Bug 692558 */ for (k = 0; k < NUM_DEVICE_PROFILES; k++) { - if (dev_profile->device_profile[k] == NULL) { + if (dev_profile->device_profile[k] == NULL + || dev_profile->device_profile[k]->name == NULL) { param_string_from_string(profile_array[k], null_str); profile_intents[k] = gsPERCEPTUAL; } else { @@ -144,15 +150,31 @@ profile_intents[k] = dev_profile->intent[k]; } } + /* The proof and link profile */ + if (dev_profile->proof_profile == NULL) { + param_string_from_string(proof_profile, null_str); + } else { + param_string_from_string(proof_profile, + dev_profile->proof_profile->name); + } + if (dev_profile->link_profile == NULL) { + param_string_from_string(link_profile, null_str); + } else { + param_string_from_string(link_profile, + dev_profile->link_profile->name); + } devicegraytok = dev_profile->devicegraytok; + usefastcolor = dev_profile->usefastcolor; } else { for (k = 0; k < NUM_DEVICE_PROFILES; k++) { param_string_from_string(profile_array[k], null_str); profile_intents[k] = gsPERCEPTUAL; } + param_string_from_string(proof_profile, null_str); + param_string_from_string(link_profile, null_str); } /* Transmit the values. */ - if ( + if ( /* Standard parameters */ (code = param_write_name(plist, "OutputDevice", &dns)) < 0 || #ifdef PAGESIZE_IS_MEDIASIZE @@ -178,14 +200,17 @@ /* Note: if change is made in NUM_DEVICE_PROFILES we need to name that profile here for the device parameter on the command line */ (code = param_write_bool(plist, "DeviceGrayToK", &devicegraytok)) < 0 || + (code = param_write_bool(plist, "UseFastColor", &usefastcolor)) < 0 || (code = param_write_string(plist,"OutputICCProfile", &(profile_array[0]))) < 0 || (code = param_write_string(plist,"GraphicICCProfile", &(profile_array[1]))) < 0 || (code = param_write_string(plist,"ImageICCProfile", &(profile_array[2]))) < 0 || (code = param_write_string(plist,"TextICCProfile", &(profile_array[3]))) < 0 || - (code = param_write_int(plist,"RenderIntent", &(profile_intents[0]))) < 0 || - (code = param_write_int(plist,"GraphicIntent", &(profile_intents[1]))) < 0 || - (code = param_write_int(plist,"ImageIntent", &(profile_intents[2]))) < 0 || - (code = param_write_int(plist,"TextIntent", &(profile_intents[3]))) < 0 || + (code = param_write_string(plist,"ProofProfile", &(proof_profile))) < 0 || + (code = param_write_string(plist,"DeviceLinkProfile", &(link_profile))) < 0 || + (code = param_write_int(plist,"RenderIntent", (const int *) (&(profile_intents[0])))) < 0 || + (code = param_write_int(plist,"GraphicIntent", (const int *) &(profile_intents[1]))) < 0 || + (code = param_write_int(plist,"ImageIntent", (const int *) &(profile_intents[2]))) < 0 || + (code = param_write_int(plist,"TextIntent", (const int *) &(profile_intents[3]))) < 0 || (code = param_write_int_array(plist, "HWSize", &hwsa)) < 0 || (code = param_write_float_array(plist, ".HWMargins", &hwma)) < 0 || (code = param_write_float_array(plist, ".MarginsHWResolution", &mhwra)) < 0 || @@ -485,6 +510,36 @@ } static void +gx_default_put_usefastcolor(bool fastcolor, gx_device * dev) +{ + int code; + cmm_dev_profile_t *profile_struct; + + if (dev->procs.get_profile == NULL) { + /* This is an odd case where the device has not yet fully been + set up with its procedures yet. We want to make sure that + we catch this so we assume here that we are dealing with + the target device. For now allocate the profile structure + but do not intialize the profile yet as the color info + may not be fully set up at this time. */ + if (dev->icc_struct == NULL) { + /* Allocate at this time the structure */ + dev->icc_struct = gsicc_new_device_profile_array(dev->memory); + } + dev->icc_struct->usefastcolor = fastcolor; + } else { + code = dev_proc(dev, get_profile)(dev, &profile_struct); + if (profile_struct == NULL) { + /* Create now */ + dev->icc_struct = gsicc_new_device_profile_array(dev->memory); + profile_struct = dev->icc_struct; + } + profile_struct->usefastcolor = fastcolor; + } +} + + +static void gx_default_put_intent(gsicc_profile_types_t icc_intent, gx_device * dev, gsicc_profile_types_t index) { @@ -576,13 +631,14 @@ int leadingedge = dev->LeadingEdge; int k; bool devicegraytok = true; - + bool usefastcolor = false; if (dev->icc_struct != NULL) { for (k = 0; k < NUM_DEVICE_PROFILES; k++) { rend_intent[k] = dev->icc_struct->intent[k]; } devicegraytok = dev->icc_struct->devicegraytok; + usefastcolor = dev->icc_struct->usefastcolor; } else { for (k = 0; k < NUM_DEVICE_PROFILES; k++) { rend_intent[k] = gsPERCEPTUAL; @@ -777,6 +833,12 @@ if ((code = param_read_string(plist, "TextICCProfile", &icc_pro)) != 1) { gx_default_put_icc(&icc_pro, dev, gsTEXTPROFILE); } + if ((code = param_read_string(plist, "ProofProfile", &icc_pro)) != 1) { + gx_default_put_icc(&icc_pro, dev, gsPROOFPROFILE); + } + if ((code = param_read_string(plist, "DeviceLinkProfile", &icc_pro)) != 1) { + gx_default_put_icc(&icc_pro, dev, gsLINKPROFILE); + } if ((code = param_read_int(plist, (param_name = "RenderIntent"), &(rend_intent[0]))) < 0) { ecode = code; @@ -802,6 +864,11 @@ ecode = code; param_signal_error(plist, param_name, ecode); } + if ((code = param_read_bool(plist, (param_name = "UseFastColor"), + &usefastcolor)) < 0) { + ecode = code; + param_signal_error(plist, param_name, ecode); + } if ((code = param_read_bool(plist, (param_name = "UseCIEColor"), &ucc)) < 0) { ecode = code; param_signal_error(plist, param_name, ecode); @@ -1003,6 +1070,7 @@ gx_default_put_intent(rend_intent[3], dev, gsTEXTPROFILE); } gx_default_put_graytok(devicegraytok, dev); + gx_default_put_usefastcolor(usefastcolor, dev); return 0; } diff -Nru ghostscript-9.04~dfsg/base/gsdps1.c ghostscript-9.05~dfsg~20120125/base/gsdps1.c --- ghostscript-9.04~dfsg/base/gsdps1.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsdps1.c 2011-11-21 08:55:19.000000000 +0000 @@ -201,7 +201,9 @@ /* Processing a fill object operation */ dev_proc(pgs->device, set_graphics_type_tag)(pgs->device, GS_PATH_TAG); - gx_set_dev_color(pgs); + code = gx_set_dev_color(pgs); + if (code != 0) + return code; if ((is_fzero2(pgs->ctm.xy, pgs->ctm.yx) || is_fzero2(pgs->ctm.xx, pgs->ctm.yy)) && gx_effective_clip_path(pgs, &pcpath) >= 0 && @@ -209,8 +211,7 @@ (hl_color || pdc->type == gx_dc_type_pure || pdc->type == gx_dc_type_ht_binary || - pdc->type == gx_dc_type_ht_colored - /* DeviceN todo: add wts case */) && + pdc->type == gx_dc_type_ht_colored) && gs_state_color_load(pgs) >= 0 && (*dev_proc(pdev, get_alpha_bits)) (pdev, go_graphics) <= 1 && diff -Nru ghostscript-9.04~dfsg/base/gsequivc.c ghostscript-9.05~dfsg~20120125/base/gsequivc.c --- ghostscript-9.04~dfsg/base/gsequivc.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsequivc.c 2012-01-07 20:18:22.000000000 +0000 @@ -329,7 +329,8 @@ static void cmap_cmyk_capture_cmyk_color(frac c, frac m, frac y, frac k, gx_device_color * pdc, - const gs_imager_state * pis, gx_device * dev, gs_color_select_t select) + const gs_imager_state * pis, gx_device * dev, gs_color_select_t select, + const gs_color_space *pcs) { equivalent_cmyk_color_params * pparams = ((color_capture_device *)dev)->pequiv_cmyk_colors; @@ -396,12 +397,15 @@ temp_device.color_info = pdev->color_info; temp_device.sep_num = sep_num; temp_device.pequiv_cmyk_colors = pparams; - temp_device.memory = pgs->memory; + temp_device.memory = pgs->memory; + temp_profile.usefastcolor = false; /* This avoids a few headaches */ temp_profile.device_profile[0] = curr_output_profile; temp_profile.device_profile[1] = NULL; temp_profile.device_profile[2] = NULL; temp_profile.device_profile[2] = NULL; + temp_profile.link_profile = NULL; + temp_profile.proof_profile = NULL; temp_device.icc_struct = &temp_profile; set_dev_proc(&temp_device, get_profile, gx_default_get_profile); @@ -416,6 +420,6 @@ temp_state.color_component_map.use_alt_cspace = true; /* Now capture the color */ - pcs->type->remap_color (pcc, pcs, &dev_color, &temp_state, - (gx_device *)&temp_device, gs_color_select_texture); + pcs->type->remap_color (pcc, pcs, &dev_color, &temp_state, + (gx_device *)&temp_device, gs_color_select_texture); } diff -Nru ghostscript-9.04~dfsg/base/gsequivc.h ghostscript-9.05~dfsg~20120125/base/gsequivc.h --- ghostscript-9.04~dfsg/base/gsequivc.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsequivc.h 2011-12-08 09:35:23.000000000 +0000 @@ -30,6 +30,10 @@ frac k; } cmyk_color; +/* if you make any additions/changes to the equivalent_cmyk_color_params or the + cmyk_color structrs you need to make the appropriate additions/changes + to the compare_equivalent_cmyk_color_params() function in gdevdevn.c */ + /* * Structure for holding parameters for collecting the equivalent CMYK * for a spot colorant. diff -Nru ghostscript-9.04~dfsg/base/gserror.h ghostscript-9.05~dfsg~20120125/base/gserror.h --- ghostscript-9.04~dfsg/base/gserror.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gserror.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,162 +0,0 @@ -/* Copyright (C) 2001-2008 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ - -/* $Id$ */ -/* Error return macros */ - -#ifndef gserror_INCLUDED -# define gserror_INCLUDED - -int gs_log_error(int, const char *, int); -#ifndef DEBUG -# define gs_log_error(err, file, line) (err) -#endif -#define gs_note_error(err) gs_log_error(err, __FILE__, __LINE__) -#define return_error(err) return gs_note_error(err) - -#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L -# if defined(__GNUC__) && __GNUC__ >= 2 -# define __func__ __FUNCTION__ -# elif defined(__FUNCTION__) -# define __func__ __FUNCTION__ -# elif defined(__FUNC__) -# define __func__ __FUNC__ -# else -# define __func__ "" -# endif -#endif - -/* - * Error reporting macros. - * - */ - -#ifndef __printflike -#if __GNUC__ > 2 || __GNUC__ == 2 && __GNUC_MINOR__ >= 7 -#define __printflike(fmtarg, firstvararg) \ - __attribute__((__format__ (__printf__, fmtarg, firstvararg))) -#else -#define __printflike(fmtarg, firstvararg) -#endif -#endif - -const char *gs_errstr(int code); - -int gs_throw_imp(const char *func, const char *file, int line, - int op, int code, const char *fmt, ...) __printflike(6, 7); - -/* Use throw at origin of error -*/ -#define gs_throw_code(code) \ - gs_throw1((code), "%s", gs_errstr((code))) - -#define gs_throw(code, fmt) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt) -#define gs_throw1(code, fmt, arg1) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1) -#define gs_throw2(code, fmt, arg1, arg2) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2) -#define gs_throw3(code, fmt, arg1, arg2, arg3) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3) -#define gs_throw4(code, fmt, arg1, arg2, arg3, arg4) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3, arg4) -#define gs_throw5(code, fmt, arg1, arg2, arg3, arg4, arg5) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3, arg4, arg5) -#define gs_throw6(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6) -#define gs_throw7(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) -#define gs_throw8(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) -#define gs_throw9(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) - -/* Bubble the code up the stack -*/ -#define gs_rethrow_code(code) \ - gs_rethrow1((code), "%s", gs_errstr((code))) - -#define gs_rethrow(code, fmt) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt) -#define gs_rethrow1(code, fmt, arg1) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1) -#define gs_rethrow2(code, fmt, arg1, arg2) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2) -#define gs_rethrow3(code, fmt, arg1, arg2, arg3) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3) -#define gs_rethrow4(code, fmt, arg1, arg2, arg3, arg4) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3, arg4) -#define gs_rethrow5(code, fmt, arg1, arg2, arg3, arg4, arg5) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3, arg4, arg5) -#define gs_rethrow6(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6) -#define gs_rethrow7(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) -#define gs_rethrow8(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) -#define gs_rethrow9(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) - -/* This will cause trouble, as it implies you are fixing an error - * the system will spew messages - */ -#define gs_catch(code, fmt) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt) -#define gs_catch1(code, fmt, arg1) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1) -#define gs_catch2(code, fmt, arg1, arg2) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2) -#define gs_catch3(code, fmt, arg1, arg2, arg3) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3) -#define gs_catch4(code, fmt, arg1, arg2, arg3, arg4) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3, arg4) -#define gs_catch5(code, fmt, arg1, arg2, arg3, arg4, arg5) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3, arg4, arg5) -#define gs_catch6(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6) -#define gs_catch7(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) -#define gs_catch8(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) -#define gs_catch9(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \ - gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) - -/* gs_warn is a printf - */ -#define gs_warn(fmt) \ - (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt) -#define gs_warn1(fmt, arg1) \ - (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1) -#define gs_warn2(fmt, arg1, arg2) \ - (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2) -#define gs_warn3(fmt, arg1, arg2, arg3) \ - (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3) -#define gs_warn4(fmt, arg1, arg2, arg3, arg4) \ - (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3, arg4) -#define gs_warn5(fmt, arg1, arg2, arg3, arg4, arg5) \ - (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3, arg4, arg5) -#define gs_warn6(fmt, arg1, arg2, arg3, arg4, arg5, arg6) \ - (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3, arg4, arg5, arg6) -#define gs_warn7(fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ - (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) -#define gs_warn8(fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \ - (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) -#define gs_warn9(fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \ - (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) - -/* just in case you don't know 0 means no error - * other return codes are errors. - */ -#define gs_okay 0 - -#endif /* gserror_INCLUDED */ diff -Nru ghostscript-9.04~dfsg/base/gserrors.h ghostscript-9.05~dfsg~20120125/base/gserrors.h --- ghostscript-9.04~dfsg/base/gserrors.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gserrors.h 2011-10-17 13:34:52.000000000 +0000 @@ -43,6 +43,148 @@ #define gs_error_Fatal (-100) /* Need the remap color error for high level pattern support */ -#define gs_error_Remap_Color (-107) +#define gs_error_Remap_Color (-103) + +int gs_log_error(int, const char *, int); +#ifndef DEBUG +# define gs_log_error(err, file, line) (err) +#endif +#define gs_note_error(err) gs_log_error(err, __FILE__, __LINE__) +#define return_error(err) return gs_note_error(err) + +#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L +# if defined(__GNUC__) && __GNUC__ >= 2 +# define __func__ __FUNCTION__ +# elif defined(__FUNCTION__) +# define __func__ __FUNCTION__ +# elif defined(__FUNC__) +# define __func__ __FUNC__ +# else +# define __func__ "" +# endif +#endif + +/* + * Error reporting macros. + * + */ + +#ifndef __printflike +#if __GNUC__ > 2 || __GNUC__ == 2 && __GNUC_MINOR__ >= 7 +#define __printflike(fmtarg, firstvararg) \ + __attribute__((__format__ (__printf__, fmtarg, firstvararg))) +#else +#define __printflike(fmtarg, firstvararg) +#endif +#endif + +const char *gs_errstr(int code); + +int gs_throw_imp(const char *func, const char *file, int line, + int op, int code, const char *fmt, ...) __printflike(6, 7); + +/* Use throw at origin of error +*/ +#define gs_throw_code(code) \ + gs_throw1((code), "%s", gs_errstr((code))) + +#define gs_throw(code, fmt) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt) +#define gs_throw1(code, fmt, arg1) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1) +#define gs_throw2(code, fmt, arg1, arg2) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2) +#define gs_throw3(code, fmt, arg1, arg2, arg3) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3) +#define gs_throw4(code, fmt, arg1, arg2, arg3, arg4) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3, arg4) +#define gs_throw5(code, fmt, arg1, arg2, arg3, arg4, arg5) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3, arg4, arg5) +#define gs_throw6(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6) +#define gs_throw7(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) +#define gs_throw8(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) +#define gs_throw9(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) + +/* Bubble the code up the stack +*/ +#define gs_rethrow_code(code) \ + gs_rethrow1((code), "%s", gs_errstr((code))) + +#define gs_rethrow(code, fmt) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt) +#define gs_rethrow1(code, fmt, arg1) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1) +#define gs_rethrow2(code, fmt, arg1, arg2) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2) +#define gs_rethrow3(code, fmt, arg1, arg2, arg3) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3) +#define gs_rethrow4(code, fmt, arg1, arg2, arg3, arg4) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3, arg4) +#define gs_rethrow5(code, fmt, arg1, arg2, arg3, arg4, arg5) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3, arg4, arg5) +#define gs_rethrow6(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6) +#define gs_rethrow7(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) +#define gs_rethrow8(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) +#define gs_rethrow9(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) + +/* This will cause trouble, as it implies you are fixing an error + * the system will spew messages + */ +#define gs_catch(code, fmt) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt) +#define gs_catch1(code, fmt, arg1) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1) +#define gs_catch2(code, fmt, arg1, arg2) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2) +#define gs_catch3(code, fmt, arg1, arg2, arg3) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3) +#define gs_catch4(code, fmt, arg1, arg2, arg3, arg4) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3, arg4) +#define gs_catch5(code, fmt, arg1, arg2, arg3, arg4, arg5) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3, arg4, arg5) +#define gs_catch6(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6) +#define gs_catch7(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) +#define gs_catch8(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) +#define gs_catch9(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \ + gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) + +/* gs_warn is a printf + */ +#define gs_warn(fmt) \ + (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt) +#define gs_warn1(fmt, arg1) \ + (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1) +#define gs_warn2(fmt, arg1, arg2) \ + (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2) +#define gs_warn3(fmt, arg1, arg2, arg3) \ + (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3) +#define gs_warn4(fmt, arg1, arg2, arg3, arg4) \ + (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3, arg4) +#define gs_warn5(fmt, arg1, arg2, arg3, arg4, arg5) \ + (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3, arg4, arg5) +#define gs_warn6(fmt, arg1, arg2, arg3, arg4, arg5, arg6) \ + (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3, arg4, arg5, arg6) +#define gs_warn7(fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ + (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) +#define gs_warn8(fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \ + (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) +#define gs_warn9(fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \ + (void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) + +/* just in case you don't know 0 means no error + * other return codes are errors. + */ +#define gs_okay 0 #endif /* gserrors_INCLUDED */ diff -Nru ghostscript-9.04~dfsg/base/gsfcid.c ghostscript-9.05~dfsg~20120125/base/gsfcid.c --- ghostscript-9.04~dfsg/base/gsfcid.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsfcid.c 2011-09-29 11:01:33.000000000 +0000 @@ -105,9 +105,10 @@ } RELOC_PTRS_END static void -subst_CID_on_WMode_finalize(void *data) +subst_CID_on_WMode_finalize(const gs_memory_t *cmem, void *data) { gs_subst_CID_on_WMode_t *subst = (gs_subst_CID_on_WMode_t *)data; + (void)cmem; /* unused */ gs_free_object(subst->rc.memory, subst->data + 0, "subst_CID_on_WMode_finalize"); subst->data[0] = NULL; diff -Nru ghostscript-9.04~dfsg/base/gsfname.c ghostscript-9.05~dfsg~20120125/base/gsfname.c --- ghostscript-9.04~dfsg/base/gsfname.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsfname.c 2011-09-29 11:01:33.000000000 +0000 @@ -14,7 +14,6 @@ /* $Id$ */ /* File name utilities */ #include "memory_.h" -#include "gserror.h" #include "gserrors.h" #include "gsmemory.h" #include "gstypes.h" diff -Nru ghostscript-9.04~dfsg/base/gsfont.c ghostscript-9.05~dfsg~20120125/base/gsfont.c --- ghostscript-9.04~dfsg/base/gsfont.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsfont.c 2011-12-08 09:35:23.000000000 +0000 @@ -150,12 +150,13 @@ * See above for more information. */ void -gs_font_finalize(void *vptr) +gs_font_finalize(const gs_memory_t *cmem, void *vptr) { gs_font *const pfont = vptr; gs_font **ppfirst; gs_font *next = pfont->next; gs_font *prev = pfont->prev; + (void)cmem; /* unused */ if_debug4('u', "[u]unlinking font 0x%lx, base=0x%lx, prev=0x%lx, next=0x%lx\n", (ulong) pfont, (ulong) pfont->base, (ulong) prev, (ulong) next); @@ -271,11 +272,11 @@ return pdir; } static void -gs_font_dir_finalize(void *vptr) +gs_font_dir_finalize(const gs_memory_t *cmem, void *vptr) { gs_font_dir *pdir = vptr; - if (pdir == pdir->memory->gs_lib_ctx->font_dir) { - pdir->memory->gs_lib_ctx->font_dir = NULL; + if (pdir == cmem->gs_lib_ctx->font_dir) { + cmem->gs_lib_ctx->font_dir = NULL; } } @@ -771,7 +772,7 @@ for(; pfont != NULL; pfont = pfont->next) if(pfont->id == id && - !memcmp(&pfont->FontMatrix, FontMatrix, sizeof(pfont->FontMatrix))) + !gs_matrix_compare(&pfont->FontMatrix, FontMatrix)) return pfont; return NULL; } diff -Nru ghostscript-9.04~dfsg/base/gsfunc0.c ghostscript-9.05~dfsg~20120125/base/gsfunc0.c --- ghostscript-9.04~dfsg/base/gsfunc0.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsfunc0.c 2011-09-29 11:01:33.000000000 +0000 @@ -21,6 +21,7 @@ #include "gxfarith.h" #include "gxfunc.h" #include "stream.h" +#include "gsccolor.h" /* Only for GS_CLIENT_COLOR_MAX_COMPONENTS */ #define POLE_CACHE_DEBUG 0 /* A temporary development technology need. Remove after the beta testing. */ @@ -63,8 +64,13 @@ /* Define the maximum plausible number of inputs and outputs */ /* for a Sampled function. */ -#define max_Sd_m 16 -#define max_Sd_n 16 +#ifndef GS_CLIENT_SAMPLED_FN_MAX_COMPONENTS /* Allow override with XCFLAGS */ +# define max_Sd_m GS_CLIENT_COLOR_MAX_COMPONENTS +# define max_Sd_n GS_CLIENT_COLOR_MAX_COMPONENTS +#else +# define max_Sd_m GS_CLIENT_SAMPLED_FN_MAX_COMPONENTS +# define max_Sd_n GS_CLIENT_SAMPLED_FN_MAX_COMPONENTS +#endif /* Get one set of sample values. */ #define SETUP_SAMPLES(bps, nbytes)\ diff -Nru ghostscript-9.04~dfsg/base/gsfunc4.c ghostscript-9.05~dfsg~20120125/base/gsfunc4.c --- ghostscript-9.04~dfsg/base/gsfunc4.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsfunc4.c 2011-11-12 18:29:08.000000000 +0000 @@ -680,15 +680,15 @@ stream_SFD_state st; stream ds, bs; byte dbuf[200]; /* arbitrary */ - const stream_template *const template = &s_SFD_template; + const stream_template *const templat = &s_SFD_template; /* Set up the stream that writes into the buffer. */ s_init(&bs, NULL); swrite_string(&bs, buf, length); /* Set up the SubFileDecode stream. */ s_init(&ds, NULL); - s_init_state((stream_state *)&st, template, NULL); - template->set_defaults((stream_state *)&st); + s_init_state((stream_state *)&st, templat, NULL); + templat->set_defaults((stream_state *)&st); st.skip_count = start; s_init_filter(&ds, (stream_state *)&st, dbuf, sizeof(dbuf), &bs); calc_put(&ds, pfn); diff -Nru ghostscript-9.04~dfsg/base/gsgcache.c ghostscript-9.05~dfsg~20120125/base/gsgcache.c --- ghostscript-9.04~dfsg/base/gsgcache.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsgcache.c 2011-11-12 18:29:08.000000000 +0000 @@ -104,28 +104,28 @@ int gs_glyph_cache__release(void *data, void *event) { - gs_glyph_cache *this = (gs_glyph_cache *)data; - gs_glyph_cache_elem *e = this->list; - gs_font_type42 *pfont = this->pfont; + gs_glyph_cache *self = (gs_glyph_cache *)data; + gs_glyph_cache_elem *e = self->list; + gs_font_type42 *pfont = self->pfont; while (e != NULL) { gs_glyph_cache_elem *next_e; next_e = e->next; e->gd.procs->free(&e->gd, "gs_glyph_cache__release"); - gs_free_object(this->memory, e, "gs_glyph_cache_elem__release"); + gs_free_object(self->memory, e, "gs_glyph_cache_elem__release"); e = next_e; } - this->list = NULL; - gs_font_notify_unregister((gs_font *)pfont, gs_glyph_cache__release, (void *)this); - gs_free_object(this->memory, this, "gs_glyph_cache__release"); + self->list = NULL; + gs_font_notify_unregister((gs_font *)pfont, gs_glyph_cache__release, (void *)self); + gs_free_object(self->memory, self, "gs_glyph_cache__release"); return 0; } static gs_glyph_cache_elem ** -gs_glyph_cache_elem__locate(gs_glyph_cache *this, uint glyph_index) +gs_glyph_cache_elem__locate(gs_glyph_cache *self, uint glyph_index) { /* If not fond, returns an unlocked element. */ - gs_glyph_cache_elem **e = &this->list, **p_unlocked = NULL; + gs_glyph_cache_elem **e = &self->list, **p_unlocked = NULL; int count = 0; /* debug purpose only */ for (; *e != 0; e = &(*e)->next, count++) { @@ -139,12 +139,12 @@ } static inline void -gs_glyph_cache_elem__move_to_head(gs_glyph_cache *this, gs_glyph_cache_elem **pe) +gs_glyph_cache_elem__move_to_head(gs_glyph_cache *self, gs_glyph_cache_elem **pe) { gs_glyph_cache_elem *e = *pe; *pe = e->next; - e->next = this->list; - this->list = e; + e->next = self->list; + self->list = e; } /* Manage the glyph data using the font's allocator. */ diff -Nru ghostscript-9.04~dfsg/base/gsht1.c ghostscript-9.05~dfsg~20120125/base/gsht1.c --- ghostscript-9.04~dfsg/base/gsht1.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsht1.c 2011-11-21 08:55:19.000000000 +0000 @@ -23,8 +23,6 @@ #include "gxdevice.h" /* for gzht.h */ #include "gzht.h" -#include "gxwts.h" -#include "gswts.h" /* Imports from gscolor.c */ void load_transfer_map(gs_state *, gx_transfer_map *, floatp); @@ -38,9 +36,6 @@ gs_threshold2_halftone *, gs_memory_t *); static int process_client_order(gx_ht_order *, gs_state *, gs_client_order_halftone *, gs_memory_t *); -static int -gs_sethalftone_try_wts(gs_halftone *pht, gs_state *pgs, - gx_device_halftone *pdht); /* Structure types */ public_st_halftone_component(); @@ -172,9 +167,6 @@ gx_ht_order_component *pocs = 0; int code = 0; - if (gs_currentusewts(mem) && gs_sethalftone_try_wts(pht, pgs, pdht) == 0) - return 0; - switch (pht->type) { case ht_type_colorscreen: { @@ -548,132 +540,3 @@ return process_transfer(porder, pgs, NULL, &phcop->transfer_closure, mem); } - -static const gx_ht_order_procs_t wts_order_procs = { 0 -}; - -/** - * gs_sethalftone_try_wts: Try creating a wts-based device halftone. - * @pht: Client halftone. - * @pdht: Device halftone to initialize. - * - * Tries initializing @pdht based on data from @pht, using WTS. - * - * Return value: 0 on success, 1 to indicate that the initialization - * was not done, and that the legacy initialization code path should - * be used. - **/ -static int -gs_sethalftone_try_wts(gs_halftone *pht, gs_state *pgs, - gx_device_halftone *pdht) -{ - gx_device *dev = pgs->device; - int num_comps = dev->color_info.num_components; - int depth = dev->color_info.depth; - - if (pht->type != ht_type_multiple) - /* Only work with Type 5 halftones. todo: we probably want - to relax this. */ - return 1; - - if_debug2('h', "[h]%s, num_comp = %d\n", - dev->color_info.separable_and_linear == GX_CINFO_SEP_LIN ? "Separable and linear" : "Not separable and linear!", - pht->params.multiple.num_comp); - - if (dev->color_info.separable_and_linear != GX_CINFO_SEP_LIN && - pht->params.multiple.num_comp > 1) - /* WTS is only enabled for separable or monochrome devices. */ - return 1; - - /* only work with bilevel (not multilevel) devices */ - if (depth > num_comps) { - if (depth >= 2 * num_comps) - return 1; - if (dev->color_info.gray_index != GX_CINFO_COMP_NO_INDEX && - (dev->color_info.max_gray > 1 || - (num_comps > 1 && dev->color_info.max_color > 1))) - return 1; - } - - if (pht->type == ht_type_multiple) { - gs_halftone_component *components = pht->params.multiple.components; - uint num_comp = pht->params.multiple.num_comp; - int i; - gx_ht_order_component *pocs; - gx_ht_order_component *poc_next; - int code = 0; - bool have_Default = false; - - for (i = 0; i < num_comp; i++) { - if (components[i].type != ht_type_spot) - return 1; - else { - gs_spot_halftone *spot = &components[i].params.spot; - if (!spot->accurate_screens) - return 1; - } - } - - pocs = gs_alloc_struct_array( pgs->memory, - num_comp, - gx_ht_order_component, - &st_ht_order_component_element, - "gs_sethalftone_try_wts" ); - /* pocs = malloc(num_comp * sizeof(gx_ht_order_component)); */ - poc_next = &pocs[1]; - for (i = 0; i < num_comp; i++) { - gs_halftone_component *component = &components[i]; - gs_spot_halftone *spot = &component->params.spot; - gs_screen_halftone *h = &spot->screen; - gx_wts_cell_params_t *wcp; - gs_wts_screen_enum_t *wse; - gs_matrix imat; - gx_ht_order_component *poc; - - if (component->comp_number == GX_DEVICE_COLOR_MAX_COMPONENTS) { - if (have_Default) { - /* Duplicate Default */ - code = gs_note_error(gs_error_rangecheck); - break; - } - poc = pocs; - have_Default = true; - } else if (i == num_comp - 1 && !have_Default) { - /* No Default */ - code = gs_note_error(gs_error_rangecheck); - break; - } else - poc = poc_next++; - - gs_deviceinitialmatrix(gs_currentdevice(pgs), &imat); - - wcp = wts_pick_cell_size(h, &imat); - wse = gs_wts_screen_enum_new(wcp); - - poc->corder.wse = wse; - poc->corder.wts = NULL; - poc->corder.procs = &wts_order_procs; - poc->corder.data_memory = NULL; - poc->corder.num_levels = 0; - poc->corder.num_bits = 0; - poc->corder.levels = NULL; - poc->corder.bit_data = NULL; - poc->corder.cache = NULL; - poc->corder.transfer = NULL; - poc->comp_number = component->comp_number; - poc->cname = component->cname; - code = process_transfer( &poc->corder, - pgs, - spot->transfer, - &spot->transfer_closure, - pgs->memory ); - if (code < 0) - break; - } - /* todo: cleanup on error */ - pdht->components = pocs; - pdht->num_comp = num_comp; - return code; - } - return 1; -} diff -Nru ghostscript-9.04~dfsg/base/gsht.c ghostscript-9.05~dfsg~20120125/base/gsht.c --- ghostscript-9.04~dfsg/base/gsht.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsht.c 2011-11-21 08:55:19.000000000 +0000 @@ -24,7 +24,6 @@ #include "gzstate.h" #include "gxdevice.h" /* for gzht.h */ #include "gzht.h" -#include "gswts.h" #include "gxfmap.h" /* For effective transfer usage in threshold */ #define TRANSFER_INVERSE_SIZE 1024 @@ -48,19 +47,6 @@ /* Forward declarations */ void gx_set_effective_transfer(gs_state *); -/* - * *HACK ALERT* - * - * Value stored in the width field of a well-tempered screen halftone - * order, to indicate that the wts field of this order points to the - * same structure as an earlier order. This is used to suppress - * multiple realeases of shared wts_screen_t orders. - * - * The width field is available for this purpose at it is nominally - * unused in a well-tempered screening halftone. - */ -static const ushort ht_wts_suppress_release = (ushort)(-1); - /* Structure types */ public_st_ht_order(); private_st_ht_order_component(); @@ -285,17 +271,12 @@ * Internal procedure to allocate and initialize either an internally * generated or a client-defined halftone order. For spot halftones, * the client is responsible for calling gx_compute_cell_values. - * - * Note: this function is used for old-style halftones only. WTS - * halftones are allocated in gs_sethalftone_try_wts(). */ int gx_ht_alloc_ht_order(gx_ht_order * porder, uint width, uint height, uint num_levels, uint num_bits, uint strip_shift, const gx_ht_order_procs_t *procs, gs_memory_t * mem) { - porder->wse = NULL; - porder->wts = NULL; porder->threshold = NULL; porder->width = width; porder->height = height; @@ -356,8 +337,6 @@ if (pdest->bit_data != 0) memcpy(pdest->bit_data, psrc->bit_data, psrc->num_bits * psrc->procs->bit_data_elt_size); - pdest->wse = psrc->wse; - pdest->wts = psrc->wts; pdest->transfer = psrc->transfer; rc_increment(pdest->transfer); return 0; @@ -373,8 +352,6 @@ uint width = psrc->width, height = psrc->height, shift = psrc->shift; pdest->params = psrc->params; - pdest->wse = psrc->wse; - pdest->wts = 0; pdest->width = width; pdest->height = height; pdest->raster = bitmap_raster(width); @@ -602,13 +579,8 @@ if (free_cache) { if (porder->cache != 0) gx_ht_free_cache(mem, porder->cache); - else if (porder->wse != 0) - gs_wts_free_enum(porder->wse); } porder->cache = 0; - if (porder->wts != 0 && porder->width != ht_wts_suppress_release) - gs_wts_free_screen(porder->wts); - porder->wts = 0; rc_decrement(porder->transfer, "gx_ht_order_release(transfer)"); porder->transfer = 0; if (porder->data_memory != 0) { @@ -867,18 +839,6 @@ * operand device halftone; it is not set in the device * halftone in the imager state. * - * wse Points to an "enumerator" instance, used to construct - * a well-tempered screen. This is only required while - * the well-tempered screen is being constructed. This - * field is always a null pointer in the device halftone - * in the imager state. - * - * wts Points to the "constructed" form of a well-tempered - * screen. The "construction" operation occurs as part - * of the installation process. Hence, this should - * always be a null pointer in the operand device - * halftone. - * * orig_height, The height and shift values of the halftone cell, * orig_shift prior to any replication. These fields are currently * unused, and will always be the same as the height @@ -996,9 +956,9 @@ int i, code = 0; bool used_default = false; int lcm_width = 1, lcm_height = 1; - gs_wts_screen_enum_t * wse0 = pdht->order.wse; - wts_screen_t * wts0 = 0; bool mem_diff = pdht->rc.memory != pis->memory; + uint w, h; + int dw, dh; /* construct the new device halftone structure */ memset(&dht.order, 0, sizeof(dht.order)); @@ -1063,37 +1023,10 @@ /* * Copy the default order to any remaining components. - * - * For well-tempered screens, generate the wts_screen_t structure - * for each component that corresponds to the sample information - * that has been gathered. - * - * Some caution is necessary here, as multiple component orders may - * have wse fields pointing to the same gs_wts_creeen_enum_t - * structure. This structure should only be released once. If - * multiple components have such a wse value, it will be the same as - * pdht->order.wse pointer, so we can just release that pointer once - * when done. - * - * If serveral component orders have the same wse value, this code - * will create just one wts_screen_t structure. In a somewhat ugly - * hack, the width field (which is otherwise unused) will be set to - * 0xffff for all components other than the first component that - * makes use of a give wts_screen_t structure. gx_ht_order_release - * will check this field to see if it should release the structure - * pointed to by the wts field of a component order. - * - * Components that are not well-tempered screens require a cache. - * In practice, either all or non of the components will be well- - * tempered screens, but we ignore that fact here. - * - * While engaged in all of these other activities, also calculate - * the lcm_width and lcm_heigth values (only for non-well-tempered - * components). */ + for (i = 0; i < num_comps && code >= 0; i++) { - gx_ht_order * porder = &dht.components[i].corder; - gs_wts_screen_enum_t * wse; + gx_ht_order *porder = &dht.components[i].corder; if (dht.components[i].comp_number != i) { if (used_default || mem_diff) @@ -1104,61 +1037,44 @@ } dht.components[i].comp_number = i; } - if ((wse = porder->wse) != 0) { - wts_screen_t * wts = 0; - porder->width = 0; - porder->wse = 0; - if (wse != wse0) - wts = wts_screen_from_enum(wse); - else { - if (wts0 == 0) - wts0 = wts_screen_from_enum(wse); - else - porder->width = ht_wts_suppress_release; - wts = wts0; - } - if (wts == 0) + w = porder->width; + h = porder->full_height; + dw = igcd(lcm_width, w); + dh = igcd(lcm_height, h); + + lcm_width /= dw; + lcm_height /= dh; + lcm_width = (w > max_int / lcm_width ? max_int : lcm_width * w); + lcm_height = (h > max_int / lcm_height ? max_int : lcm_height * h); + + if (porder->cache == 0) { + uint tile_bytes, num_tiles, slots_wanted, rep_raster, rep_count; + gx_ht_cache * pcache; + + tile_bytes = porder->raster + * (porder->num_bits / porder->width); + num_tiles = 1 + gx_ht_cache_default_bits_size() / tile_bytes; + /* + * Limit num_tiles to a reasonable number allowing for width repition. + * The most we need is one cache slot per bit. + * This prevents allocations of large cache bits that will never + * be used. See rep_count limit in gxht.c + */ + slots_wanted = 1 + ( porder->width * porder->height ); + rep_raster = ((num_tiles*tile_bytes) / porder->height / + slots_wanted) & ~(align_bitmap_mod - 1); + rep_count = rep_raster * 8 / porder->width; + if (rep_count > sizeof(ulong) * 8 && (num_tiles > + 1 + ((num_tiles * 8 * sizeof(ulong)) / rep_count) )) + num_tiles = 1 + ((num_tiles * 8 * sizeof(ulong)) / rep_count); + pcache = gx_ht_alloc_cache( pis->memory, num_tiles, + tile_bytes * num_tiles ); + if (pcache == NULL) code = gs_error_VMerror; - else - porder->wts = wts; - } else if (porder->wts == 0) { - uint w = porder->width, h = porder->full_height; - int dw = igcd(lcm_width, w), dh = igcd(lcm_height, h); - - lcm_width /= dw; - lcm_height /= dh; - lcm_width = (w > max_int / lcm_width ? max_int : lcm_width * w); - lcm_height = (h > max_int / lcm_height ? max_int : lcm_height * h); - - if (porder->cache == 0) { - uint tile_bytes, num_tiles, slots_wanted, rep_raster, rep_count; - gx_ht_cache * pcache; - - tile_bytes = porder->raster - * (porder->num_bits / porder->width); - num_tiles = 1 + gx_ht_cache_default_bits_size() / tile_bytes; - /* - * Limit num_tiles to a reasonable number allowing for width repition. - * The most we need is one cache slot per bit. - * This prevents allocations of large cache bits that will never - * be used. See rep_count limit in gxht.c - */ - slots_wanted = 1 + ( porder->width * porder->height ); - rep_raster = ((num_tiles*tile_bytes) / porder->height / - slots_wanted) & ~(align_bitmap_mod - 1); - rep_count = rep_raster * 8 / porder->width; - if (rep_count > sizeof(ulong) * 8 && (num_tiles > - 1 + ((num_tiles * 8 * sizeof(ulong)) / rep_count) )) - num_tiles = 1 + ((num_tiles * 8 * sizeof(ulong)) / rep_count); - pcache = gx_ht_alloc_cache( pis->memory, num_tiles, - tile_bytes * num_tiles ); - if (pcache == NULL) - code = gs_error_VMerror; - else { - porder->cache = pcache; - gx_ht_init_cache(pis->memory, pcache, porder); - } + else { + porder->cache = pcache; + gx_ht_init_cache(pis->memory, pcache, porder); } } } @@ -1203,8 +1119,7 @@ /* * Everything worked. "Assume ownership" of the appropriate * portions of the source device halftone by clearing the - * associated references. This includes explicitly releasing - * any gs_wts_screen_enum_t structures. Since we might have + * associated references. Since we might have * pdht == pis->dev_ht, this must done before updating pis->dev_ht. * * If the default order has been used for a device component, and @@ -1224,8 +1139,6 @@ if ( comp_num >= 0 && comp_num < GX_DEVICE_COLOR_MAX_COMPONENTS ) { - if (p_s_order->wse != 0) - gs_wts_free_enum(p_s_order->wse); memset(p_s_order, 0, sizeof(*p_s_order)); } else if ( comp_num == GX_DEVICE_COLOR_MAX_COMPONENTS && used_default ) @@ -1233,8 +1146,6 @@ } } if (used_default) { - if (wse0 != 0) - gs_wts_free_enum(wse0); memset(&pdht->order, 0, sizeof(pdht->order)); } @@ -1530,11 +1441,19 @@ int code; byte init_value = 255; bool is_inverting = false; + int num_repeat, shift; + int row_kk, col_kk, kk; + + /* We can have simple or complete orders. Simple ones tile the threshold + with shifts. To handle those we simply loop over the number of + repeats making sure to shift columns when we set our threshold values */ + num_repeat = d_order->full_height / d_order->height; + shift = d_order->shift; if (d_order == NULL) return -1; if (d_order->threshold != NULL) return 0; d_order->threshold_inverts = is_inverting; - thresh = (byte *)gs_malloc(memory, d_order->num_bits, 1, + thresh = (byte *)gs_malloc(memory, d_order->width * d_order->full_height, 1, "gx_ht_construct_threshold"); if (thresh == NULL) { return -1 ; /* error if allocation failed */ @@ -1615,8 +1534,14 @@ return code; row = ppt.y; col = ppt.x; - if (col < (int)d_order->width) - *(thresh + col + (row * d_order->width)) = t_level; + if( col < (int)d_order->width ) { + for (kk = 0; kk < num_repeat; kk++) { + row_kk = row + kk * d_order->height; + col_kk = col + kk * shift; + col_kk = col_kk % d_order->width; + *(thresh + col_kk + (row_kk * d_order->width)) = t_level; + } + } } prev_l = l; } diff -Nru ghostscript-9.04~dfsg/base/gshtscr.c ghostscript-9.05~dfsg~20120125/base/gshtscr.c --- ghostscript-9.04~dfsg/base/gshtscr.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gshtscr.c 2011-11-21 08:55:19.000000000 +0000 @@ -21,7 +21,6 @@ #include "gzstate.h" #include "gxdevice.h" /* for gzht.h */ #include "gzht.h" -#include "gswts.h" /* Define whether to force all halftones to be strip halftones, */ /* for debugging. */ @@ -73,22 +72,6 @@ } void -gs_setusewts(gs_memory_t *mem, bool use_wts) -{ - gs_lib_ctx_t *ctx = gs_lib_ctx_get_interp_instance(mem); - - ctx->screen_use_wts = use_wts; -} - -bool -gs_currentusewts(gs_memory_t *mem) -{ - gs_lib_ctx_t *ctx = gs_lib_ctx_get_interp_instance(mem); - - return ctx->screen_use_wts; -} - -void gs_setminscreenlevels(gs_memory_t *mem, uint levels) { gs_lib_ctx_t *ctx = gs_lib_ctx_get_interp_instance(mem); @@ -492,46 +475,44 @@ penum->halftone.params.screen = *phsp; penum->x = penum->y = 0; - if (porder->wse == NULL) { - penum->strip = porder->num_levels / porder->width; - penum->shift = porder->shift; - /* - * We want a transformation matrix that maps the parallelogram - * (0,0), (U,V), (U-V',V+U'), (-V',U') to the square (+/-1, +/-1). - * If the coefficients are [a b c d e f] and we let - * u = U = M/R, v = V = N/R, - * r = -V' = -N'/R', s = U' = M'/R', - * then we just need to solve the equations: - * a*0 + c*0 + e = -1 b*0 + d*0 + f = -1 - * a*u + c*v + e = 1 b*u + d*v + f = 1 - * a*r + c*s + e = -1 b*r + d*s + f = 1 - * This has the following solution: - * Q = 2 / (M*M' + N*N') - * a = Q * R * M' - * b = -Q * R' * N - * c = Q * R * N' - * d = Q * R' * M - * e = -1 - * f = -1 - */ - { - const int M = porder->params.M, N = porder->params.N, R = porder->params.R; - const int M1 = porder->params.M1, N1 = porder->params.N1, R1 = porder->params.R1; - double Q = 2.0 / ((long)M * M1 + (long)N * N1); - - penum->mat.xx = Q * (R * M1); - penum->mat.xy = Q * (-R1 * N); - penum->mat.yx = Q * (R * N1); - penum->mat.yy = Q * (R1 * M); - penum->mat.tx = -1.0; - penum->mat.ty = -1.0; - gs_matrix_invert(&penum->mat, &penum->mat_inv); - } - if_debug7('h', "[h]Screen: (%dx%d)/%d [%f %f %f %f]\n", - porder->width, porder->height, porder->params.R, - penum->mat.xx, penum->mat.xy, - penum->mat.yx, penum->mat.yy); + penum->strip = porder->num_levels / porder->width; + penum->shift = porder->shift; + /* + * We want a transformation matrix that maps the parallelogram + * (0,0), (U,V), (U-V',V+U'), (-V',U') to the square (+/-1, +/-1). + * If the coefficients are [a b c d e f] and we let + * u = U = M/R, v = V = N/R, + * r = -V' = -N'/R', s = U' = M'/R', + * then we just need to solve the equations: + * a*0 + c*0 + e = -1 b*0 + d*0 + f = -1 + * a*u + c*v + e = 1 b*u + d*v + f = 1 + * a*r + c*s + e = -1 b*r + d*s + f = 1 + * This has the following solution: + * Q = 2 / (M*M' + N*N') + * a = Q * R * M' + * b = -Q * R' * N + * c = Q * R * N' + * d = Q * R' * M + * e = -1 + * f = -1 + */ + { + const int M = porder->params.M, N = porder->params.N, R = porder->params.R; + const int M1 = porder->params.M1, N1 = porder->params.N1, R1 = porder->params.R1; + double Q = 2.0 / ((long)M * M1 + (long)N * N1); + + penum->mat.xx = Q * (R * M1); + penum->mat.xy = Q * (-R1 * N); + penum->mat.yx = Q * (R * N1); + penum->mat.yy = Q * (R1 * M); + penum->mat.tx = -1.0; + penum->mat.ty = -1.0; + gs_matrix_invert(&penum->mat, &penum->mat_inv); } + if_debug7('h', "[h]Screen: (%dx%d)/%d [%f %f %f %f]\n", + porder->width, porder->height, porder->params.R, + penum->mat.xx, penum->mat.xy, + penum->mat.yx, penum->mat.yy); return 0; } @@ -544,12 +525,6 @@ double sx, sy; /* spot center in spot coords (integers) */ gs_point spot_center; /* device coords */ - if (penum->order.wse) { - int code; - code = gs_wts_screen_enum_currentpoint(penum->order.wse, ppt); - return code; - } - if (penum->y >= penum->strip) { /* all done */ gx_ht_construct_spot_order(&penum->order); return 1; @@ -594,30 +569,26 @@ int gs_screen_next(gs_screen_enum * penum, floatp value) { - if (penum->order.wse) { - return gs_wts_screen_enum_next (penum->order.wse, value); - } else { - ht_sample_t sample; - int width = penum->order.width; - gx_ht_bit *bits = (gx_ht_bit *)penum->order.bit_data; + ht_sample_t sample; + int width = penum->order.width; + gx_ht_bit *bits = (gx_ht_bit *)penum->order.bit_data; - if (value < -1.0 || value > 1.0) - return_error(gs_error_rangecheck); - sample = (ht_sample_t) ((value + 1) * max_ht_sample); + if (value < -1.0 || value > 1.0) + return_error(gs_error_rangecheck); + sample = (ht_sample_t) ((value + 1) * max_ht_sample); #ifdef DEBUG - if (gs_debug_c('H')) { - gs_point pt; + if (gs_debug_c('H')) { + gs_point pt; - gs_screen_currentpoint(penum, &pt); - dlprintf6("[H]sample x=%d y=%d (%f,%f): %f -> %u\n", - penum->x, penum->y, pt.x, pt.y, value, sample); - } -#endif - bits[penum->y * width + penum->x].mask = sample; - if (++(penum->x) >= width) - penum->x = 0, ++(penum->y); - return 0; + gs_screen_currentpoint(penum, &pt); + dlprintf6("[H]sample x=%d y=%d (%f,%f): %f -> %u\n", + penum->x, penum->y, pt.x, pt.y, value, sample); } +#endif + bits[penum->y * width + penum->x].mask = sample; + if (++(penum->x) >= width) + penum->x = 0, ++(penum->y); + return 0; } /* Install a fully constructed screen in the gstate. */ diff -Nru ghostscript-9.04~dfsg/base/gsicc.c ghostscript-9.05~dfsg~20120125/base/gsicc.c --- ghostscript-9.04~dfsg/base/gsicc.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsicc.c 2012-01-25 08:44:24.000000000 +0000 @@ -32,19 +32,6 @@ #define SAVEICCPROFILE 0 /* - * Discard a gs_cie_icc_s structure. This requires that we call the - * destructor for ICC profile, lookup, and file objects (which are - * stored in "foreign" memory). - * - * No special action is taken with respect to the stream pointer; that is - * the responsibility of the client. */ -static void -cie_icc_finalize(void * pvicc_info) -{ - - } - -/* * Color space methods for ICCBased color spaces. ICC spaces are now considered to be concrete in that they always provide a mapping to a specified destination @@ -86,18 +73,18 @@ }; static inline void -gsicc_remap_fast(unsigned short *psrc, unsigned short *psrc_cm, - gsicc_link_t *icc_link) +gsicc_remap_fast(gx_device *dev, unsigned short *psrc, unsigned short *psrc_cm, + gsicc_link_t *icc_link) { - gscms_transform_color(icc_link, psrc, psrc_cm, 2, NULL); + (icc_link->procs.map_color)(dev, icc_link, psrc, psrc_cm, 2); } /* ICC color mapping linearity check, a 2-points case. Check only the 1/2 point */ static int gx_icc_is_linear_in_line(const gs_color_space *cs, const gs_imager_state * pis, - gx_device *dev, - const gs_client_color *c0, const gs_client_color *c1, - float smoothness, gsicc_link_t *icclink) + gx_device *dev, + const gs_client_color *c0, const gs_client_color *c1, + float smoothness, gsicc_link_t *icclink) { int nsrc = cs->type->num_components(cs); int ndes = dev->color_info.num_components; @@ -118,9 +105,9 @@ src01[k] = ((unsigned int) src0[k] + (unsigned int) src1[k]) >> 1; } /* Transform the end points and the interpolated point */ - gsicc_remap_fast(&(src0[0]), &(des0[0]), icclink); - gsicc_remap_fast(&(src1[0]), &(des1[0]), icclink); - gsicc_remap_fast(&(src01[0]), &(des01[0]), icclink); + gsicc_remap_fast(dev, &(src0[0]), &(des0[0]), icclink); + gsicc_remap_fast(dev, &(src1[0]), &(des1[0]), icclink); + gsicc_remap_fast(dev, &(src01[0]), &(des01[0]), icclink); /* Interpolate 1/2 value in des space and compare */ for (k = 0; k < ndes; k++) { interp_des = (des0[k] + des1[k]) >> 1; @@ -170,13 +157,13 @@ src012[k] = (src12[k] + src0[k]) >> 1; } /* Map the points */ - gsicc_remap_fast(&(src0[0]), &(des0[0]), icclink); - gsicc_remap_fast(&(src1[0]), &(des1[0]), icclink); - gsicc_remap_fast(&(src2[0]), &(des2[0]), icclink); - gsicc_remap_fast(&(src01[0]), &(des01[0]), icclink); - gsicc_remap_fast(&(src12[0]), &(des12[0]), icclink); - gsicc_remap_fast(&(src02[0]), &(des02[0]), icclink); - gsicc_remap_fast(&(src012[0]), &(des012[0]), icclink); + gsicc_remap_fast(dev, &(src0[0]), &(des0[0]), icclink); + gsicc_remap_fast(dev, &(src1[0]), &(des1[0]), icclink); + gsicc_remap_fast(dev, &(src2[0]), &(des2[0]), icclink); + gsicc_remap_fast(dev, &(src01[0]), &(des01[0]), icclink); + gsicc_remap_fast(dev, &(src12[0]), &(des12[0]), icclink); + gsicc_remap_fast(dev, &(src02[0]), &(des02[0]), icclink); + gsicc_remap_fast(dev, &(src012[0]), &(des012[0]), icclink); /* Interpolate in des space and check it */ for (k = 0; k < ndes; k++){ interp_des = (des0[k] + des1[k]) >> 1; @@ -286,7 +273,7 @@ cmm_dev_profile_t *dev_profile; code = dev_proc(dev, get_profile)(dev, &dev_profile); - num_colorants = dev_profile->device_profile[0]->num_comps; + num_colorants = gsicc_get_device_profile_comps(dev_profile); switch( num_colorants ) { case 1: code = gx_remap_concrete_DGray(pconc, pcs, pdc, pis, dev, select); @@ -303,7 +290,7 @@ code = -1; break; } - return(code); + return code; } /* @@ -328,7 +315,7 @@ cmm_dev_profile_t *dev_profile; code = dev_proc(dev, get_profile)(dev, &dev_profile); - num_des_comps = dev_profile->device_profile[0]->num_comps; + num_des_comps = gsicc_get_device_profile_comps(dev_profile); rendering_params.black_point_comp = BP_ON; rendering_params.graphics_type_tag = dev->graphics_type_tag; /* Need to figure out which one rules here on rendering intent. The @@ -350,26 +337,26 @@ } } /* Get a link from the cache, or create if it is not there. Need to get 16 bit profile */ - icc_link = gsicc_get_link(pis, dev, pcs, NULL, &rendering_params, pis->memory, false); + icc_link = gsicc_get_link(pis, dev, pcs, NULL, &rendering_params, pis->memory); if (icc_link->is_identity) { psrc_temp = &(psrc[0]); } else { /* Transform the color */ psrc_temp = &(psrc_cm[0]); - gscms_transform_color(icc_link, psrc, psrc_temp, 2, NULL); + (icc_link->procs.map_color)(dev, icc_link, psrc, psrc_temp, 2); } #ifdef DEBUG if (!icc_link->is_identity) { num_src_comps = pcs->cmm_icc_profile_data->num_comps; - if_debug0('c',"[c]ICC remap [ "); + if_debug0(gs_debug_flag_icc,"[icc] remap [ "); for (k = 0; k < num_src_comps; k++) { - if_debug1('c', "%d ",psrc[k]); + if_debug1(gs_debug_flag_icc, "%d ",psrc[k]); } - if_debug0('c',"] --> [ "); + if_debug0(gs_debug_flag_icc,"] --> [ "); for (k = 0; k < num_des_comps; k++) { - if_debug1('c', "%d ",psrc_temp[k]); + if_debug1(gs_debug_flag_icc, "%d ",psrc_temp[k]); } - if_debug0('c',"]\n"); + if_debug0(gs_debug_flag_icc,"]\n"); } #endif /* Release the link */ @@ -413,23 +400,23 @@ cmm_dev_profile_t *dev_profile; code = dev_proc(dev, get_profile)(dev, &dev_profile); - num_des_comps = dev_profile->device_profile[0]->num_comps; + num_des_comps = gsicc_get_device_profile_comps(dev_profile); /* Define the rendering intents. MJV to fix */ rendering_params.black_point_comp = BP_ON; rendering_params.graphics_type_tag = dev->graphics_type_tag; rendering_params.rendering_intent = pis->renderingintent; - for (k = 0; k < pcs->cmm_icc_profile_data->num_comps; k++){ + for (k = 0; k < pcs->cmm_icc_profile_data->num_comps; k++) { psrc[k] = (unsigned short) (pcc->paint.values[k]*65535.0); - } + } /* Get a link from the cache, or create if it is not there. Get 16 bit profile */ - icc_link = gsicc_get_link(pis, dev, pcs, NULL, &rendering_params, pis->memory, false); + icc_link = gsicc_get_link(pis, dev, pcs, NULL, &rendering_params, pis->memory); /* Transform the color */ if (icc_link->is_identity) { psrc_temp = &(psrc[0]); } else { /* Transform the color */ psrc_temp = &(psrc_cm[0]); - gscms_transform_color(icc_link, psrc, psrc_temp, 2, NULL); + (icc_link->procs.map_color)(dev, icc_link, psrc, psrc_temp, 2); } /* This needs to be optimized */ for (k = 0; k < num_des_comps; k++){ diff -Nru ghostscript-9.04~dfsg/base/gsicc_cache.c ghostscript-9.05~dfsg~20120125/base/gsicc_cache.c --- ghostscript-9.04~dfsg/base/gsicc_cache.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsicc_cache.c 2012-01-25 08:44:24.000000000 +0000 @@ -47,8 +47,6 @@ static gsicc_link_t * gsicc_alloc_link(gs_memory_t *memory, gsicc_hashlink_t hashcode); -static void gsicc_link_free(gsicc_link_t *icc_link, gs_memory_t *memory); - static void gsicc_get_cspace_hash(gsicc_manager_t *icc_manager, gx_device *dev, cmm_profile_t *profile, int64_t *hash); @@ -58,9 +56,6 @@ gsicc_rendering_param_t *rendering_params, gsicc_hashlink_t *hash); -static gsicc_link_t* gsicc_findcachelink(gsicc_hashlink_t hashcode,gsicc_link_cache_t *icc_link_cache, - bool includes_proof); - static gsicc_link_t* gsicc_find_zeroref_cache(gsicc_link_cache_t *icc_link_cache); static void gsicc_remove_link(gsicc_link_t *link, gs_memory_t *memory); @@ -113,7 +108,7 @@ result->head = NULL; result->num_links = 0; result->memory = memory->stable_memory; - if_debug2('{',"[{]Allocating link cache = 0x%x memory = 0x%x\n", result, + if_debug2(gs_debug_flag_icc,"[icc] Allocating link cache = 0x%x memory = 0x%x\n", result, result->memory); return(result); } @@ -133,9 +128,9 @@ eprintf1("num_links is %d, should be 0.\n", link_cache->num_links); } #endif - gs_free_object(mem->stable_memory, link_cache->lock, "rc_gsicc_link_cache_free(lock)"); - gs_free_object(mem->stable_memory, link_cache->wait, "rc_gsicc_link_cache_free(wait)"); - if_debug2('{',"[{]Removing link cache = 0x%x memory = 0x%x\n", link_cache, + gx_semaphore_free(link_cache->wait); + gx_monitor_free(link_cache->lock); + if_debug2(gs_debug_flag_icc,"[icc] Removing link cache = 0x%x memory = 0x%x\n", link_cache, link_cache->memory); gs_free_object(mem->stable_memory, link_cache, "rc_gsicc_link_cache_free"); } @@ -160,12 +155,16 @@ result->next = NULL; result->contextptr = NULL; result->link_handle = NULL; + result->procs.map_buffer = gscms_transform_color_buffer; + result->procs.map_color = gscms_transform_color; + result->procs.free_link = gscms_release_link; result->hashcode.link_hashcode = hashcode.link_hashcode; result->hashcode.des_hash = 0; result->hashcode.src_hash = 0; result->hashcode.rend_hash = 0; result->ref_count = 1; /* prevent it from being freed */ result->includes_softproof = 0; + result->includes_devlink = 0; result->is_identity = false; result->valid = false; /* not yet complete */ result->num_waiting = 0; @@ -174,9 +173,10 @@ return(result); } -static void +void gsicc_set_link_data(gsicc_link_t *icc_link, void *link_handle, void *contextptr, - gsicc_hashlink_t hashcode, gx_monitor_t *lock) + gsicc_hashlink_t hashcode, gx_monitor_t *lock, + bool includes_softproof, bool includes_devlink) { gx_monitor_enter(lock); /* lock the cache while changing data */ icc_link->contextptr = contextptr; @@ -185,7 +185,8 @@ icc_link->hashcode.des_hash = hashcode.des_hash; icc_link->hashcode.src_hash = hashcode.src_hash; icc_link->hashcode.rend_hash = hashcode.rend_hash; - icc_link->includes_softproof = 0; /* Need to enable this at some point */ + icc_link->includes_softproof = includes_softproof; + icc_link->includes_devlink = includes_devlink; if ( hashcode.src_hash == hashcode.des_hash ) { icc_link->is_identity = true; } else { @@ -201,36 +202,15 @@ gx_monitor_leave(lock); /* done with updating, let everyone run */ } -static void +void gsicc_link_free(gsicc_link_t *icc_link, gs_memory_t *memory) { - gscms_release_link(icc_link); - gs_free_object(memory->stable_memory, icc_link->wait, "gsicc_link_free(wait)"); + icc_link->procs.free_link(icc_link); + gx_semaphore_free(icc_link->wait); gs_free_object(memory->stable_memory, icc_link, "gsicc_link_free"); } static void -gsicc_get_gscs_hash(gsicc_manager_t *icc_manager, gs_color_space *colorspace, int64_t *hash) -{ - /* There may be some work to do here with respect to pattern and indexed spaces */ - const gs_color_space_type *pcst = colorspace->type; - - switch(pcst->index) { - case gs_color_space_index_DeviceGray: - *hash = icc_manager->default_gray->hashcode; - break; - case gs_color_space_index_DeviceRGB: - *hash = icc_manager->default_rgb->hashcode; - break; - case gs_color_space_index_DeviceCMYK: - *hash = icc_manager->default_cmyk->hashcode; - break; - default: - break; - } -} - -static void gsicc_mash_hash(gsicc_hashlink_t *hash) { hash->link_hashcode = @@ -325,8 +305,9 @@ } } -static gsicc_link_t* -gsicc_findcachelink(gsicc_hashlink_t hash, gsicc_link_cache_t *icc_link_cache, bool includes_proof) +gsicc_link_t* +gsicc_findcachelink(gsicc_hashlink_t hash, gsicc_link_cache_t *icc_link_cache, + bool includes_proof, bool includes_devlink) { gsicc_link_t *curr, *prev; int64_t hashcode = hash.link_hashcode; @@ -340,14 +321,19 @@ prev = NULL; while (curr != NULL ) { - if (curr->hashcode.link_hashcode == hashcode && includes_proof == curr->includes_softproof) { - /* move this one to the front of the list hoping we will use it again soon */ - if (prev != NULL) { /* if prev == NULL, curr is already the head */ + if (curr->hashcode.link_hashcode == hashcode && + includes_proof == curr->includes_softproof && + includes_devlink == curr->includes_devlink) { + /* move this one to the front of the list hoping we will use it + again soon */ + if (prev != NULL) { + /* if prev == NULL, curr is already the head */ prev->next = curr->next; curr->next = icc_link_cache->head; icc_link_cache->head = curr; } - curr->ref_count++; /* bump the ref_count since we will be using this one */ + curr->ref_count++; + /* bump the ref_count since we will be using this one */ while (curr->valid == false) { curr->num_waiting++; gx_monitor_leave(icc_link_cache->lock); @@ -399,7 +385,7 @@ gsicc_link_t *curr, *prev; gsicc_link_cache_t *icc_link_cache = link->icc_link_cache; - if_debug2('{',"[{]Removing link = 0x%x memory = 0x%x\n", link, + if_debug2(gs_debug_flag_icc,"[icc] Removing link = 0x%x memory = 0x%x\n", link, memory->stable_memory); /* NOTE: link->ref_count must be 0: assert ? */ gx_monitor_enter(icc_link_cache->lock); @@ -425,10 +411,9 @@ gsicc_link_t* gsicc_get_link(const gs_imager_state *pis, gx_device *dev_in, - const gs_color_space *input_colorspace, + const gs_color_space *pcs_in, gs_color_space *output_colorspace, - gsicc_rendering_param_t *rendering_params, - gs_memory_t *memory, bool include_softproof) + gsicc_rendering_param_t *rendering_params, gs_memory_t *memory) { cmm_profile_t *gs_input_profile; cmm_profile_t *gs_srcgtag_profile = NULL; @@ -440,6 +425,7 @@ cmm_dev_profile_t *dev_profile; int code; bool devicegraytok; + gs_color_space *input_colorspace = (gs_color_space*) pcs_in; if (dev_in == NULL) { /* Get from the imager state which is going to be a graphic state. @@ -475,14 +461,29 @@ } } } - if ( output_colorspace != NULL ) { + if (output_colorspace != NULL) { gs_output_profile = output_colorspace->cmm_icc_profile_data; devicegraytok = false; } else { /* Use the device profile. Only use the rendering intent if override_ri is set. Note that this can conflict with intents set from the source objects so the user needs to understand what options to set. */ + gs_color_space_index index = + gsicc_get_default_type(gs_input_profile); code = dev_proc(dev, get_profile)(dev, &dev_profile); + /* Check for unmanaged color case */ + if (index < gs_color_space_index_DevicePixel && + dev_profile->usefastcolor) { + /* Return a "link" from the source space to the device color space */ + gsicc_link_t *link = gsicc_nocm_get_link(pis, dev, index); + if (link != NULL) { + if (gs_input_profile->num_comps == + dev_profile->device_profile[0]->num_comps) { + link->is_identity = true; + } + return link; + } + } gsicc_extract_profile(dev->graphics_type_tag, dev_profile, &(gs_output_profile), &rendering_intent); /* Check if the incoming rendering itent was source based @@ -500,52 +501,20 @@ profiles */ rendering_params->rendering_intent = rendering_params->rendering_intent & gsRI_MASK; return(gsicc_get_link_profile(pis, dev, gs_input_profile, gs_output_profile, - rendering_params, memory, include_softproof, devicegraytok)); + rendering_params, memory, devicegraytok)); } -/* This is the main function called to obtain a linked transform from the ICC cache - If the cache has the link ready, it will return it. If not, it will request - one from the CMS and then return it. We may need to do some cache locking during - this process to avoid multi-threaded issues (e.g. someone deleting while someone - is updating a reference count) */ - -gsicc_link_t* -gsicc_get_link_profile(gs_imager_state *pis, gx_device *dev, - cmm_profile_t *gs_input_profile, - cmm_profile_t *gs_output_profile, - gsicc_rendering_param_t *rendering_params, - gs_memory_t *memory, bool include_softproof, - bool devicegraytok) +/* This operation of adding in a new link entry is actually shared amongst + different functions that can each add an entry. For example, entrys may + come from the CMM or they may come from the non color managed approach + (i.e. gsicc_nocm_get_link) */ +bool +gsicc_alloc_link_entry(gsicc_link_cache_t *icc_link_cache, + gsicc_link_t **ret_link, gsicc_hashlink_t hash, + bool include_softproof, bool include_devlink) { - gsicc_hashlink_t hash; - gsicc_link_t *link, *found_link; - gcmmhlink_t link_handle = NULL; - void **contextptr = NULL; - gsicc_manager_t *icc_manager = pis->icc_manager; - gsicc_link_cache_t *icc_link_cache = pis->icc_link_cache; - gs_memory_t *cache_mem = pis->icc_link_cache->memory; - gcmmhprofile_t *cms_input_profile; - gcmmhprofile_t *cms_output_profile; - int code; - - /* First compute the hash code for the incoming case */ - /* If the output color space is NULL we will use the device profile for the output color space */ - gsicc_compute_linkhash(icc_manager, dev, gs_input_profile, gs_output_profile, - rendering_params, &hash); - /* Check the cache for a hit. Need to check if softproofing was used */ - found_link = gsicc_findcachelink(hash, icc_link_cache, include_softproof); - /* Got a hit, return link (ref_count for the link was already bumped */ - if (found_link != NULL) { - if_debug2('{',"[{]Found Link = 0x%x, hash = %I64d \n", link, - hash.link_hashcode); - if_debug2('{',"[{]input_numcomps = %d, input_hash = %I64d \n", - gs_input_profile->num_comps, gs_input_profile->hashcode); - if_debug2('{',"[{]output_numcomps = %d, output_hash = %I64d \n", - gs_output_profile->num_comps, gs_output_profile->hashcode); - return(found_link); - } - /* If not, then lets create a new one if there is room or return NULL */ - /* Caller will need to try later */ + gs_memory_t *cache_mem = icc_link_cache->memory; + gsicc_link_t *link; /* First see if we can add a link */ /* TODO: this should be based on memory usage, not just num_links */ @@ -560,11 +529,11 @@ gx_semaphore_wait(icc_link_cache->wait); /* repeat the findcachelink to see if some other thread has */ /*already started building the link we need */ - found_link = gsicc_findcachelink(hash, icc_link_cache, include_softproof); + *ret_link = gsicc_findcachelink(hash, icc_link_cache, + include_softproof, include_devlink); /* Got a hit, return link (ref_count for the link was already bumped */ - if (found_link != NULL) - return(found_link); /* TO FIX: We are really not going to want to have the members - of this object visible outside gsiccmange */ + if (*ret_link != NULL) + return true; gx_monitor_enter(icc_link_cache->lock); /* restore the lock */ /* we will re-test the num_links above while locked to insure */ /* that some other thread didn't grab the slot and max us out */ @@ -578,17 +547,79 @@ } /* insert an empty link that we will reserve so we */ /* can unlock while building the link contents */ - if_debug4('{',"[{]Allocating ICC Link dev = 0x%x, link_cache = 0x%x, mem = 0x%x curr number links = %d\n", - dev, icc_link_cache, cache_mem->stable_memory, - icc_link_cache->num_links); - link = gsicc_alloc_link(cache_mem->stable_memory, hash); - link->icc_link_cache = icc_link_cache; - link->next = icc_link_cache->head; - icc_link_cache->head = link; + (*ret_link) = gsicc_alloc_link(cache_mem->stable_memory, hash); + (*ret_link)->icc_link_cache = icc_link_cache; + (*ret_link)->next = icc_link_cache->head; + icc_link_cache->head = *ret_link; icc_link_cache->num_links++; - gx_monitor_leave(icc_link_cache->lock); /* now that we own this link we can release */ - /* the lock since it is not valid */ + /* now that we own this link we can release + the lock since it is not valid */ + gx_monitor_leave(icc_link_cache->lock); + return false; +} + +/* This is the main function called to obtain a linked transform from the ICC + cache If the cache has the link ready, it will return it. If not, it will + request one from the CMS and then return it. We may need to do some cache + locking during this process to avoid multi-threaded issues (e.g. someone + deleting while someone is updating a reference count) */ +gsicc_link_t* +gsicc_get_link_profile(const gs_imager_state *pis, gx_device *dev, + cmm_profile_t *gs_input_profile, + cmm_profile_t *gs_output_profile, + gsicc_rendering_param_t *rendering_params, + gs_memory_t *memory, bool devicegraytok) +{ + gsicc_hashlink_t hash; + gsicc_link_t *link, *found_link; + gcmmhlink_t link_handle = NULL; + void **contextptr = NULL; + gsicc_manager_t *icc_manager = pis->icc_manager; + gsicc_link_cache_t *icc_link_cache = pis->icc_link_cache; + gs_memory_t *cache_mem = pis->icc_link_cache->memory; + gcmmhprofile_t *cms_input_profile; + gcmmhprofile_t *cms_output_profile; + gcmmhprofile_t *cms_proof_profile = NULL; + gcmmhprofile_t *cms_devlink_profile = NULL; + int code; + bool include_softproof = false; + bool include_devicelink = false; + cmm_dev_profile_t *dev_profile; + cmm_profile_t *proof_profile = NULL; + cmm_profile_t *devlink_profile = NULL; + /* Determine if we are using a soft proof or device link profile */ + if (dev != NULL ) { + code = dev_proc(dev, get_profile)(dev, &dev_profile); + if (dev_profile != NULL) { + proof_profile = dev_profile->proof_profile; + devlink_profile = dev_profile->link_profile; + } + if (proof_profile != NULL ) include_softproof = true; + if (devlink_profile != NULL) include_devicelink = true; + } + /* First compute the hash code for the incoming case. If the output color + space is NULL we will use the device profile for the output color space */ + gsicc_compute_linkhash(icc_manager, dev, gs_input_profile, gs_output_profile, + rendering_params, &hash); + /* Check the cache for a hit. Need to check if softproofing was used */ + found_link = gsicc_findcachelink(hash, icc_link_cache, include_softproof, + include_devicelink); + /* Got a hit, return link (ref_count for the link was already bumped */ + if (found_link != NULL) { + if_debug2(gs_debug_flag_icc, "[icc] Found Link = 0x%x, hash = %I64d \n", + found_link, hash.link_hashcode); + if_debug2(gs_debug_flag_icc, "[icc] input_numcomps = %d, input_hash = %I64d \n", + gs_input_profile->num_comps, gs_input_profile->hashcode); + if_debug2(gs_debug_flag_icc, "[icc] output_numcomps = %d, output_hash = %I64d \n", + gs_output_profile->num_comps, gs_output_profile->hashcode); + return(found_link); + } + /* If not, then lets create a new one if there is room. This may actually + return a link if another thread has already created it */ + if (gsicc_alloc_link_entry(icc_link_cache, &link, hash, include_softproof, + include_devicelink)) + return link; /* Now compute the link contents */ cms_input_profile = gs_input_profile->profile_handle; if (cms_input_profile == NULL) { @@ -618,7 +649,6 @@ } } } - cms_output_profile = gs_output_profile->profile_handle; if (cms_output_profile == NULL) { if (gs_output_profile->buffer != NULL) { @@ -645,6 +675,40 @@ } } } + if (include_softproof) { + cms_proof_profile = proof_profile->profile_handle; + if (cms_proof_profile == NULL) { + if (proof_profile->buffer != NULL) { + cms_proof_profile = + gsicc_get_profile_handle_buffer(proof_profile->buffer, + proof_profile->buffer_size); + proof_profile->profile_handle = cms_proof_profile; + gx_monitor_enter(proof_profile->lock); + } else { + /* Cant create the link */ + gsicc_remove_link(link, cache_mem); + icc_link_cache->num_links--; + return(NULL); + } + } + } + if (include_devicelink) { + cms_devlink_profile = devlink_profile->profile_handle; + if (cms_devlink_profile == NULL) { + if (devlink_profile->buffer != NULL) { + cms_devlink_profile = + gsicc_get_profile_handle_buffer(devlink_profile->buffer, + devlink_profile->buffer_size); + devlink_profile->profile_handle = cms_devlink_profile; + gx_monitor_enter(devlink_profile->lock); + } else { + /* Cant create the link */ + gsicc_remove_link(link, cache_mem); + icc_link_cache->num_links--; + return(NULL); + } + } + } /* Profile reading of same structure not thread safe in lcms */ gx_monitor_enter(gs_input_profile->lock); gx_monitor_enter(gs_output_profile->lock); @@ -670,18 +734,34 @@ cms_output_profile = icc_manager->graytok_profile->profile_handle; } - link_handle = gscms_get_link(cms_input_profile, cms_output_profile, - rendering_params); + /* Get the link with the proof and or device link profile */ + if (include_softproof || include_devicelink) { + link_handle = gscms_get_link_proof_devlink(cms_input_profile, + cms_proof_profile, + cms_output_profile, + cms_devlink_profile, + rendering_params); + if (include_softproof) { + gx_monitor_leave(proof_profile->lock); + } + if (include_devicelink) { + gx_monitor_leave(devlink_profile->lock); + } + } else { + link_handle = gscms_get_link(cms_input_profile, cms_output_profile, + rendering_params); + } gx_monitor_leave(gs_output_profile->lock); gx_monitor_leave(gs_input_profile->lock); if (link_handle != NULL) { gsicc_set_link_data(link, link_handle, contextptr, hash, - icc_link_cache->lock); - if_debug2('{',"[{]New Link = 0x%x, hash = %I64d \n", link, - hash.link_hashcode); - if_debug2('{',"[{]input_numcomps = %d, input_hash = %I64d \n", + icc_link_cache->lock, include_softproof, + include_devicelink); + if_debug2(gs_debug_flag_icc,"[icc] New Link = 0x%x, hash = %I64d \n", + link, hash.link_hashcode); + if_debug2(gs_debug_flag_icc,"[icc] input_numcomps = %d, input_hash = %I64d \n", gs_input_profile->num_comps, gs_input_profile->hashcode); - if_debug2('{',"[{]output_numcomps = %d, output_hash = %I64d \n", + if_debug2(gs_debug_flag_icc,"[icc] output_numcomps = %d, output_hash = %I64d \n", gs_output_profile->num_comps, gs_output_profile->hashcode); } else { gsicc_remove_link(link, cache_mem); @@ -758,7 +838,7 @@ /* Support functions for parsing buffer */ static int -get_to_next_line(unsigned char **buffptr, int *buffer_count) +get_to_next_line(char **buffptr, int *buffer_count) { while (1) { if (**buffptr == ';') { @@ -781,8 +861,7 @@ gx_color_value device_values[], const gs_imager_state *pis, gx_device *dev, cmm_profile_t *gs_output_profile, - gsicc_rendering_param_t *rendering_params, - bool include_softproof) + gsicc_rendering_param_t *rendering_params) { gsicc_namedcolor_t *namedcolor_data; @@ -791,7 +870,7 @@ gsicc_namedcolortable_t *namedcolor_table; int k,j; float lab[3]; - const char *buffptr; + char *buffptr; int buffer_count; int count; int code; @@ -824,7 +903,7 @@ "gsicc_transform_named_color"); if (namedcolor_table == NULL) return(-1); /* Parse buffer and load the structure we will be searching */ - buffptr = (const char*) named_profile->buffer; + buffptr = (char*) named_profile->buffer; buffer_count = named_profile->buffer_size; count = sscanf(buffptr,"%d",&num_entries); if (num_entries < 1 || count == 0) { @@ -940,14 +1019,13 @@ icc_link = gsicc_get_link_profile(pis, dev, pis->icc_manager->lab_profile, curr_output_profile, rendering_params, - pis->memory, false, - false); + pis->memory, false); if (icc_link->is_identity) { psrc_temp = &(psrc[0]); } else { /* Transform the color */ psrc_temp = &(psrc_cm[0]); - gscms_transform_color(icc_link, psrc, psrc_temp, 2, NULL); + (icc_link->procs.map_color)(dev, icc_link, psrc, psrc_temp, 2); } gsicc_release_link(icc_link); for ( k = 0; k < curr_output_profile->num_comps; k++){ @@ -1036,3 +1114,17 @@ buffer_desc->little_endian = true; } + +/* Return the proper component numbers based upon the profiles of the device. + This is in here since it is usually called when creating and using a link + from the link cache. */ +int +gsicc_get_device_profile_comps(cmm_dev_profile_t *dev_profile) +{ + if (dev_profile->link_profile == NULL) { + return dev_profile->device_profile[0]->num_comps; + } else { + return dev_profile->link_profile->num_comps_out; + } +} + diff -Nru ghostscript-9.04~dfsg/base/gsicc_cache.h ghostscript-9.05~dfsg~20120125/base/gsicc_cache.h --- ghostscript-9.04~dfsg/base/gsicc_cache.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsicc_cache.h 2012-01-25 08:44:24.000000000 +0000 @@ -26,29 +26,38 @@ #endif gsicc_link_cache_t* gsicc_cache_new(gs_memory_t *memory); -void -gsicc_init_buffer(gsicc_bufferdesc_t *buffer_desc, unsigned char num_chan, +gsicc_link_t* gsicc_findcachelink(gsicc_hashlink_t hashcode, + gsicc_link_cache_t *icc_link_cache, + bool includes_proof, bool includes_devlink); +void gsicc_init_buffer(gsicc_bufferdesc_t *buffer_desc, unsigned char num_chan, unsigned char bytes_per_chan, bool has_alpha, bool alpha_first, bool is_planar, int plane_stride, int row_stride, int num_rows, int pixels_per_row); +bool gsicc_alloc_link_entry(gsicc_link_cache_t *icc_link_cache, + gsicc_link_t **ret_link, gsicc_hashlink_t hash, + bool include_softproof, bool include_devlink); gsicc_link_t* gsicc_get_link(const gs_imager_state * pis, gx_device *dev, const gs_color_space *input_colorspace, gs_color_space *output_colorspace, gsicc_rendering_param_t *rendering_params, - gs_memory_t *memory, bool include_softproof); -gsicc_link_t* gsicc_get_link_profile(gs_imager_state *pis, gx_device *dev, + gs_memory_t *memory); +gsicc_link_t* gsicc_get_link_profile(const gs_imager_state *pis, gx_device *dev, cmm_profile_t *gs_input_profile, cmm_profile_t *gs_output_profile, gsicc_rendering_param_t *rendering_params, - gs_memory_t *memory, bool include_softproof, - bool devicegraytok); + gs_memory_t *memory, bool devicegraytok); void gsicc_release_link(gsicc_link_t *icclink); +void gsicc_set_link_data(gsicc_link_t *icc_link, void *link_handle, + void *contextptr, gsicc_hashlink_t hashcode, + gx_monitor_t *lock, bool includes_proof, + bool includes_devlink); +void gsicc_link_free(gsicc_link_t *icc_link, gs_memory_t *memory); void gsicc_get_icc_buff_hash(unsigned char *buffer, int64_t *hash, unsigned int buff_size); int gsicc_transform_named_color(float tint_value, byte *color_name, uint name_size, gx_color_value device_values[], const gs_imager_state *pis, gx_device *dev, cmm_profile_t *gs_output_profile, - gsicc_rendering_param_t *rendering_params, - bool include_softproof); + gsicc_rendering_param_t *rendering_params); +int gsicc_get_device_profile_comps(cmm_dev_profile_t *dev_profile); #endif diff -Nru ghostscript-9.04~dfsg/base/gsicc_cms.h ghostscript-9.05~dfsg~20120125/base/gsicc_cms.h --- ghostscript-9.04~dfsg/base/gsicc_cms.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsicc_cms.h 2012-01-25 08:44:24.000000000 +0000 @@ -31,10 +31,12 @@ /* Prototypes */ +gsicc_link_t* gsicc_nocm_get_link(const gs_imager_state *pis, gx_device *dev, + gs_color_space_index src_index); gcmmhprofile_t gscms_get_profile_handle_mem(unsigned char *buffer, unsigned int input_size); gcmmhprofile_t gscms_get_profile_handle_file(const char *filename); -void gscms_transform_color_buffer(gsicc_link_t *icclink, +void gscms_transform_color_buffer(gx_device *dev, gsicc_link_t *icclink, gsicc_bufferdesc_t *input_buff_desc, gsicc_bufferdesc_t *output_buff_desc, void *inputbuffer, @@ -44,25 +46,23 @@ char* gscms_get_clrtname(gcmmhprofile_t profile, int colorcount); int gscms_get_numberclrtnames(gcmmhprofile_t profile); gsicc_colorbuffer_t gscms_get_profile_data_space(gcmmhprofile_t profile); -void gscms_transform_color(gsicc_link_t *icclink, - void *inputcolor, - void *outputcolor, - int num_bytes, - void **contextptr); +void gscms_transform_color(gx_device *dev, gsicc_link_t *icclink, void *inputcolor, + void *outputcolor, int num_bytes); gcmmhlink_t gscms_get_link(gcmmhprofile_t lcms_srchandle, gcmmhprofile_t lcms_deshandle, gsicc_rendering_param_t *rendering_params); -gcmmhlink_t gscms_get_link_proof(gcmmhprofile_t lcms_srchandle, - gcmmhprofile_t lcms_deshandle, - gcmmhprofile_t lcms_proofhandle, - gsicc_rendering_param_t *rendering_params); +gcmmhlink_t gscms_get_link_proof_devlink(gcmmhprofile_t lcms_srchandle, + gcmmhprofile_t lcms_proofhandle, + gcmmhprofile_t lcms_deshandle, + gcmmhprofile_t lcms_devlinkhandle, + gsicc_rendering_param_t *rendering_params); void gscms_create(void **contextptr); void gscms_destroy(void **contextptr); void gscms_release_link(gsicc_link_t *icclink); void gscms_release_profile(void *profile); int gscms_transform_named_color(gsicc_link_t *icclink, float tint_value, const char* ColorName, - gx_color_value device_values[] ); + gx_color_value device_values[] ); void gscms_get_name2device_link(gsicc_link_t *icclink, gcmmhprofile_t lcms_srchandle, gcmmhprofile_t lcms_deshandle, gcmmhprofile_t lcms_proofhandle, gsicc_rendering_param_t *rendering_params); diff -Nru ghostscript-9.04~dfsg/base/gsicc_create.c ghostscript-9.05~dfsg~20120125/base/gsicc_create.c --- ghostscript-9.04~dfsg/base/gsicc_create.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsicc_create.c 2011-09-29 11:01:33.000000000 +0000 @@ -234,83 +234,6 @@ matrix->is_identity = (vec->u == 1.0)&&(vec->v == 1.0)&&(vec->w == 1.0); } -static bool -gsicc_diagmatrix_init(gs_vector3 * vec) -{ - return(vec->u == 1.0 && vec->v == 1.0 && vec->w == 1.0); -} - -/* The following were borrowed from static functions in gdevpdfc.c - for detecting CIELAB PS definitions */ - -#define CC_KEY(i) ((i) / (double)CC_INDEX_1) -#define CC_INDEX_1 (gx_cie_cache_size - 1) - -static bool -cie_vector_cache_is_lab_abc(const gx_cie_vector_cache3_t *pvc, int i) -{ - const gx_cie_vector_cache *const pc3 = pvc->caches; - double k = CC_KEY(i); - double l0 = pc3[0].vecs.params.base, - l = l0 + k * (pc3[0].vecs.params.limit - l0); - double a0 = pc3[1].vecs.params.base, - a = a0 + k * (pc3[1].vecs.params.limit - a0); - double b0 = pc3[2].vecs.params.base, - b = b0 + k * (pc3[2].vecs.params.limit - b0); - - return (fabs(cie_cached2float(pc3[0].vecs.values[i].u) - - (l + 16) / 116) < 0.001 && - fabs(cie_cached2float(pc3[1].vecs.values[i].u) - - a / 500) < 0.001 && - fabs(cie_cached2float(pc3[2].vecs.values[i].w) - - b / -200) < 0.001 - ); -} - -static bool -cie_scalar_cache_is_lab_lmn(const gs_cie_abc *pcie, int i) -{ - double k = CC_KEY(i); - double g = (k >= 6.0 / 29 ? k * k * k : - (k - 4.0 / 29) * (108.0 / 841)); - -#define CC_V(j,i) (pcie->common.caches.DecodeLMN[j].floats.values[i]) -#define CC_WP(uvw) (pcie->common.points.WhitePoint.uvw) - - return (fabs(CC_V(0, i) - g * CC_WP(u)) < 0.001 && - fabs(CC_V(1, i) - g * CC_WP(v)) < 0.001 && - fabs(CC_V(2, i) - g * CC_WP(w)) < 0.001 - ); - -#undef CC_V -#undef CC_WP -} - -static bool -cie_is_lab(const gs_cie_abc *pcie) -{ - int i; - - /* Check MatrixABC and MatrixLMN. */ - if (!(pcie->MatrixABC.cu.u == 1 && pcie->MatrixABC.cu.v == 1 && - pcie->MatrixABC.cu.w == 1 && - pcie->MatrixABC.cv.u == 1 && pcie->MatrixABC.cv.v == 0 && - pcie->MatrixABC.cv.w == 0 && - pcie->MatrixABC.cw.u == 0 && pcie->MatrixABC.cw.v == 0 && - pcie->MatrixABC.cw.w == -1 && - pcie->common.MatrixLMN.is_identity - )) - return false; - /* Check DecodeABC and DecodeLMN. */ - for (i = 0; i <= CC_INDEX_1; ++i) - if (!(cie_vector_cache_is_lab_abc(&pcie->caches.DecodeABC, i) && - cie_scalar_cache_is_lab_lmn(pcie, i) - )) - return false; - - return true; -} - /* This function maps a gs matrix type to an ICC CLUT. This is required due to the multiple matrix and 1-D LUT forms for postscript management, which the ICC does not @@ -533,16 +456,6 @@ } #endif -static -ulong swapbytes32(ulong input) -{ - ulong output = (((0x000000ff) & (input >> 24)) - | ((0x0000ff00) & (input >> 8)) - | ((0x00ff0000) & (input << 8)) - | ((0xff000000) & (input << 24))); - return output; -} - static void write_bigendian_4bytes(unsigned char *curr_ptr,ulong input) { @@ -619,35 +532,6 @@ return( m ); } -static unsigned short -lstar2_16bit(float number_in) -{ - unsigned short returnval; - float temp; - - temp = number_in/((float) 100.0); - if (temp > 1) - temp = 1; - if (temp < 0) - temp = 0; - returnval = (unsigned short) ( (float) temp * (float) 0xff00); - return(returnval); -} - -static unsigned short -abstar2_16bit(float number_in) -{ - float temp; - - temp = number_in + ((float) 128.0); - if (temp < 0) - temp = 0; - temp = (0x8000 * temp)/ (float) 128.0; - if (temp > 0xffff) - temp = 0xffff; - return((unsigned short) temp); -} - static void init_common_tags(gsicc_tag tag_list[],int num_tags, int *last_tag) { @@ -681,48 +565,6 @@ *last_tag = curr_tag; } -static void -add_desc_tag(unsigned char *buffer,const char text[], gsicc_tag tag_list[], - int curr_tag) -{ - ulong value; - unsigned char *curr_ptr; - - curr_ptr = buffer; - write_bigendian_4bytes(curr_ptr,icSigProfileDescriptionTag); - curr_ptr += 4; - memset(curr_ptr,0,4); - curr_ptr += 4; - value = strlen(text); - write_bigendian_4bytes(curr_ptr,value+1); /* count includes NULL */ - curr_ptr += 4; - memcpy(curr_ptr,text,value); - curr_ptr += value; - memset(curr_ptr,0,79); /* Null + Unicode and Scriptcode */ - curr_ptr += value; - memset(curr_ptr,0,tag_list[curr_tag].byte_padding); /* padding */ -} - -static void -add_text_tag(unsigned char *buffer,const char text[], gsicc_tag tag_list[], - int curr_tag) -{ - ulong value; - unsigned char *curr_ptr; - - curr_ptr = buffer; - write_bigendian_4bytes(curr_ptr,icSigTextType); - curr_ptr += 4; - memset(curr_ptr,0,4); - curr_ptr += 4; - value = strlen(text); - memcpy(curr_ptr,text,value); - curr_ptr += value; - memset(curr_ptr,0,1); /* Null */ - curr_ptr++; - memset(curr_ptr,0,tag_list[curr_tag].byte_padding); /* padding */ -} - /* Code to write out v4 text type which is a table of unicode text for different regions */ static void @@ -898,29 +740,6 @@ } static void -get_matrix_floatptr(icS15Fixed16Number matrix_fixed[], float *matrix) -{ - int k; - - for (k = 0; k < 9; k++) { - matrix_fixed[k] = double2XYZtype(matrix[k]); - } -} - -static void -add_matrixdata(unsigned char *input_ptr, icS15Fixed16Number matrix_fixed[]) -{ - int j; - unsigned char *curr_ptr; - - curr_ptr = input_ptr; - for (j = 0; j < 9; j++) { - write_bigendian_4bytes(curr_ptr, matrix_fixed[j]); - curr_ptr += 4; - } -} - -static void scale_matrix(float *matrix_input,float scale_factor) { int k; @@ -1343,90 +1162,6 @@ } } -static void -add_clut_labdata_16bit(unsigned char *input_ptr, cielab_t *cielab, - int num_colors, int num_samples) -{ - int k; - unsigned short encoded_value; - unsigned char *curr_ptr; - long mlut_size; - - mlut_size = (long) pow((float) num_samples, (long) num_colors); - curr_ptr = input_ptr; - for ( k = 0; k < mlut_size; k++) { - encoded_value = lstar2_16bit(cielab[k].lstar); - write_bigendian_2bytes( curr_ptr, encoded_value); - curr_ptr += 2; - encoded_value = abstar2_16bit(cielab[k].astar); - write_bigendian_2bytes( curr_ptr, encoded_value); - curr_ptr += 2; - encoded_value = abstar2_16bit(cielab[k].bstar); - write_bigendian_2bytes( curr_ptr, encoded_value); - curr_ptr += 2; - } -} - -/* Add 16bit CLUT data that is in CIELAB color space */ -static void -add_tabledata(unsigned char *input_ptr, cielab_t *cielab, int num_colors, - int num_samples) -{ - int gridsize, numin, numout, numinentries, numoutentries; - unsigned char *curr_ptr; - icS15Fixed16Number matrix_fixed[9]; - float ident[] = {1, 0, 0, 0, 1, 0, 0, 0, 1}; - int mlut_size; - int k; - - gridsize = num_samples; /* Sampling points in MLUT */ - numin = num_colors; /* Number of input colorants */ - numout = 3; /* Number of output colorants */ - numinentries = 2; /* input 1-D LUT samples */ - numoutentries = 2; /* output 1-D LUT samples */ - /* Signature */ - curr_ptr = input_ptr; - write_bigendian_4bytes(curr_ptr,icSigLut16Type); - curr_ptr += 4; - /* Reserved */ - memset(curr_ptr,0,4); - curr_ptr += 4; - /* Padded sizes */ - *curr_ptr++ = numin; - *curr_ptr++ = numout; - *curr_ptr++ = gridsize; - *curr_ptr++ = 0; - /* Identity Matrix */ - get_matrix_floatptr(matrix_fixed,(float*) &(ident[0])); - add_matrixdata(curr_ptr,matrix_fixed); - curr_ptr += 4*9; - /* 1-D LUT sizes */ - write_bigendian_2bytes(curr_ptr, numinentries); - curr_ptr += 2; - write_bigendian_2bytes(curr_ptr, numoutentries); - curr_ptr += 2; - - /* Now the input curve data */ - for (k = 0; k < num_colors; k++) { - write_bigendian_2bytes(curr_ptr, 0); - curr_ptr += 2; - write_bigendian_2bytes(curr_ptr, 0xFFFF); - curr_ptr += 2; - } - - /* Now the CLUT data */ - add_clut_labdata_16bit(curr_ptr, cielab, num_colors, num_samples); - mlut_size = (int) pow((float) num_samples, (int) num_colors) * 2 * numout; - curr_ptr += mlut_size; - /* Now the output curve data */ - for (k = 0; k < numout; k++) { - write_bigendian_2bytes(curr_ptr, 0); - curr_ptr += 2; - write_bigendian_2bytes(curr_ptr, 0xFFFF); - curr_ptr += 2; - } -} - /* This creates an ICC profile from the PDF calGray and calRGB definitions */ cmm_profile_t* gsicc_create_from_cal(float *white, float *black, float *gamma, float *matrix, @@ -2168,8 +1903,8 @@ if we have MatrixABC, LMN Decode and Matrix LMN, otherwise we can encode the table directly and squash the rest into the curves matrix curve portion of the ICC form */ - if ( !(pcie->MatrixABC.is_identity) && has_lmn_procs && - !(pcie->common.MatrixLMN.is_identity) || 1 ) { + if ( (!(pcie->MatrixABC.is_identity) && has_lmn_procs && + !(pcie->common.MatrixLMN.is_identity)) || 1 ) { /* Table must take over some of the other elements. We are going to go to a 16 bit table in this case. For now, we are going to mash all the elements in the table. We may want to revisit this later. */ diff -Nru ghostscript-9.04~dfsg/base/gsicc_lcms2.c ghostscript-9.05~dfsg~20120125/base/gsicc_lcms2.c --- ghostscript-9.04~dfsg/base/gsicc_lcms2.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsicc_lcms2.c 2012-01-25 08:44:24.000000000 +0000 @@ -14,10 +14,10 @@ /* gsicc interface to littleCMS */ #include "gsicc_cms.h" -#include "gserror.h" #include "lcms2.h" #include "lcms2_plugin.h" #include "gslibctx.h" +#include "gserrors.h" #define DUMP_CMS_BUFFER 0 #define DEBUG_LCMS_MEM 0 @@ -35,6 +35,7 @@ #endif } +static void *gs_lcms2_malloc(cmsContext id, unsigned int size) { void *ptr; @@ -46,6 +47,7 @@ return ptr; } +static void *gs_lcms2_realloc(cmsContext id, void *ptr, unsigned int size) { void *ptr2; @@ -57,6 +59,7 @@ return ptr2; } +static void gs_lcms2_free(cmsContext id, void *ptr) { if (ptr != NULL) { @@ -179,7 +182,7 @@ /* Transform an entire buffer */ void -gscms_transform_color_buffer(gsicc_link_t *icclink, +gscms_transform_color_buffer(gx_device *dev, gsicc_link_t *icclink, gsicc_bufferdesc_t *input_buff_desc, gsicc_bufferdesc_t *output_buff_desc, void *inputbuffer, @@ -280,11 +283,10 @@ of elements of size gx_device_color. It is up to the caller to make sure the proper allocations for the colors are there. */ void -gscms_transform_color(gsicc_link_t *icclink, +gscms_transform_color(gx_device *dev, gsicc_link_t *icclink, void *inputcolor, void *outputcolor, - int num_bytes, - void **contextptr) + int num_bytes) { cmsHTRANSFORM hTransform = (cmsHTRANSFORM)icclink->link_handle; cmsUInt32Number dwInputFormat,dwOutputFormat; @@ -357,9 +359,11 @@ transparency, that would only occur at the top of the stack TODO: Add error checking */ gcmmhlink_t -gscms_get_link_proof(gcmmhprofile_t lcms_srchandle, - gcmmhprofile_t lcms_deshandle, gcmmhprofile_t lcms_proofhandle, - gsicc_rendering_param_t *rendering_params) +gscms_get_link_proof_devlink(gcmmhprofile_t lcms_srchandle, + gcmmhprofile_t lcms_proofhandle, + gcmmhprofile_t lcms_deshandle, + gcmmhprofile_t lcms_devlinkhandle, + gsicc_rendering_param_t *rendering_params) { cmsUInt32Number src_data_type,des_data_type; cmsColorSpaceSignature src_color_space,des_color_space; diff -Nru ghostscript-9.04~dfsg/base/gsicc_lcms.c ghostscript-9.05~dfsg~20120125/base/gsicc_lcms.c --- ghostscript-9.04~dfsg/base/gsicc_lcms.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsicc_lcms.c 2012-01-25 08:44:24.000000000 +0000 @@ -18,9 +18,9 @@ #endif #include "gsicc_cms.h" -#include "gserror.h" #include "lcms.h" #include "gslibctx.h" +#include "gserrors.h" #define DUMP_CMS_BUFFER 0 #define DEBUG_LCMS_MEM 0 @@ -118,7 +118,7 @@ /* Transform an entire buffer */ void -gscms_transform_color_buffer(gsicc_link_t *icclink, +gscms_transform_color_buffer(gx_device *dev, gsicc_link_t *icclink, gsicc_bufferdesc_t *input_buff_desc, gsicc_bufferdesc_t *output_buff_desc, void *inputbuffer, @@ -237,11 +237,8 @@ of elements of size gx_device_color. It is up to the caller to make sure the proper allocations for the colors are there. */ void -gscms_transform_color(gsicc_link_t *icclink, - void *inputcolor, - void *outputcolor, - int num_bytes, - void **contextptr) +gscms_transform_color(gx_device *dev, gsicc_link_t *icclink, void *inputcolor, + void *outputcolor, int num_bytes) { cmsHTRANSFORM hTransform = (cmsHTRANSFORM) icclink->link_handle; DWORD dwInputFormat,dwOutputFormat,curr_input,curr_output; @@ -272,9 +269,6 @@ int src_nChannels,des_nChannels; int lcms_src_color_space, lcms_des_color_space; - /* Check for case of request for a transfrom from a device link profile - in that case, the destination profile is NULL */ - /* First handle all the source stuff */ src_color_space = cmsGetColorSpace(lcms_srchandle); lcms_src_color_space = _cmsLCMScolorSpace(src_color_space); @@ -305,35 +299,60 @@ /* cmsFLAGS_HIGHRESPRECALC) cmsFLAGS_NOTPRECALC cmsFLAGS_LOWRESPRECALC*/ } -/* Get the link from the CMS, but include proofing. - We need to note that as an option in the rendering params. If we are doing - transparency, that would only occur at the top of the stack -TODO: Add error checking */ +/* Get the link from the CMS, but include proofing and/or a device link + profile. */ gcmmhlink_t -gscms_get_link_proof(gcmmhprofile_t lcms_srchandle, - gcmmhprofile_t lcms_deshandle, gcmmhprofile_t lcms_proofhandle, - gsicc_rendering_param_t *rendering_params) +gscms_get_link_proof_devlink(gcmmhprofile_t lcms_srchandle, + gcmmhprofile_t lcms_proofhandle, + gcmmhprofile_t lcms_deshandle, + gcmmhprofile_t lcms_devlinkhandle, + gsicc_rendering_param_t *rendering_params) { DWORD src_data_type,des_data_type; icColorSpaceSignature src_color_space,des_color_space; int src_nChannels,des_nChannels; + int lcms_src_color_space, lcms_des_color_space; + cmsHPROFILE hProfiles[5]; + int nProfiles = 0; - /* Get the data types */ + /* First handle all the source stuff */ src_color_space = cmsGetColorSpace(lcms_srchandle); - des_color_space = cmsGetColorSpace(lcms_deshandle); + lcms_src_color_space = _cmsLCMScolorSpace(src_color_space); + /* littlecms returns -1 for types it does not (but should) understand */ + if (lcms_src_color_space < 0) lcms_src_color_space = 0; src_nChannels = _cmsChannelsOf(src_color_space); + /* For now, just do single byte data, interleaved. We can change this + when we use the transformation. */ + src_data_type = (COLORSPACE_SH(lcms_src_color_space)| + CHANNELS_SH(src_nChannels)|BYTES_SH(2)); + if (lcms_deshandle != NULL) { + des_color_space = cmsGetColorSpace(lcms_deshandle); + } else { + /* We must have a device link profile. */ + des_color_space = cmsGetPCS(lcms_deshandle); + } + lcms_des_color_space = _cmsLCMScolorSpace(des_color_space); + if (lcms_des_color_space < 0) lcms_des_color_space = 0; des_nChannels = _cmsChannelsOf(des_color_space); - /* For now, just do single byte data, interleaved. We can change this when we - use the transformation. */ - src_data_type= (CHANNELS_SH(src_nChannels)|BYTES_SH(1)); - des_data_type= (CHANNELS_SH(des_nChannels)|BYTES_SH(1)); - /* Create the link. Note the gamut check alarm */ - return(cmsCreateProofingTransform(lcms_srchandle, src_data_type, - lcms_deshandle, des_data_type, - lcms_proofhandle, - rendering_params->rendering_intent, - INTENT_ABSOLUTE_COLORIMETRIC, - cmsFLAGS_GAMUTCHECK | cmsFLAGS_SOFTPROOFING )); + des_data_type = (COLORSPACE_SH(lcms_des_color_space)| + CHANNELS_SH(des_nChannels)|BYTES_SH(2)); + /* lcms proofing transform has a clunky API and can't include the device + link profile if we have both. So use cmsCreateMultiprofileTransform + instead and round trip the proofing profile. */ + hProfiles[nProfiles++] = lcms_srchandle; + if (lcms_proofhandle != NULL) { + hProfiles[nProfiles++] = lcms_proofhandle; + hProfiles[nProfiles++] = lcms_proofhandle; + } + hProfiles[nProfiles++] = lcms_deshandle; + if (lcms_devlinkhandle != NULL) { + hProfiles[nProfiles++] = lcms_devlinkhandle; + } + return(cmsCreateMultiprofileTransform(hProfiles, nProfiles, src_data_type, + des_data_type, rendering_params->rendering_intent, + (cmsFLAGS_BLACKPOINTCOMPENSATION | + cmsFLAGS_HIGHRESPRECALC | + cmsFLAGS_NOTCACHE))); } /* Do any initialization if needed to the CMS */ diff -Nru ghostscript-9.04~dfsg/base/gsicc_manage.c ghostscript-9.05~dfsg~20120125/base/gsicc_manage.c --- ghostscript-9.04~dfsg/base/gsicc_manage.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsicc_manage.c 2012-01-25 08:44:24.000000000 +0000 @@ -62,8 +62,6 @@ static stream* gsicc_open_search(const char* pname, int namelen, gs_memory_t *mem_gc, const char* dirname, int dir_namelen); -static cmm_profile_t* gsicc_get_profile( gsicc_profile_t profile_type, - gsicc_manager_t *icc_manager ); static int64_t gsicc_search_icc_table(clist_icctable_t *icc_table, int64_t icc_hashcode, int *size); static int gsicc_load_namedcolor_buffer(cmm_profile_t *profile, stream *s, @@ -94,11 +92,11 @@ }; typedef struct default_profile_def_s { - char *path; + const char *path; gsicc_profile_t default_type; } default_profile_def_t; -static const default_profile_def_t default_profile_params[] = +static default_profile_def_t default_profile_params[] = { {DEFAULT_GRAY_ICC, DEFAULT_GRAY}, {DEFAULT_RGB_ICC, DEFAULT_RGB}, @@ -113,7 +111,7 @@ (buffer[2] << 8) + buffer[3] ); } -static void gscms_set_icc_range(cmm_profile_t **icc_profile) +void gscms_set_icc_range(cmm_profile_t **icc_profile) { int num_comp = (*icc_profile)->num_comps; int k; @@ -252,7 +250,6 @@ cmm_profile_t* gsicc_finddevicen(const gs_color_space *pcs, gsicc_manager_t *icc_manager) { - int k,j,i; gsicc_devicen_entry_t *curr_entry; int num_comps; @@ -281,7 +278,6 @@ /* Get the character string and length for the component name. */ pcs->params.device_n.get_colorname_string(icc_manager->memory, names[j], &pname, &name_size); - /* Compare to the jth entry in the ICC profile */ icc_spot_entry = curr_entry->iccprofile->spotnames->head; for ( i = 0; i < num_comps; i++) { @@ -465,7 +461,7 @@ if (icc_manager == NULL || icc_manager->srcgtag_profile != NULL) { return 0; } else { - mem = icc_manager->memory; + mem = icc_manager->memory->non_gc_memory; str = gsicc_open_search(pname, namelen, mem, mem->gs_lib_ctx->profiledir, mem->gs_lib_ctx->profiledir_len); } @@ -638,15 +634,9 @@ manager_default_profile = &(icc_manager->default_cmyk); default_space = gsCMYK; break; - case PROOF_TYPE: - manager_default_profile = &(icc_manager->proof_profile); - break; case NAMED_TYPE: manager_default_profile = &(icc_manager->device_named); break; - case LINKED_TYPE: - manager_default_profile = &(icc_manager->output_link); - break; case LAB_TYPE: manager_default_profile = &(icc_manager->lab_profile); break; @@ -745,6 +735,35 @@ icc_profile->data_cs = gscms_get_profile_data_space(icc_profile->profile_handle); + if_debug0(gs_debug_flag_icc,"[icc] Setting ICC profile in Manager\n"); +#ifdef DEBUG /* Don't want this switch in here if we are not in debug mode */ + switch(defaulttype) { + case DEFAULT_GRAY: + if_debug0(gs_debug_flag_icc,"[icc] Default Gray\n"); + break; + case DEFAULT_RGB: + if_debug0(gs_debug_flag_icc,"[icc] Default RGB\n"); + break; + case DEFAULT_CMYK: + if_debug0(gs_debug_flag_icc,"[icc] Default CMYK\n"); + break; + case NAMED_TYPE: + if_debug0(gs_debug_flag_icc,"[icc] Named Color\n"); + break; + case LAB_TYPE: + if_debug0(gs_debug_flag_icc,"[icc] CIELAB Profile\n"); + break; + case DEVICEN_TYPE: + if_debug0(gs_debug_flag_icc,"[icc] DeviceN Profile\n"); + break; + case DEFAULT_NONE: + default: + return(0); + break; + } +#endif + if_debug1(gs_debug_flag_icc,"[icc] name = %s\n", icc_profile->name); + if_debug1(gs_debug_flag_icc,"[icc] num_comps = %d\n", icc_profile->num_comps); /* Check that we have the proper color space for the ICC profiles that can be externally set */ if (default_space != gsUNDEFINED) { @@ -934,10 +953,20 @@ /* Decrement any profiles. */ for (k = 0; k < NUM_DEVICE_PROFILES; k++) { if (icc_struct->device_profile[k] != NULL) { + if_debug1(gs_debug_flag_icc,"[icc] Releasing device profile %d\n", k); rc_decrement(icc_struct->device_profile[k], "rc_free_profile_array"); } } + if (icc_struct->link_profile != NULL) { + if_debug0(gs_debug_flag_icc,"[icc] Releasing link profile\n"); + rc_decrement(icc_struct->link_profile, "rc_free_profile_array"); + } + if (icc_struct->proof_profile != NULL) { + if_debug0(gs_debug_flag_icc,"[icc] Releasing proof profile\n"); + rc_decrement(icc_struct->proof_profile, "rc_free_profile_array"); + } + if_debug0(gs_debug_flag_icc,"[icc] Releasing device profile struct\n"); gs_free_object(mem_nongc, icc_struct, "rc_free_profile_array"); } } @@ -949,6 +978,7 @@ cmm_dev_profile_t *result; int k; + if_debug0(gs_debug_flag_icc,"[icc] Allocating device profile struct\n"); result = (cmm_dev_profile_t *) gs_alloc_bytes(memory->non_gc_memory, sizeof(cmm_dev_profile_t), "gsicc_new_device_profile_array"); @@ -958,7 +988,10 @@ result->device_profile[k] = NULL; result->intent[k] = gsPERCEPTUAL; } + result->proof_profile = NULL; + result->link_profile = NULL; result->devicegraytok = true; /* Default is to map gray to pure K */ + result->usefastcolor = false; /* Default is to not use fast color */ rc_init_free(result, memory->non_gc_memory, 1, rc_free_profile_array); return(result); } @@ -981,7 +1014,7 @@ return 0; } -/* This sets the device profile. If the device does not have a defined +/* This sets the device profiles. If the device does not have a defined profile, then a default one is selected. */ int gsicc_init_device_profile_struct(gx_device * dev, @@ -999,7 +1032,16 @@ profile_struct = dev->icc_struct; if (profile_struct != NULL) { /* Get the profile of interest */ - curr_profile = profile_struct->device_profile[profile_type]; + if (profile_type < gsPROOFPROFILE) { + curr_profile = profile_struct->device_profile[profile_type]; + } else { + /* The proof or the link profile */ + if (profile_type == gsPROOFPROFILE) { + curr_profile = profile_struct->proof_profile; + } else { + curr_profile = profile_struct->link_profile; + } + } /* See if we have the same profile in this location */ if (curr_profile != NULL) { /* There is something there now. See if what we have coming in @@ -1007,7 +1049,7 @@ the new one else we just return */ if (profile_name != NULL) { if (strncmp(curr_profile->name, profile_name, - strlen(profile_name) != 0 )) { + strlen(profile_name)) != 0 ) { /* A change in the profile. rc decrement this one as it will be replaced */ rc_decrement(dev->icc_struct->device_profile[profile_type], @@ -1026,24 +1068,40 @@ } /* Either use the incoming or a default */ if (profile_name == NULL) { + profile_name = + (char *) gs_alloc_bytes(dev->memory, + MAX_DEFAULT_ICC_LENGTH, + "gsicc_init_device_profile_struct"); switch(dev->color_info.num_components) { case 1: - profile_name = DEFAULT_GRAY_ICC; + strncpy(profile_name, DEFAULT_GRAY_ICC, strlen(DEFAULT_GRAY_ICC)); + profile_name[strlen(DEFAULT_GRAY_ICC)] = 0; break; case 3: - profile_name = DEFAULT_RGB_ICC; + strncpy(profile_name, DEFAULT_RGB_ICC, strlen(DEFAULT_RGB_ICC)); + profile_name[strlen(DEFAULT_RGB_ICC)] = 0; break; case 4: - profile_name = DEFAULT_CMYK_ICC; + strncpy(profile_name, DEFAULT_CMYK_ICC, strlen(DEFAULT_CMYK_ICC)); + profile_name[strlen(DEFAULT_CMYK_ICC)] = 0; break; default: - profile_name = DEFAULT_CMYK_ICC; + strncpy(profile_name, DEFAULT_CMYK_ICC, strlen(DEFAULT_CMYK_ICC)); + profile_name[strlen(DEFAULT_CMYK_ICC)] = 0; break; } + /* Go ahead and set the profile */ + code = gsicc_set_device_profile(dev, dev->memory, profile_name, + profile_type); + gs_free_object(dev->memory, profile_name, + "gsicc_init_device_profile_struct"); + return code; + } else { + /* Go ahead and set the profile */ + code = gsicc_set_device_profile(dev, dev->memory, profile_name, + profile_type); + return code; } - /* Go ahead and set the profile */ - code = gsicc_set_device_profile(dev, dev->memory, profile_name, profile_type); - return code; } /* This computes the hash code for the device profile and assigns the profile @@ -1051,8 +1109,8 @@ really occur only one time, but may occur twice if a color model is specified or a nondefault profile is specified on the command line */ int -gsicc_set_device_profile(gx_device * pdev, gs_memory_t * mem, char *file_name, - gsicc_profile_types_t pro_enum) +gsicc_set_device_profile(gx_device * pdev, gs_memory_t * mem, + char *file_name, gsicc_profile_types_t pro_enum) { cmm_profile_t *icc_profile; stream *str; @@ -1069,27 +1127,40 @@ icc_profile = gsicc_profile_new(str, mem, file_name, strlen(file_name)); code = sfclose(str); - pdev->icc_struct->device_profile[pro_enum] = icc_profile; - + if (pro_enum < gsPROOFPROFILE) { + if_debug1(gs_debug_flag_icc, "[icc] Setting device profile %d\n", pro_enum); + pdev->icc_struct->device_profile[pro_enum] = icc_profile; + } else { + /* The proof or the link profile */ + if (pro_enum == gsPROOFPROFILE) { + if_debug0(gs_debug_flag_icc, "[icc] Setting proof profile\n"); + pdev->icc_struct->proof_profile = icc_profile; + } else { + if_debug0(gs_debug_flag_icc, "[icc] Setting link profile\n"); + pdev->icc_struct->link_profile = icc_profile; + } + } /* Get the profile handle */ icc_profile->profile_handle = gsicc_get_profile_handle_buffer(icc_profile->buffer, icc_profile->buffer_size); - /* Compute the hash code of the profile. Everything in the ICC manager will have it's hash code precomputed */ gsicc_get_icc_buff_hash(icc_profile->buffer, &(icc_profile->hashcode), icc_profile->buffer_size); icc_profile->hash_is_valid = true; - /* Get the number of channels in the output profile */ icc_profile->num_comps = gscms_get_input_channel_count(icc_profile->profile_handle); + if_debug1(gs_debug_flag_icc, "[icc] Profile has %d components\n", + icc_profile->num_comps); icc_profile->num_comps_out = gscms_get_output_channel_count(icc_profile->profile_handle); icc_profile->data_cs = gscms_get_profile_data_space(icc_profile->profile_handle); + if_debug1(gs_debug_flag_icc, "[icc] Profile data CS is %d\n", + icc_profile->data_cs); } else return gs_rethrow(-1, "cannot find device profile"); } @@ -1171,7 +1242,7 @@ gs_free_object(mem_nongc, result, "gsicc_profile_new"); return(NULL); } - if_debug1('}',"[}]allocating ICC profile = 0x%x\n", result); + if_debug1(gs_debug_flag_icc,"[icc] allocating ICC profile = 0x%x\n", result); return(result); } @@ -1183,7 +1254,7 @@ gsicc_colorname_t *curr_name, *next_name; gs_memory_t *mem_nongc = profile->memory; - if_debug2('}',"[}]rc decrement profile = 0x%x rc = %ld\n", + if_debug2(gs_debug_flag_icc,"[icc] rc decrement profile = 0x%x rc = %ld\n", ptr_in, profile->rc.ref_count); if (profile->rc.ref_count <= 1 ) { /* Clear out the buffer if it is full */ @@ -1191,7 +1262,7 @@ gs_free_object(mem_nongc, profile->buffer, "rc_free_icc_profile"); profile->buffer = NULL; } - if_debug0('}',"[}]profile freed\n"); + if_debug0(gs_debug_flag_icc,"[icc] profile freed\n"); /* Release this handle if it has been set */ if(profile->profile_handle != NULL) { gscms_release_profile(profile->profile_handle); @@ -1293,8 +1364,6 @@ result->lab_profile = NULL; result->graytok_profile = NULL; result->device_named = NULL; - result->output_link = NULL; - result->proof_profile = NULL; result->device_n = NULL; result->smask_profiles = NULL; result->memory = memory->stable_memory; @@ -1317,8 +1386,6 @@ rc_decrement(icc_manager->default_gray, "rc_gsicc_manager_free"); rc_decrement(icc_manager->default_rgb, "rc_gsicc_manager_free"); rc_decrement(icc_manager->device_named, "rc_gsicc_manager_free"); - rc_decrement(icc_manager->output_link, "rc_gsicc_manager_free"); - rc_decrement(icc_manager->proof_profile, "rc_gsicc_manager_free"); rc_decrement(icc_manager->lab_profile, "rc_gsicc_manager_free"); rc_decrement(icc_manager->graytok_profile, "rc_gsicc_manager_free"); rc_decrement(icc_manager->srcgtag_profile, "rc_gsicc_manager_free"); @@ -1633,35 +1700,6 @@ return(0); } -static cmm_profile_t* -gsicc_get_profile( gsicc_profile_t profile_type, gsicc_manager_t *icc_manager ) -{ - - switch (profile_type) { - case DEFAULT_GRAY: - return(icc_manager->default_gray); - case DEFAULT_RGB: - return(icc_manager->default_rgb); - case DEFAULT_CMYK: - return(icc_manager->default_cmyk); - case PROOF_TYPE: - return(icc_manager->proof_profile); - case NAMED_TYPE: - return(icc_manager->device_named); - case LINKED_TYPE: - return(icc_manager->output_link); - case LAB_TYPE: - return(icc_manager->lab_profile); - case DEVICEN_TYPE: - /* TO DO */ - return(NULL); - case DEFAULT_NONE: - default: - return(NULL); - } - return(NULL); - } - static int64_t gsicc_search_icc_table(clist_icctable_t *icc_table, int64_t icc_hashcode, int *size) { @@ -1881,6 +1919,17 @@ } } +void +gsicc_setrange_lab(cmm_profile_t *profile) +{ + profile->Range.ranges[0].rmin = 0.0; + profile->Range.ranges[0].rmax = 100.0; + profile->Range.ranges[1].rmin = -128.0; + profile->Range.ranges[1].rmax = 127.0; + profile->Range.ranges[2].rmin = -128.0; + profile->Range.ranges[2].rmax = 127.0; +} + #if ICC_DUMP /* Debug dump of ICC buffer data */ static void diff -Nru ghostscript-9.04~dfsg/base/gsicc_manage.h ghostscript-9.05~dfsg~20120125/base/gsicc_manage.h --- ghostscript-9.04~dfsg/base/gsicc_manage.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsicc_manage.h 2012-01-25 08:44:24.000000000 +0000 @@ -28,6 +28,7 @@ #define SMASK_CMYK_ICC "ps_cmyk.icc" #define GRAY_TO_K "gray_to_k.icc" #define DEFAULT_DIR_ICC "%rom%iccprofiles/" +#define MAX_DEFAULT_ICC_LENGTH 17 /* Key names for special common canned profiles. These are found in some image file formats as @@ -79,7 +80,6 @@ gsicc_profile_types_t profile_type); int gsicc_init_device_profile_struct(gx_device * dev, char *profile_name, gsicc_profile_types_t profile_type); -cmm_dev_profile_name_array_t* gsicc_new_dev_icc_names(gs_memory_t *memory); int gsicc_set_profile(gsicc_manager_t *icc_manager, const char *pname, int namelen, gsicc_profile_t defaulttype); int gsicc_set_srcgtag_struct(gsicc_manager_t *icc_manager, const char* pname, @@ -102,12 +102,12 @@ gsicc_smask_t* gsicc_new_iccsmask(gs_memory_t *memory); int gsicc_initialize_iccsmask(gsicc_manager_t *icc_manager); unsigned int gsicc_getprofilesize(unsigned char *buffer); +void gscms_set_icc_range(cmm_profile_t **icc_profile); cmm_profile_t* gsicc_read_serial_icc(gx_device * dev, int64_t icc_hashcode); cmm_profile_t* gsicc_finddevicen(const gs_color_space *pcs, gsicc_manager_t *icc_manager); gs_color_space_index gsicc_get_default_type(cmm_profile_t *profile_data); cmm_dev_profile_t* gsicc_new_device_profile_array(gs_memory_t *memory); -int gsicc_sync_iccdir(gx_device *dev, const gs_state *pgs); void gs_setoverrideicc(gs_imager_state *pis, bool value); bool gs_currentoverrideicc(const gs_imager_state *pis); void gs_setoverride_ri(gs_imager_state *pis, bool value); @@ -117,6 +117,7 @@ gs_memory_t *mem); int gsicc_set_device_profile(gx_device * pdev, gs_memory_t * mem, char *file_name, gsicc_profile_types_t defaulttype); +void gsicc_setrange_lab(cmm_profile_t *profile); #if ICC_DUMP static void dump_icc_buffer(int buffersize, char filename[],byte *Buffer); diff -Nru ghostscript-9.04~dfsg/base/gsicc_nocm.c ghostscript-9.05~dfsg~20120125/base/gsicc_nocm.c --- ghostscript-9.04~dfsg/base/gsicc_nocm.c 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsicc_nocm.c 2012-01-25 08:44:24.000000000 +0000 @@ -0,0 +1,372 @@ +/* Copyright (C) 2001-2011 Artifex Software, Inc. + All Rights Reserved. + + This software is provided AS-IS with no warranty, either express or + implied. + + This software is distributed under license and may not be copied, modified + or distributed except as expressly authorized under the terms of that + license. Refer to licensing information at http://www.artifex.com/ + or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. +*/ + +/* gsicc handling for unmanaged color. */ + +#include "std.h" +#include "string_.h" +#include "stdpre.h" +#include "gstypes.h" +#include "gsmemory.h" +#include "gsstruct.h" +#include "scommon.h" +#include "strmio.h" +#include "gx.h" +#include "gxistate.h" +#include "gxcspace.h" +#include "gsicc_cms.h" +#include "gsicc_cache.h" + +/* A link structure for our non-cm color transform */ +typedef struct nocm_link_s { + /* device (or default) procs to do the transformation */ + gx_cm_color_map_procs cm_procs; + /* Since RGB to CMYK requires BG and UCR, we need to have the + imager state available */ + gs_imager_state *pis; + byte num_in; + byte num_out; + gs_memory_t *memory; +} nocm_link_t; + +static void gsicc_nocm_transform_general(gx_device *dev, gsicc_link_t *icclink, + void *inputcolor, void *outputcolor, + int num_bytes_in, int num_bytes_out); + +/* Functions that should be optimized later to do planar/chunky with + color conversions. Just putting in something that should work + right now */ + +/* At most, we have 4 input and 4 output ptrs. Since this is used only in + DeviceGray, DeviceRGB and DeviceCMYK cases */ +static void +gsicc_nocm_planar_to_planar(gx_device *dev, gsicc_link_t *icclink, + gsicc_bufferdesc_t *input_buff_desc, + gsicc_bufferdesc_t *output_buff_desc, + void *inputbuffer, void *outputbuffer) +{ + int k, j; + byte *inputpos[4]; + byte *outputpos[4]; + byte *in_buffer_ptr = (byte *) inputbuffer; + byte *out_buffer_ptr = (byte *) outputbuffer; + byte in_color[4], out_color[4]; + + for (k = 0; k < input_buff_desc->num_chan; k++) { + inputpos[k] = in_buffer_ptr + k * input_buff_desc->plane_stride; + } + for (k = 0; k < output_buff_desc->num_chan; k++) { + outputpos[k] = out_buffer_ptr + k * input_buff_desc->plane_stride; + } + /* Note to self. We currently only do this in the transparency buffer + case which has byte representation so just stepping through + plane_stride is ok at this time. */ + for (k = 0; k < input_buff_desc->plane_stride ; k++) { + for (j = 0; j < input_buff_desc->num_chan; j++) { + in_color[j] = *(inputpos[j]); + inputpos[j] += input_buff_desc->bytes_per_chan; + } + gsicc_nocm_transform_general(dev, icclink, (void*) &(in_color[0]), + (void*) &(out_color[0]), 1, 1); + for (j = 0; j < output_buff_desc->num_chan; j++) { + *(outputpos[j]) = out_color[j]; + outputpos[j] += output_buff_desc->bytes_per_chan; + } + } +} + +/* This is not really used yet */ +static void +gsicc_nocm_planar_to_chunky(gx_device *dev, gsicc_link_t *icclink, + gsicc_bufferdesc_t *input_buff_desc, + gsicc_bufferdesc_t *output_buff_desc, + void *inputbuffer, void *outputbuffer) +{ + + +} + +/* This is not really used yet */ +static void +gsicc_nocm_chunky_to_planar(gx_device *dev, gsicc_link_t *icclink, + gsicc_bufferdesc_t *input_buff_desc, + gsicc_bufferdesc_t *output_buff_desc, + void *inputbuffer, void *outputbuffer) +{ + + +} + +static void +gsicc_nocm_chunky_to_chunky(gx_device *dev, gsicc_link_t *icclink, + gsicc_bufferdesc_t *input_buff_desc, + gsicc_bufferdesc_t *output_buff_desc, + void *inputbuffer, void *outputbuffer) +{ + int k, j; + byte *inputpos = (byte *) inputbuffer; + byte *outputpos = (byte *) outputbuffer; + byte *inputcolor, *outputcolor; + int num_bytes_in = input_buff_desc->bytes_per_chan; + int num_bytes_out = output_buff_desc->bytes_per_chan; + int pixel_in_step = num_bytes_in * input_buff_desc->num_chan; + int pixel_out_step = num_bytes_out * output_buff_desc->num_chan; + + /* Do row by row. */ + for (k = 0; k < input_buff_desc->num_rows ; k++) { + inputcolor = inputpos; + outputcolor = outputpos; + for (j = 0; j < input_buff_desc->pixels_per_row; j++) { + gsicc_nocm_transform_general(dev, icclink, (void*) inputcolor, + (void*) outputcolor, num_bytes_in, + num_bytes_out); + inputcolor += pixel_in_step; + outputcolor += pixel_out_step; + } + inputpos += input_buff_desc->row_stride; + outputpos += output_buff_desc->row_stride; + } +} + +/* Transform an entire buffer using the generic (non color managed) + transformations */ +static void +gsicc_nocm_transform_color_buffer(gx_device *dev, gsicc_link_t *icclink, + gsicc_bufferdesc_t *input_buff_desc, + gsicc_bufferdesc_t *output_buff_desc, + void *inputbuffer, void *outputbuffer) +{ + /* Since we have to do the mappings to and from frac colors we will for + now just call the gsicc_nocm_transform_color as we step through the + buffers. This process can be significantly sped up */ + + if (input_buff_desc->is_planar) { + if (output_buff_desc->is_planar) { + gsicc_nocm_planar_to_planar(dev, icclink, input_buff_desc, + output_buff_desc, inputbuffer, + outputbuffer); + } else { + gsicc_nocm_planar_to_chunky(dev, icclink, input_buff_desc, + output_buff_desc, inputbuffer, + outputbuffer); + } + } else { + if (output_buff_desc->is_planar) { + gsicc_nocm_chunky_to_planar(dev, icclink, input_buff_desc, + output_buff_desc, inputbuffer, + outputbuffer); + } else { + gsicc_nocm_chunky_to_chunky(dev, icclink, input_buff_desc, + output_buff_desc, inputbuffer, + outputbuffer); + } + } + return; +} + +/* Shared function between the single and buffer conversions */ +static void +gsicc_nocm_transform_general(gx_device *dev, gsicc_link_t *icclink, + void *inputcolor, void *outputcolor, + int num_bytes_in, int num_bytes_out) +{ + /* Input data is either single byte or 2 byte color values. The + color mapping procs work on frac values so we have to sandwich + the transformation between to and from frac conversions. We are only + doing at most 4 source colors here */ + nocm_link_t *link = (nocm_link_t*) icclink->link_handle; + byte num_in = link->num_in; + byte num_out = link->num_out; + frac frac_in[4]; + frac frac_out[GX_DEVICE_COLOR_MAX_COMPONENTS]; + int k; + + if (num_bytes_in == 2) { + unsigned short *data = (unsigned short *) inputcolor; + for (k = 0; k < num_in; k++) { + frac_in[k] = ushort2frac(data[k]); + } + } else { + byte *data = (byte *) inputcolor; + for (k = 0; k < num_in; k++) { + frac_in[k] = byte2frac(data[k]); + } + } + /* Use the device procedure */ + switch (num_in) { + case 1: + (link->cm_procs.map_gray)(dev, frac_in[0], frac_out); + break; + case 3: + (link->cm_procs.map_rgb)(dev, link->pis, frac_in[0], frac_in[1], + frac_in[2], frac_out); + break; + case 4: + (link->cm_procs.map_cmyk)(dev, frac_in[0], frac_in[1], frac_in[2], + frac_in[3], frac_out); + break; + default: + break; + } + if (num_bytes_out == 2) { + unsigned short *data = (unsigned short *) outputcolor; + for (k = 0; k < num_out; k++) { + data[k] = frac2ushort(frac_out[k]); + } + } else { + byte *data = (byte *) outputcolor; + for (k = 0; k < num_out; k++) { + data[k] = frac2byte(frac_out[k]); + } + } + return; +} + +/* Transform a single color using the generic (non color managed) + transformations */ +static void +gsicc_nocm_transform_color(gx_device *dev, gsicc_link_t *icclink, void *inputcolor, + void *outputcolor, int num_bytes) +{ + + gsicc_nocm_transform_general(dev, icclink, inputcolor, outputcolor, + num_bytes, num_bytes); +} + +static void +gsicc_nocm_freelink(gsicc_link_t *icclink) +{ + nocm_link_t *nocm_link = (nocm_link_t*) icclink->link_handle; + if (nocm_link->pis != NULL) { + if (nocm_link->pis->black_generation != NULL) { + gs_free_object(nocm_link->memory, nocm_link->pis->black_generation, + "gsicc_nocm_freelink"); + } + if (nocm_link->pis->undercolor_removal != NULL) { + gs_free_object(nocm_link->memory, nocm_link->pis->undercolor_removal, + "gsicc_nocm_freelink"); + } + gs_free_object(nocm_link->memory, nocm_link->pis, "gsicc_nocm_freelink"); + } +} + +/* Since this is the only occurence of this object we are not going to + fool aroung with reference counting and closure functions. When + the link is destroyed, we will simply free the bytes */ +static gx_transfer_map* +gsicc_nocm_copy_curve(gx_transfer_map *in_map, gs_memory_t *mem) +{ + gx_transfer_map *out_map; + + if (in_map == NULL) { + return NULL; + } else { + out_map = (gx_transfer_map*) gs_alloc_bytes(mem, sizeof(gx_transfer_map), + "gsicc_nocm_copy_curve"); + out_map->proc = in_map->proc; + memcpy(&(out_map->values[0]), &(in_map->values[0]), + sizeof(frac) * transfer_map_size); + out_map->id = gs_no_id; + return out_map; + } +} + +/* Get the link, which is the mapping procedure in this non color managed + transformation case. */ +gsicc_link_t* +gsicc_nocm_get_link(const gs_imager_state *pis, gx_device *dev, + gs_color_space_index src_index) +{ + gsicc_link_t *result; + gsicc_hashlink_t hash; + nocm_link_t *nocm_link; + gs_memory_t *mem = pis->memory->non_gc_memory; + const gx_cm_color_map_procs * cm_procs; + + /* If the cm_procs are forwarding due to the overprint device or other + odd thing, drill down now and get the proper ones */ + if (fwd_uses_fwd_cmap_procs(dev)) { + cm_procs = fwd_get_target_cmap_procs(dev); + } else { + cm_procs = dev_proc(dev, get_color_mapping_procs)(dev); + } + /* We will add this to the link cache so that we can avoid the issue + of black_generation and undercolor removal being GC values. + Since the link is not GC we would need to copy the contents over + each time a link was requested. This could be costly if we had + a lot of link requests. */ + hash.rend_hash = 0; + hash.des_hash = dev->color_info.num_components; + hash.src_hash = src_index; + hash.link_hashcode = src_index + hash.des_hash * 256; + + /* Check the cache for a hit. */ + result = gsicc_findcachelink(hash, pis->icc_link_cache, false, false); + if (result != NULL) { + return result; + } + /* If not, then lets create a new one. This may actually return a link if + another thread has already created it while we were trying to do so */ + if (gsicc_alloc_link_entry(pis->icc_link_cache, &result, hash, false, false)) + return result; + /* Now compute the link contents */ + result->procs.map_buffer = gsicc_nocm_transform_color_buffer; + result->procs.map_color = gsicc_nocm_transform_color; + result->procs.free_link = gsicc_nocm_freelink; + result->hashcode = hash; + nocm_link = (nocm_link_t *) gs_alloc_bytes(mem, sizeof(nocm_link_t), + "gsicc_nocm_get_link"); + result->link_handle = (void*) nocm_link; + nocm_link->memory = mem; + /* Create a dummy imager state and populate the ucr/bg values. This + is the only part that we need */ + if (pis == NULL || + (pis->black_generation == NULL && pis->undercolor_removal == NULL)) { + nocm_link->pis = NULL; + } else { + nocm_link->pis = (gs_imager_state*) + gs_alloc_bytes(mem, sizeof(gs_imager_state), + "gsicc_nocm_get_link"); + nocm_link->pis->black_generation = (gx_transfer_map*) + gsicc_nocm_copy_curve(pis->black_generation, mem); + nocm_link->pis->undercolor_removal = (gx_transfer_map*) + gsicc_nocm_copy_curve(pis->undercolor_removal, mem); + } + nocm_link->num_out = min(dev->color_info.num_components, + GS_CLIENT_COLOR_MAX_COMPONENTS); + nocm_link->cm_procs.map_cmyk = cm_procs->map_cmyk; + nocm_link->cm_procs.map_rgb = cm_procs->map_rgb; + nocm_link->cm_procs.map_gray = cm_procs->map_gray; + switch (src_index) { + case gs_color_space_index_DeviceGray: + nocm_link->num_in = 1; + break; + case gs_color_space_index_DeviceRGB: + nocm_link->num_in = 3; + break; + case gs_color_space_index_DeviceCMYK: + nocm_link->num_in = 4; + break; + default: + /* We should not be here! */ + /* Free up link and return NULL */ + gsicc_link_free(result, pis->icc_link_cache->memory); + result = NULL; + break; + } + if (result != NULL) { + gsicc_set_link_data(result, nocm_link, NULL, hash, + pis->icc_link_cache->lock, false, false); + } + return result; +} diff -Nru ghostscript-9.04~dfsg/base/gsicc_profilecache.c ghostscript-9.05~dfsg~20120125/base/gsicc_profilecache.c --- ghostscript-9.04~dfsg/base/gsicc_profilecache.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsicc_profilecache.c 2011-09-29 11:02:09.000000000 +0000 @@ -66,14 +66,15 @@ rc_gsicc_profile_cache_free(gs_memory_t * mem, void *ptr_in, client_name_t cname) { gsicc_profile_cache_t *profile_cache = (gsicc_profile_cache_t * ) ptr_in; - gsicc_profile_entry_t *curr = profile_cache->head; + gsicc_profile_entry_t *curr = profile_cache->head, *next; while (curr != NULL ){ + next = curr->next; rc_decrement(curr->color_space, "rc_gsicc_profile_cache_free"); gs_free_object(mem->stable_memory, curr, "rc_gsicc_profile_cache_free"); profile_cache->num_entries--; - curr = curr->next; + curr = next; } #ifdef DEBUG if (profile_cache->num_entries != 0) diff -Nru ghostscript-9.04~dfsg/base/gsimage.c ghostscript-9.05~dfsg~20120125/base/gsimage.c --- ghostscript-9.04~dfsg/base/gsimage.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsimage.c 2011-10-17 13:34:52.000000000 +0000 @@ -214,7 +214,9 @@ dev_proc(pgs->device, set_graphics_type_tag)(pgs->device, GS_IMAGE_TAG); if (uses_color) { - gx_set_dev_color(pgs); + code = gx_set_dev_color(pgs); + if (code != 0) + return code; code = gs_state_color_load(pgs); if (code < 0) return code; diff -Nru ghostscript-9.04~dfsg/base/gsiodev.c ghostscript-9.05~dfsg~20120125/base/gsiodev.c --- ghostscript-9.04~dfsg/base/gsiodev.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsiodev.c 2011-09-29 11:01:33.000000000 +0000 @@ -61,7 +61,7 @@ gs_iodev_init(gs_memory_t * mem) { /* Make writable copies of all IODevices. */ gx_io_device **table = - gs_alloc_struct_array(mem, gx_io_device_table_count + 1, + gs_alloc_struct_array(mem, gx_io_device_table_count, gx_io_device *, &st_io_device_ptr_element, "gs_iodev_init(table)"); gs_lib_ctx_t *libctx = gs_lib_ctx_get_interp_instance(mem); @@ -70,6 +70,7 @@ if ((table == NULL) || (libctx == NULL)) return_error(gs_error_VMerror); + for (i = 0; i < gx_io_device_table_count; ++i) { gx_io_device *iodev = gs_alloc_struct(mem, gx_io_device, &st_io_device, @@ -80,14 +81,6 @@ table[i] = iodev; memcpy(table[i], gx_io_device_table[i], sizeof(gx_io_device)); } - /* FIXME: we allocate an extra pointer in the array and stuff - * the memory context in there, as we need access to it in the - * finalize method below. We get away it because everywhere that - * searches the table uses gx_io_device_table_count, rather than - * the actuall allocated length. - * A less naff solution would be preferable! - */ - table[gx_io_device_table_count] = (gx_io_device *) mem; libctx->io_device_table = table; code = gs_register_struct_root(mem, NULL, (void **)&libctx->io_device_table, @@ -103,20 +96,19 @@ /****** CAN'T FIND THE ROOT ******/ /*gs_unregister_root(mem, root, "io_device_table");*/ fail: - for (; i >= 0; --i) + for (; i > 0; --i) gs_free_object(mem, table[i - 1], "gs_iodev_init(iodev)"); gs_free_object(mem, table, "gs_iodev_init(table)"); - libctx->io_device_table = 0; + libctx->io_device_table = NULL; return (code < 0 ? code : gs_note_error(gs_error_VMerror)); } static void -gs_iodev_finalize(void *vptr) +gs_iodev_finalize(const gs_memory_t *cmem, void *vptr) { - gx_io_device **table = vptr; - gs_memory_t * mem = ((gs_memory_t *)table[gx_io_device_table_count]); - - mem->gs_lib_ctx->io_device_table = NULL; + if (cmem->gs_lib_ctx->io_device_table == vptr) { + cmem->gs_lib_ctx->io_device_table = NULL; + } } diff -Nru ghostscript-9.04~dfsg/base/gsiomacres.c ghostscript-9.05~dfsg~20120125/base/gsiomacres.c --- ghostscript-9.04~dfsg/base/gsiomacres.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsiomacres.c 2011-09-29 11:01:33.000000000 +0000 @@ -36,7 +36,6 @@ #include "string_.h" #include "malloc_.h" #include "ierrors.h" -#include "gserror.h" #include "gstypes.h" #include "gsmemory.h" #include "stream.h" diff -Nru ghostscript-9.04~dfsg/base/gsistate.c ghostscript-9.05~dfsg~20120125/base/gsistate.c --- ghostscript-9.04~dfsg/base/gsistate.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsistate.c 2011-09-29 11:02:09.000000000 +0000 @@ -61,6 +61,7 @@ * pointers are handled in this manner. */ public_st_imager_state(); + static ENUM_PTRS_BEGIN(imager_state_enum_ptrs) ENUM_SUPER(gs_imager_state, st_line_params, line_params, st_imager_state_num_ptrs - st_line_params_num_ptrs); @@ -220,7 +221,8 @@ gx_device_halftone *pdht = pis->dev_ht; #define RCDECR(element)\ - rc_decrement(pis->element, cname) + rc_decrement(pis->element, cname);\ + pis->element = NULL; /* clear the pointer to prevent multiple decrements */ RCDECR(cie_joint_caches); RCDECR(set_transfer.gray); @@ -244,5 +246,23 @@ RCDECR(icc_link_cache); RCDECR(icc_profile_cache); RCDECR(icc_manager); +} + +/* release the parts of the imager_state when it is freed */ +void +gs_imager_state_finalize(const gs_memory_t *mem, void *ptr) +{ + const char *const cname = "gs_imager_state_finalize"; + gs_imager_state *pis = (gs_imager_state *)ptr; + + /* we really ought to be able to use gs_imager_state_release, but the */ + /* other elements in the imager state are not properly reference counted. */ + /* At least these three elements are correct in that the final free as a */ + /* part of 'alloc_restore_all' is what decrements these to 0 and frees */ + /* these elements. Important since some have semaphores and we must call */ + /* gx_semaphore_free to release the handles on Windows. */ + RCDECR(icc_link_cache); + RCDECR(icc_profile_cache); + RCDECR(icc_manager); #undef RCDECR } diff -Nru ghostscript-9.04~dfsg/base/gslibctx.h ghostscript-9.05~dfsg~20120125/base/gslibctx.h --- ghostscript-9.04~dfsg/base/gslibctx.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gslibctx.h 2011-11-21 08:55:19.000000000 +0000 @@ -55,7 +55,6 @@ /* Define the default value of AccurateScreens that affects setscreen and setcolorscreen. */ bool screen_accurate_screens; - bool screen_use_wts; uint screen_min_screen_levels; /* real time clock 'bias' value. Not strictly required, but some FTS * tests work better if realtime starts from 0 at boot time. */ diff -Nru ghostscript-9.04~dfsg/base/gs.mak ghostscript-9.05~dfsg~20120125/base/gs.mak --- ghostscript-9.04~dfsg/base/gs.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gs.mak 2011-09-29 11:01:33.000000000 +0000 @@ -74,8 +74,6 @@ # e.g. 'jasper' or 'jasper-/version/' # JPX_CFLAGS - any platform-specific flags that are required # to properly compile in the jpeg2k library source -# IMDISRCDIR - the name of the IMDI lib source directory -# generally 'imdi' # SHARE_LCMS - If set to 1, asks the linker to use a separately # compiled lcms library. If set to 0, the build will compile # in the library source found in LCMSSRCDIR @@ -347,6 +345,7 @@ JPXI_=$(JPXSRCDIR)$(D)src$(D)libjasper$(D)include LWF_JPXI_=$(JPXSRCDIR)$(D)library$(D)source JPXCF_=$(JPX_CFLAGS) +JPX_OPENJPEG_I_=$(JPXSRCDIR)$(D)libopenjpeg ######################## How to define new 'features' ####################### # diff -Nru ghostscript-9.04~dfsg/base/gsmalloc.c ghostscript-9.05~dfsg~20120125/base/gsmalloc.c --- ghostscript-9.04~dfsg/base/gsmalloc.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsmalloc.c 2011-09-29 11:01:33.000000000 +0000 @@ -15,7 +15,6 @@ /* C heap allocator */ #include "malloc_.h" #include "gdebug.h" -#include "gserror.h" #include "gserrors.h" #include "gstypes.h" #include "gsmemory.h" @@ -318,10 +317,33 @@ if_debug3('u', "[u]finalizing %s 0x%lx (%s)\n", struct_type_name_string(pstype), (ulong) ptr, client_name_string(cname)); - (*finalize) (ptr); + (*finalize) (mem, ptr); } if (mmem->monitor) gx_monitor_enter(mmem->monitor); /* Exclusive access */ + /* Previously, we used to search through every allocated block to find + * the block we are freeing. This gives us safety in that an attempt to + * free an unallocated block will not go wrong. This does radically + * slow down frees though, so we replace it with this simpler code; we + * now assume that the block is valid, and hence avoid the search. + */ +#if 1 + bp = &((gs_malloc_block_t *)ptr)[-1]; + if (bp->prev) + bp->prev->next = bp->next; + if (bp->next) + bp->next->prev = bp->prev; + if (bp == mmem->allocated) { + mmem->allocated = bp->next; + mmem->allocated->prev = NULL; + } + mmem->used -= bp->size + sizeof(gs_malloc_block_t); + if (mmem->monitor) + gx_monitor_leave(mmem->monitor); /* Done with exclusive access */ + gs_alloc_fill(bp, gs_alloc_fill_free, + bp->size + sizeof(gs_malloc_block_t)); + free(bp); +#else bp = mmem->allocated; /* If 'finalize' releases a memory, this function could be called recursively and change mmem->allocated. */ @@ -365,6 +387,7 @@ client_name_string(cname), (ulong) ptr); free((char *)((gs_malloc_block_t *) ptr - 1)); } +#endif } static byte * gs_heap_alloc_string(gs_memory_t * mem, uint nbytes, client_name_t cname) diff -Nru ghostscript-9.04~dfsg/base/gsmatrix.c ghostscript-9.05~dfsg~20120125/base/gsmatrix.c --- ghostscript-9.04~dfsg/base/gsmatrix.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsmatrix.c 2011-12-08 09:35:23.000000000 +0000 @@ -696,3 +696,23 @@ pmat->ty = coeff[5]; return 0; } + +/* Compare two matrices */ +int +gs_matrix_compare(const gs_matrix *pmat1, const gs_matrix *pmat2) { + if (pmat1->xx != pmat2->xx) + return(1); + if (pmat1->xy != pmat2->xy) + return(1); + if (pmat1->yx != pmat2->yx) + return(1); + if (pmat1->yy != pmat2->yy) + return(1); + if (pmat1->tx != pmat2->tx) + return(1); + if (pmat1->ty != pmat2->ty) + return(1); + return(0); +} + + diff -Nru ghostscript-9.04~dfsg/base/gsmatrix.h ghostscript-9.05~dfsg~20120125/base/gsmatrix.h --- ghostscript-9.04~dfsg/base/gsmatrix.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsmatrix.h 2011-12-08 09:35:23.000000000 +0000 @@ -20,6 +20,9 @@ /* See p. 65 of the PostScript manual for the semantics of */ /* transformation matrices. */ +/* if you make any additions/changes to the gs_matrix_s structure or the + _matrix_body macro you need to make the appropriate additions/changes + to the gs_matrix_compare() function in gsmatrix.c */ /* Structure for a transformation matrix. */ #define _matrix_body\ float xx, xy, yx, yy, tx, ty @@ -68,6 +71,9 @@ gs_matrix_scale(const gs_matrix *, floatp, floatp, gs_matrix *), gs_matrix_rotate(const gs_matrix *, floatp, gs_matrix *); +/* Matrix comparison */ +int gs_matrix_compare(const gs_matrix *, const gs_matrix *); + /* Coordinate transformation */ int gs_point_transform(floatp, floatp, const gs_matrix *, gs_point *), gs_point_transform_inverse(floatp, floatp, const gs_matrix *, gs_point *), diff -Nru ghostscript-9.04~dfsg/base/gsmchunk.c ghostscript-9.05~dfsg~20120125/base/gsmchunk.c --- ghostscript-9.04~dfsg/base/gsmchunk.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsmchunk.c 2011-09-29 11:01:33.000000000 +0000 @@ -590,7 +590,7 @@ { /* back up to obj header */ chunk_obj_node_t *obj = ((chunk_obj_node_t *)ptr) - 1; - void (*finalize)(void *ptr) = obj->type->finalize; + struct_proc_finalize((*finalize)) = obj->type->finalize; chunk_mem_node_t *current; chunk_obj_node_t *free_obj, *prev_free; chunk_obj_node_t *scan_obj, *prev_obj; @@ -598,7 +598,7 @@ uint freed_size = round_up_to_align(obj->size + sizeof(chunk_obj_node_t)); if ( finalize != NULL ) - finalize(ptr); + finalize(mem, ptr); #ifdef DEBUG if (cmem->in_use != 0) dprintf1("*** chunk_free_object: this memory allocator is not idle, used for: %s\n", diff -Nru ghostscript-9.04~dfsg/base/gsmisc.c ghostscript-9.05~dfsg~20120125/base/gsmisc.c --- ghostscript-9.04~dfsg/base/gsmisc.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsmisc.c 2011-11-12 18:29:08.000000000 +0000 @@ -40,7 +40,6 @@ #include "string_.h" #include "gx.h" #include "gpcheck.h" /* for gs_return_check_interrupt */ -#include "gserror.h" /* for prototype */ #include "gserrors.h" #include "gxfarith.h" #include "gxfixed.h" @@ -118,12 +117,21 @@ char gs_debug[128]; /* Test whether a given debugging option is selected. */ -/* Upper-case letters automatically include their lower-case counterpart. */ +/* Some letters automatically imply others. */ bool gs_debug_c(int c) { - return - (c >= 'a' && c <= 'z' ? gs_debug[c] | gs_debug[c ^ 32] : gs_debug[c]); + bool ret = gs_debug[c]; + + /* Unroll the first one, to minimise the speed hit */ + c = gs_debug_flag_implied_by[c]; + if (c == 0) + return ret; + + do { + ret |= gs_debug[c]; + } while (c = gs_debug_flag_implied_by[c]); + return ret; } /* Define the formats for debugging printout. */ @@ -1061,3 +1069,120 @@ } return false; } + +/* gs_debug_flags handling code */ + +const gs_debug_flag_details gs_debug_flags[] = +{ +#define FLAG(a,b,c,d) {1, # a ,d} +#define UNUSED(a) { 0, "", "" }, +#include "gdbflags.h" +#undef FLAG +#undef UNUSED +}; + +const byte gs_debug_flag_implied_by[] = +{ +#define FLAG(a,b,c,d) c +#define UNUSED(a) 0, +#include "gdbflags.h" +#undef FLAG +#undef UNUSED +}; + +int gs_debug_flags_parse(gs_memory_t *heap, const char *arg) +{ +#ifdef DEBUG + const char *p; + int i, j; + int result = 0; + + while (*arg != 0) { + /* Skip over any commas */ + byte value = 0xff; + while (*arg == ',') + arg++; + if (*arg == '-') { + value = 0; + arg++; + } + if (*arg == ',') { + arg++; + continue; + } + if (*arg == 0) + return result; + for (i=0; i < gs_debug_flags_max; i++) { + char c, d; + if (!gs_debug_flags[i].used) + continue; + p = arg; + for (j=0; j < sizeof(gs_debug_flags[i].short_desc); j++) { + d = gs_debug_flags[i].short_desc[j]; + c = *p++; + if (d == '_') d = '-'; + if (c == ',') + c = 0; + if ((c != d) || (c == 0)) + break; + } + if ((c == 0) && (d == 0)) + break; + } + if (i < gs_debug_flags_max) + gs_debug[i] = value; + else { + outprintf(heap, "Unknown debug flag: "); + p = arg; + do { + char c = *p++; + if ((c == 0) || (c == ',')) + break; + outprintf(heap, "%c", c); + } while (1); + outprintf(heap, "\n"); + result = gs_error_Fatal; + } + arg = p-1; + } + return result; +#else + outprintf(heap, "Warning: debug flags ignored in release builds\n"); + return 0; +#endif +} + +void +gs_debug_flags_list(gs_memory_t *heap) +{ +#ifdef DEBUG + int i, j; + + outprintf(heap, "Debugging flags are as follows:\n\n-Z --debug= Description\n"); + for (i=0; i < gs_debug_flags_max; i++) { + if (!gs_debug_flags[i].used) + continue; + outprintf(heap, " %c ", (i < 32 || i > 126 ? ' ' : i)); + for (j=0; j < sizeof(gs_debug_flags[i].short_desc); j++) { + char c = gs_debug_flags[i].short_desc[j]; + if (c == 0) + break; + if (c == '_') + c = '-'; + outprintf(heap, "%c", c); + } + for (; j < sizeof(gs_debug_flags[i].short_desc); j++) { + outprintf(heap, " "); + } + outprintf(heap, "%s\n", gs_debug_flags[i].long_desc); + } + outprintf(heap, + "\nDebugging may be enabled by using -Zx (where x is one of the 1 character\n" + "codes given above), or by using --debug=xxxxx. Multiple flags may be specified\n" + "at once, using -Zxyz or --debug=xxxxx,yyyyy,zzzzz. -Z=-x or --debug=-xxxxx\n" + "disables a flag once set.\n"); +#else + outprintf(heap, "No debug flags supported in release builds\n"); +#endif +} + diff -Nru ghostscript-9.04~dfsg/base/gsovrc.c ghostscript-9.05~dfsg~20120125/base/gsovrc.c --- ghostscript-9.04~dfsg/base/gsovrc.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsovrc.c 2011-09-29 11:01:33.000000000 +0000 @@ -682,7 +682,7 @@ overprint_device_t * opdev, const gs_overprint_params_t * pparams ) { - int ncomps = opdev->color_info.num_components; + int ncomps = opdev->color_info.num_components; /* check if overprint is to be turned off */ if (!pparams->retain_any_comps || pparams->idle) { diff -Nru ghostscript-9.04~dfsg/base/gspaint.c ghostscript-9.05~dfsg~20120125/base/gspaint.c --- ghostscript-9.04~dfsg/base/gspaint.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gspaint.c 2011-10-17 13:34:52.000000000 +0000 @@ -84,7 +84,9 @@ /* Processing a fill object operation */ dev_proc(pgs->device, set_graphics_type_tag)(pgs->device, GS_PATH_TAG); - gx_set_dev_color(pgs); + code = gx_set_dev_color(pgs); + if (code != 0) + return code; code = (*dev_proc(dev, fillpage))(dev, (gs_imager_state *)pgs, gs_currentdevicecolor_inline(pgs)); @@ -272,7 +274,9 @@ else { dev_proc(pgs->device, set_graphics_type_tag)(pgs->device, GS_TEXT_TAG); } - gx_set_dev_color(pgs); + code = gx_set_dev_color(pgs); + if (code != 0) + return code; code = gs_state_color_load(pgs); if (code < 0) return code; @@ -387,8 +391,9 @@ else { dev_proc(pgs->device, set_graphics_type_tag)(pgs->device, GS_TEXT_TAG); } - /* Evil: The following call is a macro that might return! */ - gx_set_dev_color(pgs); + code = gx_set_dev_color(pgs); + if (code != 0) + return code; code = gs_state_color_load(pgs); if (code < 0) return code; @@ -501,7 +506,7 @@ if (code < 0) return code; /* NB: needs testing with PCL */ - if (gs_currentcpsimode(pgs->memory) && gx_path_is_void(pgs->path)) + if (gx_path_is_void(pgs->path)) pgs->current_point_valid = false; else gx_setcurrentpoint(pgs, fixed2float(spath.position.x), fixed2float(spath.position.y)); diff -Nru ghostscript-9.04~dfsg/base/gsparamx.c ghostscript-9.05~dfsg~20120125/base/gsparamx.c --- ghostscript-9.04~dfsg/base/gsparamx.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsparamx.c 2011-09-29 11:01:33.000000000 +0000 @@ -14,7 +14,6 @@ /* $Id$ */ /* Extended parameter dictionary utilities */ #include "string_.h" -#include "gserror.h" #include "gserrors.h" #include "gstypes.h" #include "gsmemory.h" diff -Nru ghostscript-9.04~dfsg/base/gsptype1.c ghostscript-9.05~dfsg~20120125/base/gsptype1.c --- ghostscript-9.04~dfsg/base/gsptype1.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsptype1.c 2011-12-08 09:35:23.000000000 +0000 @@ -55,7 +55,7 @@ if (index < st_pattern1_template_max_ptrs) { gs_ptr_type_t ptype = ENUM_SUPER_ELT(gs_pattern1_instance_t, st_pattern1_template, - template, 0); + templat, 0); if (ptype) return ptype; @@ -65,7 +65,7 @@ } ENUM_PTRS_END static RELOC_PTRS_BEGIN(pattern1_instance_reloc_ptrs) { RELOC_PREFIX(st_pattern_instance); - RELOC_SUPER(gs_pattern1_instance_t, st_pattern1_template, template); + RELOC_SUPER(gs_pattern1_instance_t, st_pattern1_template, templat); } RELOC_PTRS_END /* Define a PatternType 1 pattern. */ @@ -91,7 +91,7 @@ gs_color_space *pcspace = 0; if (pbase_cspace != 0) { - if (gs_color_space_num_components(pcspace) < 0) /* Pattern space */ + if (gs_color_space_num_components(pbase_cspace) < 0) /* Pattern space */ return_error(gs_error_rangecheck); } pcspace = gs_cspace_alloc(pmem, &gs_color_space_type_Pattern); @@ -162,7 +162,7 @@ code = gs_note_error(gs_error_rangecheck); goto fsaved; } - inst.template = *pcp; + inst.templat = *pcp; code = compute_inst_matrix(&inst, saved, &bbox, dev_width, dev_height); if (code < 0) goto fsaved; @@ -173,10 +173,10 @@ if possible. Note that any skew or rotation matrix will make it neccessary to perform blending */ - { float width = inst.template.BBox.q.x - inst.template.BBox.p.x; - float height = inst.template.BBox.q.y - inst.template.BBox.p.y; + { float width = inst.templat.BBox.q.x - inst.templat.BBox.p.x; + float height = inst.templat.BBox.q.y - inst.templat.BBox.p.y; - if ( inst.template.XStep < width || inst.template.YStep < height || ctm_only(saved).xy != 0 || + if ( inst.templat.XStep < width || inst.templat.YStep < height || ctm_only(saved).xy != 0 || ctm_only(saved).yx != 0 ){ inst.has_overlap = true; @@ -194,7 +194,7 @@ inst.step_matrix.xx, inst.step_matrix.xy, inst.step_matrix.yx, inst.step_matrix.yy, inst.step_matrix.tx, inst.step_matrix.ty); if_debug5('t', "[t]bbox=(%g,%g),(%g,%g), uses_transparency=%d\n", - bbox.p.x, bbox.p.y, bbox.q.x, bbox.q.y, inst.template.uses_transparency); + bbox.p.x, bbox.p.y, bbox.q.x, bbox.q.y, inst.templat.uses_transparency); { float bbw = bbox.q.x - bbox.p.x; float bbh = bbox.q.y - bbox.p.y; @@ -245,7 +245,7 @@ inst.size.x, inst.size.y); if_debug4('t', "[t]bbox=(%g,%g),(%g,%g)\n", bbox.p.x, bbox.p.y, bbox.q.x, bbox.q.y); - } else if ((ADJUST_AS_ADOBE) && (inst.template.TilingType != 2)) { + } else if ((ADJUST_AS_ADOBE) && (inst.templat.TilingType != 2)) { if (inst.step_matrix.xy == 0 && inst.step_matrix.yx == 0 && fabs(fabs(inst.step_matrix.xx) - bbw) < 0.5 && fabs(fabs(inst.step_matrix.yy) - bbh) < 0.5 @@ -255,6 +255,30 @@ gs_scale(saved, fabs(inst.size.x / inst.step_matrix.xx), 1); inst.step_matrix.xx = (float)inst.size.x; } else { +#if 0 + /* New code from RJW, currently disabled. While + * investigating an XPS pattern problem (caused by + * a pattern with step 7.5 being rendered into an 8x8 + * tile with a fill adjust of 0 having empty edges), + * I considered the following changed code, which seems + * like the right thing to do. It produces many image + * diffs, but none obscenely bad. We leave this + * disabled for now, as the XPS problem has moved by + * dint of us now using TilingType 2 instead. */ + /* We adjust the step matrix to an integer (as we + * can't quickly tile non-integer tiles). We bend + * the contents of the tile slightly so that they + * completely fill the tile (rather than potentially + * leaving gaps around the edge). + * To allow thin lines at a cell boundary to be painted + * inside the cell, we adjust the scale so that the + * scaled width is fixed_1 smaller. */ + float newscale = (float)floor(inst.step_matrix.xx + 0.5); + gs_scale(saved, + (newscale - 1.0 / fixed_scale) / inst.step_matrix.xx, + 1); + inst.step_matrix.xx = newscale; +#else inst.step_matrix.xx = (float)floor(inst.step_matrix.xx + 0.5); /* To allow thin lines at a cell boundary to be painted inside the cell, @@ -262,19 +286,43 @@ the scaled width is in fixed_1 smaller */ if (bbw >= inst.size.x - 1.0 / fixed_scale) gs_scale(saved, (fabs(inst.size.x) - 1.0 / fixed_scale) / fabs(inst.size.x), 1); +#endif } if (inst.step_matrix.yy <= 2) { gs_scale(saved, 1, fabs(inst.size.y / inst.step_matrix.yy)); inst.step_matrix.yy = (float)inst.size.y; } else { +#if 0 + /* See above comment for explaination */ + float newscale = (float)floor(inst.step_matrix.yy + 0.5); + gs_scale(saved, + 1, + (newscale - 1.0 / fixed_scale) / inst.step_matrix.yy); + inst.step_matrix.yy = newscale; +#else inst.step_matrix.yy = (float)floor(inst.step_matrix.yy + 0.5); if (bbh >= inst.size.y - 1.0 / fixed_scale) gs_scale(saved, 1, (fabs(inst.size.y) - 1.0 / fixed_scale) / fabs(inst.size.y)); +#endif } - code = gs_bbox_transform(&inst.template.BBox, &ctm_only(saved), &bbox); + code = gs_bbox_transform(&inst.templat.BBox, &ctm_only(saved), &bbox); if (code < 0) goto fsaved; } + } else if ((inst.templat.TilingType == 2) && + ((pgs->fill_adjust.x | pgs->fill_adjust.y) == 0)) { + /* RJW: This codes with non-rotated cases (with or without a + * skew), but won't cope with rotated ones. Find an example. */ + float shiftx = ((inst.step_matrix.yx == 0 && + fabs(fabs(inst.step_matrix.xx) - bbw) <= 0.5) ? + (bbw - inst.size.x)/2 : 0); + float shifty = ((inst.step_matrix.xy == 0 && + fabs(fabs(inst.step_matrix.yy) - bbh) <= 0.5) ? + (bbh - inst.size.y)/2 : 0); + gs_translate_untransformed(saved, shiftx, shifty); + code = gs_bbox_transform(&inst.templat.BBox, &ctm_only(saved), &bbox); + if (code < 0) + goto fsaved; } } } @@ -307,13 +355,13 @@ if (!inst.is_simple) { code = gs_newpath(saved); if (code >= 0) - code = gs_moveto(saved, inst.template.BBox.p.x, inst.template.BBox.p.y); + code = gs_moveto(saved, inst.templat.BBox.p.x, inst.templat.BBox.p.y); if (code >= 0) - code = gs_lineto(saved, inst.template.BBox.q.x, inst.template.BBox.p.y); + code = gs_lineto(saved, inst.templat.BBox.q.x, inst.templat.BBox.p.y); if (code >= 0) - code = gs_lineto(saved, inst.template.BBox.q.x, inst.template.BBox.q.y); + code = gs_lineto(saved, inst.templat.BBox.q.x, inst.templat.BBox.q.y); if (code >= 0) - code = gs_lineto(saved, inst.template.BBox.p.x, inst.template.BBox.q.y); + code = gs_lineto(saved, inst.templat.BBox.p.x, inst.templat.BBox.q.y); if (code >= 0) code = gs_clip(saved); if (code < 0) @@ -341,8 +389,8 @@ clamp_pattern_bbox(gs_pattern1_instance_t * pinst, gs_rect * pbbox, int width, int height, const gs_matrix * pmat) { - double xstep = pinst->template.XStep; - double ystep = pinst->template.YStep; + double xstep = pinst->templat.XStep; + double ystep = pinst->templat.YStep; double xmin = pbbox->q.x; double xmax = pbbox->p.x; double ymin = pbbox->q.y; @@ -379,8 +427,8 @@ * pattern below and to the left of the page (in pattern space) and scan * until the pattern is above and right of the page. */ - ixpat = (int) floor((pat_page.p.x - pinst->template.BBox.q.x) / xstep); - iystart = (int) floor((pat_page.p.y - pinst->template.BBox.q.y) / ystep); + ixpat = (int) floor((pat_page.p.x - pinst->templat.BBox.q.x) / xstep); + iystart = (int) floor((pat_page.p.y - pinst->templat.BBox.q.y) / ystep); /* Now do the scan */ for (; ; ixpat++) { @@ -414,10 +462,10 @@ if (yupper > ymax) ymax = yupper; } - if (ypat > pat_page.q.y - pinst->template.BBox.p.y) + if (ypat > pat_page.q.y - pinst->templat.BBox.p.y) break; } - if (xpat > pat_page.q.x - pinst->template.BBox.p.x) + if (xpat > pat_page.q.x - pinst->templat.BBox.p.x) break; } /* Update the bounding box. */ @@ -443,7 +491,7 @@ float xx, xy, yx, yy, dx, dy, temp; int code; - code = gs_bbox_transform(&pinst->template.BBox, &ctm_only(saved), pbbox); + code = gs_bbox_transform(&pinst->templat.BBox, &ctm_only(saved), pbbox); if (code < 0) return code; /* @@ -468,10 +516,10 @@ return code; /* The stepping matrix : */ - xx = pinst->template.XStep * saved->ctm.xx; - xy = pinst->template.XStep * saved->ctm.xy; - yx = pinst->template.YStep * saved->ctm.yx; - yy = pinst->template.YStep * saved->ctm.yy; + xx = pinst->templat.XStep * saved->ctm.xx; + xy = pinst->templat.XStep * saved->ctm.xy; + yx = pinst->templat.YStep * saved->ctm.yx; + yy = pinst->templat.YStep * saved->ctm.yy; /* Adjust the stepping matrix so all coefficients are >= 0. */ if (xx == 0 || yy == 0) { /* We know that both xy and yx are non-zero. */ @@ -514,7 +562,7 @@ gs_pattern1_get_pattern(const gs_pattern_instance_t *pinst) { return (const gs_pattern_template_t *) - &((const gs_pattern1_instance_t *)pinst)->template; + &((const gs_pattern1_instance_t *)pinst)->templat; } /* Get transparency object pointer */ @@ -598,7 +646,7 @@ gs_pattern1_set_color(const gs_client_color * pcc, gs_state * pgs) { gs_pattern1_instance_t * pinst = (gs_pattern1_instance_t *)pcc->pattern; - gs_pattern1_template_t * ptmplt = &pinst->template; + gs_pattern1_template_t * ptmplt = &pinst->templat; if (ptmplt->PaintType == 2) { const gs_color_space *pcs = gs_currentcolorspace_inline(pgs); @@ -620,7 +668,7 @@ const gs_pattern_instance_t *pinst = pcc->pattern; return (pinst == 0 || pinst->type != &gs_pattern1_type ? 0 : - &((const gs_pattern1_instance_t *)pinst)->template); + &((const gs_pattern1_instance_t *)pinst)->templat); } /* @@ -682,7 +730,7 @@ ) { gs_pattern1_instance_t *pinst = (gs_pattern1_instance_t *)pvpinst; - pixmap_info *ppmap = pinst->template.client_data; + pixmap_info *ppmap = pinst->templat.client_data; ppmap->free_proc(pmem, pvpinst, cname); gs_free_object(pmem, ppmap, cname); @@ -1329,14 +1377,16 @@ } gx_dc_serialized_tile_t; static int -gx_dc_pattern_write_raster(gx_color_tile *ptile, uint offset, byte *data, uint *psize) +gx_dc_pattern_write_raster(gx_color_tile *ptile, int64_t offset, byte *data, + uint *psize, const gx_device *dev) { int size_b, size_c; byte *dp = data; int left = *psize; - int offset1 = offset; + int64_t offset1 = offset; - size_b = sizeof(gx_strip_bitmap) + ptile->tbits.size.y * ptile->tbits.raster; + size_b = sizeof(gx_strip_bitmap) + + ptile->tbits.size.y * ptile->tbits.raster * ptile->tbits.num_planes; size_c = ptile->tmask.data ? sizeof(gx_strip_bitmap) + ptile->tmask.size.y * ptile->tmask.raster : 0; if (data == NULL) { *psize = sizeof(gx_dc_serialized_tile_t) + size_b + size_c; @@ -1416,12 +1466,12 @@ a pdf14 device that includes planar data with an alpha channel */ static int -gx_dc_pattern_trans_write_raster(gx_color_tile *ptile, uint offset, byte *data, uint *psize) +gx_dc_pattern_trans_write_raster(gx_color_tile *ptile, int64_t offset, byte *data, uint *psize) { int size, size_h; byte *dp = data; int left = *psize; - int offset1 = offset; + int64_t offset1 = offset; unsigned char *ptr; size_h = sizeof(gx_dc_serialized_tile_t) + sizeof(tile_trans_clist_info_t); @@ -1506,7 +1556,7 @@ const gx_device_color * pdevc, const gx_device_color_saved * psdc, const gx_device * dev, - uint offset, + int64_t offset, byte * data, uint * psize ) { @@ -1514,7 +1564,7 @@ int size_b, size_c; byte *dp = data; int left = *psize; - int offset1 = offset; + int64_t offset1 = offset; int code, l; if (ptile == NULL) @@ -1543,7 +1593,7 @@ return gx_dc_pattern_trans_write_raster(ptile, offset, data, psize); if (ptile->cdev == NULL) - return gx_dc_pattern_write_raster(ptile, offset, data, psize); + return gx_dc_pattern_write_raster(ptile, offset, data, psize, dev); /* Here is where we write pattern-clist data */ size_b = clist_data_size(ptile->cdev, 0); if (size_b < 0) @@ -1600,11 +1650,11 @@ static int gx_dc_pattern_read_raster(gx_color_tile *ptile, const gx_dc_serialized_tile_t *buf, - uint offset, const byte *data, uint size, gs_memory_t *mem) + int64_t offset, const byte *data, uint size, gs_memory_t *mem) { const byte *dp = data; int left = size; - int offset1 = offset; + int64_t offset1 = offset; int size_b, size_c; if (buf != NULL) { @@ -1675,12 +1725,12 @@ /* This reads in the transparency buffer from the clist */ static int -gx_dc_pattern_read_trans_buff(gx_color_tile *ptile, uint offset, +gx_dc_pattern_read_trans_buff(gx_color_tile *ptile, int64_t offset, const byte *data, uint size, gs_memory_t *mem) { const byte *dp = data; int left = size; - int offset1 = offset; + int64_t offset1 = offset; gx_pattern_trans_t *trans_pat = ptile->ttrans; int data_size; @@ -1714,7 +1764,7 @@ const gs_imager_state * pis, const gx_device_color * prior_devc, const gx_device * dev, - uint offset, + int64_t offset, const byte * data, uint size, gs_memory_t * mem ) @@ -1723,7 +1773,7 @@ int size_b, size_c = -1; const byte *dp = data; int left = size; - int offset1 = offset; + int64_t offset1 = offset; gx_color_tile *ptile; int code, l; tile_trans_clist_info_t trans_info; @@ -1844,7 +1894,7 @@ memset(&inst, 0, sizeof(inst)); /* NB: Currently PaintType 2 can't pass here. */ state.device = (gx_device *)dev; /* Break 'const'. */ - inst.template.PaintType = 1; + inst.templat.PaintType = 1; inst.size.x = buf.size.x; inst.size.y = buf.size.y; inst.saved = &state; diff -Nru ghostscript-9.04~dfsg/base/gsptype2.c ghostscript-9.05~dfsg~20120125/base/gsptype2.c --- ghostscript-9.04~dfsg/base/gsptype2.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsptype2.c 2011-11-12 18:29:08.000000000 +0000 @@ -38,7 +38,7 @@ if (index < st_pattern2_template_max_ptrs) { gs_ptr_type_t ptype = ENUM_SUPER_ELT(gs_pattern2_instance_t, st_pattern2_template, - template, 0); + templat, 0); if (ptype) return ptype; @@ -49,7 +49,7 @@ ENUM_PTRS_END static RELOC_PTRS_BEGIN(pattern2_instance_reloc_ptrs) { RELOC_PREFIX(st_pattern_instance); - RELOC_SUPER(gs_pattern2_instance_t, st_pattern2_template, template); + RELOC_SUPER(gs_pattern2_instance_t, st_pattern2_template, templat); } RELOC_PTRS_END /* Define a PatternType 2 pattern. */ @@ -96,7 +96,7 @@ if (code < 0) return code; pinst = (gs_pattern2_instance_t *)pcc->pattern; - pinst->template = *ptemp; + pinst->templat = *ptemp; pinst->shfill = false; return 0; } @@ -106,7 +106,7 @@ gs_pattern2_get_pattern(const gs_pattern_instance_t *pinst) { return (const gs_pattern_template_t *) - &((const gs_pattern2_instance_t *)pinst)->template; + &((const gs_pattern2_instance_t *)pinst)->templat; } /* Set the 'shfill' flag to a PatternType 2 pattern instance. */ @@ -196,7 +196,7 @@ gs_pattern2_set_color(const gs_client_color * pcc, gs_state * pgs) { gs_pattern2_instance_t * pinst = (gs_pattern2_instance_t *)pcc->pattern; - gs_color_space * pcs = pinst->template.Shading->params.ColorSpace; + gs_color_space * pcs = pinst->templat.Shading->params.ColorSpace; int code, save_overprint_mode = pgs->overprint_mode; pgs->overprint_mode = 0; @@ -229,7 +229,7 @@ rect.p.y = int2fixed(y); rect.q.x = int2fixed(x + w); rect.q.y = int2fixed(y + h); - return gs_shading_do_fill_rectangle(pinst->template.Shading, &rect, dev, + return gs_shading_do_fill_rectangle(pinst->templat.Shading, &rect, dev, (gs_imager_state *)pinst->saved, !pinst->shfill); } } @@ -289,10 +289,10 @@ (gs_pattern2_instance_t *)pdevc->ccolor.pattern; int code; - if (!pinst->template.Shading->params.have_BBox) + if (!pinst->templat.Shading->params.have_BBox) return 0; code = gx_dc_pattern2_shade_bbox_transform2fixed( - &pinst->template.Shading->params.BBox, (gs_imager_state *)pinst->saved, bbox); + &pinst->templat.Shading->params.BBox, (gs_imager_state *)pinst->saved, bbox); if (code < 0) return code; return 1; @@ -302,7 +302,7 @@ gx_dc_pattern2_color_has_bbox(const gx_device_color * pdevc) { gs_pattern2_instance_t *pinst = (gs_pattern2_instance_t *)pdevc->ccolor.pattern; - const gs_shading_t *psh = pinst->template.Shading; + const gs_shading_t *psh = pinst->templat.Shading; return psh->params.have_BBox; } @@ -312,7 +312,7 @@ gx_dc_shading_path_add_box(gx_path *ppath, const gx_device_color * pdevc) { gs_pattern2_instance_t *pinst = (gs_pattern2_instance_t *)pdevc->ccolor.pattern; - const gs_shading_t *psh = pinst->template.Shading; + const gs_shading_t *psh = pinst->templat.Shading; if (!psh->params.have_BBox) return_error(gs_error_unregistered); /* Do not call in this case. */ @@ -385,7 +385,7 @@ if (gx_dc_is_pattern2_color(pdevc) && gx_dc_pattern2_color_has_bbox(pdevc) && (*dev_proc(pdev, dev_spec_op))(pdev, gxdso_pattern_shading_area, NULL, 0) == 0) { gs_pattern2_instance_t *pinst = (gs_pattern2_instance_t *)pdevc->ccolor.pattern; - const gs_shading_t *psh = pinst->template.Shading; + const gs_shading_t *psh = pinst->templat.Shading; gs_fixed_point p, q; if (is_xxyy(&ctm_only(pinst->saved))) @@ -418,7 +418,7 @@ { gs_pattern2_instance_t *pinst = (gs_pattern2_instance_t *)pdevc->ccolor.pattern; - const gs_shading_t *psh = pinst->template.Shading; + const gs_shading_t *psh = pinst->templat.Shading; return psh->params.ColorSpace; } @@ -432,7 +432,7 @@ if (pdevc->type != &gx_dc_pattern2) return false; pinst = (gs_pattern2_instance_t *)pdevc->ccolor.pattern; - switch (pinst->template.Shading->head.type) { + switch (pinst->templat.Shading->head.type) { case 3: case 6: case 7: return true; default: @@ -449,6 +449,6 @@ if (pdevc->type != &gx_dc_pattern2) return false; pinst = (gs_pattern2_instance_t *)pdevc->ccolor.pattern; - Shading = pinst->template.Shading; + Shading = pinst->templat.Shading; return !pinst->shfill && Shading->params.Background != NULL; } diff -Nru ghostscript-9.04~dfsg/base/gsptype2.h ghostscript-9.05~dfsg~20120125/base/gsptype2.h --- ghostscript-9.04~dfsg/base/gsptype2.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsptype2.h 2011-11-12 18:29:08.000000000 +0000 @@ -51,7 +51,7 @@ typedef struct gs_pattern2_instance_s { gs_pattern_instance_common; - gs_pattern2_template_t template; + gs_pattern2_template_t templat; bool shfill; } gs_pattern2_instance_t; diff -Nru ghostscript-9.04~dfsg/base/gsropt.h ghostscript-9.05~dfsg~20120125/base/gsropt.h --- ghostscript-9.04~dfsg/base/gsropt.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsropt.h 2011-10-06 06:43:10.000000000 +0000 @@ -212,7 +212,7 @@ /* Also, we abuse the lop even further, by allowing it to specify a specific * plane for an operation to work on (in a planar device context). To specify - * a particularp plane, set lop_planar, and then or in the plane number + * a particular plane, set lop_planar, and then or in the plane number * shifted up by lop_planar_shift. */ #define lop_planar 0x800 diff -Nru ghostscript-9.04~dfsg/base/gsstate.c ghostscript-9.05~dfsg~20120125/base/gsstate.c --- ghostscript-9.04~dfsg/base/gsstate.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsstate.c 2011-11-12 18:29:08.000000000 +0000 @@ -852,7 +852,8 @@ if (!parts->effective_clip_shared) gx_cpath_free(parts->effective_clip_path, cname); gx_cpath_free(parts->clip_path, cname); - gx_path_free(parts->path, cname); + if (parts->path) + gx_path_free(parts->path, cname); } /* Allocate the privately allocated parts of a gstate. */ @@ -1029,7 +1030,6 @@ (*pgs->client_procs.free) (pgs->client_data, mem); gs_free_object(mem, pgs->line_params.dash.pattern, cname); gstate_free_parts(pgs, mem, cname); - gs_imager_state_release((gs_imager_state *)pgs); } /* Copy one gstate to another. */ diff -Nru ghostscript-9.04~dfsg/base/gsstype.h ghostscript-9.05~dfsg~20120125/base/gsstype.h --- ghostscript-9.04~dfsg/base/gsstype.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsstype.h 2011-09-29 11:01:33.000000000 +0000 @@ -71,7 +71,7 @@ */ #define struct_proc_finalize(proc)\ - void proc(void /*obj_header_t*/ *ptr) + void proc(const gs_memory_t *cmem, void /*obj_header_t*/ *ptr) /* * A descriptor for an object (structure) type. diff -Nru ghostscript-9.04~dfsg/base/gstext.c ghostscript-9.05~dfsg~20120125/base/gstext.c --- ghostscript-9.04~dfsg/base/gstext.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gstext.c 2011-10-17 13:34:52.000000000 +0000 @@ -17,7 +17,6 @@ #include "memory_.h" #include "gstypes.h" #include "gdebug.h" -#include "gserror.h" #include "gserrors.h" #include "gsmemory.h" #include "gsstruct.h" @@ -261,7 +260,9 @@ /* Processing a text object operation */ dev_proc(pgs->device, set_graphics_type_tag)(pgs->device, GS_TEXT_TAG); - gx_set_dev_color(pgs); + code = gx_set_dev_color(pgs); + if (code != 0) + return code; code = gs_state_color_load(pgs); if (code < 0) return code; @@ -290,8 +291,11 @@ /* Processing a text object operation */ dev_proc(pgs->device, set_graphics_type_tag)(pgs->device, GS_TEXT_TAG); - if (pte->pdcolor != 0) - gx_set_dev_color(pgs); + if (pte->pdcolor != 0) { + int code = gx_set_dev_color(pgs); + if (code != 0) + return code; + } return 0; } diff -Nru ghostscript-9.04~dfsg/base/gstrans.c ghostscript-9.05~dfsg~20120125/base/gstrans.c --- ghostscript-9.04~dfsg/base/gstrans.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gstrans.c 2011-11-12 18:29:08.000000000 +0000 @@ -168,7 +168,7 @@ gx_device_clist_writer *clwdev = (gx_device_clist_writer*) dev; const gs_pattern1_instance_t *pinst = clwdev->pinst; - if (!(pinst->template.uses_transparency)) { + if (!(pinst->templat.uses_transparency)) { if_debug1('v', "[v]%s NOT sending in pattern\n",comp_name); return(1); @@ -178,7 +178,7 @@ gx_device_pattern_accum *padev = (gx_device_pattern_accum*) dev; const gs_pattern1_instance_t *pinst = padev->instance; - if (!(pinst->template.uses_transparency)) { + if (!(pinst->templat.uses_transparency)) { if_debug1('v', "[v]%s NOT sending in pattern\n",comp_name); return(1); @@ -585,6 +585,8 @@ go ahead and take care of that now */ if (icc_manager->smask_profiles == NULL) { code = gsicc_initialize_iccsmask(icc_manager); + if (code < 0) + return(code); } /* A new soft mask group, make sure the profiles are set */ if_debug0('v', "[v]pushing soft mask color sending\n"); diff -Nru ghostscript-9.04~dfsg/base/gstrans.h ghostscript-9.05~dfsg~20120125/base/gstrans.h --- ghostscript-9.04~dfsg/base/gstrans.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gstrans.h 2011-11-12 18:29:08.000000000 +0000 @@ -230,15 +230,15 @@ * since it is a hack, we may exceed our desired buffer space while * processing the file. */ -#define NUM_PDF14_BUFFERS 3 -#define NUM_ALPHA_CHANNELS 1 -#define NUM_COLOR_CHANNELS 4 -#define BITS_PER_CHANNEL 8 +#define NUM_PDF14_BUFFERS 3 /* totally a random guess */ +#define NUM_ALPHA_CHANNELS 1 /* common, but doesn't include possible tag, shape or group alpha */ +#define NUM_COLOR_CHANNELS 4 /* CMYK is most common 'worst case' */ +#define BITS_PER_CHANNEL 8 /* currently pdf14 device is always 8-bit */ /* The estimated size of an individual PDF 1.4 buffer row (in bits) */ -#define ESTIMATED_PDF14_ROW_SIZE(width) ((width) * BITS_PER_CHANNEL\ +#define ESTIMATED_PDF14_ROW_SIZE(width, target_num_components) ((width) * BITS_PER_CHANNEL\ * (NUM_ALPHA_CHANNELS + NUM_COLOR_CHANNELS)) /* The estimated size of one row in all PDF 1.4 buffers (in bits) */ -#define ESTIMATED_PDF14_ROW_SPACE(width) \ - (NUM_PDF14_BUFFERS * ESTIMATED_PDF14_ROW_SIZE(width)) +#define ESTIMATED_PDF14_ROW_SPACE(width, target_num_components) \ + (NUM_PDF14_BUFFERS * ESTIMATED_PDF14_ROW_SIZE(width, target_num_components)) #endif /* gstrans_INCLUDED */ diff -Nru ghostscript-9.04~dfsg/base/gsutil.c ghostscript-9.05~dfsg~20120125/base/gsutil.c --- ghostscript-9.04~dfsg/base/gsutil.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gsutil.c 2011-09-29 11:01:33.000000000 +0000 @@ -17,7 +17,6 @@ #include "string_.h" #include "memory_.h" #include "gstypes.h" -#include "gserror.h" #include "gserrors.h" #include "gsmemory.h" /* for init procedure */ #include "gsrect.h" /* for prototypes */ diff -Nru ghostscript-9.04~dfsg/base/gswts.c ghostscript-9.05~dfsg~20120125/base/gswts.c --- ghostscript-9.04~dfsg/base/gswts.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gswts.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1624 +0,0 @@ -/* Copyright (C) 2001-2006 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ -/*$Id$ */ -/* Screen generation for Well Tempered Screening. */ -#include "stdpre.h" -#include /* for malloc */ -#include "gx.h" -#include "gp.h" /* for persistent cache */ -#include "gxstate.h" -#include "gsht.h" -#include "math_.h" -#include "string_.h" -#include "gserrors.h" -#include "gxfrac.h" -#include "gxwts.h" -#include "gswts.h" - -#define noDUMP_WTS -#ifdef DUMP_WTS -#include "fcntl_.h" -#endif - -#define noVERBOSE - -#ifdef UNIT_TEST -/** - * This file can be compiled independently for unit testing purposes. - * Try this invocation: - * - * gcc -I../obj -DUNIT_TEST gswts.c gxwts.c -o test_gswts -lm - * ./test_gswts | sed '/P5/,$!d' | xv - - **/ -#undef printf -#undef stdout -#undef dlprintf1 -#define dlprintf1 printf -#undef dlprintf2 -#define dlprintf2 printf -#undef dlprintf3 -#define dlprintf3 printf -#undef dlprintf4 -#define dlprintf4 printf -#undef dlprintf5 -#define dlprintf5 printf -#undef dlprintf6 -#define dlprintf6 printf -#undef dlprintf7 -#define dlprintf7 printf - -#endif - -/* A datatype used for representing the product of two 32 bit integers. - If a 64 bit integer type is available, it may be a better choice. */ -typedef double wts_bigint; - -typedef struct gx_wts_cell_params_j_s gx_wts_cell_params_j_t; -typedef struct gx_wts_cell_params_h_s gx_wts_cell_params_h_t; - -struct gx_wts_cell_params_j_s { - gx_wts_cell_params_t base; - int shift; - - double ufast_a; - double vfast_a; - double uslow_a; - double vslow_a; - - /* Probabilities of "jumps". A and B jumps can happen when moving - one pixel to the right. C and D can happen when moving one pixel - down. */ - double pa; - double pb; - double pc; - double pd; - - int xa; - int ya; - int xb; - int yb; - int xc; - int yc; - int xd; - int yd; -}; - -struct gx_wts_cell_params_h_s { - gx_wts_cell_params_t base; - - /* This is the exact value that x1 and (width-x1) approximates. */ - double px; - /* Ditto y1 and (height-y1). */ - double py; - - int x1; - int y1; -}; - -#define WTS_EXTRA_SORT_BITS 9 -#define WTS_SORTED_MAX (((frac_1) << (WTS_EXTRA_SORT_BITS)) - 1) - -typedef struct { - int u; - int v; - int k; - int l; -} wts_vec_t; - -static void -wts_vec_set(wts_vec_t *wv, int u, int v, int k, int l) -{ - wv->u = u; - wv->v = v; - wv->k = k; - wv->l = l; -} - -static wts_bigint -wts_vec_smag(const wts_vec_t *a) -{ - wts_bigint u = a->u; - wts_bigint v = a->v; - return u * u + v * v; -} - -static void -wts_vec_add(wts_vec_t *a, const wts_vec_t *b, const wts_vec_t *c) -{ - a->u = b->u + c->u; - a->v = b->v + c->v; - a->k = b->k + c->k; - a->l = b->l + c->l; -} - -static void -wts_vec_sub(wts_vec_t *a, const wts_vec_t *b, const wts_vec_t *c) -{ - a->u = b->u - c->u; - a->v = b->v - c->v; - a->k = b->k - c->k; - a->l = b->l - c->l; -} - -/** - * wts_vec_gcd3: Compute 3-way "gcd" of three vectors. - * @a, @b, @c: Vectors. - * - * Compute pair of vectors satisfying three constraints: - * They are integer combinations of the source vectors. - * The source vectors are integer combinations of the results. - * The magnitude of the vectors is minimized. - * - * The algorithm for this computation is quite reminiscent of the - * classic Euclid GCD algorithm for integers. - * - * On return, @a and @b contain the result. @c is destroyed. - **/ -static void -wts_vec_gcd3(wts_vec_t *a, wts_vec_t *b, wts_vec_t *c) -{ - wts_vec_t d, e; - double ra, rb, rc, rd, re; - - wts_vec_set(&d, 0, 0, 0, 0); - wts_vec_set(&e, 0, 0, 0, 0); - for (;;) { - ra = wts_vec_smag(a); - rb = wts_vec_smag(b); - rc = wts_vec_smag(c); - wts_vec_sub(&d, a, b); - wts_vec_add(&e, a, b); - rd = wts_vec_smag(&d); - re = wts_vec_smag(&e); - if (re && re < rd) { - d = e; - rd = re; - } - if (rd && rd < ra && ra >= rb) *a = d; - else if (rd < rb && rb > ra) *b = d; - else { - wts_vec_sub(&d, a, c); - wts_vec_add(&e, a, c); - rd = wts_vec_smag(&d); - re = wts_vec_smag(&e); - if (re < rd) { - d = e; - rd = re; - } - if (rd && rd < ra && ra >= rc) *a = d; - else if (rd < rc && rc > ra) *c = d; - else { - wts_vec_sub(&d, b, c); - wts_vec_add(&e, b, c); - rd = wts_vec_smag(&d); - re = wts_vec_smag(&e); - if (re < rd) { - d = e; - rd = re; - } - if (rd && rd < rb && rb >= rc) *b = d; - else if (rd < rc && rc > rb) *c = d; - else - break; - } - } - } -} - -static wts_bigint -wts_vec_cross(const wts_vec_t *a, const wts_vec_t *b) -{ - wts_bigint au = a->u; - wts_bigint av = a->v; - wts_bigint bu = b->u; - wts_bigint bv = b->v; - return au * bv - av * bu; -} - -static void -wts_vec_neg(wts_vec_t *a) -{ - a->u = -a->u; - a->v = -a->v; - a->k = -a->k; - a->l = -a->l; -} - -/* compute k mod m */ -static void -wts_vec_modk(wts_vec_t *a, int m) -{ - while (a->k < 0) a->k += m; - while (a->k >= m) a->k -= m; -} - -/* Compute modulo in rational cell. */ -static void -wts_vec_modkls(wts_vec_t *a, int m, int i, int s) -{ - while (a->l < 0) { - a->l += i; - a->k -= s; - } - while (a->l >= i) { - a->l -= i; - a->k += s; - } - while (a->k < 0) a->k += m; - while (a->k >= m) a->k -= m; -} - -static void -wts_set_mat(gx_wts_cell_params_t *wcp, double sratiox, double sratioy, - double sangledeg) -{ - double sangle = sangledeg * M_PI / 180; - - wcp->ufast = cos(sangle) / sratiox; - wcp->vfast = -sin(sangle) / sratiox; - wcp->uslow = sin(sangle) / sratioy; - wcp->vslow = cos(sangle) / sratioy; -} - -/** - * Calculate Screen H cell sizes. - **/ -static void -wts_cell_calc_h(double inc, int *px1, int *pxwidth, double *pp1, double memw) -{ - double minrep = pow(2, memw) * 50 / pow(2, 7.5); - int m1 = 0, m2 = 0; - double e1, e2; - - int uacc; - - e1 = 1e5; - e2 = 1e5; - for (uacc = (int)ceil(minrep * inc); uacc <= floor(2 * minrep * inc); uacc++) { - int mt; - double et; - - mt = (int)floor(uacc / inc + 1e-5); - et = uacc / inc - mt + mt * 0.001; - if (et < e1) { - e1 = et; - m1 = mt; - } - mt = (int)ceil(uacc / inc - 1e-5); - et = mt - uacc / inc + mt * 0.001; - if (et < e2) { - e2 = et; - m2 = mt; - } - } - if (m1 == m2) { - *px1 = m1; - *pxwidth = m1; - *pp1 = 1.0; - } else { - *px1 = m1; - *pxwidth = m1 + m2; - e1 = fabs(m1 * inc - floor(0.5 + m1 * inc)); - e2 = fabs(m2 * inc - floor(0.5 + m2 * inc)); - *pp1 = e2 / (e1 + e2); - } -} - -/* Implementation for Screen H. This is optimized for 0 and 45 degree - rotations. */ -static gx_wts_cell_params_t * -wts_pick_cell_size_h(double sratiox, double sratioy, double sangledeg, - double memw) -{ - gx_wts_cell_params_h_t *wcph; - double xinc, yinc; - - wcph = malloc(sizeof(gx_wts_cell_params_h_t)); - if (wcph == NULL) - return NULL; - - wcph->base.t = WTS_SCREEN_H; - wts_set_mat(&wcph->base, sratiox, sratioy, sangledeg); - - xinc = fabs(wcph->base.ufast); - if (xinc == 0) - xinc = fabs(wcph->base.vfast); - - wts_cell_calc_h(xinc, &wcph->x1, &wcph->base.width, &wcph->px, memw); - - yinc = fabs(wcph->base.uslow); - if (yinc == 0) - yinc = fabs(wcph->base.vslow); - wts_cell_calc_h(yinc, &wcph->y1, &wcph->base.height, &wcph->py, memw); - - return &wcph->base; -} - -static double -wts_qart(double r, double rbase, double p, double pbase) -{ - if (p < 1e-5) { - return ((r + rbase) * p); - } else { - return ((r + rbase) * (p + pbase) - rbase * pbase); - } -} - -#ifdef VERBOSE -static void -wts_print_j_jump(const gx_wts_cell_params_j_t *wcpj, const char *name, - double pa, int xa, int ya) -{ - dlprintf6("jump %s: (%d, %d) %f, actual (%f, %f)\n", - name, xa, ya, pa, - wcpj->ufast_a * xa + wcpj->uslow_a * ya, - wcpj->vfast_a * xa + wcpj->vslow_a * ya); -} - -static void -wts_j_add_jump(const gx_wts_cell_params_j_t *wcpj, double *pu, double *pv, - double pa, int xa, int ya) -{ - double jump_u = wcpj->ufast_a * xa + wcpj->uslow_a * ya; - double jump_v = wcpj->vfast_a * xa + wcpj->vslow_a * ya; - jump_u -= floor(jump_u + 0.5); - jump_v -= floor(jump_v + 0.5); - *pu += pa * jump_u; - *pv += pa * jump_v; -} - -static void -wts_print_j(const gx_wts_cell_params_j_t *wcpj) -{ - double uf, vf; - double us, vs; - - dlprintf3("cell = %d x %d, shift = %d\n", - wcpj->base.width, wcpj->base.height, wcpj->shift); - wts_print_j_jump(wcpj, "a", wcpj->pa, wcpj->xa, wcpj->ya); - wts_print_j_jump(wcpj, "b", wcpj->pb, wcpj->xb, wcpj->yb); - wts_print_j_jump(wcpj, "c", wcpj->pc, wcpj->xc, wcpj->yc); - wts_print_j_jump(wcpj, "d", wcpj->pd, wcpj->xd, wcpj->yd); - uf = wcpj->ufast_a; - vf = wcpj->vfast_a; - us = wcpj->uslow_a; - vs = wcpj->vslow_a; - wts_j_add_jump(wcpj, &uf, &vf, wcpj->pa, wcpj->xa, wcpj->ya); - wts_j_add_jump(wcpj, &uf, &vf, wcpj->pb, wcpj->xb, wcpj->yb); - wts_j_add_jump(wcpj, &us, &vs, wcpj->pc, wcpj->xc, wcpj->yc); - wts_j_add_jump(wcpj, &us, &vs, wcpj->pd, wcpj->xd, wcpj->yd); - dlprintf6("d: %f, %f; a: %f, %f; err: %g, %g\n", - wcpj->base.ufast, wcpj->base.vfast, - wcpj->ufast_a, wcpj->vfast_a, - wcpj->base.ufast - uf, wcpj->base.vfast - vf); - dlprintf6("d: %f, %f; a: %f, %f; err: %g, %g\n", - wcpj->base.uslow, wcpj->base.vslow, - wcpj->uslow_a, wcpj->vslow_a, - wcpj->base.uslow - us, wcpj->base.vslow - vs); -} -#endif - -/** - * wts_set_scr_jxi_try: Try a width for setting Screen J parameters. - * @wcpj: Screen J parameters. - * @m: Width to try. - * @qb: Best quality score seen so far. - * @jmem: Weight given to memory usage. - * - * Evaluate the quality for width @i. If the quality is better than - * @qb, then set the rest of the parameters in @wcpj. - * - * This routine corresponds to SetScrJXITrySP in the WTS source. - * - * Return value: Quality score for parameters chosen. - **/ -static double -wts_set_scr_jxi_try(gx_wts_cell_params_j_t *wcpj, int m, double qb, - double jmem) -{ - const double uf = wcpj->base.ufast; - const double vf = wcpj->base.vfast; - const double us = wcpj->base.uslow; - const double vs = wcpj->base.vslow; - wts_vec_t a, b, c; - double ufj, vfj; - const double rbase = 0.1; - const double pbase = 0.001; - double ug, vg; - double pp, pa, pb; - double rf; - double xa, ya, ra, xb, yb, rb; - double q, qx, qw, qxl, qbi; - double pya, pyb; - int i; - bool jumpok; - - wts_vec_set(&a, (int)floor(uf * m + 0.5), (int)floor(vf * m + 0.5), 1, 0); - if (a.u == 0 && a.v == 0) - return qb + 1; - - ufj = a.u / (double)m; - vfj = a.v / (double)m; - /* (ufj, vfj) = movement in UV space from (0, 1) in XY space */ - - wts_vec_set(&b, m, 0, 0, 0); - wts_vec_set(&c, 0, m, 0, 0); - wts_vec_gcd3(&a, &b, &c); - ug = (uf - ufj) * m; - vg = (vf - vfj) * m; - pp = 1.0 / wts_vec_cross(&b, &a); - pa = (b.u * vg - ug * b.v) * pp; - pb = (ug * a.v - a.u * vg) * pp; - if (pa < 0) { - wts_vec_neg(&a); - pa = -pa; - } - if (pb < 0) { - wts_vec_neg(&b); - pb = -pb; - } - wts_vec_modk(&a, m); - wts_vec_modk(&b, m); - - /* Prefer nontrivial jumps. */ - jumpok = (wcpj->xa == 0 && wcpj->ya == 0) || - (wcpj->xb == 0 && wcpj->yb == 0) || - (a.k != 0 && b.k != 0); - - rf = (uf * uf + vf * vf) * m; - xa = (a.u * uf + a.v * vf) / rf; - ya = (a.v * uf - a.u * vf) / rf; - xb = (b.u * uf + b.v * vf) / rf; - yb = (b.v * uf - b.u * vf) / rf; - ra = sqrt(xa * xa + 0.0625 * ya * ya); - rb = sqrt(xb * xb + 0.0625 * yb * yb); - qx = 0.5 * (wts_qart(ra, rbase, pa, pbase) + - wts_qart(rb, rbase, pb, pbase)); - if (qx < 1.0 / 4000.0) - qx *= 0.25; - else - qx -= 0.75 / 4000.0; - if (m < 7500) - qw = 0; - else - qw = 0.00025; /* cache penalty */ - qxl = qx + qw; - if (qxl > qb) - return qxl; - - /* width is ok, now try heights */ - - pp = m / (double)wts_vec_cross(&b, &a); - pya = (b.u * vs - us * b.v) * pp; - pyb = (us * a.v - a.u * vs) * pp; - - qbi = qb; - for (i = 1; qxl + m * i * jmem < qbi; i++) { - int s = m * i; - int ca, cb; - double usj, vsj; - double usg, vsg; - wts_vec_t a1, b1, a2, b2; - double pc, pd; - int ck; - double qy, qm; - - ca = (int)floor(i * pya + 0.5); - cb = (int)floor(i * pyb + 0.5); - wts_vec_set(&c, ca * a.u + cb * b.u, ca * a.v + cb * b.v, 0, 1); - usj = c.u / (double)s; - vsj = c.v / (double)s; - usg = (us - usj); - vsg = (vs - vsj); - - a1 = a; - b1 = b; - a1.u *= i; - a1.v *= i; - b1.u *= i; - b1.v *= i; - wts_vec_gcd3(&a1, &b1, &c); - a2 = a1; - b2 = b1; - pp = s / (double)wts_vec_cross(&b1, &a1); - pc = (b1.u * vsg - usg * b1.v) * pp; - pd = (usg * a1.v - a1.u * vsg) * pp; - if (pc < 0) { - wts_vec_neg(&a1); - pc = -pc; - } - if (pd < 0) { - wts_vec_neg(&b1); - pd = -pd; - } - ck = ca * a.k + cb * b.k; - while (ck < 0) ck += m; - while (ck >= m) ck -= m; - wts_vec_modkls(&a1, m, i, ck); - wts_vec_modkls(&b1, m, i, ck); - rf = (us * us - vs * vs) * s; - xa = (a1.u * us + a1.v * vs) / rf; - ya = (a1.v * us - a1.u * vs) / rf; - xb = (b1.u * us + b1.v * vs) / rf; - yb = (b1.v * us - b1.u * vs) / rf; - ra = sqrt(xa * xa + 0.0625 * ya * ya); - rb = sqrt(xb * xb + 0.0625 * yb * yb); - qy = 0.5 * (wts_qart(ra, rbase, pc, pbase) + - wts_qart(rb, rbase, pd, pbase)); - if (qy < 1.0 / 100.0) - qy *= 0.025; - else - qy -= 0.75 / 100.0; - qm = s * jmem; - - /* first try a and b jumps within the scanline */ - q = qm + qw + qx + qy; - if (q < qbi && jumpok) { -#ifdef VERBOSE - dlprintf7("m = %d, n = %d, q = %d, qx = %d, qy = %d, qm = %d, qw = %d\n", - m, i, (int)(q * 1e6), (int)(qx * 1e6), (int)(qy * 1e6), (int)(qm * 1e6), (int)(qw * 1e6)); -#endif - qbi = q; - wcpj->base.width = m; - wcpj->base.height = i; - wcpj->shift = ck; - wcpj->ufast_a = ufj; - wcpj->vfast_a = vfj; - wcpj->uslow_a = usj; - wcpj->vslow_a = vsj; - wcpj->xa = a.k; - wcpj->ya = 0; - wcpj->xb = b.k; - wcpj->yb = 0; - wcpj->xc = a1.k; - wcpj->yc = a1.l; - wcpj->xd = b1.k; - wcpj->yd = b1.l; - wcpj->pa = pa; - wcpj->pb = pb; - wcpj->pc = pc; - wcpj->pd = pd; -#ifdef VERBOSE - wts_print_j(wcpj); -#endif - } - - /* then try unconstrained a and b jumps */ - if (i > 1) { - double pa2, pb2, pp2; - double qx2, qw2, q2; - - pp2 = pp; - pa2 = (b2.u * vg - ug * b2.v) * pp2; - pb2 = (ug * a2.v - a2.u * vg) * pp2; - rf = (uf * uf + vf * vf) * s; - xa = (a2.u * uf + a2.v * vf) / rf; - ya = (a2.v * uf - a2.u * vf) / rf; - xb = (b2.u * uf + b2.v * vf) / rf; - yb = (b2.v * uf - b2.u * vf) / rf; - ra = sqrt(xa * xa + 0.0625 * ya * ya); - rb = sqrt(xb * xb + 0.0625 * yb * yb); - if (pa2 < 0) { - pa2 = -pa2; - wts_vec_neg(&a2); - } - if (pb2 < 0) { - pb2 = -pb2; - wts_vec_neg(&b2); - } - wts_vec_modkls(&a2, m, i, ck); - wts_vec_modkls(&b2, m, i, ck); - qx2 = 0.5 * (wts_qart(ra, rbase, pa2, pbase) + - wts_qart(rb, rbase, pb2, pbase)); - if (qx2 < 1.0 / 4000.0) - qx2 *= 0.25; - else - qx2 -= 0.75 / 4000.0; - if (s < 7500) - qw2 = 0; - else - qw2 = 0.00025; /* cache penalty */ - q2 = qm + qw2 + qx2 + qy; - if (q2 < qbi) { -#ifdef VERBOSE - dlprintf7("m = %d, n = %d, q = %d, qx2 = %d, qy = %d, qm = %d, qw2 = %d\n", - m, i, (int)(q * 1e6), (int)(qx * 1e6), (int)(qy * 1e6), (int)(qm * 1e6), (int)(qw2 * 1e6)); -#endif - if (qxl > qw2 + qx2) - qxl = qw2 + qx2; - qbi = q2; - wcpj->base.width = m; - wcpj->base.height = i; - wcpj->shift = ck; - wcpj->ufast_a = ufj; - wcpj->vfast_a = vfj; - wcpj->uslow_a = usj; - wcpj->vslow_a = vsj; - wcpj->xa = a2.k; - wcpj->ya = a2.l; - wcpj->xb = b2.k; - wcpj->yb = a2.l; - wcpj->xc = a1.k; - wcpj->yc = a1.l; - wcpj->xd = b1.k; - wcpj->yd = b1.l; - wcpj->pa = pa2; - wcpj->pb = pb2; - wcpj->pc = pc; - wcpj->pd = pd; -#ifdef VERBOSE - wts_print_j(wcpj); -#endif - } - } /* if (i > 1) */ - if (qx > 10 * qy) - break; - } - return qbi; -} - -static int -wts_double_to_int_cap(double d) -{ - if (d > 0x7fffffff) - return 0x7fffffff; - else return (int)d; -} - -/** - * wts_set_scr_jxi: Choose Screen J parameters. - * @wcpj: Screen J parameters. - * @jmem: Weight given to memory usage. - * - * Chooses a cell size based on the [uv]{fast,slow} parameters, - * setting the rest of the parameters in @wcpj. Essentially, this - * algorithm iterates through all plausible widths for the cell. - * - * This routine corresponds to SetScrJXISP in the WTS source. - * - * Return value: Quality score for parameters chosen. - **/ -static double -wts_set_scr_jxi(gx_wts_cell_params_j_t *wcpj, double jmem) -{ - int i, imax; - double q, qb; - - wcpj->xa = 0; - wcpj->ya = 0; - wcpj->xb = 0; - wcpj->yb = 0; - wcpj->xc = 0; - wcpj->yc = 0; - wcpj->xd = 0; - wcpj->yd = 0; - - qb = 1.0; - imax = wts_double_to_int_cap(qb / jmem); - for (i = 1; i <= imax; i++) { - if (i > 1) { - q = wts_set_scr_jxi_try(wcpj, i, qb, jmem); - if (q < qb) { - qb = q; - imax = wts_double_to_int_cap(q / jmem); - if (imax >= 7500) - imax = wts_double_to_int_cap((q - 0.00025) / jmem); - if (imax < 7500) { - imax = 7500; - } - } - } - } - return qb; -} - -/* Implementation for Screen J. This is optimized for general angles. */ -static gx_wts_cell_params_t * -wts_pick_cell_size_j(double sratiox, double sratioy, double sangledeg, - double memw) -{ - gx_wts_cell_params_j_t *wcpj; - double code; - - wcpj = malloc(sizeof(gx_wts_cell_params_j_t)); - if (wcpj == NULL) - return NULL; - - wcpj->base.t = WTS_SCREEN_J; - wts_set_mat(&wcpj->base, sratiox, sratioy, sangledeg); - - code = wts_set_scr_jxi(wcpj, pow(0.1, memw)); - if (code < 0) { - free(wcpj); - return NULL; - } - - return &wcpj->base; -} - -typedef struct { - double sratiox; - double sratioy; - double sangledeg; - double memw; -} wts_cell_size_key; - -static void * -wts_cache_alloc_callback(void *data, int bytes) -{ - return malloc(bytes); -} - -static void -store_be32(byte *ptr, int x) -{ - ptr[0] = (x >> 24) & 0xff; - ptr[1] = (x >> 16) & 0xff; - ptr[2] = (x >> 8) & 0xff; - ptr[3] = x & 0xff; -} - -/** - * wts_pick_cell_size: Choose cell size for WTS screen. - * @ph: The halftone parameters. - * @pmat: Transformation from 1/72" Y-up coords to device coords. - * - * Return value: The WTS cell parameters, or NULL on error. - **/ -gx_wts_cell_params_t * -wts_pick_cell_size(gs_screen_halftone *ph, const gs_matrix *pmat) -{ - gx_wts_cell_params_t *result; - - /* todo: deal with landscape and mirrored coordinate systems */ - double sangledeg = ph->angle; - double sratiox = 72.0 * fabs(pmat->xx) / ph->frequency; - double sratioy = 72.0 * fabs(pmat->yy) / ph->frequency; - double octangle; - double memw = 8.0; - wts_cell_size_key key; - int len; - byte *keyptr = NULL; - byte intkey[12]; - int keysize; - - octangle = sangledeg; - while (octangle >= 45.0) octangle -= 45.0; - while (octangle < -45.0) octangle += 45.0; - - /* try persistent cache */ - if (sangledeg == 45.0) { - int srxi, sryi; - - srxi = (int)floor(sratiox / sqrt(2) + 0.5); - sryi = (int)floor(sratioy / sqrt(2) + 0.5); - if (fabs(srxi * sqrt(2) - sratiox) < 2e-6 && - fabs(sryi * sqrt(2) - sratioy) < 2e-6) { - store_be32(intkey, (int)sangledeg); - store_be32(intkey + 4, srxi); - store_be32(intkey + 8, sryi); - keyptr = intkey; - keysize = sizeof(intkey); - } - } - if (keyptr == NULL) { - key.sratiox = sratiox; - key.sratioy = sratioy; - key.sangledeg = sangledeg; - key.memw = memw; - keyptr = (byte *)&key; - keysize = sizeof(key); - } - len = gp_cache_query(GP_CACHE_TYPE_WTS_SIZE, keyptr, keysize, - (void **)&result, wts_cache_alloc_callback, NULL); - if (len >= 0) - return result; - - if (fabs(octangle) < 1e-4) - result = wts_pick_cell_size_h(sratiox, sratioy, sangledeg, memw); - else - result = wts_pick_cell_size_j(sratiox, sratioy, sangledeg, memw); - - if (result != NULL) { - int resultsize = 0; - - /* insert computed cell size into cache */ - if (result->t == WTS_SCREEN_H) - resultsize = sizeof(gx_wts_cell_params_h_t); - else if (result->t == WTS_SCREEN_J) - resultsize = sizeof(gx_wts_cell_params_j_t); - if (resultsize) - gp_cache_insert(GP_CACHE_TYPE_WTS_SIZE, (byte *)&key, sizeof(key), - (void *)result, resultsize); - - ph->actual_frequency = ph->frequency; - ph->actual_angle = ph->angle; - } - return result; -} - -struct gs_wts_screen_enum_s { - wts_screen_type t; - bits32 *cell; - int width; - int height; - int size; - - int idx; -}; - -typedef struct { - gs_wts_screen_enum_t base; - const gx_wts_cell_params_j_t *wcpj; -} gs_wts_screen_enum_j_t; - -typedef struct { - gs_wts_screen_enum_t base; - const gx_wts_cell_params_h_t *wcph; - - /* an argument can be made that these should be in the params */ - double ufast1, vfast1; - double ufast2, vfast2; - double uslow1, vslow1; - double uslow2, vslow2; -} gs_wts_screen_enum_h_t; - -static gs_wts_screen_enum_t * -gs_wts_screen_enum_j_new(gx_wts_cell_params_t *wcp) -{ - gs_wts_screen_enum_j_t *wsej; - - wsej = malloc(sizeof(gs_wts_screen_enum_j_t)); - wsej->base.t = WTS_SCREEN_J; - wsej->wcpj = (const gx_wts_cell_params_j_t *)wcp; - wsej->base.width = wcp->width; - wsej->base.height = wcp->height; - wsej->base.size = wcp->width * wcp->height; - wsej->base.cell = malloc(wsej->base.size * sizeof(wsej->base.cell[0])); - wsej->base.idx = 0; - - return (gs_wts_screen_enum_t *)wsej; -} - -static int -gs_wts_screen_enum_j_currentpoint(gs_wts_screen_enum_t *self, - gs_point *ppt) -{ - gs_wts_screen_enum_j_t *z = (gs_wts_screen_enum_j_t *)self; - const gx_wts_cell_params_j_t *wcpj = z->wcpj; - - int x, y; - double u, v; - - if (z->base.idx == z->base.size) { - return 1; - } - x = z->base.idx % wcpj->base.width; - y = z->base.idx / wcpj->base.width; - u = wcpj->ufast_a * x + wcpj->uslow_a * y; - v = wcpj->vfast_a * x + wcpj->vslow_a * y; - u -= floor(u); - v -= floor(v); - ppt->x = 2 * u - 1; - ppt->y = 2 * v - 1; - return 0; -} - -static gs_wts_screen_enum_t * -gs_wts_screen_enum_h_new(gx_wts_cell_params_t *wcp) -{ - gs_wts_screen_enum_h_t *wseh; - const gx_wts_cell_params_h_t *wcph = (const gx_wts_cell_params_h_t *)wcp; - int x1 = wcph->x1; - int x2 = wcp->width - x1; - int y1 = wcph->y1; - int y2 = wcp->height - y1; - - wseh = malloc(sizeof(gs_wts_screen_enum_h_t)); - wseh->base.t = WTS_SCREEN_H; - wseh->wcph = wcph; - wseh->base.width = wcp->width; - wseh->base.height = wcp->height; - wseh->base.size = wcp->width * wcp->height; - wseh->base.cell = malloc(wseh->base.size * sizeof(wseh->base.cell[0])); - wseh->base.idx = 0; - - wseh->ufast1 = floor(0.5 + wcp->ufast * x1) / x1; - wseh->vfast1 = floor(0.5 + wcp->vfast * x1) / x1; - if (x2 > 0) { - wseh->ufast2 = floor(0.5 + wcp->ufast * x2) / x2; - wseh->vfast2 = floor(0.5 + wcp->vfast * x2) / x2; - } - wseh->uslow1 = floor(0.5 + wcp->uslow * y1) / y1; - wseh->vslow1 = floor(0.5 + wcp->vslow * y1) / y1; - if (y2 > 0) { - wseh->uslow2 = floor(0.5 + wcp->uslow * y2) / y2; - wseh->vslow2 = floor(0.5 + wcp->vslow * y2) / y2; - } - - return &wseh->base; -} - -static int -gs_wts_screen_enum_h_currentpoint(gs_wts_screen_enum_t *self, - gs_point *ppt) -{ - gs_wts_screen_enum_h_t *z = (gs_wts_screen_enum_h_t *)self; - const gx_wts_cell_params_h_t *wcph = z->wcph; - - int x, y; - double u, v; - - if (self->idx == self->size) { - return 1; - } - x = self->idx % wcph->base.width; - y = self->idx / wcph->base.width; - if (x < wcph->x1) { - u = z->ufast1 * x; - v = z->vfast1 * x; - } else { - u = z->ufast2 * (x - wcph->x1); - v = z->vfast2 * (x - wcph->x1); - } - if (y < wcph->y1) { - u += z->uslow1 * y; - v += z->vslow1 * y; - } else { - u += z->uslow2 * (y - wcph->y1); - v += z->vslow2 * (y - wcph->y1); - } - u -= floor(u); - v -= floor(v); - ppt->x = 2 * u - 1; - ppt->y = 2 * v - 1; - return 0; -} - -gs_wts_screen_enum_t * -gs_wts_screen_enum_new(gx_wts_cell_params_t *wcp) -{ - if (wcp->t == WTS_SCREEN_J) - return gs_wts_screen_enum_j_new(wcp); - else if (wcp->t == WTS_SCREEN_H) - return gs_wts_screen_enum_h_new(wcp); - else - return NULL; -} - -int -gs_wts_screen_enum_currentpoint(gs_wts_screen_enum_t *wse, gs_point *ppt) -{ - if (wse->t == WTS_SCREEN_J) - return gs_wts_screen_enum_j_currentpoint(wse, ppt); - if (wse->t == WTS_SCREEN_H) - return gs_wts_screen_enum_h_currentpoint(wse, ppt); - else - return -1; -} - -int -gs_wts_screen_enum_next(gs_wts_screen_enum_t *wse, floatp value) -{ - bits32 sample; - - if (value < -1.0 || value > 1.0) - return_error(gs_error_rangecheck); - sample = (bits32) ((value + 1) * 0x7fffffff); - wse->cell[wse->idx] = sample; - wse->idx++; - return 0; -} - -/* Run the enum with a square dot. This is useful for testing. */ -#ifdef UNIT_TEST -static void -wts_run_enum_squaredot(gs_wts_screen_enum_t *wse) -{ - int code; - gs_point pt; - floatp spot; - - for (;;) { - code = gs_wts_screen_enum_currentpoint(wse, &pt); - if (code) - break; - spot = 0.5 * (cos(pt.x * M_PI) + cos(pt.y * M_PI)); - gs_wts_screen_enum_next(wse, spot); - } -} -#endif /* UNIT_TEST */ - -static int -wts_sample_cmp(const void *av, const void *bv) { - const bits32 *const *a = (const bits32 *const *)av; - const bits32 *const *b = (const bits32 *const *)bv; - - if (**a > **b) return 1; - if (**a < **b) return -1; - return 0; -} - -/* This implementation simply sorts the threshold values (evening the - distribution), without applying any moire reduction. */ -int -wts_sort_cell(gs_wts_screen_enum_t *wse) -{ - int size = wse->width * wse->height; - bits32 *cell = wse->cell; - bits32 **pcell; - int i; - - pcell = malloc(size * sizeof(bits32 *)); - if (pcell == NULL) - return -1; - for (i = 0; i < size; i++) - pcell[i] = &cell[i]; - qsort(pcell, size, sizeof(bits32 *), wts_sample_cmp); - for (i = 0; i < size; i++) - *pcell[i] = (bits32)floor(WTS_SORTED_MAX * (i + 0.5) / size); - free(pcell); - return 0; -} - -/** - * wts_blue_bump: Generate bump function for BlueDot. - * - * Return value: newly allocated bump. - **/ -static bits32 * -wts_blue_bump(const gs_wts_screen_enum_t *wse) -{ - const gx_wts_cell_params_t *wcp; - int width = wse->width; - int height = wse->height; - int shift; - int size = width * height; - bits32 *bump; - int i; - double uf, vf; - double am, eg; - int z; - int x0, y0; - int x, y; - - if (wse->t == WTS_SCREEN_J) { - gs_wts_screen_enum_j_t *wsej = (gs_wts_screen_enum_j_t *)wse; - shift = wsej->wcpj->shift; - wcp = &wsej->wcpj->base; - } else if (wse->t == WTS_SCREEN_H) { - gs_wts_screen_enum_h_t *wseh = (gs_wts_screen_enum_h_t *)wse; - shift = 0; - wcp = &wseh->wcph->base; - } else - return NULL; - - bump = (bits32 *)malloc(size * sizeof(bits32)); - if (bump == NULL) - return NULL; - - for (i = 0; i < size; i++) - bump[i] = 0; - /* todo: more intelligence for anisotropic scaling */ - uf = wcp->ufast; - vf = wcp->vfast; - - am = uf * uf + vf * vf; - eg = (1 << 24) * 2.0 * sqrt (am); - z = (int)(5 / sqrt (am)); - - x0 = -(z / width) * shift - z; - y0 = -(z % width); - while (y0 < 0) { - x0 -= shift; - y0 += height; - } - while (x0 < 0) x0 += width; - for (y = -z; y <= z; y++) { - int x1 = x0; - for (x = -z; x <= z; x++) { - bump[y0 * width + x1] += (bits32)(eg * exp (-am * (x * x + y * y))); - x1++; - if (x1 == width) - x1 = 0; - } - y0++; - if (y0 == height) { - x0 += shift; - if (x0 >= width) x0 -= width; - y0 = 0; - } - } - return bump; -} - -/** - * wts_sort_blue: Sort cell using BlueDot. - **/ -static int -wts_sort_blue(const gs_wts_screen_enum_t *wse) -{ - bits32 *cell = wse->cell; - int width = wse->width; - int height = wse->height; - int shift; - int size = width * height; - bits32 *ref; - bits32 **pcell; - bits32 *bump; - int i; - - if (wse->t == WTS_SCREEN_J) { - gs_wts_screen_enum_j_t *wsej = (gs_wts_screen_enum_j_t *)wse; - shift = wsej->wcpj->shift; - } else - shift = 0; - - ref = (bits32 *)malloc(size * sizeof(bits32)); - pcell = (bits32 **)malloc(size * sizeof(bits32 *)); - bump = wts_blue_bump(wse); - if (ref == NULL || pcell == NULL || bump == NULL) { - free(ref); - free(pcell); - free(bump); - return -1; - } - for (i = 0; i < size; i++) - pcell[i] = &cell[i]; - qsort(pcell, size, sizeof(bits32 *), wts_sample_cmp); - /* set ref to sorted cell; pcell will now point to ref */ - for (i = 0; i < size; i++) { - pcell[i] = (pcell[i] - cell) + ref; - *pcell[i] = (bits32)floor((1 << 24) * (i + 0.5) / size); - cell[i] = 0; - } - - for (i = 0; i < size; i++) { - bits32 gmin = *pcell[i]; - int j; - int j_end = i + 5000; - int jmin = i; - int ix; - int x0, y0; - int x, y; - int ref_ix, bump_ix; - - /* find minimum cell value, but prune search */ - if (j_end > size) j_end = size; - for (j = i + 1; j < j_end; j++) { - if (*pcell[j] < gmin) { - gmin = *pcell[j]; - jmin = j; - } - } - ix = pcell[jmin] - ref; - pcell[jmin] = pcell[i]; - cell[ix] = (bits32)floor(WTS_SORTED_MAX * (i + 0.5) / size); - - x0 = ix % width; - y0 = ix / width; - - /* Add in bump, centered at (x0, y0) */ - ref_ix = y0 * width; - bump_ix = 0; - for (y = 0; y < height; y++) { - for (x = x0; x < width; x++) - ref[ref_ix + x] += bump[bump_ix++]; - for (x = 0; x < x0; x++) - ref[ref_ix + x] += bump[bump_ix++]; - ref_ix += width; - y0++; - if (y0 == height) { - x0 += shift; - if (x0 >= width) x0 -= width; - y0 = 0; - ref_ix = 0; - } - } - - /* Remove DC component to avoid integer overflow. */ - if ((i & 255) == 255 && i + 1 < size) { - bits32 gmin = *pcell[i + 1]; - int j; - - for (j = i + 2; j < size; j++) { - if (*pcell[j] < gmin) { - gmin = *pcell[j]; - } - } -#ifdef VERBOSE - if_debug1('h', "[h]gmin = %d\n", gmin); -#endif - for (j = i + 1; j < size; j++) - *pcell[j] -= gmin; - - } - } - - free(ref); - free(pcell); - free(bump); - return 0; -} - -static wts_screen_t * -wts_screen_from_enum_j(const gs_wts_screen_enum_t *wse) -{ - const gs_wts_screen_enum_j_t *wsej = (const gs_wts_screen_enum_j_t *)wse; - wts_screen_j_t *wsj; - wts_screen_sample_t *samples; - int size; - int i; - - wsj = malloc(sizeof(wts_screen_j_t)); - wsj->base.type = WTS_SCREEN_J; - wsj->base.cell_width = wsej->base.width; - wsj->base.cell_height = wsej->base.height; - size = wsj->base.cell_width * wsj->base.cell_height; - wsj->base.cell_shift = wsej->wcpj->shift; - wsj->pa = (int)floor(wsej->wcpj->pa * (1 << 16) + 0.5); - wsj->pb = (int)floor(wsej->wcpj->pb * (1 << 16) + 0.5); - wsj->pc = (int)floor(wsej->wcpj->pc * (1 << 16) + 0.5); - wsj->pd = (int)floor(wsej->wcpj->pd * (1 << 16) + 0.5); - wsj->XA = wsej->wcpj->xa; - wsj->YA = wsej->wcpj->ya; - wsj->XB = wsej->wcpj->xb; - wsj->YB = wsej->wcpj->yb; - wsj->XC = wsej->wcpj->xc; - wsj->YC = wsej->wcpj->yc; - wsj->XD = wsej->wcpj->xd; - wsj->YD = wsej->wcpj->yd; - - samples = malloc(sizeof(wts_screen_sample_t) * size); - wsj->base.samples = samples; - for (i = 0; i < size; i++) { - samples[i] = wsej->base.cell[i] >> WTS_EXTRA_SORT_BITS; - } - -#ifdef WTS_CACHE_SIZE_X - for (i = 0; i < WTS_CACHE_SIZE_X; i++) - wsj->xcache[i].tag = -1; - for (i = 0; i < WTS_CACHE_SIZE_Y; i++) - wsj->ycache[i].tag = -1; -#endif - - return &wsj->base; -} - -static wts_screen_t * -wts_screen_from_enum_h(const gs_wts_screen_enum_t *wse) -{ - const gs_wts_screen_enum_h_t *wseh = (const gs_wts_screen_enum_h_t *)wse; - wts_screen_h_t *wsh; - wts_screen_sample_t *samples; - int size; - int i; - - /* factor some of this out into a common init routine? */ - wsh = malloc(sizeof(wts_screen_h_t)); - wsh->base.type = WTS_SCREEN_H; - wsh->base.cell_width = wseh->base.width; - wsh->base.cell_height = wseh->base.height; - size = wsh->base.cell_width * wsh->base.cell_height; - wsh->base.cell_shift = 0; - wsh->px = wseh->wcph->px; - wsh->py = wseh->wcph->py; - wsh->x1 = wseh->wcph->x1; - wsh->y1 = wseh->wcph->y1; - - samples = malloc(sizeof(wts_screen_sample_t) * size); - wsh->base.samples = samples; - for (i = 0; i < size; i++) { - samples[i] = wseh->base.cell[i] >> WTS_EXTRA_SORT_BITS; - } - - return &wsh->base; -} - -typedef struct { - wts_screen_type t; - int width; - int height; -} wts_key_j; - -typedef struct { - wts_screen_type t; - int width; - int height; -} wts_key_h; - -wts_screen_t * -wts_screen_from_enum(const gs_wts_screen_enum_t *wse) -{ - wts_screen_t *result = NULL; - byte *key = NULL; - int key_size = 0; /* A stub. Was uninitialized when wse->t != WTS_SCREEN_J */ - int cell_off; - int cell_len = -1; - byte *cell_result; - - if (wse->t == WTS_SCREEN_J) { - wts_key_j k; - k.t = wse->t; - k.width = wse->width; - k.height = wse->height; - cell_off = sizeof(k); - - key_size = cell_off + wse->size * sizeof(bits32); - key = (byte *)malloc(key_size); - /* todo: more params */ - memcpy(key, &k, cell_off); - memcpy(key + cell_off, wse->cell, wse->size * sizeof(bits32)); - } else if (wse->t == WTS_SCREEN_H) { - wts_key_h k; - k.t = wse->t; - k.width = wse->width; - k.height = wse->height; - key_size = sizeof(k); - key = (byte *)malloc(key_size); - /* todo: more params */ - memcpy(key, &k, key_size); - } - - if (key != NULL) - cell_len = gp_cache_query(GP_CACHE_TYPE_WTS_CELL, key, key_size, - (void **)&cell_result, - wts_cache_alloc_callback, NULL); - if (cell_len >= 0) { - memcpy(wse->cell, cell_result, cell_len); - free(cell_result); - } else { - wts_sort_blue(wse); - cell_len = wse->size * sizeof(bits32); - gp_cache_insert(GP_CACHE_TYPE_WTS_CELL, key, key_size, - (void *)wse->cell, cell_len); - } - free(key); - - if (wse->t == WTS_SCREEN_J) - result = wts_screen_from_enum_j(wse); - else if (wse->t == WTS_SCREEN_H) - result = wts_screen_from_enum_h(wse); - -#ifdef DUMP_WTS - { - static int dump_idx = 0; - char dump_fn[128]; - int dump_fd; - byte *buf; - int size; - - size = gs_wts_to_buf(result, &buf); - sprintf(dump_fn, "wts_dump_%d", dump_idx++); - dump_fd = open(dump_fn, O_WRONLY | O_CREAT | O_TRUNC, 0666); - write(dump_fd, buf, size); - close(dump_fd); - free(buf); - } -#endif - - return result; -} - -void -gs_wts_free_enum(gs_wts_screen_enum_t *wse) -{ - free(wse); -} - -void -gs_wts_free_screen(wts_screen_t * wts) -{ - /* todo: free cell */ - free(wts); -} - -/* 20090929:mu: dirty fix to deal with bug #690710. - wts plane files (wts_plane_{0,1,2,3}) are not maintained long time - and contains littile endian 32 bit machine specific data. - this quick fix only adresses reading this file on 64 bit and big endian machines. - writing of those files are not supported this time. */ -/* short le_s16(byte *p), ushort le_u16(byte *p) */ -#define le_u16(p) (ushort)(*(byte *)(p) | *((byte *)(p) + 1) << 8) -#define le_s16(p) (short)le_u16(p) -/* int le_s32(byte *p), uint le_u32(byte *p) */ -#define le_u32(p) (uint)(*(byte *)(p) | *((byte *)(p) + 1) << 8 | *((byte *)(p) + 2) << 16 | *((byte *)(p) + 3) << 24) -#define le_s32(p) (int)le_u32(p) - -int -wts_size(const wts_screen_t *ws) -{ - int size = 0; /* A stub. Was uninitialized when none of 3 cases below. */ - int type = le_s32(&ws->type); - - if (type == WTS_SCREEN_RAT) { - size = sizeof(wts_screen_t); - } else if (type == WTS_SCREEN_J) { - size = sizeof(wts_screen_j_t); - } else if (type == WTS_SCREEN_H) { - size = sizeof(wts_screen_h_t); - } - return size; -} - -wts_screen_t * -gs_wts_from_buf(const byte *buf, int bufsize) -{ - const wts_screen_t *ws = (const wts_screen_t *)buf; - wts_screen_t *result; - int size = wts_size(ws); - int hdr_size; - int cell_size; /* size of cell in bytes */ - - result = (wts_screen_t *)malloc(size); - if (result == NULL) - return NULL; - - hdr_size = offset_of(wts_screen_t, samples) + sizeof(int); - if (bufsize < hdr_size ) { - free(result); - return NULL; - } - result->type = le_s32(&ws->type); - result->cell_width = le_s32(&ws->cell_width); - result->cell_height = le_s32(&ws->cell_height); - result->cell_shift = le_s32(&ws->cell_shift); - result->samples = NULL; - if (result->type == WTS_SCREEN_J) { - wts_screen_j_t *wsj = (wts_screen_j_t *)result; - const int *wsj_params = (const int *)((const byte *)ws + hdr_size); - - hdr_size += sizeof(int) * 12; - if (bufsize < hdr_size ) { - free(result); - return NULL; - } - wsj->pa = le_s32(&wsj_params[0]); - wsj->pb = le_s32(&wsj_params[1]); - wsj->pc = le_s32(&wsj_params[2]); - wsj->pd = le_s32(&wsj_params[3]); - wsj->XA = le_s32(&wsj_params[4]); - wsj->YA = le_s32(&wsj_params[5]); - wsj->XB = le_s32(&wsj_params[6]); - wsj->YB = le_s32(&wsj_params[7]); - wsj->XC = le_s32(&wsj_params[8]); - wsj->YC = le_s32(&wsj_params[9]); - wsj->XD = le_s32(&wsj_params[10]); - wsj->YD = le_s32(&wsj_params[11]); - /* 20090929:mu: In last version, we didn't copied these entries unless - WTS_SCREEN_J_SIZE_NOCACHE has been defined. - But, judging from gs_wts_to_buf() code below, - those are written into file even WTS_SCREEN_J_SIZE_NOCACHE haven't defined - and thereofore I think these should be read. */ - } - /* 20090929:mu: This code doesn't care about WTS_SCREEN_H type file. - If you attenpt to read such files, probably end up with errors. */ - cell_size = result->cell_width * result->cell_height * sizeof(wts_screen_sample_t); - - if (bufsize < (cell_size + hdr_size) || - (result->samples = (wts_screen_sample_t *)malloc(cell_size)) == NULL) { - free(result); - return NULL; - } -#ifdef WTS_SCREEN_J_SIZE_NOCACHE - if (ws->type == WTS_SCREEN_J) { - wts_screen_j_t *wsj = (wts_screen_j_t *)result; - int i; - - for (i = 0; i < WTS_CACHE_SIZE_X; i++) - wsj->xcache[i].tag = -1; - for (i = 0; i < WTS_CACHE_SIZE_Y; i++) - wsj->ycache[i].tag = -1; - } -#endif - { /* 20090929:mu: memcpy(result->samples, buf + hdr_size, cell_size); */ - /* assuming wts_screen_sample_t == ushort */ - wts_screen_sample_t *p = result->samples, *q = (wts_screen_sample_t *)(buf + hdr_size); - int i = result->cell_width * result->cell_height; - for ( ; i > 0; i-- ) { - *p++ = le_u16(q); - q++; - } - } - - return result; -} - -#if 0 /* Never called. */ -/* Return value is size of buf in bytes */ -static int -gs_wts_to_buf(const wts_screen_t *ws, byte **pbuf) -{ - int size = wts_size(ws); - int cell_size = ws->cell_width * ws->cell_height * sizeof(wts_screen_sample_t); - byte *buf; - - buf = (byte *)malloc(size + cell_size); - if (buf == NULL) - return -1; - memcpy(buf, ws, size); - ((wts_screen_t *)buf)->samples = NULL; - memcpy(buf + size, ws->samples, cell_size); - *pbuf = buf; - - return size + cell_size; -} -#endif - -#ifdef UNIT_TEST -static int -dump_thresh(const wts_screen_t *ws, int width, int height) -{ - int x, y; - wts_screen_sample_t *s0; - int cx, cy - int dummy; - - wts_get_samples(ws, 0, 0, &cx, &cy, &dummy); - s0 = ws->samples + cy * ws->cell_width + cx; - - printf("P5\n%d %d\n255\n", width, height); - for (y = 0; y < height; y++) { - for (x = 0; x < width;) { - wts_screen_sample_t *samples; - int n_samples, i; - - wts_get_samples(ws, x, y, &cx, &cy, &n_samples); - samples = ws->samples + cy * ws->cell_width + cx; -#if 1 - for (i = 0; x + i < width && i < n_samples; i++) - fputc(samples[i] >> 7, stdout); -#else - printf("(%d, %d): %d samples at %d\n", - x, y, n_samples, samples - s0); -#endif - x += n_samples; - } - } - return 0; -} - -int -main (int argc, char **argv) -{ - gs_screen_halftone h; - gs_matrix mat; - double xres = 1200; - double yres = 1200; - gx_wts_cell_params_t *wcp; - gs_wts_screen_enum_t *wse; - wts_screen_t *ws; - - mat.xx = xres / 72.0; - mat.xy = 0; - mat.yx = 0; - mat.yy = yres / 72.0; - - h.frequency = 121; - h.angle = 45; - - wcp = wts_pick_cell_size(&h, &mat); - dlprintf2("cell size = %d x %d\n", wcp->width, wcp->height); - wse = gs_wts_screen_enum_new(wcp); - wts_run_enum_squaredot(wse); -#if 1 - wts_sort_blue(wse); -#else - wts_sort_cell(wse); -#endif - ws = wts_screen_from_enum(wse); - - dump_thresh(ws, 512, 512); - return 0; -} -#endif diff -Nru ghostscript-9.04~dfsg/base/gswts.h ghostscript-9.05~dfsg~20120125/base/gswts.h --- ghostscript-9.04~dfsg/base/gswts.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gswts.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -/* Copyright (C) 2001-2006 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ -/*$Id$ */ -#ifndef gswts_INCLUDED -# define gswts_INCLUDED - -#ifndef gs_wts_screen_enum_t_DEFINED -# define gs_wts_screen_enum_t_DEFINED -typedef struct gs_wts_screen_enum_s gs_wts_screen_enum_t; -#endif - -typedef struct gx_wts_cell_params_s gx_wts_cell_params_t; - -/* Note: this corresponds roughly to the SP structure in the WTS code. */ -struct gx_wts_cell_params_s { - wts_screen_type t; - int width; - int height; - double ufast; - double vfast; - double uslow; - double vslow; -}; - -gx_wts_cell_params_t * -wts_pick_cell_size(gs_screen_halftone *ph, const gs_matrix *pmat); - -gs_wts_screen_enum_t * -gs_wts_screen_enum_new(gx_wts_cell_params_t *wcp); - -int -gs_wts_screen_enum_currentpoint(gs_wts_screen_enum_t *wse, gs_point *ppt); - -int -gs_wts_screen_enum_next(gs_wts_screen_enum_t *wse, floatp value); - -int -wts_sort_cell(gs_wts_screen_enum_t *wse); - -wts_screen_t * -wts_screen_from_enum(const gs_wts_screen_enum_t *wse); - -void -gs_wts_free_enum(gs_wts_screen_enum_t *wse); - -void -gs_wts_free_screen(wts_screen_t *wts); - -int -wts_size(const wts_screen_t *ws); - -wts_screen_t * -gs_wts_from_buf(const byte *buf, int bufsize); - -#endif diff -Nru ghostscript-9.04~dfsg/base/gxacpath.c ghostscript-9.05~dfsg~20120125/base/gxacpath.c --- ghostscript-9.04~dfsg/base/gxacpath.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxacpath.c 2011-11-21 08:55:19.000000000 +0000 @@ -122,7 +122,7 @@ NULL, /* pop_transparency_state */ NULL, /* put_image */ accum_dev_spec_op, - NULL, /* copy_plane */ + NULL, /* copy_planes */ NULL, /* get_profile */ gx_default_set_graphics_type_tag } diff -Nru ghostscript-9.04~dfsg/base/gxband.h ghostscript-9.05~dfsg~20120125/base/gxband.h --- ghostscript-9.04~dfsg/base/gxband.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxband.h 2011-09-29 11:01:33.000000000 +0000 @@ -22,6 +22,9 @@ /* * Define the parameters controlling banding. */ +/* if you make any additions/changes to this structure you need to make + the appropriate additions/changes to the compare_gdev_prn_space_params() + function in gdevprn.c */ typedef struct gx_band_params_s { bool page_uses_transparency; /* PDF 1.4 transparency is used on the page */ int BandWidth; /* (optional) band width in pixels */ diff -Nru ghostscript-9.04~dfsg/base/gxbitfmt.h ghostscript-9.05~dfsg~20120125/base/gxbitfmt.h --- ghostscript-9.04~dfsg/base/gxbitfmt.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxbitfmt.h 2011-11-21 08:55:19.000000000 +0000 @@ -192,8 +192,7 @@ /* * Return halftoned raster. (This requires a custom get_bit_rectangle - * device procedure. See the wtsimdi device. Most devices ignore this - * bit. + * device procedure. Most devices ignore this bit. */ #define GB_HALFTONED (1L<<31) #define GB_HALFTONED_NAMES\ diff -Nru ghostscript-9.04~dfsg/base/gxbitmap.h ghostscript-9.05~dfsg~20120125/base/gxbitmap.h --- ghostscript-9.04~dfsg/base/gxbitmap.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxbitmap.h 2011-10-06 06:43:10.000000000 +0000 @@ -127,11 +127,17 @@ * tiles. Requirements: * rep_shift < rep_width * shift = (rep_shift * (size.y / rep_height)) % rep_width + * + * For the benefit of the planar device, we now have a num_planes field. + * For chunky data this should be set to 1. For planar data, the data pointer + * points to the first plane of data; subsequent planes of data follow + * immediately after this as if there were num_planes * height lines of data. */ #define gx_strip_bitmap_common(data_type)\ gx_tile_bitmap_common(data_type);\ ushort rep_shift;\ - ushort shift + ushort shift;\ + int num_planes typedef struct gx_strip_bitmap_s { gx_strip_bitmap_common(byte); } gx_strip_bitmap; diff -Nru ghostscript-9.04~dfsg/base/gxblend1.c ghostscript-9.05~dfsg~20120125/base/gxblend1.c --- ghostscript-9.04~dfsg/base/gxblend1.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxblend1.c 2011-11-12 18:29:08.000000000 +0000 @@ -421,14 +421,15 @@ gx_color_index pdf14_encode_color(gx_device *dev, const gx_color_value colors[]) { - int drop = sizeof(gx_color_value) * 8 - 8; gx_color_index color = 0; int i; int ncomp = dev->color_info.num_components; + COLROUND_VARS; + COLROUND_SETUP(8); for (i = 0; i < ncomp; i++) { color <<= 8; - color |= (colors[i] >> drop); + color |= COLROUND_ROUND(colors[i]); } return (color == gx_no_color_index ? color ^ 1 : color); } @@ -440,16 +441,17 @@ gx_color_index pdf14_encode_color_tag(gx_device *dev, const gx_color_value colors[]) { - int drop = sizeof(gx_color_value) * 8 - 8; gx_color_index color; int i; int ncomp = dev->color_info.num_components; + COLROUND_VARS; + COLROUND_SETUP(8); /* Add in the tag information */ color = dev->graphics_type_tag & ~GS_DEVICE_ENCODES_TAGS; for (i = 0; i < ncomp; i++) { color <<= 8; - color |= (colors[i] >> drop); + color |= COLROUND_ROUND(colors[i]); } return (color == gx_no_color_index ? color ^ 1 : color); } diff -Nru ghostscript-9.04~dfsg/base/gxblend.c ghostscript-9.05~dfsg~20120125/base/gxblend.c --- ghostscript-9.04~dfsg/base/gxblend.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxblend.c 2012-01-07 20:18:22.000000000 +0000 @@ -194,9 +194,9 @@ } } -void smask_icc(int num_rows, int num_cols, int n_chan, int row_stride, - int plane_stride, byte *src, const byte *dst, - gsicc_link_t *icclink) +void smask_icc(gx_device *dev, int num_rows, int num_cols, int n_chan, + int row_stride, int plane_stride, byte *src, const byte *dst, + gsicc_link_t *icclink) { gsicc_bufferdesc_t input_buff_desc; gsicc_bufferdesc_t output_buff_desc; @@ -219,8 +219,8 @@ false, false, true, plane_stride, row_stride, num_rows, num_cols); /* Transform the data */ - gscms_transform_color_buffer(icclink, &input_buff_desc, - &output_buff_desc, (void*) src, (void*) dst); + (icclink->procs.map_buffer)(dev, icclink, &input_buff_desc, &output_buff_desc, + (void*) src, (void*) dst); } void @@ -1463,6 +1463,31 @@ /* during a particular band if we have a large file */ /* if (clist_band_count != 65) return; */ buff_ptr = Buffer; +#ifdef RAW_DUMP_AS_PAM + if ((n_chan == 4) || (n_chan == 5)) { + int x; + sprintf(full_file_name,"%d)%s.pam",global_index,filename); + fid = fopen(full_file_name,"wb"); + fprintf(fid, "P7\nWIDTH %d\nHEIGHT %d\nDEPTH 4\nMAXVAL 255\nTUPLTYPE RGB_ALPHA\nENDHDR\n", + width, num_rows); + for(y=0; yxfont) != 0) { int cx = x + fixed2int(cc->offset.x); diff -Nru ghostscript-9.04~dfsg/base/gxcht.c ghostscript-9.05~dfsg~20120125/base/gxcht.c --- ghostscript-9.04~dfsg/base/gxcht.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxcht.c 2011-11-21 08:55:19.000000000 +0000 @@ -26,6 +26,7 @@ #include "gxistate.h" #include "gzht.h" #include "gsserial.h" +#include "gxdevsop.h" /* Define whether to force use of the slow code, for testing. */ #define USE_SLOW_CODE 0 @@ -184,7 +185,7 @@ const gx_device_color * pdevc, const gx_device_color_saved * psdc0, const gx_device * dev, - uint offset, + int64_t offset, byte * pdata, uint * psize ) { @@ -353,7 +354,7 @@ const gs_imager_state * pis, const gx_device_color * prior_devc, const gx_device * dev, - uint offset, + int64_t offset, const byte * pdata, uint size, gs_memory_t * mem ) /* ignored */ @@ -583,8 +584,7 @@ #if USE_SLOW_CODE set_ht_colors_gt_4 #else - (dev_proc(dev, map_cmyk_color) == gx_default_encode_color && - dev->color_info.depth == 4) ? + (dev_proc(dev, dev_spec_op)(dev, gxdso_is_std_cmyk_1bit, NULL, 0) > 0) ? set_cmyk_1bit_colors : nplanes <= 4 ? set_ht_colors_le_4 : set_ht_colors_gt_4 @@ -610,9 +610,17 @@ int lw = pdht->lcm_width, lh = pdht->lcm_height; bool no_rop; int i; + int origx, origy; + +#ifdef MEMENTO + /* Pacify valgrind */ + memset(tbits, 0, sizeof(ulong) * tile_longs_allocated); +#endif if (w <= 0 || h <= 0) return 0; + origx = x; + origy = y; if ((w | h) >= 16) { /* It's worth taking the trouble to check the clipping box. */ gs_fixed_rect cbox; @@ -650,6 +658,9 @@ } special = set_ht_colors(&vp, colors, sbits, pdevc, dev, caches, nplanes); no_rop = source == NULL && lop_no_S_is_T(lop); + if ((!no_rop) && (source == NULL)) + set_rop_no_source(source, no_source, dev); + /* * If the LCM of the plane cell sizes is smaller than the rectangle * being filled, compute a single tile and let tile_rectangle do the @@ -673,23 +684,38 @@ tiles.rep_height = tiles.size.y = lh; tiles.id = gs_next_ids(pdht->rc.memory, 1); tiles.rep_shift = tiles.shift = 0; + tiles.num_planes = 1; set_color_ht((byte *)tbits, raster, 0, 0, lw, lh, depth, special, nplanes, pdevc->colors.colored.plane_mask, dev, &vp, colors, sbits); if (no_rop) return (*dev_proc(dev, strip_tile_rectangle)) (dev, &tiles, x, y, w, h, - gx_no_color_index, gx_no_color_index, - pdevc->phase.x, pdevc->phase.y); - if (source == NULL) - set_rop_no_source(source, no_source, dev); - return (*dev_proc(dev, strip_copy_rop)) (dev, source->sdata, - source->sourcex, source->sraster, source->id, - (source->use_scolors ? source->scolors : NULL), - &tiles, NULL, - x, y, w, h, - pdevc->phase.x, pdevc->phase.y, - lop); + gx_no_color_index, + gx_no_color_index, + pdevc->phase.x, + pdevc->phase.y); + if (source->planar_height == 0) + return (*dev_proc(dev, strip_copy_rop)) + (dev, + source->sdata + (y - origy) * source->sraster, + source->sourcex + (x - origx), + source->sraster, source->id, + (source->use_scolors ? source->scolors : NULL), + &tiles, NULL, + x, y, w, h, + pdevc->phase.x, pdevc->phase.y, lop); + else + return (*dev_proc(dev, strip_copy_rop2)) + (dev, + source->sdata + (y - origy) * source->sraster, + source->sourcex + (x - origx), + source->sraster, source->id, + (source->use_scolors ? source->scolors : NULL), + &tiles, NULL, + x, y, w, h, + pdevc->phase.x, pdevc->phase.y, lop, + source->planar_height); } } size_x = w * depth; @@ -728,6 +754,7 @@ tiles.raster = raster; tiles.rep_width = tiles.size.x = size_x / depth; tiles.rep_shift = tiles.shift = 0; + tiles.num_planes = 1; } while (w) { int cy = y, ch = dh, left = h; @@ -744,14 +771,23 @@ x, cy, dw, ch); } else { tiles.rep_height = tiles.size.y = ch; - if (source == NULL) - set_rop_no_source(source, no_source, dev); - /****** WRONG - MUST ADJUST source VALUES ******/ - code = (*dev_proc(dev, strip_copy_rop)) - (dev, source->sdata, source->sourcex, source->sraster, - source->id, - (source->use_scolors ? source->scolors : NULL), - &tiles, NULL, x, cy, dw, ch, 0, 0, lop); + if (source->planar_height == 0) + code = (*dev_proc(dev, strip_copy_rop)) + (dev, source->sdata + source->sraster * (cy-origy), + source->sourcex + (x - origx), + source->sraster, + source->id, + (source->use_scolors ? source->scolors : NULL), + &tiles, NULL, x, cy, dw, ch, 0, 0, lop); + else + code = (*dev_proc(dev, strip_copy_rop2)) + (dev, source->sdata + source->sraster * (cy-origy), + source->sourcex + (x - origx), + source->sraster, + source->id, + (source->use_scolors ? source->scolors : NULL), + &tiles, NULL, x, cy, dw, ch, 0, 0, lop, + source->planar_height); } if (code < 0) return code; diff -Nru ghostscript-9.04~dfsg/base/gxclbits.c ghostscript-9.05~dfsg~20120125/base/gxclbits.c --- ghostscript-9.04~dfsg/base/gxclbits.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxclbits.c 2011-11-12 18:29:08.000000000 +0000 @@ -77,12 +77,12 @@ r.ptr = data - 1; if (raster == width_bytes) { r.limit = r.ptr + raster * height; - status = (*st->template->process) (st, &r, pw, true); + status = (*st->templat->process) (st, &r, pw, true); } else { /* Compress row-by-row. */ uint y; for (y = 1; (r.limit = r.ptr + width_bytes), y < height; ++y) { - status = (*st->template->process) (st, &r, pw, false); + status = (*st->templat->process) (st, &r, pw, false); if (status) break; if (r.ptr != r.limit) { /* We don't attempt to handle compressors that */ @@ -93,10 +93,10 @@ r.ptr += raster - width_bytes; } if (status == 0) - status = (*st->template->process) (st, &r, pw, true); + status = (*st->templat->process) (st, &r, pw, true); } - if (st->template->release) - (*st->template->release) (st); + if (st->templat->release) + (*st->templat->release) (st); return status; } @@ -245,7 +245,8 @@ cmd_size_w(tile->size.x / tile->rep_width)) + (tile->rep_height == tile->size.y ? 0 : cmd_size_w(tile->size.y / tile->rep_height)) + - (tile->rep_shift == 0 ? 0 : cmd_size_w(tile->rep_shift)); + (tile->rep_shift == 0 ? 0 : cmd_size_w(tile->rep_shift)) + + (tile->num_planes == 1 ? 0 : 1); } static void cmd_store_tile_params(byte * dp, const gx_strip_bitmap * tile, int depth, @@ -268,9 +269,13 @@ bd |= 0x40; } if (tile->rep_shift != 0) { - cmd_put_w(tile->rep_shift, p); + p = cmd_put_w(tile->rep_shift, p); bd |= 0x80; } + if (tile->num_planes != 1) { + *p++ = (byte)tile->num_planes; + bd |= 0x10; + } dp[1] = bd; } @@ -425,7 +430,7 @@ uint sraster, int depth) { uint raster = tiles->raster; - uint size_bytes = raster * tiles->size.y; + uint size_bytes = raster * tiles->size.y * tiles->num_planes; uint tsize = sizeof(tile_slot) + cldev->tile_band_mask_size + size_bytes; gx_cached_bits_head *slot_head; @@ -470,11 +475,14 @@ slot->shift = slot->rep_shift = tiles->rep_shift; slot->x_reps = slot->y_reps = 1; slot->id = tiles->id; + slot->num_planes = (byte)tiles->num_planes; + if (slot->num_planes != 1) + depth /= slot->num_planes; memset(ts_mask(slot), 0, cldev->tile_band_mask_size); bytes_copy_rectangle_zero_padding(ts_bits(cldev, slot), raster, tiles->data, sraster, (tiles->rep_width * depth + 7) >> 3, - tiles->rep_height); + tiles->rep_height * slot->num_planes); /* Make the hash table entry. */ { tile_loc loc; @@ -509,7 +517,8 @@ * as long as we don't exceed a total tile size of 256 bytes, * or more than 255 repetitions in X or Y, or make the tile so * large that not all possible tiles will fit in the cache. - * Also, don't attempt Y replication if shifting is required. + * Also, don't attempt Y replication if shifting is required, + * or if num_planes != 1. */ #define max_tile_reps_x 255 #define max_tile_bytes_x 32 @@ -517,10 +526,15 @@ #define max_tile_bytes 256 uint rep_width = tiles->rep_width; uint rep_height = tiles->rep_height; - uint rep_width_bits = rep_width * depth; + uint rep_width_bits; uint tile_overhead = sizeof(tile_slot) + cldev->tile_band_mask_size; - uint max_bytes = cldev->chunk.size / (rep_width_bits * rep_height); + uint max_bytes; + + if (tiles->num_planes != 1) + depth /= tiles->num_planes; + rep_width_bits = rep_width * depth; + max_bytes = cldev->chunk.size / (rep_width_bits * rep_height); max_bytes -= min(max_bytes, tile_overhead); if (max_bytes > max_tile_bytes) @@ -536,7 +550,7 @@ reps_x >>= 1; new_tile->size.x = max(reps_x, 1) * rep_width; new_tile->raster = bitmap_raster(new_tile->size.x * depth); - if (tiles->shift != 0) + if (tiles->shift != 0 || tiles->num_planes != 1) reps_y = 1; else { reps_y = max_bytes / (new_tile->raster * rep_height); @@ -625,14 +639,19 @@ extra + 1 + cmd_size_w(loc.index) + cmd_size_w(offset); byte *dp; uint csize; - int code = - cmd_put_bits(cldev, pcls, ts_bits(cldev, loc.tile), - tiles->rep_width * depth, tiles->rep_height, - loc.tile->cb_raster, rsize, - (cldev->tile_params.size.x > tiles->rep_width ? - decompress_elsewhere | decompress_spread : - decompress_elsewhere), - &dp, &csize); + int code; + int pdepth = depth; + if (tiles->num_planes != 1) + pdepth /= tiles->num_planes; + + code = cmd_put_bits(cldev, pcls, ts_bits(cldev, loc.tile), + tiles->rep_width * pdepth, + tiles->rep_height * tiles->num_planes, + loc.tile->cb_raster, rsize, + (cldev->tile_params.size.x > tiles->rep_width ? + decompress_elsewhere | decompress_spread : + decompress_elsewhere), + &dp, &csize); if (code < 0) return code; @@ -710,12 +729,15 @@ uint csize; gx_clist_state *bit_pcls = pcls; int code; + int pdepth = depth; + if (tiles->num_planes != 1) + pdepth /= loc.tile->num_planes; if (loc.tile->num_bands == CHAR_ALL_BANDS_COUNT) bit_pcls = NULL; code = cmd_put_bits(cldev, bit_pcls, ts_bits(cldev, loc.tile), - loc.tile->width * depth, - loc.tile->height, loc.tile->cb_raster, + loc.tile->width * pdepth, + loc.tile->height * loc.tile->num_planes, loc.tile->cb_raster, rsize, (1 << cmd_compress_cfe) | decompress_elsewhere, &dp, &csize); diff -Nru ghostscript-9.04~dfsg/base/gxcldev.h ghostscript-9.05~dfsg~20120125/base/gxcldev.h --- ghostscript-9.04~dfsg/base/gxcldev.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxcldev.h 2011-11-21 08:55:19.000000000 +0000 @@ -92,7 +92,7 @@ cmd_op_tile_rect = 0x60, /* +dy2dh2, x#, w# | +0, rect# */ cmd_op_tile_rect_short = 0x70, /* +dh, dx, dw | +0, rect_short */ cmd_op_tile_rect_tiny = 0x80, /* +dw+0, rect_tiny | +dw+8 */ - cmd_op_copy_mono_plane = 0x90, /* +compress, plane, x#, y#, (w+data_x)#, */ + cmd_op_copy_mono_planes = 0x90, /* +compress, plane_height, x#, y#, (w+data_x)#, */ /* h#, | */ #define cmd_copy_ht_color 4 /* +4+compress, x#, y#, (w+data_x)#, */ @@ -111,7 +111,7 @@ #define cmd_op_name_strings\ "(misc)", "set_color[0]", "set_color[1]", "fill_rect",\ "fill_rect_short", "fill_rect_tiny", "tile_rect", "tile_rect_short",\ - "tile_rect_tiny", "copy_mono_plane", "copy_color_alpha", "delta_tile_index",\ + "tile_rect_tiny", "copy_mono_planes", "copy_color_alpha", "delta_tile_index",\ "set_tile_index", "(misc2)", "(segment)", "(path)" #define cmd_misc_op_name_strings\ @@ -165,17 +165,32 @@ * Encoding for tile depth information. * * The cmd_opv_set_tile_size command code stores tile depth information - * as part of the first byte following the command code. Only 5 bits of - * this byte are available, which held the value depth - 1. The DeviceN - * code requires depths of > 32 bits, so a new encoding is required. The - * encoding selected represents depth information either directly (for - * depth <= 15), or as a multiple of 8. The high-order bit determines - * which is the case; it is cleared if the depth is represented directly, - * and set if the depth is represented as a multiple of 8. + * as part of the first byte following the command code. Throughout + * the history of ghostscript, at least 3 different encodings have been used + * here. + * + * Originally, we used 5 bits of the byte to hold 'depth-1'. + * + * Later, the DeviceN code required it to cope with depths of >32 bits, so + * a new encoding was used that represented depth information either directly + * (for depth <= 15), or as a multiple of 8. The high-order bit determined + * which was the case; it was cleared if the depth is represented directly, + * and set if the depth was represented as a multiple of 8. + * + * #define cmd_depth_to_code(d) ((d) > 0xf ? 0x10 | ((d) >> 3) : (d)) + * #define cmd_code_to_depth(v) \ + * (((v) & 0x10) != 0 ? ((v) & 0xf) << 3 : (v) & 0xf) + * + * With the advent of the planar device, we needed to use one fewer bit in + * the byte, so adopted the following encoding scheme: + * depth: 1 2 (3) 4 (5) (6) (7) 8 12 16 24 32 40 48 56 64 + * value: 0 1 (2) 3 (4) (5) (6) 7 8 9 10 11 12 13 14 15 + * The numbers in brackets represent depths that are represented, but aren't + * used by ghostscript (i.e. are available for future use). */ -#define cmd_depth_to_code(d) ((d) > 0xf ? 0x10 | ((d) >> 3) : (d)) +#define cmd_depth_to_code(d) ((d) > 8 ? 8 | (((d)-5) >> 3) : ((d)-1)) #define cmd_code_to_depth(v) \ - (((v) & 0x10) != 0 ? ((v) & 0xf) << 3 : (v) & 0xf) + (((v) & 8) == 0 ? ((v) & 0x7)+1 : ((v) & 0x7 ? ((((v) & 7) << 3) + 8) : 12)) /* * When we write bitmaps, we remove raster padding selectively: @@ -279,11 +294,12 @@ dev_proc_copy_alpha(clist_copy_alpha); dev_proc_strip_tile_rectangle(clist_strip_tile_rectangle); dev_proc_strip_copy_rop(clist_strip_copy_rop); +dev_proc_strip_copy_rop2(clist_strip_copy_rop2); dev_proc_fill_trapezoid(clist_fill_trapezoid); dev_proc_fill_linear_color_trapezoid(clist_fill_linear_color_trapezoid); dev_proc_fill_linear_color_triangle(clist_fill_linear_color_triangle); dev_proc_dev_spec_op(clist_dev_spec_op); -dev_proc_copy_plane(clist_copy_plane); +dev_proc_copy_planes(clist_copy_planes); /* In gxclimag.c */ dev_proc_fill_mask(clist_fill_mask); diff -Nru ghostscript-9.04~dfsg/base/gxclfile.c ghostscript-9.05~dfsg~20120125/base/gxclfile.c --- ghostscript-9.04~dfsg/base/gxclfile.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxclfile.c 2011-09-29 11:01:33.000000000 +0000 @@ -16,7 +16,6 @@ #include "stdio_.h" #include "string_.h" #include "unistd_.h" -#include "gserror.h" #include "gserrors.h" #include "gsmemory.h" #include "gp.h" diff -Nru ghostscript-9.04~dfsg/base/gxclimag.c ghostscript-9.05~dfsg~20120125/base/gxclimag.c --- ghostscript-9.04~dfsg/base/gxclimag.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxclimag.c 2011-11-21 08:55:19.000000000 +0000 @@ -72,7 +72,7 @@ int data_x_bit; byte copy_op = (depth > 1 ? cmd_op_copy_color_alpha : - cmd_op_copy_mono_plane + cmd_copy_ht_color); /* Plane not needed here */ + cmd_op_copy_mono_planes + cmd_copy_ht_color); /* Plane not needed here */ bool slow_rop = cmd_slow_rop(dev, lop_know_S_0(lop), pdcolor) || cmd_slow_rop(dev, lop_know_S_1(lop), pdcolor); @@ -160,6 +160,7 @@ tile.size.y = tile.rep_height = orig_height; tile.rep_shift = tile.shift = 0; tile.id = id; + tile.num_planes = 1; do { code = clist_change_bits(cdev, re.pcls, &tile, depth); } while (RECT_RECOVER(code)); @@ -180,7 +181,7 @@ rect.x = orig_x, rect.y = y0; rect.width = orig_width, rect.height = re.yend - y0; rsize = 1 + cmd_sizexy(rect); - if (depth == 1) rsize = rsize + cmd_sizew(255); /* need planar 255 setting */ + if (depth == 1) rsize = rsize + cmd_sizew(0); /* need planar_height 0 setting */ do { code = (orig_data_x ? cmd_put_set_data_x(cdev, re.pcls, orig_data_x) : 0); @@ -199,7 +200,7 @@ if (code >= 0) { dp++; if (depth == 1) { - cmd_putw(255, dp); + cmd_putw(0, dp); } cmd_putxy(rect, dp); } @@ -527,7 +528,8 @@ code = dev_proc(dev, get_profile)(dev, &dev_profile); gsicc_extract_profile(dev->graphics_type_tag, dev_profile, &(gs_output_profile), - &(pis_nonconst->renderingintent)); + (gsicc_rendering_intents_t *)\ + (&(pis_nonconst->renderingintent))); } } if (renderingintent != pis_nonconst->renderingintent) diff -Nru ghostscript-9.04~dfsg/base/gxclip2.c ghostscript-9.05~dfsg~20120125/base/gxclip2.c --- ghostscript-9.04~dfsg/base/gxclip2.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxclip2.c 2011-11-21 08:55:19.000000000 +0000 @@ -27,8 +27,10 @@ static dev_proc_fill_rectangle(tile_clip_fill_rectangle); static dev_proc_copy_mono(tile_clip_copy_mono); static dev_proc_copy_color(tile_clip_copy_color); +static dev_proc_copy_planes(tile_clip_copy_planes); static dev_proc_copy_alpha(tile_clip_copy_alpha); static dev_proc_strip_copy_rop(tile_clip_strip_copy_rop); +static dev_proc_strip_copy_rop2(tile_clip_strip_copy_rop2); /* The device descriptor. */ static const gx_device_tile_clip gs_tile_clip_device = @@ -99,7 +101,11 @@ NULL, /* push_transparency_state */ NULL, /* pop_transparency_state */ NULL, /* put_image */ - gx_forward_dev_spec_op + gx_forward_dev_spec_op, + tile_clip_copy_planes, + NULL, /* get_profile */ + NULL, /* set_graphics_type_tag */ + tile_clip_strip_copy_rop2 } }; @@ -274,6 +280,31 @@ return 0; } +/* Copy a color rectangle. */ +static int +tile_clip_copy_planes(gx_device * dev, + const byte * data, int sourcex, int raster, gx_bitmap_id id, + int x, int y, int w, int h, int plane_height) +{ + gx_device_tile_clip *cdev = (gx_device_tile_clip *) dev; + + fit_copy(dev, data, sourcex, raster, id, x, y, w, h); + { + FOR_RUNS(data_row, txrun, tx, ty) { + /* Copy the run. */ + int code = (*dev_proc(cdev->target, copy_planes)) + (cdev->target, data_row, sourcex + txrun - x, raster, + gx_no_bitmap_id, txrun, ty, tx - txrun, 1, plane_height); + + if (code < 0) + return code; + } + END_FOR_RUNS(); + } + return 0; +} + + /* Copy an alpha rectangle similarly. */ static int tile_clip_copy_alpha(gx_device * dev, @@ -325,3 +356,32 @@ } return 0; } + +static int +tile_clip_strip_copy_rop2(gx_device * dev, + const byte * data, int sourcex, uint raster, gx_bitmap_id id, + const gx_color_index * scolors, + const gx_strip_bitmap * textures, const gx_color_index * tcolors, + int x, int y, int w, int h, + int phase_x, int phase_y, gs_logical_operation_t lop, + uint planar_height) +{ + gx_device_tile_clip *cdev = (gx_device_tile_clip *) dev; + + fit_copy(dev, data, sourcex, raster, id, x, y, w, h); + { + FOR_RUNS(data_row, txrun, tx, ty) { + /* Copy the run. */ + int code = (*dev_proc(cdev->target, strip_copy_rop2)) + (cdev->target, data_row, sourcex + txrun - x, raster, + gx_no_bitmap_id, scolors, textures, tcolors, + txrun, ty, tx - txrun, 1, phase_x, phase_y, lop, + planar_height); + + if (code < 0) + return code; + } + END_FOR_RUNS(); + } + return 0; +} diff -Nru ghostscript-9.04~dfsg/base/gxclip.c ghostscript-9.05~dfsg~20120125/base/gxclip.c --- ghostscript-9.04~dfsg/base/gxclip.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxclip.c 2011-11-21 08:55:19.000000000 +0000 @@ -31,12 +31,13 @@ static dev_proc_open_device(clip_open); static dev_proc_fill_rectangle(clip_fill_rectangle); static dev_proc_copy_mono(clip_copy_mono); -static dev_proc_copy_plane(clip_copy_plane); +static dev_proc_copy_planes(clip_copy_planes); static dev_proc_copy_color(clip_copy_color); static dev_proc_copy_alpha(clip_copy_alpha); static dev_proc_fill_mask(clip_fill_mask); static dev_proc_strip_tile_rectangle(clip_strip_tile_rectangle); static dev_proc_strip_copy_rop(clip_strip_copy_rop); +static dev_proc_strip_copy_rop2(clip_strip_copy_rop2); static dev_proc_get_clipping_box(clip_get_clipping_box); static dev_proc_get_bits_rectangle(clip_get_bits_rectangle); static dev_proc_fill_path(clip_fill_path); @@ -111,9 +112,10 @@ NULL, /* pop_transparency_state */ NULL, /* put_image */ gx_forward_dev_spec_op, - clip_copy_plane, /* copy plane */ + clip_copy_planes, /* copy planes */ gx_forward_get_profile, - gx_forward_set_graphics_type_tag + gx_forward_set_graphics_type_tag, + clip_strip_copy_rop2 } }; @@ -421,17 +423,17 @@ /* Copy a plane */ int -clip_call_copy_plane(clip_callback_data_t * pccd, int xc, int yc, int xec, int yec) +clip_call_copy_planes(clip_callback_data_t * pccd, int xc, int yc, int xec, int yec) { - return (*dev_proc(pccd->tdev, copy_plane)) + return (*dev_proc(pccd->tdev, copy_planes)) (pccd->tdev, pccd->data + (yc - pccd->y) * pccd->raster, pccd->sourcex + xc - pccd->x, pccd->raster, gx_no_bitmap_id, - xc, yc, xec - xc, yec - yc, pccd->plane); + xc, yc, xec - xc, yec - yc, pccd->plane_height); } static int -clip_copy_plane(gx_device * dev, - const byte * data, int sourcex, int raster, gx_bitmap_id id, - int x, int y, int w, int h, int plane) +clip_copy_planes(gx_device * dev, + const byte * data, int sourcex, int raster, gx_bitmap_id id, + int x, int y, int w, int h, int plane_height) { gx_device_clip *rdev = (gx_device_clip *) dev; clip_callback_data_t ccdata; @@ -450,15 +452,15 @@ INCR(in_y); if (x >= rptr->xmin && xe <= rptr->xmax) { INCR(in); - return dev_proc(tdev, copy_plane) - (tdev, data, sourcex, raster, id, x, y, w, h, plane); + return dev_proc(tdev, copy_planes) + (tdev, data, sourcex, raster, id, x, y, w, h, plane_height); } } ccdata.tdev = tdev; ccdata.data = data, ccdata.sourcex = sourcex, ccdata.raster = raster; - ccdata.plane = plane; + ccdata.plane_height = plane_height; return clip_enumerate_rest(rdev, x, y, xe, ye, - clip_call_copy_plane, &ccdata); + clip_call_copy_planes, &ccdata); } /* Copy a color rectangle */ @@ -585,6 +587,37 @@ return clip_enumerate(rdev, x, y, w, h, clip_call_strip_copy_rop, &ccdata); } +/* Copy a rectangle with RasterOp and strip texture. */ +int +clip_call_strip_copy_rop2(clip_callback_data_t * pccd, int xc, int yc, int xec, int yec) +{ + return (*dev_proc(pccd->tdev, strip_copy_rop2)) + (pccd->tdev, pccd->data + (yc - pccd->y) * pccd->raster, + pccd->sourcex + xc - pccd->x, pccd->raster, gx_no_bitmap_id, + pccd->scolors, pccd->textures, pccd->tcolors, + xc, yc, xec - xc, yec - yc, pccd->phase.x, pccd->phase.y, + pccd->lop, pccd->plane_height); +} +static int +clip_strip_copy_rop2(gx_device * dev, + const byte * sdata, int sourcex, uint raster, gx_bitmap_id id, + const gx_color_index * scolors, + const gx_strip_bitmap * textures, const gx_color_index * tcolors, + int x, int y, int w, int h, + int phase_x, int phase_y, gs_logical_operation_t lop, + uint planar_height) +{ + gx_device_clip *rdev = (gx_device_clip *) dev; + clip_callback_data_t ccdata; + + ccdata.data = sdata, ccdata.sourcex = sourcex, ccdata.raster = raster; + ccdata.scolors = scolors, ccdata.textures = textures, + ccdata.tcolors = tcolors; + ccdata.phase.x = phase_x, ccdata.phase.y = phase_y, ccdata.lop = lop; + ccdata.plane_height = planar_height; + return clip_enumerate(rdev, x, y, w, h, clip_call_strip_copy_rop2, &ccdata); +} + /* Get the (outer) clipping box, in client coordinates. */ static void clip_get_clipping_box(gx_device * dev, gs_fixed_rect * pbox) diff -Nru ghostscript-9.04~dfsg/base/gxclip.h ghostscript-9.05~dfsg~20120125/base/gxclip.h --- ghostscript-9.04~dfsg/base/gxclip.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxclip.h 2011-11-21 08:55:19.000000000 +0000 @@ -45,7 +45,7 @@ const gx_color_index *scolors; /* strip_copy_rop */ const gx_strip_bitmap *textures; /* ibid. */ const gx_color_index *tcolors; /* ibid. */ - int plane; /* copy_plane */ + int plane_height; /* copy_planes, strip_copy_rop2 */ const gs_imager_state * pis; /* fill_path */ gx_path * ppath; /* fill_path */ const gx_fill_params * params; /* fill_path */ @@ -57,8 +57,8 @@ int xc, int yc, int xec, int yec), clip_call_copy_mono(clip_callback_data_t * pccd, int xc, int yc, int xec, int yec), - clip_call_copy_plane(clip_callback_data_t * pccd, - int xc, int yc, int xec, int yec), + clip_call_copy_planes(clip_callback_data_t * pccd, + int xc, int yc, int xec, int yec), clip_call_copy_color(clip_callback_data_t * pccd, int xc, int yc, int xec, int yec), clip_call_copy_alpha(clip_callback_data_t * pccd, @@ -68,6 +68,8 @@ clip_call_strip_tile_rectangle(clip_callback_data_t * pccd, int xc, int yc, int xec, int yec), clip_call_strip_copy_rop(clip_callback_data_t * pccd, - int xc, int yc, int xec, int yec); + int xc, int yc, int xec, int yec), + clip_call_strip_copy_rop2(clip_callback_data_t * pccd, + int xc, int yc, int xec, int yec); #endif /* gxclip_INCLUDED */ diff -Nru ghostscript-9.04~dfsg/base/gxclipm.c ghostscript-9.05~dfsg~20120125/base/gxclipm.c --- ghostscript-9.04~dfsg/base/gxclipm.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxclipm.c 2011-11-21 08:55:19.000000000 +0000 @@ -27,6 +27,7 @@ static dev_proc_copy_alpha(mask_clip_copy_alpha); static dev_proc_strip_tile_rectangle(mask_clip_strip_tile_rectangle); static dev_proc_strip_copy_rop(mask_clip_strip_copy_rop); +static dev_proc_strip_copy_rop2(mask_clip_strip_copy_rop2); static dev_proc_get_clipping_box(mask_clip_get_clipping_box); /* The device descriptor. */ @@ -101,7 +102,8 @@ gx_forward_dev_spec_op, NULL, gx_forward_get_profile, - gx_forward_set_graphics_type_tag + gx_forward_set_graphics_type_tag, + mask_clip_strip_copy_rop2 } }; @@ -373,6 +375,28 @@ return clip_runs_enumerate(cdev, clip_call_strip_copy_rop, &ccdata); } +static int +mask_clip_strip_copy_rop2(gx_device * dev, + const byte * data, int sourcex, uint raster, gx_bitmap_id id, + const gx_color_index * scolors, + const gx_strip_bitmap * textures, const gx_color_index * tcolors, + int x, int y, int w, int h, + int phase_x, int phase_y, gs_logical_operation_t lop, + uint planar_height) +{ + gx_device_mask_clip *cdev = (gx_device_mask_clip *) dev; + clip_callback_data_t ccdata; + + ccdata.tdev = cdev->target; + ccdata.x = x, ccdata.y = y, ccdata.w = w, ccdata.h = h; + ccdata.data = data, ccdata.sourcex = sourcex, ccdata.raster = raster; + ccdata.scolors = scolors, ccdata.textures = textures, + ccdata.tcolors = tcolors; + ccdata.phase.x = phase_x, ccdata.phase.y = phase_y, ccdata.lop = lop; + ccdata.plane_height = planar_height; + return clip_runs_enumerate(cdev, clip_call_strip_copy_rop2, &ccdata); +} + static void mask_clip_get_clipping_box(gx_device * dev, gs_fixed_rect * pbox) { diff -Nru ghostscript-9.04~dfsg/base/gxclist.c ghostscript-9.05~dfsg~20120125/base/gxclist.c --- ghostscript-9.04~dfsg/base/gxclist.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxclist.c 2011-11-21 08:55:19.000000000 +0000 @@ -193,9 +193,10 @@ NULL, /* pop_transparency_state */ NULL, /* put_image */ clist_dev_spec_op, - clist_copy_plane, /* copy plane */ + clist_copy_planes, /* copy planes */ gx_default_get_profile, - gx_default_set_graphics_type_tag + gx_default_set_graphics_type_tag, + clist_strip_copy_rop2 }; /*------------------- Choose the implementation ----------------------- @@ -999,19 +1000,19 @@ * default constructor if from == NULL */ void -clist_copy_band_complexity(gx_band_complexity_t *this, const gx_band_complexity_t *from) +clist_copy_band_complexity(gx_band_complexity_t *self, const gx_band_complexity_t *from) { if (from) { - memcpy(this, from, sizeof(gx_band_complexity_t)); + memcpy(self, from, sizeof(gx_band_complexity_t)); } else { /* default */ - this->uses_color = false; - this->nontrivial_rops = false; + self->uses_color = false; + self->nontrivial_rops = false; #if 0 /* todo: halftone phase */ - this->x0 = 0; - this->y0 = 0; + self->x0 = 0; + self->y0 = 0; #endif } } @@ -1040,7 +1041,6 @@ int clist_icc_freetable(clist_icctable_t *icc_table, gs_memory_t *memory) { - int number_entries; clist_icctable_entry_t *curr_entry, *next_entry; int k; @@ -1051,10 +1051,10 @@ curr_entry = icc_table->head; for (k = 0; k < number_entries; k++) { next_entry = curr_entry->next; - gs_free_object(memory, curr_entry, "clist_icc_freetable"); + gs_free_object(icc_table->memory, curr_entry, "clist_icc_freetable"); curr_entry = next_entry; } - gs_free_object(memory, icc_table, "clist_icc_freetable"); + gs_free_object(icc_table->memory, icc_table, "clist_icc_freetable"); return(0); } @@ -1135,6 +1135,7 @@ clist_icctable_entry_t *entry, *curr_entry; int k; int64_t hashcode; + gs_memory_t *stable_mem = cdev->memory->stable_memory; /* If the hash code is not valid then compute it now */ if (icc_profile->hash_is_valid == false) { @@ -1146,9 +1147,9 @@ hashcode = hashcode_in; } if ( icc_table == NULL ) { - entry = (clist_icctable_entry_t *) gs_alloc_struct(cdev->memory, - clist_icctable_entry_t, - &st_clist_icctable_entry, "clist_icc_addentry"); + entry = (clist_icctable_entry_t *) gs_alloc_struct(stable_mem, + clist_icctable_entry_t, &st_clist_icctable_entry, + "clist_icc_addentry"); if (entry == NULL) return gs_rethrow(-1, "insufficient memory to allocate entry in icc table"); entry->next = NULL; @@ -1157,22 +1158,19 @@ entry->serial_data.file_position = -1; entry->icc_profile = icc_profile; rc_increment(icc_profile); - icc_table = gs_alloc_struct(cdev->memory, - clist_icctable_t, - &st_clist_icctable, "clist_icc_addentry"); - + icc_table = gs_alloc_struct(stable_mem, clist_icctable_t, + &st_clist_icctable, "clist_icc_addentry"); if (icc_table == NULL) return gs_rethrow(-1, "insufficient memory to allocate icc table"); icc_table->tablesize = 1; icc_table->head = entry; icc_table->final = entry; - + icc_table->memory = stable_mem; /* For now, we are just going to put the icc_table itself at band_range_max + 1. The ICC profiles are written in the cfile at the current stored file position*/ cdev->icc_table = icc_table; } else { - /* First check if we already have this entry */ curr_entry = icc_table->head; for ( k = 0; k < icc_table->tablesize; k++ ) { @@ -1180,11 +1178,12 @@ return(0); /* A hit */ curr_entry = curr_entry->next; } - /* Add a new ICC profile */ - entry = (clist_icctable_entry_t *) gs_alloc_struct(cdev->memory, - clist_icctable_entry_t, - &st_clist_icctable_entry, "clist_icc_addentry"); + entry = + (clist_icctable_entry_t *) gs_alloc_struct(icc_table->memory, + clist_icctable_entry_t, + &st_clist_icctable_entry, + "clist_icc_addentry"); if (entry == NULL) return gs_rethrow(-1, "insufficient memory to allocate entry in icc table"); entry->next = NULL; @@ -1280,7 +1279,7 @@ /* Get command list data. */ int -clist_get_data(const gx_device_clist *cdev, int select, int offset, byte *buf, int length) +clist_get_data(const gx_device_clist *cdev, int select, int64_t offset, byte *buf, int length) { const gx_band_page_info_t *pinfo = &cdev->common.page_info; clist_file_ptr pfile = (!select ? pinfo->bfile : pinfo->cfile); @@ -1297,11 +1296,11 @@ /* Put command list data. */ int -clist_put_data(const gx_device_clist *cdev, int select, int offset, const byte *buf, int length) +clist_put_data(const gx_device_clist *cdev, int select, int64_t offset, const byte *buf, int length) { const gx_band_page_info_t *pinfo = &cdev->common.page_info; clist_file_ptr pfile = (!select ? pinfo->bfile : pinfo->cfile); - int code; + int64_t code; code = pinfo->io_procs->ftell(pfile); if (code < 0) diff -Nru ghostscript-9.04~dfsg/base/gxclist.h ghostscript-9.05~dfsg~20120125/base/gxclist.h --- ghostscript-9.04~dfsg/base/gxclist.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxclist.h 2011-11-12 18:29:08.000000000 +0000 @@ -123,6 +123,7 @@ ushort rep_shift; ushort index; /* index in table (hash table when writing) */ ushort num_bands; /* # of 1-bits in the band mask */ + byte num_planes; /* byte band_mask[]; */ #define ts_mask(pts) (byte *)((pts) + 1) /* byte bits[]; */ @@ -235,6 +236,7 @@ struct clist_icctable_s { int tablesize; + gs_memory_t *memory; clist_icctable_entry_t *head; clist_icctable_entry_t *final; }; @@ -506,9 +508,9 @@ /* Retrieve total size for cfile and bfile. */ int clist_data_size(const gx_device_clist *cdev, int select); /* Get command list data. */ -int clist_get_data(const gx_device_clist *cdev, int select, int offset, byte *buf, int length); +int clist_get_data(const gx_device_clist *cdev, int select, int64_t offset, byte *buf, int length); /* Put command list data. */ -int clist_put_data(const gx_device_clist *cdev, int select, int offset, const byte *buf, int length); +int clist_put_data(const gx_device_clist *cdev, int select, int64_t offset, const byte *buf, int length); /* ICC table prototypes */ diff -Nru ghostscript-9.04~dfsg/base/gxcllzw.c ghostscript-9.05~dfsg~20120125/base/gxcllzw.c --- ghostscript-9.04~dfsg/base/gxcllzw.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxcllzw.c 2011-11-12 18:29:08.000000000 +0000 @@ -33,11 +33,11 @@ clist_compressor_init(stream_state *state) { s_LZW_set_defaults(state); - state->template = &s_LZWE_template; + state->templat = &s_LZWE_template; } void clist_decompressor_init(stream_state *state) { s_LZW_set_defaults(state); - state->template = &s_LZWD_template; + state->templat = &s_LZWD_template; } diff -Nru ghostscript-9.04~dfsg/base/gxclmem.c ghostscript-9.05~dfsg~20120125/base/gxclmem.c --- ghostscript-9.04~dfsg/base/gxclmem.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxclmem.c 2011-11-12 18:29:08.000000000 +0000 @@ -460,10 +460,10 @@ /* Free any internal compressor state. */ if (f->compressor_initialized) { - if (f->decompress_state->template->release != 0) - (*f->decompress_state->template->release) (f->decompress_state); - if (f->compress_state->template->release != 0) - (*f->compress_state->template->release) (f->compress_state); + if (f->decompress_state->templat->release != 0) + (*f->decompress_state->templat->release) (f->decompress_state); + if (f->compress_state->templat->release != 0) + (*f->compress_state->templat->release) (f->compress_state); f->compressor_initialized = false; } /* free the raw buffers */ @@ -617,13 +617,13 @@ bp->phys_blk = f->phys_curr; bp->phys_pdata = (char *)(f->wt.ptr) + 1; - if (f->compress_state->template->reinit != 0) - (*f->compress_state->template->reinit)(f->compress_state); + if (f->compress_state->templat->reinit != 0) + (*f->compress_state->templat->reinit)(f->compress_state); compressed_size = 0; start_ptr = f->wt.ptr; - status = (*f->compress_state->template->process)(f->compress_state, - &(f->rd), &(f->wt), true); + status = (*f->compress_state->templat->process)(f->compress_state, + &(f->rd), &(f->wt), true); bp->phys_blk->data_limit = (char *)(f->wt.ptr); if (status == 1) { /* More output space needed (see strimpl.h) */ @@ -643,8 +643,8 @@ start_ptr = f->wt.ptr; status = - (*f->compress_state->template->process)(f->compress_state, - &(f->rd), &(f->wt), true); + (*f->compress_state->templat->process)(f->compress_state, + &(f->rd), &(f->wt), true); if (status != 0) { /* * You'd think the above line is a bug, but in real life 1 src @@ -711,8 +711,8 @@ if (!f->compressor_initialized) { int code = 0; - if (f->compress_state->template->init != 0) - code = (*f->compress_state->template->init) (f->compress_state); + if (f->compress_state->templat->init != 0) + code = (*f->compress_state->templat->init) (f->compress_state); if (code < 0) return_error(gs_error_VMerror); /****** BOGUS ******/ f->compressor_initialized = true; @@ -890,8 +890,8 @@ num_raw_buffers = i + 1; /* if MALLOC failed, then OK */ if_debug1(':', "[:]Number of raw buffers allocated=%d\n", num_raw_buffers); - if (f->decompress_state->template->init != 0) - code = (*f->decompress_state->template->init) + if (f->decompress_state->templat->init != 0) + code = (*f->decompress_state->templat->init) (f->decompress_state); if (code < 0) return_error(gs_error_VMerror); @@ -921,8 +921,8 @@ /* Decompress the data into this raw block */ /* Initialize the decompressor */ - if (f->decompress_state->template->reinit != 0) - (*f->decompress_state->template->reinit) (f->decompress_state); + if (f->decompress_state->templat->reinit != 0) + (*f->decompress_state->templat->reinit) (f->decompress_state); /* Set pointers and call the decompress routine */ f->wt.ptr = (byte *) (f->raw_head->data) - 1; f->wt.limit = f->wt.ptr + MEMFILE_DATA_SIZE; @@ -934,7 +934,7 @@ decomp_rd_ptr0 = f->rd.ptr; decomp_rd_limit0 = f->rd.limit; #endif - status = (*f->decompress_state->template->process) + status = (*f->decompress_state->templat->process) (f->decompress_state, &(f->rd), &(f->wt), true); if (status == 0) { /* More input data needed */ /* switch to next block and continue decompress */ @@ -954,7 +954,7 @@ decomp_rd_ptr1 = f->rd.ptr; decomp_rd_limit1 = f->rd.limit; #endif - status = (*f->decompress_state->template->process) + status = (*f->decompress_state->templat->process) (f->decompress_state, &(f->rd), &(f->wt), true); if (status == 0) { emprintf(f->memory, @@ -1180,10 +1180,10 @@ /* Free any internal compressor state. */ if (f->compressor_initialized) { - if (f->decompress_state->template->release != 0) - (*f->decompress_state->template->release) (f->decompress_state); - if (f->compress_state->template->release != 0) - (*f->compress_state->template->release) (f->compress_state); + if (f->decompress_state->templat->release != 0) + (*f->decompress_state->templat->release) (f->decompress_state); + if (f->compress_state->templat->release != 0) + (*f->compress_state->templat->release) (f->compress_state); f->compressor_initialized = false; } /* free the raw buffers */ diff -Nru ghostscript-9.04~dfsg/base/gxclpath.c ghostscript-9.05~dfsg~20120125/base/gxclpath.c --- ghostscript-9.04~dfsg/base/gxclpath.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxclpath.c 2012-01-25 08:44:24.000000000 +0000 @@ -425,16 +425,16 @@ sizeof(float) + /* flatness */ sizeof(float) + /* line width */ sizeof(float) + /* miter limit */ - 1 + /* op_bm_tk */ + 2 + /* op_bm_tk and rend intent */ sizeof(float) * 2 + /* opacity/shape alpha */ sizeof(cldev->imager_state.alpha) ]; byte *bp = buf; - - /* Here we assume that all the caps are the same as start_cap */ if (unknown & cap_join_known) { *bp++ = (cldev->imager_state.line_params.start_cap << 3) + cldev->imager_state.line_params.join; + *bp++ = (cldev->imager_state.line_params.end_cap << 3) + + cldev->imager_state.line_params.dash_cap; } if (unknown & cj_ac_sa_known) { *bp++ = @@ -460,11 +460,11 @@ } if (unknown & op_bm_tk_known) { *bp++ = - (cldev->imager_state.renderingintent << 4) + ((int)cldev->imager_state.blend_mode << 3) + (cldev->imager_state.text_knockout << 2) + (cldev->imager_state.overprint_mode << 1) + cldev->imager_state.overprint; + *bp++ = cldev->imager_state.renderingintent; } if (unknown & opacity_alpha_known) { memcpy(bp, &cldev->imager_state.opacity.alpha, sizeof(float)); @@ -872,10 +872,13 @@ pis->line_params.dot_length, pis->line_params.dot_length_absolute); } - /* Here we assume that all the caps are the same as start_cap */ - if (state_neq(line_params.start_cap) || state_neq(line_params.join)) { + + if (state_neq(line_params.start_cap) || state_neq(line_params.join) || + state_neq(line_params.end_cap) || state_neq(line_params.dash_cap)) { unknown |= cap_join_known; state_update(line_params.start_cap); + state_update(line_params.end_cap); + state_update(line_params.dash_cap); state_update(line_params.join); } cmd_check_fill_known(cdev, pis, params->flatness, &pis->fill_adjust, diff -Nru ghostscript-9.04~dfsg/base/gxclrast.c ghostscript-9.05~dfsg~20120125/base/gxclrast.c --- ghostscript-9.04~dfsg/base/gxclrast.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxclrast.c 2012-01-25 08:44:24.000000000 +0000 @@ -533,7 +533,7 @@ bool clipper_dev_open; patch_fill_state_t pfs; int op = 0; - short plane = 0; + int plane_height = 0; #ifdef DEBUG stream_state *st = s->state; /* Save because s_close resets s->state. */ @@ -574,6 +574,7 @@ state_tile.id = gx_no_bitmap_id; state_tile.shift = state_tile.rep_shift = 0; state_tile.size.x = state_tile.size.y = 0; + state_tile.num_planes = 1; tile_phase.x = color_phase.x = x0; tile_phase.y = color_phase.y = y0; gx_path_init_local(&path, mem); @@ -705,6 +706,7 @@ bitmap_raster(bits.width * bits.cb_depth); bits.x_reps = bits.y_reps = 1; bits.shift = bits.rep_shift = 0; + bits.num_planes = 1; goto stb; case cmd_opv_set_tile_color: set_colors = state.tile_colors; @@ -923,9 +925,15 @@ } state.rect.width += (op & 7) + cmd_min_dw_tiny; break; - case cmd_op_copy_mono_plane >> 4: - cmd_getw(plane, cbp); - depth = 1; + case cmd_op_copy_mono_planes >> 4: + cmd_getw(plane_height, cbp); + if (plane_height == 0) { + /* We are doing a copy mono */ + depth = 1; + } else { + depth = tdev->color_info.depth; + } + if_debug1('L', " plane_height=0x%x", plane_height); goto copy; case cmd_op_copy_color_alpha >> 4: if (state.color_is_alpha) { @@ -933,6 +941,7 @@ depth = *cbp++; } else depth = tdev->color_info.depth; + plane_height = 0; copy:cmd_getw(state.rect.x, cbp); cmd_getw(state.rect.y, cbp); if (op & 8) { /* Use the current "tile". */ @@ -954,20 +963,27 @@ /* depth was set already. */ uint width_bits, width_bytes; uint bytes; + uint planes = 1; + uint plane_depth = depth; + uint pln; + byte compression = op & 3; cmd_getw(state.rect.width, cbp); cmd_getw(state.rect.height, cbp); - width_bits = state.rect.width * depth; - bytes = - clist_bitmap_bytes(width_bits, - state.rect.height, - op & 3, &width_bytes, - (uint *)&raster); + if (plane_height != 0) { + planes = tdev->color_info.num_components; + plane_depth /= planes; + } + width_bits = state.rect.width * plane_depth; + bytes = clist_bitmap_bytes(width_bits, + state.rect.height, + op & 3, &width_bytes, + (uint *)&raster); /* copy_mono and copy_color/alpha */ /* ensure that the bits will fit in a single buffer, */ /* even after decompression if compressed. */ #ifdef DEBUG - if (bytes > cbuf_size) { + if (planes * bytes > cbuf_size) { lprintf6("bitmap size exceeds buffer! width=%d raster=%d height=%d\n file pos %ld buf pos %d/%d\n", state.rect.width, raster, state.rect.height, @@ -977,72 +993,80 @@ goto out; } #endif - if (op & 3) { /* Decompress the image data. */ - stream_cursor_read r; - stream_cursor_write w; - - /* We don't know the data length a priori, */ - /* so to be conservative, we read */ - /* the uncompressed size. */ - uint cleft = cbuf.end - cbp; - - if (cleft < bytes && !cbuf.end_status) { - uint nread = cbuf_size - cleft; - -# ifdef DEBUG - code = top_up_offset_map(st, cbuf.data, cbp, cbuf.end); - if (code < 0) - return code; -# endif - memmove(cbuf.data, cbp, cleft); - cbuf.end_status = sgets(s, cbuf.data + cleft, nread, &nread); - set_cb_end(&cbuf, cbuf.data + cleft + nread); - cbp = cbuf.data; - } - r.ptr = cbp - 1; - r.limit = cbuf.end - 1; - w.ptr = data_bits - 1; - w.limit = w.ptr + data_bits_size; - switch (op & 3) { - case cmd_compress_rle: - { - stream_RLD_state sstate; + for (pln = 0; pln < planes; pln++) + { + byte *plane_bits = data_bits + plane_height * raster; + if (pln) + compression = *cbp++; + if (compression) { /* Decompress the image data. */ + stream_cursor_read r; + stream_cursor_write w; + + /* We don't know the data length a priori, */ + /* so to be conservative, we read */ + /* the uncompressed size. */ + uint cleft = cbuf.end - cbp; - clist_rld_init(&sstate); - /* The process procedure can't fail. */ - (*s_RLD_template.process) - ((stream_state *)&sstate, &r, &w, true); - } - break; - case cmd_compress_cfe: - { - stream_CFD_state sstate; + if (cleft < bytes && !cbuf.end_status) { + uint nread = cbuf_size - cleft; - clist_cfd_init(&sstate, - width_bytes << 3 /*state.rect.width */ , - state.rect.height, mem); - /* The process procedure can't fail. */ - (*s_CFD_template.process) - ((stream_state *)&sstate, &r, &w, true); - (*s_CFD_template.release) - ((stream_state *)&sstate); - } - break; - default: - goto bad_op; +# ifdef DEBUG + code = top_up_offset_map(st, cbuf.data, cbp, cbuf.end); + if (code < 0) + return code; +# endif + memmove(cbuf.data, cbp, cleft); + cbuf.end_status = sgets(s, cbuf.data + cleft, nread, &nread); + set_cb_end(&cbuf, cbuf.data + cleft + nread); + cbp = cbuf.data; + } + r.ptr = cbp - 1; + r.limit = cbuf.end - 1; + w.ptr = plane_bits - 1; + w.limit = w.ptr + data_bits_size; + switch (compression) { + case cmd_compress_rle: + { + stream_RLD_state sstate; + + clist_rld_init(&sstate); + /* The process procedure can't fail. */ + (*s_RLD_template.process) + ((stream_state *)&sstate, &r, &w, true); + } + break; + case cmd_compress_cfe: + { + stream_CFD_state sstate; + + clist_cfd_init(&sstate, + width_bytes << 3 /*state.rect.width */ , + state.rect.height, mem); + /* The process procedure can't fail. */ + (*s_CFD_template.process) + ((stream_state *)&sstate, &r, &w, true); + (*s_CFD_template.release) + ((stream_state *)&sstate); + } + break; + default: + goto bad_op; + } + cbp = r.ptr + 1; + if (pln == 0) + source = data_bits; + } else if ((state.rect.height > 1 && width_bytes != raster) || + (plane_height != 0)) { + if (pln == 0) + source = data_bits; + cbp = cmd_read_short_bits(&cbuf, plane_bits, width_bytes, + state.rect.height, + raster, cbp); + } else { + /* Never used for planar data */ + cmd_read(cbuf.data, bytes, cbp); + source = cbuf.data; } - cbp = r.ptr + 1; - source = data_bits; - } else if (state.rect.height > 1 && - width_bytes != raster - ) { - source = data_bits; - cbp = cmd_read_short_bits(&cbuf, source, width_bytes, - state.rect.height, - raster, cbp); - } else { - cmd_read(cbuf.data, bytes, cbp); - source = cbuf.data; } #ifdef DEBUG if (gs_debug_c('L')) { @@ -1077,6 +1101,7 @@ state_tile.rep_shift = state_slot->rep_shift; state_tile.shift = state_slot->shift; state_tile.id = state_slot->id; + state_tile.num_planes = state_slot->num_planes; set_phase: /* * state.tile_phase is overloaded according to the command * to which it will apply: @@ -2012,15 +2037,29 @@ colors[0] = colors[1] = state.colors[1]; log_op = state.lop; pcolor = colors; - do_rop:code = (*dev_proc(tdev, strip_copy_rop)) - (tdev, source, data_x, raster, gx_no_bitmap_id, - pcolor, &state_tile, - (state.tile_colors[0] == gx_no_color_index && - state.tile_colors[1] == gx_no_color_index ? - NULL : state.tile_colors), - state.rect.x - x0, state.rect.y - y0, - state.rect.width - data_x, state.rect.height, - tile_phase.x, tile_phase.y, log_op); + do_rop:if (plane_height == 0) { + code = (*dev_proc(tdev, strip_copy_rop)) + (tdev, source, data_x, raster, gx_no_bitmap_id, + pcolor, &state_tile, + (state.tile_colors[0] == gx_no_color_index && + state.tile_colors[1] == gx_no_color_index ? + NULL : state.tile_colors), + state.rect.x - x0, state.rect.y - y0, + state.rect.width - data_x, state.rect.height, + tile_phase.x, tile_phase.y, log_op); + } else { + code = (*dev_proc(tdev, strip_copy_rop2)) + (tdev, source, data_x, raster, gx_no_bitmap_id, + pcolor, &state_tile, + (state.tile_colors[0] == gx_no_color_index && + state.tile_colors[1] == gx_no_color_index ? + NULL : state.tile_colors), + state.rect.x - x0, state.rect.y - y0, + state.rect.width - data_x, state.rect.height, + tile_phase.x, tile_phase.y, log_op, + plane_height); + plane_height = 0; + } data_x = 0; break; case cmd_op_tile_rect >> 4: @@ -2039,7 +2078,7 @@ state.tile_colors[0], state.tile_colors[1], tile_phase.x, tile_phase.y); break; - case cmd_op_copy_mono_plane >> 4: + case cmd_op_copy_mono_planes >> 4: if (state.lop_enabled) { pcolor = state.colors; log_op = state.lop; @@ -2055,21 +2094,21 @@ state.rect.width - data_x, state.rect.height, &dev_color, 1, imager_state.log_op, pcpath); } else { - if (plane == 255) { + if (plane_height == 0) { code = (*dev_proc(tdev, copy_mono)) (tdev, source, data_x, raster, gx_no_bitmap_id, state.rect.x - x0, state.rect.y - y0, state.rect.width - data_x, state.rect.height, state.colors[0], state.colors[1]); } else { - code = (*dev_proc(tdev, copy_plane)) + code = (*dev_proc(tdev, copy_planes)) (tdev, source, data_x, raster, gx_no_bitmap_id, state.rect.x - x0, state.rect.y - y0, state.rect.width - data_x, state.rect.height, - plane); + plane_height); } } - plane = -1; + plane_height = 0; data_x = 0; break; case cmd_op_copy_color_alpha >> 4: @@ -2172,6 +2211,7 @@ { const byte *cbp = pcb->ptr; uint rep_width, rep_height; + uint pdepth; byte bd = *cbp++; bits->cb_depth = cmd_code_to_depth(bd); @@ -2197,14 +2237,21 @@ cmd_getw(bits->rep_shift, cbp); else bits->rep_shift = 0; - if_debug6('L', " depth=%d size=(%d,%d), rep_size=(%d,%d), rep_shift=%d\n", + if (bd & 0x10) + bits->num_planes = *cbp++; + else + bits->num_planes = 1; + if_debug7('L', " depth=%d size=(%d,%d), rep_size=(%d,%d), rep_shift=%d, num_planes=%d\n", bits->cb_depth, bits->width, bits->height, rep_width, - rep_height, bits->rep_shift); + rep_height, bits->rep_shift, bits->num_planes); bits->shift = (bits->rep_shift == 0 ? 0 : (bits->rep_shift * (bits->height / rep_height)) % rep_width); - bits->cb_raster = bitmap_raster(bits->width * bits->cb_depth); + pdepth = bits->cb_depth; + if (bits->num_planes != 1) + pdepth /= bits->num_planes; + bits->cb_raster = bitmap_raster(bits->width * pdepth); pcb->ptr = cbp; return 0; } @@ -2219,19 +2266,25 @@ uint rep_height = bits->height / bits->y_reps; uint index; ulong offset; - uint width_bits = rep_width * bits->cb_depth; + uint width_bits; uint width_bytes; uint raster; - uint bytes = - clist_bitmap_bytes(width_bits, rep_height, - compress | - (rep_width < bits->width ? - decompress_spread : 0) | - decompress_elsewhere, - &width_bytes, - (uint *)&raster); + uint bytes; byte *data; tile_slot *slot; + uint depth = bits->cb_depth; + + if (bits->num_planes != 1) + depth /= bits->num_planes; + width_bits = rep_width * depth; + + bytes = clist_bitmap_bytes(width_bits, rep_height * bits->num_planes, + compress | + (rep_width < bits->width ? + decompress_spread : 0) | + decompress_elsewhere, + &width_bytes, + (uint *)&raster); cmd_getw(index, cbp); cmd_getw(offset, cbp); @@ -2308,18 +2361,18 @@ return_error(gs_error_unregistered); } cbp = r.ptr + 1; - } else if (rep_height > 1 && width_bytes != bits->cb_raster) { + } else if (rep_height * bits->num_planes > 1 && width_bytes != bits->cb_raster) { cbp = cmd_read_short_bits(pcb, data, - width_bytes, rep_height, + width_bytes, rep_height * bits->num_planes, bits->cb_raster, cbp); } else { cbp = cmd_read_data(pcb, data, bytes, cbp); } if (bits->width > rep_width) bits_replicate_horizontally(data, - rep_width * bits->cb_depth, rep_height, + rep_width * depth, rep_height * bits->num_planes, bits->cb_raster, - bits->width * bits->cb_depth, + bits->width * depth, bits->cb_raster); if (bits->height > rep_height) bits_replicate_vertically(data, @@ -2427,12 +2480,15 @@ cmd_getw(mask, cbp); if (mask & cap_join_known) { cb = *cbp++; - pis->line_params.start_cap = - pis->line_params.end_cap = - pis->line_params.dash_cap = (gs_line_cap)((cb >> 3) & 7); + pis->line_params.start_cap = (gs_line_cap)((cb >> 3) & 7); pis->line_params.join = (gs_line_join)(cb & 7); - if_debug2('L', " cap=%d join=%d\n", + if_debug2('L', " start_cap=%d join=%d\n", pis->line_params.start_cap, pis->line_params.join); + cb = *cbp++; + pis->line_params.end_cap = (gs_line_cap)((cb >> 3) & 7); + pis->line_params.dash_cap = (gs_line_cap)(cb & 7); + if_debug2('L', "end_cap=%d dash_cap=%d\n", + pis->line_params.end_cap, pis->line_params.dash_cap); } if (mask & cj_ac_sa_known) { cb = *cbp++; @@ -2463,17 +2519,17 @@ } if (mask & op_bm_tk_known) { cb = *cbp++; - pis->renderingintent = (cb & 0xf0) >> 4; - cb = cb & 0x0f; pis->blend_mode = cb >> 3; pis->text_knockout = (cb & 4) != 0; /* the following usually have no effect; see gxclpath.c */ pis->overprint_mode = (cb >> 1) & 1; pis->effective_overprint_mode = pis->overprint_mode; pis->overprint = cb & 1; - if_debug4('L', " BM=%d TK=%d OPM=%d OP=%d\n", + cb = *cbp++; + pis->renderingintent = cb; + if_debug5('L', " BM=%d TK=%d OPM=%d OP=%d RI=%d\n", pis->blend_mode, pis->text_knockout, pis->overprint_mode, - pis->overprint); + pis->overprint, pis->renderingintent); } if (mask & segment_notes_known) { cb = *cbp++; diff -Nru ghostscript-9.04~dfsg/base/gxclread.c ghostscript-9.05~dfsg~20120125/base/gxclread.c --- ghostscript-9.04~dfsg/base/gxclread.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxclread.c 2011-11-21 08:55:19.000000000 +0000 @@ -416,7 +416,7 @@ crdev->page_info.io_procs->fread_chars(buf, size, cfile); /* Restore our position */ crdev->page_info.io_procs->fseek(cfile, save_pos, SEEK_SET, crdev->page_info.cfname); - return(0); + return 0; } /* Unserialize the icc table information stored in the cfile and @@ -431,6 +431,7 @@ unsigned char *buf, *buf_start; clist_icctable_entry_t *curr_entry; int k; + gs_memory_t *stable_mem = crdev->memory->stable_memory; if ( icc_table != NULL ) return(0); @@ -446,24 +447,23 @@ return gs_rethrow(-1, "insufficient memory for icc table buffer reader"); /* Get the data */ clist_read_chunk(crdev, cb->pos + 4, size_data, buf); - icc_table = gs_alloc_struct(crdev->memory, - clist_icctable_t, - &st_clist_icctable, "clist_read_icctable"); + icc_table = gs_alloc_struct(stable_mem, clist_icctable_t, + &st_clist_icctable, "clist_read_icctable"); if (icc_table == NULL) { - gs_free_object(crdev->memory, buf_start, "clist_read_icctable"); + gs_free_object(stable_mem, buf_start, "clist_read_icctable"); return gs_rethrow(-1, "insufficient memory for icc table buffer reader"); } + icc_table->memory = stable_mem; icc_table->head = NULL; icc_table->final = NULL; /* Allocate and fill each entry */ icc_table->tablesize = number_entries; crdev->icc_table = icc_table; for (k = 0; k < number_entries; k++) { - curr_entry = gs_alloc_struct(crdev->memory, - clist_icctable_entry_t, + curr_entry = gs_alloc_struct(stable_mem, clist_icctable_entry_t, &st_clist_icctable_entry, "clist_read_icctable"); if (curr_entry == NULL) { - gs_free_object(crdev->memory, buf_start, "clist_read_icctable"); + gs_free_object(stable_mem, buf_start, "clist_read_icctable"); return gs_rethrow(-1, "insufficient memory for icc table entry"); } memcpy(&(curr_entry->serial_data), buf, sizeof(clist_icc_serial_entry_t)); @@ -480,7 +480,7 @@ } gs_free_object(crdev->memory, buf_start, "clist_read_icctable"); crdev->page_info.io_procs->fseek(cfile, save_pos, SEEK_SET, crdev->page_info.cfname); - return(0); + return 0; } /* Get the ICC profile table information from the clist */ @@ -762,10 +762,10 @@ /* * Set the band_offset_? values in case the buffer device - * needs this. Example, wtsimdi device needs to adjust the + * needs this. Example, a device may need to adjust the * phase of the dithering based on the page position, NOT * the position within the band buffer to avoid band stitch - * lines in the dither pattern. + * lines in the dither pattern. The old wtsimdi device did this * * The band_offset_x is not important for placed pages that * are nested on a 'master' page (imposition) since each diff -Nru ghostscript-9.04~dfsg/base/gxclrect.c ghostscript-9.05~dfsg~20120125/base/gxclrect.c --- ghostscript-9.04~dfsg/base/gxclrect.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxclrect.c 2011-11-21 08:55:19.000000000 +0000 @@ -621,7 +621,7 @@ copy:{ gx_cmd_rect rect; int rsize; - byte op = (byte) cmd_op_copy_mono_plane; + byte op = (byte) cmd_op_copy_mono_planes; byte *dp; uint csize; uint compress; @@ -629,7 +629,7 @@ rect.x = rx, rect.y = re.y; rect.width = w1, rect.height = re.height; - rsize = (dx ? 3 : 1) + cmd_size_rect(&rect) + cmd_sizew(255); + rsize = (dx ? 3 : 1) + cmd_size_rect(&rect) + cmd_sizew(0); /* planar_height 0 */ do { code = cmd_put_bits(cdev, re.pcls, row, w1, re.height, raster, rsize, (orig_id == gx_no_bitmap_id ? @@ -676,8 +676,8 @@ *dp++ = cmd_set_misc_data_x + dx; } *dp++ = cmd_count_op(op, csize); - /* Store the plane count */ - cmd_putw(255, dp); + /* Store the plane_height */ + cmd_putw(0, dp); cmd_put2w(rx, re.y, dp); cmd_put2w(w1, re.height, dp); re.pcls->rect = rect; @@ -694,9 +694,9 @@ /* The code duplication between this and clist_copy_mono needs to be removed */ int -clist_copy_plane(gx_device * dev, - const byte * data, int data_x, int raster, gx_bitmap_id id, - int rx, int ry, int rwidth, int rheight, int plane) +clist_copy_planes(gx_device * dev, + const byte * data, int data_x, int raster, gx_bitmap_id id, + int rx, int ry, int rwidth, int rheight, int plane_height) { gx_device_clist_writer * const cdev = &((gx_device_clist *)dev)->writer; @@ -704,8 +704,6 @@ gx_bitmap_id orig_id = id; cmd_rects_enum_t re; - if (plane < 0) - return gs_error_rangecheck; if (rwidth <= 0 || rheight <= 0) return 0; @@ -734,7 +732,7 @@ copy:{ gx_cmd_rect rect; int rsize; - byte op = (byte) cmd_op_copy_mono_plane; + byte op = (byte) cmd_op_copy_mono_planes; byte *dp; uint csize; uint compress; @@ -742,13 +740,33 @@ rect.x = rx, rect.y = re.y; rect.width = w1, rect.height = re.height; - rsize = (dx ? 3 : 1) + cmd_size_rect(&rect) + cmd_sizew(plane); + rsize = (dx ? 3 : 1) + cmd_size_rect(&rect) + cmd_sizew(plane_height); do { + int plane; + /* Copy the 0th plane - this is the one the op goes in. */ code = cmd_put_bits(cdev, re.pcls, row, w1, re.height, raster, rsize, (orig_id == gx_no_bitmap_id ? 1 << cmd_compress_rle : cmd_mask_compress_any), &dp, &csize); + if (plane_height > 0) { + for (plane = 1; plane < cdev->color_info.num_components && (code >= 0); plane++) + { + byte *dummy_dp; + uint csize2; + /* Copy subsequent planes - 1 byte header used to send the + * compression type. */ + code = cmd_put_bits(cdev, re.pcls, row, w1, re.height, raster, + 1, (orig_id == gx_no_bitmap_id ? + 1 << cmd_compress_rle : + cmd_mask_compress_any), + &dummy_dp, &csize2); + if (code >= 0) + *dummy_dp = code; + + csize += csize2; + } + } } while (RECT_RECOVER(code)); if (code < 0 && !(code == gs_error_limitcheck) && SET_BAND_CODE(code)) goto error_in_rect; @@ -768,14 +786,14 @@ ++cdev->driver_call_nesting; { - code = clist_copy_plane(dev, row, dx, raster, - gx_no_bitmap_id, rx, re.y, - w2, 1, plane); + code = clist_copy_planes(dev, row, dx, raster, + gx_no_bitmap_id, rx, re.y, + w2, 1, plane_height); if (code >= 0) - code = clist_copy_plane(dev, row, dx + w2, - raster, gx_no_bitmap_id, - rx + w2, re.y, - w1 - w2, 1, plane); + code = clist_copy_planes(dev, row, dx + w2, + raster, gx_no_bitmap_id, + rx + w2, re.y, + w1 - w2, 1, plane_height); } --cdev->driver_call_nesting; if (code < 0 && SET_BAND_CODE(code)) @@ -789,8 +807,7 @@ *dp++ = cmd_set_misc_data_x + dx; } *dp++ = cmd_count_op(op, csize); - /* Store the plane count */ - cmd_putw(plane, dp); + cmd_putw(plane_height, dp); cmd_put2w(rx, re.y, dp); cmd_put2w(w1, re.height, dp); re.pcls->rect = rect; @@ -1057,6 +1074,21 @@ int rx, int ry, int rwidth, int rheight, int phase_x, int phase_y, gs_logical_operation_t lop) { + return clist_strip_copy_rop2(dev, sdata, sourcex, sraster, id, + scolors, textures, tcolors, + rx, ry, rwidth, rheight, phase_x, phase_y, + lop, 0); +} + +int +clist_strip_copy_rop2(gx_device * dev, + const byte * sdata, int sourcex, uint sraster, gx_bitmap_id id, + const gx_color_index * scolors, + const gx_strip_bitmap * textures, const gx_color_index * tcolors, + int rx, int ry, int rwidth, int rheight, + int phase_x, int phase_y, gs_logical_operation_t lop, + uint planar_height) +{ gx_device_clist_writer * const cdev = &((gx_device_clist *)dev)->writer; gs_rop3_t rop = lop_rop(lop); @@ -1170,6 +1202,8 @@ line_tile.size.y = 1; line_tile.rep_height = 1; raster = line_tile.raster; + if (line_tile.num_planes > 0) + line_tile.raster *= tiles->size.y; /* The rasterizer assumes tile phase relatively to the rectangle origin, (see x_offset in gdevmr8n.c), so compute "the tile phase in the tile space" with same expression : */ @@ -1182,6 +1216,8 @@ */ int depth = cdev->clist_color_info.depth; + if (line_tile.num_planes > 0) + depth /= line_tile.num_planes; # if 0 /* Align bitmap data : */ data_shift = ((tile_space_phase * depth) >> (log2_align_bitmap_mod + 3)) << log2_align_bitmap_mod; @@ -1197,7 +1233,8 @@ and because the bitmap height is 1. The clist reader must provide the trailing bytes if the rasterizer needs them. */ - line_tile.raster = (line_tile.rep_width * depth + 7) / 8; + if (line_tile.num_planes <= 1) + line_tile.raster = (line_tile.rep_width * depth + 7) / 8; line_tile.size.x = line_tile.rep_width; line_tile.shift = 0; new_phase = (tile_space_phase - phase_shift - rx % line_tile.rep_width); @@ -1210,13 +1247,13 @@ line_tile.id = ids + (iy % rep_height); ++cdev->driver_call_nesting; { - code = clist_strip_copy_rop(dev, + code = clist_strip_copy_rop2(dev, (sdata == 0 ? 0 : row + iy * sraster), sourcex, sraster, gx_no_bitmap_id, scolors, &line_tile, tcolors, rx, re.y + iy, rwidth, 1, - new_phase, 0, lop); + new_phase, 0, lop, planar_height); } --cdev->driver_call_nesting; if (code < 0 && SET_BAND_CODE(code)) @@ -1268,10 +1305,10 @@ code = clist_copy_mono(dev, row, sourcex, sraster, id, rx, re.y, rwidth, re.height, scolors[0], scolors[1]); - } else if (lop & lop_planar) { - code = clist_copy_plane(dev, row, sourcex, sraster, id, - rx, re.y, rwidth, re.height, - (lop >> lop_planar_shift)); + } else if (planar_height) { + code = clist_copy_planes(dev, row, sourcex, sraster, id, + rx, re.y, rwidth, re.height, + planar_height); } else { code = clist_copy_color(dev, row, sourcex, sraster, id, rx, re.y, rwidth, re.height); diff -Nru ghostscript-9.04~dfsg/base/gxclthrd.c ghostscript-9.05~dfsg~20120125/base/gxclthrd.c --- ghostscript-9.04~dfsg/base/gxclthrd.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxclthrd.c 2012-01-07 20:18:22.000000000 +0000 @@ -158,7 +158,7 @@ if (code < 0) return_error(gs_error_VMerror); } ncdev->page_uses_transparency = cdev->page_uses_transparency; - if_debug3('{',"[{]MT clist device = 0x%x profile = 0x%x handle = 0x%x\n", + if_debug3(gs_debug_flag_icc,"[icc] MT clist device = 0x%x profile = 0x%x handle = 0x%x\n", ncdev, ncdev->icc_struct->device_profile[0], ncdev->icc_struct->device_profile[0]->profile_handle); diff -Nru ghostscript-9.04~dfsg/base/gxclzlib.c ghostscript-9.05~dfsg~20120125/base/gxclzlib.c --- ghostscript-9.04~dfsg/base/gxclzlib.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxclzlib.c 2011-11-12 18:29:08.000000000 +0000 @@ -36,12 +36,12 @@ { s_zlib_set_defaults(state); ((stream_zlib_state *)state)->no_wrapper = true; - state->template = &s_zlibE_template; + state->templat = &s_zlibE_template; } void clist_decompressor_init(stream_state *state) { s_zlib_set_defaults(state); ((stream_zlib_state *)state)->no_wrapper = true; - state->template = &s_zlibD_template; + state->templat = &s_zlibD_template; } diff -Nru ghostscript-9.04~dfsg/base/gxcmap.c ghostscript-9.05~dfsg~20120125/base/gxcmap.c --- ghostscript-9.04~dfsg/base/gxcmap.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxcmap.c 2012-01-25 08:44:24.000000000 +0000 @@ -64,8 +64,9 @@ } #endif for (i = 0; i < ncomps; i++) { - color |= (gx_color_index)(cv[i] >> (gx_color_value_bits - comp_bits[i])) - << comp_shift[i]; + COLROUND_VARS; + COLROUND_SETUP(comp_bits[i]); + color |= COLROUND_ROUND(cv[i]) << comp_shift[i]; } return color; @@ -163,7 +164,9 @@ gx_color_index gx_default_gray_fast_encode(gx_device * dev, const gx_color_value cv[]) { - return cv[0] >> (gx_color_value_bits - dev->color_info.depth); + COLROUND_VARS; + COLROUND_SETUP(dev->color_info.depth); + return COLROUND_ROUND(cv[0]); } gx_color_index @@ -736,7 +739,7 @@ { /****** IGNORE alpha ******/ gx_remap_concrete_cmyk(pconc[0], pconc[1], pconc[2], pconc[3], pdc, - pis, dev, select); + pis, dev, select, pcs); return 0; } int @@ -755,7 +758,7 @@ gx_unit_frac(pc->paint.values[1]), gx_unit_frac(pc->paint.values[2]), gx_unit_frac(pc->paint.values[3]), - pdc, pis, dev, select); + pdc, pis, dev, select, pcs); return 0; } @@ -917,12 +920,18 @@ static void cmap_cmyk_direct(frac c, frac m, frac y, frac k, gx_device_color * pdc, - const gs_imager_state * pis, gx_device * dev, gs_color_select_t select) + const gs_imager_state * pis, gx_device * dev, gs_color_select_t select, + const gs_color_space *source_pcs) { int i, ncomps = dev->color_info.num_components; frac cm_comps[GX_DEVICE_COLOR_MAX_COMPONENTS]; gx_color_value cv[GX_DEVICE_COLOR_MAX_COMPONENTS]; gx_color_index color; + int black_index; + cmm_dev_profile_t *dev_profile; + gsicc_colorbuffer_t src_space = gsUNDEFINED; + int code; + bool gray_to_k; /* map to the color model */ for (i=0; i < ncomps; i++) @@ -934,11 +943,30 @@ for (i = 0; i < ncomps; i++) cm_comps[i] = gx_map_color_frac(pis, cm_comps[i], effective_transfer[i]); - else - for (i = 0; i < ncomps; i++) - cm_comps[i] = frac_1 - gx_map_color_frac(pis, - (frac)(frac_1 - cm_comps[i]), effective_transfer[i]); - + else { + /* Check if source space is gray. In this case we are to use only the + transfer function on the K channel. Do this only if gray to K is + also set */ + code = dev_proc(dev, get_profile)(dev, &dev_profile); + gray_to_k = dev_profile->devicegraytok; + if (source_pcs != NULL && source_pcs->cmm_icc_profile_data != NULL) { + src_space = source_pcs->cmm_icc_profile_data->data_cs; + } else if (source_pcs != NULL && source_pcs->icc_equivalent != NULL) { + src_space = source_pcs->icc_equivalent->cmm_icc_profile_data->data_cs; + } + if (src_space == gsGRAY && gray_to_k) { + /* Find the black channel location */ + black_index = dev_proc(dev, get_color_comp_index)(dev, "Black", + strlen("Black"), SEPARATION_NAME); + cm_comps[black_index] = frac_1 - gx_map_color_frac(pis, + (frac)(frac_1 - cm_comps[black_index]), + effective_transfer[black_index]); + } else { + for (i = 0; i < ncomps; i++) + cm_comps[i] = frac_1 - gx_map_color_frac(pis, + (frac)(frac_1 - cm_comps[i]), effective_transfer[i]); + } + } /* We make a test for direct vs. halftoned, rather than */ /* duplicating most of the code of this procedure. */ if (gx_device_must_halftone(dev)) { @@ -1203,13 +1231,12 @@ icc_link = gsicc_get_link_profile(pis, dev, pis->icc_manager->default_rgb, des_profile, &rendering_params, - pis->memory, false, - dev_profile->devicegraytok); + pis->memory, dev_profile->devicegraytok); /* Transform the color */ for (i = 0; i < ncomps; i++) { psrc[i] = cv[i]; } - gscms_transform_color(icc_link, &(psrc[0]), &(psrc_cm[0]), 2, NULL); + (icc_link->procs.map_color)(dev, icc_link, &(psrc[0]), &(psrc_cm[0]), 2); gsicc_release_link(icc_link); for (i = 0; i < ncomps; i++) { cv[i] = psrc_cm[i]; @@ -1270,7 +1297,7 @@ psrc[k] = frac2cv(cm_comps[k]); } icc_link = gsicc_get_link_profile(pis, dev, pis->icc_manager->default_cmyk, - des_profile, &rendering_params, pis->memory, false, + des_profile, &rendering_params, pis->memory, dev_profile->devicegraytok); /* Transform the color */ if (icc_link->is_identity) { @@ -1278,7 +1305,7 @@ } else { /* Transform the color */ psrc_temp = &(psrc_cm[0]); - gscms_transform_color(icc_link, psrc, psrc_temp, 2, NULL); + (icc_link->procs.map_color)(dev, icc_link, psrc, psrc_temp, 2); } /* This needs to be optimized */ for (k = 0; k < 4; k++){ @@ -1573,11 +1600,13 @@ ((uint) gx_color_value_to_byte(cv[1]) << 8) + ((ulong) gx_color_value_to_byte(cv[0]) << 16); else { + COLROUND_VARS; int bpc = dev->color_info.depth / 3; - int drop = sizeof(gx_color_value) * 8 - bpc; - return ( ( (((gx_color_index)cv[0] >> drop) << bpc) + - ((gx_color_index)cv[1] >> drop) ) << bpc) + - ((gx_color_index)cv[2] >> drop); + COLROUND_SETUP(bpc); + + return (((COLROUND_ROUND(cv[0]) << bpc) + + COLROUND_ROUND(cv[1])) << bpc) + + COLROUND_ROUND(cv[2]); } } @@ -1875,9 +1904,7 @@ cmap_transfer_plane(gx_color_value *pconc, const gs_imager_state *pis, gx_device *dev, int plane) { - int ncomps = dev->color_info.num_components; frac frac_value; - int i; frac cv_frac; /* apply the transfer function(s) */ diff -Nru ghostscript-9.04~dfsg/base/gxcmap.h ghostscript-9.05~dfsg~20120125/base/gxcmap.h --- ghostscript-9.04~dfsg/base/gxcmap.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxcmap.h 2011-09-29 11:01:33.000000000 +0000 @@ -20,6 +20,7 @@ #include "gscsel.h" #include "gxfmap.h" +#include "gscspace.h" #ifndef gx_device_DEFINED # define gx_device_DEFINED @@ -40,7 +41,8 @@ gx_device *, gs_color_select_t) #define cmap_proc_cmyk(proc)\ void proc(frac, frac, frac, frac, gx_device_color *,\ - const gs_imager_state *, gx_device *, gs_color_select_t) + const gs_imager_state *, gx_device *, gs_color_select_t,\ + const gs_color_space *) #define cmap_proc_rgb_alpha(proc)\ void proc(frac, frac, frac, frac, gx_device_color *,\ const gs_imager_state *, gx_device *, gs_color_select_t) @@ -143,8 +145,8 @@ ((pis)->cmap_procs->map_gray)(cgray, pdc, pis, dev, select) #define gx_remap_concrete_rgb(cr, cg, cb, pdc, pis, dev, select)\ ((pis)->cmap_procs->map_rgb)(cr, cg, cb, pdc, pis, dev, select) -#define gx_remap_concrete_cmyk(cc, cm, cy, ck, pdc, pis, dev, select)\ - ((pis)->cmap_procs->map_cmyk)(cc, cm, cy, ck, pdc, pis, dev, select) +#define gx_remap_concrete_cmyk(cc, cm, cy, ck, pdc, pis, dev, select, pcs)\ + ((pis)->cmap_procs->map_cmyk)(cc, cm, cy, ck, pdc, pis, dev, select, pcs) #define gx_remap_concrete_rgb_alpha(cr, cg, cb, ca, pdc, pis, dev, select)\ ((pis)->cmap_procs->map_rgb_alpha)(cr, cg, cb, ca, pdc, pis, dev, select) #define gx_remap_concrete_separation(pcc, pdc, pis, dev, select)\ diff -Nru ghostscript-9.04~dfsg/base/gxcolor2.h ghostscript-9.05~dfsg~20120125/base/gxcolor2.h --- ghostscript-9.04~dfsg/base/gxcolor2.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxcolor2.h 2011-11-12 18:29:08.000000000 +0000 @@ -70,7 +70,7 @@ struct gs_pattern1_instance_s { gs_pattern_instance_common; /* must be first */ - gs_pattern1_template_t template; + gs_pattern1_template_t templat; /* Following are created by makepattern */ gs_matrix step_matrix; /* tiling space -> device space */ gs_rect bbox; /* bbox of tile in tiling space */ @@ -78,6 +78,8 @@ bool has_overlap; /* true if step is smaller than bbox size */ /* This is used to detect if we must do */ /* blending if we have transparency */ + bool is_planar; /* During clist writing we "lose" information + about any intervening transparency device */ /* * uses_mask is always true for PostScript patterns, but is false * for bitmap patterns that don't have explicit transparent pixels. diff -Nru ghostscript-9.04~dfsg/base/gxcpath.c ghostscript-9.05~dfsg~20120125/base/gxcpath.c --- ghostscript-9.04~dfsg/base/gxcpath.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxcpath.c 2011-12-08 09:35:23.000000000 +0000 @@ -209,11 +209,14 @@ /* Initialize a stack-allocated clipping path. */ int -gx_cpath_init_local_shared(gx_clip_path * pcpath, const gx_clip_path * shared, - gs_memory_t * mem) +gx_cpath_init_local_shared_nested(gx_clip_path * pcpath, + const gx_clip_path * shared, + gs_memory_t * mem, + bool safely_nested) { if (shared) { - if (shared->path.segments == &shared->path.local_segments) { + if ((shared->path.segments == &shared->path.local_segments) && + !safely_nested) { lprintf1("Attempt to share (local) segments of clip path 0x%lx!\n", (ulong) shared); return_error(gs_error_Fatal); @@ -236,6 +239,13 @@ return 0; } +int +gx_cpath_init_local_shared(gx_clip_path * pcpath, const gx_clip_path * shared, + gs_memory_t * mem) +{ + return gx_cpath_init_local_shared_nested(pcpath, shared, mem, 0); +} + /* Unshare a clipping path. */ int gx_cpath_unshare(gx_clip_path * pcpath) @@ -262,6 +272,9 @@ void gx_cpath_free(gx_clip_path * pcpath, client_name_t cname) { + if (pcpath == 0L) + return; + rc_decrement(pcpath->rect_list, cname); rc_decrement(pcpath->path_list, cname); /* Clean up pointers for GC. */ diff -Nru ghostscript-9.04~dfsg/base/gxcvalue.h ghostscript-9.05~dfsg~20120125/base/gxcvalue.h --- ghostscript-9.04~dfsg/base/gxcvalue.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxcvalue.h 2011-11-12 18:29:08.000000000 +0000 @@ -25,8 +25,10 @@ /* ...bits must lie between 8 and 16. */ #define gx_color_value_bits (sizeof(gx_color_value) * 8) #define gx_max_color_value ((gx_color_value)((1L << gx_color_value_bits) - 1)) + +/* See the comments below on why this is no longer a simple truncation */ #define gx_color_value_to_byte(cv)\ - ((cv) >> (gx_color_value_bits - 8)) + ((gx_color_value)((((unsigned int)cv)*0xFF01 + 0x800000)>>24)) #define gx_color_value_from_byte(cb)\ (((cb) << (gx_color_value_bits - 8)) + ((cb) >> (16 - gx_color_value_bits))) @@ -34,4 +36,59 @@ #define frac2cv(fr) frac2ushort(fr) #define cv2frac(cv) ushort2frac(cv) +/* At various points in the code (particularly inside encode_color and + * decode_color functions), we need to convert colour values between + * different bitdepths. + * + * A typical example is where we have an 8 bit color value (0xab say) + * which we need to expand to be a 16 bit color value. In order to + * fill the range without biasing, we 'duplicate' the top bits down + * (so giving 0xabab rather than just 0xab00). + * + * Traditionally, when converting to smaller numbers, we have simply + * truncated (so 0xabcd => 0xab), but this doesn't actually give us the + * best results possible consider for example truncating 0x0081 - this + * would give 0x00, which when converted back to 16 bits later would give + * 0x0000, a difference of 0x81. If instead we converted 0x0081 to 0x01, + * when that got converted back it would go to be 0x0101, a difference of + * 0x80. + * + * This disparity first came to light in bug 690538; lcms returns 16 bit + * colors that we use for lineart, but returns image data in 8 bits. At the + * time of the bug, gs would convert the 16 bit lineart colors to 8 bit + * via simple truncation to plot them in the device, resulting in being + * off by 1 to the image colors. + * + * We therefore adopt lcms's rounding scheme here. To convert from 16 to 8 + * bit, lcms does: col8 = (col16 * 0xFF01 + 0x800000)>>24 (all unsigned ints) + * + * Unfortunately we do not have the luxury of only working in 16 or 8 bits + * so we generalise that to convert from FROM to TO bits as follows: + * + * M = (((1<>S + * + * We express this operation in macros here so it can be reused in many + * places in the code while keeping the complexity in one place. + */ +#define COLROUND_VARS unsigned int COLROUND_M, COLROUND_S, COLROUND_R +#define COLROUND_SETUP(TO) \ + do { COLROUND_M = (((1<>COLROUND_S)) + +#define COLDUP_VARS unsigned int COLDUP_M, COLDUP_S +#define COLDUP_MULTS_STRING "\x00\x00\xFF\xFF\x55\x55\x92\x49\x11\x11\x84\x21\x10\x41\x40\x81\x01\x01\x02\x01\x04\x01\x08\x01\x10\x01\x20\x01\x40\x01\x80\x01" +#define COLDUP_SETUP(FROM) \ + do { COLDUP_M = (((unsigned char)COLDUP_MULTS_STRING[2*FROM])<<8)|\ + (unsigned char)COLDUP_MULTS_STRING[2*FROM+1]; \ + COLDUP_S = (FROM-(gx_color_value_bits % FROM)) % FROM; \ + } while (0 == 1) +#define COLDUP_DUP(X) \ + ((gx_color_value)(((unsigned int)X) * COLDUP_M)>>COLDUP_S) #endif /* gxcvalue_INCLUDED */ diff -Nru ghostscript-9.04~dfsg/base/gxdcolor.c ghostscript-9.05~dfsg~20120125/base/gxdcolor.c --- ghostscript-9.04~dfsg/base/gxdcolor.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxdcolor.c 2011-11-21 08:55:19.000000000 +0000 @@ -182,7 +182,6 @@ gx_dc_type_pattern, /* patterns */ gx_dc_type_ht_binary, /* binary halftone device colors */ gx_dc_type_ht_colored, /* general halftone device colors */ - gx_dc_type_wts /* well-tempered screen device colors */ }; int @@ -281,7 +280,7 @@ const gx_device_color * pdevc, /* ignored */ const gx_device_color_saved * psdc, /* ignored */ const gx_device * dev, /* ignored */ - uint offset, /* ignored */ + int64_t offset, /* ignored */ byte * data, /* ignored */ uint * psize ) { @@ -295,7 +294,7 @@ const gs_imager_state * pis, /* ignored */ const gx_device_color * prior_devc, /* ignored */ const gx_device * dev, /* ignored */ - uint offset, /* ignored */ + int64_t offset, /* ignored */ const byte * pdata, /* ignored */ uint size, /* ignored */ gs_memory_t * mem ) /* ignored */ @@ -309,7 +308,7 @@ const gx_device_color * pdevc, /* ignored */ const gx_device_color_saved * psdc, /* ignored */ const gx_device * dev, /* ignored */ - uint offset, /* ignored */ + int64_t offset, /* ignored */ byte * data, /* ignored */ uint * psize ) { @@ -322,7 +321,7 @@ const gs_imager_state * pis, /* ignored */ const gx_device_color * prior_devc, /* ignored */ const gx_device * dev, /* ignored */ - uint offset, /* ignored */ + int64_t offset, /* ignored */ const byte * pdata, /* ignored */ uint size, /* ignored */ gs_memory_t * mem ) /* ignored */ @@ -378,7 +377,7 @@ const gs_imager_state * pis, /* ignored */ const gx_device_color * prior_devc, /* ignored */ const gx_device * dev, /* ignored */ - uint offset, /* ignored */ + int64_t offset, /* ignored */ const byte * pdata, /* ignored */ uint size, /* ignored */ gs_memory_t * mem ) /* ignored */ @@ -420,10 +419,16 @@ colors[0] = colors[1] = pdevc->colors.pure; if (source == NULL) set_rop_no_source(source, no_source, dev); - return (*dev_proc(dev, strip_copy_rop)) - (dev, source->sdata, source->sourcex, source->sraster, - source->id, (source->use_scolors ? source->scolors : NULL), - NULL /*arbitrary */ , colors, x, y, w, h, 0, 0, lop); + if (source->planar_height == 0) + return (*dev_proc(dev, strip_copy_rop)) + (dev, source->sdata, source->sourcex, source->sraster, + source->id, (source->use_scolors ? source->scolors : NULL), + NULL /*arbitrary */ , colors, x, y, w, h, 0, 0, lop); + else + return (*dev_proc(dev, strip_copy_rop2)) + (dev, source->sdata, source->sourcex, source->sraster, + source->id, (source->use_scolors ? source->scolors : NULL), + NULL /*arbitrary */ , colors, x, y, w, h, 0, 0, lop, source->planar_height); } } @@ -505,7 +510,7 @@ const gx_device_color * pdevc, const gx_device_color_saved * psdc, /* ignored */ const gx_device * dev, - uint offset, /* ignored */ + int64_t offset, /* ignored */ byte * pdata, uint * psize ) { @@ -553,7 +558,7 @@ const gs_imager_state * pis, /* ignored */ const gx_device_color * prior_devc, /* ignored */ const gx_device * dev, - uint offset, /* ignored */ + int64_t offset, /* ignored */ const byte * pdata, uint size, gs_memory_t * mem ) /* ignored */ diff -Nru ghostscript-9.04~dfsg/base/gxdcolor.h ghostscript-9.05~dfsg~20120125/base/gxdcolor.h --- ghostscript-9.04~dfsg/base/gxdcolor.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxdcolor.h 2011-11-21 08:55:19.000000000 +0000 @@ -21,6 +21,7 @@ #include "gsdcolor.h" #include "gsropt.h" #include "gsstruct.h" /* for extern_st, GC procs */ +#include "stdint_.h" /* for int64_t */ /* Define opaque types. */ @@ -43,6 +44,7 @@ uint sraster; gx_bitmap_id id; gx_color_index scolors[2]; + uint planar_height; bool use_scolors; } gx_rop_source_t; @@ -52,7 +54,7 @@ * a different null source if necessary. */ #define gx_rop_no_source_body(black_pixel)\ - NULL, 0, 0, gx_no_bitmap_id, {black_pixel, black_pixel}, true + NULL, 0, 0, gx_no_bitmap_id, {black_pixel, black_pixel}, 0, true #define gx_rop_source_set_color(prs, pixel)\ ((prs)->scolors[0] = (prs)->scolors[1] = (pixel)) void gx_set_rop_no_source(const gx_rop_source_t **psource, @@ -215,12 +217,12 @@ */ #define dev_color_proc_write(proc)\ int proc(const gx_device_color *pdevc, const gx_device_color_saved *psdc,\ - const gx_device * dev, uint offset, byte *data, uint *psize) + const gx_device * dev, int64_t offset, byte *data, uint *psize) dev_color_proc_write((*write)); #define dev_color_proc_read(proc)\ int proc(gx_device_color *pdevc, const gs_imager_state * pis,\ - const gx_device_color *prior_devc, const gx_device * dev, uint offset,\ + const gx_device_color *prior_devc, const gx_device * dev, int64_t offset,\ const byte *data, uint size, gs_memory_t *mem) dev_color_proc_read((*read)); @@ -272,9 +274,7 @@ #define gx_dc_type_ht_binary (&gx_dc_type_data_ht_binary) gx_dc_type_data_ht_binary, /* gxht.c */ #define gx_dc_type_ht_colored (&gx_dc_type_data_ht_colored) - gx_dc_type_data_ht_colored, /* gxcht.c */ -#define gx_dc_type_wts (&gx_dc_type_data_wts) - gx_dc_type_data_wts; /* gxwts.c */ + gx_dc_type_data_ht_colored; /* gxcht.c */ /* the following are exported for the benefit of gsptype1.c */ extern dev_color_proc_get_nonzero_comps(gx_dc_pure_get_nonzero_comps); @@ -300,10 +300,8 @@ int gx_remap_color(gs_state *); #define gx_set_dev_color(pgs)\ - if ( !color_is_set(gs_currentdevicecolor_inline(pgs)) )\ - { int code_dc = gx_remap_color(pgs);\ - if ( code_dc != 0 ) return code_dc;\ - } + color_is_set(gs_currentdevicecolor_inline(pgs)) ? 0 :\ + gx_remap_color(pgs); /* Indicate that the device color needs remapping. */ #define gx_unset_dev_color(pgs)\ diff -Nru ghostscript-9.04~dfsg/base/gxdevcli.h ghostscript-9.05~dfsg~20120125/base/gxdevcli.h --- ghostscript-9.04~dfsg/base/gxdevcli.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxdevcli.h 2011-11-21 08:55:19.000000000 +0000 @@ -722,7 +722,7 @@ bool UseCIEColor; /* for PS LL3 */\ bool LockSafetyParams; /* If true, prevent unsafe changes */\ long band_offset_x; /* offsets of clist band base to (mem device) buffer */\ - long band_offset_y; /* for rendering that is phase sensitive (wtsimdi) */\ + long band_offset_y; /* for rendering that is phase sensitive (old wtsimdi) */\ gx_stroked_gradient_recognizer_t sgr;\ int MaxPatternBitmap; /* Threshold for switching to pattern_clist mode */\ cmm_dev_profile_t *icc_struct; /* object dependent profiles */\ @@ -1421,12 +1421,12 @@ #define dev_proc_dev_spec_op(proc)\ dev_t_proc_dev_spec_op(proc, gx_device) -#define dev_t_proc_copy_plane(proc, dev_t)\ +#define dev_t_proc_copy_planes(proc, dev_t)\ int proc(dev_t *dev,\ const byte *data, int data_x, int raster, gx_bitmap_id id,\ - int x, int y, int width, int height, int plane) -#define dev_proc_copy_plane(proc)\ - dev_t_proc_copy_plane(proc, gx_device) + int x, int y, int width, int height, int plane_height) +#define dev_proc_copy_planes(proc)\ + dev_t_proc_copy_planes(proc, gx_device) #define dev_t_proc_get_profile(proc, dev_t)\ int proc(dev_t *dev, cmm_dev_profile_t **dev_profile) @@ -1438,6 +1438,17 @@ #define dev_proc_set_graphics_type_tag(proc)\ dev_t_proc_set_graphics_type_tag(proc, gx_device) +#define dev_t_proc_strip_copy_rop2(proc, dev_t)\ + int proc(dev_t *dev,\ + const byte *sdata, int sourcex, uint sraster, gx_bitmap_id id,\ + const gx_color_index *scolors,\ + const gx_strip_bitmap *textures, const gx_color_index *tcolors,\ + int x, int y, int width, int height,\ + int phase_x, int phase_y, gs_logical_operation_t lop,\ + uint planar_height) +#define dev_proc_strip_copy_rop2(proc)\ + dev_t_proc_strip_copy_rop2(proc, gx_device) + /* Define the device procedure vector template proper. */ #define gx_device_proc_struct(dev_t)\ @@ -1507,9 +1518,10 @@ dev_t_proc_pop_transparency_state((*pop_transparency_state), dev_t); \ dev_t_proc_put_image((*put_image), dev_t); \ dev_t_proc_dev_spec_op((*dev_spec_op), dev_t); \ - dev_t_proc_copy_plane((*copy_plane), dev_t); \ + dev_t_proc_copy_planes((*copy_planes), dev_t); \ dev_t_proc_get_profile((*get_profile), dev_t); \ dev_t_proc_set_graphics_type_tag((*set_graphics_type_tag), dev_t); \ + dev_t_proc_strip_copy_rop2((*strip_copy_rop2), dev_t);\ } /* diff -Nru ghostscript-9.04~dfsg/base/gxdevice.h ghostscript-9.05~dfsg~20120125/base/gxdevice.h --- ghostscript-9.04~dfsg/base/gxdevice.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxdevice.h 2012-01-25 08:44:24.000000000 +0000 @@ -280,6 +280,7 @@ dev_proc_fillpage(gx_default_fillpage); dev_proc_get_profile(gx_default_get_profile); dev_proc_set_graphics_type_tag(gx_default_set_graphics_type_tag); +dev_proc_strip_copy_rop2(gx_default_strip_copy_rop2); /* BACKWARD COMPATIBILITY */ #define gx_non_imaging_create_compositor gx_null_create_compositor @@ -366,6 +367,7 @@ dev_proc_create_compositor(gx_forward_create_compositor); dev_proc_get_profile(gx_forward_get_profile); dev_proc_set_graphics_type_tag(gx_forward_set_graphics_type_tag); +dev_proc_strip_copy_rop2(gx_forward_strip_copy_rop2); /* ---------------- Implementation utilities ---------------- */ @@ -433,6 +435,11 @@ uint len, gs_memory_t *memory); /* + * Returns true if the outputfile requests separate pages (contains %d) + */ +bool gx_outputfile_is_separate_pages(const char *fname, gs_memory_t *memory); + +/* * Open the output file for a device. Note that if the file name is empty, * it may be replaced with the name of a scratch file. */ diff -Nru ghostscript-9.04~dfsg/base/gxdevndi.c ghostscript-9.05~dfsg~20120125/base/gxdevndi.c --- ghostscript-9.04~dfsg/base/gxdevndi.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxdevndi.c 2011-11-21 08:55:19.000000000 +0000 @@ -21,7 +21,6 @@ #include "gxdither.h" #include "gzht.h" #include "gxfrac.h" -#include "gxwts.h" /* * Binary halftoning algorithms. @@ -75,53 +74,6 @@ q0, q1, q2, q3, q4, q5, q6, q7 }; -/* Begin code for setting up WTS device color. This should probably - move into its own module. */ - -/** - * gx_render_device_DevN_wts: Render DeviceN color by halftoning with WTS. - * - * This routine is the primary constructor for WTS device colors. - * Note that, in the WTS code path, we sample the plane_vector array - * during device color construction, while in the legacy code path, - * it is sampled in the set_ht_colors procedure, invoked from - * fill_rectangle. Does it affect correctness? I don't think so, but - * it needs to be tested. - **/ -static int -gx_render_device_DeviceN_wts(frac * pcolor, - gx_device_color * pdevc, gx_device * dev, - gx_device_halftone * pdht, - const gs_int_point * ht_phase) -{ - int i; - gx_color_value cv[GX_DEVICE_COLOR_MAX_COMPONENTS]; - int num_comp = pdht->num_comp; - - for (i = 0; i < num_comp; i++) { - cv[i] = 0; - } - - pdevc->type = gx_dc_type_wts; - pdevc->colors.wts.w_ht = pdht; - - if (dev->color_info.separable_and_linear != GX_CINFO_SEP_LIN) { - /* Monochrome case may be inverted. */ - pdevc->colors.wts.plane_vector[1] = - dev_proc(dev, encode_color)(dev, cv); - } - for (i = 0; i < num_comp; i++) { - pdevc->colors.wts.levels[i] = pcolor[i]; - cv[i] = gx_max_color_value; - pdevc->colors.wts.plane_vector[i] = - dev_proc(dev, encode_color)(dev, cv); - cv[i] = 0; - } - pdevc->colors.wts.num_components = num_comp; - pdevc->phase = *ht_phase; - return 0; -} - /* * Render DeviceN possibly by halftoning. * pcolors = pointer to an array color values (as fracs) @@ -146,10 +98,6 @@ int num_colors = dev->color_info.num_components; uint l_color[GS_CLIENT_COLOR_MAX_COMPONENTS]; - if (pdht && pdht->components && pdht->components[0].corder.wts) - return gx_render_device_DeviceN_wts(pcolor, pdevc, dev, pdht, - ht_phase); - for (i=0; icolor_info.gray_index == i) ? dev->color_info.dither_grays - 1 : diff -Nru ghostscript-9.04~dfsg/base/gxdht.h ghostscript-9.05~dfsg~20120125/base/gxdht.h --- ghostscript-9.04~dfsg/base/gxdht.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxdht.h 2011-11-21 08:55:19.000000000 +0000 @@ -120,16 +120,6 @@ /* The following awkward expression avoids integer overflow. */ #define max_ht_sample (ht_sample_t)(((1 << (ht_mask_bits - 2)) - 1) * 2 + 1) -#ifndef wts_screen_t_DEFINED -# define wts_screen_t_DEFINED -typedef struct wts_screen_s wts_screen_t; -#endif - -#ifndef gs_wts_screen_enum_t_DEFINED -# define gs_wts_screen_enum_t_DEFINED -typedef struct gs_wts_screen_enum_s gs_wts_screen_enum_t; -#endif - /* * Define the internal representation of a halftone order. * Note that it may include a cached transfer function. @@ -213,8 +203,6 @@ } gx_ht_order_screen_params_t; struct gx_ht_order_s { gx_ht_cell_params_t params; /* parameters defining the cells */ - gs_wts_screen_enum_t *wse; - wts_screen_t *wts; /* if non-NULL, then rest of the structure is irrelevant */ ushort width; ushort height; ushort raster; diff -Nru ghostscript-9.04~dfsg/base/gxdhtserial.c ghostscript-9.05~dfsg~20120125/base/gxdhtserial.c --- ghostscript-9.04~dfsg/base/gxdhtserial.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxdhtserial.c 2011-11-21 08:55:19.000000000 +0000 @@ -23,7 +23,6 @@ #include "gzstate.h" #include "gxdevice.h" /* for gzht.h */ #include "gzht.h" -#include "gswts.h" #include "gxdhtres.h" #include "gsserial.h" #include "gxdhtserial.h" @@ -47,12 +46,6 @@ gx_ht_tf_complete } gx_ht_tf_type_t; -/* enumeration to distinguish well-tempered screening orders from others */ -typedef enum { - gx_ht_traditional, - gx_ht_wts -} gx_ht_order_type_t; - /* * Serialize a transfer function. These will occupy one byte if they are * not present or provide an identity mapping, @@ -146,33 +139,6 @@ } } -static int -gx_ht_write_component_wts(const wts_screen_t *wts, byte *data, uint *psize) -{ - uint hdr_size = wts_size(wts); - uint cell_nsamples = wts->cell_width * wts->cell_height; - uint cell_size = cell_nsamples * sizeof(wts_screen_sample_t); - uint req_size = 1 + hdr_size + cell_size; - - if (req_size > *psize) { - *psize = req_size; - return gs_error_rangecheck; - } - - /* identify this as a wts halftone. */ - *data++ = (byte)gx_ht_wts; - - /* copy in wts header */ - memcpy(data, wts, hdr_size); - ((wts_screen_t *)data)->samples = NULL; - data += hdr_size; - - /* copy in treshold cell */ - memcpy(data, wts->samples, cell_size); - *psize = req_size; - return 0; -} - /* * Serialize a halftone component. The only part that is serialized is the * halftone order; the other two components are only required during @@ -210,20 +176,13 @@ * get the information from their color models). * * This leaves the order itself. - * - * Check if we are a well-tempered-screening order. Serialization of these - * is handled in a separate function. */ - if (porder->wts != 0) - return gx_ht_write_component_wts(porder->wts, data, psize); /* * The following order fields are not transmitted: * * params Only required during halftone cell construction * - * wse, wts Only used for well-tempered screens (see above) - * * raster Can be re-calculated by the renderer from the width * * orig_height, The only potential use for these parameters is in @@ -246,8 +205,7 @@ */ levels_size = porder->num_levels * sizeof(porder->levels[0]); bits_size = porder->num_bits * porder->procs->bit_data_elt_size; - req_size = 1 /* gx_ht_type_t */ - + enc_u_sizew(porder->width) + req_size = enc_u_sizew(porder->width) + enc_u_sizew(porder->height) + enc_u_sizew(porder->shift) + enc_u_sizew(porder->num_levels) @@ -264,9 +222,6 @@ return gs_error_rangecheck; } - /* identify this as a traditional halftone */ - *data++ = (byte)gx_ht_traditional; - /* write out the dimensional data */ enc_u_putw(porder->width, data); enc_u_putw(porder->height, data); @@ -290,29 +245,6 @@ return code; } -static int -gx_ht_read_component_wts(gx_ht_order_component *pcomp, - const byte *data, uint size, - gs_memory_t *mem) -{ - const wts_screen_t *ws = (const wts_screen_t *)data; - int hdr_size = wts_size(ws); - int cell_size = ws->cell_width * ws->cell_height * - sizeof(wts_screen_sample_t); - int bufsize = 1+hdr_size+cell_size; - - memset(&pcomp->corder, 0, sizeof(pcomp->corder)); - - if (size < bufsize) - return -1; - pcomp->corder.wts = gs_wts_from_buf(data, bufsize); - pcomp->cname = 0; - if (pcomp->corder.wts == NULL) - return -1; - - return bufsize; -} - /* * Reconstruct a halftone component from its serial representation. The * buffer provided is expected to be large enough to hold the entire @@ -337,19 +269,12 @@ gx_ht_order new_order; const byte * data0 = data; const byte * data_lim = data + size; - gx_ht_order_type_t order_type; int i, code, levels_size, bits_size; const gx_dht_proc * phtrp = gx_device_halftone_list; /* check the order type */ if (size == 0) return_error(gs_error_rangecheck); - --size; - order_type = (gx_ht_order_type_t)*data++; - - /* currently only the traditional halftone order are supported */ - if (order_type != gx_ht_traditional) - return gx_ht_read_component_wts(pcomp, data, size, mem); /* * For performance reasons, the number encoding macros do not @@ -386,8 +311,6 @@ * and allocates the levels and bit data arrays. In particular, it * sets all of the following fields: * - * wse = 0, - * wts = 0, * width = operand width * height = operand height * raster = bitmap_raster(operand width) diff -Nru ghostscript-9.04~dfsg/base/gxdownscale.c ghostscript-9.05~dfsg~20120125/base/gxdownscale.c --- ghostscript-9.04~dfsg/base/gxdownscale.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxdownscale.c 2011-09-29 11:01:33.000000000 +0000 @@ -13,7 +13,6 @@ #include "gxdownscale.h" #include "gserrors.h" -#include "gserror.h" #include "gdevprn.h" /* Error diffusion data is stored in errors block. @@ -740,7 +739,7 @@ int code; gx_downscale_core *core; - if (adjust_width != NULL) + if (adjust_width_proc != NULL) awidth = (*adjust_width_proc)(width, adjust_width); pad_white = awidth - width; if (pad_white < 0) diff -Nru ghostscript-9.04~dfsg/base/gxfcid.h ghostscript-9.05~dfsg~20120125/base/gxfcid.h --- ghostscript-9.04~dfsg/base/gxfcid.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxfcid.h 2011-11-12 18:29:08.000000000 +0000 @@ -32,6 +32,7 @@ typedef struct gs_font_cid_data_s { gs_cid_system_info_t CIDSystemInfo; int CIDCount; + int MaxCID; /* For font with GlyphDirectory highest CID != CIDCount. */ int GDBytes; /* optional, for standard glyph_data */ /*int PaintType;*/ /*float StrokeWidth;*/ diff -Nru ghostscript-9.04~dfsg/base/gxfcopy.c ghostscript-9.05~dfsg~20120125/base/gxfcopy.c --- ghostscript-9.04~dfsg/base/gxfcopy.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxfcopy.c 2012-01-07 20:18:22.000000000 +0000 @@ -809,7 +809,7 @@ return_error(gs_error_rangecheck); /* abnormal glyph recursion */ if (info0.num_pieces > countof(pieces0) / 2) { pieces = (gs_glyph *)gs_alloc_bytes(cfont->memory, - sizeof(glyphs) * info0.num_pieces * 2, "compare_glyphs"); + sizeof(gs_glyph) * info0.num_pieces * 2, "compare_glyphs"); if (pieces == 0) return_error(gs_error_VMerror); } @@ -2004,7 +2004,13 @@ break; case ft_CID_encrypted: procs = &copied_procs_cid0; - glyphs_size = ((gs_font_cid0 *)font)->cidata.common.CIDCount; + /* We used to use the CIDCount here, but for CIDFonts with a GlyphDirectory + * (dictionary form) the number of CIDs is not the same as the highest CID. + * Because we use the CID as the slot, we need to assign the highest possible + * CID, not the number of CIDs. Don't forget to add one because CIDs + * count from 0. + */ + glyphs_size = ((gs_font_cid0 *)font)->cidata.common.MaxCID + 1; break; case ft_CID_TrueType: procs = &copied_procs_cid2; @@ -2168,6 +2174,20 @@ (options & ~COPY_GLYPH_NO_OLD) | COPY_GLYPH_BY_INDEX); if (code < 0) return code; + /* if code > 0 then we already have the glyph, so no need to process further. + * If the original glyph was not a CID then we are copying by name, not by index. + * But the copy above copies by index which means we don't have an entry for + * the glyp-h component in the name table. If we are using names then we + * absolutely *must* have an entry in the name table, so go ahead and add + * one here. Note that the array returned by psf_add_subset_pieces has the + * GIDs with an offset of GS_MIN_GLYPH_INDEX added. + */ + if (code == 0 && glyph < GS_MIN_CID_GLYPH && glyphs[i] > GS_MIN_GLYPH_INDEX) { + code = copy_glyph_name(font, glyphs[i] - GS_MIN_GLYPH_INDEX, copied, + glyphs[i]); + if (code < 0) + return code; + } } /* * Because 'seac' accesses the Encoding of the font as well as the diff -Nru ghostscript-9.04~dfsg/base/gxfill.c ghostscript-9.05~dfsg~20120125/base/gxfill.c --- ghostscript-9.04~dfsg/base/gxfill.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxfill.c 2011-12-08 09:35:23.000000000 +0000 @@ -590,7 +590,7 @@ gs_imager_state *pis_noconst = (gs_imager_state *)pis; /* Break const. */ if (ppath != NULL) { - code = gx_cpath_init_local_shared(&cpath_intersection, pcpath, pdev->memory); + code = gx_cpath_init_local_shared_nested(&cpath_intersection, pcpath, pdev->memory, 1); if (code < 0) return code; if (pcpath == NULL) { diff -Nru ghostscript-9.04~dfsg/base/gx.h ghostscript-9.05~dfsg~20120125/base/gx.h --- ghostscript-9.04~dfsg/base/gx.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gx.h 2011-09-29 11:01:33.000000000 +0000 @@ -18,7 +18,7 @@ # define gx_INCLUDED #include "stdio_.h" /* includes std.h */ -#include "gserror.h" +#include "gserrors.h" #include "gsio.h" #include "gstypes.h" #include "gsmemory.h" diff -Nru ghostscript-9.04~dfsg/base/gxhintn1.c ghostscript-9.05~dfsg~20120125/base/gxhintn1.c --- ghostscript-9.04~dfsg/base/gxhintn1.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxhintn1.c 2011-11-12 18:29:08.000000000 +0000 @@ -39,10 +39,10 @@ 3*((double)p1y*p2x + (double)p1y*p3x + 2.0*p2y*p3x - 2.0*p2x*p3y - (double)p1x*(p2y + p3y)))/10; } -static void t1_hinter__reverse_contour(t1_hinter * this, int c) +static void t1_hinter__reverse_contour(t1_hinter * self, int c) { - int b = this->contour[c]; - int e = this->contour[c + 1] - 1; /* Skip 'close'. */ + int b = self->contour[c]; + int e = self->contour[c + 1] - 1; /* Skip 'close'. */ int e2 = (b + e + 1) / 2; int i; t1_pole p; @@ -51,9 +51,9 @@ for (i = b + 1; i < e2; i++) { int j = e - (i - b); - p = this->pole[i]; - this->pole[i] = this->pole[j]; - this->pole[j] = p; + p = self->pole[i]; + self->pole[i] = self->pole[j]; + self->pole[j] = p; } } @@ -137,23 +137,23 @@ return curve_winding_angle_rec(k, x0, y0, x1, y1, x2, y2, x3, y3); } -static int t1_hinter__is_inside(t1_hinter * this, t1_glyph_space_coord gx, t1_glyph_space_coord gy, int c) +static int t1_hinter__is_inside(t1_hinter * self, t1_glyph_space_coord gx, t1_glyph_space_coord gy, int c) { - int b = this->contour[c]; - int e = this->contour[c + 1] - 1; + int b = self->contour[c]; + int e = self->contour[c + 1] - 1; double a = 0, A; int i; for (i = b; i < e;) { - if (this->pole[i + 1].type != offcurve) { /* line or close. */ - A = bar_winding_angle(this->pole[i + 0].gx - gx, this->pole[i + 0].gy - gy, - this->pole[i + 1].gx - gx, this->pole[i + 1].gy - gy); + if (self->pole[i + 1].type != offcurve) { /* line or close. */ + A = bar_winding_angle(self->pole[i + 0].gx - gx, self->pole[i + 0].gy - gy, + self->pole[i + 1].gx - gx, self->pole[i + 1].gy - gy); i++; } else { - A = curve_winding_angle(this->pole[i + 0].gx - gx, this->pole[i + 0].gy - gy, - this->pole[i + 1].gx - gx, this->pole[i + 1].gy - gy, - this->pole[i + 2].gx - gx, this->pole[i + 2].gy - gy, - this->pole[i + 3].gx - gx, this->pole[i + 3].gy - gy); + A = curve_winding_angle(self->pole[i + 0].gx - gx, self->pole[i + 0].gy - gy, + self->pole[i + 1].gx - gx, self->pole[i + 1].gy - gy, + self->pole[i + 2].gx - gx, self->pole[i + 2].gy - gy, + self->pole[i + 3].gx - gx, self->pole[i + 3].gy - gy); i += 3; } if (A == CONTACT_SIGNAL) @@ -219,16 +219,16 @@ } static inline bool -t1_hinter__intersect_bar_bar(t1_hinter * this, int i, int j) +t1_hinter__intersect_bar_bar(t1_hinter * self, int i, int j) { - fixed q0x = this->pole[i + 0].gx; - fixed q0y = this->pole[i + 0].gy; - fixed q1x = this->pole[i + 1].gx; - fixed q1y = this->pole[i + 1].gy; - fixed q2x = this->pole[j + 0].gx; - fixed q2y = this->pole[j + 0].gy; - fixed q3x = this->pole[j + 1].gx; - fixed q3y = this->pole[j + 1].gy; + fixed q0x = self->pole[i + 0].gx; + fixed q0y = self->pole[i + 0].gy; + fixed q1x = self->pole[i + 1].gx; + fixed q1y = self->pole[i + 1].gy; + fixed q2x = self->pole[j + 0].gx; + fixed q2y = self->pole[j + 0].gy; + fixed q3x = self->pole[j + 1].gx; + fixed q3y = self->pole[j + 1].gy; return intersect_bar_bar(q0x, q0y, q1x, q1y, q2x, q2y, q3x, q3y); } @@ -326,20 +326,20 @@ return m; } -static bool t1_hinter__intersect_curve_bar(t1_hinter * this, int i, int j) +static bool t1_hinter__intersect_curve_bar(t1_hinter * self, int i, int j) { - fixed X0 = this->pole[j].gx; - fixed Y0 = this->pole[j].gy; - fixed X1 = this->pole[j + 1].gx - X0; - fixed Y1 = this->pole[j + 1].gy - Y0; - fixed x0 = this->pole[i].gx - X0; - fixed y0 = this->pole[i].gy - Y0; - fixed x1 = this->pole[i + 1].gx - X0; - fixed y1 = this->pole[i + 1].gy - Y0; - fixed x2 = this->pole[i + 2].gx - X0; - fixed y2 = this->pole[i + 2].gy - Y0; - fixed x3 = this->pole[i + 3].gx - X0; - fixed y3 = this->pole[i + 3].gy - Y0; + fixed X0 = self->pole[j].gx; + fixed Y0 = self->pole[j].gy; + fixed X1 = self->pole[j + 1].gx - X0; + fixed Y1 = self->pole[j + 1].gy - Y0; + fixed x0 = self->pole[i].gx - X0; + fixed y0 = self->pole[i].gy - Y0; + fixed x1 = self->pole[i + 1].gx - X0; + fixed y1 = self->pole[i + 1].gy - Y0; + fixed x2 = self->pole[i + 2].gx - X0; + fixed y2 = self->pole[i + 2].gy - Y0; + fixed x3 = self->pole[i + 3].gx - X0; + fixed y3 = self->pole[i + 3].gy - Y0; int k = curve_log2_samples(0, 0, x1, y1, x2, y2, x3, y3); int m = bar_samples(X1, Y1); @@ -456,24 +456,24 @@ return false; } -static bool t1_hinter__intersect_curve_curve(t1_hinter * this, int i, int j) +static bool t1_hinter__intersect_curve_curve(t1_hinter * self, int i, int j) { - fixed ax0 = this->pole[i].gx; - fixed ay0 = this->pole[i].gy; - fixed ax1 = this->pole[i + 1].gx; - fixed ay1 = this->pole[i + 1].gy; - fixed ax2 = this->pole[i + 2].gx; - fixed ay2 = this->pole[i + 2].gy; - fixed ax3 = this->pole[i + 3].gx; - fixed ay3 = this->pole[i + 3].gy; - fixed bx0 = this->pole[j].gx; - fixed by0 = this->pole[j].gy; - fixed bx1 = this->pole[j + 1].gx; - fixed by1 = this->pole[j + 1].gy; - fixed bx2 = this->pole[j + 2].gx; - fixed by2 = this->pole[j + 2].gy; - fixed bx3 = this->pole[j + 3].gx; - fixed by3 = this->pole[j + 3].gy; + fixed ax0 = self->pole[i].gx; + fixed ay0 = self->pole[i].gy; + fixed ax1 = self->pole[i + 1].gx; + fixed ay1 = self->pole[i + 1].gy; + fixed ax2 = self->pole[i + 2].gx; + fixed ay2 = self->pole[i + 2].gy; + fixed ax3 = self->pole[i + 3].gx; + fixed ay3 = self->pole[i + 3].gy; + fixed bx0 = self->pole[j].gx; + fixed by0 = self->pole[j].gy; + fixed bx1 = self->pole[j + 1].gx; + fixed by1 = self->pole[j + 1].gy; + fixed bx2 = self->pole[j + 2].gx; + fixed by2 = self->pole[j + 2].gy; + fixed bx3 = self->pole[j + 3].gx; + fixed by3 = self->pole[j + 3].gy; int ka = curve_log2_samples(ax0, ay0, ax1, ay1, ax2, ay2, ax3, ay3); int kb = curve_log2_samples(bx0, by0, bx1, by1, bx2, by2, bx3, by3); @@ -482,23 +482,23 @@ bx0, by0, bx1, by1, bx2, by2, bx3, by3); } -static bool t1_hinter__contour_intersection(t1_hinter * this, int c0, int c1) +static bool t1_hinter__contour_intersection(t1_hinter * self, int c0, int c1) { - int b0 = this->contour[c0]; - int e0 = this->contour[c0 + 1] - 1; - int b1 = this->contour[c1]; - int e1 = this->contour[c1 + 1] - 1; + int b0 = self->contour[c0]; + int e0 = self->contour[c0 + 1] - 1; + int b1 = self->contour[c1]; + int e1 = self->contour[c1 + 1] - 1; int i, j; for (i = b0; i < e0;) { - if (this->pole[i + 1].type != offcurve) { /* line or close. */ + if (self->pole[i + 1].type != offcurve) { /* line or close. */ for (j = b1; j < e1;) { - if (this->pole[j + 1].type != offcurve) { /* line or close. */ - if (t1_hinter__intersect_bar_bar(this, i, j)) + if (self->pole[j + 1].type != offcurve) { /* line or close. */ + if (t1_hinter__intersect_bar_bar(self, i, j)) return true; j++; } else { - if (t1_hinter__intersect_curve_bar(this, j, i)) + if (t1_hinter__intersect_curve_bar(self, j, i)) return true; j += 3; } @@ -506,12 +506,12 @@ i++; } else { for (j = b1; j < e1;) { - if (this->pole[j + 1].type != offcurve) { /* line or close. */ - if (t1_hinter__intersect_curve_bar(this, i, j)) + if (self->pole[j + 1].type != offcurve) { /* line or close. */ + if (t1_hinter__intersect_curve_bar(self, i, j)) return true; j++; } else { - if (t1_hinter__intersect_curve_curve(this, j, i)) + if (t1_hinter__intersect_curve_curve(self, j, i)) return true; j += 3; } @@ -524,7 +524,7 @@ #define MAX_NORMALIZING_CONTOURS 5 -static void t1_hinter__fix_subglyph_contour_signs(t1_hinter * this, int first_contour, int last_contour) +static void t1_hinter__fix_subglyph_contour_signs(t1_hinter * self, int first_contour, int last_contour) { double area[MAX_NORMALIZING_CONTOURS]; int i, j, k, l, m; @@ -542,15 +542,15 @@ /* Compute contour bboxes : */ k = 0; for(i = first_contour; i <= last_contour; i++) { - int b = this->contour[i]; - int e = this->contour[i + 1] - 1; + int b = self->contour[i]; + int e = self->contour[i + 1] - 1; - bbox[k].p.x = bbox[k].q.x = this->pole[b].gx; - bbox[k].p.y = bbox[k].q.y = this->pole[b].gy; + bbox[k].p.x = bbox[k].q.x = self->pole[b].gx; + bbox[k].p.y = bbox[k].q.y = self->pole[b].gy; /* 'close' has same coords as the starting point. */ for (j = b; j < e; j++) { - t1_glyph_space_coord x = this->pole[j].gx; - t1_glyph_space_coord y = this->pole[j].gy; + t1_glyph_space_coord x = self->pole[j].gx; + t1_glyph_space_coord y = self->pole[j].gy; if (bbox[k].p.x > x) bbox[k].p.x = x; @@ -593,21 +593,21 @@ /* Compute contour signes : */ for(i = 0; i < k; i++) { int c = isolated[i]; - int b = this->contour[c]; - int e = this->contour[c + 1] - 1; + int b = self->contour[c]; + int e = self->contour[c + 1] - 1; a = 0; /* 'close' has same coords as the starting point. */ for (j = b; j < e; ) { - if (this->pole[j + 1].type != offcurve) { /* line or close. */ - a += line_area_2(this->pole[j + 0].gx, this->pole[j + 0].gy, - this->pole[j + 1].gx, this->pole[j + 1].gy); + if (self->pole[j + 1].type != offcurve) { /* line or close. */ + a += line_area_2(self->pole[j + 0].gx, self->pole[j + 0].gy, + self->pole[j + 1].gx, self->pole[j + 1].gy); j++; } else { - a += bezier_area_2(this->pole[j + 0].gx, this->pole[j + 0].gy, - this->pole[j + 1].gx, this->pole[j + 1].gy, - this->pole[j + 2].gx, this->pole[j + 2].gy, - this->pole[j + 3].gx, this->pole[j + 3].gy); + a += bezier_area_2(self->pole[j + 0].gx, self->pole[j + 0].gy, + self->pole[j + 1].gx, self->pole[j + 1].gy, + self->pole[j + 2].gx, self->pole[j + 2].gy, + self->pole[j + 3].gx, self->pole[j + 3].gy); j += 3; } } @@ -625,8 +625,8 @@ inside[i][i] = 0; for (j = 0; j < k; j++) { if (i != j) { - int b = this->contour[isolated[i]]; - int code = t1_hinter__is_inside(this, this->pole[b].gx, this->pole[b].gy, isolated[j]); + int b = self->contour[isolated[i]]; + int code = t1_hinter__is_inside(self, self->pole[b].gx, self->pole[b].gy, isolated[j]); if (code < 0) { /* Contours have a common point - don't fix. */ @@ -681,7 +681,7 @@ for (i = 0; i < k; i++) { for (j = 0; j < k; j++) { if (inside[i][j]) { - if (t1_hinter__contour_intersection(this, isolated[i], isolated[j])) { + if (t1_hinter__contour_intersection(self, isolated[i], isolated[j])) { /* Contours intersect - don't fix. */ return; } @@ -691,25 +691,25 @@ /* Fix signs : */ for (i = 0; i < k; i++) { if ((nesting[i] & 1) != (area[i] < 0)) - t1_hinter__reverse_contour(this, isolated[i]); + t1_hinter__reverse_contour(self, isolated[i]); } /* Note we didn't fix negative isolated contours. We never meet such cases actually. */ } -void t1_hinter__fix_contour_signs(t1_hinter * this) +void t1_hinter__fix_contour_signs(t1_hinter * self) { int i; - if (this->subglyph_count >= 3) { + if (self->subglyph_count >= 3) { /* 3 or more subglyphs. We didn't meet so complex characters with wrong contours signs. Skip it for saving the CPU time. */ return; } - for (i = 1; i <= this->subglyph_count; i++) { - int first_contour = this->subglyph[i - 1]; - int last_contour = this->subglyph[i] - 1; + for (i = 1; i <= self->subglyph_count; i++) { + int first_contour = self->subglyph[i - 1]; + int last_contour = self->subglyph[i] - 1; if (last_contour - first_contour >= MAX_NORMALIZING_CONTOURS) { /* 4 or more contours. @@ -717,6 +717,6 @@ Skip it for saving the CPU time. */ continue; } - t1_hinter__fix_subglyph_contour_signs(this, first_contour, last_contour); + t1_hinter__fix_subglyph_contour_signs(self, first_contour, last_contour); } } diff -Nru ghostscript-9.04~dfsg/base/gxhintn.c ghostscript-9.05~dfsg~20120125/base/gxhintn.c --- ghostscript-9.04~dfsg/base/gxhintn.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxhintn.c 2011-11-12 18:29:08.000000000 +0000 @@ -198,75 +198,75 @@ } /*---------------------- members of matrix classes -------------------------*/ -static inline void double_matrix__set(double_matrix * this, const gs_matrix_fixed * m) -{ this->xx = m->xx; - this->xy = m->xy; - this->yx = m->yx; - this->yy = m->yy; +static inline void double_matrix__set(double_matrix * self, const gs_matrix_fixed * m) +{ self->xx = m->xx; + self->xy = m->xy; + self->yx = m->yx; + self->yy = m->yy; } -static inline int double_matrix__invert_to(const double_matrix * this, double_matrix * m) -{ double det = this->xx * this->yy - this->xy * this->yx; +static inline int double_matrix__invert_to(const double_matrix * self, double_matrix * m) +{ double det = self->xx * self->yy - self->xy * self->yx; - if (fabs(det) * 1000000 <= fabs(this->xx) + fabs(this->xy) + fabs(this->yx) + fabs(this->yy)) + if (fabs(det) * 1000000 <= fabs(self->xx) + fabs(self->xy) + fabs(self->yx) + fabs(self->yy)) return_error(gs_error_rangecheck); - m->xx = this->yy / det; - m->xy = -this->xy / det; - m->yx = -this->yx / det; - m->yy = this->xx / det; + m->xx = self->yy / det; + m->xy = -self->xy / det; + m->yx = -self->yx / det; + m->yy = self->xx / det; return 0; } -static void fraction_matrix__drop_bits(fraction_matrix * this, unsigned int bits) -{ this->xx = shift_rounded(this->xx, bits); - this->xy = shift_rounded(this->xy, bits); - this->yx = shift_rounded(this->yx, bits); - this->yy = shift_rounded(this->yy, bits); - this->denominator >>= bits; - this->bitshift -= bits; +static void fraction_matrix__drop_bits(fraction_matrix * self, unsigned int bits) +{ self->xx = shift_rounded(self->xx, bits); + self->xy = shift_rounded(self->xy, bits); + self->yx = shift_rounded(self->yx, bits); + self->yy = shift_rounded(self->yy, bits); + self->denominator >>= bits; + self->bitshift -= bits; } -static void fraction_matrix__set(fraction_matrix * this, const double_matrix * pmat) +static void fraction_matrix__set(fraction_matrix * self, const double_matrix * pmat) { double axx = fabs(pmat->xx), axy = fabs(pmat->xy); double ayx = fabs(pmat->yx), ayy = fabs(pmat->yy); double scale = max(axx + axy, ayx + ayy); int matrix_exp, m; double unused = frexp(scale, &matrix_exp); - this->bitshift = matrix_bits - matrix_exp; - if (this->bitshift >= sizeof( this->denominator) * 8) { - this->denominator = 0; - this->xx = this->xy = this->yx = this->yy = 0; + self->bitshift = matrix_bits - matrix_exp; + if (self->bitshift >= sizeof( self->denominator) * 8) { + self->denominator = 0; + self->xx = self->xy = self->yx = self->yy = 0; } else { - this->denominator = 1 << this->bitshift; + self->denominator = 1 << self->bitshift; /* Round towards zero for a better view of mirrored characters : */ - this->xx = (int32_t)(pmat->xx * this->denominator + 0.5); - this->xy = (int32_t)(pmat->xy * this->denominator + 0.5); - this->yx = (int32_t)(pmat->yx * this->denominator + 0.5); - this->yy = (int32_t)(pmat->yy * this->denominator + 0.5); - m = Max(Max(any_abs(this->xx), any_abs(this->xy)), Max(any_abs(this->yx), any_abs(this->yy))); + self->xx = (int32_t)(pmat->xx * self->denominator + 0.5); + self->xy = (int32_t)(pmat->xy * self->denominator + 0.5); + self->yx = (int32_t)(pmat->yx * self->denominator + 0.5); + self->yy = (int32_t)(pmat->yy * self->denominator + 0.5); + m = Max(Max(any_abs(self->xx), any_abs(self->xy)), Max(any_abs(self->yx), any_abs(self->yy))); unused = frexp(m, &matrix_exp); if (matrix_exp > matrix_bits) - fraction_matrix__drop_bits(this, matrix_exp - matrix_bits); + fraction_matrix__drop_bits(self, matrix_exp - matrix_bits); } } -static inline int fraction_matrix__to_double(const fraction_matrix * this, double_matrix * pmat) +static inline int fraction_matrix__to_double(const fraction_matrix * self, double_matrix * pmat) { - if (this->denominator == 0) + if (self->denominator == 0) return_error(gs_error_rangecheck); - pmat->xx = (double)this->xx / this->denominator; - pmat->xy = (double)this->xy / this->denominator; - pmat->yx = (double)this->yx / this->denominator; - pmat->yy = (double)this->yy / this->denominator; + pmat->xx = (double)self->xx / self->denominator; + pmat->xy = (double)self->xy / self->denominator; + pmat->yx = (double)self->yx / self->denominator; + pmat->yy = (double)self->yy / self->denominator; return 0; } -static int fraction_matrix__invert_to(const fraction_matrix * this, fraction_matrix * pmat) +static int fraction_matrix__invert_to(const fraction_matrix * self, fraction_matrix * pmat) { double_matrix m, M; int code; - code = fraction_matrix__to_double(this, &M); + code = fraction_matrix__to_double(self, &M); if (code < 0) return code; code = double_matrix__invert_to(&M, &m); @@ -276,11 +276,11 @@ return 0; } -static inline int32_t fraction_matrix__transform_x(fraction_matrix *this, int24 x, int24 y, unsigned int s) -{ return mul_shift_round(x, this->xx, s) + mul_shift_round(y, this->yx, s); +static inline int32_t fraction_matrix__transform_x(fraction_matrix *self, int24 x, int24 y, unsigned int s) +{ return mul_shift_round(x, self->xx, s) + mul_shift_round(y, self->yx, s); } -static inline int32_t fraction_matrix__transform_y(fraction_matrix *this, int24 x, int24 y, unsigned int s) -{ return mul_shift_round(x, this->xy, s) + mul_shift_round(y, this->yy, s); +static inline int32_t fraction_matrix__transform_y(fraction_matrix *self, int24 x, int24 y, unsigned int s) +{ return mul_shift_round(x, self->xy, s) + mul_shift_round(y, self->yy, s); } /*--------------------------- friends ------------------------------*/ @@ -350,56 +350,56 @@ /* --------------------- t1_hint class members ---------------------*/ -static void t1_hint__set_aligned_coord(t1_hint * this, t1_glyph_space_coord gc, t1_pole * pole, enum t1_align_type align, int quality) -{ t1_glyph_space_coord g = (this->type == hstem ? pole->gy : pole->gx); +static void t1_hint__set_aligned_coord(t1_hint * self, t1_glyph_space_coord gc, t1_pole * pole, enum t1_align_type align, int quality) +{ t1_glyph_space_coord g = (self->type == hstem ? pole->gy : pole->gx); - if (any_abs(this->g0 - g) < any_abs(this->g1 - g)) { - if (this->aligned0 <= align && this->q0 > quality) - this->ag0 = gc, this->aligned0 = align, this->q0 = quality; + if (any_abs(self->g0 - g) < any_abs(self->g1 - g)) { + if (self->aligned0 <= align && self->q0 > quality) + self->ag0 = gc, self->aligned0 = align, self->q0 = quality; } else { - if (this->aligned1 <= align && this->q1 > quality) - this->ag1 = gc, this->aligned1 = align, this->q1 = quality; + if (self->aligned1 <= align && self->q1 > quality) + self->ag1 = gc, self->aligned1 = align, self->q1 = quality; } } /* --------------------- t1_hinter class members - debug graphics --------------------*/ -static void t1_hinter__paint_glyph(t1_hinter * this, bool aligned) +static void t1_hinter__paint_glyph(t1_hinter * self, bool aligned) { #if VD_TRACE -#define X(j) *member_prt(t1_glyph_space_coord, &this->pole[j], offset_x) -#define Y(j) *member_prt(t1_glyph_space_coord, &this->pole[j], offset_y) - t1_glyph_space_coord *p_x = (aligned ? &this->pole[0].ax : &this->pole[0].gx); - t1_glyph_space_coord *p_y = (aligned ? &this->pole[0].ay : &this->pole[0].gy); - int offset_x = (char *)p_x - (char *)&this->pole[0]; - int offset_y = (char *)p_y - (char *)&this->pole[0]; +#define X(j) *member_prt(t1_glyph_space_coord, &self->pole[j], offset_x) +#define Y(j) *member_prt(t1_glyph_space_coord, &self->pole[j], offset_y) + t1_glyph_space_coord *p_x = (aligned ? &self->pole[0].ax : &self->pole[0].gx); + t1_glyph_space_coord *p_y = (aligned ? &self->pole[0].ay : &self->pole[0].gy); + int offset_x = (char *)p_x - (char *)&self->pole[0]; + int offset_y = (char *)p_y - (char *)&self->pole[0]; int i, j; char buf[15]; if (!vd_enabled) return; # if VD_PAINT_POLE_IDS - for(i = 0; i < this->contour_count; i++) { - int beg_pole = this->contour[i]; - int end_pole = this->contour[i + 1] - 2; + for(i = 0; i < self->contour_count; i++) { + int beg_pole = self->contour[i]; + int end_pole = self->contour[i + 1] - 2; for(j = beg_pole; j <= end_pole; j++) { vd_circle(X(j), Y(j), 3, RGB(0,0,255)); sprintf(buf, "%d", j); - vd_text(this->pole[j].gx, this->pole[j].gy, buf, RGB(0,0,0)); - if (this->pole[j + 1].type == offcurve) + vd_text(self->pole[j].gx, self->pole[j].gy, buf, RGB(0,0,0)); + if (self->pole[j + 1].type == offcurve) j+=2; } } # endif vd_setcolor(aligned ? RGB(0,255,0) : RGB(0,0,255)); - for(i = 0; i < this->contour_count; i++) { - int beg_pole = this->contour[i]; - int end_pole = this->contour[i + 1] - 2; + for(i = 0; i < self->contour_count; i++) { + int beg_pole = self->contour[i]; + int end_pole = self->contour[i + 1] - 2; vd_moveto(X(beg_pole), Y(beg_pole)); for(j = beg_pole + 1; j <= end_pole; j++) { - if (this->pole[j].type == oncurve) { + if (self->pole[j].type == oncurve) { vd_lineto(X(j), Y(j)); } else { int jj = (j + 2 > end_pole ? beg_pole : j + 2); @@ -414,29 +414,29 @@ #endif } -static void t1_hinter__paint_raster_grid(t1_hinter * this) +static void t1_hinter__paint_raster_grid(t1_hinter * self) { #if VD_TRACE int i; double j; /* 'long' can overflow */ unsigned long c0 = RGB(192, 192, 192), c1 = RGB(64, 64, 64); t1_hinter_space_coord min_ox, max_ox, min_oy, max_oy; - long div_x = this->g2o_fraction, div_xx = div_x << this->log2_pixels_x; - long div_y = this->g2o_fraction, div_yy = div_y << this->log2_pixels_y; + long div_x = self->g2o_fraction, div_xx = div_x << self->log2_pixels_x; + long div_y = self->g2o_fraction, div_yy = div_y << self->log2_pixels_y; long ext_x = div_x * 5; long ext_y = div_y * 5; - long sx = this->orig_ox % div_xx; - long sy = this->orig_oy % div_yy; + long sx = self->orig_ox % div_xx; + long sy = self->orig_oy % div_yy; if (!vd_enabled) return; - g2o(this, this->pole[0].gx, this->pole[0].gy, &min_ox, &min_oy); + g2o(self, self->pole[0].gx, self->pole[0].gy, &min_ox, &min_oy); max_ox = min_ox, max_oy = min_oy; /* Compute BBox in outliner's space : */ - for (i = 1; i < this->pole_count - 1; i++) { + for (i = 1; i < self->pole_count - 1; i++) { t1_hinter_space_coord ox, oy; - g2o(this, this->pole[i].gx, this->pole[i].gy, &ox, &oy); + g2o(self, self->pole[i].gx, self->pole[i].gy, &ox, &oy); min_ox = min(min_ox, ox); min_oy = min(min_oy, oy); max_ox = max(max_ox, ox); @@ -451,8 +451,8 @@ t1_glyph_space_coord gx0, gy0, gx1, gy1; bool pix = ((int)j / div_xx * div_xx == (int)j); - o2g_float(this, (int)j - sx, min_oy - sy, &gx0, &gy0); /* o2g may overflow here due to ext. */ - o2g_float(this, (int)j - sx, max_oy - sy, &gx1, &gy1); + o2g_float(self, (int)j - sx, min_oy - sy, &gx0, &gy0); /* o2g may overflow here due to ext. */ + o2g_float(self, (int)j - sx, max_oy - sy, &gx1, &gy1); vd_bar(gx0, gy0, gx1, gy1, 1, (!j ? 0 : pix ? c1 : c0)); } /* Paint rows : */ @@ -460,8 +460,8 @@ t1_glyph_space_coord gx0, gy0, gx1, gy1; bool pix = ((int)j / div_yy * div_yy == (int)j); - o2g_float(this, min_ox - sx, (int)j - sy, &gx0, &gy0); - o2g_float(this, max_ox - sx, (int)j - sy, &gx1, &gy1); + o2g_float(self, min_ox - sx, (int)j - sy, &gx0, &gy0); + o2g_float(self, max_ox - sx, (int)j - sy, &gx1, &gy1); vd_bar(gx0, gy0, gx1, gy1, 1, (!j ? 0 : pix ? c1 : c0)); } #endif @@ -469,162 +469,162 @@ /* --------------------- t1_hinter class members - import --------------------*/ -void t1_hinter__init(t1_hinter * this, gx_path *output_path) -{ this->max_import_coord = (1 << max_coord_bits); - this->stem_snap_count[0] = this->stem_snap_count[1] = 0; - this->stem_snap_vote_count = 0; - this->zone_count = 0; - this->pole_count = 0; - this->hint_count = 0; - this->contour_count = 0; - this->subglyph_count = 0; - this->hint_range_count = 0; - this->flex_count = 0; - this->have_flex = false; - - this->max_subglyph_count = count_of(this->subglyph0); - this->max_contour_count = count_of(this->contour0); - this->max_zone_count = count_of(this->zone0); - this->max_pole_count = count_of(this->pole0); - this->max_hint_count = count_of(this->hint0); - this->max_hint_range_count = count_of(this->hint_range0); - this->max_hint_applying_count = count_of(this->hint_applying0); - this->max_stem_snap_count[0] = count_of(this->stem_snap0[0]); - this->max_stem_snap_count[1] = count_of(this->stem_snap0[1]); - this->max_stem_snap_vote_count = count_of(this->stem_snap_vote0); - - this->pole = this->pole0; - this->hint = this->hint0; - this->zone = this->zone0; - this->contour = this->contour0; - this->subglyph = this->subglyph0; - this->hint_range = this->hint_range0; - this->hint_applying = this->hint_applying0; - this->stem_snap[0] = this->stem_snap0[0]; - this->stem_snap[1] = this->stem_snap0[1]; - this->stem_snap_vote = this->stem_snap_vote0; - - this->FontType = 1; - this->ForceBold = false; - this->base_font_scale = 0; - this->resolution = 0; - this->heigt_transform_coef = this->width_transform_coef = 0; - this->heigt_transform_coef_rat = this->width_transform_coef_rat = 0; - this->heigt_transform_coef_inv = this->width_transform_coef_inv = 0; - this->cx = this->cy = 0; - this->contour[0] = 0; - this->subglyph[0] = 0; - this->keep_stem_width = false; - this->charpath_flag = false; - this->grid_fit_x = this->grid_fit_y = true; - this->output_path = output_path; - this->memory = (output_path == 0 ? 0 : output_path->memory); - this->disable_hinting = (this->memory == NULL); - this->pass_through = this->disable_hinting; - this->autohinting = false; - this->fix_contour_sign = false; - - this->stem_snap[0][0] = this->stem_snap[1][0] = 100; /* default */ -} - -static inline void t1_hinter__free_arrays(t1_hinter * this) -{ if (this->pole != this->pole0) - gs_free_object(this->memory, this->pole, s_pole_array); - if (this->hint != this->hint0) - gs_free_object(this->memory, this->hint, s_hint_array); - if (this->zone != this->zone0) - gs_free_object(this->memory, this->zone, s_zone_array); - if (this->contour != this->contour0) - gs_free_object(this->memory, this->contour, s_contour_array); - if (this->subglyph != this->subglyph0) - gs_free_object(this->memory, this->subglyph, s_subglyph_array); - if (this->hint_range != this->hint_range0) - gs_free_object(this->memory, this->hint_range, s_hint_range_array); - if (this->hint_applying != this->hint_applying0) - gs_free_object(this->memory, this->hint_applying, s_hint_applying_array); - if (this->stem_snap[0] != this->stem_snap0[0]) - gs_free_object(this->memory, this->stem_snap[0], s_stem_snap_array); - if (this->stem_snap[1] != this->stem_snap0[1]) - gs_free_object(this->memory, this->stem_snap[1], s_stem_snap_array); - if (this->stem_snap_vote != this->stem_snap_vote0) - gs_free_object(this->memory, this->stem_snap_vote, s_stem_snap_vote_array); - this->pole = 0; - this->hint = 0; - this->zone = 0; - this->contour = 0; - this->hint_range = 0; - this->hint_applying = 0; - this->stem_snap[0] = this->stem_snap[1] = 0; - this->stem_snap_vote = 0; -} - -static inline void t1_hinter__init_outline(t1_hinter * this) -{ this->contour_count = 0; - this->pole_count = 0; - this->contour[0] = 0; - this->hint_count = 0; - this->primary_hint_count = -1; - this->suppress_overshoots = false; - this->path_opened = false; +void t1_hinter__init(t1_hinter * self, gx_path *output_path) +{ self->max_import_coord = (1 << max_coord_bits); + self->stem_snap_count[0] = self->stem_snap_count[1] = 0; + self->stem_snap_vote_count = 0; + self->zone_count = 0; + self->pole_count = 0; + self->hint_count = 0; + self->contour_count = 0; + self->subglyph_count = 0; + self->hint_range_count = 0; + self->flex_count = 0; + self->have_flex = false; + + self->max_subglyph_count = count_of(self->subglyph0); + self->max_contour_count = count_of(self->contour0); + self->max_zone_count = count_of(self->zone0); + self->max_pole_count = count_of(self->pole0); + self->max_hint_count = count_of(self->hint0); + self->max_hint_range_count = count_of(self->hint_range0); + self->max_hint_applying_count = count_of(self->hint_applying0); + self->max_stem_snap_count[0] = count_of(self->stem_snap0[0]); + self->max_stem_snap_count[1] = count_of(self->stem_snap0[1]); + self->max_stem_snap_vote_count = count_of(self->stem_snap_vote0); + + self->pole = self->pole0; + self->hint = self->hint0; + self->zone = self->zone0; + self->contour = self->contour0; + self->subglyph = self->subglyph0; + self->hint_range = self->hint_range0; + self->hint_applying = self->hint_applying0; + self->stem_snap[0] = self->stem_snap0[0]; + self->stem_snap[1] = self->stem_snap0[1]; + self->stem_snap_vote = self->stem_snap_vote0; + + self->FontType = 1; + self->ForceBold = false; + self->base_font_scale = 0; + self->resolution = 0; + self->heigt_transform_coef = self->width_transform_coef = 0; + self->heigt_transform_coef_rat = self->width_transform_coef_rat = 0; + self->heigt_transform_coef_inv = self->width_transform_coef_inv = 0; + self->cx = self->cy = 0; + self->contour[0] = 0; + self->subglyph[0] = 0; + self->keep_stem_width = false; + self->charpath_flag = false; + self->grid_fit_x = self->grid_fit_y = true; + self->output_path = output_path; + self->memory = (output_path == 0 ? 0 : output_path->memory); + self->disable_hinting = (self->memory == NULL); + self->pass_through = self->disable_hinting; + self->autohinting = false; + self->fix_contour_sign = false; + + self->stem_snap[0][0] = self->stem_snap[1][0] = 100; /* default */ +} + +static inline void t1_hinter__free_arrays(t1_hinter * self) +{ if (self->pole != self->pole0) + gs_free_object(self->memory, self->pole, s_pole_array); + if (self->hint != self->hint0) + gs_free_object(self->memory, self->hint, s_hint_array); + if (self->zone != self->zone0) + gs_free_object(self->memory, self->zone, s_zone_array); + if (self->contour != self->contour0) + gs_free_object(self->memory, self->contour, s_contour_array); + if (self->subglyph != self->subglyph0) + gs_free_object(self->memory, self->subglyph, s_subglyph_array); + if (self->hint_range != self->hint_range0) + gs_free_object(self->memory, self->hint_range, s_hint_range_array); + if (self->hint_applying != self->hint_applying0) + gs_free_object(self->memory, self->hint_applying, s_hint_applying_array); + if (self->stem_snap[0] != self->stem_snap0[0]) + gs_free_object(self->memory, self->stem_snap[0], s_stem_snap_array); + if (self->stem_snap[1] != self->stem_snap0[1]) + gs_free_object(self->memory, self->stem_snap[1], s_stem_snap_array); + if (self->stem_snap_vote != self->stem_snap_vote0) + gs_free_object(self->memory, self->stem_snap_vote, s_stem_snap_vote_array); + self->pole = 0; + self->hint = 0; + self->zone = 0; + self->contour = 0; + self->hint_range = 0; + self->hint_applying = 0; + self->stem_snap[0] = self->stem_snap[1] = 0; + self->stem_snap_vote = 0; +} + +static inline void t1_hinter__init_outline(t1_hinter * self) +{ self->contour_count = 0; + self->pole_count = 0; + self->contour[0] = 0; + self->hint_count = 0; + self->primary_hint_count = -1; + self->suppress_overshoots = false; + self->path_opened = false; } -static void t1_hinter__compute_rat_transform_coef(t1_hinter * this) +static void t1_hinter__compute_rat_transform_coef(t1_hinter * self) { /* Round towards zero for a better view of mirrored characters : */ - this->heigt_transform_coef_rat = (int19)(this->heigt_transform_coef * this->ctmf.denominator + 0.5); - this->width_transform_coef_rat = (int19)(this->width_transform_coef * this->ctmf.denominator + 0.5); - this->heigt_transform_coef_inv = (int19)(this->ctmi.denominator / this->heigt_transform_coef + 0.5); - this->width_transform_coef_inv = (int19)(this->ctmi.denominator / this->width_transform_coef + 0.5); + self->heigt_transform_coef_rat = (int19)(self->heigt_transform_coef * self->ctmf.denominator + 0.5); + self->width_transform_coef_rat = (int19)(self->width_transform_coef * self->ctmf.denominator + 0.5); + self->heigt_transform_coef_inv = (int19)(self->ctmi.denominator / self->heigt_transform_coef + 0.5); + self->width_transform_coef_inv = (int19)(self->ctmi.denominator / self->width_transform_coef + 0.5); } -static inline void t1_hinter__adjust_matrix_precision(t1_hinter * this, fixed xx, fixed yy) +static inline void t1_hinter__adjust_matrix_precision(t1_hinter * self, fixed xx, fixed yy) { fixed x = any_abs(xx), y = any_abs(yy); fixed c = (x > y ? x : y); - while (c >= this->max_import_coord) { + while (c >= self->max_import_coord) { /* Reduce the precision of ctmf to allow products to fit into 32 bits : */ - this->max_import_coord <<= 1; - fraction_matrix__drop_bits(&this->ctmf, 1); - fraction_matrix__drop_bits(&this->ctmi, 1); - this->g2o_fraction_bits -= 1; - this->g2o_fraction >>= 1; - t1_hinter__compute_rat_transform_coef(this); + self->max_import_coord <<= 1; + fraction_matrix__drop_bits(&self->ctmf, 1); + fraction_matrix__drop_bits(&self->ctmi, 1); + self->g2o_fraction_bits -= 1; + self->g2o_fraction >>= 1; + t1_hinter__compute_rat_transform_coef(self); } - if (this->ctmf.denominator == 0) { + if (self->ctmf.denominator == 0) { /* ctmf should be degenerate. */ - this->ctmf.denominator = 1; + self->ctmf.denominator = 1; } } -static inline void t1_hinter__set_origin(t1_hinter * this, fixed dx, fixed dy) +static inline void t1_hinter__set_origin(t1_hinter * self, fixed dx, fixed dy) { - fixed align_x = rshift(fixed_1, (this->align_to_pixels ? (int)this->log2_pixels_x : this->log2_subpixels_x)); - fixed align_y = rshift(fixed_1, (this->align_to_pixels ? (int)this->log2_pixels_y : this->log2_subpixels_y)); + fixed align_x = rshift(fixed_1, (self->align_to_pixels ? (int)self->log2_pixels_x : self->log2_subpixels_x)); + fixed align_y = rshift(fixed_1, (self->align_to_pixels ? (int)self->log2_pixels_y : self->log2_subpixels_y)); - this->orig_dx = (dx + align_x / 2) & ~(align_x - 1); - this->orig_dy = (dy + align_y / 2) & ~(align_y - 1); - t1_hinter__adjust_matrix_precision(this, this->orig_dx, this->orig_dy); - this->orig_ox = d2o(this, this->orig_dx); - this->orig_oy = d2o(this, this->orig_dy); + self->orig_dx = (dx + align_x / 2) & ~(align_x - 1); + self->orig_dy = (dy + align_y / 2) & ~(align_y - 1); + t1_hinter__adjust_matrix_precision(self, self->orig_dx, self->orig_dy); + self->orig_ox = d2o(self, self->orig_dx); + self->orig_oy = d2o(self, self->orig_dy); # if ADOBE_SHIFT_CHARPATH /* Adobe CPSI rounds coordinates for 'charpath' : X to trunc(x+0.5) Y to trunc(y)+0.5 */ - if (this->charpath_flag) { - this->orig_dx += fixed_half; - this->orig_dx &= ~(fixed_1 - 1); - this->orig_dy &= ~(fixed_1 - 1); - this->orig_dy += fixed_half; + if (self->charpath_flag) { + self->orig_dx += fixed_half; + self->orig_dx &= ~(fixed_1 - 1); + self->orig_dy &= ~(fixed_1 - 1); + self->orig_dy += fixed_half; } else { - this->orig_dy += fixed_1; + self->orig_dy += fixed_1; /* Adobe CPSI does this, not sure why. */ /* fixme : check bbox of cached bitmap. */ } # endif } -int t1_hinter__set_mapping(t1_hinter * this, gs_matrix_fixed * ctm, +int t1_hinter__set_mapping(t1_hinter * self, gs_matrix_fixed * ctm, gs_matrix * FontMatrix, gs_matrix * baseFontMatrix, int log2_pixels_x, int log2_pixels_y, int log2_subpixels_x, int log2_subpixels_y, @@ -635,40 +635,40 @@ double_matrix CTM; int code; - this->disable_hinting |= (scale < 1/1024. || scale > 4); - this->pass_through |= this->disable_hinting; - this->log2_pixels_x = log2_pixels_x; - this->log2_pixels_y = log2_pixels_y; - this->log2_subpixels_x = log2_subpixels_x; - this->log2_subpixels_y = log2_subpixels_y; + self->disable_hinting |= (scale < 1/1024. || scale > 4); + self->pass_through |= self->disable_hinting; + self->log2_pixels_x = log2_pixels_x; + self->log2_pixels_y = log2_pixels_y; + self->log2_subpixels_x = log2_subpixels_x; + self->log2_subpixels_y = log2_subpixels_y; double_matrix__set(&CTM, ctm); - fraction_matrix__set(&this->ctmf, &CTM); - this->g2o_fraction_bits = this->ctmf.bitshift - g2o_bitshift + _fixed_shift; - if (this->g2o_fraction_bits > max_coord_bits) { - fraction_matrix__drop_bits(&this->ctmf, this->g2o_fraction_bits - max_coord_bits); - this->g2o_fraction_bits = max_coord_bits; + fraction_matrix__set(&self->ctmf, &CTM); + self->g2o_fraction_bits = self->ctmf.bitshift - g2o_bitshift + _fixed_shift; + if (self->g2o_fraction_bits > max_coord_bits) { + fraction_matrix__drop_bits(&self->ctmf, self->g2o_fraction_bits - max_coord_bits); + self->g2o_fraction_bits = max_coord_bits; } - if (this->ctmf.denominator != 0) { - code = fraction_matrix__invert_to(&this->ctmf, &this->ctmi); /* Note: ctmi is inversion of ctmf, not ctm. */ + if (self->ctmf.denominator != 0) { + code = fraction_matrix__invert_to(&self->ctmf, &self->ctmi); /* Note: ctmi is inversion of ctmf, not ctm. */ if (code == gs_error_rangecheck) - this->ctmf.denominator = 0; + self->ctmf.denominator = 0; else if (code < 0) return code; } - if (this->ctmf.denominator != 0) { - this->g2o_fraction = 1 << this->g2o_fraction_bits; + if (self->ctmf.denominator != 0) { + self->g2o_fraction = 1 << self->g2o_fraction_bits; /* Note : possibly we'll adjust the matrix precision dynamically with adjust_matrix_precision while importing the glyph. */ - if (this->g2o_fraction == 0) + if (self->g2o_fraction == 0) return_error(gs_error_limitcheck); } - if (this->ctmf.denominator == 0 || this->ctmi.denominator == 0) { + if (self->ctmf.denominator == 0 || self->ctmi.denominator == 0) { /* ctmf should be degenerate. */ - this->disable_hinting = true; - this->pass_through = true; - this->ctmf.denominator = 1; + self->disable_hinting = true; + self->pass_through = true; + self->ctmf.denominator = 1; } - this->transposed = (any_abs(this->ctmf.xy) * 10 > any_abs(this->ctmf.xx)); + self->transposed = (any_abs(self->ctmf.xy) * 10 > any_abs(self->ctmf.xx)); { /* height_transform_coef is scaling factor for the distance between horizontal lines while transformation. width_transform_coef defines similarly. @@ -676,7 +676,7 @@ double_matrix m; double vp, sp, div_x, div_y; - code = fraction_matrix__to_double(&this->ctmf, &m); + code = fraction_matrix__to_double(&self->ctmf, &m); if (code < 0) return code; vp = any_abs(m.xx * m.yy - m.yx * m.xy); @@ -684,15 +684,15 @@ div_x = hypot(m.xx, m.yx); div_y = hypot(m.xy, m.yy); if (vp != 0 && div_x != 0 && div_y != 0) { - if (!this->transposed) { - this->heigt_transform_coef = vp / div_x; - this->width_transform_coef = vp / div_y; + if (!self->transposed) { + self->heigt_transform_coef = vp / div_x; + self->width_transform_coef = vp / div_y; } else { - this->heigt_transform_coef = vp / div_y; - this->width_transform_coef = vp / div_x; + self->heigt_transform_coef = vp / div_y; + self->width_transform_coef = vp / div_x; } - t1_hinter__compute_rat_transform_coef(this); - this->keep_stem_width = (sp <= vp / 3); /* small skew */ + t1_hinter__compute_rat_transform_coef(self); + self->keep_stem_width = (sp <= vp / 3); /* small skew */ } } { /* Compute font size and resolution : */ @@ -705,9 +705,9 @@ d0 = hypot(p0.x, p0.y); d1 = hypot(p1.x, p1.y); d2 = hypot(p2.x, p2.y); - this->base_font_scale = d0; - this->font_size = floor(d1 / d0 * 10000 + 0.5) / 10000; - this->resolution = floor(d2 / d1 * 10000000 + 0.5) / 10000000; + self->base_font_scale = d0; + self->font_size = floor(d1 / d0 * 10000 + 0.5) / 10000; + self->resolution = floor(d2 / d1 * 10000000 + 0.5) / 10000000; /* * fixme: base_font_scale, font_size and resolution are computed wrongly * for any of the following cases : @@ -723,26 +723,26 @@ */ } if (1 || /* Doesn't work - see comment above. */ - this->resolution * this->font_size >= 2) { + self->resolution * self->font_size >= 2) { /* Enable the grid fitting separately for axes : */ - this->grid_fit_y = (any_abs(this->ctmf.xy) * 10 < any_abs(this->ctmf.xx) || - any_abs(this->ctmf.xx) * 10 < any_abs(this->ctmf.xy)); - this->grid_fit_x = (any_abs(this->ctmf.yx) * 10 < any_abs(this->ctmf.yy) || - any_abs(this->ctmf.yy) * 10 < any_abs(this->ctmf.yx)); + self->grid_fit_y = (any_abs(self->ctmf.xy) * 10 < any_abs(self->ctmf.xx) || + any_abs(self->ctmf.xx) * 10 < any_abs(self->ctmf.xy)); + self->grid_fit_x = (any_abs(self->ctmf.yx) * 10 < any_abs(self->ctmf.yy) || + any_abs(self->ctmf.yy) * 10 < any_abs(self->ctmf.yx)); } else { /* Disable the grid fitting for very small fonts. */ - this->grid_fit_x = this->grid_fit_y = false; + self->grid_fit_x = self->grid_fit_y = false; } - this->align_to_pixels = align_to_pixels; - t1_hinter__set_origin(this, origin_x, origin_y); - this->pixel_o_x = rshift(this->g2o_fraction, (this->align_to_pixels ? (int)this->log2_pixels_x : this->log2_subpixels_x)); - this->pixel_o_y = rshift(this->g2o_fraction, (this->align_to_pixels ? (int)this->log2_pixels_y : this->log2_subpixels_y)); - this->pixel_gh = any_abs(o2g_dist(this, this->pixel_o_x, this->heigt_transform_coef_inv)); - this->pixel_gw = any_abs(o2g_dist(this, this->pixel_o_y, this->width_transform_coef_inv)); + self->align_to_pixels = align_to_pixels; + t1_hinter__set_origin(self, origin_x, origin_y); + self->pixel_o_x = rshift(self->g2o_fraction, (self->align_to_pixels ? (int)self->log2_pixels_x : self->log2_subpixels_x)); + self->pixel_o_y = rshift(self->g2o_fraction, (self->align_to_pixels ? (int)self->log2_pixels_y : self->log2_subpixels_y)); + self->pixel_gh = any_abs(o2g_dist(self, self->pixel_o_x, self->heigt_transform_coef_inv)); + self->pixel_gw = any_abs(o2g_dist(self, self->pixel_o_y, self->width_transform_coef_inv)); return 0; } -static void t1_hinter__make_zone(t1_hinter * this, t1_zone *zone, float * blues, enum t1_zone_type type, t1_glyph_space_coord blue_fuzz) +static void t1_hinter__make_zone(t1_hinter * self, t1_zone *zone, float * blues, enum t1_zone_type type, t1_glyph_space_coord blue_fuzz) { t1_glyph_space_coord d = 0; zone->type = type; @@ -753,7 +753,7 @@ if (type == botzone ? zone->overshoot_y > zone->y : zone->overshoot_y < zone->y) { int v = zone->overshoot_y; zone->overshoot_y = zone->y; zone->y = v; } - t1_hinter__adjust_matrix_precision(this, zone->y_min, zone->y_max); + t1_hinter__adjust_matrix_precision(self, zone->y_min, zone->y_max); } static bool t1_hinter__realloc_array(gs_memory_t *mem, void **a, void *a0, int *max_count, int elem_size, int enhancement, const char *cname) @@ -770,28 +770,28 @@ return false; } -static int t1_hinter__set_alignment_zones(t1_hinter * this, float * blues, int count, enum t1_zone_type type, bool family) +static int t1_hinter__set_alignment_zones(t1_hinter * self, float * blues, int count, enum t1_zone_type type, bool family) { int count2 = count / 2, i, j; if (!family) { /* Store zones : */ - if (count2 + this->zone_count >= this->max_zone_count) - if(t1_hinter__realloc_array(this->memory, (void **)&this->zone, this->zone0, &this->max_zone_count, - sizeof(this->zone0) / count_of(this->zone0), + if (count2 + self->zone_count >= self->max_zone_count) + if(t1_hinter__realloc_array(self->memory, (void **)&self->zone, self->zone0, &self->max_zone_count, + sizeof(self->zone0) / count_of(self->zone0), max(T1_MAX_ALIGNMENT_ZONES, count), s_zone_array)) return_error(gs_error_VMerror); for (i = 0; i < count2; i++) - t1_hinter__make_zone(this, &this->zone[this->zone_count + i], blues + i + i, type, this->blue_fuzz); - this->zone_count += count2; + t1_hinter__make_zone(self, &self->zone[self->zone_count + i], blues + i + i, type, self->blue_fuzz); + self->zone_count += count2; } else { /* Replace with family zones if allowed : */ t1_zone zone; for (i = 0; i < count2; i++) { - t1_hinter__make_zone(this, &zone, blues + i, type, this->blue_fuzz); - for (j = 0; jzone_count; j++) { - t1_zone *zone1 = &this->zone[j]; - if (any_abs(zone.y - zone1->y ) * this->heigt_transform_coef <= 1 && - any_abs(zone.overshoot_y - zone1->overshoot_y) * this->heigt_transform_coef <= 1) + t1_hinter__make_zone(self, &zone, blues + i, type, self->blue_fuzz); + for (j = 0; jzone_count; j++) { + t1_zone *zone1 = &self->zone[j]; + if (any_abs(zone.y - zone1->y ) * self->heigt_transform_coef <= 1 && + any_abs(zone.overshoot_y - zone1->overshoot_y) * self->heigt_transform_coef <= 1) *zone1 = zone; } } @@ -799,42 +799,42 @@ return 0; } -static int t1_hinter__set_stem_snap(t1_hinter * this, float * value, int count, unsigned short hv) -{ int count0 = this->stem_snap_count[hv], i, j; - t1_glyph_space_coord pixel_g = (!hv ? this->pixel_gh : this->pixel_gw); +static int t1_hinter__set_stem_snap(t1_hinter * self, float * value, int count, unsigned short hv) +{ int count0 = self->stem_snap_count[hv], i, j; + t1_glyph_space_coord pixel_g = (!hv ? self->pixel_gh : self->pixel_gw); if (pixel_g == 0) return 0; - if (count + count0 >= this->max_stem_snap_count[hv]) - if(t1_hinter__realloc_array(this->memory, (void **)&this->stem_snap[hv], this->stem_snap0[hv], &this->max_stem_snap_count[hv], - sizeof(this->stem_snap0[0]) / count_of(this->stem_snap0[0]), + if (count + count0 >= self->max_stem_snap_count[hv]) + if(t1_hinter__realloc_array(self->memory, (void **)&self->stem_snap[hv], self->stem_snap0[hv], &self->max_stem_snap_count[hv], + sizeof(self->stem_snap0[0]) / count_of(self->stem_snap0[0]), max(T1_MAX_STEM_SNAPS, count), s_stem_snap_array)) return_error(gs_error_VMerror); - if (count + count0 >= this->max_stem_snap_vote_count) - if(t1_hinter__realloc_array(this->memory, (void **)&this->stem_snap_vote, this->stem_snap_vote0, &this->max_stem_snap_vote_count, - sizeof(this->stem_snap_vote0) / count_of(this->stem_snap_vote0), + if (count + count0 >= self->max_stem_snap_vote_count) + if(t1_hinter__realloc_array(self->memory, (void **)&self->stem_snap_vote, self->stem_snap_vote0, &self->max_stem_snap_vote_count, + sizeof(self->stem_snap_vote0) / count_of(self->stem_snap_vote0), max(T1_MAX_STEM_SNAPS, count), s_stem_snap_vote_array)) return_error(gs_error_VMerror); if (count == 1 || (count > 0 && float2fixed(value[count - 1] - value[0]) > pixel_g)) { for (i = 0; i < count; i++) - this->stem_snap[hv][i] = float2fixed(value[i]); - this->stem_snap_count[hv] = count; + self->stem_snap[hv][i] = float2fixed(value[i]); + self->stem_snap_count[hv] = count; for (i = 0; i < count; i++) { for (j = i + 1; j < count; j++) - if (this->stem_snap[hv][i] > this->stem_snap[hv][j]) { - t1_glyph_space_coord v = this->stem_snap[hv][i]; + if (self->stem_snap[hv][i] > self->stem_snap[hv][j]) { + t1_glyph_space_coord v = self->stem_snap[hv][i]; - this->stem_snap[hv][i] = this->stem_snap[hv][j]; - this->stem_snap[hv][j] = v; + self->stem_snap[hv][i] = self->stem_snap[hv][j]; + self->stem_snap[hv][j] = v; } } for (i = 1, j = 0; i < count; i++) { - if (this->stem_snap[hv][j] != this->stem_snap[hv][i]) { + if (self->stem_snap[hv][j] != self->stem_snap[hv][i]) { j++; - this->stem_snap[hv][j] = this->stem_snap[hv][i]; + self->stem_snap[hv][j] = self->stem_snap[hv][i]; } } - this->stem_snap_count[hv] = j + 1; + self->stem_snap_count[hv] = j + 1; } return 0; /* We store unrounded stem snap elements, align stem width @@ -868,137 +868,137 @@ vd_setlinewidth(0); } -int t1_hinter__set_font_data(t1_hinter * this, int FontType, gs_type1_data *pdata, bool no_grid_fitting, bool is_resource) +int t1_hinter__set_font_data(t1_hinter * self, int FontType, gs_type1_data *pdata, bool no_grid_fitting, bool is_resource) { int code; - t1_hinter__init_outline(this); - this->FontType = FontType; - this->BlueScale = pdata->BlueScale; - this->blue_shift = float2fixed(pdata->BlueShift); - this->blue_fuzz = float2fixed(pdata->BlueFuzz); - this->suppress_overshoots = (this->BlueScale > this->heigt_transform_coef / (1 << this->log2_pixels_y) - 0.00020417); - this->overshoot_threshold = (this->heigt_transform_coef != 0 ? (t1_glyph_space_coord)(fixed_half * (1 << this->log2_pixels_y) / this->heigt_transform_coef) : 0); - this->ForceBold = pdata->ForceBold; - this->disable_hinting |= no_grid_fitting; - this->pass_through |= no_grid_fitting; - this->charpath_flag = no_grid_fitting; - this->fix_contour_sign = (!is_resource && this->memory != NULL); - if (this->fix_contour_sign) - this->pass_through = false; - if (!vd_enabled && (VD_DRAW_IMPORT || this->pass_through)) + t1_hinter__init_outline(self); + self->FontType = FontType; + self->BlueScale = pdata->BlueScale; + self->blue_shift = float2fixed(pdata->BlueShift); + self->blue_fuzz = float2fixed(pdata->BlueFuzz); + self->suppress_overshoots = (self->BlueScale > self->heigt_transform_coef / (1 << self->log2_pixels_y) - 0.00020417); + self->overshoot_threshold = (self->heigt_transform_coef != 0 ? (t1_glyph_space_coord)(fixed_half * (1 << self->log2_pixels_y) / self->heigt_transform_coef) : 0); + self->ForceBold = pdata->ForceBold; + self->disable_hinting |= no_grid_fitting; + self->pass_through |= no_grid_fitting; + self->charpath_flag = no_grid_fitting; + self->fix_contour_sign = (!is_resource && self->memory != NULL); + if (self->fix_contour_sign) + self->pass_through = false; + if (!vd_enabled && (VD_DRAW_IMPORT || self->pass_through)) enable_draw_import(); - if (this->pass_through) + if (self->pass_through) return 0; - code = t1_hinter__set_alignment_zones(this, pdata->OtherBlues.values, pdata->OtherBlues.count, botzone, false); + code = t1_hinter__set_alignment_zones(self, pdata->OtherBlues.values, pdata->OtherBlues.count, botzone, false); if (code >= 0) - code = t1_hinter__set_alignment_zones(this, pdata->BlueValues.values, min(2, pdata->BlueValues.count), botzone, false); + code = t1_hinter__set_alignment_zones(self, pdata->BlueValues.values, min(2, pdata->BlueValues.count), botzone, false); if (code >= 0) - code = t1_hinter__set_alignment_zones(this, pdata->BlueValues.values + 2, pdata->BlueValues.count - 2, topzone, false); + code = t1_hinter__set_alignment_zones(self, pdata->BlueValues.values + 2, pdata->BlueValues.count - 2, topzone, false); if (code >= 0) - code = t1_hinter__set_alignment_zones(this, pdata->FamilyOtherBlues.values, pdata->FamilyOtherBlues.count, botzone, true); + code = t1_hinter__set_alignment_zones(self, pdata->FamilyOtherBlues.values, pdata->FamilyOtherBlues.count, botzone, true); if (code >= 0) - code = t1_hinter__set_alignment_zones(this, pdata->FamilyBlues.values, min(2, pdata->FamilyBlues.count), botzone, true); + code = t1_hinter__set_alignment_zones(self, pdata->FamilyBlues.values, min(2, pdata->FamilyBlues.count), botzone, true); if (code >= 0) - code = t1_hinter__set_alignment_zones(this, pdata->FamilyBlues.values + 2, pdata->FamilyBlues.count - 2, topzone, true); + code = t1_hinter__set_alignment_zones(self, pdata->FamilyBlues.values + 2, pdata->FamilyBlues.count - 2, topzone, true); if (code >= 0) - code = t1_hinter__set_stem_snap(this, pdata->StdHW.values, pdata->StdHW.count, 0); + code = t1_hinter__set_stem_snap(self, pdata->StdHW.values, pdata->StdHW.count, 0); if (code >= 0) - code = t1_hinter__set_stem_snap(this, pdata->StdVW.values, pdata->StdVW.count, 1); + code = t1_hinter__set_stem_snap(self, pdata->StdVW.values, pdata->StdVW.count, 1); if (code >= 0) - code = t1_hinter__set_stem_snap(this, pdata->StemSnapH.values, pdata->StemSnapH.count, 0); + code = t1_hinter__set_stem_snap(self, pdata->StemSnapH.values, pdata->StemSnapH.count, 0); if (code >= 0) - code = t1_hinter__set_stem_snap(this, pdata->StemSnapV.values, pdata->StemSnapV.count, 1); + code = t1_hinter__set_stem_snap(self, pdata->StemSnapV.values, pdata->StemSnapV.count, 1); return code; } -int t1_hinter__set_font42_data(t1_hinter * this, int FontType, gs_type42_data *pdata, bool no_grid_fitting) +int t1_hinter__set_font42_data(t1_hinter * self, int FontType, gs_type42_data *pdata, bool no_grid_fitting) { - t1_hinter__init_outline(this); - this->FontType = FontType; - this->BlueScale = 0.039625; /* A Type 1 spec default. */ - this->blue_shift = 7; /* A Type 1 spec default. */ - this->blue_fuzz = 1; /* A Type 1 spec default. */ - this->suppress_overshoots = (this->BlueScale > this->heigt_transform_coef / (1 << this->log2_pixels_y) - 0.00020417); - this->overshoot_threshold = (this->heigt_transform_coef != 0 ? (t1_glyph_space_coord)(fixed_half * (1 << this->log2_pixels_y) / this->heigt_transform_coef) : 0); - this->ForceBold = false; - this->pass_through |= no_grid_fitting; - this->charpath_flag = no_grid_fitting; - this->autohinting = true; - if (!vd_enabled && (VD_DRAW_IMPORT || this->pass_through)) + t1_hinter__init_outline(self); + self->FontType = FontType; + self->BlueScale = 0.039625; /* A Type 1 spec default. */ + self->blue_shift = 7; /* A Type 1 spec default. */ + self->blue_fuzz = 1; /* A Type 1 spec default. */ + self->suppress_overshoots = (self->BlueScale > self->heigt_transform_coef / (1 << self->log2_pixels_y) - 0.00020417); + self->overshoot_threshold = (self->heigt_transform_coef != 0 ? (t1_glyph_space_coord)(fixed_half * (1 << self->log2_pixels_y) / self->heigt_transform_coef) : 0); + self->ForceBold = false; + self->pass_through |= no_grid_fitting; + self->charpath_flag = no_grid_fitting; + self->autohinting = true; + if (!vd_enabled && (VD_DRAW_IMPORT || self->pass_through)) enable_draw_import(); - if (this->pass_through) + if (self->pass_through) return 0; /* Currently we don't provice alignments zones or stem snap. */ return 0; } -static inline int t1_hinter__can_add_pole(t1_hinter * this, t1_pole **pole) -{ if (this->pole_count >= this->max_pole_count) - if(t1_hinter__realloc_array(this->memory, (void **)&this->pole, this->pole0, &this->max_pole_count, - sizeof(this->pole0) / count_of(this->pole0), T1_MAX_POLES, s_pole_array)) +static inline int t1_hinter__can_add_pole(t1_hinter * self, t1_pole **pole) +{ if (self->pole_count >= self->max_pole_count) + if(t1_hinter__realloc_array(self->memory, (void **)&self->pole, self->pole0, &self->max_pole_count, + sizeof(self->pole0) / count_of(self->pole0), T1_MAX_POLES, s_pole_array)) return_error(gs_error_VMerror); - *pole = &this->pole[this->pole_count]; + *pole = &self->pole[self->pole_count]; return 0; } -static inline int t1_hinter__add_pole(t1_hinter * this, t1_glyph_space_coord xx, t1_glyph_space_coord yy, enum t1_pole_type type) +static inline int t1_hinter__add_pole(t1_hinter * self, t1_glyph_space_coord xx, t1_glyph_space_coord yy, enum t1_pole_type type) { t1_pole *pole; - int code = t1_hinter__can_add_pole(this, &pole); + int code = t1_hinter__can_add_pole(self, &pole); if (code < 0) return code; - pole->gx = pole->ax = this->cx += xx; - pole->gy = pole->ay = this->cy += yy; + pole->gx = pole->ax = self->cx += xx; + pole->gy = pole->ay = self->cy += yy; pole->ox = pole->oy = 0; pole->type = type; - pole->contour_index = this->contour_count; + pole->contour_index = self->contour_count; pole->aligned_x = pole->aligned_y = unaligned; pole->boundary_length_x = pole->boundary_length_y = 0; - this->pole_count++; + self->pole_count++; return 0; } -int t1_hinter__sbw(t1_hinter * this, fixed sbx, fixed sby, fixed wx, fixed wy) -{ this->cx = this->orig_gx = this->subglyph_orig_gx = sbx; - this->cy = this->orig_gy = this->subglyph_orig_gy = sby; - this->width_gx = wx; - this->width_gy = wy; +int t1_hinter__sbw(t1_hinter * self, fixed sbx, fixed sby, fixed wx, fixed wy) +{ self->cx = self->orig_gx = self->subglyph_orig_gx = sbx; + self->cy = self->orig_gy = self->subglyph_orig_gy = sby; + self->width_gx = wx; + self->width_gy = wy; return 0; } -int t1_hinter__sbw_seac(t1_hinter * this, fixed sbx, fixed sby) -{ t1_hinter__adjust_matrix_precision(this, sbx, sby); - this->cx = this->subglyph_orig_gx = this->orig_gx + sbx; - this->cy = this->subglyph_orig_gy = this->orig_gy + sby; +int t1_hinter__sbw_seac(t1_hinter * self, fixed sbx, fixed sby) +{ t1_hinter__adjust_matrix_precision(self, sbx, sby); + self->cx = self->subglyph_orig_gx = self->orig_gx + sbx; + self->cy = self->subglyph_orig_gy = self->orig_gy + sby; return 0; } -static bool t1_hinter__find_flex(t1_hinter * this, int k, int contour_beg, int contour_end, +static bool t1_hinter__find_flex(t1_hinter * self, int k, int contour_beg, int contour_end, t1_glyph_space_coord pixel_g, t1_glyph_space_coord threshold, int i0, int i1, int N, int *j0, int *j1, t1_glyph_space_coord *gm) { int i, j, n = N - 5, m, l; - t1_glyph_space_coord *p_gc = (!k ? &this->pole[0].gx : &this->pole[0].gy); - t1_glyph_space_coord *p_gd = (!k ? &this->pole[0].gy : &this->pole[0].gx); - int offset_gc = (char *)p_gc - (char *)&this->pole[0]; - int offset_gd = (char *)p_gd - (char *)&this->pole[0]; + t1_glyph_space_coord *p_gc = (!k ? &self->pole[0].gx : &self->pole[0].gy); + t1_glyph_space_coord *p_gd = (!k ? &self->pole[0].gy : &self->pole[0].gx); + int offset_gc = (char *)p_gc - (char *)&self->pole[0]; + int offset_gd = (char *)p_gd - (char *)&self->pole[0]; t1_glyph_space_coord gc0, gc1, gd0, gd1, gcl, gdl, gcp = 0, gdp = 0, gcd, gcm = 0; for (i = i0; n; n--, i = i + 1) { if (i == contour_end) i = contour_beg; - if (this->pole[i].type == offcurve) + if (self->pole[i].type == offcurve) continue; - gc0 = *member_prt(t1_glyph_space_coord, &this->pole[i], offset_gc); - gd0 = *member_prt(t1_glyph_space_coord, &this->pole[i], offset_gd); + gc0 = *member_prt(t1_glyph_space_coord, &self->pole[i], offset_gc); + gd0 = *member_prt(t1_glyph_space_coord, &self->pole[i], offset_gd); for (j = i1, m = n; m; m--, j--) { if (j < contour_beg) j = contour_end - 1; - if (this->pole[j].type == offcurve) + if (self->pole[j].type == offcurve) continue; - gc1 = *member_prt(t1_glyph_space_coord, &this->pole[j], offset_gc); - gd1 = *member_prt(t1_glyph_space_coord, &this->pole[j], offset_gd); + gc1 = *member_prt(t1_glyph_space_coord, &self->pole[j], offset_gc); + gd1 = *member_prt(t1_glyph_space_coord, &self->pole[j], offset_gd); if (any_abs(gd1 - gd0) < pixel_g * 4) /* Arbitrary check for 4 pixels length. */ continue; if (gc0 == gc1) { /* Arbitrary check for strong equality. */ @@ -1015,8 +1015,8 @@ for (l = i; ; pl = l, gcp = gcl, gdp = gdl, prev_dir = dir, l++) { if (l == contour_end) l = contour_beg; - gcl = *member_prt(t1_glyph_space_coord, &this->pole[l], offset_gc); - gdl = *member_prt(t1_glyph_space_coord, &this->pole[l], offset_gd); + gcl = *member_prt(t1_glyph_space_coord, &self->pole[l], offset_gc); + gdl = *member_prt(t1_glyph_space_coord, &self->pole[l], offset_gd); if (l != i) { area += (double)(gcp - gc0) * (gdl - gdp) - (double)(gdp - gd0) * (gcl - gcp); gcd = gcl - gc0; @@ -1053,8 +1053,8 @@ ii = contour_end - 1; if (jj == contour_end) jj = contour_beg; - gii = *member_prt(t1_glyph_space_coord, &this->pole[ii], offset_gc); - gjj = *member_prt(t1_glyph_space_coord, &this->pole[jj], offset_gc); + gii = *member_prt(t1_glyph_space_coord, &self->pole[ii], offset_gc); + gjj = *member_prt(t1_glyph_space_coord, &self->pole[jj], offset_gc); if ((lt && gii <= gc0 && gjj <= gc0) || (gt && gii >= gc0 && gjj >= gc0)) { *j0 = i; @@ -1073,32 +1073,32 @@ return false; } -static void t1_hinter__compact_flex(t1_hinter * this, int contour_beg, int contour_end, int i0, int i1, int *pi) +static void t1_hinter__compact_flex(t1_hinter * self, int contour_beg, int contour_end, int i0, int i1, int *pi) { if (i0 > i1) { - t1_hinter__compact_flex(this, contour_beg, contour_end, i0, contour_end, pi); - t1_hinter__compact_flex(this, contour_beg, contour_end, contour_beg, i1, pi); + t1_hinter__compact_flex(self, contour_beg, contour_end, i0, contour_end, pi); + t1_hinter__compact_flex(self, contour_beg, contour_end, contour_beg, i1, pi); } else if (i0 < i1) { int i, j; int s = i1 - i0 - 1; - for (j = 0; j < this->hint_range_count; j++) { - if (this->hint_range[j].beg_pole >= i1) - this->hint_range[j].beg_pole -= s; - else if (this->hint_range[j].beg_pole > i0) - this->hint_range[j].beg_pole = i0; - if (this->hint_range[j].end_pole >= i1) - this->hint_range[j].end_pole -= s; - else if (this->hint_range[j].end_pole > i0) - this->hint_range[j].end_pole = i0; + for (j = 0; j < self->hint_range_count; j++) { + if (self->hint_range[j].beg_pole >= i1) + self->hint_range[j].beg_pole -= s; + else if (self->hint_range[j].beg_pole > i0) + self->hint_range[j].beg_pole = i0; + if (self->hint_range[j].end_pole >= i1) + self->hint_range[j].end_pole -= s; + else if (self->hint_range[j].end_pole > i0) + self->hint_range[j].end_pole = i0; } if (VD_DRAW_IMPORT) { for (i = i0; i <= i1; i++) - vd_square(this->pole[i].gx, this->pole[i].gy, 7, RGB(0,0,0)); + vd_square(self->pole[i].gx, self->pole[i].gy, 7, RGB(0,0,0)); } - memmove(&this->pole[i0 + 1], &this->pole[i1], sizeof(*this->pole) * (this->pole_count - i1)); - this->contour[this->contour_count] -= s; - this->pole_count -= s; + memmove(&self->pole[i0 + 1], &self->pole[i1], sizeof(*self->pole) * (self->pole_count - i1)); + self->contour[self->contour_count] -= s; + self->pole_count -= s; if (*pi >= i1) *pi -= s; else if (i0 <= *pi) @@ -1106,7 +1106,7 @@ } } -static void t1_hinter__adjust_stem_hints_by_missed_flex(t1_hinter * this, t1_glyph_space_coord g0, +static void t1_hinter__adjust_stem_hints_by_missed_flex(t1_hinter * self, t1_glyph_space_coord g0, t1_glyph_space_coord gm, int k) { /* While fixing a missed flex, a part of outline is shifted. @@ -1126,9 +1126,9 @@ if (gm < g0) { g0 ^= gm; gm ^= g0; g0 ^= gm; } - for (i = 0; i < this->hint_count; i++) - if (!k == (this->hint[i].type != hstem)) { - t1_hint *hint = &this->hint[i]; + for (i = 0; i < self->hint_count; i++) + if (!k == (self->hint[i].type != hstem)) { + t1_hint *hint = &self->hint[i]; if (g0 <= hint->g0 && hint->g0 <= gm) hint->g0 = hint->ag0 = gg; @@ -1137,35 +1137,35 @@ } } -static void t1_hinter__fix_missed_flex(t1_hinter * this) +static void t1_hinter__fix_missed_flex(t1_hinter * self) { int contour_beg, contour_end; int i, j, k, pj, n, j0, j1; - if (this->contour_count == 0) + if (self->contour_count == 0) return; - contour_beg = this->contour[this->contour_count -1]; - contour_end = this->pole_count - 1; /* the last contour's 'closepath'. */ + contour_beg = self->contour[self->contour_count -1]; + contour_end = self->pole_count - 1; /* the last contour's 'closepath'. */ if (contour_beg + 8 >= contour_end) return; for (k = 0; k < 2; k++) { - t1_glyph_space_coord *p_gc = (!k ? &this->pole[0].gx : &this->pole[0].gy); - t1_glyph_space_coord *p_gd = (!k ? &this->pole[0].gy : &this->pole[0].gx); - int offset_gc = (char *)p_gc - (char *)&this->pole[0]; - int offset_gd = (char *)p_gd - (char *)&this->pole[0]; - t1_glyph_space_coord pixel_g = (!k ? this->pixel_gw : this->pixel_gh); + t1_glyph_space_coord *p_gc = (!k ? &self->pole[0].gx : &self->pole[0].gy); + t1_glyph_space_coord *p_gd = (!k ? &self->pole[0].gy : &self->pole[0].gx); + int offset_gc = (char *)p_gc - (char *)&self->pole[0]; + int offset_gd = (char *)p_gd - (char *)&self->pole[0]; + t1_glyph_space_coord pixel_g = (!k ? self->pixel_gw : self->pixel_gh); t1_glyph_space_coord threshold = pixel_g * 5 / 10; t1_glyph_space_coord gc0, gc1, gc, gcj, gd = 0, ge, gm; int dir = 0, prev_dir; bool wrapped = false; - gc = *member_prt(t1_glyph_space_coord, &this->pole[contour_beg], offset_gc); + gc = *member_prt(t1_glyph_space_coord, &self->pole[contour_beg], offset_gc); gc0 = gc - threshold; gc1 = gc + threshold; /* Backward search for a plattue start. */ for (i = contour_end; i > contour_beg; i--) { - gcj = *member_prt(t1_glyph_space_coord, &this->pole[i], offset_gc); - if (this->pole[i].type == offcurve) + gcj = *member_prt(t1_glyph_space_coord, &self->pole[i], offset_gc); + if (self->pole[i].type == offcurve) continue; if (gcj < gc0 || gcj > gc1) break; @@ -1184,8 +1184,8 @@ wrapped = true; i = contour_beg; } - gc = *member_prt(t1_glyph_space_coord, &this->pole[i], offset_gc); - ge = *member_prt(t1_glyph_space_coord, &this->pole[i], offset_gd); + gc = *member_prt(t1_glyph_space_coord, &self->pole[i], offset_gc); + ge = *member_prt(t1_glyph_space_coord, &self->pole[i], offset_gd); gc0 = gc - threshold; gc1 = gc + threshold; for (pj = i, j = i + 1, n = 0; ; pj = j, j++, n++) { @@ -1193,12 +1193,12 @@ j = contour_beg; if (j == i) break; /* against bad glyphs. */ - if (this->pole[j].type == offcurve) + if (self->pole[j].type == offcurve) continue; - gcj = *member_prt(t1_glyph_space_coord, &this->pole[j], offset_gc); + gcj = *member_prt(t1_glyph_space_coord, &self->pole[j], offset_gc); if (gcj < gc0 || gcj > gc1) break; - gd = *member_prt(t1_glyph_space_coord, &this->pole[i], offset_gd); + gd = *member_prt(t1_glyph_space_coord, &self->pole[i], offset_gd); dir = (gd > ge ? 1 : -1); if (dir * prev_dir < 0) break; @@ -1207,146 +1207,146 @@ } if (n < 6) continue; - if (t1_hinter__find_flex(this, k, contour_beg, contour_end, pixel_g, threshold, i, pj, n, &j0, &j1, &gm)) { - t1_hinter__compact_flex(this, contour_beg, contour_end, j0, j1, &i); - t1_hinter__adjust_stem_hints_by_missed_flex(this, gc, gm, k); - contour_end = this->pole_count - 1; + if (t1_hinter__find_flex(self, k, contour_beg, contour_end, pixel_g, threshold, i, pj, n, &j0, &j1, &gm)) { + t1_hinter__compact_flex(self, contour_beg, contour_end, j0, j1, &i); + t1_hinter__adjust_stem_hints_by_missed_flex(self, gc, gm, k); + contour_end = self->pole_count - 1; } } } } -int t1_hinter__rmoveto(t1_hinter * this, fixed xx, fixed yy) +int t1_hinter__rmoveto(t1_hinter * self, fixed xx, fixed yy) { int code; - t1_hinter__adjust_matrix_precision(this, xx, yy); - if (this->flex_count == 0) { - if (this->pass_through) { - t1_glyph_space_coord gx = this->cx += xx; - t1_glyph_space_coord gy = this->cy += yy; + t1_hinter__adjust_matrix_precision(self, xx, yy); + if (self->flex_count == 0) { + if (self->pass_through) { + t1_glyph_space_coord gx = self->cx += xx; + t1_glyph_space_coord gy = self->cy += yy; fixed fx, fy; - if (this->path_opened) { - code = gx_path_close_subpath(this->output_path); + if (self->path_opened) { + code = gx_path_close_subpath(self->output_path); if (code < 0) return code; - this->path_opened = false; + self->path_opened = false; } - g2d(this, gx, gy, &fx, &fy); - code = gx_path_add_point(this->output_path, fx, fy); - vd_circle(this->cx, this->cy, 2, RGB(255, 0, 0)); - vd_moveto(this->cx, this->cy); - if (this->flex_count == 0) { - this->bx = this->cx; - this->by = this->cy; + g2d(self, gx, gy, &fx, &fy); + code = gx_path_add_point(self->output_path, fx, fy); + vd_circle(self->cx, self->cy, 2, RGB(255, 0, 0)); + vd_moveto(self->cx, self->cy); + if (self->flex_count == 0) { + self->bx = self->cx; + self->by = self->cy; } return code; } - if (this->pole_count > 0 && this->pole[this->pole_count - 1].type == moveto) - this->pole_count--; - if (this->pole_count > 0 && this->pole[this->pole_count - 1].type != closepath) { - code = t1_hinter__closepath(this); + if (self->pole_count > 0 && self->pole[self->pole_count - 1].type == moveto) + self->pole_count--; + if (self->pole_count > 0 && self->pole[self->pole_count - 1].type != closepath) { + code = t1_hinter__closepath(self); if (code < 0) return code; } - if (!this->have_flex) - t1_hinter__fix_missed_flex(this); + if (!self->have_flex) + t1_hinter__fix_missed_flex(self); } - code = t1_hinter__add_pole(this, xx, yy, moveto); - if (this->flex_count == 0) { - this->bx = this->cx; - this->by = this->cy; + code = t1_hinter__add_pole(self, xx, yy, moveto); + if (self->flex_count == 0) { + self->bx = self->cx; + self->by = self->cy; } - vd_circle(this->cx, this->cy, 2, RGB(255, 0, 0)); - vd_moveto(this->cx, this->cy); + vd_circle(self->cx, self->cy, 2, RGB(255, 0, 0)); + vd_moveto(self->cx, self->cy); return code; } -static inline void t1_hinter__skip_degenerate_segnment(t1_hinter * this, int npoles) +static inline void t1_hinter__skip_degenerate_segnment(t1_hinter * self, int npoles) { /* Degenerate segments amy appear due to import shift with bbox > 4096 */ - int contour_beg = this->contour[this->contour_count], i; + int contour_beg = self->contour[self->contour_count], i; - if (contour_beg >= this->pole_count - npoles) + if (contour_beg >= self->pole_count - npoles) return; - for (i = this->pole_count - npoles - 1; i < this->pole_count - 1; i++) - if (this->pole[i].ax != this->cx || this->pole[i].ay != this->cy) + for (i = self->pole_count - npoles - 1; i < self->pole_count - 1; i++) + if (self->pole[i].ax != self->cx || self->pole[i].ay != self->cy) return; - this->pole_count -= npoles; + self->pole_count -= npoles; } -int t1_hinter__rlineto(t1_hinter * this, fixed xx, fixed yy) +int t1_hinter__rlineto(t1_hinter * self, fixed xx, fixed yy) { - t1_hinter__adjust_matrix_precision(this, xx, yy); - if (this->pass_through) { - t1_glyph_space_coord gx = this->cx += xx; - t1_glyph_space_coord gy = this->cy += yy; + t1_hinter__adjust_matrix_precision(self, xx, yy); + if (self->pass_through) { + t1_glyph_space_coord gx = self->cx += xx; + t1_glyph_space_coord gy = self->cy += yy; fixed fx, fy; - vd_lineto(this->cx, this->cy); - this->path_opened = true; - g2d(this, gx, gy, &fx, &fy); - return gx_path_add_line(this->output_path, fx, fy); + vd_lineto(self->cx, self->cy); + self->path_opened = true; + g2d(self, gx, gy, &fx, &fy); + return gx_path_add_line(self->output_path, fx, fy); } else { - int code = t1_hinter__add_pole(this, xx, yy, oncurve); + int code = t1_hinter__add_pole(self, xx, yy, oncurve); if (code < 0) return code; - vd_lineto(this->cx, this->cy); - t1_hinter__skip_degenerate_segnment(this, 1); + vd_lineto(self->cx, self->cy); + t1_hinter__skip_degenerate_segnment(self, 1); return 0; } } -int t1_hinter__rcurveto(t1_hinter * this, fixed xx0, fixed yy0, fixed xx1, fixed yy1, fixed xx2, fixed yy2) +int t1_hinter__rcurveto(t1_hinter * self, fixed xx0, fixed yy0, fixed xx1, fixed yy1, fixed xx2, fixed yy2) { - t1_hinter__adjust_matrix_precision(this, xx0, yy0); - t1_hinter__adjust_matrix_precision(this, xx1, yy1); - t1_hinter__adjust_matrix_precision(this, xx2, yy2); - if (this->pass_through) { - t1_glyph_space_coord gx0 = this->cx += xx0; - t1_glyph_space_coord gy0 = this->cy += yy0; - t1_glyph_space_coord gx1 = this->cx += xx1; - t1_glyph_space_coord gy1 = this->cy += yy1; - t1_glyph_space_coord gx2 = this->cx += xx2; - t1_glyph_space_coord gy2 = this->cy += yy2; + t1_hinter__adjust_matrix_precision(self, xx0, yy0); + t1_hinter__adjust_matrix_precision(self, xx1, yy1); + t1_hinter__adjust_matrix_precision(self, xx2, yy2); + if (self->pass_through) { + t1_glyph_space_coord gx0 = self->cx += xx0; + t1_glyph_space_coord gy0 = self->cy += yy0; + t1_glyph_space_coord gx1 = self->cx += xx1; + t1_glyph_space_coord gy1 = self->cy += yy1; + t1_glyph_space_coord gx2 = self->cx += xx2; + t1_glyph_space_coord gy2 = self->cy += yy2; fixed fx0, fy0, fx1, fy1, fx2, fy2; vd_curveto(gx0, gy0, gx1, gy1, gx2, gy2); - this->path_opened = true; - g2d(this, gx0, gy0, &fx0, &fy0); - g2d(this, gx1, gy1, &fx1, &fy1); - g2d(this, gx2, gy2, &fx2, &fy2); - return gx_path_add_curve(this->output_path, fx0, fy0, fx1, fy1, fx2, fy2); + self->path_opened = true; + g2d(self, gx0, gy0, &fx0, &fy0); + g2d(self, gx1, gy1, &fx1, &fy1); + g2d(self, gx2, gy2, &fx2, &fy2); + return gx_path_add_curve(self->output_path, fx0, fy0, fx1, fy1, fx2, fy2); } else { int code; - code = t1_hinter__add_pole(this, xx0, yy0, offcurve); + code = t1_hinter__add_pole(self, xx0, yy0, offcurve); if (code < 0) return code; - code = t1_hinter__add_pole(this, xx1, yy1, offcurve); + code = t1_hinter__add_pole(self, xx1, yy1, offcurve); if (code < 0) return code; - code = t1_hinter__add_pole(this, xx2, yy2, oncurve); + code = t1_hinter__add_pole(self, xx2, yy2, oncurve); if (code < 0) return code; - vd_curveto(this->pole[this->pole_count - 3].gx, this->pole[this->pole_count - 3].gy, - this->pole[this->pole_count - 2].gx, this->pole[this->pole_count - 2].gy, - this->cx, this->cy); - t1_hinter__skip_degenerate_segnment(this, 3); + vd_curveto(self->pole[self->pole_count - 3].gx, self->pole[self->pole_count - 3].gy, + self->pole[self->pole_count - 2].gx, self->pole[self->pole_count - 2].gy, + self->cx, self->cy); + t1_hinter__skip_degenerate_segnment(self, 3); return 0; } } -void t1_hinter__setcurrentpoint(t1_hinter * this, fixed xx, fixed yy) +void t1_hinter__setcurrentpoint(t1_hinter * self, fixed xx, fixed yy) { - t1_hinter__adjust_matrix_precision(this, xx, yy); - if (this->FontType != 2) { + t1_hinter__adjust_matrix_precision(self, xx, yy); + if (self->FontType != 2) { /* We use this function to set a subglyph origin for composite glyphs in Type 2 fonts. */ - this->cx = xx; - this->cy = yy; - } else if (this->cx != xx || this->cy != yy) { + self->cx = xx; + self->cy = yy; + } else if (self->cx != xx || self->cy != yy) { /* Type 1 spec reads : "The setcurrentpoint command is used only in conjunction with results from OtherSubrs procedures." We guess that such cases don't cause a real coordinate change @@ -1355,206 +1355,206 @@ setcurrentpoint immediately before moveto, with no conjunction with OtherSubrs. (The check above is debug purpose only.) */ - this->cx = xx; - this->cy = yy; + self->cx = xx; + self->cy = yy; } } -int t1_hinter__closepath(t1_hinter * this) -{ if (this->pass_through) { - vd_lineto(this->bx, this->by); - this->path_opened = false; - return gx_path_close_subpath(this->output_path); +int t1_hinter__closepath(t1_hinter * self) +{ if (self->pass_through) { + vd_lineto(self->bx, self->by); + self->path_opened = false; + return gx_path_close_subpath(self->output_path); } else { - int contour_beg = this->contour[this->contour_count], code; + int contour_beg = self->contour[self->contour_count], code; - if (contour_beg == this->pole_count) + if (contour_beg == self->pole_count) return 0; /* maybe a single trailing moveto */ - if (vd_enabled && (VD_DRAW_IMPORT || this->pass_through)) { + if (vd_enabled && (VD_DRAW_IMPORT || self->pass_through)) { vd_setcolor(VD_IMPORT_COLOR); vd_setlinewidth(0); - vd_lineto(this->bx, this->by); + vd_lineto(self->bx, self->by); } - if (this->bx == this->cx && this->by == this->cy) { + if (self->bx == self->cx && self->by == self->cy) { /* Don't create degenerate segment */ - this->pole[this->pole_count - 1].type = closepath; + self->pole[self->pole_count - 1].type = closepath; } else { - t1_glyph_space_coord cx = this->cx, cy = this->cy; + t1_glyph_space_coord cx = self->cx, cy = self->cy; - this->cx = this->bx; - this->cy = this->by; - code = t1_hinter__add_pole(this, 0, 0, closepath); + self->cx = self->bx; + self->cy = self->by; + code = t1_hinter__add_pole(self, 0, 0, closepath); if (code < 0) return code; - this->cx = cx; - this->cy = cy; + self->cx = cx; + self->cy = cy; } - this->contour_count++; - if (this->contour_count >= this->max_contour_count) - if(t1_hinter__realloc_array(this->memory, (void **)&this->contour, this->contour0, &this->max_contour_count, - sizeof(this->contour0) / count_of(this->contour0), T1_MAX_CONTOURS, s_contour_array)) + self->contour_count++; + if (self->contour_count >= self->max_contour_count) + if(t1_hinter__realloc_array(self->memory, (void **)&self->contour, self->contour0, &self->max_contour_count, + sizeof(self->contour0) / count_of(self->contour0), T1_MAX_CONTOURS, s_contour_array)) return_error(gs_error_VMerror); - this->contour[this->contour_count] = this->pole_count; + self->contour[self->contour_count] = self->pole_count; return 0; } } -int t1_hinter__end_subglyph(t1_hinter * this) +int t1_hinter__end_subglyph(t1_hinter * self) { - if (this->pass_through) + if (self->pass_through) return 0; - this->subglyph_count++; - if (this->subglyph_count >= this->max_subglyph_count) - if(t1_hinter__realloc_array(this->memory, (void **)&this->subglyph, this->subglyph0, &this->max_subglyph_count, - sizeof(this->subglyph0) / count_of(this->subglyph0), T1_MAX_SUBGLYPHS, s_subglyph_array)) + self->subglyph_count++; + if (self->subglyph_count >= self->max_subglyph_count) + if(t1_hinter__realloc_array(self->memory, (void **)&self->subglyph, self->subglyph0, &self->max_subglyph_count, + sizeof(self->subglyph0) / count_of(self->subglyph0), T1_MAX_SUBGLYPHS, s_subglyph_array)) return_error(gs_error_VMerror); - this->subglyph[this->subglyph_count] = this->contour_count; + self->subglyph[self->subglyph_count] = self->contour_count; return 0; } -static inline int t1_hinter__can_add_hint(t1_hinter * this, t1_hint **hint) -{ if (this->hint_count >= this->max_hint_count) - if(t1_hinter__realloc_array(this->memory, (void **)&this->hint, this->hint0, &this->max_hint_count, - sizeof(this->hint0) / count_of(this->hint0), T1_MAX_HINTS, s_hint_array)) +static inline int t1_hinter__can_add_hint(t1_hinter * self, t1_hint **hint) +{ if (self->hint_count >= self->max_hint_count) + if(t1_hinter__realloc_array(self->memory, (void **)&self->hint, self->hint0, &self->max_hint_count, + sizeof(self->hint0) / count_of(self->hint0), T1_MAX_HINTS, s_hint_array)) return_error(gs_error_VMerror); - *hint = &this->hint[this->hint_count]; + *hint = &self->hint[self->hint_count]; return 0; } -int t1_hinter__flex_beg(t1_hinter * this) -{ if (this->flex_count != 0) +int t1_hinter__flex_beg(t1_hinter * self) +{ if (self->flex_count != 0) return_error(gs_error_invalidfont); - this->flex_count++; - this->have_flex = true; - if (this->pass_through) - return t1_hinter__rmoveto(this, 0, 0); + self->flex_count++; + self->have_flex = true; + if (self->pass_through) + return t1_hinter__rmoveto(self, 0, 0); return 0; } -int t1_hinter__flex_point(t1_hinter * this) -{ if (this->flex_count == 0) +int t1_hinter__flex_point(t1_hinter * self) +{ if (self->flex_count == 0) return_error(gs_error_invalidfont); - this->flex_count++; + self->flex_count++; return 0; } -int t1_hinter__flex_end(t1_hinter * this, fixed flex_height) +int t1_hinter__flex_end(t1_hinter * self, fixed flex_height) { t1_pole *pole0, *pole1, *pole4; t1_hinter_space_coord ox, oy; - const int32_t div_x = this->g2o_fraction << this->log2_pixels_x; - const int32_t div_y = this->g2o_fraction << this->log2_pixels_y; + const int32_t div_x = self->g2o_fraction << self->log2_pixels_x; + const int32_t div_y = self->g2o_fraction << self->log2_pixels_y; - if (this->flex_count != 8) + if (self->flex_count != 8) return_error(gs_error_invalidfont); /* We've got 8 poles accumulated in pole array. */ - pole0 = &this->pole[this->pole_count - 8]; - pole1 = &this->pole[this->pole_count - 7]; - pole4 = &this->pole[this->pole_count - 4]; - g2o(this, pole4->gx - pole1->gx, pole4->gy - pole1->gy, &ox, &oy); + pole0 = &self->pole[self->pole_count - 8]; + pole1 = &self->pole[self->pole_count - 7]; + pole4 = &self->pole[self->pole_count - 4]; + g2o(self, pole4->gx - pole1->gx, pole4->gy - pole1->gy, &ox, &oy); if (any_abs(ox) > div_x * fixed2float(flex_height) / 100 || any_abs(oy) > div_y * fixed2float(flex_height) / 100) { /* do with curves */ vd_moveto (pole0[0].gx, pole0[0].gy); vd_curveto(pole0[2].gx, pole0[2].gy, pole0[3].gx, pole0[3].gy, pole0[4].gx, pole0[4].gy); vd_curveto(pole0[5].gx, pole0[5].gy, pole0[6].gx, pole0[6].gy, pole0[7].gx, pole0[7].gy); - if (this->pass_through) { + if (self->pass_through) { fixed fx0, fy0, fx1, fy1, fx2, fy2; int code; - g2d(this, pole0[2].gx, pole0[2].gy, &fx0, &fy0); - g2d(this, pole0[3].gx, pole0[3].gy, &fx1, &fy1); - g2d(this, pole0[4].gx, pole0[4].gy, &fx2, &fy2); - code = gx_path_add_curve(this->output_path, fx0, fy0, fx1, fy1, fx2, fy2); + g2d(self, pole0[2].gx, pole0[2].gy, &fx0, &fy0); + g2d(self, pole0[3].gx, pole0[3].gy, &fx1, &fy1); + g2d(self, pole0[4].gx, pole0[4].gy, &fx2, &fy2); + code = gx_path_add_curve(self->output_path, fx0, fy0, fx1, fy1, fx2, fy2); if (code < 0) return code; - g2d(this, pole0[5].gx, pole0[5].gy, &fx0, &fy0); - g2d(this, pole0[6].gx, pole0[6].gy, &fx1, &fy1); - g2d(this, pole0[7].gx, pole0[7].gy, &fx2, &fy2); - this->flex_count = 0; - this->pole_count = 0; - return gx_path_add_curve(this->output_path, fx0, fy0, fx1, fy1, fx2, fy2); + g2d(self, pole0[5].gx, pole0[5].gy, &fx0, &fy0); + g2d(self, pole0[6].gx, pole0[6].gy, &fx1, &fy1); + g2d(self, pole0[7].gx, pole0[7].gy, &fx2, &fy2); + self->flex_count = 0; + self->pole_count = 0; + return gx_path_add_curve(self->output_path, fx0, fy0, fx1, fy1, fx2, fy2); } else { - memmove(pole1, pole1 + 1, (sizeof(this->pole0) / count_of(this->pole0)) * 7); + memmove(pole1, pole1 + 1, (sizeof(self->pole0) / count_of(self->pole0)) * 7); pole0[1].type = pole0[2].type = offcurve; pole0[3].type = oncurve; pole0[4].type = pole0[5].type = offcurve; pole0[6].type = oncurve; - this->pole_count--; + self->pole_count--; } } else { /* do with line */ vd_moveto(pole0[0].gx, pole0[0].gy); vd_lineto(pole0[7].gx, pole0[7].gy); - if (this->pass_through) { + if (self->pass_through) { fixed fx, fy; - g2d(this, pole0[7].gx, pole0[7].gy, &fx, &fy); - this->flex_count = 0; - this->pole_count = 0; - return gx_path_add_line(this->output_path, fx, fy); + g2d(self, pole0[7].gx, pole0[7].gy, &fx, &fy); + self->flex_count = 0; + self->pole_count = 0; + return gx_path_add_line(self->output_path, fx, fy); } else { pole0[1] = pole0[7]; pole0[1].type = oncurve; - this->pole_count -= 6; + self->pole_count -= 6; } } - this->flex_count = 0; + self->flex_count = 0; return 0; } -static inline int t1_hinter__can_add_hint_range(t1_hinter * this, t1_hint_range **hint_range) -{ if (this->hint_range_count >= this->max_hint_range_count) - if(t1_hinter__realloc_array(this->memory, (void **)&this->hint_range, this->hint_range0, &this->max_hint_range_count, - sizeof(this->hint_range0) / count_of(this->hint_range0), T1_MAX_HINTS, s_hint_range_array)) +static inline int t1_hinter__can_add_hint_range(t1_hinter * self, t1_hint_range **hint_range) +{ if (self->hint_range_count >= self->max_hint_range_count) + if(t1_hinter__realloc_array(self->memory, (void **)&self->hint_range, self->hint_range0, &self->max_hint_range_count, + sizeof(self->hint_range0) / count_of(self->hint_range0), T1_MAX_HINTS, s_hint_range_array)) return_error(gs_error_VMerror); - *hint_range = &this->hint_range[this->hint_range_count]; + *hint_range = &self->hint_range[self->hint_range_count]; return 0; } -static inline int t1_hinter__can_add_hint_applying(t1_hinter * this, t1_hint_applying **hint_applying) -{ if (this->hint_applying_count >= this->max_hint_applying_count) - if(t1_hinter__realloc_array(this->memory, (void **)&this->hint_applying, this->hint_applying0, &this->max_hint_applying_count, - sizeof(this->hint_applying0) / count_of(this->hint_applying0), T1_MAX_HINTS, s_hint_applying_array)) +static inline int t1_hinter__can_add_hint_applying(t1_hinter * self, t1_hint_applying **hint_applying) +{ if (self->hint_applying_count >= self->max_hint_applying_count) + if(t1_hinter__realloc_array(self->memory, (void **)&self->hint_applying, self->hint_applying0, &self->max_hint_applying_count, + sizeof(self->hint_applying0) / count_of(self->hint_applying0), T1_MAX_HINTS, s_hint_applying_array)) return_error(gs_error_VMerror); - *hint_applying = &this->hint_applying[this->hint_applying_count]; + *hint_applying = &self->hint_applying[self->hint_applying_count]; return 0; } -int t1_hinter__hint_mask(t1_hinter * this, byte *mask) +int t1_hinter__hint_mask(t1_hinter * self, byte *mask) { int hint_count, i; - if (this->disable_hinting) + if (self->disable_hinting) return 0; - hint_count = this->hint_count; + hint_count = self->hint_count; for(i = 0; i < hint_count; i++) { bool activate = (mask != NULL && (mask[i >> 3] & (0x80 >> (i & 7))) != 0); - t1_hint *hint = &this->hint[i]; + t1_hint *hint = &self->hint[i]; if (activate) { if (hint->range_index != -1 && - (this->hint_range[hint->range_index].end_pole == -1 || - this->hint_range[hint->range_index].end_pole == this->pole_count)) { + (self->hint_range[hint->range_index].end_pole == -1 || + self->hint_range[hint->range_index].end_pole == self->pole_count)) { /* continie the range */ - this->hint_range[hint->range_index].end_pole = -1; + self->hint_range[hint->range_index].end_pole = -1; } else { /* add new range */ t1_hint_range *hint_range; - int code = t1_hinter__can_add_hint_range(this, &hint_range); + int code = t1_hinter__can_add_hint_range(self, &hint_range); if (code < 0) return code; - hint_range->beg_pole = this->pole_count; + hint_range->beg_pole = self->pole_count; hint_range->end_pole = -1; hint_range->next = hint->range_index; - hint->range_index = this->hint_range_count; - this->hint_range_count++; + hint->range_index = self->hint_range_count; + self->hint_range_count++; } } else { if (hint->range_index != -1 && - this->hint_range[hint->range_index].end_pole == -1) { + self->hint_range[hint->range_index].end_pole == -1) { /* deactivate */ - this->hint_range[hint->range_index].end_pole = this->pole_count; + self->hint_range[hint->range_index].end_pole = self->pole_count; } else DO_NOTHING; } @@ -1562,33 +1562,33 @@ return 0; } -int t1_hinter__drop_hints(t1_hinter * this) -{ if (this->disable_hinting) +int t1_hinter__drop_hints(t1_hinter * self) +{ if (self->disable_hinting) return 0; - if (this->primary_hint_count == -1) - this->primary_hint_count = this->hint_range_count; - return t1_hinter__hint_mask(this, NULL); + if (self->primary_hint_count == -1) + self->primary_hint_count = self->hint_range_count; + return t1_hinter__hint_mask(self, NULL); } -static inline int t1_hinter__stem(t1_hinter * this, enum t1_hint_type type, unsigned short stem3_index +static inline int t1_hinter__stem(t1_hinter * self, enum t1_hint_type type, unsigned short stem3_index , fixed v0, fixed v1, int side_mask) { t1_hint *hint; - t1_glyph_space_coord s = (type == hstem ? this->subglyph_orig_gy : this->subglyph_orig_gx); + t1_glyph_space_coord s = (type == hstem ? self->subglyph_orig_gy : self->subglyph_orig_gx); t1_glyph_space_coord g0 = s + v0; t1_glyph_space_coord g1 = s + v0 + v1; t1_hint_range *range; int i, code; - t1_hinter__adjust_matrix_precision(this, (side_mask & 1 ? g0 : g1), (side_mask & 2 ? g1 : g0)); - for (i = 0; i < this->hint_count; i++) - if (this->hint[i].type == type && - this->hint[i].g0 == g0 && this->hint[i].g1 == g1 && - this->hint[i].side_mask == side_mask) + t1_hinter__adjust_matrix_precision(self, (side_mask & 1 ? g0 : g1), (side_mask & 2 ? g1 : g0)); + for (i = 0; i < self->hint_count; i++) + if (self->hint[i].type == type && + self->hint[i].g0 == g0 && self->hint[i].g1 == g1 && + self->hint[i].side_mask == side_mask) break; - if (i < this->hint_count) - hint = &this->hint[i]; + if (i < self->hint_count) + hint = &self->hint[i]; else { - code = t1_hinter__can_add_hint(this, &hint); + code = t1_hinter__can_add_hint(self, &hint); if (code < 0) return code; hint->type = type; @@ -1603,107 +1603,107 @@ hint->stem_snap_index0 = hint->stem_snap_index1 = 0; hint->boundary_length0 = hint->boundary_length1 = 0; } - code = t1_hinter__can_add_hint_range(this, &range); + code = t1_hinter__can_add_hint_range(self, &range); if (code < 0) return code; - range->beg_pole = this->pole_count; + range->beg_pole = self->pole_count; range->end_pole = -1; range->next = hint->range_index; - hint->range_index = range - this->hint_range; - if (i >= this->hint_count) - this->hint_count++; - this->hint_range_count++; + hint->range_index = range - self->hint_range; + if (i >= self->hint_count) + self->hint_count++; + self->hint_range_count++; return 0; } -int t1_hinter__dotsection(t1_hinter * this) -{ if (this->pole_count == 0 || this->pole[this->pole_count - 1].type != moveto) +int t1_hinter__dotsection(t1_hinter * self) +{ if (self->pole_count == 0 || self->pole[self->pole_count - 1].type != moveto) return 0; /* We store beginning dotsection hints only. */ - if (this->disable_hinting) + if (self->disable_hinting) return 0; - return t1_hinter__stem(this, dot, 0, 0, 0, 0); + return t1_hinter__stem(self, dot, 0, 0, 0, 0); } -int t1_hinter__hstem(t1_hinter * this, fixed x0, fixed x1) -{ if (this->disable_hinting) +int t1_hinter__hstem(t1_hinter * self, fixed x0, fixed x1) +{ if (self->disable_hinting) return 0; - return t1_hinter__stem(this, hstem, 0, x0, x1, 3); + return t1_hinter__stem(self, hstem, 0, x0, x1, 3); } -int t1_hinter__overall_hstem(t1_hinter * this, fixed x0, fixed x1, int side_mask) +int t1_hinter__overall_hstem(t1_hinter * self, fixed x0, fixed x1, int side_mask) { /* True Type autohinting only. */ - if (this->disable_hinting) + if (self->disable_hinting) return 0; - return t1_hinter__stem(this, hstem, 0, x0, x1, side_mask); + return t1_hinter__stem(self, hstem, 0, x0, x1, side_mask); } -int t1_hinter__vstem(t1_hinter * this, fixed y0, fixed y1) -{ if (this->disable_hinting) +int t1_hinter__vstem(t1_hinter * self, fixed y0, fixed y1) +{ if (self->disable_hinting) return 0; - return t1_hinter__stem(this, vstem, 0, y0, y1, 3); + return t1_hinter__stem(self, vstem, 0, y0, y1, 3); } -int t1_hinter__hstem3(t1_hinter * this, fixed x0, fixed x1, fixed x2, fixed x3, fixed x4, fixed x5) +int t1_hinter__hstem3(t1_hinter * self, fixed x0, fixed x1, fixed x2, fixed x3, fixed x4, fixed x5) { int code; - if (this->disable_hinting) + if (self->disable_hinting) return 0; - code = t1_hinter__stem(this, hstem, 1, x0, x1, 3); + code = t1_hinter__stem(self, hstem, 1, x0, x1, 3); if (code < 0) return code; - code = t1_hinter__stem(this, hstem, 2, x2, x3, 3); + code = t1_hinter__stem(self, hstem, 2, x2, x3, 3); if (code < 0) return code; - return t1_hinter__stem(this, hstem, 3, x4, x5, 3); + return t1_hinter__stem(self, hstem, 3, x4, x5, 3); } -int t1_hinter__vstem3(t1_hinter * this, fixed y0, fixed y1, fixed y2, fixed y3, fixed y4, fixed y5) +int t1_hinter__vstem3(t1_hinter * self, fixed y0, fixed y1, fixed y2, fixed y3, fixed y4, fixed y5) { int code; - if (this->disable_hinting) + if (self->disable_hinting) return 0; - code = t1_hinter__stem(this, vstem, 1, y0, y1, 3); + code = t1_hinter__stem(self, vstem, 1, y0, y1, 3); if (code < 0) return code; - code = t1_hinter__stem(this, vstem, 2, y2, y3, 3); + code = t1_hinter__stem(self, vstem, 2, y2, y3, 3); if (code < 0) return code; - return t1_hinter__stem(this, vstem, 3, y4, y5, 3); + return t1_hinter__stem(self, vstem, 3, y4, y5, 3); } /* --------------------- t1_hinter class members - accessories --------------------*/ -int t1_hinter__is_x_fitting(t1_hinter * this) -{ return this->grid_fit_x; +int t1_hinter__is_x_fitting(t1_hinter * self) +{ return self->grid_fit_x; } /* --------------------- t1_hinter class members - the hinting --------------------*/ -static inline int t1_hinter__segment_beg(t1_hinter * this, int pole_index) -{ int contour_index = this->pole[pole_index].contour_index; - int beg_contour_pole = this->contour[contour_index]; - int end_contour_pole = this->contour[contour_index + 1] - 2; +static inline int t1_hinter__segment_beg(t1_hinter * self, int pole_index) +{ int contour_index = self->pole[pole_index].contour_index; + int beg_contour_pole = self->contour[contour_index]; + int end_contour_pole = self->contour[contour_index + 1] - 2; int prev = ranger_step_b(pole_index, beg_contour_pole, end_contour_pole); - while (this->pole[prev].type == offcurve) + while (self->pole[prev].type == offcurve) prev = ranger_step_b(prev, beg_contour_pole, end_contour_pole); return prev; } -static inline int t1_hinter__segment_end(t1_hinter * this, int pole_index) -{ int contour_index = this->pole[pole_index].contour_index; - int beg_contour_pole = this->contour[contour_index]; - int end_contour_pole = this->contour[contour_index + 1] - 2; +static inline int t1_hinter__segment_end(t1_hinter * self, int pole_index) +{ int contour_index = self->pole[pole_index].contour_index; + int beg_contour_pole = self->contour[contour_index]; + int end_contour_pole = self->contour[contour_index + 1] - 2; int next = ranger_step_f(pole_index, beg_contour_pole, end_contour_pole); - while (this->pole[next].type == offcurve) + while (self->pole[next].type == offcurve) next = ranger_step_f(next, beg_contour_pole, end_contour_pole); return next; } -static void t1_hinter__compute_y_span(t1_hinter * this) +static void t1_hinter__compute_y_span(t1_hinter * self) { - int n = this->pole_count - 1; + int n = self->pole_count - 1; int i; if (n > 1) { @@ -1716,86 +1716,86 @@ } else if (n < 0) { return; /* empty glyph */ } - this->ymin = this->ymax = this->pole[0].gy; + self->ymin = self->ymax = self->pole[0].gy; for (i = 1; i < n; i++) { - if (this->ymin > this->pole[i].gy) - this->ymin = this->pole[i].gy; - if (this->ymax < this->pole[i].gy) - this->ymax = this->pole[i].gy; + if (self->ymin > self->pole[i].gy) + self->ymin = self->pole[i].gy; + if (self->ymax < self->pole[i].gy) + self->ymax = self->pole[i].gy; } - this->ymid = (this->ymax + this->ymin) / 2; + self->ymid = (self->ymax + self->ymin) / 2; } -static void t1_hinter__simplify_representation(t1_hinter * this) +static void t1_hinter__simplify_representation(t1_hinter * self) { int i, j; - int last_pole = this->pole_count - 1; - int primary_hint_count = this->primary_hint_count; + int last_pole = self->pole_count - 1; + int primary_hint_count = self->primary_hint_count; - if (last_pole > 1 && this->pole[last_pole -1].type == closepath) + if (last_pole > 1 && self->pole[last_pole -1].type == closepath) last_pole -= 2; /* Skip the trailing moveto. */ - if (this->pole_count <= 1) + if (self->pole_count <= 1) return; /* An empty glyph (only a trailing moveto). */ /* Remove hints which are disabled with !grid_fit_x, !grid_fit_y. * We can't do before import is completed due to hint mask commands. */ - if (!this->grid_fit_x || !this->grid_fit_y) { - for (i = j = 0; i < this->hint_count; i++) - if ((this->hint[i].type == vstem && !this->grid_fit_x) || - (this->hint[i].type == hstem && !this->grid_fit_y)) { + if (!self->grid_fit_x || !self->grid_fit_y) { + for (i = j = 0; i < self->hint_count; i++) + if ((self->hint[i].type == vstem && !self->grid_fit_x) || + (self->hint[i].type == hstem && !self->grid_fit_y)) { if (i < primary_hint_count) - this->primary_hint_count--; + self->primary_hint_count--; continue; /* skip it. */ } else { if (i != j) /* for Valgrind */ - this->hint[j] = this->hint[i]; + self->hint[j] = self->hint[i]; j++; } - this->hint_count = j; + self->hint_count = j; } - for (i = 0; i < this->hint_range_count; i++) { - t1_hint_range *hint_range = &this->hint_range[i]; + for (i = 0; i < self->hint_range_count; i++) { + t1_hint_range *hint_range = &self->hint_range[i]; j = hint_range->beg_pole; - if (this->pole[j].type == closepath) + if (self->pole[j].type == closepath) hint_range->beg_pole = ++j; else { - if (this->pole[j].type == offcurve) + if (self->pole[j].type == offcurve) hint_range->beg_pole = --j; - if (this->pole[j].type == offcurve) + if (self->pole[j].type == offcurve) hint_range->beg_pole = --j; } j = hint_range->end_pole; if (j == -1) hint_range->end_pole = j = last_pole; - if (this->pole[j].type == offcurve) + if (self->pole[j].type == offcurve) hint_range->end_pole = ++j; - if (this->pole[j].type == offcurve) + if (self->pole[j].type == offcurve) hint_range->end_pole = ++j; } /* moveto's were needed to decode path correctly. We don't need them so far. Replace 'moveto' with 'oncurve' : */ - for (i = 0; i <= this->contour_count; i++) - if (this->pole[this->contour[i]].type == moveto) - this->pole[this->contour[i]].type = oncurve; + for (i = 0; i <= self->contour_count; i++) + if (self->pole[self->contour[i]].type == moveto) + self->pole[self->contour[i]].type = oncurve; /* After the decoding, hint commands refer to the last pole before HR occures. Move pointers to the beginning segment pole. */ - for (j = 0; j < this->hint_range_count; j++) { - int beg_pole = this->hint_range[j].beg_pole; - int contour_index = this->pole[beg_pole].contour_index; - int contour_beg_pole = this->contour[contour_index]; + for (j = 0; j < self->hint_range_count; j++) { + int beg_pole = self->hint_range[j].beg_pole; + int contour_index = self->pole[beg_pole].contour_index; + int contour_beg_pole = self->contour[contour_index]; if (beg_pole > contour_beg_pole && beg_pole < last_pole) - this->hint_range[j].beg_pole = t1_hinter__segment_beg(this, beg_pole); + self->hint_range[j].beg_pole = t1_hinter__segment_beg(self, beg_pole); } } -static inline bool t1_hinter__is_small_angle(t1_hinter * this, int pole_index0, int pole_index1, +static inline bool t1_hinter__is_small_angle(t1_hinter * self, int pole_index0, int pole_index1, long tan_x, long tan_y, int alpha, int alpha_div, int *quality) -{ long gx = this->pole[pole_index1].gx - this->pole[pole_index0].gx; - long gy = this->pole[pole_index1].gy - this->pole[pole_index0].gy; +{ long gx = self->pole[pole_index1].gx - self->pole[pole_index0].gx; + long gy = self->pole[pole_index1].gy - self->pole[pole_index0].gy; long vp = mul_shift(gx, tan_y, _fixed_shift) - mul_shift(gy, tan_x, _fixed_shift); long sp = mul_shift(gx, tan_x, _fixed_shift) + mul_shift(gy, tan_y, _fixed_shift); long vp1 = any_abs(vp), sp1 = any_abs(sp); @@ -1816,13 +1816,13 @@ return true; } -static inline bool t1_hinter__is_conjugated(t1_hinter * this, int pole_index) -{ int prev = t1_hinter__segment_beg(this, pole_index); - int next = t1_hinter__segment_end(this, pole_index); - long gx0 = this->pole[prev].gx - this->pole[pole_index].gx; - long gy0 = this->pole[prev].gy - this->pole[pole_index].gy; - long gx1 = this->pole[next].gx - this->pole[pole_index].gx; - long gy1 = this->pole[next].gy - this->pole[pole_index].gy; +static inline bool t1_hinter__is_conjugated(t1_hinter * self, int pole_index) +{ int prev = t1_hinter__segment_beg(self, pole_index); + int next = t1_hinter__segment_end(self, pole_index); + long gx0 = self->pole[prev].gx - self->pole[pole_index].gx; + long gy0 = self->pole[prev].gy - self->pole[pole_index].gy; + long gx1 = self->pole[next].gx - self->pole[pole_index].gx; + long gy1 = self->pole[next].gy - self->pole[pole_index].gy; long vp = gx0 * gy1 - gy0 * gx1; long sp = gx0 * gy1 - gy0 * gx1; @@ -1833,47 +1833,47 @@ return any_abs(vp) < -sp / 1000; /* The threshold is taken from scratch. */ } -static inline bool t1_hinter__next_contour_pole(t1_hinter * this, int pole_index) -{ int contour_index = this->pole[pole_index].contour_index; - int beg_contour_pole = this->contour[contour_index]; - int end_contour_pole = this->contour[contour_index + 1] - 2; +static inline bool t1_hinter__next_contour_pole(t1_hinter * self, int pole_index) +{ int contour_index = self->pole[pole_index].contour_index; + int beg_contour_pole = self->contour[contour_index]; + int end_contour_pole = self->contour[contour_index + 1] - 2; return ranger_step_f(pole_index, beg_contour_pole, end_contour_pole); } -static inline bool t1_hinter__is_good_tangent(t1_hinter * this, int pole_index, long tan_x, long tan_y, int *quality) -{ int contour_index = this->pole[pole_index].contour_index; - int beg_contour_pole = this->contour[contour_index]; - int end_contour_pole = this->contour[contour_index + 1] - 2, prev, next; +static inline bool t1_hinter__is_good_tangent(t1_hinter * self, int pole_index, long tan_x, long tan_y, int *quality) +{ int contour_index = self->pole[pole_index].contour_index; + int beg_contour_pole = self->contour[contour_index]; + int end_contour_pole = self->contour[contour_index + 1] - 2, prev, next; int const alpha = 9, alpha_div = 10; int quality0, quality1; bool good0, good1; prev = ranger_step_b(pole_index, beg_contour_pole, end_contour_pole); - good0 = t1_hinter__is_small_angle(this, prev, pole_index, tan_x, tan_y, alpha, alpha_div, &quality0); + good0 = t1_hinter__is_small_angle(self, prev, pole_index, tan_x, tan_y, alpha, alpha_div, &quality0); if (quality0 == 0) { *quality = 0; return true; } next = ranger_step_f(pole_index, beg_contour_pole, end_contour_pole); - good1 = t1_hinter__is_small_angle(this, next, pole_index, tan_x, tan_y, alpha, alpha_div, &quality1); + good1 = t1_hinter__is_small_angle(self, next, pole_index, tan_x, tan_y, alpha, alpha_div, &quality1); *quality = min(quality0, quality1); return good0 || good1; } -static void t1_hinter__compute_type1_stem_ranges(t1_hinter * this) +static void t1_hinter__compute_type1_stem_ranges(t1_hinter * self) { int j; - int end_range_pole = this->pole_count - 3; - int primary_hint_count = this->primary_hint_count; + int end_range_pole = self->pole_count - 3; + int primary_hint_count = self->primary_hint_count; - if (this->hint_count == 0) + if (self->hint_count == 0) return; if (primary_hint_count == -1) - primary_hint_count = this->hint_range_count; + primary_hint_count = self->hint_range_count; /* Process primary hints - ranges are entire glyph : */ for(j = 0; j < primary_hint_count; j++) { - this->hint_range[j].beg_pole = 0; - this->hint_range[j].end_pole = end_range_pole; + self->hint_range[j].beg_pole = 0; + self->hint_range[j].end_pole = end_range_pole; } /* Note that ranges of primary hints may include a tail of the hint array due to multiple contours. Primary hints have a lesser priority, @@ -1881,46 +1881,46 @@ */ } -static void t1_hinter__compute_type2_stem_ranges(t1_hinter * this) +static void t1_hinter__compute_type2_stem_ranges(t1_hinter * self) { int i; - for (i = 0; i < this->hint_range_count; i++) - if (this->hint_range[i].end_pole == -1) - this->hint_range[i].end_pole = this->pole_count - 2; + for (i = 0; i < self->hint_range_count; i++) + if (self->hint_range[i].end_pole == -1) + self->hint_range[i].end_pole = self->pole_count - 2; } -static bool t1_hinter__is_stem_boundary_near(t1_hinter * this, const t1_hint *hint, +static bool t1_hinter__is_stem_boundary_near(t1_hinter * self, const t1_hint *hint, t1_glyph_space_coord g, int boundary) { - t1_glyph_space_coord const fuzz = this->blue_fuzz; /* comparefiles/tpc2.ps */ + t1_glyph_space_coord const fuzz = self->blue_fuzz; /* comparefiles/tpc2.ps */ return any_abs(g - (boundary ? hint->g1 : hint->g0)) <= fuzz; } -static int t1_hinter__is_stem_hint_applicable(t1_hinter * this, t1_hint *hint, int pole_index, int *quality) +static int t1_hinter__is_stem_hint_applicable(t1_hinter * self, t1_hint *hint, int pole_index, int *quality) { /* We don't check hint->side_mask because the unused coord should be outside the design bbox. */ int k; if (hint->type == hstem - && ((k = 1, t1_hinter__is_stem_boundary_near(this, hint, this->pole[pole_index].gy, 0)) || - (k = 2, t1_hinter__is_stem_boundary_near(this, hint, this->pole[pole_index].gy, 1))) - && t1_hinter__is_good_tangent(this, pole_index, 1, 0, quality)) + && ((k = 1, t1_hinter__is_stem_boundary_near(self, hint, self->pole[pole_index].gy, 0)) || + (k = 2, t1_hinter__is_stem_boundary_near(self, hint, self->pole[pole_index].gy, 1))) + && t1_hinter__is_good_tangent(self, pole_index, 1, 0, quality)) return k; if (hint->type == vstem - && ((k = 1, t1_hinter__is_stem_boundary_near(this, hint, this->pole[pole_index].gx, 0)) || - (k = 2, t1_hinter__is_stem_boundary_near(this, hint, this->pole[pole_index].gx, 1))) - && t1_hinter__is_good_tangent(this, pole_index, 0, 1, quality)) + && ((k = 1, t1_hinter__is_stem_boundary_near(self, hint, self->pole[pole_index].gx, 0)) || + (k = 2, t1_hinter__is_stem_boundary_near(self, hint, self->pole[pole_index].gx, 1))) + && t1_hinter__is_good_tangent(self, pole_index, 0, 1, quality)) return k; return 0; } -static t1_zone * t1_hinter__find_zone(t1_hinter * this, t1_glyph_space_coord pole_y, bool curve, bool convex, bool concave) +static t1_zone * t1_hinter__find_zone(t1_hinter * self, t1_glyph_space_coord pole_y, bool curve, bool convex, bool concave) { bool maybe_top = !curve || convex; bool maybe_bot = !curve || concave; int i; - for (i = 0; i < this->zone_count; i++) { - t1_zone *zone = &this->zone[i]; + for (i = 0; i < self->zone_count; i++) { + t1_zone *zone = &self->zone[i]; if ((maybe_top && zone->type == topzone) || (maybe_bot && zone->type == botzone)) if (zone->y_min <= pole_y && pole_y <= zone->y_max) return zone; @@ -1929,19 +1929,19 @@ /*todo: optimize narrowing the search range */ } -static void t1_hinter__align_to_grid__general(t1_hinter * this, int32_t unit, +static void t1_hinter__align_to_grid__general(t1_hinter * self, int32_t unit, t1_glyph_space_coord gx, t1_glyph_space_coord gy, t1_hinter_space_coord *pdx, t1_hinter_space_coord *pdy, bool align_to_pixels, bool absolute) { - long div_x = rshift(unit, (align_to_pixels ? (int)this->log2_pixels_x : this->log2_subpixels_x)); - long div_y = rshift(unit, (align_to_pixels ? (int)this->log2_pixels_y : this->log2_subpixels_y)); + long div_x = rshift(unit, (align_to_pixels ? (int)self->log2_pixels_x : self->log2_subpixels_x)); + long div_y = rshift(unit, (align_to_pixels ? (int)self->log2_pixels_y : self->log2_subpixels_y)); t1_hinter_space_coord ox, oy, dx, dy; - g2o(this, gx, gy, &ox, &oy); + g2o(self, gx, gy, &ox, &oy); if (absolute) { - ox += this->orig_ox; - oy += this->orig_oy; + ox += self->orig_ox; + oy += self->orig_oy; } dx = ox % div_x; dy = oy % div_y; /* So far dx and dy are 19 bits */ @@ -1957,24 +1957,24 @@ *pdy = dy; } -static void t1_hinter__align_to_grid__final(t1_hinter * this, +static void t1_hinter__align_to_grid__final(t1_hinter * self, t1_glyph_space_coord *x, t1_glyph_space_coord *y, t1_hinter_space_coord dx, t1_hinter_space_coord dy) { t1_glyph_space_coord gxd, gyd; - o2g(this, dx, dy, &gxd, &gyd); - if (this->grid_fit_x) { + o2g(self, dx, dy, &gxd, &gyd); + if (self->grid_fit_x) { *x -= gxd; *x = (*x + 7) & ~15; /* Round to suppress small noise : */ } - if (this->grid_fit_y) { + if (self->grid_fit_y) { *y -= gyd; *y = (*y + 7) & ~15; /* Round to suppress small noise : */ } } -static void t1_hinter__hint_stem_snap_range(t1_hinter * this, +static void t1_hinter__hint_stem_snap_range(t1_hinter * self, t1_glyph_space_coord w0, t1_glyph_space_coord w1, bool horiz, short *index0, short *index1) { int k = (horiz ? 0 : 1), i; @@ -1982,91 +1982,91 @@ *index0 = 0; *index1 = -1; - for (i = 0; i < this->stem_snap_count[k]; i++) { - if (w0 > this->stem_snap[k][i]) + for (i = 0; i < self->stem_snap_count[k]; i++) { + if (w0 > self->stem_snap[k][i]) continue; if (!index0_set) { index0_set = true; *index0 = i; } - if (w1 < this->stem_snap[k][i]) + if (w1 < self->stem_snap[k][i]) break; *index1 = i; } } -static void t1_hinter__align_to_grid(t1_hinter * this, int32_t unit, +static void t1_hinter__align_to_grid(t1_hinter * self, int32_t unit, t1_glyph_space_coord *x, t1_glyph_space_coord *y, bool align_to_pixels) { if (unit > 0) { t1_hinter_space_coord dx, dy; - t1_hinter__align_to_grid__general(this, unit, *x, *y, &dx, &dy, align_to_pixels, align_to_pixels); - t1_hinter__align_to_grid__final(this, x, y, dx, dy); + t1_hinter__align_to_grid__general(self, unit, *x, *y, &dx, &dy, align_to_pixels, align_to_pixels); + t1_hinter__align_to_grid__final(self, x, y, dx, dy); } } -static void t1_hinter_compute_stem_snap_range_hv(t1_hinter * this, int hv) +static void t1_hinter_compute_stem_snap_range_hv(t1_hinter * self, int hv) { const enum t1_hint_type T[] = {hstem, vstem}; int i, j; enum t1_hint_type t = T[hv]; bool horiz = (t == hstem); - t1_glyph_space_coord pixel_g = (horiz ? this->pixel_gh : this->pixel_gw); - int stem_snap_count = this->stem_snap_count[hv]; + t1_glyph_space_coord pixel_g = (horiz ? self->pixel_gh : self->pixel_gw); + int stem_snap_count = self->stem_snap_count[hv]; - memset(this->stem_snap_vote, 0, stem_snap_count * sizeof(this->stem_snap_vote[0])); - for (i = 0; i < this->hint_count; i++) { - if (this->hint[i].type == t) { - t1_glyph_space_coord gw = any_abs(this->hint[i].g1 - this->hint[i].g0); - - t1_hinter__hint_stem_snap_range(this, gw - pixel_g + 1, gw + pixel_g - 1, horiz, - &this->hint[i].stem_snap_index0, &this->hint[i].stem_snap_index1); - for (j = this->hint[i].stem_snap_index0; j <= this->hint[i].stem_snap_index1; j++) - this->stem_snap_vote[j]++; + memset(self->stem_snap_vote, 0, stem_snap_count * sizeof(self->stem_snap_vote[0])); + for (i = 0; i < self->hint_count; i++) { + if (self->hint[i].type == t) { + t1_glyph_space_coord gw = any_abs(self->hint[i].g1 - self->hint[i].g0); + + t1_hinter__hint_stem_snap_range(self, gw - pixel_g + 1, gw + pixel_g - 1, horiz, + &self->hint[i].stem_snap_index0, &self->hint[i].stem_snap_index1); + for (j = self->hint[i].stem_snap_index0; j <= self->hint[i].stem_snap_index1; j++) + self->stem_snap_vote[j]++; } } - for (i = 0; i < this->hint_count; i++) { - if (this->hint[i].type == t) { + for (i = 0; i < self->hint_count; i++) { + if (self->hint[i].type == t) { int m = 0, mj = -1, d, md = pixel_g * 2; - t1_glyph_space_coord gw = any_abs(this->hint[i].g1 - this->hint[i].g0); + t1_glyph_space_coord gw = any_abs(self->hint[i].g1 - self->hint[i].g0); - for (j = this->hint[i].stem_snap_index0; j <= this->hint[i].stem_snap_index1; j++) { - if (m < this->stem_snap_vote[j]) { - m = this->stem_snap_vote[j]; + for (j = self->hint[i].stem_snap_index0; j <= self->hint[i].stem_snap_index1; j++) { + if (m < self->stem_snap_vote[j]) { + m = self->stem_snap_vote[j]; mj = j; - md = any_abs(gw - pixel_g / 5 - this->stem_snap[hv][mj]); + md = any_abs(gw - pixel_g / 5 - self->stem_snap[hv][mj]); } else { - d = any_abs(gw - pixel_g / 5 - this->stem_snap[hv][j]); + d = any_abs(gw - pixel_g / 5 - self->stem_snap[hv][j]); if (md > d) { md = d; mj = j; } } } - this->hint[i].stem_snap_index0 = mj; + self->hint[i].stem_snap_index0 = mj; } } } -static void t1_hinter_compute_stem_snap_range(t1_hinter * this) +static void t1_hinter_compute_stem_snap_range(t1_hinter * self) { - if (this->stem_snap_count[0] > 1) - t1_hinter_compute_stem_snap_range_hv(this, 0); - if (this->stem_snap_count[1] > 1) - t1_hinter_compute_stem_snap_range_hv(this, 1); + if (self->stem_snap_count[0] > 1) + t1_hinter_compute_stem_snap_range_hv(self, 0); + if (self->stem_snap_count[1] > 1) + t1_hinter_compute_stem_snap_range_hv(self, 1); } -static void t1_hinter__align_stem_width(t1_hinter * this, t1_glyph_space_coord *pgw, const t1_hint *hint) +static void t1_hinter__align_stem_width(t1_hinter * self, t1_glyph_space_coord *pgw, const t1_hint *hint) { bool horiz = (hint->type == hstem); t1_glyph_space_coord gw = *pgw; - t1_glyph_space_coord pixel_g = (horiz ? this->pixel_gh : this->pixel_gw); + t1_glyph_space_coord pixel_g = (horiz ? self->pixel_gh : self->pixel_gw); t1_glyph_space_coord gwe; - if (!this->keep_stem_width || pixel_g == 0) + if (!self->keep_stem_width || pixel_g == 0) return; - if (hint->stem_snap_index0 >= 0 && this->stem_snap_count[horiz ? 0 : 1] > 0) { - t1_glyph_space_coord w0 = this->stem_snap[horiz ? 0 : 1][hint->stem_snap_index0]; + if (hint->stem_snap_index0 >= 0 && self->stem_snap_count[horiz ? 0 : 1] > 0) { + t1_glyph_space_coord w0 = self->stem_snap[horiz ? 0 : 1][hint->stem_snap_index0]; t1_glyph_space_coord thr0 = pixel_g * 70 / 100, thr1 = pixel_g * 35 / 100; if (gw - thr0 <= w0 && w0 <= gw + thr1) @@ -2080,7 +2080,7 @@ *pgw = gw; } -static void t1_hinter__align_stem_to_grid(t1_hinter * this, int32_t unit, +static void t1_hinter__align_stem_to_grid(t1_hinter * self, int32_t unit, t1_glyph_space_coord *x0, t1_glyph_space_coord *y0, t1_glyph_space_coord x1, t1_glyph_space_coord y1, bool align_to_pixels, const t1_hint *hint) @@ -2091,15 +2091,15 @@ t1_glyph_space_coord gw = (horiz ? y1 - *y0 : x1 - *x0); t1_glyph_space_coord GW = any_abs(gw), GW0 = GW; bool positive = (gw >= 0); - int19 cf = (horiz ? this->heigt_transform_coef_rat : this->width_transform_coef_rat); + int19 cf = (horiz ? self->heigt_transform_coef_rat : self->width_transform_coef_rat); t1_hinter_space_coord dx0, dy0, dx1, dy1, dgw; - t1_hinter__align_to_grid__general(this, unit, *x0, *y0, &dx0, &dy0, align_to_pixels, align_to_pixels); - t1_hinter__align_to_grid__general(this, unit, x1, y1, &dx1, &dy1, align_to_pixels, align_to_pixels); - t1_hinter__align_stem_width(this, &GW, hint); + t1_hinter__align_to_grid__general(self, unit, *x0, *y0, &dx0, &dy0, align_to_pixels, align_to_pixels); + t1_hinter__align_to_grid__general(self, unit, x1, y1, &dx1, &dy1, align_to_pixels, align_to_pixels); + t1_hinter__align_stem_width(self, &GW, hint); dgw = g2o_dist(GW - GW0, cf); - if ((horiz ? (!this->transposed ? this->ctmf.yy : this->ctmf.xy) - : (!this->transposed ? this->ctmf.xx : this->ctmf.yx)) < 0) + if ((horiz ? (!self->transposed ? self->ctmf.yy : self->ctmf.xy) + : (!self->transposed ? self->ctmf.xx : self->ctmf.yx)) < 0) dgw = - dgw; if (horiz) { t1_hinter_space_coord ddy1 = (positive ? dy0 - dgw : dy0 + dgw); @@ -2114,7 +2114,7 @@ if (any_abs(dx0 + ddx1) > any_abs(dx1 + ddx0)) dx0 = ddx0; } - t1_hinter__align_to_grid__final(this, x0, y0, dx0, dy0); + t1_hinter__align_to_grid__final(self, x0, y0, dx0, dy0); } } @@ -2127,27 +2127,27 @@ /* todo : exclude floating point */ } -static void t1_hinter__add_overshoot(t1_hinter * this, t1_zone * zone, t1_glyph_space_coord * x, t1_glyph_space_coord * y) +static void t1_hinter__add_overshoot(t1_hinter * self, t1_zone * zone, t1_glyph_space_coord * x, t1_glyph_space_coord * y) { t1_glyph_space_coord gy = *y; /* t1_glyph_space_coord gw = any_abs(zone->overshoot_y - zone->y); */ t1_glyph_space_coord gw = any_abs(gy - zone->y); - t1_hinter_space_coord ow = g2o_dist_blue(this, gw); - t1_hinter_space_coord ow1 = ow / this->g2o_fraction * this->g2o_fraction; - t1_glyph_space_coord gw1 = o2g_dist(this, ow1, this->heigt_transform_coef_inv); + t1_hinter_space_coord ow = g2o_dist_blue(self, gw); + t1_hinter_space_coord ow1 = ow / self->g2o_fraction * self->g2o_fraction; + t1_glyph_space_coord gw1 = o2g_dist(self, ow1, self->heigt_transform_coef_inv); *y = zone->y + (zone->type == topzone ? gw1 : -gw1); } #endif -static enum t1_align_type t1_hinter__compute_aligned_coord(t1_hinter * this, +static enum t1_align_type t1_hinter__compute_aligned_coord(t1_hinter * self, t1_glyph_space_coord * gc, int segment_index, fixed t, const t1_hint *hint, enum t1_align_type align0) { /* Returns true, if alignment zone is applied. */ /* t is 0 or 0.5, and it is always 0 for curves. */ bool horiz = (hint->type == hstem); enum t1_align_type align = align0; - t1_glyph_space_coord gx = this->pole[segment_index].gx, gx0; - t1_glyph_space_coord gy = this->pole[segment_index].gy, gy0; + t1_glyph_space_coord gx = self->pole[segment_index].gx, gx0; + t1_glyph_space_coord gy = self->pole[segment_index].gy, gy0; t1_glyph_space_coord gc0 = (horiz ? gy : gx); bool align_by_stem = align0 == unaligned /* Force aligning outer boundaries @@ -2160,9 +2160,9 @@ /* Compute point of specified segment by parameter t : */ if (t) { - int next = t1_hinter__segment_end(this, segment_index); - t1_glyph_space_coord gx1 = this->pole[next].gx; - t1_glyph_space_coord gy1 = this->pole[next].gy; + int next = t1_hinter__segment_end(self, segment_index); + t1_glyph_space_coord gx1 = self->pole[next].gx; + t1_glyph_space_coord gy1 = self->pole[next].gy; gx = (gx + gx1) / 2; gy = (gy + gy1) / 2; @@ -2171,39 +2171,39 @@ gy0 = gy; vd_circle(gx, gy, 7, RGB(255,0,0)); if (horiz) { - t1_pole * pole = &this->pole[segment_index]; + t1_pole * pole = &self->pole[segment_index]; int contour_index = pole->contour_index; - int beg_contour_pole = this->contour[contour_index]; - int end_contour_pole = this->contour[contour_index + 1] - 2; + int beg_contour_pole = self->contour[contour_index]; + int end_contour_pole = self->contour[contour_index + 1] - 2; int prev1 = ranger_step_b(segment_index, beg_contour_pole, end_contour_pole); int prev2 = ranger_step_b(prev1 , beg_contour_pole, end_contour_pole); int next1 = ranger_step_f(segment_index, beg_contour_pole, end_contour_pole); int next2 = ranger_step_f(next1 , beg_contour_pole, end_contour_pole); - bool forwd_horiz = (any_abs(this->pole[next1].gy - pole->gy) <= - max(this->blue_fuzz, any_abs(this->pole[next1].gx - pole->gx) / 10)); - bool bckwd_horiz = (any_abs(this->pole[prev1].gy - pole->gy) <= - max(this->blue_fuzz, any_abs(this->pole[prev1].gx - pole->gx) / 10)); - bool maximum = (this->pole[next1].gy - pole->gy < 0 && - this->pole[prev1].gy - pole->gy < 0); - bool minimum = (this->pole[next1].gy - pole->gy > 0 && - this->pole[prev1].gy - pole->gy > 0); + bool forwd_horiz = (any_abs(self->pole[next1].gy - pole->gy) <= + max(self->blue_fuzz, any_abs(self->pole[next1].gx - pole->gx) / 10)); + bool bckwd_horiz = (any_abs(self->pole[prev1].gy - pole->gy) <= + max(self->blue_fuzz, any_abs(self->pole[prev1].gx - pole->gx) / 10)); + bool maximum = (self->pole[next1].gy - pole->gy < 0 && + self->pole[prev1].gy - pole->gy < 0); + bool minimum = (self->pole[next1].gy - pole->gy > 0 && + self->pole[prev1].gy - pole->gy > 0); if (forwd_horiz || bckwd_horiz || maximum || minimum) { - bool forwd_curve = (this->pole[next1].type == offcurve); - bool bckwd_curve = (this->pole[prev1].type == offcurve); + bool forwd_curve = (self->pole[next1].type == offcurve); + bool bckwd_curve = (self->pole[prev1].type == offcurve); bool curve = (bckwd_curve && forwd_curve); - bool convex = (curve && this->pole[prev2].gy <= pole->gy && - this->pole[next2].gy <= pole->gy); - bool concave = (curve && this->pole[prev2].gy >= pole->gy && - this->pole[next2].gy >= pole->gy); - t1_zone *zone = t1_hinter__find_zone(this, pole->gy, curve || maximum || minimum, + bool convex = (curve && self->pole[prev2].gy <= pole->gy && + self->pole[next2].gy <= pole->gy); + bool concave = (curve && self->pole[prev2].gy >= pole->gy && + self->pole[next2].gy >= pole->gy); + t1_zone *zone = t1_hinter__find_zone(self, pole->gy, curve || maximum || minimum, convex || maximum, concave || minimum); if (zone != NULL && (forwd_horiz || bckwd_horiz || (maximum && zone->type == topzone) || (minimum && zone->type == botzone))) { - if (this->suppress_overshoots) + if (self->suppress_overshoots) # if ADOBE_OVERSHOOT_COMPATIBILIY gy = (zone->type == topzone ? zone->overshoot_y : zone->y); # else @@ -2213,16 +2213,16 @@ t1_glyph_space_coord s = zone->y - pole->gy; if (zone->type == topzone) s = -s; - if (!curve && s < this->overshoot_threshold) + if (!curve && s < self->overshoot_threshold) gy = zone->y; - else if (s > this->overshoot_threshold) { - t1_glyph_space_coord ss = this->overshoot_threshold * 2; + else if (s > self->overshoot_threshold) { + t1_glyph_space_coord ss = self->overshoot_threshold * 2; if (s < ss) /* Enforce overshoot : */ gy = (zone->type == topzone ? zone->y + ss : zone->y - ss); else { # if ADOBE_OVERSHOOT_COMPATIBILIY - t1_hinter__add_overshoot(this, zone, &gx, &gy); + t1_hinter__add_overshoot(self, zone, &gx, &gy); # endif } } @@ -2237,8 +2237,8 @@ t1_glyph_space_coord gx1, gy1; if (horiz) { - bool b0 = t1_hinter__is_stem_boundary_near(this, hint, gy, 0); - bool b1 = t1_hinter__is_stem_boundary_near(this, hint, gy, 1); + bool b0 = t1_hinter__is_stem_boundary_near(self, hint, gy, 0); + bool b1 = t1_hinter__is_stem_boundary_near(self, hint, gy, 1); gx1 = gx; if (b0 && !b1) @@ -2248,8 +2248,8 @@ else gy1 = 0; /* Quiet the compiler. */ } else { - bool b0 = t1_hinter__is_stem_boundary_near(this, hint, gx, 0); - bool b1 = t1_hinter__is_stem_boundary_near(this, hint, gx, 1); + bool b0 = t1_hinter__is_stem_boundary_near(self, hint, gx, 0); + bool b1 = t1_hinter__is_stem_boundary_near(self, hint, gx, 1); gy1 = gy; if (b0 && !b1) @@ -2260,12 +2260,12 @@ gx1 = 0; /* Quiet the compiler. */ } if (align_by_stem) - t1_hinter__align_stem_to_grid(this, this->g2o_fraction, &gx, &gy, gx1, gy1, - CONTRAST_STEMS || this->align_to_pixels, hint); + t1_hinter__align_stem_to_grid(self, self->g2o_fraction, &gx, &gy, gx1, gy1, + CONTRAST_STEMS || self->align_to_pixels, hint); } if (!align_by_stem) - t1_hinter__align_to_grid(this, this->g2o_fraction, &gx, &gy, - CONTRAST_STEMS || this->align_to_pixels); + t1_hinter__align_to_grid(self, self->g2o_fraction, &gx, &gy, + CONTRAST_STEMS || self->align_to_pixels); vd_circle(gx, gy, 7, RGB(0,0,255)); *gc = gc0 + (horiz ? gy - gy0 : gx - gx0); return (align == unaligned ? aligned : align); @@ -2275,7 +2275,7 @@ 1 - preserve iff slanted in design space 2 - always preserve */ -static int t1_hinter__find_stem_middle(t1_hinter * this, fixed *t, int pole_index, bool horiz) +static int t1_hinter__find_stem_middle(t1_hinter * self, fixed *t, int pole_index, bool horiz) { /* *t = 0 preserves slant; *t = fixed_half deminishes slant (don't apply to curves). */ if (PRESERVE_STEM_SLANT == 2) { @@ -2289,12 +2289,12 @@ we align the arm middle, causing the slope to look smaller */ /* We assume proper glyphs, see Type 1 spec, chapter 4. */ - int next = t1_hinter__next_contour_pole(this, pole_index); + int next = t1_hinter__next_contour_pole(self, pole_index); const int alpha = 10; int design_slant; - bool curve = this->pole[next].type == offcurve; - bool continuing = (horiz ? t1_hinter__is_small_angle(this, next, pole_index, 1, 0, alpha, 1, &design_slant) - : t1_hinter__is_small_angle(this, next, pole_index, 0, 1, alpha, 1, &design_slant)); + bool curve = self->pole[next].type == offcurve; + bool continuing = (horiz ? t1_hinter__is_small_angle(self, next, pole_index, 1, 0, alpha, 1, &design_slant) + : t1_hinter__is_small_angle(self, next, pole_index, 0, 1, alpha, 1, &design_slant)); if (!PRESERVE_STEM_SLANT || design_slant == 0) *t = (!curve && continuing ? fixed_half : 0); @@ -2304,40 +2304,40 @@ } } -static int t1_hinter__skip_stem(t1_hinter * this, int pole_index, bool horiz) +static int t1_hinter__skip_stem(t1_hinter * self, int pole_index, bool horiz) { /* We assume proper glyphs, see Type 1 spec, chapter 4. */ int i = pole_index; - int next_pole = t1_hinter__next_contour_pole(this, i); - int next_segm = t1_hinter__segment_end(this, i); + int next_pole = t1_hinter__next_contour_pole(self, i); + int next_segm = t1_hinter__segment_end(self, i); long tan_x = (horiz ? 1 : 0); long tan_y = (horiz ? 0 : 1); int quality; - while (t1_hinter__is_small_angle(this, i, next_pole, tan_x, tan_y, 1000, 1, &quality) && /* The threshold is taken from scratch. */ - t1_hinter__is_small_angle(this, i, next_segm, tan_x, tan_y, 1000, 1, &quality)) { - i = t1_hinter__segment_end(this, i); + while (t1_hinter__is_small_angle(self, i, next_pole, tan_x, tan_y, 1000, 1, &quality) && /* The threshold is taken from scratch. */ + t1_hinter__is_small_angle(self, i, next_segm, tan_x, tan_y, 1000, 1, &quality)) { + i = t1_hinter__segment_end(self, i); if (i == pole_index) { /* An invalid glyph with <=2 segments in the contour with no angles. */ break; } - next_pole = t1_hinter__next_contour_pole(this, i); - next_segm = t1_hinter__segment_end(this, i); + next_pole = t1_hinter__next_contour_pole(self, i); + next_segm = t1_hinter__segment_end(self, i); } return i; } -static void t1_hinter__mark_existing_stems(t1_hinter * this) +static void t1_hinter__mark_existing_stems(t1_hinter * self) { /* fixme: Duplicated code with t1_hinter__align_stem_commands. */ int i, j, jj, k; - for(i = 0; i < this->hint_count; i++) - if (this->hint[i].type == vstem || this->hint[i].type == hstem) - for (k = this->hint[i].range_index; k != -1; k = this->hint_range[k].next) { - int beg_range_pole = this->hint_range[k].beg_pole; - int end_range_pole = this->hint_range[k].end_pole; + for(i = 0; i < self->hint_count; i++) + if (self->hint[i].type == vstem || self->hint[i].type == hstem) + for (k = self->hint[i].range_index; k != -1; k = self->hint_range[k].next) { + int beg_range_pole = self->hint_range[k].beg_pole; + int end_range_pole = self->hint_range[k].end_pole; int quality; - if (this->pole[beg_range_pole].type == closepath) { + if (self->pole[beg_range_pole].type == closepath) { /* A workaround for a buggy font from the Bug 687393, which defines a range with 'closepath' only. */ beg_range_pole++; @@ -2345,53 +2345,53 @@ continue; } for (j = beg_range_pole; j <= end_range_pole;) { - int k = t1_hinter__is_stem_hint_applicable(this, &this->hint[i], j, &quality); + int k = t1_hinter__is_stem_hint_applicable(self, &self->hint[i], j, &quality); if (k == 1) - this->hint[i].b0 = true; + self->hint[i].b0 = true; else if (k == 2) - this->hint[i].b1 = true; + self->hint[i].b1 = true; { /* Step to the next pole in the range : */ jj = j; - j = t1_hinter__segment_end(this, j); + j = t1_hinter__segment_end(self, j); if (j <= jj) /* Rolled over contour end ? */ - j = this->contour[this->pole[j].contour_index + 1]; /* Go to the next contour. */ + j = self->contour[self->pole[j].contour_index + 1]; /* Go to the next contour. */ } } } } -static void t1_hinter__add_boundary_length(t1_hinter * this, t1_hint *hint, +static void t1_hinter__add_boundary_length(t1_hinter * self, t1_hint *hint, int pole_index0, int pole_index1) -{ const t1_pole *pole = &this->pole[pole_index0]; +{ const t1_pole *pole = &self->pole[pole_index0]; int contour_index = pole->contour_index; - int beg_contour_pole = this->contour[contour_index]; - int end_contour_pole = this->contour[contour_index + 1] - 2; + int beg_contour_pole = self->contour[contour_index]; + int end_contour_pole = self->contour[contour_index + 1] - 2; int i0 = ranger_step_b(pole_index0, beg_contour_pole, end_contour_pole); int i1 = ranger_step_f(pole_index1, beg_contour_pole, end_contour_pole); t1_glyph_space_coord g = (hint->type == hstem ? pole->gy : pole->gx); - if (this->pole[i0].type == oncurve) + if (self->pole[i0].type == oncurve) i0 = pole_index0; - if (this->pole[i1].type == oncurve) + if (self->pole[i1].type == oncurve) i1 = pole_index1; *(any_abs(hint->g0 - g) < any_abs(hint->g1 - g) ? &hint->boundary_length0 : &hint->boundary_length1) - += (hint->type == hstem ? any_abs(this->pole[i0].gx - this->pole[i1].gx) - : any_abs(this->pole[i0].gy - this->pole[i1].gy)); + += (hint->type == hstem ? any_abs(self->pole[i0].gx - self->pole[i1].gx) + : any_abs(self->pole[i0].gy - self->pole[i1].gy)); } -static void t1_hinter__align_stem_commands(t1_hinter * this) +static void t1_hinter__align_stem_commands(t1_hinter * self) { int i, j, jj, k; - for(i = 0; i < this->hint_count; i++) { - this->hint[i].boundary_length0 = this->hint[i].boundary_length1 = 0; - if (this->hint[i].type == vstem || this->hint[i].type == hstem) - for (k = this->hint[i].range_index; k != -1; k = this->hint_range[k].next) { - int beg_range_pole = this->hint_range[k].beg_pole; - int end_range_pole = this->hint_range[k].end_pole; - bool horiz = (this->hint[i].type == hstem); + for(i = 0; i < self->hint_count; i++) { + self->hint[i].boundary_length0 = self->hint[i].boundary_length1 = 0; + if (self->hint[i].type == vstem || self->hint[i].type == hstem) + for (k = self->hint[i].range_index; k != -1; k = self->hint_range[k].next) { + int beg_range_pole = self->hint_range[k].beg_pole; + int end_range_pole = self->hint_range[k].end_pole; + bool horiz = (self->hint[i].type == hstem); int quality = max_int; - if (this->pole[beg_range_pole].type == closepath) { + if (self->pole[beg_range_pole].type == closepath) { /* A workaround for a buggy font from the Bug 687393, which defines a range with 'closepath' only. */ beg_range_pole++; @@ -2399,49 +2399,49 @@ continue; } for (j = beg_range_pole; j <= end_range_pole;) { - if (this->pole[j].type == closepath) { + if (self->pole[j].type == closepath) { j++; continue; } - if (t1_hinter__is_stem_hint_applicable(this, &this->hint[i], j, &quality)) { + if (t1_hinter__is_stem_hint_applicable(self, &self->hint[i], j, &quality)) { fixed t; /* Type 1 spec implies that it is 0 for curves, 0.5 for bars */ - int segment_index = t1_hinter__find_stem_middle(this, &t, j, horiz); + int segment_index = t1_hinter__find_stem_middle(self, &t, j, horiz); t1_glyph_space_coord gc; enum t1_align_type align = unaligned; - if (this->hint[i].side_mask != 3) { + if (self->hint[i].side_mask != 3) { /* An overal hint from the True Type autohinter. */ - align = (this->hint[i].side_mask & 2 ? topzn : botzn); - } else if (this->autohinting && horiz) { - if (this->pole[segment_index].gy == this->hint[i].g0) - align = (this->hint[i].g0 > this->hint[i].g1 ? topzn : botzn); + align = (self->hint[i].side_mask & 2 ? topzn : botzn); + } else if (self->autohinting && horiz) { + if (self->pole[segment_index].gy == self->hint[i].g0) + align = (self->hint[i].g0 > self->hint[i].g1 ? topzn : botzn); } - align = t1_hinter__compute_aligned_coord(this, &gc, - segment_index, t, &this->hint[i], align); - vd_square(this->pole[segment_index].gx, this->pole[segment_index].gy, - (horiz ? 7 : 9), (i < this->primary_hint_count ? RGB(0,0,255) : RGB(0,255,0))); + align = t1_hinter__compute_aligned_coord(self, &gc, + segment_index, t, &self->hint[i], align); + vd_square(self->pole[segment_index].gx, self->pole[segment_index].gy, + (horiz ? 7 : 9), (i < self->primary_hint_count ? RGB(0,0,255) : RGB(0,255,0))); /* todo: optimize: primary commands don't need to align, if suppressed by secondary ones. */ - t1_hint__set_aligned_coord(&this->hint[i], gc, &this->pole[j], align, quality); + t1_hint__set_aligned_coord(&self->hint[i], gc, &self->pole[j], align, quality); jj = j; - j = t1_hinter__skip_stem(this, j, horiz); - t1_hinter__add_boundary_length(this, &this->hint[i], jj, j); + j = t1_hinter__skip_stem(self, j, horiz); + t1_hinter__add_boundary_length(self, &self->hint[i], jj, j); if (j < jj) { /* Rolled over contour end ? */ - j = this->contour[this->pole[j].contour_index + 1]; /* Go to the next contour. */ + j = self->contour[self->pole[j].contour_index + 1]; /* Go to the next contour. */ continue; } } { /* Step to the next pole in the range : */ jj = j; - j = t1_hinter__segment_end(this, j); + j = t1_hinter__segment_end(self, j); if (j <= jj) /* Rolled over contour end ? */ - j = this->contour[this->pole[j].contour_index + 1]; /* Go to the next contour. */ + j = self->contour[self->pole[j].contour_index + 1]; /* Go to the next contour. */ } } } } } -static void t1_hinter__unfix_opposite_to_common(t1_hinter * this) +static void t1_hinter__unfix_opposite_to_common(t1_hinter * self) { /* Implemented for Bug 687578 "T1 hinter disturbs stem width". */ int i, j, k, m, n; t1_glyph_space_coord d, md; @@ -2451,29 +2451,29 @@ for (k = 0; k < 2; k++) { /* g0, g1 */ /* Since the number of stems in a complex is usually small, we don't care about redundant computations. */ - for(i = 0; i < this->hint_count; i++) { - if (this->hint[i].type == vstem || this->hint[i].type == hstem) { - p_ai = (!k ? &this->hint[i].aligned0 : &this->hint[i].aligned1); - p_oi = (!k ? &this->hint[i].aligned1 : &this->hint[i].aligned0); + for(i = 0; i < self->hint_count; i++) { + if (self->hint[i].type == vstem || self->hint[i].type == hstem) { + p_ai = (!k ? &self->hint[i].aligned0 : &self->hint[i].aligned1); + p_oi = (!k ? &self->hint[i].aligned1 : &self->hint[i].aligned0); if (*p_ai > weak && *p_ai == *p_oi) { - p_ci = (!k ? &this->hint[i].g0 : &this->hint[i].g1); - md = any_abs(this->hint[i].g1 - this->hint[i].g0); + p_ci = (!k ? &self->hint[i].g0 : &self->hint[i].g1); + md = any_abs(self->hint[i].g1 - self->hint[i].g0); m = i; am = *p_ai; - agm = (!k ? this->hint[m].ag0 : this->hint[m].ag1); + agm = (!k ? self->hint[m].ag0 : self->hint[m].ag1); n = 0; - for(j = 0; j < this->hint_count; j++) { - if (j != i && this->hint[i].type == this->hint[j].type) { - p_cj = (!k ? &this->hint[j].g0 : &this->hint[j].g1); + for(j = 0; j < self->hint_count; j++) { + if (j != i && self->hint[i].type == self->hint[j].type) { + p_cj = (!k ? &self->hint[j].g0 : &self->hint[j].g1); if (*p_ci == *p_cj) { n++; - p_aj = (!k ? &this->hint[j].aligned0 : &this->hint[j].aligned1); - d = any_abs(this->hint[j].g1 - this->hint[j].g0); + p_aj = (!k ? &self->hint[j].aligned0 : &self->hint[j].aligned1); + d = any_abs(self->hint[j].g1 - self->hint[j].g0); if (am < *p_aj) { md = d; m = j; am = *p_aj; - agm = (!k ? this->hint[m].ag0 : this->hint[m].ag1); + agm = (!k ? self->hint[m].ag0 : self->hint[m].ag1); } if (md < d) { md = d; m = j; @@ -2482,12 +2482,12 @@ } } if (n) { - for(j = 0; j < this->hint_count; j++) { - p_cj = (!k ? &this->hint[j].g0 : &this->hint[j].g1); + for(j = 0; j < self->hint_count; j++) { + p_cj = (!k ? &self->hint[j].g0 : &self->hint[j].g1); if (*p_ci == *p_cj) { - p_aj = (!k ? &this->hint[j].aligned0 : &this->hint[j].aligned1); - p_oj = (!k ? &this->hint[j].aligned1 : &this->hint[j].aligned0); - p_agj = (!k ? &this->hint[j].ag0 : &this->hint[j].ag1); + p_aj = (!k ? &self->hint[j].aligned0 : &self->hint[j].aligned1); + p_oj = (!k ? &self->hint[j].aligned1 : &self->hint[j].aligned0); + p_agj = (!k ? &self->hint[j].ag0 : &self->hint[j].ag1); *p_aj = am; if (*p_oj == aligned) *p_oj = weak; @@ -2501,28 +2501,28 @@ } } -static void t1_hinter__compute_opposite_stem_coords(t1_hinter * this) +static void t1_hinter__compute_opposite_stem_coords(t1_hinter * self) { int i; - for (i = 0; i < this->hint_count; i++) - if ((this->hint[i].type == vstem || this->hint[i].type == hstem)) { - t1_glyph_space_coord ag0 = this->hint[i].ag0; - t1_glyph_space_coord ag1 = this->hint[i].ag1; - enum t1_align_type aligned0 = this->hint[i].aligned0; - enum t1_align_type aligned1 = this->hint[i].aligned1; + for (i = 0; i < self->hint_count; i++) + if ((self->hint[i].type == vstem || self->hint[i].type == hstem)) { + t1_glyph_space_coord ag0 = self->hint[i].ag0; + t1_glyph_space_coord ag1 = self->hint[i].ag1; + enum t1_align_type aligned0 = self->hint[i].aligned0; + enum t1_align_type aligned1 = self->hint[i].aligned1; t1_glyph_space_coord gw; - gw = any_abs(this->hint[i].g1 - this->hint[i].g0); - t1_hinter__align_stem_width(this, &gw, &this->hint[i]); - if (this->hint[i].g1 - this->hint[i].g0 < 0) + gw = any_abs(self->hint[i].g1 - self->hint[i].g0); + t1_hinter__align_stem_width(self, &gw, &self->hint[i]); + if (self->hint[i].g1 - self->hint[i].g0 < 0) gw = -gw; if (aligned0 > aligned1) ag1 = ag0 + gw; else if (aligned0 < aligned1) ag0 = ag1 - gw; else { - t1_glyph_space_coord d0 = any_abs(ag0 - this->hint[i].g0); - t1_glyph_space_coord d1 = any_abs(ag1 - this->hint[i].g1); + t1_glyph_space_coord d0 = any_abs(ag0 - self->hint[i].g0); + t1_glyph_space_coord d1 = any_abs(ag1 - self->hint[i].g1); if (aligned0 == topzn || aligned1 == topzn) if (gw > 0) @@ -2534,10 +2534,10 @@ ag0 = ag1 - gw; else ag1 = ag0 + gw; - else if (this->hint[i].type == hstem && - min(any_abs(this->hint[i].g0 - this->ymid), any_abs(this->hint[i].g1 - this->ymid)) > - (this->ymax - this->ymin) / 5) { - if ((this->hint[i].g1 + this->hint[i].g0) / 2 > this->ymid) + else if (self->hint[i].type == hstem && + min(any_abs(self->hint[i].g0 - self->ymid), any_abs(self->hint[i].g1 - self->ymid)) > + (self->ymax - self->ymin) / 5) { + if ((self->hint[i].g1 + self->hint[i].g0) / 2 > self->ymid) ag0 = ag1 - gw; else ag1 = ag0 + gw; @@ -2548,72 +2548,72 @@ ag0 = ag1 - gw; } } - this->hint[i].ag0 = ag0; - this->hint[i].ag1 = ag1; + self->hint[i].ag0 = ag0; + self->hint[i].ag1 = ag1; } } -static int t1_hinter__store_hint_applying(t1_hinter * this, t1_hint *hint, int pole_index) +static int t1_hinter__store_hint_applying(t1_hinter * self, t1_hint *hint, int pole_index) { t1_hint_applying *ha; - int code = t1_hinter__can_add_hint_applying(this, &ha); + int code = t1_hinter__can_add_hint_applying(self, &ha); if (code < 0) return code; ha->pole = pole_index; ha->opposite = -1; - this->hint_applying_count++; + self->hint_applying_count++; return 0; } -static int t1_hinter__align_stem_poles(t1_hinter * this) +static int t1_hinter__align_stem_poles(t1_hinter * self) { int i, j, k; - t1_glyph_space_coord const fuzz = this->blue_fuzz; /* comparefiles/tpc2.ps */ + t1_glyph_space_coord const fuzz = self->blue_fuzz; /* comparefiles/tpc2.ps */ int code = 0; - for (i = 0; i < this->hint_count; i++) - if (this->hint[i].type == vstem || this->hint[i].type == hstem) { - t1_hint * hint = &this->hint[i]; + for (i = 0; i < self->hint_count; i++) + if (self->hint[i].type == vstem || self->hint[i].type == hstem) { + t1_hint * hint = &self->hint[i]; t1_glyph_space_coord ag0 = hint->ag0, ag1 = hint->ag1; bool horiz = (hint->type == hstem); /* fixme: optimize: Reduce hint_applying with storing only one side of the hint. */ - this->hint_applying_count = 0; - for (k = this->hint[i].range_index; k != -1; k = this->hint_range[k].next) { - int beg_range_pole = this->hint_range[k].beg_pole; - int end_range_pole = this->hint_range[k].end_pole; + self->hint_applying_count = 0; + for (k = self->hint[i].range_index; k != -1; k = self->hint_range[k].next) { + int beg_range_pole = self->hint_range[k].beg_pole; + int end_range_pole = self->hint_range[k].end_pole; for (j = beg_range_pole; j <= end_range_pole; j++) { - t1_pole * pole = &this->pole[j]; + t1_pole * pole = &self->pole[j]; if (pole->type != oncurve) continue; if (!horiz && any_abs(pole->gx - hint->g0) <= fuzz) - code = t1_hinter__store_hint_applying(this, hint, j); + code = t1_hinter__store_hint_applying(self, hint, j); else if (!horiz && any_abs(pole->gx - hint->g1) <= fuzz) - code = t1_hinter__store_hint_applying(this, hint, j); + code = t1_hinter__store_hint_applying(self, hint, j); else if ( horiz && any_abs(pole->gy - hint->g0) <= fuzz) - code = t1_hinter__store_hint_applying(this, hint, j); + code = t1_hinter__store_hint_applying(self, hint, j); else if ( horiz && any_abs(pole->gy - hint->g1) <= fuzz) - code = t1_hinter__store_hint_applying(this, hint, j); + code = t1_hinter__store_hint_applying(self, hint, j); if (code < 0) return code; } } - for (k = 0; k < this->hint_applying_count; k++) { - t1_hint_applying *ha0 = &this->hint_applying[k]; + for (k = 0; k < self->hint_applying_count; k++) { + t1_hint_applying *ha0 = &self->hint_applying[k]; int pole_index0 = ha0->pole; - t1_pole *pole0 = &this->pole[pole_index0]; + t1_pole *pole0 = &self->pole[pole_index0]; t1_glyph_space_coord g0 = (horiz ? pole0->gy : pole0->gx); t1_glyph_space_coord t0 = (horiz ? pole0->gx : pole0->gy); bool gt0 = any_abs(hint->g0 - g0) > any_abs(hint->g1 - g0); t1_glyph_space_coord d, md = any_abs(hint->g1 - hint->g0) * 5 / 4; int mj = -1; - for (j = 0; j < this->hint_applying_count; j++) { - t1_hint_applying *ha1 = &this->hint_applying[j]; + for (j = 0; j < self->hint_applying_count; j++) { + t1_hint_applying *ha1 = &self->hint_applying[j]; int pole_index1 = ha1->pole; - t1_pole *pole1 = &this->pole[pole_index1]; + t1_pole *pole1 = &self->pole[pole_index1]; t1_glyph_space_coord g1 = (horiz ? pole1->gy : pole1->gx); t1_glyph_space_coord t1 = (horiz ? pole1->gx : pole1->gy); bool gt1 = any_abs(hint->g0 - g1) > any_abs(hint->g1 - g1); @@ -2628,13 +2628,13 @@ } if (mj != -1) { ha0->opposite = mj; - this->hint_applying[mj].opposite = j; + self->hint_applying[mj].opposite = j; } } - for (k = 0; k < this->hint_applying_count; k++) { - t1_hint_applying *ha = &this->hint_applying[k]; + for (k = 0; k < self->hint_applying_count; k++) { + t1_hint_applying *ha = &self->hint_applying[k]; int pole_index = ha->pole; - t1_pole *pole = &this->pole[pole_index]; + t1_pole *pole = &self->pole[pole_index]; t1_glyph_space_coord g0 = (horiz ? pole->gy : pole->gx); bool gt0 = any_abs(hint->g0 - g0) > any_abs(hint->g1 - g0); enum t1_align_type align = (!gt0 ? hint->aligned0 : hint->aligned1); @@ -2655,30 +2655,30 @@ return 0; } -static t1_hint * t1_hinter__find_vstem_by_center(t1_hinter * this, t1_glyph_space_coord gx) +static t1_hint * t1_hinter__find_vstem_by_center(t1_hinter * self, t1_glyph_space_coord gx) { /* Find vstem with axis near gx : */ int i; t1_hint * hint = NULL; t1_glyph_space_coord dx = fixed_1; - for (i = 0; i < this->hint_count; i++) - if (this->hint[i].type == vstem) { - t1_glyph_space_coord d = any_abs(gx - (this->hint[i].ag0 + this->hint[i].ag1) / 2); + for (i = 0; i < self->hint_count; i++) + if (self->hint[i].type == vstem) { + t1_glyph_space_coord d = any_abs(gx - (self->hint[i].ag0 + self->hint[i].ag1) / 2); if (dx > d) { dx = d; - hint = &this->hint[i]; + hint = &self->hint[i]; } } return hint; } -static void t1_hinter__process_dotsection(t1_hinter * this, int beg_pole, int end_pole) +static void t1_hinter__process_dotsection(t1_hinter * self, int beg_pole, int end_pole) { /* Since source outline must have oncurve poles at XY extremes, we compute bounding box from poles. */ int i; - t1_glyph_space_coord min_gx = this->pole[beg_pole].gx, min_gy = this->pole[beg_pole].gy; + t1_glyph_space_coord min_gx = self->pole[beg_pole].gx, min_gy = self->pole[beg_pole].gy; t1_glyph_space_coord max_gx = min_gx, max_gy = min_gy; t1_glyph_space_coord center_gx, center_gy, center_agx, center_agy; t1_glyph_space_coord sx, sy; @@ -2686,7 +2686,7 @@ bool aligned_x, aligned_y; for (i = beg_pole + 1; i <= end_pole; i++) { - t1_glyph_space_coord gx = this->pole[i].gx, gy = this->pole[i].gy; + t1_glyph_space_coord gx = self->pole[i].gx, gy = self->pole[i].gy; min_gx = min(min_gx, gx); min_gy = min(min_gy, gy); @@ -2694,14 +2694,14 @@ max_gy = max(max_gy, gy); } for (i = beg_pole; i <= end_pole; i++) { - if (this->pole[i].gx == min_gx) - aligned_min_x |= this->pole[i].aligned_x; - if (this->pole[i].gy == min_gy) - aligned_min_y |= this->pole[i].aligned_y; - if (this->pole[i].gx == max_gx) - aligned_max_x |= this->pole[i].aligned_x; - if (this->pole[i].gy == max_gy) - aligned_max_y |= this->pole[i].aligned_y; + if (self->pole[i].gx == min_gx) + aligned_min_x |= self->pole[i].aligned_x; + if (self->pole[i].gy == min_gy) + aligned_min_y |= self->pole[i].aligned_y; + if (self->pole[i].gx == max_gx) + aligned_max_x |= self->pole[i].aligned_x; + if (self->pole[i].gy == max_gy) + aligned_max_y |= self->pole[i].aligned_y; } aligned_x = aligned_min_x && aligned_max_x; aligned_y = aligned_min_y && aligned_max_y; @@ -2712,15 +2712,15 @@ vd_circle(center_agx, center_agy, 7, RGB(255,0,0)); if (!aligned_x) { /* Heuristic : apply vstem if it is close to the center : */ - t1_hint * hint = t1_hinter__find_vstem_by_center(this, center_gx); + t1_hint * hint = t1_hinter__find_vstem_by_center(self, center_gx); if (hint != NULL) { center_agx = (hint->ag0 + hint->ag1) / 2; /* Align with vstem */ aligned_x = true; } } vd_circle(center_agx, center_agy, 7, RGB(0,255,0)); - t1_hinter__align_to_grid(this, this->g2o_fraction / 2, ¢er_agx, ¢er_agy, - CONTRAST_STEMS || this->align_to_pixels); + t1_hinter__align_to_grid(self, self->g2o_fraction / 2, ¢er_agx, ¢er_agy, + CONTRAST_STEMS || self->align_to_pixels); vd_circle(center_agx, center_agy, 7, RGB(0,0,255)); sx = center_agx - center_gx; sy = center_agy - center_gy; @@ -2730,49 +2730,49 @@ sy = 0; /* Shift the contour (sets alignment flags to prevent interpolation) : */ for (i = beg_pole; i <= end_pole; i++) { - this->pole[i].ax = this->pole[i].gx + sx; - this->pole[i].ay = this->pole[i].gy + sy; - this->pole[i].aligned_x |= !aligned_x; /* Prevent interpolation if we aligned it here. */ - this->pole[i].aligned_y |= !aligned_y; + self->pole[i].ax = self->pole[i].gx + sx; + self->pole[i].ay = self->pole[i].gy + sy; + self->pole[i].aligned_x |= !aligned_x; /* Prevent interpolation if we aligned it here. */ + self->pole[i].aligned_y |= !aligned_y; } } -static void t1_hinter__process_dotsections(t1_hinter * this) +static void t1_hinter__process_dotsections(t1_hinter * self) { int i; - for(i = 0; i < this->hint_count; i++) - if (this->hint[i].type == dot) { - int pole_index = this->hint_range[this->hint[i].range_index].beg_pole; - int contour_index = this->pole[pole_index].contour_index; - int beg_pole = this->contour[contour_index]; - int end_pole = this->contour[contour_index + 1] - 2; + for(i = 0; i < self->hint_count; i++) + if (self->hint[i].type == dot) { + int pole_index = self->hint_range[self->hint[i].range_index].beg_pole; + int contour_index = self->pole[pole_index].contour_index; + int beg_pole = self->contour[contour_index]; + int end_pole = self->contour[contour_index + 1] - 2; - t1_hinter__process_dotsection(this, beg_pole, end_pole); + t1_hinter__process_dotsection(self, beg_pole, end_pole); } } -static void t1_hinter__interpolate_other_poles(t1_hinter * this) +static void t1_hinter__interpolate_other_poles(t1_hinter * self) { int i, j, k; for (k = 0; k<2; k++) { /* X, Y */ - t1_glyph_space_coord *p_gc = (!k ? &this->pole[0].gx : &this->pole[0].gy); - t1_glyph_space_coord *p_wc = (!k ? &this->pole[0].gy : &this->pole[0].gx); - t1_glyph_space_coord *p_ac = (!k ? &this->pole[0].ax : &this->pole[0].ay); - t1_glyph_space_coord *p_bl = (!k ? &this->pole[0].boundary_length_x : &this->pole[0].boundary_length_y); - enum t1_align_type *p_f = (!k ? &this->pole[0].aligned_x : &this->pole[0].aligned_y); - int offset_gc = (char *)p_gc - (char *)&this->pole[0]; - int offset_wc = (char *)p_wc - (char *)&this->pole[0]; - int offset_ac = (char *)p_ac - (char *)&this->pole[0]; - int offset_bl = (char *)p_bl - (char *)&this->pole[0]; - int offset_f = (char *)p_f - (char *)&this->pole[0]; - - for (i = 0; i < this->contour_count; i++) { - int beg_contour_pole = this->contour[i]; - int end_contour_pole = this->contour[i + 1] - 2; + t1_glyph_space_coord *p_gc = (!k ? &self->pole[0].gx : &self->pole[0].gy); + t1_glyph_space_coord *p_wc = (!k ? &self->pole[0].gy : &self->pole[0].gx); + t1_glyph_space_coord *p_ac = (!k ? &self->pole[0].ax : &self->pole[0].ay); + t1_glyph_space_coord *p_bl = (!k ? &self->pole[0].boundary_length_x : &self->pole[0].boundary_length_y); + enum t1_align_type *p_f = (!k ? &self->pole[0].aligned_x : &self->pole[0].aligned_y); + int offset_gc = (char *)p_gc - (char *)&self->pole[0]; + int offset_wc = (char *)p_wc - (char *)&self->pole[0]; + int offset_ac = (char *)p_ac - (char *)&self->pole[0]; + int offset_bl = (char *)p_bl - (char *)&self->pole[0]; + int offset_f = (char *)p_f - (char *)&self->pole[0]; + + for (i = 0; i < self->contour_count; i++) { + int beg_contour_pole = self->contour[i]; + int end_contour_pole = self->contour[i + 1] - 2; int range_beg; for (j = beg_contour_pole; j <= end_contour_pole; j++) - if (*member_prt(enum t1_align_type, &this->pole[j], offset_f)) + if (*member_prt(enum t1_align_type, &self->pole[j], offset_f)) break; if (j > end_contour_pole) continue; @@ -2788,9 +2788,9 @@ int min_l = 0, max_l = 0, jp; int min_w, max_w, w0; - g0 = *member_prt(t1_glyph_space_coord, &this->pole[start_pole], offset_gc); - w0 = *member_prt(t1_glyph_space_coord, &this->pole[start_pole], offset_wc); - a0 = *member_prt(t1_glyph_space_coord, &this->pole[start_pole], offset_ac); + g0 = *member_prt(t1_glyph_space_coord, &self->pole[start_pole], offset_gc); + w0 = *member_prt(t1_glyph_space_coord, &self->pole[start_pole], offset_wc); + a0 = *member_prt(t1_glyph_space_coord, &self->pole[start_pole], offset_ac); min_g = g0; max_g = g0; min_w = max_w = w0; @@ -2798,8 +2798,8 @@ for (j = ranger_step_f(start_pole, beg_contour_pole, end_contour_pole), l = 1; j != start_pole; j = ranger_step_f(j, beg_contour_pole, end_contour_pole), l++) { - t1_glyph_space_coord g = * member_prt(t1_glyph_space_coord, &this->pole[j], offset_gc); - t1_glyph_space_coord w = * member_prt(t1_glyph_space_coord, &this->pole[j], offset_wc); + t1_glyph_space_coord g = * member_prt(t1_glyph_space_coord, &self->pole[j], offset_gc); + t1_glyph_space_coord w = * member_prt(t1_glyph_space_coord, &self->pole[j], offset_wc); if (min_g > g) min_g = g, min_i = j, min_l = l; @@ -2809,7 +2809,7 @@ min_w = w; if (max_w < w) max_w = w; - if (*member_prt(enum t1_align_type, &this->pole[j], offset_f)) + if (*member_prt(enum t1_align_type, &self->pole[j], offset_f)) break; if (j == stop_pole) break; @@ -2817,8 +2817,8 @@ } stop_pole = j; cut_l = l; - g1 = * member_prt(t1_glyph_space_coord, &this->pole[stop_pole], offset_gc); - a1 = * member_prt(t1_glyph_space_coord, &this->pole[stop_pole], offset_ac); + g1 = * member_prt(t1_glyph_space_coord, &self->pole[stop_pole], offset_gc); + a1 = * member_prt(t1_glyph_space_coord, &self->pole[stop_pole], offset_ac); if (start_pole != stop_pole) if (any_abs(g0 - g1) >= any_abs(a0 - a1) / 10) @@ -2844,22 +2844,22 @@ } if (min_g == max_g && min_a != max_a) { /* Alignment conflict, choose by boundary_length. */ - if (* member_prt(t1_glyph_space_coord, &this->pole[start_pole], offset_bl) < - * member_prt(t1_glyph_space_coord, &this->pole[stop_pole], offset_bl)) + if (* member_prt(t1_glyph_space_coord, &self->pole[start_pole], offset_bl) < + * member_prt(t1_glyph_space_coord, &self->pole[stop_pole], offset_bl)) min_a = max_a = a1; else min_a = max_a = a0; } for (j = start_pole; ; j = ranger_step_f(j, beg_contour_pole, end_contour_pole)) { - t1_glyph_space_coord g = * member_prt(t1_glyph_space_coord, &this->pole[j], offset_gc); + t1_glyph_space_coord g = * member_prt(t1_glyph_space_coord, &self->pole[j], offset_gc); if (g <= min_g) - * member_prt(t1_glyph_space_coord, &this->pole[j], offset_ac) = - * member_prt(t1_glyph_space_coord, &this->pole[j], offset_gc) + (min_a - min_g); + * member_prt(t1_glyph_space_coord, &self->pole[j], offset_ac) = + * member_prt(t1_glyph_space_coord, &self->pole[j], offset_gc) + (min_a - min_g); else if (g >= max_g) - * member_prt(t1_glyph_space_coord, &this->pole[j], offset_ac) = - * member_prt(t1_glyph_space_coord, &this->pole[j], offset_gc) + (max_a - max_g); + * member_prt(t1_glyph_space_coord, &self->pole[j], offset_ac) = + * member_prt(t1_glyph_space_coord, &self->pole[j], offset_gc) + (max_a - max_g); if(moved && j == stop_pole) break; moved = true; @@ -2901,10 +2901,10 @@ u = (q1 << 12) + q2; for (j = ranger_step_f(start_pole, beg_contour_pole, end_contour_pole); j != stop_pole; j = ranger_step_f(j, beg_contour_pole, end_contour_pole)) { - t1_glyph_space_coord g = *member_prt(t1_glyph_space_coord, &this->pole[j], offset_gc); + t1_glyph_space_coord g = *member_prt(t1_glyph_space_coord, &self->pole[j], offset_gc); if (min_g < g && g < max_g) { - t1_glyph_space_coord *a = member_prt(t1_glyph_space_coord, &this->pole[j], offset_ac); + t1_glyph_space_coord *a = member_prt(t1_glyph_space_coord, &self->pole[j], offset_ac); t1_glyph_space_coord x = g - min_g; t1_glyph_space_coord h = mul_shift(x, u, 12); /* It is x*u/2^12 */ @@ -2919,28 +2919,28 @@ } } -static int t1_hinter__export(t1_hinter * this) +static int t1_hinter__export(t1_hinter * self) { int i, j, code; fixed fx, fy; for(i = 0; ; i++) { - int end_pole, beg_pole = this->contour[i]; - t1_pole *pole = & this->pole[beg_pole]; + int end_pole, beg_pole = self->contour[i]; + t1_pole *pole = & self->pole[beg_pole]; - g2d(this, pole->ax, pole->ay, &fx, &fy); - code = gx_path_add_point(this->output_path, fx, fy); + g2d(self, pole->ax, pole->ay, &fx, &fy); + code = gx_path_add_point(self->output_path, fx, fy); if (code < 0) return code; - if (i >= this->contour_count) + if (i >= self->contour_count) break; vd_setcolor(RGB(255,0,0)); vd_moveto(fx,fy); - end_pole = this->contour[i + 1] - 2; + end_pole = self->contour[i + 1] - 2; for(j = beg_pole + 1; j <= end_pole; j++) { - pole = & this->pole[j]; - g2d(this, pole->ax, pole->ay, &fx, &fy); + pole = & self->pole[j]; + g2d(self, pole->ax, pole->ay, &fx, &fy); if (pole->type == oncurve) { - code = gx_path_add_line(this->output_path, fx, fy); + code = gx_path_add_line(self->output_path, fx, fy); if (code < 0) return code; vd_setcolor(RGB(255,0,0)); @@ -2949,9 +2949,9 @@ int j1 = j + 1, j2 = (j + 2 > end_pole ? beg_pole : j + 2); fixed fx1, fy1, fx2, fy2; - g2d(this, this->pole[j1].ax, this->pole[j1].ay, &fx1, &fy1); - g2d(this, this->pole[j2].ax, this->pole[j2].ay, &fx2, &fy2); - code = gx_path_add_curve(this->output_path, fx, fy, fx1, fy1, fx2, fy2); + g2d(self, self->pole[j1].ax, self->pole[j1].ay, &fx1, &fy1); + g2d(self, self->pole[j2].ax, self->pole[j2].ay, &fx2, &fy2); + code = gx_path_add_curve(self->output_path, fx, fy, fx1, fy1, fx2, fy2); if (code < 0) return code; vd_setcolor(RGB(255,0,0)); @@ -2959,17 +2959,17 @@ j+=2; } } - code = gx_path_close_subpath(this->output_path); + code = gx_path_close_subpath(self->output_path); if (code < 0) return code; } return 0; } -static int t1_hinter__add_trailing_moveto(t1_hinter * this) -{ t1_glyph_space_coord gx = this->width_gx, gy = this->width_gy; +static int t1_hinter__add_trailing_moveto(t1_hinter * self) +{ t1_glyph_space_coord gx = self->width_gx, gy = self->width_gy; -#if 0 /* This appears wrong due to several reasons : +#if 0 /* self appears wrong due to several reasons : 1. With TextAlphaBits=1, AlignToPixels must have no effect. 2. ashow, awidthshow must add the width before alignment. 4. In the PDF interpreter, Tc must add before alignment. @@ -2979,13 +2979,13 @@ glyph widths rounds to zero, causing overlapped glyphs. (Bug 687719 "PDFWRITE corrupts letter spacing/placement"). */ - if (this->align_to_pixels) - t1_hinter__align_to_grid(this, this->g2o_fraction, &gx, &gy, this->align_to_pixels); + if (self->align_to_pixels) + t1_hinter__align_to_grid(self, self->g2o_fraction, &gx, &gy, self->align_to_pixels); #endif - return t1_hinter__rmoveto(this, gx - this->cx, gy - this->cy); + return t1_hinter__rmoveto(self, gx - self->cx, gy - self->cy); } -int t1_hinter__endglyph(t1_hinter * this) +int t1_hinter__endglyph(t1_hinter * self) { int code = 0; if (!vd_enabled) { /* Maybe enabled in t1_hinter__set_mapping. */ @@ -2993,58 +2993,58 @@ vd_set_shift(VD_SHIFT_X, VD_SHIFT_Y); vd_set_scale(VD_SCALE); vd_set_origin(0, 0); - if (!VD_DRAW_IMPORT && !this->disable_hinting) + if (!VD_DRAW_IMPORT && !self->disable_hinting) vd_erase(RGB(255, 255, 255)); } - if (vd_enabled && this->g2o_fraction != 0 && !this->disable_hinting) - t1_hinter__paint_raster_grid(this); - code = t1_hinter__add_trailing_moveto(this); + if (vd_enabled && self->g2o_fraction != 0 && !self->disable_hinting) + t1_hinter__paint_raster_grid(self); + code = t1_hinter__add_trailing_moveto(self); if (code < 0) goto exit; - code = t1_hinter__end_subglyph(this); + code = t1_hinter__end_subglyph(self); if (code < 0) goto exit; - t1_hinter__paint_glyph(this, false); - t1_hinter__adjust_matrix_precision(this, this->orig_gx, this->orig_gy); - t1_hinter__compute_y_span(this); - t1_hinter__simplify_representation(this); - if (!this->disable_hinting && (this->grid_fit_x || this->grid_fit_y)) { - if (this->FontType == 1) - t1_hinter__compute_type1_stem_ranges(this); + t1_hinter__paint_glyph(self, false); + t1_hinter__adjust_matrix_precision(self, self->orig_gx, self->orig_gy); + t1_hinter__compute_y_span(self); + t1_hinter__simplify_representation(self); + if (!self->disable_hinting && (self->grid_fit_x || self->grid_fit_y)) { + if (self->FontType == 1) + t1_hinter__compute_type1_stem_ranges(self); else - t1_hinter__compute_type2_stem_ranges(this); - t1_hinter__mark_existing_stems(this); - t1_hinter_compute_stem_snap_range(this); - t1_hinter__align_stem_commands(this); - t1_hinter__unfix_opposite_to_common(this); - t1_hinter__compute_opposite_stem_coords(this); + t1_hinter__compute_type2_stem_ranges(self); + t1_hinter__mark_existing_stems(self); + t1_hinter_compute_stem_snap_range(self); + t1_hinter__align_stem_commands(self); + t1_hinter__unfix_opposite_to_common(self); + t1_hinter__compute_opposite_stem_coords(self); /* stem3 was processed in the Type 1 interpreter. */ - code = t1_hinter__align_stem_poles(this); + code = t1_hinter__align_stem_poles(self); if (code < 0) goto exit; - t1_hinter__process_dotsections(this); - t1_hinter__interpolate_other_poles(this); - t1_hinter__paint_glyph(this, true); - } - if (this->pole_count) { - if (this->fix_contour_sign) { - t1_hinter__fix_contour_signs(this); - t1_hinter__paint_glyph(this, true); + t1_hinter__process_dotsections(self); + t1_hinter__interpolate_other_poles(self); + t1_hinter__paint_glyph(self, true); + } + if (self->pole_count) { + if (self->fix_contour_sign) { + t1_hinter__fix_contour_signs(self); + t1_hinter__paint_glyph(self, true); } if (vd_enabled) { double_matrix m; - fraction_matrix__to_double(&this->ctmi, &m); + fraction_matrix__to_double(&self->ctmi, &m); vd_set_scaleXY(vd_get_scale_x * m.xx, vd_get_scale_y * m.yy); - vd_set_origin(this->orig_dx, this->orig_dy); + vd_set_origin(self->orig_dx, self->orig_dy); /* fixme : general transform requires changes to vdtrace. Current implementation paints exported rotated glyph in wrong coordinates. */ } - code = t1_hinter__export(this); + code = t1_hinter__export(self); } exit: - t1_hinter__free_arrays(this); + t1_hinter__free_arrays(self); vd_release_dc; return code; } diff -Nru ghostscript-9.04~dfsg/base/gxht.c ghostscript-9.05~dfsg~20120125/base/gxht.c --- ghostscript-9.04~dfsg/base/gxht.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxht.c 2011-11-21 08:55:19.000000000 +0000 @@ -331,13 +331,24 @@ lop = rop3_use_D_when_T_1(lop); if (source == NULL) set_rop_no_source(source, no_source, dev); - return (*dev_proc(dev, strip_copy_rop)) (dev, source->sdata, - source->sourcex, source->sraster, source->id, - (source->use_scolors ? source->scolors : NULL), - &pdevc->colors.binary.b_tile->tiles, - pdevc->colors.binary.color, - x, y, w, h, pdevc->phase.x, pdevc->phase.y, - lop); + if (source->planar_height == 0) + return (*dev_proc(dev, strip_copy_rop)) + (dev, source->sdata, + source->sourcex, source->sraster, source->id, + (source->use_scolors ? source->scolors : NULL), + &pdevc->colors.binary.b_tile->tiles, + pdevc->colors.binary.color, + x, y, w, h, pdevc->phase.x, pdevc->phase.y, + lop); + else + return (*dev_proc(dev, strip_copy_rop2)) + (dev, source->sdata, + source->sourcex, source->sraster, source->id, + (source->use_scolors ? source->scolors : NULL), + &pdevc->colors.binary.b_tile->tiles, + pdevc->colors.binary.color, + x, y, w, h, pdevc->phase.x, pdevc->phase.y, + lop, source->planar_height); } static int @@ -421,7 +432,7 @@ const gx_device_color * pdevc, const gx_device_color_saved * psdc0, const gx_device * dev, - uint offset, + int64_t offset, byte * pdata, uint * psize ) { @@ -554,7 +565,7 @@ const gs_imager_state * pis, const gx_device_color * prior_devc, const gx_device * dev, /* ignored */ - uint offset, + int64_t offset, const byte * pdata, uint size, gs_memory_t * mem ) /* ignored */ @@ -786,6 +797,7 @@ return code; pbt->level = level; pbt->tiles.id = new_id; + pbt->tiles.num_planes = 1; /* * Check whether we want to replicate the tile in the cache. * Since we only do this when all the renderings will fit diff -Nru ghostscript-9.04~dfsg/base/gxht.h ghostscript-9.05~dfsg~20120125/base/gxht.h --- ghostscript-9.04~dfsg/base/gxht.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxht.h 2011-11-21 08:55:19.000000000 +0000 @@ -210,12 +210,6 @@ void gs_setaccuratescreens(gs_memory_t *, bool); bool gs_currentaccuratescreens(gs_memory_t *); -/* - * Set/get the value for UseWTS. - */ -void gs_setusewts(gs_memory_t *, bool); -bool gs_currentusewts(gs_memory_t *); - /* Initiate screen sampling with optional AccurateScreens. */ int gs_screen_init_memory(gs_screen_enum *, gs_state *, gs_screen_halftone *, bool, gs_memory_t *); diff -Nru ghostscript-9.04~dfsg/base/gxht_thresh.c ghostscript-9.05~dfsg~20120125/base/gxht_thresh.c --- ghostscript-9.04~dfsg/base/gxht_thresh.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxht_thresh.c 2011-12-08 09:35:23.000000000 +0000 @@ -174,7 +174,115 @@ } #endif -/* SSE2 and non-SSE2 implememntation of thresholding a row */ +/* SSE2 and non-SSE2 implememntation of thresholding a row. Subtractive case + There is some code replication between the two of these (additive and subtractive) + that I need to go back and determine how we can combine them without + any performance loss. */ +void +gx_ht_threshold_row_bit_sub(byte *contone, byte *threshold_strip, int contone_stride, + byte *halftone, int dithered_stride, int width, + int num_rows, int offset_bits) +{ +#ifndef HAVE_SSE2 + int k, j; + byte *contone_ptr; + byte *thresh_ptr; + byte *halftone_ptr; + byte bit_init; + + /* For the moment just do a very slow compare until we get + get this working. This could use some serious optimization */ + width -= offset_bits; + for (j = 0; j < num_rows; j++) { + byte h; + contone_ptr = contone; + thresh_ptr = threshold_strip + contone_stride * j; + halftone_ptr = halftone + dithered_stride * j; + /* First get the left remainder portion. Put into MSBs of first byte */ + bit_init = 0x80; + h = 0; + k = offset_bits; + if (k > 0) { + do { + if (*contone_ptr++ > *thresh_ptr++) { + h |= bit_init; + } + bit_init >>= 1; + if (bit_init == 0) { + bit_init = 0x80; + *halftone_ptr++ = h; + h = 0; + } + k--; + } while (k > 0); + bit_init = 0x80; + *halftone_ptr++ = h; + h = 0; + if (offset_bits < 8) + *halftone_ptr++ = 0; + } + /* Now get the rest, which will be 16 bit aligned. */ + k = width; + if (k > 0) { + do { + if (*contone_ptr++ > *thresh_ptr++) { + h |= bit_init; + } + bit_init >>= 1; + if (bit_init == 0) { + bit_init = 0x80; + *halftone_ptr++ = h; + h = 0; + } + k--; + } while (k > 0); + if (bit_init != 0x80) { + *halftone_ptr++ = h; + } + if ((width & 15) < 8) + *halftone_ptr++ = 0; + } + } +#else + byte *contone_ptr; + byte *thresh_ptr; + byte *halftone_ptr; + int num_tiles = (width - offset_bits + 15)>>4; + int k, j; + + for (j = 0; j < num_rows; j++) { + /* contone and thresh_ptr are 128 bit aligned. We do need to do this in + two steps to ensure that we pack the bits in an aligned fashion + into halftone_ptr. */ + contone_ptr = contone; + thresh_ptr = threshold_strip + contone_stride * j; + halftone_ptr = halftone + dithered_stride * j; + if (offset_bits > 0) { + /* Since we allowed for 16 bits in our left remainder + we can go directly in to the destination. threshold_16_SSE + requires 128 bit alignment. contone_ptr and thresh_ptr + are set up so that after we move in by offset_bits elements + then we are 128 bit aligned. */ + threshold_16_SSE_unaligned(thresh_ptr, contone_ptr, + halftone_ptr); + halftone_ptr += 2; + thresh_ptr += offset_bits; + contone_ptr += offset_bits; + } + /* Now we should have 128 bit aligned with our input data. Iterate + over sets of 16 going directly into our HT buffer. Sources and + halftone_ptr buffers should be padded to allow 15 bit overrun */ + for (k = 0; k < num_tiles; k++) { + threshold_16_SSE(thresh_ptr, contone_ptr, halftone_ptr); + thresh_ptr += 16; + contone_ptr += 16; + halftone_ptr += 2; + } + } +#endif +} + +/* SSE2 and non-SSE2 implememntation of thresholding a row. additive case */ void gx_ht_threshold_row_bit(byte *contone, byte *threshold_strip, int contone_stride, byte *halftone, int dithered_stride, int width, @@ -279,7 +387,99 @@ #endif } -/* This thresholds a buffer that is LAND_BITS wide by data_length tall. */ +/* This thresholds a buffer that is LAND_BITS wide by data_length tall. + Subtractive case */ +void +gx_ht_threshold_landscape_sub(byte *contone_align, byte *thresh_align, + ht_landscape_info_t ht_landscape, byte *halftone, + int data_length) +{ + __align16 byte contone[LAND_BITS]; + int position_start, position, curr_position; + int *widths = &(ht_landscape.widths[0]); + int local_widths[LAND_BITS]; + int num_contone = ht_landscape.num_contones; + int k, j, w, contone_out_posit; + byte *contone_ptr, *thresh_ptr, *halftone_ptr; +#ifdef PACIFY_VALGRIND + int extra = 0; +#endif + + /* Work through chunks of 16. */ + /* Data may have come in left to right or right to left. */ + if (ht_landscape.index > 0) { + position = position_start = 0; + } else { + position = position_start = ht_landscape.curr_pos + 1; + } + thresh_ptr = thresh_align; + halftone_ptr = halftone; + /* Copy the widths to a local array, and truncate the last one (which may + * be the first one!) if required. */ + k = 0; + for (j = 0; j < num_contone; j++) + k += (local_widths[j] = widths[position_start+j]); + if (k > LAND_BITS) { + if (ht_landscape.index > 0) { + local_widths[num_contone-1] -= k-LAND_BITS; + } else { + local_widths[0] -= k-LAND_BITS; + } + } +#ifdef PACIFY_VALGRIND + if (k < LAND_BITS) { + extra = LAND_BITS - k; + } +#endif + for (k = data_length; k > 0; k--) { /* Loop on rows */ + contone_ptr = &(contone_align[position]); /* Point us to our row start */ + curr_position = 0; /* We use this in keeping track of widths */ + contone_out_posit = 0; /* Our index out */ + for (j = num_contone; j > 0; j--) { + byte c = *contone_ptr; + /* The microsoft compiler, cleverly spots that the following loop + * can be replaced by a memset. Unfortunately, it can't spot that + * the typical length values of the memset are so small that we'd + * be better off doing it the slow way. We therefore introduce a + * sneaky 'volatile' cast below that stops this optimisation. */ + w = local_widths[curr_position]; + do { + ((volatile byte *)contone)[contone_out_posit] = c; + contone_out_posit++; + } while (--w); +#ifdef PACIFY_VALGRIND + if (extra) + memset(contone+contone_out_posit, 0, extra); +#endif + curr_position++; /* Move us to the next position in our width array */ + contone_ptr++; /* Move us to a new location in our contone buffer */ + } + /* Now we have our left justified and expanded contone data for + LAND_BITS/16 sets of 16 bits. Go ahead and threshold these. */ + contone_ptr = &contone[0]; +#if LAND_BITS > 16 + j = LAND_BITS; + do { +#endif +#ifdef HAVE_SSE2 + threshold_16_SSE(thresh_ptr, contone_ptr, halftone_ptr); +#else + threshold_16_bit(thresh_ptr, contone_ptr, halftone_ptr); +#endif + thresh_ptr += 16; + position += 16; + halftone_ptr += 2; + contone_ptr += 16; +#if LAND_BITS > 16 + j -= 16; + } while (j > 0); +#endif + } +} + +/* This thresholds a buffer that is LAND_BITS wide by data_length tall. + Additive case. Note I could likely do some code reduction between + the additive and subtractive cases */ void gx_ht_threshold_landscape(byte *contone_align, byte *thresh_align, ht_landscape_info_t ht_landscape, byte *halftone, @@ -420,7 +620,8 @@ /* RJW: This was 16 here, but as I don't understand why, I'm using * LAND_BITS instead. Check with Michael. */ temp = (col_length + LAND_BITS-1)/LAND_BITS; - penum->line_size = temp * LAND_BITS; /* The stride */ + /* bitmap_raster() expects the width in bits, hence "* 8" */ + penum->line_size = bitmap_raster((temp * LAND_BITS) * 8); /* The stride */ /* Now we need at most LAND_BITS of these */ penum->line = gs_alloc_bytes(penum->memory, LAND_BITS * penum->line_size * spp_out + 16, @@ -430,9 +631,11 @@ penum->line_size * LAND_BITS + 16, "gxht_thresh"); /* That maps into (LAND_BITS/8) bytes of Halftone data */ - penum->ht_buffer = gs_alloc_bytes(penum->memory, - penum->line_size * (LAND_BITS>>3), - "gxht_thresh"); + penum->ht_buffer = + gs_alloc_bytes(penum->memory, + penum->line_size * (LAND_BITS>>3) * spp_out, + "gxht_thresh"); + penum->ht_plane_height = penum->line_size; penum->ht_stride = penum->line_size; if (penum->line == NULL || penum->thresh_buffer == NULL || penum->ht_buffer == NULL) @@ -463,7 +666,7 @@ if (code >= 0) { #if defined(DEBUG) || defined(PACIFY_VALGRIND) memset(penum->line, 0, LAND_BITS * penum->line_size * spp_out + 16); - memset(penum->ht_buffer, 0, penum->line_size * (LAND_BITS>>3)); + memset(penum->ht_buffer, 0, penum->line_size * (LAND_BITS>>3) * spp_out); memset(penum->thresh_buffer, 0, LAND_BITS * penum->line_size + 16); #endif } @@ -488,22 +691,22 @@ the MSBit positions. Note the #define chunk bits16 in gdevm1.c. Allow also for a 15 sample over run. */ - penum->ht_offset_bits = (-fixed2int_var_pixround(ox)) & 15; + penum->ht_offset_bits = (-fixed2int_var_pixround(ox)) & (bitmap_raster(1) - 1); if (penum->ht_offset_bits > 0) { - penum->ht_stride = ((7 + (dev_width + 4)) / 8) + - ARCH_SIZEOF_LONG; + penum->ht_stride = bitmap_raster((7 + (dev_width + 4)) + (ARCH_SIZEOF_LONG * 8)); } else { - penum->ht_stride = ((7 + (dev_width + 2)) / 8) + - ARCH_SIZEOF_LONG; + penum->ht_stride = bitmap_raster((7 + (dev_width + 2)) + (ARCH_SIZEOF_LONG * 8)); } /* We want to figure out the maximum height that we may have in taking a single source row and going to device space */ max_height = (int) ceil(fixed2float(any_abs(penum->dst_height)) / (float) penum->Height); - penum->ht_buffer = gs_alloc_bytes(penum->memory, - penum->ht_stride * max_height, - "gxht_thresh"); + penum->ht_buffer = + gs_alloc_bytes(penum->memory, + penum->ht_stride * max_height * spp_out, + "gxht_thresh"); + penum->ht_plane_height = penum->ht_stride * max_height; /* We want to have 128 bit alignement for our contone and threshold strips so that we can use SSE operations in the threshold operation. Add in a minor buffer and offset @@ -518,7 +721,7 @@ by this remainder portion we should be 128 bit aligned. Also allow a 15 sample over run during the execution. */ temp = (int) ceil((float) ((dev_width + 15.0) + 15.0)/16.0); - penum->line_size = temp * 16; /* The stride */ + penum->line_size = bitmap_raster(temp * 16 * 8); /* The stride */ penum->line = gs_alloc_bytes(penum->memory, penum->line_size * spp_out, "gxht_thresh"); penum->thresh_buffer = gs_alloc_bytes(penum->memory, @@ -530,7 +733,7 @@ } else { #if defined(DEBUG) || defined(PACIFY_VALGRIND) memset(penum->line, 0, penum->line_size * spp_out); - memset(penum->ht_buffer, 0, penum->ht_stride * max_height); + memset(penum->ht_buffer, 0, penum->ht_stride * max_height * spp_out); memset(penum->thresh_buffer, 0, penum->line_size * max_height); #endif } @@ -629,94 +832,100 @@ } } -/* This performs a thresholding operation on a single plane of data and - performs a copy mono operation to the device */ +/* This performs a thresholding operation on multiple planes of data and + stores the bits into a planar buffer which can then be used for + copy_planes */ int -gxht_thresh_plane(gx_image_enum *penum, gx_ht_order *d_order, - fixed xrun, int dest_width, int dest_height, - byte *thresh_align, byte *contone_align, int contone_stride, - gx_device * dev, int plane_number, bool allow_reset) +gxht_thresh_planes(gx_image_enum *penum, fixed xrun, + int dest_width, int dest_height, + byte *thresh_align, gx_device * dev, int offset_contone[], + int contone_stride) { int thresh_width, thresh_height, dx; int left_rem_end, left_width, vdi; int num_full_tiles, right_tile_width; - int k, jj, dy; + int k, jj, dy, j; byte *thresh_tile; int position; bool replicate_tile; image_posture posture = penum->posture; const int y_pos = penum->yci; - int width; + int width = 0; /* Init to silence compiler warnings */ byte *ptr_out, *row_ptr, *ptr_out_temp; - byte *threshold = d_order->threshold; + byte *threshold; int init_tile, in_row_offset, ii, num_tiles, tile_remainder; int offset_bits = penum->ht_offset_bits; - byte *halftone = penum->ht_buffer; + byte *halftone; int dithered_stride = penum->ht_stride; bool is_planar_dev = dev_proc(dev, dev_spec_op)(dev, gxdso_is_native_planar, NULL, 0); gx_color_index dev_white = gx_device_white(dev); gx_color_index dev_black = gx_device_black(dev); bool done = false; + bool allow_reset = false; /* Init to silence compiler warnings */ + int spp_out = dev->color_info.num_components; + byte *contone_align = NULL; /* Init to silence compiler warnings */ /* Go ahead and fill the threshold line buffer with tiled threshold values. First just grab the row or column that we are going to tile with and then do memcpy into the buffer */ - thresh_width = d_order->width; - thresh_height = d_order->height; /* Figure out the tile steps. Left offset, Number of tiles, Right offset. */ switch (posture) { case image_portrait: + allow_reset = true; vdi = penum->hci; - /* Compute the tiling positions with dest_width */ - dx = fixed2int_var(xrun) % thresh_width; - /* Left remainder part */ - left_rem_end = min(dx + dest_width, thresh_width); - left_width = left_rem_end - dx; /* The left width of our tile part */ - /* Now the middle part */ - num_full_tiles = - (int)fastfloor((dest_width - left_width)/ (float) thresh_width); - /* Now the right part */ - right_tile_width = dest_width - num_full_tiles * thresh_width - - left_width; - /* Those dimensions stay the same across the set of lines that - we fill in our buffer. Iterate over the vdi and fill up our - threshold buffer */ - for (k = 0; k < vdi; k++) { - /* Get a pointer to our tile row */ - dy = (penum->yci + k + penum->dev->band_offset_y) % thresh_height; - thresh_tile = threshold + d_order->width * dy; - /* Fill the buffer, can be multiple rows. Make sure - to update with stride */ - position = contone_stride * k; - /* Tile into the 128 bit aligned threshold strip */ - fill_threshhold_buffer(&(thresh_align[position]), - thresh_tile, thresh_width, dx, left_width, - num_full_tiles, right_tile_width); - } - /* Apply the threshold operation */ -#if RAW_HT_DUMP - gx_ht_threshold_row_byte(contone_align, thresh_align, contone_stride, - halftone, dithered_stride, dest_width, vdi); - sprintf(file_name,"HT_Portrait_%d_%dx%dx%d.raw", penum->id, dest_width, - dest_height, spp_out); - fid = fopen(file_name,"a+b"); - fwrite(halftone,1,dest_width * vdi,fid); - fclose(fid); -#else - if (offset_bits > dest_width) - offset_bits = dest_width; + /* Iterate over the vdi and fill up our threshold buffer. We + also need to loop across the planes of data */ + for (j = 0; j < spp_out; j++) { + thresh_width = penum->pis->dev_ht->components[j].corder.width; + thresh_height = penum->pis->dev_ht->components[j].corder.full_height; + halftone = penum->ht_buffer + j * penum->ht_plane_height; + /* Compute the tiling positions with dest_width */ + dx = fixed2int_var(xrun) % thresh_width; + /* Left remainder part */ + left_rem_end = min(dx + dest_width, thresh_width); + /* The left width of our tile part */ + left_width = left_rem_end - dx; + /* Now the middle part */ + num_full_tiles = + (int)fastfloor((dest_width - left_width)/ (float) thresh_width); + /* Now the right part */ + right_tile_width = dest_width - num_full_tiles * thresh_width - + left_width; + /* Get the proper threshold for the colorant count */ + threshold = penum->pis->dev_ht->components[j].corder.threshold; + /* Point to the proper contone data */ + contone_align = penum->line + contone_stride * j + + offset_contone[j]; + for (k = 0; k < vdi; k++) { + /* Get a pointer to our tile row */ + dy = (penum->yci + k + penum->dev->band_offset_y) % thresh_height; + if (dy < 0) + dy += thresh_height; + thresh_tile = threshold + thresh_width * dy; + /* Fill the buffer, can be multiple rows. Make sure + to update with stride */ + position = contone_stride * k; + /* Tile into the 128 bit aligned threshold strip */ + fill_threshhold_buffer(&(thresh_align[position]), + thresh_tile, thresh_width, dx, left_width, + num_full_tiles, right_tile_width); + } + /* Apply the threshold operation */ + if (offset_bits > dest_width) + offset_bits = dest_width; - if (dev->color_info.polarity == GX_CINFO_POLARITY_SUBTRACTIVE - && is_planar_dev) { - gx_ht_threshold_row_bit(thresh_align, contone_align, contone_stride, - halftone, dithered_stride, dest_width, vdi, - offset_bits); - } else { - gx_ht_threshold_row_bit(contone_align, thresh_align, contone_stride, - halftone, dithered_stride, dest_width, vdi, - offset_bits); + if (dev->color_info.polarity == GX_CINFO_POLARITY_SUBTRACTIVE + && is_planar_dev) { + gx_ht_threshold_row_bit_sub(contone_align, thresh_align, contone_stride, + halftone, dithered_stride, dest_width, vdi, + offset_bits); + } else { + gx_ht_threshold_row_bit(contone_align, thresh_align, contone_stride, + halftone, dithered_stride, dest_width, vdi, + offset_bits); + } } /* FIXME: An improvement here would be to generate the initial * offset_bits at the correct offset within the byte so that they @@ -732,151 +941,173 @@ if (offset_bits > 0) { int x_pos = fixed2int_var(xrun); if (!is_planar_dev) { - (*dev_proc(dev, copy_mono)) (dev, halftone, 0, dithered_stride, + (*dev_proc(dev, copy_mono)) (dev, penum->ht_buffer, 0, dithered_stride, gx_no_bitmap_id, x_pos, y_pos, offset_bits, vdi, dev_white, dev_black); } else { - (*dev_proc(dev, copy_plane)) (dev, halftone, 0, dithered_stride, + (*dev_proc(dev, copy_planes)) (dev, penum->ht_buffer, 0, dithered_stride, gx_no_bitmap_id, x_pos, y_pos, - offset_bits, vdi, plane_number); + offset_bits, vdi, vdi); } } if ((dest_width - offset_bits) > 0 ) { /* Now the primary aligned bytes */ - byte *curr_ptr = halftone; int curr_width = dest_width - offset_bits; int x_pos = fixed2int_var(xrun) + offset_bits; - if (offset_bits > 0) { - curr_ptr += 2; /* If the first 2 bytes had the left part then increment */ - } + /* FIXME: This assumes the allowed offset_bits will always be <= 16 */ + int xoffs = offset_bits > 0 ? 16 : 0; + if (!is_planar_dev) { - (*dev_proc(dev, copy_mono)) (dev, curr_ptr, 0, dithered_stride, + (*dev_proc(dev, copy_mono)) (dev, penum->ht_buffer, xoffs, dithered_stride, gx_no_bitmap_id, x_pos, y_pos, curr_width, vdi, dev_white, dev_black); } else { - (*dev_proc(dev, copy_plane)) (dev, curr_ptr, 0, dithered_stride, + (*dev_proc(dev, copy_planes)) (dev, penum->ht_buffer, xoffs, dithered_stride, gx_no_bitmap_id, x_pos, y_pos, - curr_width, vdi, plane_number); + curr_width, vdi, vdi); } } -#endif + break; case image_landscape: /* Go ahead and paint the chunk if we have LAND_BITS values or a * partial to get us in sync with the 1 bit devices 16 bit * positions. */ vdi = penum->wci; + /* Now do the haftoning into our buffer. We basically check + first if we have enough data or are all done */ while ( (penum->ht_landscape.count >= LAND_BITS || ((penum->ht_landscape.count >= offset_bits) && penum->ht_landscape.offset_set)) && !done ) { /* Go ahead and 2D tile in the threshold buffer at this time */ /* Always work the tiling from the upper left corner of our LAND_BITS columns */ - if (penum->ht_landscape.offset_set) { - width = offset_bits; - } else { - width = LAND_BITS; - } - if (penum->y_extent.x < 0) { - dx = (penum->ht_landscape.xstart - width + 1) % thresh_width; - } else { - dx = penum->ht_landscape.xstart % thresh_width; - } - dy = (penum->dev->band_offset_y + penum->ht_landscape.y_pos) % thresh_height; - if (dy < 0) - dy += thresh_height; - /* Left remainder part */ - left_rem_end = min(dx + LAND_BITS, thresh_width); - left_width = left_rem_end - dx; - /* Now the middle part */ - num_full_tiles = (LAND_BITS - left_width) / thresh_width; - /* Now the right part */ - right_tile_width = - LAND_BITS - num_full_tiles * thresh_width - left_width; - /* Now loop over the y stuff */ - ptr_out = thresh_align; - /* Do this in three parts. We do a top part, followed by - larger mem copies followed by a bottom partial. After - a slower initial fill we are able to do larger faster - expansions */ - if (dest_height <= 2 * thresh_height) { - init_tile = dest_height; - replicate_tile = false; - } else { - init_tile = thresh_height; - replicate_tile = true; - } - for (jj = 0; jj < init_tile; jj++) { - in_row_offset = (jj + dy) % thresh_height; - row_ptr = threshold + in_row_offset * thresh_width; - ptr_out_temp = ptr_out; - /* Left part */ - memcpy(ptr_out_temp, row_ptr + dx, left_width); - ptr_out_temp += left_width; - /* Now the full tiles */ - for (ii = 0; ii < num_full_tiles; ii++) { - memcpy(ptr_out_temp, row_ptr, thresh_width); - ptr_out_temp += thresh_width; - } - /* Now the remainder */ - memcpy(ptr_out_temp, row_ptr, right_tile_width); - ptr_out += LAND_BITS; - } - if (replicate_tile) { - /* Find out how many we need to copy */ - num_tiles = - (int)fastfloor((float) (dest_height - thresh_height)/ (float) thresh_height); - tile_remainder = dest_height - (num_tiles + 1) * thresh_height; - for (jj = 0; jj < num_tiles; jj ++) { - memcpy(ptr_out, thresh_align, LAND_BITS * thresh_height); - ptr_out += LAND_BITS * thresh_height; + for (j = 0; j < spp_out; j++) { + halftone = penum->ht_buffer + + j * penum->ht_plane_height * (LAND_BITS>>3); + thresh_width = penum->pis->dev_ht->components[j].corder.width; + thresh_height = + penum->pis->dev_ht->components[j].corder.full_height; + /* Get the proper threshold for the colorant count */ + threshold = penum->pis->dev_ht->components[j].corder.threshold; + /* Point to the proper contone data */ + contone_align = penum->line + offset_contone[j] + + LAND_BITS * j * contone_stride; + if (j == spp_out - 1) { + allow_reset = true; + } else { + allow_reset = false; + } + if (penum->ht_landscape.offset_set) { + width = offset_bits; + } else { + width = LAND_BITS; + } + if (penum->y_extent.x < 0) { + dx = (penum->ht_landscape.xstart - width + 1) % + thresh_width; + } else { + dx = penum->ht_landscape.xstart % thresh_width; + } + dy = (penum->dev->band_offset_y + + penum->ht_landscape.y_pos) % thresh_height; + if (dy < 0) + dy += thresh_height; + /* Left remainder part */ + left_rem_end = min(dx + LAND_BITS, thresh_width); + left_width = left_rem_end - dx; + /* Now the middle part */ + num_full_tiles = (LAND_BITS - left_width) / thresh_width; + /* Now the right part */ + right_tile_width = + LAND_BITS - num_full_tiles * thresh_width - left_width; + /* Now loop over the y stuff */ + ptr_out = thresh_align; + /* Do this in three parts. We do a top part, followed by + larger mem copies followed by a bottom partial. After + a slower initial fill we are able to do larger faster + expansions */ + if (dest_height <= 2 * thresh_height) { + init_tile = dest_height; + replicate_tile = false; + } else { + init_tile = thresh_height; + replicate_tile = true; + } + for (jj = 0; jj < init_tile; jj++) { + in_row_offset = (jj + dy) % thresh_height; + row_ptr = threshold + in_row_offset * thresh_width; + ptr_out_temp = ptr_out; + /* Left part */ + memcpy(ptr_out_temp, row_ptr + dx, left_width); + ptr_out_temp += left_width; + /* Now the full tiles */ + for (ii = 0; ii < num_full_tiles; ii++) { + memcpy(ptr_out_temp, row_ptr, thresh_width); + ptr_out_temp += thresh_width; + } + /* Now the remainder */ + memcpy(ptr_out_temp, row_ptr, right_tile_width); + ptr_out += LAND_BITS; + } + if (replicate_tile) { + /* Find out how many we need to copy */ + num_tiles = + (int)fastfloor((float) (dest_height - thresh_height)/ (float) thresh_height); + tile_remainder = dest_height - (num_tiles + 1) * thresh_height; + for (jj = 0; jj < num_tiles; jj ++) { + memcpy(ptr_out, thresh_align, LAND_BITS * thresh_height); + ptr_out += LAND_BITS * thresh_height; + } + /* Now fill in the remainder */ + memcpy(ptr_out, thresh_align, LAND_BITS * tile_remainder); + } + /* Apply the threshold operation */ + if (dev->color_info.polarity == GX_CINFO_POLARITY_SUBTRACTIVE + && is_planar_dev) { + gx_ht_threshold_landscape_sub(contone_align, thresh_align, + penum->ht_landscape, halftone, dest_height); + } else { + gx_ht_threshold_landscape(contone_align, thresh_align, + penum->ht_landscape, halftone, dest_height); } - /* Now fill in the remainder */ - memcpy(ptr_out, thresh_align, LAND_BITS * tile_remainder); - } - /* Apply the threshold operation */ - if (dev->color_info.polarity == GX_CINFO_POLARITY_SUBTRACTIVE - && is_planar_dev) { - gx_ht_threshold_landscape(thresh_align, contone_align, - penum->ht_landscape, halftone, dest_height); - } else { - gx_ht_threshold_landscape(contone_align, thresh_align, - penum->ht_landscape, halftone, dest_height); } /* Perform the copy mono */ if (penum->ht_landscape.index < 0) { if (!is_planar_dev) { - (*dev_proc(dev, copy_mono)) (dev, halftone, 0, LAND_BITS>>3, - gx_no_bitmap_id, - penum->ht_landscape.xstart - width + 1, - penum->ht_landscape.y_pos, - width, dest_height, - dev_white, dev_black); + (*dev_proc(dev, copy_mono)) + (dev, penum->ht_buffer, 0, LAND_BITS>>3, + gx_no_bitmap_id, + penum->ht_landscape.xstart - width + 1, + penum->ht_landscape.y_pos, + width, dest_height, + dev_white, dev_black); } else { - (*dev_proc(dev, copy_plane)) (dev, halftone, 0, LAND_BITS>>3, - gx_no_bitmap_id, - penum->ht_landscape.xstart - width + 1, - penum->ht_landscape.y_pos, - width, dest_height, - plane_number); + (*dev_proc(dev, copy_planes)) + (dev, penum->ht_buffer, 0, LAND_BITS>>3, + gx_no_bitmap_id, + penum->ht_landscape.xstart - width + 1, + penum->ht_landscape.y_pos, + width, dest_height, + penum->ht_plane_height); } } else { if (!is_planar_dev) { - (*dev_proc(dev, copy_mono)) (dev, halftone, 0, LAND_BITS>>3, + (*dev_proc(dev, copy_mono)) (dev, penum->ht_buffer, 0, LAND_BITS>>3, gx_no_bitmap_id, penum->ht_landscape.xstart, penum->ht_landscape.y_pos, width, dest_height, dev_white, dev_black); } else { - (*dev_proc(dev, copy_plane)) (dev, halftone, 0, LAND_BITS>>3, + (*dev_proc(dev, copy_planes)) (dev, penum->ht_buffer, 0, LAND_BITS>>3, gx_no_bitmap_id, penum->ht_landscape.xstart, penum->ht_landscape.y_pos, - width, dest_height, - plane_number); + width, dest_height, + penum->ht_plane_height); } } /* Clean up and reset our buffer. We may have a line left diff -Nru ghostscript-9.04~dfsg/base/gxht_thresh.h ghostscript-9.05~dfsg~20120125/base/gxht_thresh.h --- ghostscript-9.04~dfsg/base/gxht_thresh.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxht_thresh.h 2011-11-21 08:55:19.000000000 +0000 @@ -29,12 +29,18 @@ int contone_stride, byte *halftone, int dithered_stride, int width, int num_rows, int offset_bits); +void gx_ht_threshold_row_bit_sub(byte *contone, byte *threshold_strip, + int contone_stride, byte *halftone, + int dithered_stride, int width, int num_rows, + int offset_bits); void gx_ht_threshold_landscape(byte *contone_align, byte *thresh_align, ht_landscape_info_t ht_landscape, byte *halftone, int data_length); +void gx_ht_threshold_landscape_sub(byte *contone_align, byte *thresh_align, + ht_landscape_info_t ht_landscape, byte *halftone, + int data_length); int gxht_thresh_image_init(gx_image_enum *penum); -int gxht_thresh_plane(gx_image_enum *penum, gx_ht_order *d_order, - fixed xrun, int dest_width, int dest_height, - byte *thresh_align, byte *contone_align, int contone_stride, - gx_device * dev, int plane_number, bool allow_reset); +int gxht_thresh_planes(gx_image_enum *penum, fixed xrun, int dest_width, + int dest_height, byte *thresh_align, gx_device * dev, + int offset_contone[], int contone_stride); #endif /* gshtx_INCLUDED */ diff -Nru ghostscript-9.04~dfsg/base/gxi12bit.c ghostscript-9.05~dfsg~20120125/base/gxi12bit.c --- ghostscript-9.04~dfsg/base/gxi12bit.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxi12bit.c 2012-01-07 20:18:22.000000000 +0000 @@ -145,8 +145,8 @@ cmm_dev_profile_t *dev_profile; code = dev_proc(penum->dev, get_profile)(penum->dev, &dev_profile); - num_des_comps = dev_profile->device_profile[0]->num_comps; - penum->icc_setup.need_decode = false; + num_des_comps = gsicc_get_device_profile_comps(dev_profile); + penum->icc_setup.need_decode = false; /* Check if we need to do any decoding. If yes, then that will slow us down */ for (k = 0; k < src_num_comp; k++) { if ( penum->map[k].decoding != sd_none ) { @@ -170,7 +170,7 @@ if (penum->icc_setup.is_lab) penum->icc_setup.need_decode = false; if (penum->icc_link == NULL) { penum->icc_link = gsicc_get_link(penum->pis, penum->dev, pcs, NULL, - &rendering_params, penum->memory, false); + &rendering_params, penum->memory); } /* Use the direct unpacking proc */ penum->unpack = sample_unpackicc_16_proc; @@ -291,7 +291,7 @@ (*map_cmyk) (next.v[0], next.v[1], next.v[2], next.v[3], pdevc_next, pis, dev, - gs_color_select_source); + gs_color_select_source, NULL); goto f; } decode_frac(next.v[0], cc, 0); @@ -578,7 +578,7 @@ color_fracs run; /* run value */ color_fracs next; /* next sample value */ const unsigned short *bufend = psrc + w; - int code = 0, mcode = 0; + int code = 0; gsicc_bufferdesc_t input_buff_desc; gsicc_bufferdesc_t output_buff_desc; unsigned short *psrc_cm, *psrc_cm_start, *psrc_decode; @@ -610,10 +610,8 @@ /* These used to be set by init clues */ pdevc->type = gx_dc_type_none; pdevc_next->type = gx_dc_type_none; - if (h == 0) - return 0; code = dev_proc(dev, get_profile)(dev, &dev_profile); - num_des_comps = dev_profile->device_profile[0]->num_comps; + num_des_comps = gsicc_get_device_profile_comps(dev_profile); /* If the link is the identity, then we don't need to do any color conversions except for potentially a decode. */ if (penum->icc_link->is_identity && !need_decode) { @@ -660,15 +658,19 @@ (const unsigned short*) (psrc_decode+w), penum->cie_range); } - gscms_transform_color_buffer(penum->icc_link, &input_buff_desc, - &output_buff_desc, (void*) psrc_decode, - (void*) psrc_cm); + (penum->icc_link->procs.map_buffer)(dev, penum->icc_link, + &input_buff_desc, + &output_buff_desc, + (void*) psrc_decode, + (void*) psrc_cm); gs_free_object(pis->memory, (byte *)psrc_decode, "image_render_color_icc"); } else { /* CM only. No decode */ - gscms_transform_color_buffer(penum->icc_link, &input_buff_desc, - &output_buff_desc, (void*) psrc, - (void*) psrc_cm); + (penum->icc_link->procs.map_buffer)(dev, penum->icc_link, + &input_buff_desc, + &output_buff_desc, + (void*) psrc, + (void*) psrc_cm); } } } @@ -746,7 +748,6 @@ if (code < 0) goto err; rsrc = psrc; - if ((code = mcode) < 0) goto err; /* Swap around the colors due to a change */ ptemp = pdevc; pdevc = pdevc_next; diff -Nru ghostscript-9.04~dfsg/base/gxicolor.c ghostscript-9.05~dfsg~20120125/base/gxicolor.c --- ghostscript-9.04~dfsg/base/gxicolor.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxicolor.c 2012-01-07 20:18:22.000000000 +0000 @@ -117,7 +117,7 @@ cmm_dev_profile_t *dev_profile; code = dev_proc(penum->dev, get_profile)(penum->dev, &dev_profile); - des_num_comp = dev_profile->device_profile[0]->num_comps; + des_num_comp = gsicc_get_device_profile_comps(dev_profile); penum->icc_setup.need_decode = false; /* Check if we need to do any decoding. If yes, then that will slow us down */ for (k = 0; k < src_num_comp; k++) { @@ -142,7 +142,7 @@ if (penum->icc_setup.is_lab) penum->icc_setup.need_decode = false; if (penum->icc_link == NULL) { penum->icc_link = gsicc_get_link(penum->pis, penum->dev, pcs, NULL, - &rendering_params, penum->memory, false); + &rendering_params, penum->memory); } /* PS CIE color spaces may have addition decoding that needs to be performed to ensure that the range of 0 to 1 is provided @@ -300,7 +300,7 @@ cmm_dev_profile_t *dev_profile; code = dev_proc(dev, get_profile)(dev, &dev_profile); - num_des_comps = dev_profile->device_profile[0]->num_comps; + num_des_comps = gsicc_get_device_profile_comps(dev_profile); if (penum->icc_link == NULL) { return gs_rethrow(-1, "ICC Link not created during image render color"); } @@ -363,16 +363,20 @@ decode_row_cie(penum, psrc, spp, *psrc_decode, (*psrc_decode)+w, penum->cie_range); } - gscms_transform_color_buffer(penum->icc_link, &input_buff_desc, - &output_buff_desc, (void*) *psrc_decode, - (void*) *psrc_cm); + (penum->icc_link->procs.map_buffer)(dev, penum->icc_link, + &input_buff_desc, + &output_buff_desc, + (void*) *psrc_decode, + (void*) *psrc_cm); gs_free_object(pis->memory, (byte *) *psrc_decode, "image_render_color_icc"); } else { /* CM only. No decode */ - gscms_transform_color_buffer(penum->icc_link, &input_buff_desc, - &output_buff_desc, (void*) psrc, - (void*) *psrc_cm); + (penum->icc_link->procs.map_buffer)(dev, penum->icc_link, + &input_buff_desc, + &output_buff_desc, + (void*) psrc, + (void*) *psrc_cm); } } } @@ -391,12 +395,10 @@ byte *thresh_align; byte *devc_contone[GX_DEVICE_COLOR_MAX_COMPONENTS]; byte *psrc_plane[GX_DEVICE_COLOR_MAX_COMPONENTS]; - byte *contone_align; byte *devc_contone_gray; const byte *psrc = buffer + data_x; int dest_width, dest_height, data_length; int spp_out = dev->color_info.num_components; - gx_ht_order *d_order; int position, k, j; int offset_bits = penum->ht_offset_bits; int contone_stride = 0; /* Not used in landscape case */ @@ -414,7 +416,6 @@ int psrc_planestride = w/penum->spp; gx_color_value conc; int num_des_comp = penum->dev->color_info.num_components; - bool allow_reset; if (h != 0) { /* Get the buffer into the device color space */ @@ -447,7 +448,7 @@ /* Data is now in the proper destination color space. Now we want to go ahead and get the data into the proper spatial setting and then threshold. First get the data spatially sampled correctly */ - src_size = (penum->rect.w - 1.0); + src_size = penum->rect.w - 1; switch (posture) { case image_portrait: /* Figure out our offset in the contone and threshold data @@ -473,7 +474,7 @@ scale_factor = float2fixed_rounded((float) src_size / (float) (dest_width - 1)); #ifdef DEBUG /* Help in spotting problems */ - memset(penum->ht_buffer, 0x00, penum->ht_stride * vdi); + memset(penum->ht_buffer, 0x00, penum->ht_stride * vdi * spp_out); #endif break; case image_landscape: @@ -510,10 +511,13 @@ if (penum->ht_landscape.index < 0) { penum->ht_landscape.xstart = penum->xci + vdi - 1; offset_bits = (penum->ht_landscape.xstart % 16) + 1; + /* xci can be negative, so allow for that */ + if (offset_bits <= 0) offset_bits += 16; } else { penum->ht_landscape.xstart = penum->xci; + /* xci can be negative, see Bug 692569. */ offset_bits = 16 - penum->xci % 16; - if (offset_bits == 16) offset_bits = 0; + if (offset_bits >= 16) offset_bits -= 16; } if (offset_bits == 0 || offset_bits == 16) { penum->ht_landscape.offset_set = false; @@ -757,25 +761,9 @@ depnding upon the polarity of the device */ flush: thresh_align = penum->thresh_buffer + offset_threshold; - for (k = 0; k < spp_out; k++) { - d_order = &(penum->pis->dev_ht->components[k].corder); - if (posture == image_portrait) { - contone_align = penum->line + contone_stride * k + - offset_contone[k]; - allow_reset = true; - } else { - contone_align = penum->line + offset_contone[k] + - LAND_BITS * k * contone_stride; - if (k == spp_out - 1) { - allow_reset = true; - } else { - allow_reset = false; - } - } - code = gxht_thresh_plane(penum, d_order, xrun, dest_width, dest_height, - thresh_align, contone_align, - contone_stride, dev, k, allow_reset); - } + code = gxht_thresh_planes(penum, xrun, dest_width, dest_height, + thresh_align, dev, offset_contone, + contone_stride); /* Free cm buffer, if it was used */ if (psrc_cm_start != NULL) { gs_free_object(penum->pis->memory, (byte *)psrc_cm_start, @@ -812,7 +800,7 @@ color_samples run; /* run value */ color_samples next; /* next sample value */ byte *bufend = NULL; - int code = 0, mcode = 0; + int code = 0; byte *psrc_cm = NULL, *psrc_cm_start = NULL, *psrc_decode = NULL; int k; gx_color_value conc[GX_DEVICE_COLOR_MAX_COMPONENTS]; @@ -868,7 +856,7 @@ if (posture != image_skewed && next.all[0] == run.all[0]) goto inc; /* This needs to be sped up */ - for ( k = 0; k < spp_cm; k++ ) { + for ( k = 0; k < spp_cm; k++ ) { conc[k] = gx_color_value_from_byte(next.v[k]); } /* Now we can do an encoding directly or we have to apply transfer @@ -930,7 +918,6 @@ if (code < 0) goto err; rsrc = psrc; - if ((code = mcode) < 0) goto err; /* Swap around the colors due to a change */ ptemp = pdevc; pdevc = pdevc_next; diff -Nru ghostscript-9.04~dfsg/base/gxidata.c ghostscript-9.05~dfsg~20120125/base/gxidata.c --- ghostscript-9.04~dfsg/base/gxidata.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxidata.c 2011-11-12 18:29:08.000000000 +0000 @@ -460,7 +460,7 @@ gs_free_object(mem, penum->clip_dev, "image clipper"); if (scaler != 0) { - (*scaler->template->release) ((stream_state *) scaler); + (*scaler->templat->release) ((stream_state *) scaler); gs_free_object(mem, scaler, "image scaler state"); } if (penum->icc_link != NULL) { diff -Nru ghostscript-9.04~dfsg/base/gximag3x.c ghostscript-9.05~dfsg~20120125/base/gximag3x.c --- ghostscript-9.04~dfsg/base/gximag3x.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gximag3x.c 2011-09-29 11:01:33.000000000 +0000 @@ -610,7 +610,7 @@ mask_used[i] = 0; if (!penum->mask[i].depth) continue; - h1 = min(h1, mh - penum->mask[i].y); + h1 = min(h1, ((mh > penum->mask[i].y) ? (mh - penum->mask[i].y) : mh)); if (penum->mask[i].InterleaveType == interleave_chunky) ++num_chunky; } @@ -618,19 +618,8 @@ /* Initialized rows_used in case we get an error. */ *rows_used = 0; -/* FIX_ME. In the soft mask branch - the file associated with bug 689290 - gets into an endless loop. This - is related to the size mismatch of the - soft mask which is 1x1 and the - image size */ - if (h <= 0) -#ifdef ENDLESS_LOOP return 0; -#else - return 1; -#endif /* Handle masks from separate sources. */ for (i = 0; i < NUM_MASKS; ++i) diff -Nru ghostscript-9.04~dfsg/base/gximage3.c ghostscript-9.05~dfsg~20120125/base/gximage3.c --- ghostscript-9.04~dfsg/base/gximage3.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gximage3.c 2012-01-07 20:18:22.000000000 +0000 @@ -144,6 +144,7 @@ bits.size.x = mdev->width; bits.size.y = mdev->height; bits.id = gx_no_bitmap_id; + bits.num_planes = 1; code = gx_mask_clip_initialize(mcdev, &gs_mask_clip_device, (const gx_bitmap *)&bits, dev, origin->x, origin->y, mem); @@ -190,6 +191,7 @@ gx_image_enum_common_t **pinfo) { const gs_image3_t *pim = (const gs_image3_t *)pic; + gs_image3_t local_pim; gx_image3_enum_t *penum; gs_int_rect mask_rect, data_rect; gx_device *mdev = 0; @@ -224,20 +226,36 @@ if (pim->MaskDict.BitsPerComponent != 1) return_error(gs_error_rangecheck); } - if (!check_image3_extent(pim->ImageMatrix.xx, - pim->MaskDict.ImageMatrix.xx) || - !check_image3_extent(pim->ImageMatrix.xy, - pim->MaskDict.ImageMatrix.xy) || - !check_image3_extent(pim->ImageMatrix.yx, - pim->MaskDict.ImageMatrix.yx) || - !check_image3_extent(pim->ImageMatrix.yy, - pim->MaskDict.ImageMatrix.yy) - ) - return_error(gs_error_rangecheck); - if ((code = gs_matrix_invert(&pim->ImageMatrix, &mi_pixel)) < 0 || - (code = gs_matrix_invert(&pim->MaskDict.ImageMatrix, &mi_mask)) < 0 - ) + if ((code = gs_matrix_invert(&pim->ImageMatrix, &mi_pixel)) < 0) return code; + /* For Explicit Masking, we follow Acrobats example, and completely + * ignore the supplied mask. Instead we generate a new one based on the + * image mask, adjusted for any difference in width/height. */ + if (pim->InterleaveType == interleave_separate_source || + pim->InterleaveType == interleave_scan_lines) { + memcpy(&local_pim, pim, sizeof(local_pim)); + pim = &local_pim; + gs_matrix_scale(&mi_pixel, + ((double)pim->Width) / pim->MaskDict.Width, + ((double)pim->Height) / pim->MaskDict.Height, + &mi_mask); + if ((code = gs_matrix_invert(&mi_mask, &local_pim.MaskDict.ImageMatrix)) < 0) + return code; + } else { + if ((code = gs_matrix_invert(&pim->MaskDict.ImageMatrix, &mi_mask)) < 0) + return code; + + if (!check_image3_extent(pim->ImageMatrix.xx, + pim->MaskDict.ImageMatrix.xx) || + !check_image3_extent(pim->ImageMatrix.xy, + pim->MaskDict.ImageMatrix.xy) || + !check_image3_extent(pim->ImageMatrix.yx, + pim->MaskDict.ImageMatrix.yx) || + !check_image3_extent(pim->ImageMatrix.yy, + pim->MaskDict.ImageMatrix.yy) + ) + return_error(gs_error_rangecheck); + } if (fabs(mi_pixel.tx - mi_mask.tx) >= 0.5 || fabs(mi_pixel.ty - mi_mask.ty) >= 0.5 ) diff -Nru ghostscript-9.04~dfsg/base/gximage.h ghostscript-9.05~dfsg~20120125/base/gximage.h --- ghostscript-9.04~dfsg/base/gximage.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gximage.h 2011-11-21 08:55:19.000000000 +0000 @@ -290,7 +290,8 @@ gx_image_color_cache_t *color_cache; /* A cache that is con-tone values */ byte *ht_buffer; /* A buffer to contain halftoned data */ int ht_stride; - int ht_offset_bits; /* An offset adjustement to allow aligned copies */ + int ht_offset_bits; /* An offset adjustement to allow aligned copies */ + int ht_plane_height; /* Needed during the copy_planes operation */ byte *thresh_buffer; /* A buffer to hold threshold values for HT */ int thresh_stride; gs_image_parent_t image_parent_type; /* Need to avoid threshold of type3 images */ diff -Nru ghostscript-9.04~dfsg/base/gximono.c ghostscript-9.05~dfsg~20120125/base/gximono.c --- ghostscript-9.04~dfsg/base/gximono.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gximono.c 2012-01-07 20:18:22.000000000 +0000 @@ -87,11 +87,16 @@ the interpolations occur this can cause a minor mismatch at large scalings */ - /* Allow this for CMYK planar and mono binary halftoned devices */ - dev_color_ok = ((penum->dev->color_info.num_components == 1 && - penum->dev->color_info.depth == 1) || - (penum->dev->color_info.num_components == 4 && - penum->dev->color_info.depth == 4 && is_planar_dev)); + /* Allow this for CMYK planar and mono binary halftoned devices */ + dev_color_ok = ((penum->dev->color_info.num_components == 1 && + penum->dev->color_info.depth == 1) || +#if 1 + /* Don't allow CMYK Planar devices just yet */ + 0); +#else + (penum->dev->color_info.num_components == 4 && + penum->dev->color_info.depth == 4 && is_planar_dev)); +#endif if (use_fast_code && penum->pcs != NULL && dev_color_ok && penum->bps == 8 && (penum->posture == image_portrait @@ -107,7 +112,7 @@ } } code = dev_proc(penum->dev, get_profile)(penum->dev, &dev_profile); - num_des_comps = dev_profile->device_profile[0]->num_comps; + num_des_comps = gsicc_get_device_profile_comps(dev_profile); /* Define the rendering intents */ rendering_params.black_point_comp = BP_ON; rendering_params.graphics_type_tag = GS_IMAGE_TAG; @@ -137,7 +142,7 @@ if (penum->icc_setup.is_lab) penum->icc_setup.need_decode = false; if (penum->icc_link == NULL) { penum->icc_link = gsicc_get_link(penum->pis, penum->dev, pcs, NULL, - &rendering_params, penum->memory, false); + &rendering_params, penum->memory); } /* PS CIE color spaces may have addition decoding that needs to be performed to ensure that the range of 0 to 1 is provided @@ -784,14 +789,13 @@ image_posture posture = penum->posture; int vdi; /* amounts to replicate */ fixed xrun; - byte *contone_align, *thresh_align; + byte *thresh_align; int spp_out = penum->dev->color_info.num_components; byte *devc_contone[GX_DEVICE_COLOR_MAX_COMPONENTS]; byte *devc_contone_gray; const byte *psrc = buffer + data_x; int dest_width, dest_height, data_length; byte *color_cache; - gx_ht_order *d_order = &(penum->pis->dev_ht->components[0].corder); int position, k, j; int offset_bits = penum->ht_offset_bits; int contone_stride = 0; /* Not used in landscape case */ @@ -802,7 +806,6 @@ int offset_threshold; /* to ensure 128 bit boundary */ gx_dda_int_t dda_ht; int code = 0; - bool allow_reset; byte *dev_value; if (h == 0) { @@ -816,7 +819,7 @@ flush_buff = true; } } - src_size = (penum->rect.w - 1.0); + src_size = penum->rect.w - 1; switch (posture) { case image_portrait: @@ -843,7 +846,7 @@ scale_factor = float2fixed_rounded((float) src_size / (float) (dest_width - 1)); #ifdef DEBUG /* Help in spotting problems */ - memset(penum->ht_buffer,0x00, penum->ht_stride * vdi); + memset(penum->ht_buffer,0x00, penum->ht_stride * vdi * spp_out); #endif break; case image_landscape: @@ -880,10 +883,13 @@ if (penum->ht_landscape.index < 0) { penum->ht_landscape.xstart = penum->xci + vdi - 1; offset_bits = (penum->ht_landscape.xstart % 16) + 1; + /* xci can be negative, so allow for that */ + if (offset_bits <= 0) offset_bits += 16; } else { penum->ht_landscape.xstart = penum->xci; + /* xci can be negative, see Bug 692569. */ offset_bits = 16 - penum->xci % 16; - if (offset_bits == 16) offset_bits = 0; + if (offset_bits >= 16) offset_bits -= 16; } if (offset_bits == 0 || offset_bits == 16) { penum->ht_landscape.offset_set = false; @@ -1097,24 +1103,8 @@ /* Apply threshold array to image data */ flush: thresh_align = penum->thresh_buffer + offset_threshold; - for (k = 0; k < spp_out; k++) { - d_order = &(penum->pis->dev_ht->components[k].corder); - if (posture == image_portrait) { - contone_align = penum->line + contone_stride * k + - offset_contone[k]; - allow_reset = true; - } else { - contone_align = penum->line + offset_contone[k] + - LAND_BITS * k * contone_stride; - if (k == spp_out - 1) { - allow_reset = true; - } else { - allow_reset = false; - } - } - code = gxht_thresh_plane(penum, d_order, xrun, dest_width, dest_height, - thresh_align, contone_align, contone_stride, - dev, k, allow_reset); - } + code = gxht_thresh_planes(penum, xrun, dest_width, dest_height, + thresh_align, dev, offset_contone, + contone_stride); return code; } diff -Nru ghostscript-9.04~dfsg/base/gxino16b.c ghostscript-9.05~dfsg~20120125/base/gxino16b.c --- ghostscript-9.04~dfsg/base/gxino16b.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxino16b.c 2011-10-06 06:43:10.000000000 +0000 @@ -18,3 +18,4 @@ #include "gxsample.h" const sample_unpack_proc_t sample_unpack_16_proc = 0; +const sample_unpack_proc_t sample_unpackicc_16_proc = 0; diff -Nru ghostscript-9.04~dfsg/base/gxipixel.c ghostscript-9.05~dfsg~20120125/base/gxipixel.c --- ghostscript-9.04~dfsg/base/gxipixel.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxipixel.c 2011-12-09 10:16:21.000000000 +0000 @@ -255,6 +255,95 @@ return code; } } + + /* Grid fit: A common construction in postscript/PDF files is for images + * to be constructed as a series of 'stacked' 1 pixel high images. + * Furthermore, many of these are implemented as an imagemask plotted on + * top of thin rectangles. The different fill rules for images and line + * art produces problems; line art fills a pixel if any part of it is + * touched - images only fill a pixel if the centre of the pixel is + * covered. Bug 692666 is such a problem. + * + * As a workaround for this problem, the code below was introduced. The + * concept is that orthogonal images can be 'grid fitted' (or 'stretched') + * to entirely cover pixels that they touch. Initially I had this working + * for all images regardless of type, but as testing has proceeded, this + * showed more and more regressions, so I've cut the cases back in which + * this code is used until it now only triggers on imagemasks that are + * either 1 pixel high, or wide, and then not if we are rendering a + * glyph (such as from a type3 font). + */ + if (pis != NULL && pis->is_gstate && ((gs_state *)pis)->show_gstate != NULL) { + /* If we're a graphics state, and we're in a text object, then we + * must be in a type3 font. Don't fiddle with it. */ + } else if (!penum->masked || penum->image_parent_type != 0) { + /* We only grid fit for ImageMasks, currently */ + } else if (pis != NULL && pis->fill_adjust.x == 0 && pis->fill_adjust.y == 0) { + /* If fill adjust is disabled, so is grid fitting */ + } else if (mat.xy == 0 && mat.yx == 0) { + if (width == 1) { + if (mat.xx > 0) { + fixed ix0 = int2fixed(fixed2int(float2fixed(mat.tx))); + double x1 = mat.tx + mat.xx * width; + fixed ix1 = int2fixed(fixed2int_ceiling(float2fixed(x1))); + mat.tx = (double)fixed2float(ix0); + mat.xx = (double)(fixed2float(ix1 - ix0)/width); + } else if (mat.xx < 0) { + fixed ix0 = int2fixed(fixed2int_ceiling(float2fixed(mat.tx))); + double x1 = mat.tx + mat.xx * width; + fixed ix1 = int2fixed(fixed2int(float2fixed(x1))); + mat.tx = (double)fixed2float(ix0); + mat.xx = (double)(fixed2float(ix1 - ix0)/width); + } + } + if (height == 1) { + if (mat.yy > 0) { + fixed iy0 = int2fixed(fixed2int(float2fixed(mat.ty))); + double y1 = mat.ty + mat.yy * height; + fixed iy1 = int2fixed(fixed2int_ceiling(float2fixed(y1))); + mat.ty = (double)fixed2float(iy0); + mat.yy = (double)(fixed2float(iy1 - iy0)/height); + } else if (mat.yy < 0) { + fixed iy0 = int2fixed(fixed2int_ceiling(float2fixed(mat.ty))); + double y1 = mat.ty + mat.yy * height; + fixed iy1 = int2fixed(fixed2int(float2fixed(y1))); + mat.ty = (double)fixed2float(iy0); + mat.yy = ((double)fixed2float(iy1 - iy0)/height); + } + } + } else if (mat.xx == 0 && mat.yy == 0) { + if (height == 1) { + if (mat.yx > 0) { + fixed ix0 = int2fixed(fixed2int(float2fixed(mat.tx))); + double x1 = mat.tx + mat.yx * height; + fixed ix1 = int2fixed(fixed2int_ceiling(float2fixed(x1))); + mat.tx = (double)fixed2float(ix0); + mat.yx = (double)(fixed2float(ix1 - ix0)/height); + } else if (mat.yx < 0) { + fixed ix0 = int2fixed(fixed2int_ceiling(float2fixed(mat.tx))); + double x1 = mat.tx + mat.yx * height; + fixed ix1 = int2fixed(fixed2int(float2fixed(x1))); + mat.tx = (double)fixed2float(ix0); + mat.yx = (double)(fixed2float(ix1 - ix0)/height); + } + } + if (width == 1) { + if (mat.xy > 0) { + fixed iy0 = int2fixed(fixed2int(float2fixed(mat.ty))); + double y1 = mat.ty + mat.xy * width; + fixed iy1 = int2fixed(fixed2int_ceiling(float2fixed(y1))); + mat.ty = (double)fixed2float(iy0); + mat.xy = (double)(fixed2float(iy1 - iy0)/width); + } else if (mat.xy < 0) { + fixed iy0 = int2fixed(fixed2int_ceiling(float2fixed(mat.ty))); + double y1 = mat.ty + mat.xy * width; + fixed iy1 = int2fixed(fixed2int(float2fixed(y1))); + mat.ty = (double)fixed2float(iy0); + mat.xy = ((double)fixed2float(iy1 - iy0)/width); + } + } + } + /*penum->matrix = mat;*/ penum->matrix.xx = mat.xx; penum->matrix.xy = mat.xy; @@ -734,8 +823,9 @@ return -1; } + static void -image_cache_decode(gx_image_enum *penum, byte input, byte *output) +image_cache_decode(gx_image_enum *penum, byte input, byte *output, bool scale) { float temp; @@ -752,7 +842,9 @@ case sd_compute: temp = penum->map[0].decode_base + (float) input * penum->map[0].decode_factor; - temp *= 255; + if (scale) { + temp = temp * 255.0; + } if (temp > 255) temp = 255; if (temp < 0 ) temp = 0; *output = (unsigned char) temp; @@ -763,6 +855,20 @@ } } +static bool +decode_range_needed(gx_image_enum *penum) +{ + bool scale = true; + + if (penum->map[0].decoding == sd_compute) { + if (!(gs_color_space_is_ICC(penum->pcs) || + gs_color_space_is_PSCIE(penum->pcs))) { + scale = false; + } + } + return scale; +} + /* A special case where we go ahead and initialize the whole index cache with contone. Device colors. If we are halftoning we will then go ahead and apply the thresholds to the device contone values. Only used for gray, @@ -777,6 +883,7 @@ bool need_decode = penum->icc_setup.need_decode; bool has_transfer = penum->icc_setup.has_transfer; byte value; + bool decode_scale = true; int k, kk; byte psrc[4]; byte *temp_buffer; @@ -819,6 +926,11 @@ the manner shown below so that the common case of no decode and indexed image with a look-up-table uses the table data directly or does as many operations with memcpy as we can */ + /* Need to check the decode output range so we know how we need to scale. + We want 8 bit output */ + if (need_decode) { + decode_scale = decode_range_needed(penum); + } if (penum->icc_link->is_identity) { /* No CM needed. */ if (need_decode || has_transfer) { @@ -827,7 +939,7 @@ for (k = 0; k < num_entries; k++) { /* Data is in k */ if (need_decode) { - image_cache_decode(penum, k, &value); + image_cache_decode(penum, k, &value, decode_scale); } else { value = k; } @@ -856,7 +968,7 @@ if (penum->pcs->params.indexed.use_proc) { /* Have to do the slow way */ for (k = 0; k < num_entries; k++) { - gs_cspace_indexed_lookup_bytes(penum->pcs, k, psrc); + gs_cspace_indexed_lookup_bytes(penum->pcs, (float)k, psrc); memcpy(&(penum->color_cache->device_contone[k * num_des_comp]), psrc, num_des_comp); } @@ -882,14 +994,14 @@ if (is_indexed) { /* Decode and un-indexed */ for (k = 0; k < num_entries; k++) { - image_cache_decode(penum, k, &value); + image_cache_decode(penum, k, &value, decode_scale); gs_cspace_indexed_lookup_bytes(penum->pcs, value, psrc); memcpy(&(temp_buffer[k * num_src_comp]), psrc, num_src_comp); } } else { /* Decode only */ for (k = 0; k < num_entries; k++) { - image_cache_decode(penum, k, &(temp_buffer[k])); + image_cache_decode(penum, k, &(temp_buffer[k]), decode_scale); } } } else { @@ -899,11 +1011,11 @@ if (penum->pcs->params.indexed.use_proc) { /* Have to do the slow way */ for (k = 0; k < num_entries; k++) { - gs_cspace_indexed_lookup_bytes(penum->pcs, k, psrc); + gs_cspace_indexed_lookup_bytes(penum->pcs, (float)k, psrc); memcpy(&(temp_buffer[k * num_src_comp]), psrc, num_src_comp); } } else { - /* Use the index table dirctly. */ + /* Use the index table directly. */ gs_free_object(penum->memory, temp_buffer, "image_init_color_cache"); free_temp_buffer = false; temp_buffer = penum->pcs->params.indexed.lookup.table.data; @@ -921,9 +1033,10 @@ gsicc_init_buffer(&output_buff_desc, num_des_comp, 1, false, false, false, 0, num_entries * num_des_comp, 1, num_entries); - gscms_transform_color_buffer(penum->icc_link, &input_buff_desc, - &output_buff_desc, (void*) temp_buffer, - (void*) penum->color_cache->device_contone); + (penum->icc_link->procs.map_buffer)(penum->dev, penum->icc_link, + &input_buff_desc, &output_buff_desc, + (void*) temp_buffer, + (void*) penum->color_cache->device_contone); /* Check if we need to apply any transfer functions. If so then do it now */ if (has_transfer) { for (k = 0; k < num_entries; k++) { diff -Nru ghostscript-9.04~dfsg/base/gxiscale.c ghostscript-9.05~dfsg~20120125/base/gxiscale.c --- ghostscript-9.04~dfsg/base/gxiscale.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxiscale.c 2012-01-07 20:18:22.000000000 +0000 @@ -70,7 +70,7 @@ gs_memory_t *mem = penum->memory; stream_image_scale_params_t iss; stream_image_scale_state *pss; - const stream_template *template; + const stream_template *templat; byte *line; const gs_color_space *pcs = penum->pcs; gs_point dst_xy; @@ -96,11 +96,14 @@ use_icc = true; } } + if (!(penum->bps <= 8 || penum->bps == 16)) { + use_icc = false; + } /* Do not allow mismatch in devices component output with the profile output size. For example sep device with CMYK profile should not go through the fast method */ code = dev_proc(penum->dev, get_profile)(penum->dev, &dev_profile); - num_des_comps = dev_profile->device_profile[0]->num_comps; + num_des_comps = gsicc_get_device_profile_comps(dev_profile); if (num_des_comps != penum->dev->color_info.num_components) { use_icc = false; } @@ -156,16 +159,22 @@ iss.EntireHeightIn = penum->Height; iss.EntireWidthOut = fixed2int_pixround(any_abs(penum->dst_width)); iss.EntireHeightOut = fixed2int_pixround(any_abs(penum->dst_height)); - /* If we are in an indexed space then we need to use the number of components in the base space. Otherwise we use the number of components in the source space */ if (pcs->type->index == gs_color_space_index_Indexed) { /* Use the number of colors in the base space */ - iss.Colors = cs_num_components(pcs->base_space); + iss.spp_decode = cs_num_components(pcs->base_space); } else { /* Use the number of colors that exist in the source space as this is where we are doing our interpolation */ - iss.Colors = cs_num_components(pcs); + iss.spp_decode = cs_num_components(pcs); + } + if (iss.HeightOut > iss.EntireHeightIn && use_icc) { + iss.early_cm = true; + iss.spp_interp = num_des_comps; + } else { + iss.early_cm = false; + iss.spp_interp = iss.spp_decode; } if (penum->bps <= 8 ) { /* If the input is ICC or other device independent format, go ahead @@ -181,14 +190,14 @@ /* If it is an index color space we will need to allocate for the decoded data */ if (pcs->type->index == gs_color_space_index_Indexed) { - in_size = iss.WidthIn * iss.Colors; + in_size = iss.WidthIn * iss.spp_decode; } else { /* Non indexed case, we either use the data as is, or allocate space if it is reversed in X */ in_size = (penum->matrix.xx < 0 ? /* We need a buffer for reversing each scan line. */ - iss.WidthIn * iss.Colors : 0); + iss.WidthIn * iss.spp_decode : 0); /* If it is not reversed, and we have 8 bit/color channel data then no need to allocate extra as we will use the source directly */ /* However, if we have a nonstandard encoding and are in @@ -197,7 +206,7 @@ do the decode and then interpolate. This is OK for the linear decode */ if (!penum->device_color && !gs_color_space_is_CIE(pcs)){ - in_size = iss.WidthIn * iss.Colors; + in_size = iss.WidthIn * iss.spp_decode; } } } else { @@ -210,14 +219,14 @@ iss.BitsPerComponentIn = sizeof(frac) * 8; iss.MaxValueIn = frac_1; } - in_size = round_up(iss.WidthIn * iss.Colors * sizeof(frac), + in_size = round_up(iss.WidthIn * iss.spp_decode * sizeof(frac), align_bitmap_mod); /* Size to allocate space to store the input as frac type */ } #ifdef USE_MITCHELL_FILTER - template = &s_IScale_template; + templat = &s_IScale_template; #else - template = &s_IIEncode_template; + templat = &s_IIEncode_template; #endif if (((penum->dev->color_info.num_components == 1 && penum->dev->color_info.max_gray < 15) || @@ -234,7 +243,7 @@ to a dithered device. The point of this non-linear downsampling is to preserve dark pixels from the source image to avoid dropout. The color polarity is used for this */ - template = &s_ISpecialDownScale_template; + templat = &s_ISpecialDownScale_template; } else { penum->interpolate = false; return 0; /* no interpolation / downsampling */ @@ -249,7 +258,7 @@ /* Allocate a buffer for one source/destination line. */ { uint out_size = - iss.WidthOut * max(iss.Colors * (iss.BitsPerComponentOut / 8), + iss.WidthOut * max(iss.spp_interp * (iss.BitsPerComponentOut / 8), arch_sizeof_color_index); /* Allocate based upon frac size (as BitsPerComponentOut=16) output scan line input plus output. The outsize may have an adjustment for @@ -259,10 +268,10 @@ "image scale src+dst line"); } pss = (stream_image_scale_state *) - s_alloc_state(mem, template->stype, "image scale state"); + s_alloc_state(mem, templat->stype, "image scale state"); if (line == 0 || pss == 0 || - (pss->params = iss, pss->template = template, - (*pss->template->init) ((stream_state *) pss) < 0) + (pss->params = iss, pss->templat = templat, + (*pss->templat->init) ((stream_state *) pss) < 0) ) { gs_free_object(mem, pss, "image scale state"); gs_free_object(mem, line, "image scale src+dst line"); @@ -319,7 +328,12 @@ gx_has_transfer(penum->pis, num_des_comps); if (penum->icc_link == NULL) { penum->icc_link = gsicc_get_link(penum->pis, penum->dev, pcs, NULL, - &rendering_params, penum->memory, false); + &rendering_params, penum->memory); + } + /* We need to make sure that we do the proper unpacking proc if we + are doing 16 bit */ + if (penum->bps == 16) { + penum->unpack = sample_unpackicc_16_proc; } return &image_render_interpolate_icc; } else { @@ -329,65 +343,69 @@ /* ------ Rendering for interpolated images ------ */ -static int -image_render_interpolate(gx_image_enum * penum, const byte * buffer, - int data_x, uint iw, int h, gx_device * dev) +/* This does some initial required decoding of index spaces and general + decoding of odd scaled image data needed prior to interpolation or + application of color management. */ +static void +initial_decode(gx_image_enum * penum, const byte * buffer, int data_x, int h, + bool need_decode, stream_cursor_read *stream_r, bool is_icc) { stream_image_scale_state *pss = penum->scaler; const gs_imager_state *pis = penum->pis; const gs_color_space *pcs = penum->pcs; gs_logical_operation_t lop = penum->log_op; - int c = pss->params.Colors; - stream_cursor_read r; + int spp_decode = pss->params.spp_decode; stream_cursor_write w; unsigned char index_space; byte *out = penum->line; - bool islab = false; - if (pcs->cmm_icc_profile_data != NULL) { - islab = pcs->cmm_icc_profile_data->islab; - } - /* buffer for output scan line. It may be large enough to hold a temporary - converted input scan line also depending upon what occured in - gs_image_class_0_interpolate */ if (h != 0) { - /* Convert the unpacked data to concrete values in */ - /* the source buffer. */ + /* Convert the unpacked data to concrete values in the source buffer. */ int sizeofPixelIn = pss->params.BitsPerComponentIn / 8; - uint row_size = pss->params.WidthIn * c * sizeofPixelIn; - const unsigned char *bdata = buffer + data_x * c * sizeofPixelIn; /* raw input data */ + uint row_size = pss->params.WidthIn * spp_decode * sizeofPixelIn; + /* raw input data */ + const unsigned char *bdata = buffer + data_x * spp_decode * sizeofPixelIn; index_space = 0; /* We have the following cases to worry about - 1) Device 8 bit color or nondevice but not indexed (e.g. ICC). - Use as is directly. Remap after interpolation. + 1) Device 8 bit color but not indexed (e.g. ICC). + Apply CMM after interpolation if needed. Also if ICC CIELAB do not do a decode operation 2) Indexed 8 bit color. Get to the base space. We will then be in the same state as 1. 3) 16 bit not indexed. Remap after interpolation. - 4) Indexed 16bit color. Get to base space in 16bit frac form. We + 4) Indexed 16bit color. Get to base space in 16bit form. We will then be in same state as 3. - */ + */ if (sizeofPixelIn == 1) { if (pcs->type->index != gs_color_space_index_Indexed) { /* An issue here is that we may not be "device color" due to how the data is encoded. Need to check for that case here */ - if (penum->device_color || gs_color_space_is_CIE(pcs) || islab){ + /* Decide here if we need to decode or not. Essentially, as + * far as I can gather, we use the top case if we DON'T need + * to decode. This is fairly obviously conditional on + * need_decode being set to 0. The major exception to this is + * that if the colorspace is CIE, we interpolate, THEN decode, + * so the decode is done later in the pipeline, so we needn't + * decode here (see Bugs 692225 and 692331). */ + if (!need_decode) { /* 8-bit color values, possibly device indep. or device depend., not indexed. Decode range was [0 1] */ if (penum->matrix.xx >= 0) { - /* Use the input data directly. */ - /* sets up data in the stream buffere structure */ - r.ptr = bdata - 1; + /* Use the input data directly. sets up data in the + stream buffer structure */ + stream_r->ptr = bdata - 1; } else { /* Mirror the data in X. */ - const byte *p = bdata + row_size - c; + const byte *p = bdata + row_size - spp_decode; byte *q = out; int i; - for (i = 0; i < pss->params.WidthIn; p -= c, q += c, ++i) - memcpy(q, p, c); - r.ptr = out - 1; - out += round_up(pss->params.WidthIn * c, align_bitmap_mod); + for (i = 0; i < pss->params.WidthIn; + p -= spp_decode, q += spp_decode, ++i) + memcpy(q, p, spp_decode); + stream_r->ptr = out - 1; + out += round_up(pss->params.WidthIn * + spp_decode, align_bitmap_mod); } } else { /* We need to do some decoding. Data will remain in 8 bits @@ -406,8 +424,8 @@ pdata += (pss->params.WidthIn - 1) * dpd; dpd = - dpd; } - r.ptr = (byte *) psrc - 1; - for (i = 0; i < pss->params.WidthIn; i++, psrc += c) { + stream_r->ptr = (byte *) psrc - 1; + for (i = 0; i < pss->params.WidthIn; i++, psrc += spp_decode) { /* Do the decode but remain in 8 bits */ for (j = 0; j < dc; ++j) { decode_sample(pdata[j], cc, j); @@ -415,7 +433,8 @@ } pdata += dpd; } - out += round_up(pss->params.WidthIn * c,align_bitmap_mod); + out += round_up(pss->params.WidthIn * spp_decode, + align_bitmap_mod); } } else { /* indexed 8 bit color values, possibly a device indep. or @@ -440,9 +459,9 @@ pdata += (pss->params.WidthIn - 1) * dpd; dpd = - dpd; } - r.ptr = (byte *) psrc - 1; + stream_r->ptr = (byte *) psrc - 1; - for (i = 0; i < pss->params.WidthIn; i++, psrc += c) { + for (i = 0; i < pss->params.WidthIn; i++, psrc += spp_decode) { /* Let's get directly to a decoded byte type loaded into psrc, and do the interpolation in the source space. Then we will do the appropriate remap function after @@ -481,7 +500,8 @@ moving it to the next desired word boundary. This must be accounted for in the memory allocation of gs_image_class_0_interpolate */ - out += round_up(pss->params.WidthIn*c, align_bitmap_mod); + out += round_up(pss->params.WidthIn * spp_decode, + align_bitmap_mod); } } else { /* More than 8-bits/color values */ @@ -500,26 +520,32 @@ pdata += (pss->params.WidthIn - 1) * dpd; dpd = - dpd; } - r.ptr = (byte *) psrc - 1; + stream_r->ptr = (byte *) psrc - 1; if_debug0('B', "[B]Remap row:\n[B]"); - for (i = 0; i < pss->params.WidthIn; i++, psrc += c) { - /* Lets get directly to a frac type loaded into psrc, and do - the interpolation in the source space. Then we will do - the appropriate remap function after interpolation. */ - for (j = 0; j < dc; ++j) { - DECODE_FRAC_FRAC(((const frac *)pdata)[j], psrc[j], j); - } - pdata += dpd; - #ifdef DEBUG - if (gs_debug_c('B')) { - int ci; + if (is_icc) { + stream_r->ptr = (byte *) pdata - 1; + } else { + for (i = 0; i < pss->params.WidthIn; i++, + psrc += spp_decode) { + /* Lets get directly to a frac type loaded into psrc, + and do the interpolation in the source space. Then we + will do the appropriate remap function after + interpolation. */ + for (j = 0; j < dc; ++j) { + DECODE_FRAC_FRAC(((const frac *)pdata)[j], psrc[j], j); + } + pdata += dpd; + #ifdef DEBUG + if (gs_debug_c('B')) { + int ci; - for (ci = 0; ci < c; ++ci) - dprintf2("%c%04x", (ci == 0 ? ' ' : ','), psrc[ci]); + for (ci = 0; ci < spp_decode; ++ci) + dprintf2("%c%04x", (ci == 0 ? ' ' : ','), psrc[ci]); + } + #endif } - #endif } - out += round_up(pss->params.WidthIn * c * sizeof(frac), + out += round_up(pss->params.WidthIn * spp_decode * sizeof(frac), align_bitmap_mod); if_debug0('B', "\n"); } else { @@ -538,32 +564,57 @@ pdata += (pss->params.WidthIn - 1) * dpd; dpd = - dpd; } - r.ptr = (byte *) psrc - 1; - for (i = 0; i < pss->params.WidthIn; i++, psrc += c) { + stream_r->ptr = (byte *) psrc - 1; + for (i = 0; i < pss->params.WidthIn; i++, psrc += spp_decode) { /* Lets get the decoded value. Then we need to do the lookup of this */ decode_value = penum->map[i].decode_base + (((const frac *)pdata)[0]) * penum->map[i].decode_factor; - /* Now we need to do the lookup of this value, and stick it - in psrc as a frac, which is what the interpolator is - expecting, since we had more than 8 bits of original - image data */ - gs_cspace_indexed_lookup_frac(pcs, decode_value,psrc); - pdata += dpd; + /* Now we need to do the lookup of this value, and stick it + in psrc as a frac, which is what the interpolator is + expecting, since we had more than 8 bits of original + image data */ + gs_cspace_indexed_lookup_frac(pcs, decode_value,psrc); + pdata += dpd; } /* We need to set the output to the end of the input buffer moving it to the next desired word boundary. This must be accounted for in the memory allocation of gs_image_class_0_interpolate */ - out += round_up(pss->params.WidthIn*c, align_bitmap_mod); + out += round_up(pss->params.WidthIn * spp_decode, + align_bitmap_mod); } /* end of else on indexed */ } /* end of else on more than 8 bps */ - r.limit = r.ptr + row_size; + stream_r->limit = stream_r->ptr + row_size; } else { /* h == 0 */ - r.ptr = 0, r.limit = 0; + stream_r->ptr = 0, stream_r->limit = 0; index_space = 0; - /* Quiet gcc warning. We didn't figure out whether it was a real bug. */ } +} + +static int +image_render_interpolate(gx_image_enum * penum, const byte * buffer, + int data_x, uint iw, int h, gx_device * dev) +{ + stream_image_scale_state *pss = penum->scaler; + const gs_imager_state *pis = penum->pis; + const gs_color_space *pcs = penum->pcs; + gs_logical_operation_t lop = penum->log_op; + int spp_decode = pss->params.spp_decode; + stream_cursor_read stream_r; + stream_cursor_write stream_w; + bool is_index_space; + byte *out = penum->line; + bool islab = false; + bool need_decode; + + if (pcs->cmm_icc_profile_data != NULL) { + islab = pcs->cmm_icc_profile_data->islab; + } + /* Perform any decode procedure if needed */ + need_decode = !(penum->device_color || gs_color_space_is_CIE(pcs) || islab); + initial_decode(penum, buffer, data_x, h, need_decode, &stream_r, false); + is_index_space = (pcs->type->index == gs_color_space_index_Indexed); /* * Process input and/or collect output. By construction, the pixels are * 1-for-1 with the device, but the Y coordinate might be inverted. @@ -592,16 +643,16 @@ int status, code; DECLARE_LINE_ACCUM_COPY(out, bpp, xo); - w.limit = out + width * - max(c * sizeofPixelOut, arch_sizeof_color_index) - 1; - w.ptr = w.limit - width * c * sizeofPixelOut; - psrc = (const frac *)(w.ptr + 1); + stream_w.limit = out + width * + max(spp_decode * sizeofPixelOut, arch_sizeof_color_index) - 1; + stream_w.ptr = stream_w.limit - width * spp_decode * sizeofPixelOut; + psrc = (const frac *)(stream_w.ptr + 1); /* This is where the rescale takes place */ - status = (*pss->template->process) - ((stream_state *) pss, &r, &w, h == 0); + status = (*pss->templat->process) + ((stream_state *) pss, &stream_r, &stream_w, h == 0); if (status < 0 && status != EOFC) return_error(gs_error_ioerror); - if (w.ptr == w.limit) { + if (stream_w.ptr == stream_w.limit) { int xe = xo + width; if_debug1('B', "[B]Interpolated row %d:\n[B]", @@ -611,7 +662,7 @@ if (gs_debug_c('B')) { int ci; - for (ci = 0; ci < c; ++ci) + for (ci = 0; ci < spp_decode; ++ci) dprintf2("%c%04x", (ci == 0 ? ' ' : ','), psrc[ci]); } @@ -651,7 +702,7 @@ for (j = 0; j < num_components; ++j) { /* If we were indexed, dont use the decode procedure for the index values just get to float directly */ - if (index_space || islab) { + if (is_index_space || islab) { cc.paint.values[j] = frac2float(psrc[j]); } else { decode_sample_frac_to_float(penum, psrc[j], &cc, j); @@ -666,7 +717,7 @@ /* Just pack colors into a scan line. */ gx_color_index color = devc.colors.pure; /* Skip runs quickly for the common cases. */ - switch (c) { + switch (spp_decode) { case 1: do { LINE_ACCUM(color, bpp); @@ -696,7 +747,7 @@ break; default: LINE_ACCUM(color, bpp); - x++, psrc += c; + x++, psrc += spp_decode; } } else { int rcode; @@ -708,7 +759,7 @@ return rcode; LINE_ACCUM_SKIP(bpp); l_xprev = x + 1; - x++, psrc += c; + x++, psrc += spp_decode; } } LINE_ACCUM_COPY(dev, out, bpp, xo, x, raster, ry); @@ -716,7 +767,7 @@ penum->line_xy++; if_debug0('B', "\n"); } - if ((status == 0 && r.ptr == r.limit) || status == EOFC) + if ((status == 0 && stream_r.ptr == stream_r.limit) || status == EOFC) break; } } @@ -734,247 +785,23 @@ const gs_imager_state *pis = penum->pis; const gs_color_space *pcs = penum->pcs; gs_logical_operation_t lop = penum->log_op; - int c = pss->params.Colors; - stream_cursor_read r; - stream_cursor_write w; - unsigned char index_space; + int spp_decode = pss->params.spp_decode; byte *out = penum->line; bool must_halftone = penum->icc_setup.must_halftone; bool has_transfer = penum->icc_setup.has_transfer; - bool islab = penum->icc_setup.is_lab; + stream_cursor_read stream_r; + stream_cursor_write stream_w; + bool need_decode; if (penum->icc_link == NULL) { return gs_rethrow(-1, "ICC Link not created duringgs_image_class_0_interpolate"); } - /* buffer for output scan line. It may be large enough to hold a temporary - converted input scan line also depending upon what occured in - gs_image_class_0_interpolate */ - if (h != 0) { - /* Convert the unpacked data to concrete values in */ - /* the source buffer. */ - int sizeofPixelIn = pss->params.BitsPerComponentIn / 8; - uint row_size = pss->params.WidthIn * c * sizeofPixelIn; - const unsigned char *bdata = buffer + data_x * c * sizeofPixelIn; /* raw input data */ - index_space = 0; - /* We have the following cases to worry about - 1) Device 8 bit color but not indexed (e.g. ICC). - Apply CMM after interpolation if needed. - Also if ICC CIELAB do not do a decode operation - 2) Indexed 8 bit color. Get to the base space. We will then be in - the same state as 1. - 3) 16 bit not indexed. Remap after interpolation. - 4) Indexed 16bit color. Get to base space in 16bit form. We - will then be in same state as 3. - */ - if (sizeofPixelIn == 1) { - if (pcs->type->index != gs_color_space_index_Indexed) { - /* An issue here is that we may not be "device color" due to - how the data is encoded. Need to check for that case here */ - /* Decide here if we need to decode or not. Essentially, as - * far as I can gather, we use the top case if we DON'T need - * to decode. This is fairly obviously conditional on - * need_decode being set to 0. The major exception to this is - * that if the colorspace is CIE, we interpolate, THEN decode, - * so the decode is done later in the pipeline, so we needn't - * decode here (see Bugs 692225 and 692331). */ - /* It is possible that islab should be moved out of conjuction - * with need_decode below, but in the absence of a test file, - * I'm leaving it where it is. */ - if (((penum->device_color || islab) && - (penum->icc_setup.need_decode == 0)) || - gs_color_space_is_CIE(pcs)) { - /* 8-bit color values, possibly device indep. or device - depend., not indexed. Decode range was [0 1] */ - if (penum->matrix.xx >= 0) { - /* Use the input data directly. */ - /* sets up data in the stream buffere structure */ - r.ptr = bdata - 1; - } else { - /* Mirror the data in X. */ - const byte *p = bdata + row_size - c; - byte *q = out; - int i; - - for (i = 0; i < pss->params.WidthIn; p -= c, q += c, ++i) - memcpy(q, p, c); - r.ptr = out - 1; - out += round_up(pss->params.WidthIn * c, align_bitmap_mod); - } - } else { - /* We need to do some decoding. Data will remain in 8 bits - This does not occur if color space was CIE encoded. - Then we do the decode during concretization which occurs - after interpolation */ - int dc = penum->spp; - const byte *pdata = bdata; - byte *psrc = (byte *) penum->line; - int i, j; - int dpd = dc; - gs_client_color cc; - - /* Go backwards through the data */ - if (penum->matrix.xx < 0) { - pdata += (pss->params.WidthIn - 1) * dpd; - dpd = - dpd; - } - r.ptr = (byte *) psrc - 1; - for (i = 0; i < pss->params.WidthIn; i++, psrc += c) { - /* Do the decode but remain in 8 bits */ - for (j = 0; j < dc; ++j) { - decode_sample(pdata[j], cc, j); - psrc[j] = float_color_to_byte_color(cc.paint.values[j]); - } - pdata += dpd; - } - out += round_up(pss->params.WidthIn * c,align_bitmap_mod); - } - } else { - /* indexed 8 bit color values, possibly a device indep. or - device depend. base space. We need to get out of the indexed - space and into the base color space. Note that we need to - worry about the decode function for the index values. */ - int bps = penum->bps; - int dc = penum->spp; - const byte *pdata = bdata; /* Input buffer */ - unsigned char *psrc = (unsigned char *) penum->line; /* Output */ - int i; - int dpd = dc * (bps <= 8 ? 1 : sizeof(frac)); - float max_range; - - /* Get max of decode range */ - max_range = (penum->map[0].decode_factor < 0 ? - penum->map[0].decode_base : - penum->map[0].decode_base + 255.0 * penum->map[0].decode_factor); - index_space = 1; - /* flip the horizontal direction if indicated by the matrix value */ - if (penum->matrix.xx < 0) { - pdata += (pss->params.WidthIn - 1) * dpd; - dpd = - dpd; - } - r.ptr = (byte *) psrc - 1; - - for (i = 0; i < pss->params.WidthIn; i++, psrc += c) { - /* Let's get directly to a decoded byte type loaded into - psrc, and do the interpolation in the source space. Then - we will do the appropriate remap function after - interpolation. */ - /* First we need to get the properly decoded value. */ - float decode_value; - switch ( penum->map[0].decoding ) - { - case sd_none: - /* while our indexin is going to be 0 to 255.0 due to - what is getting handed to us, the range of our - original data may not have been as such and we may - need to rescale, to properly lookup at the correct - location (or do the proc correctly) during the index - look-up. This occurs even if decoding was set to - sd_none. */ - decode_value = (float) pdata[0] * (float)max_range / 255.0; - break; - case sd_lookup: - decode_value = - (float) penum->map[0].decode_lookup[pdata[0] >> 4]; - break; - case sd_compute: - decode_value = - penum->map[0].decode_base + - ((float) pdata[0]) * penum->map[0].decode_factor; - break; - default: - decode_value = 0; /* Quiet gcc warning. */ - } - gs_cspace_indexed_lookup_bytes(pcs, decode_value,psrc); - pdata += dpd; /* Can't have just ++ - since we could be going backwards */ - } - /* We need to set the output to the end of the input buffer - moving it to the next desired word boundary. This must - be accounted for in the memory allocation of - gs_image_class_0_interpolate */ - out += round_up(pss->params.WidthIn*c, align_bitmap_mod); - } - } else { - /* More than 8-bits/color values */ - /* Even in this case we need to worry about an indexed color space. - We need to get to the base color space for the interpolation and - then if necessary do the remap to the device space */ - if (pcs->type->index != gs_color_space_index_Indexed) { - int bps = penum->bps; - int dc = penum->spp; - const byte *pdata = bdata; - frac *psrc = (frac *) penum->line; - int i, j; - int dpd = dc * (bps <= 8 ? 1 : sizeof(frac)); - - if (penum->matrix.xx < 0) { - pdata += (pss->params.WidthIn - 1) * dpd; - dpd = - dpd; - } - r.ptr = (byte *) psrc - 1; - if_debug0('B', "[B]Remap row:\n[B]"); - for (i = 0; i < pss->params.WidthIn; i++, psrc += c) { - /* Lets get directly to a frac type loaded into psrc, and do - the interpolation in the source space. Then we will do - the appropriate remap function after interpolation. */ - for (j = 0; j < dc; ++j) { - DECODE_FRAC_FRAC(((const frac *)pdata)[j], psrc[j], j); - } - pdata += dpd; -#ifdef DEBUG - if (gs_debug_c('B')) { - int ci; - - for (ci = 0; ci < c; ++ci) - dprintf2("%c%04x", (ci == 0 ? ' ' : ','), psrc[ci]); - } -#endif - } - out += round_up(pss->params.WidthIn * c * sizeof(frac), - align_bitmap_mod); - if_debug0('B', "\n"); - } else { - /* indexed and more than 8bps. Need to get to the base space */ - int bps = penum->bps; - int dc = penum->spp; - const byte *pdata = bdata; /* Input buffer */ - frac *psrc = (frac *) penum->line; /* Output buffer */ - int i; - int dpd = dc * (bps <= 8 ? 1 : sizeof(frac)); - float decode_value; - - index_space = 1; - /* flip the horizontal direction if indicated by the matrix value */ - if (penum->matrix.xx < 0) { - pdata += (pss->params.WidthIn - 1) * dpd; - dpd = - dpd; - } - r.ptr = (byte *) psrc - 1; - for (i = 0; i < pss->params.WidthIn; i++, psrc += c) { - /* Lets get the decoded value. Then we need to do the lookup - of this */ - decode_value = penum->map[i].decode_base + - (((const frac *)pdata)[0]) * penum->map[i].decode_factor; - /* Now we need to do the lookup of this value, and stick it - in psrc as a frac, which is what the interpolator is - expecting, since we had more than 8 bits of original - image data */ - gs_cspace_indexed_lookup_frac(pcs, decode_value,psrc); - pdata += dpd; - } - /* We need to set the output to the end of the input buffer - moving it to the next desired word boundary. This must - be accounted for in the memory allocation of - gs_image_class_0_interpolate */ - out += round_up(pss->params.WidthIn*c, align_bitmap_mod); - } /* end of else on indexed */ - } /* end of else on more than 8 bps */ - r.limit = r.ptr + row_size; - } else { /* h == 0 */ - r.ptr = 0, r.limit = 0; - index_space = 0; - /* Quiet gcc warning. We didn't figure out whether it was a real bug. */ - } + /* Go ahead and take apart any indexed color space or do the decode + so that we can then perform the interpolation or color management */ + need_decode = !((penum->device_color || penum->icc_setup.is_lab) && + (penum->icc_setup.need_decode == 0) || + gs_color_space_is_CIE(pcs)); + initial_decode(penum, buffer, data_x, h, need_decode, &stream_r, true); /* * Process input and/or collect output. By construction, the pixels are * 1-for-1 with the device, but the Y coordinate might be inverted. @@ -984,71 +811,104 @@ int xo = penum->xyi.x; int yo = penum->xyi.y; int width = pss->params.WidthOut; + int width_in = pss->params.WidthIn; int sizeofPixelOut = pss->params.BitsPerComponentOut / 8; int dy; int bpp = dev->color_info.depth; uint raster = bitmap_raster(width * bpp); - unsigned short *psrc_cm, *psrc_cm_start = NULL; - int spp = pss->params.Colors; + unsigned short *p_cm_interp; + byte *p_cm_buff = NULL; + byte *psrc; + int spp_decode = pss->params.spp_decode; + int spp_interp = pss->params.spp_interp; int spp_cm; gsicc_bufferdesc_t input_buff_desc; gsicc_bufferdesc_t output_buff_desc; gx_color_index color; int code; cmm_dev_profile_t *dev_profile; + int num_bytes_decode = pss->params.BitsPerComponentIn / 8; code = dev_proc(dev, get_profile)(dev, &dev_profile); - spp_cm = dev_profile->device_profile[0]->num_comps; - psrc_cm_start = NULL; + spp_cm = gsicc_get_device_profile_comps(dev_profile); if (penum->matrix.yy > 0) dy = 1; else dy = -1, yo--; - if (!penum->icc_link->is_identity) { - psrc_cm_start = (unsigned short *) gs_alloc_bytes(pis->memory, - sizeof(unsigned short) * width * spp_cm, - "image_render_interpolate_icc"); - /* Set up the buffer descriptors. */ - gsicc_init_buffer(&input_buff_desc, spp, 2, - false, false, false, 0, width*spp, - 1, width); - gsicc_init_buffer(&output_buff_desc, spp_cm, 2, - false, false, false, 0, width * spp_cm, - 1, width); + /* If it makes sense (if enlarging), do early CM */ + if (pss->params.early_cm && !penum->icc_link->is_identity + && stream_r.ptr != stream_r.limit) { + /* Get the buffers set up. */ + p_cm_buff = + (byte *) gs_alloc_bytes(pis->memory, + num_bytes_decode * width_in * spp_cm, + "image_render_interpolate_icc"); + /* Set up the buffer descriptors. We keep the bytes the same */ + gsicc_init_buffer(&input_buff_desc, spp_decode, num_bytes_decode, + false, false, false, 0, width_in * spp_decode, + 1, width_in); + gsicc_init_buffer(&output_buff_desc, spp_cm, num_bytes_decode, + false, false, false, 0, width_in * spp_cm, + 1, width_in); + /* Do the transformation */ + psrc = (byte*) (stream_r.ptr + 1); + (penum->icc_link->procs.map_buffer)(dev, penum->icc_link, &input_buff_desc, + &output_buff_desc, (void*) psrc, + (void*) p_cm_buff); + /* Re-set the reading stream to use the cm data */ + stream_r.ptr = p_cm_buff - 1; + stream_r.limit = stream_r.ptr + num_bytes_decode * width_in * spp_cm; + } else { + /* CM after interpolation (or none). Just set up the buffers + if needed. 16 bit operations if CM takes place. */ + if (!penum->icc_link->is_identity) { + p_cm_buff = (byte *) gs_alloc_bytes(pis->memory, + sizeof(unsigned short) * width * spp_cm, + "image_render_interpolate_icc"); + /* Set up the buffer descriptors. */ + gsicc_init_buffer(&input_buff_desc, spp_decode, 2, + false, false, false, 0, width * spp_decode, + 1, width); + gsicc_init_buffer(&output_buff_desc, spp_cm, 2, + false, false, false, 0, width * spp_cm, + 1, width); + } } - for (;;) { int ry = yo + penum->line_xy * dy; int x; - const unsigned short *psrc; + const unsigned short *pinterp; gx_device_color devc; int status; DECLARE_LINE_ACCUM_COPY(out, bpp, xo); - w.limit = out + width * - max(c * sizeofPixelOut, arch_sizeof_color_index) - 1; - w.ptr = w.limit - width * c * sizeofPixelOut; - psrc = (const unsigned short *)(w.ptr + 1); + stream_w.limit = out + width * + max(spp_interp * sizeofPixelOut, arch_sizeof_color_index) - 1; + stream_w.ptr = stream_w.limit - width * spp_interp * sizeofPixelOut; + pinterp = (const unsigned short *)(stream_w.ptr + 1); /* This is where the rescale takes place */ - status = (*pss->template->process) - ((stream_state *) pss, &r, &w, h == 0); + status = (*pss->templat->process) + ((stream_state *) pss, &stream_r, &stream_w, h == 0); if (status < 0 && status != EOFC) return_error(gs_error_ioerror); - if (w.ptr == w.limit) { + if (stream_w.ptr == stream_w.limit) { int xe = xo + width; if_debug1('B', "[B]Interpolated row %d:\n[B]", penum->line_xy); - /* Take care of CM on the entire interpolated row */ - if (penum->icc_link->is_identity) { + /* Take care of CM on the entire interpolated row, if we + did not already do CM */ + if (penum->icc_link->is_identity || pss->params.early_cm) { /* Fastest case. No CM needed */ - psrc_cm = (unsigned short *) psrc; + p_cm_interp = (unsigned short *) pinterp; } else { /* Transform */ - psrc_cm = (unsigned short *) psrc_cm_start; - gscms_transform_color_buffer(penum->icc_link, &input_buff_desc, - &output_buff_desc, (void*) psrc, - (void*) psrc_cm); + p_cm_interp = (unsigned short *) p_cm_buff; + (penum->icc_link->procs.map_buffer)(dev, penum->icc_link, + &input_buff_desc, + &output_buff_desc, + (void*) pinterp, + (void*) p_cm_interp); } for (x = xo; x < xe;) { #ifdef DEBUG @@ -1057,7 +917,7 @@ for (ci = 0; ci < spp_cm; ++ci) dprintf2("%c%04x", (ci == 0 ? ' ' : ','), - psrc_cm[ci]); + p_cm_interp[ci]); } #endif /* Get the device color */ @@ -1065,12 +925,12 @@ and or halftoning */ if (must_halftone || has_transfer) { /* We need to do the tranfer function and/or the halftoning */ - cmap_transfer_halftone(psrc_cm, &devc, pis, dev, + cmap_transfer_halftone(p_cm_interp, &devc, pis, dev, has_transfer, must_halftone, gs_color_select_source); } else { /* encode as a color index. avoid all the cv to frac to cv conversions */ - color = dev_proc(dev, encode_color)(dev, psrc_cm); + color = dev_proc(dev, encode_color)(dev, p_cm_interp); /* check if the encoding was successful; we presume failure is rare */ if (color != gx_no_color_index) color_set_pure(&devc, color); @@ -1084,30 +944,30 @@ do { LINE_ACCUM(color, bpp); vd_pixel(int2fixed(x), int2fixed(ry), color); - x++, psrc_cm += 1; - } while (x < xe && psrc_cm[-1] == psrc_cm[0]); + x++, p_cm_interp += 1; + } while (x < xe && p_cm_interp[-1] == p_cm_interp[0]); break; case 3: do { LINE_ACCUM(color, bpp); vd_pixel(int2fixed(x), int2fixed(ry), color); - x++, psrc_cm += 3; - } while (x < xe && psrc_cm[-3] == psrc_cm[0] && - psrc_cm[-2] == psrc_cm[1] && - psrc_cm[-1] == psrc_cm[2]); + x++, p_cm_interp += 3; + } while (x < xe && p_cm_interp[-3] == p_cm_interp[0] && + p_cm_interp[-2] == p_cm_interp[1] && + p_cm_interp[-1] == p_cm_interp[2]); break; case 4: do { LINE_ACCUM(color, bpp); - x++, psrc_cm += 4; - } while (x < xe && psrc_cm[-4] == psrc_cm[0] && - psrc_cm[-3] == psrc_cm[1] && - psrc_cm[-2] == psrc_cm[2] && - psrc_cm[-1] == psrc_cm[3]); + x++, p_cm_interp += 4; + } while (x < xe && p_cm_interp[-4] == p_cm_interp[0] && + p_cm_interp[-3] == p_cm_interp[1] && + p_cm_interp[-2] == p_cm_interp[2] && + p_cm_interp[-1] == p_cm_interp[3]); break; default: LINE_ACCUM(color, bpp); - x++, psrc_cm += spp_cm; + x++, p_cm_interp += spp_cm; } } else { int rcode; @@ -1119,7 +979,7 @@ return rcode; LINE_ACCUM_SKIP(bpp); l_xprev = x + 1; - x++, psrc_cm += spp_cm; + x++, p_cm_interp += spp_cm; } } /* End on x loop */ LINE_ACCUM_COPY(dev, out, bpp, xo, x, raster, ry); @@ -1127,13 +987,13 @@ penum->line_xy++; if_debug0('B', "\n"); } - if ((status == 0 && r.ptr == r.limit) || status == EOFC) + if ((status == 0 && stream_r.ptr == stream_r.limit) || status == EOFC) break; } /* Free cm buffer, if it was used */ - if (psrc_cm_start != NULL) { - gs_free_object(pis->memory, (byte *)psrc_cm_start, - "image_render_interpolate_icc"); + if (p_cm_buff != NULL) { + gs_free_object(pis->memory, (byte *)p_cm_buff, + "image_render_interpolate_icc"); } } return (h == 0 ? 0 : 1); diff -Nru ghostscript-9.04~dfsg/base/gxistate.h ghostscript-9.05~dfsg~20120125/base/gxistate.h --- ghostscript-9.04~dfsg/base/gxistate.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxistate.h 2011-09-29 11:02:09.000000000 +0000 @@ -304,9 +304,11 @@ gx_default_get_cmap_procs /* The imager state structure is public only for subclassing. */ + +struct_proc_finalize(gs_imager_state_finalize); #define public_st_imager_state() /* in gsistate.c */\ - gs_public_st_composite(st_imager_state, gs_imager_state, "gs_imager_state",\ - imager_state_enum_ptrs, imager_state_reloc_ptrs) + gs_public_st_composite_use_final(st_imager_state, gs_imager_state, "gs_imager_state",\ + imager_state_enum_ptrs, imager_state_reloc_ptrs, gs_imager_state_finalize) /* Initialize an imager state, other than the parts covered by */ /* gs_imager_state_initial. */ diff -Nru ghostscript-9.04~dfsg/base/gxp1fill.c ghostscript-9.05~dfsg~20120125/base/gxp1fill.c --- ghostscript-9.04~dfsg/base/gxp1fill.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxp1fill.c 2011-11-21 08:55:19.000000000 +0000 @@ -30,6 +30,7 @@ #include "gxcldev.h" #include "gxblend.h" #include "gsicc_cache.h" +#include "gxdevsop.h" #include "gdevp14.h" @@ -51,6 +52,8 @@ gx_device *pcdev; /* original device or &cdev */ const gx_strip_bitmap *tmask; gs_int_point phase; + int num_planes; /* negative if not planar */ + /* Following are only for uncolored patterns */ @@ -58,7 +61,6 @@ /* Following are only for colored patterns */ - const gx_rop_source_t *rop_source; gx_device *orig_dev; int xoff, yoff; /* set dynamically */ @@ -90,8 +92,15 @@ { gx_color_tile *m_tile = pdevc->mask.m_tile; int px, py; + bool is_planar; ptfs->pdevc = pdevc; + is_planar = dev_proc(dev, dev_spec_op)(dev, gxdso_is_native_planar, NULL, 0); + if (is_planar) { + ptfs->num_planes = dev->color_info.num_components; + } else { + ptfs->num_planes = -1; + } if (m_tile == 0) { /* no clipping */ ptfs->pcdev = dev; ptfs->phase = pdevc->phase; @@ -222,42 +231,84 @@ gx_color_tile *ptile = ptfs->pdevc->colors.pattern.p_tile; gs_logical_operation_t lop = ptfs->lop; const gx_rop_source_t *source = ptfs->source; - const gx_rop_source_t *rop_source = ptfs->rop_source; gx_device *dev = ptfs->orig_dev; int xoff = ptfs->xoff, yoff = ptfs->yoff; gx_strip_bitmap *bits = &ptile->tbits; const byte *data = bits->data; bool full_transfer = (w == ptfs->w0 && h == ptfs->h0); - gx_bitmap_id source_id = - (full_transfer ? rop_source->id : gx_no_bitmap_id); - int code; + int code = 0; - if (source == NULL && lop_no_S_is_T(lop)) - code = (*dev_proc(ptfs->pcdev, copy_color)) - (ptfs->pcdev, data + bits->raster * yoff, xoff, - bits->raster, - (full_transfer ? bits->id : gx_no_bitmap_id), - x, y, w, h); - else { + if (source == NULL && lop_no_S_is_T(lop) && ptfs->num_planes < 0) { + /* RJW: Ideally, we'd like to remove the 'ptfs->num_planes < 0' test + * above, and then do: + * + * if (ptfs->num_planes >= 0) { + * int plane_step = ptile->tbits.raster * ptile->tbits.rep_height; + * int k; + * for (k = 0; k < ptfs->num_planes; k++) { + * byte *data_plane = (byte*) (data + plane_step * k); + * (*dev_proc(ptfs->pcdev, copy_plane)) + * (ptfs->pcdev, + * data_plane + bits->raster * yoff, + * xoff, bits->raster, + * gx_no_bitmap_id, x, y, + * w, h, k); + * } + * } else + * + * Unfortunately, this can cause the rop source device to be called + * with copy_plane. This is currently broken (and I fear cannot ever + * be done properly). We therefore drop back to the strip_copy_rop + * case below. + */ + { + code = (*dev_proc(ptfs->pcdev, copy_color)) + (ptfs->pcdev, data + bits->raster * yoff, xoff, + bits->raster, + (full_transfer ? bits->id : gx_no_bitmap_id), + x, y, w, h); + } + } else { gx_strip_bitmap data_tile; + gx_bitmap_id source_id; + gx_rop_source_t no_source; + if (source == NULL) + set_rop_no_source(source, no_source, dev); + source_id = (full_transfer ? source->id : gx_no_bitmap_id); data_tile.data = (byte *) data; /* actually const */ data_tile.raster = bits->raster; data_tile.size.x = data_tile.rep_width = ptile->tbits.size.x; data_tile.size.y = data_tile.rep_height = ptile->tbits.size.y; data_tile.id = bits->id; data_tile.shift = data_tile.rep_shift = 0; - code = (*dev_proc(dev, strip_copy_rop)) - (dev, - rop_source->sdata + (y - ptfs->y0) * rop_source->sraster, - rop_source->sourcex + (x - ptfs->x0), - rop_source->sraster, source_id, - (rop_source->use_scolors ? rop_source->scolors : NULL), - &data_tile, NULL, - x, y, w, h, - imod(xoff - x, data_tile.rep_width), - imod(yoff - y, data_tile.rep_height), - lop); + data_tile.num_planes = (ptfs->num_planes > 1 ? ptfs->num_planes : 1); + if (source->planar_height == 0) { + code = (*dev_proc(ptfs->pcdev, strip_copy_rop)) + (ptfs->pcdev, + source->sdata + (y - ptfs->y0) * source->sraster, + source->sourcex + (x - ptfs->x0), + source->sraster, source_id, + (source->use_scolors ? source->scolors : NULL), + &data_tile, NULL, + x, y, w, h, + imod(xoff - x, data_tile.rep_width), + imod(yoff - y, data_tile.rep_height), + lop); + } else { + code = (*dev_proc(ptfs->pcdev, strip_copy_rop2)) + (ptfs->pcdev, + source->sdata + (y - ptfs->y0) * source->sraster, + source->sourcex + (x - ptfs->x0), + source->sraster, source_id, + (source->use_scolors ? source->scolors : NULL), + &data_tile, NULL, + x, y, w, h, + imod(xoff - x, data_tile.rep_width), + imod(yoff - y, data_tile.rep_height), + lop, + source->planar_height); + } } return code; } @@ -324,21 +375,33 @@ if (state.pcdev != dev) tile_clip_set_phase(&state.cdev, px, py); - if (source == NULL && lop_no_S_is_T(lop)) + /* RJW: Can we get away with calling the simpler version? Not + * if we are working in planar mode because the default + * strip_tile_rectangle doesn't understand bits being in planar + * mode at the moment. + */ + if (source == NULL && lop_no_S_is_T(lop) && state.num_planes == -1) code = (*dev_proc(state.pcdev, strip_tile_rectangle)) (state.pcdev, bits, x, y, w, h, gx_no_color_index, gx_no_color_index, px, py); - else + else if (rop_source->planar_height == 0) code = (*dev_proc(state.pcdev, strip_copy_rop)) - (state.pcdev, - rop_source->sdata, rop_source->sourcex, - rop_source->sraster, rop_source->id, - (rop_source->use_scolors ? rop_source->scolors : NULL), - bits, NULL, x, y, w, h, px, py, lop); + (state.pcdev, + rop_source->sdata, rop_source->sourcex, + rop_source->sraster, rop_source->id, + (rop_source->use_scolors ? rop_source->scolors : NULL), + bits, NULL, x, y, w, h, px, py, lop); + else + code = (*dev_proc(state.pcdev, strip_copy_rop2)) + (state.pcdev, + rop_source->sdata, rop_source->sourcex, + rop_source->sraster, rop_source->id, + (rop_source->use_scolors ? rop_source->scolors : NULL), + bits, NULL, x, y, w, h, px, py, lop, + rop_source->planar_height); } else { state.lop = lop; state.source = source; - state.rop_source = rop_source; state.orig_dev = dev; if (ptile->cdev == NULL) { code = tile_by_steps(&state, x, y, w, h, ptile, @@ -386,6 +449,7 @@ source->id : gx_no_bitmap_id); step_source.scolors[0] = source->scolors[0]; step_source.scolors[1] = source->scolors[1]; + step_source.planar_height = source->planar_height; step_source.use_scolors = source->use_scolors; return (*ptfs->fill_rectangle) (ptfs->pdevc, x, y, w, h, ptfs->pcdev, ptfs->lop, &step_source); diff -Nru ghostscript-9.04~dfsg/base/gxpath.h ghostscript-9.05~dfsg~20120125/base/gxpath.h --- ghostscript-9.04~dfsg/base/gxpath.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxpath.h 2011-12-08 09:35:23.000000000 +0000 @@ -317,6 +317,15 @@ int gx_cpath_init_local_shared(gx_clip_path * pcpath, const gx_clip_path * shared, gs_memory_t * mem); +/* Function that informs us that the usage of this cpath will be + * safely nested within the existence of the 'shared' one. i.e. + * we don't need to worry that the shared one may go away while + * we contain pointers to it. + */ +int gx_cpath_init_local_shared_nested(gx_clip_path * pcpath, + const gx_clip_path * shared, + gs_memory_t * mem, + bool safely_nested); #define gx_cpath_init_local(pcpath, mem)\ (void)gx_cpath_init_local_shared(pcpath, NULL, mem) /* can't fail */ diff -Nru ghostscript-9.04~dfsg/base/gxpcmap.c ghostscript-9.05~dfsg~20120125/base/gxpcmap.c --- ghostscript-9.04~dfsg/base/gxpcmap.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxpcmap.c 2012-01-25 08:44:24.000000000 +0000 @@ -34,6 +34,7 @@ #include "gzstate.h" #include "gxdevsop.h" #include "gdevmpla.h" +#include "gdevp14.h" #if RAW_PATTERN_DUMP unsigned int global_pat_index = 0; @@ -88,7 +89,7 @@ static dev_proc_fill_rectangle(pattern_accum_fill_rectangle); static dev_proc_copy_mono(pattern_accum_copy_mono); static dev_proc_copy_color(pattern_accum_copy_color); -static dev_proc_copy_plane(pattern_accum_copy_plane); +static dev_proc_copy_planes(pattern_accum_copy_planes); static dev_proc_get_bits_rectangle(pattern_accum_get_bits_rectangle); /* The device descriptor */ @@ -164,8 +165,10 @@ NULL, /* pop_transparency_state */ NULL, /* put_image */ NULL, /* dev_spec_op */ - pattern_accum_copy_plane, /* copy_plane */ - NULL /* get_profile */ + pattern_accum_copy_planes, /* copy_planes */ + NULL, /* get_profile */ + NULL, /* set_graphics_type_tag */ + gx_default_strip_copy_rop2 }, 0, /* target */ 0, 0, 0, 0 /* bitmap_memory, bits, mask, instance */ @@ -210,11 +213,11 @@ gx_pattern_size_estimate(gs_pattern1_instance_t *pinst, int has_tags) { gx_device *tdev = pinst->saved->device; - int depth = (pinst->template.PaintType == 2 ? 1 : tdev->color_info.depth); + int depth = (pinst->templat.PaintType == 2 ? 1 : tdev->color_info.depth); int64_t raster; int64_t size; - if (pinst->template.uses_transparency) { + if (pinst->templat.uses_transparency) { raster = (pinst->size.x * ((depth/8) + 1 + has_tags)); size = raster > max_int / pinst->size.y ? (max_int & ~0xFFFF) : raster * pinst->size.y; } else { @@ -248,6 +251,12 @@ int force_no_clist = 0; int max_pattern_bitmap = tdev->MaxPatternBitmap == 0 ? MaxPatternBitmap_DEFAULT : tdev->MaxPatternBitmap; + + if (dev_proc(tdev, dev_spec_op)(tdev, gxdso_is_native_planar, NULL, 0)) { + pinst->is_planar = true; + } else { + pinst->is_planar = false; + } /* * If the target device can accumulate a pattern stream and the language * client supports high level patterns (ps and pdf only) we don't need a @@ -267,7 +276,7 @@ gxdso_pattern_can_accum, pinst, 0) == 1) force_no_clist = 1; /* Set only for first time through */ if (force_no_clist || (size < max_pattern_bitmap && !pinst->is_clist) - || pinst->template.PaintType != 1 ) { + || pinst->templat.PaintType != 1 ) { gx_device_pattern_accum *adev = gs_alloc_struct(mem, gx_device_pattern_accum, &st_device_pattern_accum, cname); if (adev == 0) @@ -357,7 +366,7 @@ cwdev->data = data; cwdev->data_size = data_size; cwdev->buf_procs = buf_procs; - if ( pinst->template.uses_transparency) { + if ( pinst->templat.uses_transparency) { cwdev->band_params.page_uses_transparency = true; cwdev->page_uses_transparency = true; } else { @@ -424,7 +433,7 @@ padev->color_info = target->color_info; /* Bug 689737: If PaintType == 2 (Uncolored tiling pattern), pattern is * 1bpp bitmap. No antialiasing in this case! */ - if (pinst->template.PaintType == 2) { + if (pinst->templat.PaintType == 2) { padev->color_info.anti_alias.text_bits = 1; padev->color_info.anti_alias.graphics_bits = 1; } @@ -432,7 +441,7 @@ now so that the mem device allocates the proper buffer space for the pattern template. We can do this since the transparency code all */ - if (pinst->template.uses_transparency) { + if (pinst->templat.uses_transparency) { /* Allocate structure that we will use for the trans pattern */ padev->transbuff = gs_alloc_struct(mem,gx_pattern_trans_t,&st_pattern_trans,"pattern_accum_open(trans)"); padev->transbuff->transbytes = NULL; @@ -464,7 +473,7 @@ } if (code >= 0) { - if (pinst->template.uses_transparency) { + if (pinst->templat.uses_transparency) { /* In this case, we will grab the buffer created by the graphic state's device (which is pdf14) and we will be tiling that into a transparency group buffer @@ -473,7 +482,7 @@ best just to keep the data in that form */ gx_device_set_target((gx_device_forward *)padev, target); } else { - switch (pinst->template.PaintType) { + switch (pinst->templat.PaintType) { case 2: /* uncolored */ gx_device_set_target((gx_device_forward *)padev, target); break; @@ -642,15 +651,15 @@ /* Copy a color plane. */ static int -pattern_accum_copy_plane(gx_device * dev, const byte * data, int data_x, - int raster, gx_bitmap_id id, - int x, int y, int w, int h, int plane) +pattern_accum_copy_planes(gx_device * dev, const byte * data, int data_x, + int raster, gx_bitmap_id id, + int x, int y, int w, int h, int plane_height) { gx_device_pattern_accum *const padev = (gx_device_pattern_accum *) dev; if (padev->bits) - (*dev_proc(padev->target, copy_plane)) - (padev->target, data, data_x, raster, id, x, y, w, h, plane); + (*dev_proc(padev->target, copy_planes)) + (padev->target, data, data_x, raster, id, x, y, w, h, plane_height); if (padev->mask) return (*dev_proc(padev->mask, fill_rectangle)) ((gx_device *) padev->mask, x, y, w, h, (gx_color_index) 1); @@ -671,7 +680,7 @@ return (*dev_proc(padev->target, get_bits_rectangle)) (padev->target, prect, params, unread); - if (pinst->template.PaintType == 2) + if (pinst->templat.PaintType == 2) return 0; else return_error(gs_error_Fatal); /* shouldn't happen */ @@ -727,6 +736,7 @@ tiles->index = i; tiles->cdev = NULL; tiles->ttrans = NULL; + tiles->is_planar = false; } return pcache; } @@ -961,9 +971,10 @@ ctile = &pcache->tiles[id % pcache->num_tiles]; gx_pattern_cache_free_entry(pcache, ctile); /* ensure that this cache slot is empty */ ctile->id = id; + ctile->is_planar = pinst->is_planar; ctile->depth = fdev->color_info.depth; - ctile->uid = pinst->template.uid; - ctile->tiling_type = pinst->template.TilingType; + ctile->uid = pinst->templat.uid; + ctile->tiling_type = pinst->templat.TilingType; ctile->step_matrix = pinst->step_matrix; ctile->bbox = pinst->bbox; ctile->is_simple = pinst->is_simple; @@ -1061,8 +1072,8 @@ gx_pattern_cache_free_entry(pcache, ctile); ctile->id = id; ctile->depth = depth; - ctile->uid = pinst->template.uid; - ctile->tiling_type = pinst->template.TilingType; + ctile->uid = pinst->templat.uid; + ctile->tiling_type = pinst->templat.TilingType; ctile->step_matrix = pinst->step_matrix; ctile->bbox = pinst->bbox; ctile->is_simple = pinst->is_simple; @@ -1085,30 +1096,78 @@ file name */ static void dump_raw_pattern(int height, int width, int n_chan, int depth, - byte *Buffer, int raster) + byte *Buffer, int raster, const gx_device_memory * mdev) { char full_file_name[50]; FILE *fid; int max_bands; - int j,k; + int j, k, m; int byte_number, bit_position; unsigned char current_byte; unsigned char output_val; + bool is_planar; + byte *curr_ptr = Buffer; + int plane_offset; + is_planar = dev_proc(mdev, dev_spec_op)(mdev, gxdso_is_native_planar, NULL, 0); max_bands = ( n_chan < 57 ? n_chan : 56); /* Photoshop handles at most 56 bands */ - sprintf(full_file_name,"%d)PATTERN_%dx%dx%d.raw",global_pat_index,width,height,max_bands); + if (is_planar) { + sprintf(full_file_name,"%d)PATTERN_PLANE_%dx%dx%d.raw",global_pat_index, + width,height,max_bands); + } else { + sprintf(full_file_name,"%d)PATTERN_CHUNK_%dx%dx%d.raw",global_pat_index, + width,height,max_bands); + } fid = fopen(full_file_name,"wb"); - if (depth > 1) { - fwrite(Buffer,1,max_bands*height*width,fid); + if (depth == 8 * n_chan) { + /* Contone data. */ + if (is_planar) { + for (m = 0; m < max_bands; m++) { + curr_ptr = mdev->line_ptrs[m*mdev->height]; + fwrite(curr_ptr,1,height*width,fid); + } + } else { + /* Just dump it like it is */ + fwrite(Buffer,1,max_bands*height*width,fid); + } } else { - /* Binary image. Lets get to 8 bit for debugging */ - for (j = 0; j < height; j++) { - for (k = 0; k < width; k++) { - byte_number = (int) ceil((( (float) k + 1.0) / 8.0)) - 1; - current_byte = Buffer[j*raster+byte_number]; - bit_position = 7 - (k - byte_number*8); - output_val = ((current_byte >> bit_position) & 0x1) * 255; - fwrite(&output_val,1,1,fid); + /* Binary Data. Lets get to 8 bit for debugging. We have to + worry about planar vs. chunky. Note this assumes 1 bit data + only. */ + if (is_planar) { + plane_offset = mdev->raster * mdev->height; + for (m = 0; m < max_bands; m++) { + curr_ptr = mdev->line_ptrs[m*mdev->height]; + for (j = 0; j < height; j++) { + for (k = 0; k < width; k++) { + byte_number = (int) ceil((( (float) k + 1.0) / 8.0)) - 1; + current_byte = curr_ptr[j*(mdev->raster) + byte_number]; + bit_position = 7 - (k - byte_number*8); + output_val = ((current_byte >> bit_position) & 0x1) * 255; + fwrite(&output_val,1,1,fid); + } + } + } + } else { + for (j = 0; j < height; j++) { + for (k = 0; k < width; k++) { + for (m = 0; m < max_bands; m++) { + /* index current byte */ + byte_number = + (int) ceil((( (float) k * (float) max_bands + + (float) m + 1.0) / 8.0)) - 1; + /* get byte of interest */ + current_byte = + curr_ptr[j*(mdev->raster) + byte_number]; + /* get bit position */ + bit_position = + 7 - (k * max_bands + m - byte_number * 8); + /* extract and create byte */ + output_val = + ((current_byte >> bit_position) & 0x1) * 255; + fwrite(&output_val,1,1,fid); + } + } } } } @@ -1126,6 +1185,7 @@ pbm->rep_height = pbm->size.y = mdev->height; pbm->id = id; pbm->rep_shift = pbm->shift = 0; + pbm->num_planes = (mdev->num_planes > 1 ? mdev->num_planes : 1); /* Lets dump this for debug purposes */ @@ -1134,7 +1194,7 @@ mdev->color_info.num_components, mdev->color_info.depth, (unsigned char*) mdev->base, - pbm->raster); + pbm->raster, mdev); global_pat_index++; @@ -1235,7 +1295,7 @@ if (saved->pattern_cache == 0) saved->pattern_cache = pis->pattern_cache; gs_setdevice_no_init(saved, (gx_device *)adev); - if (pinst->template.uses_transparency) { + if (pinst->templat.uses_transparency) { if_debug0('v', "gx_pattern_load: pushing the pdf14 compositor device into this graphics state\n"); if ((code = gs_push_pdf14trans_device(saved, true)) < 0) return code; @@ -1248,15 +1308,15 @@ make a similar change in zpcolor.c where much of this pattern code is duplicated to support high level stream patterns. */ - if (pinst->template.PaintType == 1) + if (pinst->templat.PaintType == 1 && !(pinst->is_clist)) if ((code = gx_erase_colored_pattern(saved)) < 0) return code; } - code = (*pinst->template.PaintProc)(&pdc->ccolor, saved); + code = (*pinst->templat.PaintProc)(&pdc->ccolor, saved); if (code < 0) { gx_device_retain(saved->device, false); /* device no longer retained */ - if (pinst->template.uses_transparency) { + if (pinst->templat.uses_transparency) { dev_proc(saved->device, close_device)((gx_device *)saved->device); dev_proc(adev, close_device)((gx_device *)adev); if (pinst->is_clist == 0) @@ -1272,10 +1332,27 @@ gs_state_free(saved); return code; } - if (pinst->template.uses_transparency) { - if_debug0('v', "gx_pattern_load: popping the pdf14 compositor device from this graphics state\n"); + if (pinst->templat.uses_transparency) { + /* if_debug0('v', "gx_pattern_load: popping the pdf14 compositor device from this graphics state\n"); if ((code = gs_pop_pdf14trans_device(saved, true)) < 0) - return code; + return code; */ + if (pinst->is_clist) { + /* Send the compositor command to close the PDF14 device */ + code = (gs_pop_pdf14trans_device(saved, true) < 0); + if (code < 0) + return code; + } else { + /* Not a clist, get PDF14 buffer information */ + code = + pdf14_get_buffer_information(saved->device, + ((gx_device_pattern_accum*)adev)->transbuff, + saved->memory, + true); + /* PDF14 device (and buffer) is destroyed when pattern cache + entry is removed */ + if (code < 0) + return code; + } } /* We REALLY don't like the following cast.... */ code = gx_pattern_cache_add_entry((gs_imager_state *)pis, @@ -1334,7 +1411,7 @@ color_set_null_pattern(pdc); return 0; } - if (pinst->template.PaintType == 2) { /* uncolored */ + if (pinst->templat.PaintType == 2) { /* uncolored */ code = (pcs->base_space->type->remap_color) (pc, pcs->base_space, pdc, pis, dev, select); if (code < 0) @@ -1352,4 +1429,4 @@ pdc->mask.id = pinst->id; pdc->mask.m_tile = 0; return gx_pattern_load(pdc, pis, dev, select); -} +} \ No newline at end of file diff -Nru ghostscript-9.04~dfsg/base/gxpcolor.h ghostscript-9.05~dfsg~20120125/base/gxpcolor.h --- ghostscript-9.04~dfsg/base/gxpcolor.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxpcolor.h 2011-09-29 11:01:33.000000000 +0000 @@ -223,6 +223,12 @@ /* The following is neither key nor value. */ uint index; /* the index of the tile within */ bool trans_group_popped; /* Used to avoid multiple group pops in image mask fills */ + bool is_planar; /* Has to be stored here due to the device + change that can occur when the tile is + created and when it is written in the clist + when we are writing to a transparency + device which, is not planar but the target + is */ /* the cache (for GC) */ }; diff -Nru ghostscript-9.04~dfsg/base/gxpflat.c ghostscript-9.05~dfsg~20120125/base/gxpflat.c --- ghostscript-9.04~dfsg/base/gxpflat.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxpflat.c 2011-11-12 18:29:08.000000000 +0000 @@ -178,7 +178,7 @@ Momotonic curves with non-zero length are only allowed. */ bool -gx_flattened_iterator__init(gx_flattened_iterator *this, +gx_flattened_iterator__init(gx_flattened_iterator *self, fixed x0, fixed y0, const curve_segment *pc, int k) { /* Note : Immediately after the ininialization it keeps an invalid (zero length) segment. */ @@ -190,26 +190,26 @@ y1 = pc->p1.y; x2 = pc->p2.x; y2 = pc->p2.y; - this->x0 = this->lx0 = this->lx1 = x0; - this->y0 = this->ly0 = this->ly1 = y0; - this->x3 = pc->pt.x; - this->y3 = pc->pt.y; - if (!curve_coeffs_ranged(this->x0, x1, x2, this->x3, - this->y0, y1, y2, this->y3, - &this->ax, &this->bx, &this->cx, - &this->ay, &this->by, &this->cy, k)) + self->x0 = self->lx0 = self->lx1 = x0; + self->y0 = self->ly0 = self->ly1 = y0; + self->x3 = pc->pt.x; + self->y3 = pc->pt.y; + if (!curve_coeffs_ranged(self->x0, x1, x2, self->x3, + self->y0, y1, y2, self->y3, + &self->ax, &self->bx, &self->cx, + &self->ay, &self->by, &self->cy, k)) return false; - this->curve = true; - vd_curve(this->x0, this->y0, x1, y1, x2, y2, this->x3, this->y3, 0, RGB(255, 255, 255)); - this->k = k; + self->curve = true; + vd_curve(self->x0, self->y0, x1, y1, x2, y2, self->x3, self->y3, 0, RGB(255, 255, 255)); + self->k = k; # ifdef DEBUG if (gs_debug_c('3')) { dlprintf4("[3]x0=%f y0=%f x1=%f y1=%f\n", - fixed2float(this->x0), fixed2float(this->y0), + fixed2float(self->x0), fixed2float(self->y0), fixed2float(x1), fixed2float(y1)); dlprintf5(" x2=%f y2=%f x3=%f y3=%f k=%d\n", fixed2float(x2), fixed2float(y2), - fixed2float(this->x3), fixed2float(this->y3), this->k); + fixed2float(self->x3), fixed2float(self->y3), self->k); } # endif if (k == -1) { @@ -218,48 +218,48 @@ Returning with no initialization. */ return true; } - this->rmask = (1 << k3) - 1; - this->i = (1 << k); - this->rx = this->ry = 0; + self->rmask = (1 << k3) - 1; + self->i = (1 << k); + self->rx = self->ry = 0; if_debug6('3', "[3]ax=%f bx=%f cx=%f\n ay=%f by=%f cy=%f\n", - fixed2float(this->ax), fixed2float(this->bx), fixed2float(this->cx), - fixed2float(this->ay), fixed2float(this->by), fixed2float(this->cy)); - bx2 = this->bx << 1; - by2 = this->by << 1; - ax6 = ((this->ax << 1) + this->ax) << 1; - ay6 = ((this->ay << 1) + this->ay) << 1; - this->idx = arith_rshift(this->cx, this->k); - this->idy = arith_rshift(this->cy, this->k); - this->rdx = ((uint)this->cx << k2) & this->rmask; - this->rdy = ((uint)this->cy << k2) & this->rmask; + fixed2float(self->ax), fixed2float(self->bx), fixed2float(self->cx), + fixed2float(self->ay), fixed2float(self->by), fixed2float(self->cy)); + bx2 = self->bx << 1; + by2 = self->by << 1; + ax6 = ((self->ax << 1) + self->ax) << 1; + ay6 = ((self->ay << 1) + self->ay) << 1; + self->idx = arith_rshift(self->cx, self->k); + self->idy = arith_rshift(self->cy, self->k); + self->rdx = ((uint)self->cx << k2) & self->rmask; + self->rdy = ((uint)self->cy << k2) & self->rmask; /* bx/y terms */ - this->id2x = arith_rshift(bx2, k2); - this->id2y = arith_rshift(by2, k2); - this->rd2x = ((uint)bx2 << this->k) & this->rmask; - this->rd2y = ((uint)by2 << this->k) & this->rmask; + self->id2x = arith_rshift(bx2, k2); + self->id2y = arith_rshift(by2, k2); + self->rd2x = ((uint)bx2 << self->k) & self->rmask; + self->rd2y = ((uint)by2 << self->k) & self->rmask; # define adjust_rem(r, q, rmask) if ( r > rmask ) q ++, r &= rmask /* We can compute all the remainders as ints, */ /* because we know they don't exceed M. */ /* cx/y terms */ - this->idx += arith_rshift_1(this->id2x); - this->idy += arith_rshift_1(this->id2y); - this->rdx += ((uint)this->bx << this->k) & this->rmask, - this->rdy += ((uint)this->by << this->k) & this->rmask; - adjust_rem(this->rdx, this->idx, this->rmask); - adjust_rem(this->rdy, this->idy, this->rmask); + self->idx += arith_rshift_1(self->id2x); + self->idy += arith_rshift_1(self->id2y); + self->rdx += ((uint)self->bx << self->k) & self->rmask, + self->rdy += ((uint)self->by << self->k) & self->rmask; + adjust_rem(self->rdx, self->idx, self->rmask); + adjust_rem(self->rdy, self->idy, self->rmask); /* ax/y terms */ - this->idx += arith_rshift(this->ax, k3); - this->idy += arith_rshift(this->ay, k3); - this->rdx += (uint)this->ax & this->rmask; - this->rdy += (uint)this->ay & this->rmask; - adjust_rem(this->rdx, this->idx, this->rmask); - adjust_rem(this->rdy, this->idy, this->rmask); - this->id2x += this->id3x = arith_rshift(ax6, k3); - this->id2y += this->id3y = arith_rshift(ay6, k3); - this->rd2x += this->rd3x = (uint)ax6 & this->rmask, - this->rd2y += this->rd3y = (uint)ay6 & this->rmask; - adjust_rem(this->rd2x, this->id2x, this->rmask); - adjust_rem(this->rd2y, this->id2y, this->rmask); + self->idx += arith_rshift(self->ax, k3); + self->idy += arith_rshift(self->ay, k3); + self->rdx += (uint)self->ax & self->rmask; + self->rdy += (uint)self->ay & self->rmask; + adjust_rem(self->rdx, self->idx, self->rmask); + adjust_rem(self->rdy, self->idy, self->rmask); + self->id2x += self->id3x = arith_rshift(ax6, k3); + self->id2y += self->id3y = arith_rshift(ay6, k3); + self->rd2x += self->rd3x = (uint)ax6 & self->rmask, + self->rd2y += self->rd3y = (uint)ay6 & self->rmask; + adjust_rem(self->rd2x, self->id2x, self->rmask); + adjust_rem(self->rd2y, self->id2y, self->rmask); # undef adjust_rem return true; } @@ -293,16 +293,16 @@ /* Initialize the iterator with a line. */ bool -gx_flattened_iterator__init_line(gx_flattened_iterator *this, +gx_flattened_iterator__init_line(gx_flattened_iterator *self, fixed x0, fixed y0, fixed x1, fixed y1) { bool ox = check_diff_overflow(x0, x1); bool oy = check_diff_overflow(y0, y1); - this->x0 = this->lx0 = this->lx1 = x0; - this->y0 = this->ly0 = this->ly1 = y0; - this->x3 = x1; - this->y3 = y1; + self->x0 = self->lx0 = self->lx1 = x0; + self->y0 = self->ly0 = self->ly1 = y0; + self->x3 = x1; + self->y3 = y1; if (ox || oy) { /* Subdivide a long line into 4 segments, because the filling algorithm and the stroking algorithm need to compute differences @@ -312,50 +312,50 @@ which requires differences of coordinates as well. */ /* Note : the result of subdivision may be not strongly colinear. */ - this->ax = this->bx = 0; - this->ay = this->by = 0; - this->cx = ((ox ? (x1 >> 1) - (x0 >> 1) : (x1 - x0) >> 1) + 1) >> 1; - this->cy = ((oy ? (y1 >> 1) - (y0 >> 1) : (y1 - y0) >> 1) + 1) >> 1; - this->rd3x = this->rd3y = this->id3x = this->id3y = 0; - this->rd2x = this->rd2y = this->id2x = this->id2y = 0; - this->idx = this->cx; - this->idy = this->cy; - this->rdx = this->rdy = 0; - this->rx = this->ry = 0; - this->rmask = 0; - this->k = 2; - this->i = 4; + self->ax = self->bx = 0; + self->ay = self->by = 0; + self->cx = ((ox ? (x1 >> 1) - (x0 >> 1) : (x1 - x0) >> 1) + 1) >> 1; + self->cy = ((oy ? (y1 >> 1) - (y0 >> 1) : (y1 - y0) >> 1) + 1) >> 1; + self->rd3x = self->rd3y = self->id3x = self->id3y = 0; + self->rd2x = self->rd2y = self->id2x = self->id2y = 0; + self->idx = self->cx; + self->idy = self->cy; + self->rdx = self->rdy = 0; + self->rx = self->ry = 0; + self->rmask = 0; + self->k = 2; + self->i = 4; } else { - this->k = 0; - this->i = 1; + self->k = 0; + self->i = 1; } - this->curve = false; + self->curve = false; return true; } #ifdef DEBUG static inline void -gx_flattened_iterator__print_state(gx_flattened_iterator *this) +gx_flattened_iterator__print_state(gx_flattened_iterator *self) { if (!gs_debug_c('3')) return; dlprintf4("[3]dx=%f+%d, dy=%f+%d\n", - fixed2float(this->idx), this->rdx, - fixed2float(this->idy), this->rdy); + fixed2float(self->idx), self->rdx, + fixed2float(self->idy), self->rdy); dlprintf4(" d2x=%f+%d, d2y=%f+%d\n", - fixed2float(this->id2x), this->rd2x, - fixed2float(this->id2y), this->rd2y); + fixed2float(self->id2x), self->rd2x, + fixed2float(self->id2y), self->rd2y); dlprintf4(" d3x=%f+%d, d3y=%f+%d\n", - fixed2float(this->id3x), this->rd3x, - fixed2float(this->id3y), this->rd3y); + fixed2float(self->id3x), self->rd3x, + fixed2float(self->id3y), self->rd3y); } #endif -/* Move to the next segment and store it to this->lx0, this->ly0, this->lx1, this->ly1 . +/* Move to the next segment and store it to self->lx0, self->ly0, self->lx1, self->ly1 . * Return true iff there exist more segments. */ int -gx_flattened_iterator__next(gx_flattened_iterator *this) +gx_flattened_iterator__next(gx_flattened_iterator *self) { /* * We can compute successive values by finite differences, @@ -391,128 +391,128 @@ * that R may temporarily exceed M; for this reason, we require that * M have at least one free high-order bit. To reduce the number of * variables, we don't actually compute M, only M-1 (rmask). */ - fixed x = this->lx1, y = this->ly1; + fixed x = self->lx1, y = self->ly1; - if (this->i <= 0) + if (self->i <= 0) return_error(gs_error_unregistered); /* Must not happen. */ - this->lx0 = this->lx1; - this->ly0 = this->ly1; + self->lx0 = self->lx1; + self->ly0 = self->ly1; /* Fast check for N == 3, a common special case for small characters. */ - if (this->k <= 1) { - --this->i; - if (this->i == 0) + if (self->k <= 1) { + --self->i; + if (self->i == 0) goto last; # define poly2(a,b,c) arith_rshift_1(arith_rshift_1(arith_rshift_1(a) + b) + c) - x += poly2(this->ax, this->bx, this->cx); - y += poly2(this->ay, this->by, this->cy); + x += poly2(self->ax, self->bx, self->cx); + y += poly2(self->ay, self->by, self->cy); # undef poly2 if_debug2('3', "[3]dx=%f, dy=%f\n", - fixed2float(x - this->x0), fixed2float(y - this->y0)); + fixed2float(x - self->x0), fixed2float(y - self->y0)); if_debug5('3', "[3]%s x=%g, y=%g x=%ld y=%ld\n", - (((x ^ this->x0) | (y ^ this->y0)) & float2fixed(-0.5) ? + (((x ^ self->x0) | (y ^ self->y0)) & float2fixed(-0.5) ? "add" : "skip"), fixed2float(x), fixed2float(y), x, y); - this->lx1 = x, this->ly1 = y; - vd_bar(this->lx0, this->ly0, this->lx1, this->ly1, 1, RGB(0, 255, 0)); + self->lx1 = x, self->ly1 = y; + vd_bar(self->lx0, self->ly0, self->lx1, self->ly1, 1, RGB(0, 255, 0)); return true; } else { - --this->i; - if (this->i == 0) + --self->i; + if (self->i == 0) goto last; /* don't bother with last accum */ # ifdef DEBUG - gx_flattened_iterator__print_state(this); + gx_flattened_iterator__print_state(self); # endif # define accum(i, r, di, dr, rmask)\ if ( (r += dr) > rmask ) r &= rmask, i += di + 1;\ else i += di - accum(x, this->rx, this->idx, this->rdx, this->rmask); - accum(y, this->ry, this->idy, this->rdy, this->rmask); - accum(this->idx, this->rdx, this->id2x, this->rd2x, this->rmask); - accum(this->idy, this->rdy, this->id2y, this->rd2y, this->rmask); - accum(this->id2x, this->rd2x, this->id3x, this->rd3x, this->rmask); - accum(this->id2y, this->rd2y, this->id3y, this->rd3y, this->rmask); + accum(x, self->rx, self->idx, self->rdx, self->rmask); + accum(y, self->ry, self->idy, self->rdy, self->rmask); + accum(self->idx, self->rdx, self->id2x, self->rd2x, self->rmask); + accum(self->idy, self->rdy, self->id2y, self->rd2y, self->rmask); + accum(self->id2x, self->rd2x, self->id3x, self->rd3x, self->rmask); + accum(self->id2y, self->rd2y, self->id3y, self->rd3y, self->rmask); if_debug5('3', "[3]%s x=%g, y=%g x=%ld y=%ld\n", - (((x ^ this->lx0) | (y ^ this->ly0)) & float2fixed(-0.5) ? + (((x ^ self->lx0) | (y ^ self->ly0)) & float2fixed(-0.5) ? "add" : "skip"), fixed2float(x), fixed2float(y), x, y); # undef accum - this->lx1 = this->x = x; - this->ly1 = this->y = y; - vd_bar(this->lx0, this->ly0, this->lx1, this->ly1, 1, RGB(0, 255, 0)); + self->lx1 = self->x = x; + self->ly1 = self->y = y; + vd_bar(self->lx0, self->ly0, self->lx1, self->ly1, 1, RGB(0, 255, 0)); return true; } last: - this->lx1 = this->x3; - this->ly1 = this->y3; + self->lx1 = self->x3; + self->ly1 = self->y3; if_debug4('3', "[3]last x=%g, y=%g x=%ld y=%ld\n", - fixed2float(this->lx1), fixed2float(this->ly1), this->lx1, this->ly1); - vd_bar(this->lx0, this->ly0, this->lx1, this->ly1, 1, RGB(0, 255, 0)); + fixed2float(self->lx1), fixed2float(self->ly1), self->lx1, self->ly1); + vd_bar(self->lx0, self->ly0, self->lx1, self->ly1, 1, RGB(0, 255, 0)); return false; } static inline void -gx_flattened_iterator__unaccum(gx_flattened_iterator *this) +gx_flattened_iterator__unaccum(gx_flattened_iterator *self) { # define unaccum(i, r, di, dr, rmask)\ if ( r < dr ) r += rmask + 1 - dr, i -= di + 1;\ else r -= dr, i -= di - unaccum(this->id2x, this->rd2x, this->id3x, this->rd3x, this->rmask); - unaccum(this->id2y, this->rd2y, this->id3y, this->rd3y, this->rmask); - unaccum(this->idx, this->rdx, this->id2x, this->rd2x, this->rmask); - unaccum(this->idy, this->rdy, this->id2y, this->rd2y, this->rmask); - unaccum(this->x, this->rx, this->idx, this->rdx, this->rmask); - unaccum(this->y, this->ry, this->idy, this->rdy, this->rmask); + unaccum(self->id2x, self->rd2x, self->id3x, self->rd3x, self->rmask); + unaccum(self->id2y, self->rd2y, self->id3y, self->rd3y, self->rmask); + unaccum(self->idx, self->rdx, self->id2x, self->rd2x, self->rmask); + unaccum(self->idy, self->rdy, self->id2y, self->rd2y, self->rmask); + unaccum(self->x, self->rx, self->idx, self->rdx, self->rmask); + unaccum(self->y, self->ry, self->idy, self->rdy, self->rmask); # undef unaccum } -/* Move back to the previous segment and store it to this->lx0, this->ly0, this->lx1, this->ly1 . +/* Move back to the previous segment and store it to self->lx0, self->ly0, self->lx1, self->ly1 . * This only works for states reached with gx_flattened_iterator__next. * Return true iff there exist more segments. */ int -gx_flattened_iterator__prev(gx_flattened_iterator *this) +gx_flattened_iterator__prev(gx_flattened_iterator *self) { bool last; /* i.e. the first one in the forth order. */ - if (this->i >= 1 << this->k) + if (self->i >= 1 << self->k) return_error(gs_error_unregistered); /* Must not happen. */ - this->lx1 = this->lx0; - this->ly1 = this->ly0; - if (this->k <= 1) { + self->lx1 = self->lx0; + self->ly1 = self->ly0; + if (self->k <= 1) { /* If k==0, we have a single segment, return it. If k==1 && i < 2, return the last segment. Otherwise must not pass here. - We caould allow to pass here with this->i == 1 << this->k, + We caould allow to pass here with self->i == 1 << self->k, but we want to check the assertion about the last segment below. */ - this->i++; - this->lx0 = this->x0; - this->ly0 = this->y0; - vd_bar(this->lx0, this->ly0, this->lx1, this->ly1, 1, RGB(0, 0, 255)); + self->i++; + self->lx0 = self->x0; + self->ly0 = self->y0; + vd_bar(self->lx0, self->ly0, self->lx1, self->ly1, 1, RGB(0, 0, 255)); return false; } - gx_flattened_iterator__unaccum(this); - this->i++; + gx_flattened_iterator__unaccum(self); + self->i++; # ifdef DEBUG if_debug5('3', "[3]%s x=%g, y=%g x=%ld y=%ld\n", - (((this->x ^ this->lx1) | (this->y ^ this->ly1)) & float2fixed(-0.5) ? + (((self->x ^ self->lx1) | (self->y ^ self->ly1)) & float2fixed(-0.5) ? "add" : "skip"), - fixed2float(this->x), fixed2float(this->y), this->x, this->y); - gx_flattened_iterator__print_state(this); + fixed2float(self->x), fixed2float(self->y), self->x, self->y); + gx_flattened_iterator__print_state(self); # endif - last = (this->i == (1 << this->k) - 1); - this->lx0 = this->x; - this->ly0 = this->y; - vd_bar(this->lx0, this->ly0, this->lx1, this->ly1, 1, RGB(0, 0, 255)); + last = (self->i == (1 << self->k) - 1); + self->lx0 = self->x; + self->ly0 = self->y; + vd_bar(self->lx0, self->ly0, self->lx1, self->ly1, 1, RGB(0, 0, 255)); if (last) - if (this->lx0 != this->x0 || this->ly0 != this->y0) + if (self->lx0 != self->x0 || self->ly0 != self->y0) return_error(gs_error_unregistered); /* Must not happen. */ return !last; } /* Switching from the forward scanning to the backward scanning for the filtered1. */ void -gx_flattened_iterator__switch_to_backscan(gx_flattened_iterator *this, bool not_first) +gx_flattened_iterator__switch_to_backscan(gx_flattened_iterator *self, bool not_first) { /* When scanning forth, the accumulator stands on the end of a segment, except for the last segment. @@ -520,8 +520,8 @@ Assuming at least one forward step is done. */ if (not_first) - if (this->i > 0 && this->k != 1 /* This case doesn't use the accumulator. */) - gx_flattened_iterator__unaccum(this); + if (self->i > 0 && self->k != 1 /* This case doesn't use the accumulator. */) + gx_flattened_iterator__unaccum(self); } #define max_points 50 /* arbitrary */ @@ -550,21 +550,21 @@ } static int -gx_subdivide_curve_rec(gx_flattened_iterator *this, +gx_subdivide_curve_rec(gx_flattened_iterator *self, gx_path * ppath, int k, curve_segment * pc, segment_notes notes, gs_fixed_point *points) { int code; top : - if (!gx_flattened_iterator__init(this, + if (!gx_flattened_iterator__init(self, ppath->position.x, ppath->position.y, pc, k)) { /* Curve is too long. Break into two pieces and recur. */ curve_segment cseg; k--; split_curve_midpoint(ppath->position.x, ppath->position.y, pc, &cseg, pc); - code = gx_subdivide_curve_rec(this, ppath, k, &cseg, notes, points); + code = gx_subdivide_curve_rec(self, ppath, k, &cseg, notes, points); if (code < 0) return code; notes |= sn_not_first; @@ -578,13 +578,13 @@ bool more; for(;;) { - code = gx_flattened_iterator__next(this); + code = gx_flattened_iterator__next(self); if (code < 0) return code; more = code; - ppt->x = this->lx1; - ppt->y = this->ly1; + ppt->x = self->lx1; + ppt->y = self->ly1; ppt++; if (ppt == &points[max_points] || !more) { gs_fixed_point *pe = (more ? ppt - 2 : ppt); diff -Nru ghostscript-9.04~dfsg/base/gxshade1.c ghostscript-9.05~dfsg~20120125/base/gxshade1.c --- ghostscript-9.04~dfsg/base/gxshade1.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxshade1.c 2011-11-12 18:29:08.000000000 +0000 @@ -316,52 +316,106 @@ /* ---------------- Radial shading ---------------- */ +/* Some notes on what I have struggled to understand about the following + * function. This function renders the 'tube' given by interpolating one + * circle to another. + * + * The first circle is at (x0, y0) with radius r0, and has 'color' t0. + * The other circle is at (x1, y1) with radius r1, and has 'color' t1. + * + * We perform this rendering by approximating each quadrant of the 'tube' + * by a tensor patch. The tensor patch is formed by taking a curve along + * 1/4 of the circumference of the first circle, a straight line to the + * equivalent point on the circumference of the second circle, a curve + * back along the circumference of the second circle, and then a straight + * line back to where we started. + * + * There is additional logic in this function that forms the directions of + * the curves differently for different quadrants. This is done to ensure + * that we always paint 'around' the tube from the back towards the front, + * so we don't get unexpected regions showing though. This is explained more + * below. + * + * The original code here examined the position change between the two + * circles dx and dy. Based upon this vector it would pick which quadrant/ + * tensor patch to draw first. It would draw the quadrants/tensor patches + * in anticlockwise order. Presumably this was intended to be done so that + * the 'top' quadrant would be drawn last. + * + * Unfortunately this did not always work; see bug 692513. If the quadrants + * were rendered in the order 0,1,2,3, the rendering of 1 was leaving traces + * on top of 0, which was unexpected. + * + * I have therefore altered the code slightly; rather than picking a start + * quadrant and moving anticlockwise, we now draw the 'undermost' quadrant, + * then the two adjacent quadrants, then the topmost quadrant. + * + * For the purposes of explaination, we shall label the octants as below: + * + * \2|1/ and Quadrants as: | + * 3\|/0 Q1 | Q0 + * ---+--- ----+---- + * 4/|\7 Q2 | Q3 + * /5|6\ | + * + * We find (dx,dy), the difference between the centres of the circles. + * We look to see which octant this falls in. Firstly, this tells us which + * quadrant of the circle we need to draw first (Octant n, starts with + * Quadrant floor(n/2)). Secondly, it tells us which direction to form the + * tensor patch in; we always want to draw from the side 'closest' to + * dx/dy to the side further away. This ensures that we don't overwrite + * pixels in the incorrect order as the patch decomposes. + */ static int -R_tensor_annulus(patch_fill_state_t *pfs, /*@unused@*/const gs_rect *rect0, +R_tensor_annulus(patch_fill_state_t *pfs, double x0, double y0, double r0, double t0, double x1, double y1, double r1, double t1) { double dx = x1 - x0, dy = y1 - y0; double d = hypot(dx, dy); gs_point p0, p1, pc0, pc1; - int k, j, code; + int k, j, code, dirn; bool inside = 0; + /* pc0 and pc1 are the centres of the respective circles. */ pc0.x = x0, pc0.y = y0; pc1.x = x1, pc1.y = y1; + /* Set p0 up so it's a unit vector giving the direction of 90 degrees + * to the right of the major axis as we move from p0c to p1c. */ if (r0 + d <= r1 || r1 + d <= r0) { /* One circle is inside another one. Use any subdivision, but don't depend on dx, dy, which may be too small. */ - p0.x = 0, p0.y = -1; + p0.x = 0, p0.y = -1, dirn = 0; /* Align stripes along radii for faster triangulation : */ inside = 1; } else { /* Must generate canonic quadrangle arcs, because we approximate them with curves. */ - if(any_abs(dx) >= any_abs(dy)) { - if (dx > 0) - p0.x = 0, p0.y = -1; + if(dx >= 0) { + if (dy >= 0) + p0.x = 1, p0.y = 0, dirn = (dx >= dy ? 1 : 0); else - p0.x = 0, p0.y = 1; + p0.x = 0, p0.y = -1, dirn = (dx >= -dy ? 0 : 1); } else { - if (dy > 0) - p0.x = 1, p0.y = 0; + if (dy >= 0) + p0.x = 0, p0.y = 1, dirn = (-dx >= dy ? 1 : 0); else - p0.x = -1, p0.y = 0; + p0.x = -1, p0.y = 0, dirn = (-dx >= -dy ? 0 : 1); } } /* fixme: wish: cut invisible parts off. Note : when r0 != r1 the invisible part is not a half circle. */ - for (k = 0; k < 4; k++, p0 = p1) { + for (k = 0; k < 4; k++) { gs_point p[12]; patch_curve_t curve[4]; + /* Set p1 to be 90 degrees anticlockwise from p0 */ p1.x = -p0.y; p1.y = p0.x; - if ((k & 1) == k >> 1) { + if (dirn == 0) { /* Clockwise */ make_quadrant_arc(p + 0, &pc0, &p1, &p0, r0); make_quadrant_arc(p + 6, &pc1, &p0, &p1, r1); - } else { + } else { /* Anticlockwise */ make_quadrant_arc(p + 0, &pc0, &p0, &p1, r0); make_quadrant_arc(p + 6, &pc1, &p1, &p0, r1); } @@ -395,6 +449,22 @@ code = patch_fill(pfs, curve, NULL, NULL); if (code < 0) return code; + /* Move p0 to be ready for the next position */ + if (k == 0) { + /* p0 moves clockwise */ + p1 = p0; + p0.x = p1.y; p0.y = -p1.x; + dirn = 0; + } else if (k == 1) { + /* p0 flips sides */ + p0.x = -p0.x; p0.y = -p0.y; + dirn = 1; + } else if (k == 2) { + /* p0 moves anti-clockwise */ + p1 = p0; + p0.x = -p1.y; p0.y = p1.x; + dirn = 0; + } } return 0; } @@ -553,14 +623,14 @@ ex = x0 + dx * es; ey = y0 + dy * es; /* Fill the annulus: */ - code = R_tensor_annulus(pfs, rect, x0, y0, r0, t0, ex, ey, er, t0); + code = R_tensor_annulus(pfs, x0, y0, r0, t0, ex, ey, er, t0); if (code < 0) return code; /* Fill entire ending circle to ensure entire rect is covered, but * only if we are filling "inwards" (as otherwise we will overwrite * all the hard work we have done to this point) */ if (inwards) - code = R_tensor_annulus(pfs, rect, ex, ey, er, t0, ex, ey, 0, t0); + code = R_tensor_annulus(pfs, ex, ey, er, t0, ex, ey, 0, t0); return code; } } @@ -574,7 +644,7 @@ double ax = x0 + (x1 - x0) * as; double ay = y0 + (y1 - y0) * as; - return R_tensor_annulus(pfs, rect, x1, y1, r1, t, ax, ay, 0, t); + return R_tensor_annulus(pfs, x1, y1, r1, t, ax, ay, 0, t); } /* @@ -641,24 +711,24 @@ if (Extend0) { r = R_rect_radius(rect, x0, y0); if (r > r0) { - code = R_tensor_annulus(pfs, rect, x0, y0, r, t0, x0, y0, r0, t0); + code = R_tensor_annulus(pfs, x0, y0, r, t0, x0, y0, r0, t0); if (code < 0) return code; } } if (Extend1 && r1 > 0) - return R_tensor_annulus(pfs, rect, x1, y1, r1, t1, x1, y1, 0, t1); + return R_tensor_annulus(pfs, x1, y1, r1, t1, x1, y1, 0, t1); } else { if (Extend1) { r = R_rect_radius(rect, x1, y1); if (r > r1) { - code = R_tensor_annulus(pfs, rect, x1, y1, r, t1, x1, y1, r1, t1); + code = R_tensor_annulus(pfs, x1, y1, r, t1, x1, y1, r1, t1); if (code < 0) return code; } } if (Extend0 && r0 > 0) - return R_tensor_annulus(pfs, rect, x0, y0, r0, t0, x0, y0, 0, t0); + return R_tensor_annulus(pfs, x0, y0, r0, t0, x0, y0, 0, t0); } } else if (dr > d / 3) { /* Obtuse cone. */ @@ -691,7 +761,7 @@ if (code < 0) return code; if (x3 != x1 || y3 != y1) { - code = R_tensor_annulus(pfs, rect, x0, y0, r0, t0, x3, y3, r3, t0); + code = R_tensor_annulus(pfs, x0, y0, r0, t0, x3, y3, r3, t0); if (code < 0) return code; } @@ -701,7 +771,7 @@ if (code < 0) return code; if (x2 != x0 || y2 != y0) { - code = R_tensor_annulus(pfs, rect, x1, y1, r1, t1, x2, y2, r2, t1); + code = R_tensor_annulus(pfs, x1, y1, r1, t1, x2, y2, r2, t1); if (code < 0) return code; } @@ -1186,7 +1256,7 @@ if (span_type < 0) { code = R_extensions(&pfs1, psh, rect, d0, d1, psh->params.Extend[0], false); if (code >= 0) - code = R_tensor_annulus(&pfs1, rect, x0, y0, r0, d0, x1, y1, r1, d1); + code = R_tensor_annulus(&pfs1, x0, y0, r0, d0, x1, y1, r1, d1); if (code >= 0) code = R_extensions(&pfs1, psh, rect, d0, d1, false, psh->params.Extend[1]); } else if (span_type == 1) { @@ -1213,7 +1283,7 @@ } else { second_interval = shorten_radial_shading(&X0, &Y0, &R0, &D0, &X1, &Y1, &R1, &D1, rsa.span[0]); } - code = R_tensor_annulus(&pfs1, rect, X0, Y0, R0, D0, X1, Y1, R1, D1); + code = R_tensor_annulus(&pfs1, X0, Y0, R0, D0, X1, Y1, R1, D1); } if (code >= 0 && second_interval) { if (span_type & 4) { @@ -1221,7 +1291,7 @@ floatp R0 = r0, R1 = r1; shorten_radial_shading(&X0, &Y0, &R0, &D0, &X1, &Y1, &R1, &D1, rsa.span[1]); - code = R_tensor_annulus(&pfs1, rect, X0, Y0, R0, D0, X1, Y1, R1, D1); + code = R_tensor_annulus(&pfs1, X0, Y0, R0, D0, X1, Y1, R1, D1); } } if (code >= 0 && (span_type & 8)) diff -Nru ghostscript-9.04~dfsg/base/gxshade6.c ghostscript-9.05~dfsg~20120125/base/gxshade6.c --- ghostscript-9.04~dfsg/base/gxshade6.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxshade6.c 2011-09-29 11:01:33.000000000 +0000 @@ -832,6 +832,11 @@ #endif } +/* For a given set of poles in the tensor patch (for instance + * [0][0], [0][1], [0][2], [0][3] or [0][2], [1][2], [2][2], [3][2]) + * return the number of subdivisions required to flatten the bezier + * given by those poles to the required flatness. + */ static inline int curve_samples(patch_fill_state_t *pfs, const gs_fixed_point *pole, int pole_step, fixed fixed_flat) @@ -2468,7 +2473,7 @@ if (!(wedge_type & interpatch_padding) && k0 == k1) return 0; /* Wedges are zero area. */ - if (k0 > k1) { + if (k0 > k1) { /* Swap if required, so that k0 <= k1 */ k0 ^= k1; k1 ^= k0; k0 ^= k1; } p[0] = pole[0]; @@ -4053,7 +4058,7 @@ if (!pfs->inside) { gs_fixed_rect r, r1; - + tensor_patch_bbox(&r, p); r.p.x -= INTERPATCH_PADDING; r.p.y -= INTERPATCH_PADDING; @@ -4241,7 +4246,7 @@ { tensor_patch p; patch_color_t *c[4]; - int kv[4], kvm, ku[4], kum, km; + int kv[4], kvm, ku[4], kum; int code = 0; byte *color_stack_ptr = reserve_colors_inline(pfs, c, 4); /* Can't fail */ @@ -4307,6 +4312,7 @@ goto out; } /* draw_patch(&p, true, RGB(0, 0, 0)); */ + /* How many subdividions of the patch in the u and v direction? */ kv[0] = curve_samples(pfs, &p.pole[0][0], 4, pfs->fixed_flat); kv[1] = curve_samples(pfs, &p.pole[0][1], 4, pfs->fixed_flat); kv[2] = curve_samples(pfs, &p.pole[0][2], 4, pfs->fixed_flat); @@ -4317,12 +4323,11 @@ ku[2] = curve_samples(pfs, p.pole[2], 1, pfs->fixed_flat); ku[3] = curve_samples(pfs, p.pole[3], 1, pfs->fixed_flat); kum = max(max(ku[0], ku[1]), max(ku[2], ku[3])); - km = max(kvm, kum); # if NOFILL_TEST dbg_nofill = false; # endif - code = fill_wedges(pfs, ku[0], kum, p.pole[0], 1, p.c[0][0], p.c[0][1], - interpatch_padding | inpatch_wedge); + code = fill_wedges(pfs, ku[0], kum, p.pole[0], 1, p.c[0][0], p.c[0][1], + interpatch_padding | inpatch_wedge); if (code >= 0) { /* We would like to apply iterations for enumerating the kvm curve parts, but the roundinmg errors would be too complicated due to @@ -4335,7 +4340,7 @@ code = fill_patch(pfs, &p, kvm, kv[0], kv[3]); dbg_nofill = true; # endif - code = fill_patch(pfs, &p, kvm, kv[0], kv[3]); + code = fill_patch(pfs, &p, kvm, kv[0], kv[3]); } if (code >= 0) code = fill_wedges(pfs, ku[3], kum, p.pole[3], 1, p.c[1][0], p.c[1][1], diff -Nru ghostscript-9.04~dfsg/base/gxshade.c ghostscript-9.05~dfsg~20120125/base/gxshade.c --- ghostscript-9.04~dfsg/base/gxshade.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxshade.c 2012-01-07 20:18:22.000000000 +0000 @@ -357,11 +357,8 @@ } if (num_colors <= 32) { gx_ht_order_component *components = pis->dev_ht->components; - if (components && components[0].corder.wts) - num_colors = 256; - else - /****** WRONG FOR MULTI-PLANE HALFTONES ******/ - num_colors *= pis->dev_ht->components[0].corder.num_levels; + /****** WRONG FOR MULTI-PLANE HALFTONES ******/ + num_colors *= pis->dev_ht->components[0].corder.num_levels; } if (psh->head.type == 2 || psh->head.type == 3) { max_error *= 0.25; @@ -389,7 +386,7 @@ /* Grab the icc link transform that we need now */ if (pcs->cmm_icc_profile_data != NULL) { pfs->icclink = gsicc_get_link(pis, pis->trans_device, pcs, NULL, - &rendering_params, pis->memory, false); + &rendering_params, pis->memory); if (pfs->icclink == NULL) return gs_error_VMerror; } else { @@ -398,7 +395,7 @@ through special range adjustments in this case */ pfs->icclink = gsicc_get_link(pis, pis->trans_device, pcs->icc_equivalent, NULL, - &rendering_params, pis->memory, false); + &rendering_params, pis->memory); if (pfs->icclink == NULL) return gs_error_VMerror; } else { diff -Nru ghostscript-9.04~dfsg/base/gxstroke.c ghostscript-9.05~dfsg~20120125/base/gxstroke.c --- ghostscript-9.04~dfsg/base/gxstroke.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxstroke.c 2011-11-12 18:29:08.000000000 +0000 @@ -1184,7 +1184,9 @@ pis->line_params.dash_cap : pis->line_params.end_cap); - if (!pis->stroke_adjust && (plp->width.x != 0 && plp->width.y != 0)) { + /* If stroke_adjustment is disabled, or this isn't a horizontal or + * vertical line, then bale. */ + if (!pis->stroke_adjust || (plp->width.x != 0 && plp->width.y != 0)) { dev->sgr.stroke_stored = false; return; /* don't adjust */ } diff -Nru ghostscript-9.04~dfsg/base/gxttfb.c ghostscript-9.05~dfsg~20120125/base/gxttfb.c --- ghostscript-9.04~dfsg/base/gxttfb.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxttfb.c 2011-11-12 18:29:08.000000000 +0000 @@ -58,9 +58,9 @@ RELOC_PTR(gx_ttfReader, memory); RELOC_PTRS_END -static bool gx_ttfReader__Eof(ttfReader *this) +static bool gx_ttfReader__Eof(ttfReader *self) { - gx_ttfReader *r = (gx_ttfReader *)this; + gx_ttfReader *r = (gx_ttfReader *)self; if (r->extra_glyph_index != -1) return r->pos >= r->glyph_data.bits.size; @@ -69,9 +69,9 @@ return false; } -static void gx_ttfReader__Read(ttfReader *this, void *p, int n) +static void gx_ttfReader__Read(ttfReader *self, void *p, int n) { - gx_ttfReader *r = (gx_ttfReader *)this; + gx_ttfReader *r = (gx_ttfReader *)self; const byte *q; if (!r->error) { @@ -104,30 +104,30 @@ r->pos += n; } -static void gx_ttfReader__Seek(ttfReader *this, int nPos) +static void gx_ttfReader__Seek(ttfReader *self, int nPos) { - gx_ttfReader *r = (gx_ttfReader *)this; + gx_ttfReader *r = (gx_ttfReader *)self; r->pos = nPos; } -static int gx_ttfReader__Tell(ttfReader *this) +static int gx_ttfReader__Tell(ttfReader *self) { - gx_ttfReader *r = (gx_ttfReader *)this; + gx_ttfReader *r = (gx_ttfReader *)self; return r->pos; } -static bool gx_ttfReader__Error(ttfReader *this) +static bool gx_ttfReader__Error(ttfReader *self) { - gx_ttfReader *r = (gx_ttfReader *)this; + gx_ttfReader *r = (gx_ttfReader *)self; return r->error; } -static int gx_ttfReader__LoadGlyph(ttfReader *this, int glyph_index, const byte **p, int *size) +static int gx_ttfReader__LoadGlyph(ttfReader *self, int glyph_index, const byte **p, int *size) { - gx_ttfReader *r = (gx_ttfReader *)this; + gx_ttfReader *r = (gx_ttfReader *)self; gs_font_type42 *pfont = r->pfont; int code; @@ -152,9 +152,9 @@ return 2; /* found */ } -static void gx_ttfReader__ReleaseGlyph(ttfReader *this, int glyph_index) +static void gx_ttfReader__ReleaseGlyph(ttfReader *self, int glyph_index) { - gx_ttfReader *r = (gx_ttfReader *)this; + gx_ttfReader *r = (gx_ttfReader *)self; if (r->extra_glyph_index != glyph_index) return; @@ -162,14 +162,14 @@ gs_glyph_data_free(&r->glyph_data, "gx_ttfReader__ReleaseExtraGlyph"); } -static void gx_ttfReader__Reset(gx_ttfReader *this) +static void gx_ttfReader__Reset(gx_ttfReader *self) { - if (this->extra_glyph_index != -1) { - this->extra_glyph_index = -1; - gs_glyph_data_free(&this->glyph_data, "gx_ttfReader__Reset"); + if (self->extra_glyph_index != -1) { + self->extra_glyph_index = -1; + gs_glyph_data_free(&self->glyph_data, "gx_ttfReader__Reset"); } - this->error = false; - this->pos = 0; + self->error = false; + self->pos = 0; } gx_ttfReader *gx_ttfReader__create(gs_memory_t *mem) @@ -195,24 +195,24 @@ return r; } -void gx_ttfReader__destroy(gx_ttfReader *this) +void gx_ttfReader__destroy(gx_ttfReader *self) { - gs_free_object(this->memory, this, "gx_ttfReader__destroy"); + gs_free_object(self->memory, self, "gx_ttfReader__destroy"); } static int gx_ttfReader__default_get_metrics(const ttfReader *ttf, uint glyph_index, bool bVertical, short *sideBearing, unsigned short *nAdvance) { - gx_ttfReader *this = (gx_ttfReader *)ttf; + gx_ttfReader *self = (gx_ttfReader *)ttf; float sbw[4]; int sbw_offset = bVertical; int code; - int factor = this->pfont->data.unitsPerEm; + int factor = self->pfont->data.unitsPerEm; if (bVertical) factor = factor; /* See simple_glyph_metrics */ - code = this->pfont->data.get_metrics(this->pfont, glyph_index, bVertical, sbw); + code = self->pfont->data.get_metrics(self->pfont, glyph_index, bVertical, sbw); if (code < 0) return code; /* Due to an obsolete convention, simple_glyph_metrics scales @@ -225,10 +225,10 @@ return 0; } -void gx_ttfReader__set_font(gx_ttfReader *this, gs_font_type42 *pfont) +void gx_ttfReader__set_font(gx_ttfReader *self, gs_font_type42 *pfont) { - this->pfont = pfont; - this->super.get_metrics = gx_ttfReader__default_get_metrics; + self->pfont = pfont; + self->super.get_metrics = gx_ttfReader__default_get_metrics; } /*----------------------------------------------*/ @@ -312,23 +312,23 @@ gs_private_st_simple(st_gx_ttfMemory, gx_ttfMemory, "gx_ttfMemory"); /* st_gx_ttfMemory::memory points to a root. */ -static void *gx_ttfMemory__alloc_bytes(ttfMemory *this, int size, const char *cname) +static void *gx_ttfMemory__alloc_bytes(ttfMemory *self, int size, const char *cname) { - gs_memory_t *mem = ((gx_ttfMemory *)this)->memory; + gs_memory_t *mem = ((gx_ttfMemory *)self)->memory; return gs_alloc_bytes(mem, size, cname); } -static void *gx_ttfMemory__alloc_struct(ttfMemory *this, const ttfMemoryDescriptor *d, const char *cname) +static void *gx_ttfMemory__alloc_struct(ttfMemory *self, const ttfMemoryDescriptor *d, const char *cname) { - gs_memory_t *mem = ((gx_ttfMemory *)this)->memory; + gs_memory_t *mem = ((gx_ttfMemory *)self)->memory; return mem->procs.alloc_struct(mem, (const gs_memory_struct_type_t *)d, cname); } -static void gx_ttfMemory__free(ttfMemory *this, void *p, const char *cname) +static void gx_ttfMemory__free(ttfMemory *self, void *p, const char *cname) { - gs_memory_t *mem = ((gx_ttfMemory *)this)->memory; + gs_memory_t *mem = ((gx_ttfMemory *)self)->memory; gs_free_object(mem, p, cname); } @@ -412,12 +412,12 @@ return ttf; } -void ttfFont__destroy(ttfFont *this, gs_font_dir *dir) +void ttfFont__destroy(ttfFont *self, gs_font_dir *dir) { gs_memory_t *mem = dir->memory->stable_memory; - ttfFont__finit(this); - gs_free_object(mem, this, "ttfFont__destroy"); + ttfFont__finit(self); + gs_free_object(mem, self, "ttfFont__destroy"); ttfInterpreter__release(&dir->tti); gx_san__release(&dir->san); if (dir->tti == NULL && dir->ttm != NULL) { @@ -426,7 +426,7 @@ } } -int ttfFont__Open_aux(ttfFont *this, ttfInterpreter *tti, gx_ttfReader *r, gs_font_type42 *pfont, +int ttfFont__Open_aux(ttfFont *self, ttfInterpreter *tti, gx_ttfReader *r, gs_font_type42 *pfont, const gs_matrix * char_tm, const gs_log2_scale_point *log2_scale, bool design_grid) { @@ -441,7 +441,7 @@ bool dg; decompose_matrix(pfont, char_tm, log2_scale, design_grid, &char_size, &subpix_origin, &post_transform, &dg); - switch(ttfFont__Open(tti, this, &r->super, nTTC, char_size.x, char_size.y, dg)) { + switch(ttfFont__Open(tti, self, &r->super, nTTC, char_size.x, char_size.y, dg)) { case fNoError: return 0; case fMemoryError: @@ -452,9 +452,9 @@ WarnBadInstruction(pfont, -1); goto recover; case fPatented: - WarnPatented(pfont, this, "The font"); + WarnPatented(pfont, self, "The font"); recover: - this->patented = true; + self->patented = true; return 0; default: { int code = r->super.Error(&r->super); @@ -476,25 +476,25 @@ bool monotonize; } gx_ttfExport; -static void gx_ttfExport__MoveTo(ttfExport *this, FloatPoint *p) +static void gx_ttfExport__MoveTo(ttfExport *self, FloatPoint *p) { - gx_ttfExport *e = (gx_ttfExport *)this; + gx_ttfExport *e = (gx_ttfExport *)self; if (!e->error) e->error = gx_path_add_point(e->path, float2fixed(p->x), float2fixed(p->y)); } -static void gx_ttfExport__LineTo(ttfExport *this, FloatPoint *p) +static void gx_ttfExport__LineTo(ttfExport *self, FloatPoint *p) { - gx_ttfExport *e = (gx_ttfExport *)this; + gx_ttfExport *e = (gx_ttfExport *)self; if (!e->error) e->error = gx_path_add_line_notes(e->path, float2fixed(p->x), float2fixed(p->y), sn_none); } -static void gx_ttfExport__CurveTo(ttfExport *this, FloatPoint *p0, FloatPoint *p1, FloatPoint *p2) +static void gx_ttfExport__CurveTo(ttfExport *self, FloatPoint *p0, FloatPoint *p1, FloatPoint *p2) { - gx_ttfExport *e = (gx_ttfExport *)this; + gx_ttfExport *e = (gx_ttfExport *)self; if (!e->error) { if (e->monotonize) { @@ -512,28 +512,28 @@ } } -static void gx_ttfExport__Close(ttfExport *this) +static void gx_ttfExport__Close(ttfExport *self) { - gx_ttfExport *e = (gx_ttfExport *)this; + gx_ttfExport *e = (gx_ttfExport *)self; if (!e->error) e->error = gx_path_close_subpath_notes(e->path, sn_none); } -static void gx_ttfExport__Point(ttfExport *this, FloatPoint *p, bool bOnCurve, bool bNewPath) +static void gx_ttfExport__Point(ttfExport *self, FloatPoint *p, bool bOnCurve, bool bNewPath) { /* Never called. */ } -static void gx_ttfExport__SetWidth(ttfExport *this, FloatPoint *p) +static void gx_ttfExport__SetWidth(ttfExport *self, FloatPoint *p) { - gx_ttfExport *e = (gx_ttfExport *)this; + gx_ttfExport *e = (gx_ttfExport *)self; e->w.x = float2fixed(p->x); e->w.y = float2fixed(p->y); } -static void gx_ttfExport__DebugPaint(ttfExport *this) +static void gx_ttfExport__DebugPaint(ttfExport *self) { } diff -Nru ghostscript-9.04~dfsg/base/gxtype1.c ghostscript-9.05~dfsg~20120125/base/gxtype1.c --- ghostscript-9.04~dfsg/base/gxtype1.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxtype1.c 2012-01-25 08:44:24.000000000 +0000 @@ -409,7 +409,12 @@ cnext; goto out; case c2_shortint: - cip += 2; + { + short sint = *cip++; + sint = (sint << 8) + *cip++; + CS_CHECK_PUSH(csp, cstack); + *++csp = int2fixed(sint); + } break; case c2_hstemhm: hhints += ((csp - cstack) + 1) / 2; @@ -632,7 +637,7 @@ info->v.y = fixed2float(cis.lsb.y); break; } - info->members |= width_members | (GLYPH_INFO_VVECTOR0 << wmode); + info->members |= width_members; } gs_glyph_data_free(&gdata, "gs_type1_glyph_info"); diff -Nru ghostscript-9.04~dfsg/base/gxwts.c ghostscript-9.05~dfsg~20120125/base/gxwts.c --- ghostscript-9.04~dfsg/base/gxwts.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxwts.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,613 +0,0 @@ -/* Copyright (C) 2001-2006 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ -/*$Id$ */ -/* Rendering using Well Tempered Screening. */ -#include "stdpre.h" -#include "memory_.h" /* for memcmp */ -#include "malloc_.h" -#include "gx.h" -#include "gxstate.h" -#include "gsht.h" -#include "math_.h" -#include "gserrors.h" -#include "gxdcolor.h" -#include "gxdevcli.h" -#include "gxdht.h" -#include "gxwts.h" - -#define GXWTS_USE_DOUBLE - -#ifndef UNIT_TEST -/* device color type for wts. */ - -/* todo: trace and relocate pointers */ -gs_private_st_simple(st_dc_wts, gx_device_color, "dc_wts"); -static dev_color_proc_save_dc(gx_dc_wts_save_dc); -static dev_color_proc_get_dev_halftone(gx_dc_wts_get_dev_halftone); -static dev_color_proc_load(gx_dc_wts_load); -static dev_color_proc_fill_rectangle(gx_dc_wts_fill_rectangle); -static dev_color_proc_equal(gx_dc_wts_equal); -static dev_color_proc_write(gx_dc_wts_write); -static dev_color_proc_read(gx_dc_wts_read); -static dev_color_proc_get_nonzero_comps(gx_dc_wts_get_nonzero_comps); -const gx_device_color_type_t gx_dc_type_data_wts = { - &st_dc_wts, - gx_dc_wts_save_dc, gx_dc_wts_get_dev_halftone, - gx_dc_ht_get_phase, - gx_dc_wts_load, gx_dc_wts_fill_rectangle, - gx_dc_default_fill_masked, gx_dc_wts_equal, - gx_dc_wts_write, gx_dc_wts_read, - gx_dc_wts_get_nonzero_comps -}; -#undef gx_dc_type_wts -const gx_device_color_type_t *const gx_dc_type_wts = -&gx_dc_type_data_wts; -#endif - -/* Low-level implementation follows. */ - -/** - * mul_shr_16: Multiply and shift right 16. - * @a: 32-bit signed number. - * @b: 32-bit signed number. - * - * Multiply @a and @b, then shift right 16 bits. Allow intermediate value - * to overflow 32 bits. - * - * Return value: result. - **/ -#ifdef GXWTS_USE_DOUBLE -static int -mul_shr_16 (int a, int b) -{ - return (int)floor(((double) a) * ((double) b) * (1.0 / (1 << 16))); -} -#else -#error todo: supply mul_shr_16 based on 64 bit integer type -#endif - -/* Implementation of wts_get_samples for rational cells. */ -#if 0 -static int -wts_get_samples_rat(const wts_screen_t *ws, int x, int y, - int *pcellx, int *pcelly, int *p_nsamples) -{ - int d = y / ws->cell_height; - int r = y % ws->cell_height; - int x_ix = ((d * ws->cell_shift) + x) % ws->cell_width; - *p_nsamples = ws->cell_width - x_ix; - *pcellx = x_ix; - *pcelly = y_ix; - return 0; -} -#endif - -#define MOD_IS_SLOWER_THAN_BRANCH - -#ifdef WTS_CACHE_SIZE_X -/* Implementation of wts_get_samples for Screen J, with cache. */ -static int -wts_get_samples_j(wts_screen_t *ws, int x, int y, - int *pcellx, int *pcelly, int *p_nsamples) -{ - int x_ix, y_ix; - int nsamples; - wts_screen_j_t *wsj = (wts_screen_j_t *)ws; - wts_j_cache_el *xcache = &wsj->xcache[(x >> 3) & (WTS_CACHE_SIZE_X - 1)]; - wts_j_cache_el *ycache = &wsj->ycache[y & (WTS_CACHE_SIZE_Y - 1)]; - - if (xcache->tag != x || (x & 7)) { - double pad = (wsj->pa) * (1.0 / (1 << 16)); - double pbd = (wsj->pb) * (1.0 / (1 << 16)); - double afrac = x * pad; - double bfrac = x * pbd; - int acount = (int)floor(afrac); - int bcount = (int)floor(bfrac); - int nsa = (int)ceil((acount + 1 - afrac) / pad); - int nsb = (int)ceil((acount + 1 - afrac) / pad); - - xcache->x = x + acount * wsj->XA + bcount * wsj->XB; - xcache->y = acount * wsj->YA + bcount * wsj->YB; -#ifdef MOD_IS_SLOWER_THAN_BRANCH - xcache->x += (xcache->y / ws->cell_height) * ws->cell_shift; - xcache->y %= ws->cell_height; -#endif - xcache->nsamples = min(nsa, nsb); - xcache->tag = x; - } - x_ix = xcache->x; - y_ix = xcache->y; - nsamples = xcache->nsamples; - - if (ycache->tag != y) { - int ccount = mul_shr_16(y, wsj->pc); - int dcount = mul_shr_16(y, wsj->pd); - - ycache->x = ccount * wsj->XC + dcount * wsj->XD; - ycache->y = y + ccount * wsj->YC + dcount * wsj->YD; -#ifdef MOD_IS_SLOWER_THAN_BRANCH - ycache->x += (ycache->y / ws->cell_height) * ws->cell_shift; - ycache->y %= ws->cell_height; -#endif - ycache->tag = y; - } - x_ix += ycache->x; - y_ix += ycache->y; - -#ifdef MOD_IS_SLOWER_THAN_BRANCH - if (y_ix >= ws->cell_height) { - x_ix += ws->cell_shift; - y_ix -= ws->cell_height; - } -#else - x_ix += (y_ix / ws->cell_height) * ws->cell_shift; - y_ix %= ws->cell_height; -#endif - x_ix %= ws->cell_width; - - nsamples = min(nsamples, ws->cell_width - x_ix); - *p_nsamples = nsamples; - *pcellx = x_ix; - *pcelly = y_ix; - return 0; -} -#else -/* Implementation of wts_get_samples for Screen J. */ -static int -wts_get_samples_j(wts_screen_t *ws, int x, int y, - int *pcellx, int *pcelly, int *p_nsamples) -{ - const wts_screen_j_t *wsj = (const wts_screen_j_t *)ws; - /* int d = y / ws->cell_height; */ - int y_ix = y; - int x_ix = x; - double pad = (wsj->pa) * (1.0 / (1 << 16)); - double pbd = (wsj->pb) * (1.0 / (1 << 16)); - double afrac = x * pad; - double bfrac = x * pbd; - int acount = (int)floor(afrac); - int bcount = (int)floor(bfrac); - int ccount = mul_shr_16(y, wsj->pc); - int dcount = mul_shr_16(y, wsj->pd); - int nsamples; - - x_ix += acount * wsj->XA + bcount * wsj->XB + - ccount * wsj->XC + dcount * wsj->XD; - y_ix += acount * wsj->YA + bcount * wsj->YB + - ccount * wsj->YC + dcount * wsj->YD; - - x_ix += (y_ix / ws->cell_height) * ws->cell_shift; - x_ix %= ws->cell_width; - y_ix %= ws->cell_height; - - nsamples = ws->cell_width - x_ix; - if (floor (afrac + (nsamples - 1) * pad) > acount) - nsamples = (int)ceil((acount + 1 - afrac) / pad); - - if (floor (bfrac + (nsamples - 1) * pbd) > bcount) - nsamples = (int)ceil((bcount + 1 - bfrac) / pbd); -#if 0 - printf("get_samples: (%d, %d) -> (%d, %d) %d (cc=%d)\n", - x, y, x_ix, y_ix, nsamples, ccount); -#endif - *p_nsamples = nsamples; - *pcellx = x_ix; - *pcelly = y_ix; - return 0; -} -#endif - -static int -wts_screen_h_offset(int x, double p1, int m1, int m2) -{ - /* todo: this is a linear search; constant time should be feasible */ - double running_p = 0; - int width_so_far; - int this_width; - - for (width_so_far = 0;; width_so_far += this_width) { - running_p += p1; - if (running_p >= 0.5) { - this_width = m1; - running_p -= 1; - } else { - this_width = m2; - } - if (width_so_far + this_width > x) - break; - } - return x - width_so_far + (this_width == m1 ? 0 : m1); -} - -/* Implementation of wts_get_samples for Screen H. */ -static int -wts_get_samples_h(const wts_screen_t *ws, int x, int y, - int *pcellx, int *pcelly, int *p_nsamples) -{ - const wts_screen_h_t *wsh = (const wts_screen_h_t *)ws; - int x_ix = wts_screen_h_offset(x, wsh->px, - wsh->x1, ws->cell_width - wsh->x1); - int y_ix = wts_screen_h_offset(y, wsh->py, - wsh->y1, ws->cell_height - wsh->y1); - *p_nsamples = (x_ix >= wsh->x1 ? ws->cell_width : wsh->x1) - x_ix; - *pcellx = x_ix; - *pcelly = y_ix; - return 0; -} - -/** - * wts_get_samples: Get samples from Well Tempered Screening cell. - * @ws: Well Tempered Screening cell. - * @x: X coordinate of starting point. - * @y: Y coordinate of starting point. - * @samples: Where to store pointer to samples. - * @p_nsamples: Where to store number of valid samples. - * - * Finds samples from the cell for use in halftoning. On success, - * @p_nsamples is set to the number of valid samples, ie for 0 <= i < - * nsamples, samples[i] is a valid sample for coordinate (x + i, y). - * p_nsamples is guaranteed to at least 1. The samples in @samples - * are valid for the lifetime of the cell, or until the next garbage - * collection, whichever comes first. - * - * Todo: describe meaning of wts_screen_sample_t (particularly edge - * cases). - * - * Note: may want to add a "cursor" to the api as an optimization. It - * can wait, though. - * - * Return value: 0 on success. - **/ -int -wts_get_samples(wts_screen_t *ws, int x, int y, - int *pcellx, int *pcelly, int *p_nsamples) -{ - if (ws->type == WTS_SCREEN_J) - return wts_get_samples_j(ws, x, y, pcellx, pcelly, p_nsamples); - if (ws->type == WTS_SCREEN_H) - return wts_get_samples_h(ws, x, y, pcellx, pcelly, p_nsamples); - else - return -1; -} - -/* Device color methods follow. */ - -static void -gx_dc_wts_save_dc(const gx_device_color * pdevc, gx_device_color_saved * psdc) -{ - psdc->type = pdevc->type; - memcpy( psdc->colors.wts.levels, - pdevc->colors.wts.levels, - sizeof(psdc->colors.wts.levels) ); - psdc->phase = pdevc->phase; -} - -static const gx_device_halftone * -gx_dc_wts_get_dev_halftone(const gx_device_color * pdevc) -{ - return pdevc->colors.wts.w_ht; -} - -static int -gx_dc_wts_load(gx_device_color *pdevc, const gs_imager_state * pis, - gx_device *ignore_dev, gs_color_select_t select) -{ - return 0; -} - -/** - * wts_draw: Draw a halftoned shade into a 1 bit deep buffer. - * @ws: WTS screen. - * @shade: Gray shade to draw. - * @data: Destination buffer. - * @data_raster: Rowstride for destination buffer. - * @x, @y, @w, @h: coordinates of rectangle to draw. - * - * This is close to an implementation of the "draw" method for the - * gx_ht_order class. Currently, only WTS screens implement this - * method, and only WTS device colors invoke it. However, implementing - * this for legacy order objects is probably a good idea, to improve - * halftoning performance as the cell size scales up. - * - * However, it's not exactly an implementation of the "draw" method - * for the gx_ht_order class because the "self" type would need to be - * gx_ht_order. Currently, however, device colors don't hold a pointer - * to the order object. Some amount of refactoring seems to be in - * order. - * - * Return value: 0 on success. - **/ -static int -wts_draw(wts_screen_t *ws, wts_screen_sample_t shade, - byte *data, int data_raster, - int x, int y, int w, int h) -{ - int xo, yo; - unsigned char *line_start = data; - - for (yo = 0; yo < h; yo++) { - unsigned char *line_ptr = line_start; - int mask = 0x80; - unsigned char b = 0; - int imax; - - for (xo = 0; xo < w; xo += imax) { - wts_screen_sample_t *samples; - int n_samples, i; - int cx, cy; - - wts_get_samples(ws, x + xo, y + yo, &cx, &cy, &n_samples); - samples = ws->samples + cy * ws->cell_width + cx; - imax = min(w - xo, n_samples); - for (i = 0; i < imax; i++) { - if (shade > samples[i]) - b |= mask; - mask >>= 1; - if (mask == 0) { - *line_ptr++ = b; - b = 0; - mask = 0x80; - } - } - } - if (mask != 0x80) - *line_ptr = b; - line_start += data_raster; - } - return 0; -} - -/** - * Special case implementation for one component. When we do plane_mask, - * we'll want to generalize this to handle any single-bit plane_mask. - **/ -static int -gx_dc_wts_fill_rectangle_1(const gx_device_color *pdevc, - int x, int y, int w, int h, - gx_device *dev, gs_logical_operation_t lop, - const gx_rop_source_t *source) -{ - /* gx_rop_source_t no_source; */ - int tile_raster = ((w + 31) & -32) >> 3; - int tile_size = tile_raster * h; - unsigned char *tile_data; - int code = 0; - gx_ht_order_component *components = pdevc->colors.wts.w_ht->components; - wts_screen_t *ws = components[0].corder.wts; - wts_screen_sample_t shade = pdevc->colors.wts.levels[0]; - gx_color_index color0, color1; - int xph = pdevc->phase.x; - int yph = pdevc->phase.y; - - color0 = dev->color_info.separable_and_linear == GX_CINFO_SEP_LIN ? 0 : - pdevc->colors.wts.plane_vector[1]; - color1 = pdevc->colors.wts.plane_vector[0]; - - tile_data = malloc(tile_size); - - wts_draw(ws, shade, tile_data, tile_raster, x - xph, y - yph, w, h); - - /* See gx_dc_ht_binary_fill_rectangle() for explanation. */ - if (dev->color_info.depth > 1) - lop &= ~lop_T_transparent; - - /* Interesting question: should data_x be (x & 7), rather than 0, - to improve alignment? */ - if (source == NULL && lop_no_S_is_T(lop)) - code = (*dev_proc(dev, copy_mono)) - (dev, tile_data, 0, tile_raster, gx_no_bitmap_id, - x, y, w, h, color0, color1); - - free(tile_data); - return code; -} - -static int -gx_dc_wts_write( - const gx_device_color * pdevc, - const gx_device_color_saved * psdc, - const gx_device * dev, - uint offset, - byte * pdata, - uint * psize ) -{ - /* not yet implemented */ - return_error(gs_error_unknownerror); -} - -static int -gx_dc_wts_read( - gx_device_color * pdevc, - const gs_imager_state * pis, - const gx_device_color * prior_devc, - const gx_device * dev, - uint offset, - const byte * pdata, - uint size, - gs_memory_t * mem ) -{ - /* not yet implemented */ - return_error(gs_error_unknownerror); -} - -/** - * wts_repack_tile_4: Repack four 1-bit tiles into chunky nibbles. - * Note: argument list will change. plane_mask and base_color will - * probably get added as an optimization. - * - * Note: we round w up to an even value. We're counting on the - * subsequent copy_color to ignore any extra bits. - **/ -static void -wts_repack_tile_4(unsigned char *ctile_data, int ctile_raster, - const unsigned char **tile_data, int tile_raster, - const gx_color_index *plane_vector, bool invert, - int w, int h) -{ - int y; - int tile_idx_start = 0; - unsigned char *ctile_start = ctile_data; - byte inv_byte = invert ? 0xff : 0; - - for (y = 0; y < h; y++) { - int x; - int tile_idx = tile_idx_start; - - for (x = 0; x < w; x += 2) { - byte b = 0; - byte m0 = 0x80 >> (x & 6); - byte m1 = m0 >> 1; - byte td; - - td = tile_data[0][tile_idx] ^ inv_byte; - if (td & m0) b |= plane_vector[0] << 4; - if (td & m1) b |= plane_vector[0]; - - td = tile_data[1][tile_idx] ^ inv_byte; - if (td & m0) b |= plane_vector[1] << 4; - if (td & m1) b |= plane_vector[1]; - - td = tile_data[2][tile_idx] ^ inv_byte; - if (td & m0) b |= plane_vector[2] << 4; - if (td & m1) b |= plane_vector[2]; - - td = tile_data[3][tile_idx] ^ inv_byte; - if (td & m0) b |= plane_vector[3] << 4; - if (td & m1) b |= plane_vector[3]; - - if ((x & 6) == 6) - tile_idx++; - ctile_start[x >> 1] = b; - } - tile_idx_start += tile_raster; - ctile_start += ctile_raster; - } -} - -/* Special case implementation for four components. Intermediate color - * to the order objecttile (for copy_color) is packed 2 to a byte. - * - * Looking at this code, it should generalize to more than four - * components. Probably the repack code should get factored out. - */ -static int -gx_dc_wts_fill_rectangle_4(const gx_device_color *pdevc, - int x, int y, int w, int h, - gx_device *dev, gs_logical_operation_t lop, - const gx_rop_source_t *source) -{ - int num_comp = pdevc->colors.wts.num_components; - /* gx_rop_source_t no_source; */ - - int tile_raster = ((w + 31) & -32) >> 3; - int tile_size = tile_raster * h; - unsigned char *tile_data[4]; - - int ctile_raster = ((w + 7) & -8) >> 1; - int ctile_size = ctile_raster * h; - unsigned char *ctile_data; - - int code = 0; - bool invert = 0 && dev->color_info.polarity == GX_CINFO_POLARITY_SUBTRACTIVE; - int i; - int xph = pdevc->phase.x; - int yph = pdevc->phase.y; - - for (i = 0; i < num_comp; i++) { - wts_screen_sample_t shade = pdevc->colors.wts.levels[i]; - gx_ht_order_component *components = pdevc->colors.wts.w_ht->components; - wts_screen_t *ws = components[i].corder.wts; - - tile_data[i] = malloc(tile_size); - wts_draw(ws, shade, tile_data[i], tile_raster, x - xph, y - yph, w, h); - } - - ctile_data = malloc(ctile_size); - wts_repack_tile_4(ctile_data, ctile_raster, - (const unsigned char **)tile_data, tile_raster, - pdevc->colors.wts.plane_vector, invert, w, h); - - /* See gx_dc_ht_binary_fill_rectangle() for explanation. */ - if (dev->color_info.depth > 1) - lop &= ~lop_T_transparent; - - if (source == NULL && lop_no_S_is_T(lop)) - code = (*dev_proc(dev, copy_color)) - (dev, ctile_data, 0, ctile_raster, gx_no_bitmap_id, - x, y, w, h); - - free(ctile_data); - for (i = 0; i < num_comp; i++) { - free(tile_data[i]); - } - - return code; -} - -static int -gx_dc_wts_fill_rectangle(const gx_device_color *pdevc, - int x, int y, int w, int h, - gx_device *dev, gs_logical_operation_t lop, - const gx_rop_source_t *source) -{ - int num_comp = pdevc->colors.wts.num_components; - - if (num_comp == 1) - return gx_dc_wts_fill_rectangle_1(pdevc, x, y, w, h, dev, lop, source); - else if (num_comp <= 4) - return gx_dc_wts_fill_rectangle_4(pdevc, x, y, w, h, dev, lop, source); - else - return -1; -} - -/* Compare two wts colors for equality. */ -static int -gx_dc_wts_equal(const gx_device_color *pdevc1, - const gx_device_color *pdevc2) -{ - uint num_comp = pdevc1->colors.wts.num_components; - - if (pdevc2->type != pdevc1->type || - pdevc1->phase.x != pdevc2->phase.x || - pdevc1->phase.y != pdevc2->phase.y || - num_comp != pdevc2->colors.wts.num_components - ) - return false; - return - !memcmp(pdevc1->colors.wts.levels, - pdevc2->colors.wts.levels, - num_comp * sizeof(pdevc1->colors.wts.levels[0])); -} - -/* - * Get the nonzero components of a wts halftone. This is used to - * distinguish components that are given zero intensity due to halftoning - * from those for which the original color intensity was in fact zero. - */ -int -gx_dc_wts_get_nonzero_comps( - const gx_device_color * pdevc, - const gx_device * dev_ignored, - gx_color_index * pcomp_bits ) -{ - int i, ncomps = pdevc->colors.wts.num_components; - gx_color_index comp_bits = 0; /* todo: plane_mask */ - - for (i = 0; i < ncomps; i++) { - if (pdevc->colors.wts.levels[i] != 0) - comp_bits |= ((gx_color_index)1) << i; - } - *pcomp_bits = comp_bits; - - return 0; -} diff -Nru ghostscript-9.04~dfsg/base/gxwts.h ghostscript-9.05~dfsg~20120125/base/gxwts.h --- ghostscript-9.04~dfsg/base/gxwts.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gxwts.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,93 +0,0 @@ -/* Copyright (C) 2001-2006 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ -/*$Id$ */ -#ifndef gxwts_INCLUDED -# define gxwts_INCLUDED - -typedef bits16 wts_screen_sample_t; - -#ifndef wts_screen_t_DEFINED -# define wts_screen_t_DEFINED -typedef struct wts_screen_s wts_screen_t; -#endif - -/* We cache intermediate results for wts_get_samples_j. In general, if these - are set so that a band fits, then the hit rate will be excellent. */ -#define WTS_CACHE_SIZE_X 512 -#define WTS_CACHE_SIZE_Y 512 - -typedef enum { - WTS_SCREEN_RAT, - WTS_SCREEN_J, - WTS_SCREEN_H -} wts_screen_type; - -struct wts_screen_s { - wts_screen_type type; - int cell_width; - int cell_height; - int cell_shift; - wts_screen_sample_t *samples; -}; - -typedef struct { - int tag; - int x; - int y; - int nsamples; -} wts_j_cache_el; - -typedef struct { - wts_screen_t base; - - /* Probabilities of "jumps". A and B jumps can happen when moving - one pixel to the right. C and D can happen when moving one pixel - down. */ - int pa; /* change to double? */ - int pb; - int pc; - int pd; - - int XA; - int YA; - int XB; - int YB; - int XC; - int YC; - int XD; - int YD; - -#ifdef WTS_CACHE_SIZE_X -#define WTS_SCREEN_J_SIZE_NOCACHE 68 - wts_j_cache_el xcache[WTS_CACHE_SIZE_X]; - wts_j_cache_el ycache[WTS_CACHE_SIZE_Y]; -#endif -} wts_screen_j_t; - -typedef struct { - wts_screen_t base; - - /* This is the exact value that x1 and (width-x1) approximates. */ - double px; - /* Ditto y1 and (height-y1). */ - double py; - - int x1; - int y1; -} wts_screen_h_t; - -int -wts_get_samples(wts_screen_t *ws, int x, int y, - int *pcellx, int *pcelly, int *p_nsamples); - -#endif diff -Nru ghostscript-9.04~dfsg/base/gzstate.h ghostscript-9.05~dfsg~20120125/base/gzstate.h --- ghostscript-9.04~dfsg/base/gzstate.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/gzstate.h 2011-09-29 11:02:09.000000000 +0000 @@ -149,9 +149,10 @@ gs_state_client_procs client_procs; }; +struct_proc_finalize(gs_imager_state_finalize); #define public_st_gs_state() /* in gsstate.c */\ - gs_public_st_composite(st_gs_state, gs_state, "gs_state",\ - gs_state_enum_ptrs, gs_state_reloc_ptrs) + gs_public_st_composite_use_final(st_gs_state, gs_state, "gs_state",\ + gs_state_enum_ptrs, gs_state_reloc_ptrs, gs_imager_state_finalize) /* * Enumerate the pointers in a graphics state, other than the ones in the diff -Nru ghostscript-9.04~dfsg/base/icc34.h ghostscript-9.05~dfsg~20120125/base/icc34.h --- ghostscript-9.04~dfsg/base/icc34.h 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/icc34.h 2012-01-25 08:44:24.000000000 +0000 @@ -0,0 +1,1029 @@ +/* Header file guard bands */ +#ifndef ICC_H +#define ICC_H + +/***************************************************************** + Copyright (c) 1994-1996 SunSoft, Inc. + + Rights Reserved + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without restrict- +ion, including without limitation the rights to use, copy, modify, +merge, publish distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON- +INFRINGEMENT. IN NO EVENT SHALL SUNSOFT, INC. OR ITS PARENT +COMPANY BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of SunSoft, Inc. +shall not be used in advertising or otherwise to promote the +sale, use or other dealings in this Software without written +authorization from SunSoft Inc. +******************************************************************/ + +/* + * This version of the header file corresponds to the profile + * specification version 3.4. + * + * All header file entries are pre-fixed with "ic" to help + * avoid name space collisions. Signatures are pre-fixed with + * icSig. + * + * The structures defined in this header file were created to + * represent a description of an ICC profile on disk. Rather + * than use pointers a technique is used where a single byte array + * was placed at the end of each structure. This allows us in "C" + * to extend the structure by allocating more data than is needed + * to account for variable length structures. + * + * This also ensures that data following is allocated + * contiguously and makes it easier to write and read data from + * the file. + * + * For example to allocate space for a 256 count length UCR + * and BG array, and fill the allocated data. Note strlen + 1 + * to remember NULL terminator. + * + icUcrBgCurve *ucrCurve, *bgCurve; + int ucr_nbytes, bg_nbytes, string_bytes; + icUcrBg *ucrBgWrite; + char ucr_string[100], *ucr_char; + + strcpy(ucr_string, "Example ucrBG curves"); + ucr_nbytes = sizeof(icUInt32Number) + + (UCR_CURVE_SIZE * sizeof(icUInt16Number)); + bg_nbytes = sizeof(icUInt32Number) + + (BG_CURVE_SIZE * sizeof(icUInt16Number)); + string_bytes = strlen(ucr_string) + 1; + + ucrBgWrite = (icUcrBg *)malloc( + (ucr_nbytes + bg_nbytes + string_bytes)); + + ucrCurve = (icUcrBgCurve *)ucrBgWrite->data; + ucrCurve->count = UCR_CURVE_SIZE; + for (i=0; icount; i++) + ucrCurve->curve[i] = (icUInt16Number)i; + + bgCurve = (icUcrBgCurve *)((char *)ucrCurve + ucr_nbytes); + bgCurve->count = BG_CURVE_SIZE; + for (i=0; icount; i++) + bgCurve->curve[i] = 255 - (icUInt16Number)i; + + ucr_char = (char *)((char *)bgCurve + bg_nbytes); + memcpy(ucr_char, ucr_string, string_bytes); + * + */ + +/* + * Many of the structures contain variable length arrays. This + * is represented by the use of the convention. + * + * type data[icAny]; + */ + +/*------------------------------------------------------------------------*/ +/* + * Defines used in the specification + */ +#define icMagicNumber 0x61637370L /* 'acsp' */ +#define icVersionNumber 0x02100000L /* 2.1.0, BCD */ + +/* Screening Encodings */ +#define icPrtrDefaultScreensFalse 0x00000000L /* Bit pos 0 */ +#define icPrtrDefaultScreensTrue 0x00000001L /* Bit pos 0 */ +#define icLinesPerInch 0x00000002L /* Bit pos 1 */ +#define icLinesPerCm 0x00000000L /* Bit pos 1 */ + +/* + * Device attributes, currently defined values correspond + * to the low 4 bytes of the 8 byte attribute quantity, see + * the header for their location. + */ +#define icReflective 0x00000000L /* Bit pos 0 */ +#define icTransparency 0x00000001L /* Bit pos 0 */ +#define icGlossy 0x00000000L /* Bit pos 1 */ +#define icMatte 0x00000002L /* Bit pos 1 */ + +/* + * Profile header flags, the low 16 bits are reserved for consortium + * use. + */ +#define icEmbeddedProfileFalse 0x00000000L /* Bit pos 0 */ +#define icEmbeddedProfileTrue 0x00000001L /* Bit pos 0 */ +#define icUseAnywhere 0x00000000L /* Bit pos 1 */ +#define icUseWithEmbeddedDataOnly 0x00000002L /* Bit pos 1 */ + +/* Ascii or Binary data */ +#define icAsciiData 0x00000000L +#define icBinaryData 0x00000001L + +/* + * Define used to indicate that this is a variable length array + */ +#define icAny 1 + + +/*------------------------------------------------------------------------*/ +/* + * Use this area to translate platform definitions of long + * etc into icXXX form. The rest of the header uses the icXXX + * typedefs. Signatures are 4 byte quantities. + * + */ + + +#ifdef PACKAGE_NAME +/* + June 9, 2003, Adapted for use with configure by Bob Friesenhahn + Added the stupid check for autoconf by Marti Maria. + PACKAGE_NAME is defined if autoconf is being used +*/ + +typedef @UINT8_T@ icUInt8Number; +typedef @UINT16_T@ icUInt16Number; +typedef @UINT32_T@ icUInt32Number; +typedef @UINT32_T@ icUInt64Number[2]; + +typedef @INT8_T@ icInt8Number; +typedef @INT16_T@ icInt16Number; +typedef @INT32_T@ icInt32Number; +typedef @INT32_T@ icInt64Number[2]; + +#else + +/* + *Apr-17-2002: Modified by Marti Maria in order to provide wider portability. + */ + +#if defined (__digital__) && defined (__unix__) + +/* Tru64 */ + +#include + +typedef uint8_t icUInt8Number; +typedef uint16_t icUInt16Number; +typedef uint32_t icUInt32Number; +typedef uint32_t icUInt64Number[2]; + +typedef int8_t icInt8Number; +typedef int16_t icInt16Number; +typedef int32_t icInt32Number; +typedef int32_t icInt64Number[2]; + +#else +#ifdef __sgi +#include "sgidefs.h" + + +/* + * Number definitions + */ + +/* Unsigned integer numbers */ +typedef unsigned char icUInt8Number; +typedef unsigned short icUInt16Number; +typedef __uint32_t icUInt32Number; +typedef __uint32_t icUInt64Number[2]; + +/* Signed numbers */ +typedef char icInt8Number; +typedef short icInt16Number; +typedef __int32_t icInt32Number; +typedef __int32_t icInt64Number[2]; + + +#else +#if defined(__GNUC__) || defined(__unix__) || defined(__unix) + +#include + +#if defined(__sun) || defined(__hpux) || defined (__MINGW) || defined(__MINGW32__) + +#if defined (__MINGW) || defined(__MINGW32__) +#include +#endif + + +typedef uint8_t icUInt8Number; +typedef uint16_t icUInt16Number; +typedef uint32_t icUInt32Number; +typedef uint32_t icUInt64Number[2]; + +#else + +/* Unsigned integer numbers */ +typedef u_int8_t icUInt8Number; +typedef u_int16_t icUInt16Number; +typedef u_int32_t icUInt32Number; +typedef u_int32_t icUInt64Number[2]; + +#endif + + +/* Signed numbers */ +typedef int8_t icInt8Number; +typedef int16_t icInt16Number; +typedef int32_t icInt32Number; +typedef int32_t icInt64Number[2]; + + +#else /* default definitions */ + +/* + * Number definitions + */ + +/* Unsigned integer numbers */ +typedef unsigned char icUInt8Number; +typedef unsigned short icUInt16Number; +typedef unsigned long icUInt32Number; +typedef unsigned long icUInt64Number[2]; + +/* Signed numbers */ +typedef char icInt8Number; +typedef short icInt16Number; +typedef long icInt32Number; +typedef long icInt64Number[2]; + + +#endif /* default defs */ +#endif +#endif +#endif + +/* Base types */ + +typedef icInt32Number icSignature; +typedef icInt32Number icS15Fixed16Number; +typedef icUInt32Number icU16Fixed16Number; + + +/*------------------------------------------------------------------------*/ +/* public tags and sizes */ +typedef enum { + icSigAToB0Tag = 0x41324230L, /* 'A2B0' */ + icSigAToB1Tag = 0x41324231L, /* 'A2B1' */ + icSigAToB2Tag = 0x41324232L, /* 'A2B2' */ + icSigBlueColorantTag = 0x6258595AL, /* 'bXYZ' */ + icSigBlueTRCTag = 0x62545243L, /* 'bTRC' */ + icSigBToA0Tag = 0x42324130L, /* 'B2A0' */ + icSigBToA1Tag = 0x42324131L, /* 'B2A1' */ + icSigBToA2Tag = 0x42324132L, /* 'B2A2' */ + icSigCalibrationDateTimeTag = 0x63616C74L, /* 'calt' */ + icSigCharTargetTag = 0x74617267L, /* 'targ' */ + icSigCopyrightTag = 0x63707274L, /* 'cprt' */ + icSigCrdInfoTag = 0x63726469L, /* 'crdi' */ + icSigDeviceMfgDescTag = 0x646D6E64L, /* 'dmnd' */ + icSigDeviceModelDescTag = 0x646D6464L, /* 'dmdd' */ + icSigGamutTag = 0x67616D74L, /* 'gamt ' */ + icSigGrayTRCTag = 0x6b545243L, /* 'kTRC' */ + icSigGreenColorantTag = 0x6758595AL, /* 'gXYZ' */ + icSigGreenTRCTag = 0x67545243L, /* 'gTRC' */ + icSigLuminanceTag = 0x6C756d69L, /* 'lumi' */ + icSigMeasurementTag = 0x6D656173L, /* 'meas' */ + icSigMediaBlackPointTag = 0x626B7074L, /* 'bkpt' */ + icSigMediaWhitePointTag = 0x77747074L, /* 'wtpt' */ + icSigNamedColorTag = 0x6E636f6CL, /* 'ncol' + * OBSOLETE, use ncl2 */ + icSigNamedColor2Tag = 0x6E636C32L, /* 'ncl2' */ + icSigPreview0Tag = 0x70726530L, /* 'pre0' */ + icSigPreview1Tag = 0x70726531L, /* 'pre1' */ + icSigPreview2Tag = 0x70726532L, /* 'pre2' */ + icSigProfileDescriptionTag = 0x64657363L, /* 'desc' */ + icSigProfileSequenceDescTag = 0x70736571L, /* 'pseq' */ + icSigPs2CRD0Tag = 0x70736430L, /* 'psd0' */ + icSigPs2CRD1Tag = 0x70736431L, /* 'psd1' */ + icSigPs2CRD2Tag = 0x70736432L, /* 'psd2' */ + icSigPs2CRD3Tag = 0x70736433L, /* 'psd3' */ + icSigPs2CSATag = 0x70733273L, /* 'ps2s' */ + icSigPs2RenderingIntentTag = 0x70733269L, /* 'ps2i' */ + icSigRedColorantTag = 0x7258595AL, /* 'rXYZ' */ + icSigRedTRCTag = 0x72545243L, /* 'rTRC' */ + icSigScreeningDescTag = 0x73637264L, /* 'scrd' */ + icSigScreeningTag = 0x7363726EL, /* 'scrn' */ + icSigTechnologyTag = 0x74656368L, /* 'tech' */ + icSigUcrBgTag = 0x62666420L, /* 'bfd ' */ + icSigViewingCondDescTag = 0x76756564L, /* 'vued' */ + icSigViewingConditionsTag = 0x76696577L, /* 'view' */ + icMaxEnumTag = 0xFFFFFFFFL +} icTagSignature; + +/* technology signature descriptions */ +typedef enum { + icSigDigitalCamera = 0x6463616DL, /* 'dcam' */ + icSigFilmScanner = 0x6673636EL, /* 'fscn' */ + icSigReflectiveScanner = 0x7273636EL, /* 'rscn' */ + icSigInkJetPrinter = 0x696A6574L, /* 'ijet' */ + icSigThermalWaxPrinter = 0x74776178L, /* 'twax' */ + icSigElectrophotographicPrinter = 0x6570686FL, /* 'epho' */ + icSigElectrostaticPrinter = 0x65737461L, /* 'esta' */ + icSigDyeSublimationPrinter = 0x64737562L, /* 'dsub' */ + icSigPhotographicPaperPrinter = 0x7270686FL, /* 'rpho' */ + icSigFilmWriter = 0x6670726EL, /* 'fprn' */ + icSigVideoMonitor = 0x7669646DL, /* 'vidm' */ + icSigVideoCamera = 0x76696463L, /* 'vidc' */ + icSigProjectionTelevision = 0x706A7476L, /* 'pjtv' */ + icSigCRTDisplay = 0x43525420L, /* 'CRT ' */ + icSigPMDisplay = 0x504D4420L, /* 'PMD ' */ + icSigAMDisplay = 0x414D4420L, /* 'AMD ' */ + icSigPhotoCD = 0x4B504344L, /* 'KPCD' */ + icSigPhotoImageSetter = 0x696D6773L, /* 'imgs' */ + icSigGravure = 0x67726176L, /* 'grav' */ + icSigOffsetLithography = 0x6F666673L, /* 'offs' */ + icSigSilkscreen = 0x73696C6BL, /* 'silk' */ + icSigFlexography = 0x666C6578L, /* 'flex' */ + icMaxEnumTechnology = 0xFFFFFFFFL +} icTechnologySignature; + +/* type signatures */ +typedef enum { + icSigCurveType = 0x63757276L, /* 'curv' */ + icSigDataType = 0x64617461L, /* 'data' */ + icSigDateTimeType = 0x6474696DL, /* 'dtim' */ + icSigLut16Type = 0x6d667432L, /* 'mft2' */ + icSigLut8Type = 0x6d667431L, /* 'mft1' */ + icSigMeasurementType = 0x6D656173L, /* 'meas' */ + icSigNamedColorType = 0x6E636f6CL, /* 'ncol' + * OBSOLETE, use ncl2 */ + icSigProfileSequenceDescType = 0x70736571L, /* 'pseq' */ + icSigS15Fixed16ArrayType = 0x73663332L, /* 'sf32' */ + icSigScreeningType = 0x7363726EL, /* 'scrn' */ + icSigSignatureType = 0x73696720L, /* 'sig ' */ + icSigTextType = 0x74657874L, /* 'text' */ + icSigTextDescriptionType = 0x64657363L, /* 'desc' */ + icSigU16Fixed16ArrayType = 0x75663332L, /* 'uf32' */ + icSigUcrBgType = 0x62666420L, /* 'bfd ' */ + icSigUInt16ArrayType = 0x75693136L, /* 'ui16' */ + icSigUInt32ArrayType = 0x75693332L, /* 'ui32' */ + icSigUInt64ArrayType = 0x75693634L, /* 'ui64' */ + icSigUInt8ArrayType = 0x75693038L, /* 'ui08' */ + icSigViewingConditionsType = 0x76696577L, /* 'view' */ + icSigXYZType = 0x58595A20L, /* 'XYZ ' */ + icSigXYZArrayType = 0x58595A20L, /* 'XYZ ' */ + icSigNamedColor2Type = 0x6E636C32L, /* 'ncl2' */ + icSigCrdInfoType = 0x63726469L, /* 'crdi' */ + icMaxEnumType = 0xFFFFFFFFL +} icTagTypeSignature; + +/* + * Color Space Signatures + * Note that only icSigXYZData and icSigLabData are valid + * Profile Connection Spaces (PCSs) + */ +typedef enum { + icSigXYZData = 0x58595A20L, /* 'XYZ ' */ + icSigLabData = 0x4C616220L, /* 'Lab ' */ + icSigLuvData = 0x4C757620L, /* 'Luv ' */ + icSigYCbCrData = 0x59436272L, /* 'YCbr' */ + icSigYxyData = 0x59787920L, /* 'Yxy ' */ + icSigRgbData = 0x52474220L, /* 'RGB ' */ + icSigGrayData = 0x47524159L, /* 'GRAY' */ + icSigHsvData = 0x48535620L, /* 'HSV ' */ + icSigHlsData = 0x484C5320L, /* 'HLS ' */ + icSigCmykData = 0x434D594BL, /* 'CMYK' */ + icSigCmyData = 0x434D5920L, /* 'CMY ' */ + icSig2colorData = 0x32434C52L, /* '2CLR' */ + icSig3colorData = 0x33434C52L, /* '3CLR' */ + icSig4colorData = 0x34434C52L, /* '4CLR' */ + icSig5colorData = 0x35434C52L, /* '5CLR' */ + icSig6colorData = 0x36434C52L, /* '6CLR' */ + icSig7colorData = 0x37434C52L, /* '7CLR' */ + icSig8colorData = 0x38434C52L, /* '8CLR' */ + icSig9colorData = 0x39434C52L, /* '9CLR' */ + icSig10colorData = 0x41434C52L, /* 'ACLR' */ + icSig11colorData = 0x42434C52L, /* 'BCLR' */ + icSig12colorData = 0x43434C52L, /* 'CCLR' */ + icSig13colorData = 0x44434C52L, /* 'DCLR' */ + icSig14colorData = 0x45434C52L, /* 'ECLR' */ + icSig15colorData = 0x46434C52L, /* 'FCLR' */ + icMaxEnumData = 0xFFFFFFFFL +} icColorSpaceSignature; + +/* profileClass enumerations */ +typedef enum { + icSigInputClass = 0x73636E72L, /* 'scnr' */ + icSigDisplayClass = 0x6D6E7472L, /* 'mntr' */ + icSigOutputClass = 0x70727472L, /* 'prtr' */ + icSigLinkClass = 0x6C696E6BL, /* 'link' */ + icSigAbstractClass = 0x61627374L, /* 'abst' */ + icSigColorSpaceClass = 0x73706163L, /* 'spac' */ + icSigNamedColorClass = 0x6e6d636cL, /* 'nmcl' */ + icMaxEnumClass = 0xFFFFFFFFL +} icProfileClassSignature; + +/* Platform Signatures */ +typedef enum { + icSigMacintosh = 0x4150504CL, /* 'APPL' */ + icSigMicrosoft = 0x4D534654L, /* 'MSFT' */ + icSigSolaris = 0x53554E57L, /* 'SUNW' */ + icSigSGI = 0x53474920L, /* 'SGI ' */ + icSigTaligent = 0x54474E54L, /* 'TGNT' */ + icMaxEnumPlatform = 0xFFFFFFFFL +} icPlatformSignature; + +/*------------------------------------------------------------------------*/ +/* + * Other enums + */ + +/* Measurement Flare, used in the measurmentType tag */ +typedef enum { + icFlare0 = 0x00000000L, /* 0% flare */ + icFlare100 = 0x00000001L, /* 100% flare */ + icMaxFlare = 0xFFFFFFFFL +} icMeasurementFlare; + +/* Measurement Geometry, used in the measurmentType tag */ +typedef enum { + icGeometryUnknown = 0x00000000L, /* Unknown */ + icGeometry045or450 = 0x00000001L, /* 0/45, 45/0 */ + icGeometry0dord0 = 0x00000002L, /* 0/d or d/0 */ + icMaxGeometry = 0xFFFFFFFFL +} icMeasurementGeometry; + +/* Rendering Intents, used in the profile header */ +typedef enum { + icPerceptual = 0, + icRelativeColorimetric = 1, + icSaturation = 2, + icAbsoluteColorimetric = 3, + icMaxEnumIntent = 0xFFFFFFFFL +} icRenderingIntent; + +/* Different Spot Shapes currently defined, used for screeningType */ +typedef enum { + icSpotShapeUnknown = 0, + icSpotShapePrinterDefault = 1, + icSpotShapeRound = 2, + icSpotShapeDiamond = 3, + icSpotShapeEllipse = 4, + icSpotShapeLine = 5, + icSpotShapeSquare = 6, + icSpotShapeCross = 7, + icMaxEnumSpot = 0xFFFFFFFFL +} icSpotShape; + +/* Standard Observer, used in the measurmentType tag */ +typedef enum { + icStdObsUnknown = 0x00000000L, /* Unknown */ + icStdObs1931TwoDegrees = 0x00000001L, /* 2 deg */ + icStdObs1964TenDegrees = 0x00000002L, /* 10 deg */ + icMaxStdObs = 0xFFFFFFFFL +} icStandardObserver; + +/* Pre-defined illuminants, used in measurement and viewing conditions type */ +typedef enum { + icIlluminantUnknown = 0x00000000L, + icIlluminantD50 = 0x00000001L, + icIlluminantD65 = 0x00000002L, + icIlluminantD93 = 0x00000003L, + icIlluminantF2 = 0x00000004L, + icIlluminantD55 = 0x00000005L, + icIlluminantA = 0x00000006L, + icIlluminantEquiPowerE = 0x00000007L, + icIlluminantF8 = 0x00000008L, + icMaxEnumIluminant = 0xFFFFFFFFL +} icIlluminant; + + +/*------------------------------------------------------------------------*/ +/* + * Arrays of numbers + */ + +/* Int8 Array */ +typedef struct { + icInt8Number data[icAny]; /* Variable array of values */ +} icInt8Array; + +/* UInt8 Array */ +typedef struct { + icUInt8Number data[icAny]; /* Variable array of values */ +} icUInt8Array; + +/* uInt16 Array */ +typedef struct { + icUInt16Number data[icAny]; /* Variable array of values */ +} icUInt16Array; + +/* Int16 Array */ +typedef struct { + icInt16Number data[icAny]; /* Variable array of values */ +} icInt16Array; + +/* uInt32 Array */ +typedef struct { + icUInt32Number data[icAny]; /* Variable array of values */ +} icUInt32Array; + +/* Int32 Array */ +typedef struct { + icInt32Number data[icAny]; /* Variable array of values */ +} icInt32Array; + +/* UInt64 Array */ +typedef struct { + icUInt64Number data[icAny]; /* Variable array of values */ +} icUInt64Array; + +/* Int64 Array */ +typedef struct { + icInt64Number data[icAny]; /* Variable array of values */ +} icInt64Array; + +/* u16Fixed16 Array */ +typedef struct { + icU16Fixed16Number data[icAny]; /* Variable array of values */ +} icU16Fixed16Array; + +/* s15Fixed16 Array */ +typedef struct { + icS15Fixed16Number data[icAny]; /* Variable array of values */ +} icS15Fixed16Array; + +/* The base date time number */ +typedef struct { + icUInt16Number year; + icUInt16Number month; + icUInt16Number day; + icUInt16Number hours; + icUInt16Number minutes; + icUInt16Number seconds; +} icDateTimeNumber; + +/* XYZ Number */ +typedef struct { + icS15Fixed16Number X; + icS15Fixed16Number Y; + icS15Fixed16Number Z; +} icXYZNumber; + +/* XYZ Array */ +typedef struct { + icXYZNumber data[icAny]; /* Variable array of XYZ numbers */ +} icXYZArray; + +/* Curve */ +typedef struct { + icUInt32Number count; /* Number of entries */ + icUInt16Number data[icAny]; /* The actual table data, real + * number is determined by count + * Interpretation depends on how + * data is used with a given tag + */ +} icCurve; + +/* Data */ +typedef struct { + icUInt32Number dataFlag; /* 0 = ascii, 1 = binary */ + icInt8Number data[icAny]; /* Data, size from tag */ +} icData; + +/* lut16 */ +typedef struct { + icUInt8Number inputChan; /* Number of input channels */ + icUInt8Number outputChan; /* Number of output channels */ + icUInt8Number clutPoints; /* Number of grid points */ + icInt8Number pad; /* Padding for byte alignment */ + icS15Fixed16Number e00; /* e00 in the 3 * 3 */ + icS15Fixed16Number e01; /* e01 in the 3 * 3 */ + icS15Fixed16Number e02; /* e02 in the 3 * 3 */ + icS15Fixed16Number e10; /* e10 in the 3 * 3 */ + icS15Fixed16Number e11; /* e11 in the 3 * 3 */ + icS15Fixed16Number e12; /* e12 in the 3 * 3 */ + icS15Fixed16Number e20; /* e20 in the 3 * 3 */ + icS15Fixed16Number e21; /* e21 in the 3 * 3 */ + icS15Fixed16Number e22; /* e22 in the 3 * 3 */ + icUInt16Number inputEnt; /* Num of in-table entries */ + icUInt16Number outputEnt; /* Num of out-table entries */ + icUInt16Number data[icAny]; /* Data follows see spec */ +/* + * Data that follows is of this form + * + * icUInt16Number inputTable[inputChan][icAny]; * The in-table + * icUInt16Number clutTable[icAny]; * The clut + * icUInt16Number outputTable[outputChan][icAny]; * The out-table + */ +} icLut16; + +/* lut8, input & output tables are always 256 bytes in length */ +typedef struct { + icUInt8Number inputChan; /* Num of input channels */ + icUInt8Number outputChan; /* Num of output channels */ + icUInt8Number clutPoints; /* Num of grid points */ + icInt8Number pad; + icS15Fixed16Number e00; /* e00 in the 3 * 3 */ + icS15Fixed16Number e01; /* e01 in the 3 * 3 */ + icS15Fixed16Number e02; /* e02 in the 3 * 3 */ + icS15Fixed16Number e10; /* e10 in the 3 * 3 */ + icS15Fixed16Number e11; /* e11 in the 3 * 3 */ + icS15Fixed16Number e12; /* e12 in the 3 * 3 */ + icS15Fixed16Number e20; /* e20 in the 3 * 3 */ + icS15Fixed16Number e21; /* e21 in the 3 * 3 */ + icS15Fixed16Number e22; /* e22 in the 3 * 3 */ + icUInt8Number data[icAny]; /* Data follows see spec */ +/* + * Data that follows is of this form + * + * icUInt8Number inputTable[inputChan][256]; * The in-table + * icUInt8Number clutTable[icAny]; * The clut + * icUInt8Number outputTable[outputChan][256]; * The out-table + */ +} icLut8; + +/* Measurement Data */ +typedef struct { + icStandardObserver stdObserver; /* Standard observer */ + icXYZNumber backing; /* XYZ for backing */ + icMeasurementGeometry geometry; /* Meas. geometry */ + icMeasurementFlare flare; /* Measurement flare */ + icIlluminant illuminant; /* Illuminant */ +} icMeasurement; + +/* Named color */ + +/* + * icNamedColor2 takes the place of icNamedColor + */ +typedef struct { + icUInt32Number vendorFlag; /* Bottom 16 bits for IC use */ + icUInt32Number count; /* Count of named colors */ + icUInt32Number nDeviceCoords; /* Num of device coordinates */ + icInt8Number prefix[32]; /* Prefix for each color name */ + icInt8Number suffix[32]; /* Suffix for each color name */ + icInt8Number data[icAny]; /* Named color data follows */ +/* + * Data that follows is of this form + * + * icInt8Number root1[32]; * Root name for 1st color + * icUInt16Number pcsCoords1[icAny]; * PCS coords of 1st color + * icUInt16Number deviceCoords1[icAny]; * Dev coords of 1st color + * icInt8Number root2[32]; * Root name for 2nd color + * icUInt16Number pcsCoords2[icAny]; * PCS coords of 2nd color + * icUInt16Number deviceCoords2[icAny]; * Dev coords of 2nd color + * : + * : + * Repeat for name and PCS and device color coordinates up to (count-1) + * + * NOTES: + * PCS and device space can be determined from the header. + * + * PCS coordinates are icUInt16 numbers and are described in Annex A of + * the ICC spec. Only 16 bit L*a*b* and XYZ are allowed. The number of + * coordinates is consistent with the headers PCS. + * + * Device coordinates are icUInt16 numbers where 0x0000 represents + * the minimum value and 0xFFFF represents the maximum value. + * If the nDeviceCoords value is 0 this field is not given. + */ +} icNamedColor2; + +/* Profile sequence structure */ +typedef struct { + icSignature deviceMfg; /* Dev Manufacturer */ + icSignature deviceModel; /* Dev Model */ + icUInt64Number attributes; /* Dev attributes */ + icTechnologySignature technology; /* Technology sig */ + icInt8Number data[icAny]; /* Desc text follows */ +/* + * Data that follows is of this form, this is an icInt8Number + * to avoid problems with a compiler generating bad code as + * these arrays are variable in length. + * + * icTextDescription deviceMfgDesc; * Manufacturer text + * icTextDescription modelDesc; * Model text + */ +} icDescStruct; + +/* Profile sequence description */ +typedef struct { + icUInt32Number count; /* Number of descriptions */ + icUInt8Number data[icAny]; /* Array of desc structs */ +} icProfileSequenceDesc; + +/* textDescription */ +typedef struct { + icUInt32Number count; /* Description length */ + icInt8Number data[icAny]; /* Descriptions follow */ +/* + * Data that follows is of this form + * + * icInt8Number desc[count] * NULL terminated ascii string + * icUInt32Number ucLangCode; * UniCode language code + * icUInt32Number ucCount; * UniCode description length + * icInt16Number ucDesc[ucCount];* The UniCode description + * icUInt16Number scCode; * ScriptCode code + * icUInt8Number scCount; * ScriptCode count + * icInt8Number scDesc[67]; * ScriptCode Description + */ +} icTextDescription; + +/* Screening Data */ +typedef struct { + icS15Fixed16Number frequency; /* Frequency */ + icS15Fixed16Number angle; /* Screen angle */ + icSpotShape spotShape; /* Spot Shape encodings below */ +} icScreeningData; + +typedef struct { + icUInt32Number screeningFlag; /* Screening flag */ + icUInt32Number channels; /* Number of channels */ + icScreeningData data[icAny]; /* Array of screening data */ +} icScreening; + +/* Text Data */ +typedef struct { + icInt8Number data[icAny]; /* Variable array of chars */ +} icText; + +/* Structure describing either a UCR or BG curve */ +typedef struct { + icUInt32Number count; /* Curve length */ + icUInt16Number curve[icAny]; /* The array of curve values */ +} icUcrBgCurve; + +/* Under color removal, black generation */ +typedef struct { + icInt8Number data[icAny]; /* The Ucr BG data */ +/* + * Data that follows is of this form, this is a icInt8Number + * to avoid problems with a compiler generating bad code as + * these arrays are variable in length. + * + * icUcrBgCurve ucr; * Ucr curve + * icUcrBgCurve bg; * Bg curve + * icInt8Number string; * UcrBg description + */ +} icUcrBg; + +/* viewingConditionsType */ +typedef struct { + icXYZNumber illuminant; /* In candelas per sq. meter */ + icXYZNumber surround; /* In candelas per sq. meter */ + icIlluminant stdIluminant; /* See icIlluminant defines */ +} icViewingCondition; + +/* CrdInfo type */ +typedef struct { + icUInt32Number count; /* Char count includes NULL */ + icInt8Number desc[icAny]; /* Null terminated string */ +} icCrdInfo; + +/*------------------------------------------------------------------------*/ +/* + * Tag Type definitions + */ + +/* + * Many of the structures contain variable length arrays. This + * is represented by the use of the convention. + * + * type data[icAny]; + */ + +/* The base part of each tag */ +typedef struct { + icTagTypeSignature sig; /* Signature */ + icInt8Number reserved[4]; /* Reserved, set to 0 */ +} icTagBase; + +/* curveType */ +typedef struct { + icTagBase base; /* Signature, "curv" */ + icCurve curve; /* The curve data */ +} icCurveType; + +/* dataType */ +typedef struct { + icTagBase base; /* Signature, "data" */ + icData data; /* The data structure */ +} icDataType; + +/* dateTimeType */ +typedef struct { + icTagBase base; /* Signature, "dtim" */ + icDateTimeNumber date; /* The date */ +} icDateTimeType; + +/* lut16Type */ +typedef struct { + icTagBase base; /* Signature, "mft2" */ + icLut16 lut; /* Lut16 data */ +} icLut16Type; + +/* lut8Type, input & output tables are always 256 bytes in length */ +typedef struct { + icTagBase base; /* Signature, "mft1" */ + icLut8 lut; /* Lut8 data */ +} icLut8Type; + +/* Measurement Type */ +typedef struct { + icTagBase base; /* Signature, "meas" */ + icMeasurement measurement; /* Measurement data */ +} icMeasurementType; + +/* Named color type */ +/* icNamedColor2Type, replaces icNamedColorType */ +typedef struct { + icTagBase base; /* Signature, "ncl2" */ + icNamedColor2 ncolor; /* Named color data */ +} icNamedColor2Type; + +/* Profile sequence description type */ +typedef struct { + icTagBase base; /* Signature, "pseq" */ + icProfileSequenceDesc desc; /* The seq description */ +} icProfileSequenceDescType; + +/* textDescriptionType */ +typedef struct { + icTagBase base; /* Signature, "desc" */ + icTextDescription desc; /* The description */ +} icTextDescriptionType; + +/* s15Fixed16Type */ +typedef struct { + icTagBase base; /* Signature, "sf32" */ + icS15Fixed16Array data; /* Array of values */ +} icS15Fixed16ArrayType; + +typedef struct { + icTagBase base; /* Signature, "scrn" */ + icScreening screen; /* Screening structure */ +} icScreeningType; + +/* sigType */ +typedef struct { + icTagBase base; /* Signature, "sig" */ + icSignature signature; /* The signature data */ +} icSignatureType; + +/* textType */ +typedef struct { + icTagBase base; /* Signature, "text" */ + icText data; /* Variable array of chars */ +} icTextType; + +/* u16Fixed16Type */ +typedef struct { + icTagBase base; /* Signature, "uf32" */ + icU16Fixed16Array data; /* Variable array of values */ +} icU16Fixed16ArrayType; + +/* Under color removal, black generation type */ +typedef struct { + icTagBase base; /* Signature, "bfd " */ + icUcrBg data; /* ucrBg structure */ +} icUcrBgType; + +/* uInt16Type */ +typedef struct { + icTagBase base; /* Signature, "ui16" */ + icUInt16Array data; /* Variable array of values */ +} icUInt16ArrayType; + +/* uInt32Type */ +typedef struct { + icTagBase base; /* Signature, "ui32" */ + icUInt32Array data; /* Variable array of values */ +} icUInt32ArrayType; + +/* uInt64Type */ +typedef struct { + icTagBase base; /* Signature, "ui64" */ + icUInt64Array data; /* Variable array of values */ +} icUInt64ArrayType; + +/* uInt8Type */ +typedef struct { + icTagBase base; /* Signature, "ui08" */ + icUInt8Array data; /* Variable array of values */ +} icUInt8ArrayType; + +/* viewingConditionsType */ +typedef struct { + icTagBase base; /* Signature, "view" */ + icViewingCondition view; /* Viewing conditions */ +} icViewingConditionType; + +/* XYZ Type */ +typedef struct { + icTagBase base; /* Signature, "XYZ" */ + icXYZArray data; /* Variable array of XYZ nums */ +} icXYZType; + +/* CRDInfoType where [0] is the CRD product name count and string and + * [1] -[5] are the rendering intents 0-4 counts and strings + */ +typedef struct { + icTagBase base; /* Signature, "crdi" */ + icCrdInfo info; /* 5 sets of counts & strings */ +}icCrdInfoType; + /* icCrdInfo productName; PS product count/string */ + /* icCrdInfo CRDName0; CRD name for intent 0 */ + /* icCrdInfo CRDName1; CRD name for intent 1 */ + /* icCrdInfo CRDName2; CRD name for intent 2 */ + /* icCrdInfo CRDName3; CRD name for intent 3 */ + +/*------------------------------------------------------------------------*/ + +/* + * Lists of tags, tags, profile header and profile structure + */ + +/* A tag */ +typedef struct { + icTagSignature sig; /* The tag signature */ + icUInt32Number offset; /* Start of tag relative to + * start of header, Spec + * Clause 5 */ + icUInt32Number size; /* Size in bytes */ +} icTag; + +/* A Structure that may be used independently for a list of tags */ +typedef struct { + icUInt32Number count; /* Num tags in the profile */ + icTag tags[icAny]; /* Variable array of tags */ +} icTagList; + +/* The Profile header */ +typedef struct { + icUInt32Number size; /* Prof size in bytes */ + icSignature cmmId; /* CMM for profile */ + icUInt32Number version; /* Format version */ + icProfileClassSignature deviceClass; /* Type of profile */ + icColorSpaceSignature colorSpace; /* Clr space of data */ + icColorSpaceSignature pcs; /* PCS, XYZ or Lab */ + icDateTimeNumber date; /* Creation Date */ + icSignature magic; /* icMagicNumber */ + icPlatformSignature platform; /* Primary Platform */ + icUInt32Number flags; /* Various bits */ + icSignature manufacturer; /* Dev manufacturer */ + icUInt32Number model; /* Dev model number */ + icUInt64Number attributes; /* Device attributes */ + icUInt32Number renderingIntent;/* Rendering intent */ + icXYZNumber illuminant; /* Profile illuminant */ + icSignature creator; /* Profile creator */ + icInt8Number reserved[44]; /* Reserved */ +} icHeader; + +/* + * A profile, + * we can't use icTagList here because its not at the end of the structure + */ +typedef struct { + icHeader header; /* The header */ + icUInt32Number count; /* Num tags in the profile */ + icInt8Number data[icAny]; /* The tagTable and tagData */ +/* + * Data that follows is of the form + * + * icTag tagTable[icAny]; * The tag table + * icInt8Number tagData[icAny]; * The tag data + */ +} icProfile; + +/*------------------------------------------------------------------------*/ +/* Obsolete entries */ + +/* icNamedColor was replaced with icNamedColor2 */ +typedef struct { + icUInt32Number vendorFlag; /* Bottom 16 bits for IC use */ + icUInt32Number count; /* Count of named colors */ + icInt8Number data[icAny]; /* Named color data follows */ +/* + * Data that follows is of this form + * + * icInt8Number prefix[icAny]; * Prefix + * icInt8Number suffix[icAny]; * Suffix + * icInt8Number root1[icAny]; * Root name + * icInt8Number coords1[icAny]; * Color coordinates + * icInt8Number root2[icAny]; * Root name + * icInt8Number coords2[icAny]; * Color coordinates + * : + * : + * Repeat for root name and color coordinates up to (count-1) + */ +} icNamedColor; + +/* icNamedColorType was replaced by icNamedColor2Type */ +typedef struct { + icTagBase base; /* Signature, "ncol" */ + icNamedColor ncolor; /* Named color data */ +} icNamedColorType; + +#endif /* ICC_H */ diff -Nru ghostscript-9.04~dfsg/base/jbig2.mak ghostscript-9.05~dfsg~20120125/base/jbig2.mak --- ghostscript-9.04~dfsg/base/jbig2.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/jbig2.mak 2012-01-25 08:44:24.000000000 +0000 @@ -54,6 +54,7 @@ $(JBIG2OBJ)jbig2_segment.$(OBJ) \ $(JBIG2OBJ)jbig2_symbol_dict.$(OBJ) \ $(JBIG2OBJ)jbig2_text.$(OBJ) \ + $(JBIG2OBJ)jbig2_halftone.$(OBJ) \ $(JBIG2OBJ)jbig2_metadata.$(OBJ) $(JBIG2_EXTRA_OBJS) libjbig2_OBJS=$(libjbig2_OBJS1) $(libjbig2_OBJS2) @@ -71,6 +72,7 @@ $(JBIG2SRC)jbig2_priv.h \ $(JBIG2SRC)jbig2_symbol_dict.h \ $(JBIG2SRC)jbig2_text.h \ + $(JBIG2SRC)jbig2_halftone.h \ $(JBIG2SRC)jbig2_metadata.h \ $(JBIG2SRC)config_win32.h @@ -161,6 +163,9 @@ $(JBIG2OBJ)jbig2_text.$(OBJ) : $(JBIG2SRC)jbig2_text.c $(libjbig2_HDRS) $(JBIG2DEP) $(JBIG2_CC) $(JBIG2O_)jbig2_text.$(OBJ) $(C_) $(JBIG2SRC)jbig2_text.c +$(JBIG2OBJ)jbig2_halftone.$(OBJ) : $(JBIG2SRC)jbig2_halftone.c $(libjbig2_HDRS) $(JBIG2DEP) + $(JBIG2_CC) $(JBIG2O_)jbig2_halftone.$(OBJ) $(C_) $(JBIG2SRC)jbig2_halftone.c + $(JBIG2OBJ)jbig2_metadata.$(OBJ) : $(JBIG2SRC)jbig2_metadata.c $(libjbig2_HDRS) $(JBIG2DEP) $(JBIG2_CC) $(JBIG2O_)jbig2_metadata.$(OBJ) $(C_) $(JBIG2SRC)jbig2_metadata.c diff -Nru ghostscript-9.04~dfsg/base/lcms2.mak ghostscript-9.05~dfsg~20120125/base/lcms2.mak --- ghostscript-9.04~dfsg/base/lcms2.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/lcms2.mak 2012-01-25 08:44:24.000000000 +0000 @@ -20,7 +20,7 @@ # gs.mak and friends define the following: # LCMS2OBJDIR - the output obj directory # LCMS2GENDIR - generated (.dev) file directory -# LCMS2I_ LCMS2CF_ - include and cflags for compiling the lib +# LCMS2I_ LCMS2_CFLAGS - include and cflags for compiling the lib # We define the lcms2.dev target and its dependencies # @@ -65,7 +65,7 @@ lcms2_HDRS=\ $(LCMS2SRCDIR)$(D)include$(D)lcms2.h \ - $(LCMS2SRCDIR)$(D)include$(D)icc34.h + $(GLSRC)icc34.h lcms2.clean : lcms2.config-clean lcms2.clean-not-config-clean @@ -78,7 +78,7 @@ # NB: we can't use the normal $(CC_) here because msvccmd.mak # adds /Za which conflicts with the lcms source. -LCMS2_CC=$(CC) $(CFLAGS) $(I_)$(LCMS2SRCDIR)$(D)include $(LCMS2CF_) +LCMS2_CC=$(CC) $(CFLAGS) $(LCMS2_CFLAGS) $(I_)$(LCMS2SRCDIR)$(D)include $(LCMS2CF_) LCMS2O_=$(O_)$(LCMS2OBJ) # switch in the version of lcms2.dev we're actually using @@ -161,5 +161,5 @@ $(LCMS2OBJ)cmsvirt.$(OBJ) : $(LCMS2SRC)cmsvirt.c $(lcms2_HDRS) $(LCMS2_CC) $(LCMS2O_)cmsvirt.$(OBJ) $(C_) $(LCMS2SRC)cmsvirt.c -$(LCMS2OBJ)cmsxform.$(OBJ) : $(LCMS2SRC)cmsxform.c $(lcms2_HDRS) +$(LCMS2OBJ)cmsxform.$(OBJ) : $(LCMS2SRC)cmsxform.c $(LCMS2SRC)cmsxform.h $(lcms2_HDRS) $(LCMS2_CC) $(LCMS2O_)cmsxform.$(OBJ) $(C_) $(LCMS2SRC)cmsxform.c diff -Nru ghostscript-9.04~dfsg/base/lcms.mak ghostscript-9.05~dfsg~20120125/base/lcms.mak --- ghostscript-9.04~dfsg/base/lcms.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/lcms.mak 2012-01-25 08:44:24.000000000 +0000 @@ -20,7 +20,7 @@ # gs.mak and friends define the following: # LCSMOBJDIR - the output obj directory # LCMSGENDIR - generated (.dev) file directory -# LCMSI_ LCMSCF_ - include and cflags for compiling the lib +# LCMSI_ LCMS_CFLAGS - include and cflags for compiling the lib # We define the lcms.dev target and its dependencies # @@ -63,7 +63,7 @@ # use of LCMS_USER_ALLOC avoids the lcms allocator. lcms_HDRS=\ $(LCMSSRCDIR)$(D)include$(D)lcms.h \ - $(LCMSSRCDIR)$(D)include$(D)icc34.h + $(GLSRC)icc34.h lcms.clean : lcms.config-clean lcms.clean-not-config-clean @@ -78,7 +78,7 @@ # NB: we can't use the normal $(CC_) here because msvccmd.mak # adds /Za which conflicts with the lcms source. -LCMS_CC=$(CC) $(CFLAGS) $(I_)$(LCMSSRCDIR)$(D)include $(LCMSCF_) +LCMS_CC=$(CC) $(CFLAGS) $(LCMS_CFLAGS) $(I_)$(GLSRC) $(I_)$(LCMSSRCDIR)$(D)include $(LCMSCF_) LCMSO_=$(O_)$(LCMSOBJ) # switch in the version of lcms.dev we're actually using diff -Nru ghostscript-9.04~dfsg/base/lib.mak ghostscript-9.05~dfsg~20120125/base/lib.mak --- ghostscript-9.04~dfsg/base/lib.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/lib.mak 2012-01-25 08:44:24.000000000 +0000 @@ -35,17 +35,18 @@ GLJASCC=$(CC_) $(I_)$(JPXI_) $(II)$(GLI_)$(_I) $(JPXCF_) $(GLF_) GLLDFJB2CC=$(CC_) $(I_)$(LDF_JB2I_) $(II)$(GLI_)$(_I) $(JB2CF_) $(GLF_) GLLWFJPXCC=$(CC_) $(I_)$(LWF_JPXI_) $(II)$(GLI_)$(_I) $(JPXCF_) $(GLF_) +GLJPXOPJCC=$(CC_) $(I_)$(JPX_OPENJPEG_I_)$(D).. $(I_)$(JPX_OPENJPEG_I_) $(II)$(GLI_)$(_I) $(JPXCF_) $(GLF_) GLCCSHARED=$(CC_SHARED) $(GLCCFLAGS) # We can't use $(CC_) for GLLCMSCC becuase that includes /Za on # msvc builds, and lcms configures itself to depend on msvc extensions # (inline asm, including windows.h) when compiled under msvc. GLLCMSCC=$(CC) $(CFLAGS) $(I_)$(GLI_) $(II)$(LCMSSRCDIR)$(D)include$(_I) $(GLF_) lcms_h=$(LCMSSRCDIR)$(D)include$(D)lcms.h -icc34_h=$(LCMSSRCDIR)$(D)include$(D)icc34.h +icc34_h=$(GLSRC)icc34.h # We can't use $(CC_) for GLLCMS2CC becuase that includes /Za on # msvc builds, and lcms configures itself to depend on msvc extensions # (inline asm, including windows.h) when compiled under msvc. -GLLCMS2CC=$(CC) $(GCFLAGS) $(I_)$(GLI_) $(II)$(LCMS2SRCDIR)$(D)include$(_I) $(GLF_) +GLLCMS2CC=$(CC) $(CFLAGS) $(I_)$(GLI_) $(II)$(LCMS2SRCDIR)$(D)include$(_I) $(GLF_) lcms2_h=$(LCMS2SRCDIR)$(D)include$(D)lcms2.h lcms2_plugin_h=$(LCMS2SRCDIR)$(D)include$(D)lcms2_plugin.h @@ -66,7 +67,7 @@ stdint__h=$(GLSRC)stdint_.h $(std_h) $(GLGEN)arch.h : $(GENARCH_XE) - $(EXP)$(GENARCH_XE) $(GLGEN)arch.h + $(EXP)$(GENARCH_XE) $(GLGEN)arch.h $(TARGET_ARCH_FILE) # Platform interfaces @@ -131,7 +132,6 @@ gdebug_h=$(GLSRC)gdebug.h gsalloc_h=$(GLSRC)gsalloc.h gsargs_h=$(GLSRC)gsargs.h -gserror_h=$(GLSRC)gserror.h gserrors_h=$(GLSRC)gserrors.h gsexit_h=$(GLSRC)gsexit.h gsgc_h=$(GLSRC)gsgc.h @@ -147,7 +147,7 @@ gsserial_h=$(GLSRC)gsserial.h gsstype_h=$(GLSRC)gsstype.h gx_h=$(GLSRC)gx.h $(stdio__h) $(gdebug_h)\ - $(gserror_h) $(gsio_h) $(gsmemory_h) $(gstypes_h) + $(gsio_h) $(gsmemory_h) $(gstypes_h) gxsync_h=$(GLSRC)gxsync.h $(gpsync_h) $(gsmemory_h) gxclthrd_h=$(GLSRC)gxclthrd.h $(gxsync_h) # Out of order @@ -178,6 +178,7 @@ gxbitops_h=$(GLSRC)gxbitops.h $(gsbitops_h) gxcindex_h=$(GLSRC)gxcindex.h $(gsbitops_h) gxfont42_h=$(GLSRC)gxfont42.h +gstrans_h=$(GLSRC)gstrans.h $(gstparam_h) $(gxcomp_h) $(gsmatrix_h) $(gxblend_h) # Streams scommon_h=$(GLSRC)scommon.h $(gsmemory_h) $(gstypes_h) $(gsstype_h) @@ -192,7 +193,7 @@ $(GLOBJ)gsmalloc.$(OBJ) : $(GLSRC)gsmalloc.c $(malloc__h)\ $(gdebug_h)\ - $(gserror_h) $(gserrors_h)\ + $(gserrors_h)\ $(gsmalloc_h) $(gsmdebug_h) $(gsmemret_h)\ $(gsmemory_h) $(gsstruct_h) $(gstypes_h) $(MAKEDIRS) $(GLCC) $(GLO_)gsmalloc.$(OBJ) $(C_) $(GLSRC)gsmalloc.c @@ -235,7 +236,7 @@ $(GLCC) $(GLO_)gsbitcom.$(OBJ) $(C_) $(GLSRC)gsbitcom.c $(GLOBJ)gsbitops.$(OBJ) : $(GLSRC)gsbitops.c $(AK) $(memory__h)\ - $(stdio__h) $(gdebug_h) $(gsbittab_h) $(gserror_h) $(gserrors_h) $(gstypes_h)\ + $(stdio__h) $(gdebug_h) $(gsbittab_h) $(gserrors_h) $(gstypes_h)\ $(gxbitops_h) $(gxcindex_h) $(MAKEDIRS) $(GLCC) $(GLO_)gsbitops.$(OBJ) $(C_) $(GLSRC)gsbitops.c @@ -281,14 +282,14 @@ $(GLOBJ)gsmisc.$(OBJ) : $(GLSRC)gsmisc.c $(AK) $(gx_h) $(gserrors_h)\ $(vmsmath_h) $(std_h)\ $(ctype__h) $(malloc__h) $(math__h) $(memory__h) $(string__h)\ - $(gpcheck_h) $(gserror_h) $(gxfarith_h) $(gxfixed_h) $(stdint__h) $(stdio__h)\ + $(gpcheck_h) $(gxfarith_h) $(gxfixed_h) $(stdint__h) $(stdio__h)\ $(MAKEDIRS) $(GLCC) $(GLO_)gsmisc.$(OBJ) $(C_) $(GLSRC)gsmisc.c $(AUX)gsmisc.$(OBJ) : $(GLSRC)gsmisc.c $(AK) $(gx_h) $(gserrors_h)\ $(vmsmath_h) $(std_h)\ $(ctype__h) $(malloc__h) $(math__h) $(memory__h) $(string__h)\ - $(gpcheck_h) $(gserror_h) $(gxfarith_h) $(gxfixed_h) $(stdint__h) $(stdio__h)\ + $(gpcheck_h) $(gxfarith_h) $(gxfixed_h) $(stdint__h) $(stdio__h)\ $(MAKEDIRS) $(GLCCAUX) $(AUXO_)gsmisc.$(OBJ) $(C_) $(GLSRC)gsmisc.c @@ -309,12 +310,12 @@ $(GLCC) $(GLO_)gsserial.$(OBJ) $(C_) $(GLSRC)gsserial.c $(GLOBJ)gsutil.$(OBJ) : $(GLSRC)gsutil.c $(AK) $(memory__h)\ - $(string__h) $(gstypes_h) $(gserror_h) $(gserrors_h) $(gsmemory_h)\ + $(string__h) $(gstypes_h) $(gserrors_h) $(gsmemory_h)\ $(gsrect_h) $(gsuid_h) $(gsutil_h) $(gzstate_h) $(gxdcolor_h) $(MAKEDIRS) $(GLCC) $(GLO_)gsutil.$(OBJ) $(C_) $(GLSRC)gsutil.c $(AUX)gsutil.$(OBJ) : $(GLSRC)gsutil.c $(AK) $(memory__h) $(string__h)\ - $(gstypes_h) $(gserror_h) $(gserrors_h) $(gsmemory_h)\ + $(gstypes_h) $(gserrors_h) $(gsmemory_h)\ $(gsrect_h) $(gsuid_h) $(gsutil_h) $(gzstate_h) $(gxdcolor_h) $(MAKEDIRS) $(GLCCAUX) $(AUXO_)gsutil.$(OBJ) $(C_) $(GLSRC)gsutil.c @@ -323,7 +324,7 @@ # We have to use a slightly different compilation approach in order to # get std.h included when compiling md5.c. md5_=$(GLOBJ)md5.$(OBJ) -$(GLOBJ)md5.$(OBJ) : $(GLSRC)md5.c $(AK) $(md5_h) $(std_h) $(MAKEDIRS) +$(GLOBJ)md5.$(OBJ) : $(GLSRC)md5.c $(AK) $(md5_h) $(std_h) $(MAKEDIRS) $(EXP)$(ECHOGS_XE) $(EXP)$(ECHOGS_XE) -w $(GLGEN)md5.h -x 23 include -x 2022 memory_.h -x 22 $(EXP)$(ECHOGS_XE) -a $(GLGEN)md5.h -+R $(GLSRC)md5.h $(CP_) $(GLSRC)md5.c $(GLGEN)md5.c @@ -375,7 +376,6 @@ gshsb_h=$(GLSRC)gshsb.h gsht_h=$(GLSRC)gsht.h gsht1_h=$(GLSRC)gsht1.h $(gsht_h) -gswts_h=$(GLSRC)gswts.h gsjconf_h=$(GLSRC)gsjconf.h $(arch_h) $(stdpre_h) gslib_h=$(GLSRC)gslib.h gslparam_h=$(GLSRC)gslparam.h @@ -445,11 +445,10 @@ gxcdevn_h=$(GLSRC)gxcdevn.h $(gsrefct_h) $(gxcindex_h) gxchar_h=$(GLSRC)gxchar.h $(gschar_h) $(gxtext_h) gxchrout_h=$(GLSRC)gxchrout.h -gxwts_h=$(GLSRC)gxwts.h gsdcolor_h=$(GLSRC)gsdcolor.h $(gsccolor_h)\ - $(gxarith_h) $(gxbitmap_h) $(gxcindex_h) $(gxhttile_h) $(gxwts_h) + $(gxarith_h) $(gxbitmap_h) $(gxcindex_h) $(gxhttile_h) gxdcolor_h=$(GLSRC)gxdcolor.h\ - $(gscsel_h) $(gsdcolor_h) $(gsropt_h) $(gsstruct_h) + $(gscsel_h) $(gsdcolor_h) $(gsropt_h) $(gsstruct_h) $(stdint__h) gsnamecl_h=$(GLSRC)gsnamecl.h $(gsccolor_h) $(gscsel_h) $(gxcspace_h)\ $(gxfrac_h) gsncdummy_h=$(GLSRC)gsncdummy.h @@ -492,7 +491,8 @@ gscsepr_h=$(GLSRC)gscsepr.h $(gscspace_h) gxdcconv_h=$(GLSRC)gxdcconv.h $(gxfrac_h) gxfmap_h=$(GLSRC)gxfmap.h $(gsrefct_h) $(gsstype_h) $(gxfrac_h) $(gxtmap_h) -gxcmap_h=$(GLSRC)gxcmap.h $(gscsel_h) $(gxcindex_h) $(gxcvalue_h) $(gxfmap_h) +gxcmap_h=$(GLSRC)gxcmap.h $(gscsel_h) $(gxcindex_h) $(gxcvalue_h) $(gxfmap_h)\ + $(gscspace_h) gxistate_h=$(GLSRC)gxistate.h\ $(gscsel_h) $(gsrefct_h) $(gsropt_h) $(gstparam_h) $(gxcvalue_h) $(gxcmap_h)\ $(gxfixed_h) $(gxline_h) $(gxmatrix_h) $(gxtmap_h) $(gscspace_h) $(gstrans_h)\ @@ -550,6 +550,7 @@ sjbig2_luratech_h=$(GLSRC)sjbig2_luratech.h $(scommon_h) sjpx_h=$(GLSRC)sjpx.h $(scommon_h) sjpx_luratech_h=$(GLSRC)sjpx_luratech.h $(scommon_h) +sjpx_openjpeg_h=$(GLSRC)sjpx_openjpeg.h $(scommon_h) spdiffx_h=$(GLSRC)spdiffx.h spngpx_h=$(GLSRC)spngpx.h spprint_h=$(GLSRC)spprint.h @@ -716,16 +717,6 @@ $(gxdevice_h) $(gxdht_h) $(gxht_thresh_h) $(gzht_h) $(gxdevsop_h) $(MAKEDIRS) $(GLCC) $(GLO_)gxht_thresh.$(OBJ) $(C_) $(GLSRC)gxht_thresh.c -$(GLOBJ)gxwts.$(OBJ) : $(GLSRC)gxwts.c $(AK) $(gx_h) $(gserrors_h)\ - $(gxwts_h) $(stdpre_h) $(memory__h) $(gxstate_h) $(gsht_h) $(math__h)\ - $(gxdevcli_h) $(gxdht_h) $(gxdcolor_h) $(malloc__h) $(MAKEDIRS) - $(GLCC) $(GLO_)gxwts.$(OBJ) $(C_) $(GLSRC)gxwts.c - -$(GLOBJ)gswts.$(OBJ) : $(GLSRC)gswts.c $(AK) $(gserrors_h) $(gxwts_h)\ - $(gswts_h) $(fcntl__h) $(gp_h) $(string__h)\ - $(stdpre_h) $(gx_h) $(gxstate_h) $(gsht_h) $(math__h) $(gxfrac_h) $(MAKEDIRS) - $(GLCC) $(GLO_)gswts.$(OBJ) $(C_) $(GLSRC)gswts.c - $(GLOBJ)gxidata.$(OBJ) : $(GLSRC)gxidata.c $(AK) $(gx_h) $(gserrors_h)\ $(memory__h) $(gxcpath_h) $(gxdevice_h) $(gximage_h) $(gsicc_cache_h)\ $(MAKEDIRS) @@ -843,7 +834,7 @@ $(GLCC) $(GLO_)gscedata.$(OBJ) $(C_) $(GLSRC)gscedata.c $(GLOBJ)gscencs.$(OBJ) : $(GLSRC)gscencs.c\ - $(memory__h) $(gscedata_h) $(gscencs_h) $(gserror_h) $(gserrors_h) $(MAKEDIRS) + $(memory__h) $(gscedata_h) $(gscencs_h) $(gserrors_h) $(MAKEDIRS) $(GLCC) $(GLO_)gscencs.$(OBJ) $(C_) $(GLSRC)gscencs.c $(GLOBJ)gschar.$(OBJ) : $(GLSRC)gschar.c $(AK) $(gx_h) $(gserrors_h)\ @@ -914,7 +905,7 @@ $(GLCC) $(GLO_)gsdparam.$(OBJ) $(C_) $(GLSRC)gsdparam.c $(GLOBJ)gsfname.$(OBJ) : $(GLSRC)gsfname.c $(AK) $(memory__h)\ - $(gserror_h) $(gserrors_h) $(gsfname_h) $(gsmemory_h) $(gstypes_h)\ + $(gserrors_h) $(gsfname_h) $(gsmemory_h) $(gstypes_h)\ $(gxiodev_h) $(MAKEDIRS) $(GLCC) $(GLO_)gsfname.$(OBJ) $(C_) $(GLSRC)gsfname.c @@ -935,12 +926,12 @@ $(GLOBJ)gsht.$(OBJ) : $(GLSRC)gsht.c $(AK) $(gx_h) $(gserrors_h)\ $(memory__h) $(string__h) $(gsstruct_h) $(gsutil_h) $(gxarith_h)\ - $(gxdevice_h) $(gzht_h) $(gzstate_h) $(gswts_h) $(gxfmap_h) $(MAKEDIRS) + $(gxdevice_h) $(gzht_h) $(gzstate_h) $(gxfmap_h) $(MAKEDIRS) $(GLCC) $(GLO_)gsht.$(OBJ) $(C_) $(GLSRC)gsht.c $(GLOBJ)gshtscr.$(OBJ) : $(GLSRC)gshtscr.c $(AK) $(gx_h) $(gserrors_h)\ $(math__h) $(gsstruct_h) $(gxarith_h) $(gxdevice_h) $(gzht_h) $(gzstate_h)\ - $(gswts_h) $(MAKEDIRS) + $(MAKEDIRS) $(GLCC) $(GLO_)gshtscr.$(OBJ) $(C_) $(GLSRC)gshtscr.c $(GLOBJ)gsimage.$(OBJ) : $(GLSRC)gsimage.c $(AK) $(gx_h) $(gserrors_h)\ @@ -993,7 +984,7 @@ # gsparamx is not included in the base configuration. $(GLOBJ)gsparamx.$(OBJ) : $(AK) $(GLSRC)gsparamx.c $(string__h)\ - $(gserror_h) $(gserrors_h) $(gsmemory_h) $(gsparam_h) $(gsparamx_h)\ + $(gserrors_h) $(gsmemory_h) $(gsparam_h) $(gsparamx_h)\ $(gstypes_h) $(MAKEDIRS) $(GLCC) $(GLO_)gsparamx.$(OBJ) $(C_) $(GLSRC)gsparamx.c @@ -1021,7 +1012,7 @@ $(GLCC) $(GLO_)gsstate.$(OBJ) $(C_) $(GLSRC)gsstate.c $(GLOBJ)gstext.$(OBJ) : $(GLSRC)gstext.c $(AK) $(memory__h) $(gdebug_h)\ - $(gserror_h) $(gserrors_h) $(gsmemory_h) $(gsstruct_h) $(gstypes_h)\ + $(gserrors_h) $(gsmemory_h) $(gsstruct_h) $(gstypes_h)\ $(gxfcache_h) $(gxdevcli_h) $(gxdcolor_h) $(gxfont_h) $(gxpath_h)\ $(gxtext_h) $(gzstate_h) $(gsutil_h) $(MAKEDIRS) $(GLCC) $(GLO_)gstext.$(OBJ) $(C_) $(GLSRC)gstext.c @@ -1049,7 +1040,8 @@ $(GLCC) $(GLO_)gdevmem.$(OBJ) $(C_) $(GLSRC)gdevmem.c $(GLOBJ)gdevm1.$(OBJ) : $(GLSRC)gdevm1.c $(AK) $(gx_h) $(memory__h)\ - $(gsrop_h) $(gxdevice_h) $(gxdevmem_h) $(gdevmem_h) $(MAKEDIRS) + $(gsrop_h) $(gxdevice_h) $(gxdevmem_h) $(gdevmem_h) $(MAKEDIRS)\ + $(gserrors_h) $(GLCC) $(GLO_)gdevm1.$(OBJ) $(C_) $(GLSRC)gdevm1.c $(GLOBJ)gdevm2.$(OBJ) : $(GLSRC)gdevm2.c $(AK) $(gx_h) $(memory__h)\ @@ -1126,10 +1118,19 @@ $(GLCC) $(GLO_)gdevbbox.$(OBJ) $(C_) $(GLSRC)gdevbbox.c $(GLOBJ)gdevhit.$(OBJ) : $(GLSRC)gdevhit.c $(AK) $(std_h)\ - $(gserror_h) $(gserrors_h) $(gsmemory_h) $(gstypes_h) $(gxdevice_h)\ + $(gserrors_h) $(gsmemory_h) $(gstypes_h) $(gxdevice_h)\ $(MAKEDIRS) $(GLCC) $(GLO_)gdevhit.$(OBJ) $(C_) $(GLSRC)gdevhit.c +# ink coverage device -- a device that records the ink coverage +# on each page, and discards the page. +$(GLD)inkcov.dev : $(ECHOGS_XE) $(LIB_MAK) $(GLOBJ)gdevicov.$(OBJ) + $(SETDEV2) $(GLD)inkcov $(GLOBJ)gdevicov.$(OBJ) + +$(GLOBJ)gdevicov.$(OBJ) : $(GLSRC)gdevicov.c $(AK) $(MAKEDIRS) \ + $(arch_h) $(gdevprn_h) $(stdio__h) $(stdint__h) + $(GLCC) $(GLO_)gdevicov.$(OBJ) $(C_) $(GLSRC)gdevicov.c + # A device that stores its data using run-length encoding. $(GLOBJ)gdevmrun.$(OBJ) : $(GLSRC)gdevmrun.c $(AK) $(gx_h)\ @@ -1160,7 +1161,7 @@ ### Default driver procedure implementations $(GLOBJ)gdevdbit.$(OBJ) : $(GLSRC)gdevdbit.c $(AK) $(gx_h)\ - $(gserrors_h) $(gserror_h) $(gpcheck_h)\ + $(gserrors_h) $(gpcheck_h)\ $(gdevmem_h) $(gsbittab_h) $(gsrect_h) $(gsropt_h)\ $(gxcpath_h) $(gxdcolor_h) $(gxdevice_h) $(gxdevmem_h) $(MAKEDIRS) $(GLCC) $(GLO_)gdevdbit.$(OBJ) $(C_) $(GLSRC)gdevdbit.c @@ -1204,7 +1205,7 @@ downscale_=$(GLOBJ)gxdownscale.$(OBJ) $(GLOBJ)gxdownscale.$(OBJ) : $(GLSRC)gxdownscale.c $(AK) \ - $(gxdownscale_h) $(gserrors_h) $(gserror_h) $(gdevprn_h) $(MAKEDIRS) + $(gxdownscale_h) $(gserrors_h) $(gdevprn_h) $(MAKEDIRS) $(GLCC) $(GLO_)gxdownscale.$(OBJ) $(C_) $(GLSRC)gxdownscale.c ###### Create a pseudo-"feature" for the entire graphics library. @@ -1218,7 +1219,7 @@ LIB4s=$(GLOBJ)gscoord.$(OBJ) $(GLOBJ)gscparam.$(OBJ) $(GLOBJ)gscspace.$(OBJ) $(GLOBJ)gscicach.$(OBJ) $(GLOBJ)gsovrc.$(OBJ) $(GLOBJ)gxoprect.$(OBJ) LIB5s=$(GLOBJ)gsdevice.$(OBJ) $(GLOBJ)gsdevmem.$(OBJ) $(GLOBJ)gsdparam.$(OBJ) $(GLOBJ)gsdfilt.$(OBJ) LIB6s=$(GLOBJ)gsfname.$(OBJ) $(GLOBJ)gsfont.$(OBJ) $(GLOBJ)gsgdata.$(OBJ) $(GLOBJ)gsgcache.$(OBJ) -LIB7s=$(GLOBJ)gsht.$(OBJ) $(GLOBJ)gshtscr.$(OBJ) $(GLOBJ)gswts.$(OBJ) +LIB7s=$(GLOBJ)gsht.$(OBJ) $(GLOBJ)gshtscr.$(OBJ) LIB8s=$(GLOBJ)gsimage.$(OBJ) $(GLOBJ)gsimpath.$(OBJ) $(GLOBJ)gsinit.$(OBJ) LIB9s=$(GLOBJ)gsiodev.$(OBJ) $(GLOBJ)gsistate.$(OBJ) $(GLOBJ)gsline.$(OBJ) LIB10s=$(GLOBJ)gsmalloc.$(OBJ) $(GLOBJ)memento.$(OBJ) $(GLOBJ)gsmatrix.$(OBJ) @@ -1232,7 +1233,7 @@ LIB4x=$(GLOBJ)gxdcconv.$(OBJ) $(GLOBJ)gxdcolor.$(OBJ) $(GLOBJ)gxhldevc.$(OBJ) LIB5x=$(GLOBJ)gxfill.$(OBJ) $(GLOBJ)gxfdrop.$(OBJ) $(GLOBJ)gxht.$(OBJ) $(GLOBJ)gxhtbit.$(OBJ)\ $(GLOBJ)gxht_thresh.$(OBJ) -LIB6x=$(GLOBJ)gxwts.$(OBJ) $(GLOBJ)gxidata.$(OBJ) $(GLOBJ)gxifast.$(OBJ) $(GLOBJ)gximage.$(OBJ) +LIB6x=$(GLOBJ)gxidata.$(OBJ) $(GLOBJ)gxifast.$(OBJ) $(GLOBJ)gximage.$(OBJ) LIB7x=$(GLOBJ)gximage1.$(OBJ) $(GLOBJ)gximono.$(OBJ) $(GLOBJ)gxipixel.$(OBJ) $(GLOBJ)gximask.$(OBJ) LIB8x=$(GLOBJ)gxi12bit.$(OBJ) $(GLOBJ)gxi16bit.$(OBJ) $(GLOBJ)gxiscale.$(OBJ) $(GLOBJ)gxpaint.$(OBJ) $(GLOBJ)gxpath.$(OBJ) $(GLOBJ)gxpath2.$(OBJ) LIB9x=$(GLOBJ)gxpcopy.$(OBJ) $(GLOBJ)gxpdash.$(OBJ) $(GLOBJ)gxpflat.$(OBJ) @@ -1333,13 +1334,13 @@ $(SETMOD) $(GLD)sfile $(sfile_) $(GLOBJ)sfxcommon.$(OBJ) : $(GLSRC)sfxcommon.c $(AK) $(stdio__h)\ - $(memory__h) $(unistd__h) $(gsmemory_h) $(gp_h) $(stream_h) $(gserror_h)\ + $(memory__h) $(unistd__h) $(gsmemory_h) $(gp_h) $(stream_h)\ $(gserrors_h) $(MAKEDIRS) $(GLCC) $(GLO_)sfxcommon.$(OBJ) $(C_) $(GLSRC)sfxcommon.c $(GLOBJ)sfxstdio.$(OBJ) : $(GLSRC)sfxstdio.c $(AK) $(stdio__h)\ $(memory__h) $(unistd__h) $(gdebug_h) $(gpcheck_h) $(stream_h) $(strimpl_h)\ - $(gp_h) $(gserror_h) $(gserrors_h) $(gsmemory_h) $(MAKEDIRS) + $(gp_h) $(gserrors_h) $(gsmemory_h) $(MAKEDIRS) $(GLCC) $(GLO_)sfxstdio.$(OBJ) $(C_) $(GLSRC)sfxstdio.c $(GLOBJ)sfxfd.$(OBJ) : $(GLSRC)sfxfd.c $(AK)\ @@ -1399,7 +1400,7 @@ # scfparam is used by the filter operator and the PS/PDF writer. # It is not included automatically in cfe or cfd. $(GLOBJ)scfparam.$(OBJ) : $(GLSRC)scfparam.c $(AK) $(std_h)\ - $(gserror_h) $(gserrors_h) $(gsmemory_h) $(gsparam_h) $(gstypes_h)\ + $(gserrors_h) $(gsmemory_h) $(gsparam_h) $(gstypes_h)\ $(scommon_h) $(scf_h) $(scfx_h) $(MAKEDIRS) $(GLCC) $(GLO_)scfparam.$(OBJ) $(C_) $(GLSRC)scfparam.c @@ -1433,7 +1434,7 @@ # It is not included automatically in sdcte/d. $(GLOBJ)sdcparam.$(OBJ) : $(GLSRC)sdcparam.c $(AK) $(memory__h)\ $(jpeglib__h)\ - $(gserror_h) $(gserrors_h) $(gsmemory_h) $(gsparam_h) $(gstypes_h)\ + $(gserrors_h) $(gsmemory_h) $(gsparam_h) $(gstypes_h)\ $(sdcparam_h) $(sdct_h) $(sjpeg_h) $(strimpl_h) $(MAKEDIRS) $(GLCC) $(GLO_)sdcparam.$(OBJ) $(C_) $(GLSRC)sdcparam.c @@ -1481,7 +1482,7 @@ $(GLOBJ)sdeparam.$(OBJ) : $(GLSRC)sdeparam.c $(AK) $(memory__h)\ $(jpeglib__h)\ - $(gserror_h) $(gserrors_h) $(gsmemory_h) $(gsparam_h) $(gstypes_h)\ + $(gserrors_h) $(gsmemory_h) $(gsparam_h) $(gstypes_h)\ $(sdcparam_h) $(sdct_h) $(sjpeg_h) $(strimpl_h) $(MAKEDIRS) $(GLCC) $(GLO_)sdeparam.$(OBJ) $(C_) $(GLSRC)sdeparam.c @@ -1508,7 +1509,7 @@ $(GLOBJ)sjpegd_1.$(OBJ) : $(GLSRC)sjpegd.c $(AK)\ $(stdio__h) $(string__h) $(gx_h)\ - $(jpeglib__h)\ + $(jpeglib__h) $(gserrors_h)\ $(sjpeg_h) $(sdct_h) $(strimpl_h) $(MAKEDIRS) $(GLJCC) $(GLO_)sjpegd_1.$(OBJ) $(C_) $(GLSRC)sjpegd.c @@ -1530,7 +1531,7 @@ $(GLOBJ)sddparam.$(OBJ) : $(GLSRC)sddparam.c $(AK) $(std_h)\ $(jpeglib__h)\ - $(gserror_h) $(gserrors_h) $(gsmemory_h) $(gsparam_h) $(gstypes_h)\ + $(gserrors_h) $(gsmemory_h) $(gsparam_h) $(gstypes_h)\ $(sdcparam_h) $(sdct_h) $(sjpeg_h) $(strimpl_h) $(MAKEDIRS) $(GLCC) $(GLO_)sddparam.$(OBJ) $(C_) $(GLSRC)sddparam.c @@ -1593,7 +1594,7 @@ $(SETMOD) $(GLD)sarc4 $(sarc4_) $(GLOBJ)sarc4.$(OBJ) : $(GLSRC)sarc4.c $(AK) $(memory__h)\ - $(gserror_h) $(gserrors_h) $(sarc4_h) $(strimpl_h) $(MAKEDIRS) + $(gserrors_h) $(sarc4_h) $(strimpl_h) $(MAKEDIRS) $(GLCC) $(GLO_)sarc4.$(OBJ) $(C_) $(GLSRC)sarc4.c # -------------- AES cipher filter --------------- # @@ -1603,7 +1604,7 @@ $(SETMOD) $(GLD)saes $(saes_) $(aes_) $(GLOBJ)saes.$(OBJ) : $(GLSRC)saes.c $(AK) $(memory__h)\ - $(gserror_h) $(gserrors_h) $(strimpl_h) $(saes_h) $(MAKEDIRS) + $(gserrors_h) $(strimpl_h) $(saes_h) $(MAKEDIRS) $(GLCC) $(GLO_)saes.$(OBJ) $(C_) $(GLSRC)saes.c # ---------------- JBIG2 compression filter ---------------- # @@ -1622,7 +1623,7 @@ # jbig2dec.dev is defined in jbig2.mak $(GLOBJ)sjbig2.$(OBJ) : $(GLSRC)sjbig2.c $(AK) \ - $(stdint__h) $(memory__h) $(stdio__h) $(gserror_h) $(gserrors_h) $(gdebug_h) \ + $(stdint__h) $(memory__h) $(stdio__h) $(gserrors_h) $(gdebug_h) \ $(sjbig2_h) $(strimpl_h) $(MAKEDIRS) $(GLJBIG2CC) $(GLO_)sjbig2.$(OBJ) $(C_) $(GLSRC)sjbig2.c @@ -1637,7 +1638,7 @@ # ldf_jb2.dev is defined in jbig2_luratech.mak $(GLOBJ)sjbig2_luratech.$(OBJ) : $(GLSRC)sjbig2_luratech.c $(AK) \ - $(memory__h) $(malloc__h) $(gserrors_h) $(gserror_h) $(gdebug_h) \ + $(memory__h) $(malloc__h) $(gserrors_h) $(gdebug_h) \ $(strimpl_h) $(sjbig2_luratech_h) $(MAKEDIRS) $(GLLDFJB2CC) $(GLO_)sjbig2_luratech.$(OBJ) \ $(C_) $(GLSRC)sjbig2_luratech.c @@ -1657,7 +1658,7 @@ # jasper.dev is created in jasper.mak $(GLOBJ)sjpx.$(OBJ) : $(GLSRC)sjpx.c $(AK) \ - $(memory__h) $(gsmalloc_h) $(gserror_h) \ + $(memory__h) $(gsmalloc_h) \ $(gdebug_h) $(strimpl_h) $(sjpx_h) $(MAKEDIRS) $(GLJASCC) $(GLO_)sjpx.$(OBJ) $(C_) $(GLSRC)sjpx.c @@ -1672,11 +1673,23 @@ $(SETMOD) $(GLD)luratech_jp2 $(GLD)liblwf_jp2.a $(GLOBJ)sjpx_luratech.$(OBJ) : $(GLSRC)sjpx_luratech.c $(AK) \ - $(memory__h) $(malloc__h) $(gserror_h) $(gserrors_h) \ + $(memory__h) $(malloc__h) $(gserrors_h) \ $(gdebug_h) $(strimpl_h) $(sjpx_luratech_h) $(MAKEDIRS) $(GLLWFJPXCC) $(GLO_)sjpx_luratech.$(OBJ) \ $(C_) $(GLSRC)sjpx_luratech.c +# openjpeg version +sjpx_openjpeg=$(GLOBJ)sjpx_openjpeg.$(OBJ) +$(GLD)sjpx_openjpeg.dev : $(LIB_MAK) $(ECHOGS_XE) \ + $(GLD)openjpeg.dev $(sjpx_openjpeg) + $(SETMOD) $(GLD)sjpx_openjpeg $(sjpx_openjpeg) + $(ADDMOD) $(GLD)sjpx_openjpeg -include $(GLD)openjpeg.dev + +$(GLOBJ)sjpx_openjpeg.$(OBJ) : $(GLSRC)sjpx_openjpeg.c $(AK) \ + $(memory__h) $(malloc__h) $(gserror_h) $(gserrors_h) \ + $(gdebug_h) $(strimpl_h) $(sjpx_openjpeg_h) $(MAKEDIRS) + $(GLJPXOPJCC) $(GLO_)sjpx_openjpeg.$(OBJ) \ + $(C_) -DOPJ_STATIC $(GLSRC)sjpx_openjpeg.c # ---------------- Pixel-difference filters ---------------- # # The Predictor facility of the LZW and Flate filters uses these. @@ -1747,7 +1760,7 @@ $(GLCC) $(GLO_)spprint.$(OBJ) $(C_) $(GLSRC)spprint.c $(GLOBJ)spsdf.$(OBJ) : $(GLSRC)spsdf.c $(AK) $(stdio__h) $(string__h)\ - $(gserror_h) $(gserrors_h) $(gsmemory_h) $(gstypes_h)\ + $(gserrors_h) $(gsmemory_h) $(gstypes_h)\ $(sa85x_h) $(scanchar_h) $(spprint_h) $(spsdf_h)\ $(sstring_h) $(stream_h) $(strimpl_h) $(MAKEDIRS) $(GLCC) $(GLO_)spsdf.$(OBJ) $(C_) $(GLSRC)spsdf.c @@ -1759,13 +1772,13 @@ zconf_h=$(ZSRCDIR)$(D)zconf.h $(GLOBJ)szlibc_1.$(OBJ) : $(GLSRC)szlibc.c $(AK) $(std_h)\ - $(gserror_h) $(gserrors_h) $(gsmemory_h) \ + $(gserrors_h) $(gsmemory_h) \ $(gsstruct_h) $(gstypes_h)\ $(strimpl_h) $(szlibxx_h) $(MAKEDIRS) $(GLZCC) $(GLO_)szlibc_1.$(OBJ) $(C_) $(GLSRC)szlibc.c $(GLOBJ)szlibc_0.$(OBJ) : $(GLSRC)szlibc.c $(AK) $(std_h)\ - $(gserror_h) $(gserrors_h) $(gsmemory_h) $(zconf_h)\ + $(gserrors_h) $(gsmemory_h) $(zconf_h)\ $(gsstruct_h) $(gstypes_h) $(zlib_h)\ $(strimpl_h) $(szlibxx_h) $(MAKEDIRS) $(GLZCC) $(GLO_)szlibc_0.$(OBJ) $(C_) $(GLSRC)szlibc.c @@ -1961,7 +1974,7 @@ $(GLOBJ)gxdhtserial.$(OBJ) : $(GLSRC)gxdhtserial.c $(memory__h) $(AK)\ $(gx_h) $(gserrors_h)\ $(gscdefs_h) $(gsstruct_h) $(gsutil_h) $(gzstate_h) $(gxdevice_h) $(gzht_h)\ - $(gswts_h) $(gxdhtres_h) $(gsserial_h) $(gxdhtserial_h) $(MAKEDIRS) + $(gxdhtres_h) $(gsserial_h) $(gxdhtserial_h) $(MAKEDIRS) $(GLCC) $(GLO_)gxdhtserial.$(OBJ) $(C_) $(GLSRC)gxdhtserial.c $(GLOBJ)gxclutil.$(OBJ) : $(GLSRC)gxclutil.c $(AK) $(gx_h)\ @@ -1977,7 +1990,7 @@ $(ADDMOD) $(GLD)clfile -init gxclfile $(GLOBJ)gxclfile.$(OBJ) : $(GLSRC)gxclfile.c $(stdio__h) $(string__h)\ - $(gp_h) $(gsmemory_h) $(gserror_h) $(gserrors_h) $(gxclio_h) $(unistd__h) + $(gp_h) $(gsmemory_h) $(gserrors_h) $(gxclio_h) $(unistd__h) $(GLCC) $(GLO_)gxclfile.$(OBJ) $(C_) $(GLSRC)gxclfile.c # Implement band lists in memory (RAM). @@ -2066,7 +2079,7 @@ $(SETMOD) $(GLD)simscale $(simscale_) $(GLOBJ)simscale.$(OBJ) : $(GLSRC)simscale.c $(AK) $(memory__h)\ - $(gserror_h) $(gserrors_h) $(simscale_h) $(strimpl_h) $(sisparam_h)\ + $(gserrors_h) $(simscale_h) $(strimpl_h) $(sisparam_h)\ $(MAKEDIRS) $(GLCC) $(GLO_)simscale.$(OBJ) $(C_) $(GLSRC)simscale.c @@ -2342,7 +2355,7 @@ $(gserrors_h) $(string__h) $(math__h) $(gsrop_h) $(gsmatrix_h)\ $(gxcolor2_h) $(gxclip2_h) $(gxcspace_h) $(gxdcolor_h) $(gxdevcli_h)\ $(gxdevmem_h) $(gxpcolor_h) $(gxp1impl_h) $(gxcldev_h) $(gxblend_h)\ - $(gsicc_cache_h) $(MAKEDIRS) + $(gsicc_cache_h) $(gxdevsop_h) $(MAKEDIRS) $(GLCC) $(GLO_)gxp1fill.$(OBJ) $(C_) $(GLSRC)gxp1fill.c $(GLOBJ)gxpcmap.$(OBJ) : $(GLSRC)gxpcmap.c $(AK) $(gx_h) $(gserrors_h)\ @@ -2350,7 +2363,7 @@ $(gsstruct_h) $(gsutil_h)\ $(gxcolor2_h) $(gxcspace_h) $(gxdcolor_h) $(gxdevice_h) $(gxdevmem_h)\ $(gxfixed_h) $(gxmatrix_h) $(gxpcolor_h) $(gxclist_h) $(gxcldev_h)\ - $(gzstate_h) $(MAKEDIRS) + $(gzstate_h) $(gdevp14_h) $(MAKEDIRS) $(GLCC) $(GLO_)gxpcmap.$(OBJ) $(C_) $(GLSRC)gxpcmap.c # ---------------- PostScript Type 1 (and Type 4) fonts ---------------- # @@ -2510,7 +2523,7 @@ $(GLOBJ)gsht1.$(OBJ) : $(GLSRC)gsht1.c $(AK) $(gx_h) $(gserrors_h)\ $(memory__h) $(string__h) $(gsstruct_h) $(gsutil_h) $(gxdevice_h) $(gzht_h)\ - $(gzstate_h) $(gxwts_h) $(gswts_h) $(MAKEDIRS) + $(gzstate_h) $(MAKEDIRS) $(GLCC) $(GLO_)gsht1.$(OBJ) $(C_) $(GLSRC)gsht1.c colimlib_=$(GLOBJ)gxicolor.$(OBJ) @@ -2686,7 +2699,7 @@ gsicc_=$(GLOBJ)gsicc_manage.$(OBJ) $(GLOBJ)gsicc_cache.$(OBJ)\ $(GLOBJ)gsicc_$(WHICH_CMS).$(OBJ) $(GLOBJ)gsicc_profilecache.$(OBJ)\ - $(GLOBJ)gsicc_create.$(OBJ) + $(GLOBJ)gsicc_create.$(OBJ) $(GLOBJ)gsicc_nocm.$(OBJ) sicclib_=$(GLOBJ)gsicc.$(OBJ) $(GLD)sicclib.dev : $(LIB_MAK) $(ECHOGS_XE) $(sicclib_) $(gsicc_)\ @@ -2708,6 +2721,12 @@ gsicc_cache_h=$(GLSRC)gsicc_cache.h gsicc_profilecache_h=$(GLSRC)gsicc_profilecache.h +$(GLOBJ)gsicc_nocm.$(OBJ) : $(GLSRC)gsicc_nocm.c $(AK) $(gx_h)\ + $(stdpre_h) $(gstypes_h) $(gsmemory_h) $(gsstruct_h) $(scommon_h) $(strmio_h)\ + $(string__h) $(gxistate_h) $(gxcspace_h) $(gsicc_cms_h)\ + $(gsicc_cache_h) $(MAKEDIRS) + $(GLCC) $(GLO_)gsicc_nocm.$(OBJ) $(C_) $(GLSRC)gsicc_nocm.c + $(GLOBJ)gsicc_manage.$(OBJ) : $(GLSRC)gsicc_manage.c $(AK) $(gx_h)\ $(stdpre_h) $(gstypes_h) $(gsmemory_h) $(gsstruct_h) $(scommon_h) $(strmio_h)\ $(gxistate_h) $(gxcspace_h) $(gscms_h) $(gsicc_manage_h) $(gsicc_cache_h)\ @@ -2730,11 +2749,11 @@ $(GLCC) $(GLO_)gsicc_profilecache.$(OBJ) $(C_) $(GLSRC)gsicc_profilecache.c $(GLOBJ)gsicc_lcms_1.$(OBJ) : $(GLSRC)gsicc_lcms.c\ - $(gsicc_cms_h) $(gserror_h) $(gslibctx_h) + $(gsicc_cms_h) $(gslibctx_h) $(gserrors_h) $(GLLCMSCC) $(GLO_)gsicc_lcms_1.$(OBJ) $(C_) $(GLSRC)gsicc_lcms.c $(GLOBJ)gsicc_lcms_0.$(OBJ) : $(GLSRC)gsicc_lcms.c\ - $(gsicc_cms_h) $(lcms_h) $(gserror_h) $(gslibctx_h) + $(gsicc_cms_h) $(lcms_h) $(gslibctx_h) $(gserrors_h) $(GLLCMSCC) $(GLO_)gsicc_lcms_0.$(OBJ) $(C_) $(GLSRC)gsicc_lcms.c $(GLOBJ)gsicc_lcms.$(OBJ) : $(GLOBJ)gsicc_lcms_$(SHARE_LCMS).$(OBJ) @@ -2742,11 +2761,11 @@ $(GLOBJ)gsicc_lcms2_1.$(OBJ) : $(GLSRC)gsicc_lcms2.c\ - $(gsicc_cms_h) $(lcms2_h) $(gserror_h) $(gslibctx_h) $(lcms2_plugin_h) + $(gsicc_cms_h) $(gslibctx_h) $(gserrors_h) $(GLLCMS2CC) $(GLO_)gsicc_lcms2_1.$(OBJ) $(C_) $(GLSRC)gsicc_lcms2.c $(GLOBJ)gsicc_lcms2_0.$(OBJ) : $(GLSRC)gsicc_lcms2.c\ - $(gsicc_cms_h) $(lcms2_h) $(gserror_h) $(gslibctx_h) $(lcms2_plugin_h) + $(gsicc_cms_h) $(lcms2_h) $(gslibctx_h) $(lcms2_plugin_h) $(gserrors_h) $(GLLCMS2CC) $(GLO_)gsicc_lcms2_0.$(OBJ) $(C_) $(GLSRC)gsicc_lcms2.c $(GLOBJ)gsicc_lcms2.$(OBJ) : $(GLOBJ)gsicc_lcms2_$(SHARE_LCMS).$(OBJ) @@ -2862,7 +2881,7 @@ $(GLCC) $(GLO_)gscdevn.$(OBJ) $(C_) $(GLSRC)gscdevn.c $(GLOBJ)gxdevndi.$(OBJ) : $(GLSRC)gxdevndi.c $(AK) $(gx_h)\ - $(gsstruct_h) $(gsdcolor_h) $(gxfrac_h) $(gxwts_h)\ + $(gsstruct_h) $(gsdcolor_h) $(gxfrac_h)\ $(gxcmap_h) $(gxdevice_h) $(gxdither_h) $(gxlum_h) $(gzht_h) $(MAKEDIRS) $(GLCC) $(GLO_)gxdevndi.$(OBJ) $(C_) $(GLSRC)gxdevndi.c @@ -2893,7 +2912,6 @@ # ---------------- Transparency ---------------- # -gstrans_h=$(GLSRC)gstrans.h $(gstparam_h) $(gxcomp_h) $(gsmatrix_h) $(gxblend_h) gsipar3x_h=$(GLSRC)gsipar3x.h $(gsiparam_h) $(gsiparm3_h) gximag3x_h=$(GLSRC)gximag3x.h $(gsipar3x_h) $(gxiparam_h) gxblend_h=$(GLSRC)gxblend.h $(gxcindex_h) $(gxcvalue_h) $(gxfrac_h) $(gxdevcli_h) @@ -3094,7 +3112,7 @@ # The following module is included only if the macres.dev FEATURE is enabled $(GLOBJ)gsiomacres.$(OBJ) : $(GLSRC)gsiomacres.c $(gdebug_h) $(gp_h)\ - $(std_h) $(gstypes_h) $(gsmemory_h) $(gxiodev_h) $(gserror_h) $(ierrors_h)\ + $(std_h) $(gstypes_h) $(gsmemory_h) $(gxiodev_h) $(ierrors_h)\ $(malloc__h) $(stdio__h) $(stream_h) $(string__h) $(MAKEDIRS) $(GLCC) $(GLO_)gsiomacres.$(OBJ) $(C_) $(GLSRC)gsiomacres.c @@ -3190,7 +3208,7 @@ $(GLOBJ)gdevpipe.$(OBJ) : $(GLSRC)gdevpipe.c $(AK)\ $(errno__h) $(pipe__h) $(stdio__h) $(string__h) \ - $(gserror_h) $(gserrors_h) $(gsmemory_h) $(gstypes_h) $(gxiodev_h)\ + $(gserrors_h) $(gsmemory_h) $(gstypes_h) $(gxiodev_h)\ $(MAKEDIRS) $(GLCC) $(GLO_)gdevpipe.$(OBJ) $(C_) $(GLSRC)gdevpipe.c @@ -3202,7 +3220,7 @@ $(SETMOD) $(GLD)nosync $(nosync_) $(GLOBJ)gp_nsync.$(OBJ) : $(GLSRC)gp_nsync.c $(AK) $(std_h)\ - $(gpsync_h) $(gserror_h) $(gserrors_h) $(MAKEDIRS) + $(gpsync_h) $(gserrors_h) $(MAKEDIRS) $(GLCC) $(GLO_)gp_nsync.$(OBJ) $(C_) $(GLSRC)gp_nsync.c # POSIX pthreads-based implementation. @@ -3212,7 +3230,7 @@ $(ADDMOD) $(GLD)posync -replace $(GLD)nosync $(GLOBJ)gp_psync.$(OBJ) : $(GLSRC)gp_psync.c $(AK) $(malloc__h)\ - $(std_h) $(gpsync_h) $(gserror_h) $(gserrors_h) $(MAKEDIRS) + $(std_h) $(gpsync_h) $(gserrors_h) $(MAKEDIRS) $(GLCC) $(GLO_)gp_psync.$(OBJ) $(C_) $(GLSRC)gp_psync.c # Other stuff. diff -Nru ghostscript-9.04~dfsg/base/macos-mcp.mak ghostscript-9.05~dfsg~20120125/base/macos-mcp.mak --- ghostscript-9.04~dfsg/base/macos-mcp.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/macos-mcp.mak 2012-01-25 08:44:24.000000000 +0000 @@ -127,7 +127,7 @@ # Which CMS are we using? # Options are currently lcms or lcms2 -WHICH_CMS=lcms +WHICH_CMS=lcms2 # IJS has not been ported to MacOS Classic. If you do the port, # you'll need to set these values. You'll also need to @@ -140,11 +140,6 @@ #IJSSRCDIR=ijs #IJSEXECTYPE=unix -# Define the directory where the imdi library source is stored. -# See devs.mak for more information - -IMDISRCDIR=imdi - # ------ Platform-specific options ------ # # Define the name of the C compiler. @@ -240,7 +235,7 @@ DEVICE_DEVS14=$(DD)jpeg.dev $(DD)jpeggray.dev $(DD)jpegcmyk.dev DEVICE_DEVS15=$(DD)pdfwrite.dev $(DD)pswrite.dev $(DD)ps2write.dev $(DD)epswrite.dev $(DD)txtwrite.dev $(DD)pxlmono.dev $(DD)pxlcolor.dev -DEVICE_DEVS16=$(DD)bbox.dev +DEVICE_DEVS16=$(DD)bbox.dev $(DD)inkcov.dev DEVICE_DEVS17= DEVICE_DEVS18= DEVICE_DEVS19= @@ -291,6 +286,7 @@ include $(GLSRCDIR)/jasper.mak include $(GLSRCDIR)/ldf_jb2.mak include $(GLSRCDIR)/lwf_jp2.mak +include $(GLSRCDIR)/openjpeg.mak include $(GLSRCDIR)/icclib.mak include $(GLSRCDIR)/devs.mak include $(GLSRCDIR)/contrib.mak diff -Nru ghostscript-9.04~dfsg/base/macosx.mak ghostscript-9.05~dfsg~20120125/base/macosx.mak --- ghostscript-9.04~dfsg/base/macosx.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/macosx.mak 2012-01-25 08:44:24.000000000 +0000 @@ -114,6 +114,7 @@ # the standard binaries. DEBUGDIRPREFIX=debug +MEMENTODIRPREFIX=debug PGDIRPREFIX=pg SODIRPREFIX=so @@ -178,7 +179,7 @@ # Which CMS are we using? # Options are currently lcms or lcms2 -WHICH_CMS=lcms +WHICH_CMS=lcms2 # Define the directory where the ijs source is stored, # and the process forking method to use for the server. @@ -189,11 +190,6 @@ IJSSRCDIR=ijs IJSEXECTYPE=unix -# Define the directory where the imdi library source is stored. -# See devs.mak for more information - -IMDISRCDIR=imdi - # Define how to build the library archives. (These are not used in any # standard configuration.) @@ -376,7 +372,7 @@ DEVICE_DEVS13=$(DD)png16.dev $(DD)png256.dev $(DD)pngalpha.dev DEVICE_DEVS14=$(DD)jpeg.dev $(DD)jpeggray.dev $(DD)jpegcmyk.dev DEVICE_DEVS15=$(DD)pdfwrite.dev $(DD)pswrite.dev $(DD)ps2write.dev $(DD)epswrite.dev $(DD)txtwrite.dev $(DD)pxlmono.dev $(DD)pxlcolor.dev -DEVICE_DEVS16=$(DD)bbox.dev +DEVICE_DEVS16=$(DD)bbox.dev $(DD)inkcov.dev DEVICE_DEVS17= DEVICE_DEVS18= DEVICE_DEVS19= diff -Nru ghostscript-9.04~dfsg/base/Makefile.in ghostscript-9.05~dfsg~20120125/base/Makefile.in --- ghostscript-9.04~dfsg/base/Makefile.in 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/Makefile.in 2012-01-25 08:44:23.000000000 +0000 @@ -157,6 +157,7 @@ # the standard binaries. DEBUGDIRPREFIX=debug +MEMENTODIRPREFIX=mem PGDIRPREFIX=pg # Define whether to compile in the FreeType library, and if so, where @@ -247,7 +248,7 @@ # whether to link to an external build or compile in from source # and source location and configuration flags for compiling in JPX_LIB=@JPX_DECODER@ -SHARE_JPX=@SHARE_JASPER@ +SHARE_JPX=@SHARE_JPX@ JPXSRCDIR=@JPXDIR@ JPX_CFLAGS=@JPX_AUTOCONF_CFLAGS@ @@ -259,6 +260,12 @@ #JPX_CFLAGS=-DUSE_LWF_JP2 -DLINUX #JPX_CFLAGS=-DUSE_LWF_JP2 -DMAC -DMAC_OS_X_BUILD +# Uncomment the following 4 lines to to compile in OpenJPEG codec +#JPX_LIB=openjpeg +#SHARE_JPX=0 +#JPXSRCDIR=openjpeg +#JPX_CFLAGS=-DUSE_OPENJPEG_JP2 -DOPJ_STATIC + # Define the directory where the icclib source are stored. # See icclib.mak for more information @@ -268,10 +275,12 @@ SHARE_LCMS=@SHARELCMS@ LCMSSRCDIR=@LCMSDIR@ LCMS2SRCDIR=@LCMS2DIR@ +LCMS_CFLAGS=@LCMS_ENDIAN@ +LCMS2_CFLAGS=@LCMS2_ENDIAN@ # Which CMS are we using? # Options are currently lcms or lcms2 -WHICH_CMS=lcms +WHICH_CMS=@WHICHLCMS@ # Define the directory where the ijs source is stored, # and the process forking method to use for the server. @@ -295,11 +304,6 @@ CUPS_CC=$(CC) -# Define the directory where the imdi library source is stored. -# See devs.mak for more information. - -IMDISRCDIR=imdi - # Define how to build the library archives. (These are not used in any # standard configuration.) @@ -342,7 +346,8 @@ # We don't include -ansi, because this gets in the way of the platform- # specific stuff that typically needs; nevertheless, we expect # gcc to accept ANSI-style function prototypes and function definitions. -XCFLAGS=@DYNAMIC_FLAGS@ +# CFLAGS from autoconf +AC_CFLAGS=@DYNAMIC_FLAGS@ # fontconfig flags, used by unix-aux.mak FONTCONFIG_CFLAGS=@FONTCONFIG_CFLAGS@ @@ -355,7 +360,7 @@ # defines from autoconf; note that we don't use these at present. ACDEFS=@DEFS@ -CFLAGS=$(CFLAGS_STANDARD) $(GCFLAGS) $(XCFLAGS) +CFLAGS=$(CFLAGS_STANDARD) $(GCFLAGS) $(AC_CFLAGS) $(XCFLAGS) # Define platform flags for ld. # SunOS 4.n may need -Bstatic. @@ -364,9 +369,10 @@ # -R /usr/local/xxx/lib:/usr/local/lib # giving the full path names of the shared library directories. # XLDFLAGS can be set from the command line. -XLDFLAGS=@X_LDFLAGS@ +# AC_LDFLAGS from autoconf +AC_LDFLAGS=@X_LDFLAGS@ -LDFLAGS=@LDFLAGS@ $(XLDFLAGS) +LDFLAGS=@LDFLAGS@ $(AC_LDFLAGS) $(XLDFLAGS) # Define any extra libraries to link into the executable. # ISC Unix 2.2 wants -linet. @@ -375,7 +381,7 @@ # Solaris may need -lnsl -lsocket -lposix4. # (Libraries required by individual drivers are handled automatically.) -EXTRALIBS=@LIBS@ @DYNAMIC_LIBS@ @FONTCONFIG_LIBS@ +EXTRALIBS=$(XTRALIBS) @LIBS@ @DYNAMIC_LIBS@ @FONTCONFIG_LIBS@ @FT_LIBS@ # Define the standard libraries to search at the end of linking. # Most platforms require -lpthread for the POSIX threads library; @@ -560,6 +566,7 @@ CC_SHARED=$(CC_) @DYNAMIC_CFLAGS@ LD_SET_DT_SONAME=@SET_DT_SONAME@ +FOR_MAC=@SO_FOR_MAC@ # MAKEDIRS = the dependency on ALL object files (must be the last one on # the line. Requires GNU make to make it an 'order only' dependency @@ -587,6 +594,7 @@ include $(GLSRCDIR)/jasper.mak include $(GLSRCDIR)/ldf_jb2.mak include $(GLSRCDIR)/lwf_jp2.mak +include $(GLSRCDIR)/openjpeg.mak include $(GLSRCDIR)/icclib.mak include $(GLSRCDIR)/$(WHICH_CMS).mak include $(GLSRCDIR)/ijs.mak @@ -618,6 +626,8 @@ # a debug-clean target for consistency with the ghostpdl builds debug-clean : debugclean +memento-clean : mementoclean + maintainer-clean : distclean -$(RM_) configure.ac -$(RM_) configure diff -Nru ghostscript-9.04~dfsg/base/memento.c ghostscript-9.05~dfsg~20120125/base/memento.c --- ghostscript-9.04~dfsg/base/memento.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/memento.c 2012-01-07 20:18:22.000000000 +0000 @@ -17,6 +17,12 @@ * to speed the operation */ #undef MEMENTO_LEAKONLY +#ifndef MEMENTO_STACKTRACE_METHOD +#ifdef __GNUC__ +#define MEMENTO_STACKTRACE_METHOD 1 +#endif +#endif + /* Don't keep blocks around if they'd mean losing more than a quarter of * the freelist. */ #define MEMENTO_FREELIST_MAX_SINGLE_BLOCK (MEMENTO_FREELIST_MAX/4) @@ -25,6 +31,12 @@ /* For GS we include malloc_.h. Anyone else would just include memento.h */ #include "malloc_.h" +#if defined(__linux__) +#define MEMENTO_HAS_FORK +#elif defined(__APPLE__) && defined(__MACH__) +#define MEMENTO_HAS_FORK +#endif + /* Define the underlying allocators, just in case */ void *MEMENTO_UNDERLYING_MALLOC(size_t); void MEMENTO_UNDERLYING_FREE(void *); @@ -47,6 +59,10 @@ Memento_PostSize = 16 }; +enum { + Memento_Flag_OldBlock = 1 +}; + typedef struct Memento_BlkHeader Memento_BlkHeader; struct Memento_BlkHeader @@ -54,6 +70,7 @@ size_t rawsize; int sequence; int lastCheckedOK; + int flags; Memento_BlkHeader *next; char preblk[Memento_PreSize]; }; @@ -211,10 +228,47 @@ p = MEMBLK_TOBLK(b); i = b->rawsize; + /* Attempt to speed this up by checking an (aligned) int at a time */ do { - if (*p++ != (char)MEMENTO_FREEFILL) - break; - } while (--i); + if (((size_t)p) & 1) { + if (*p++ != (char)MEMENTO_FREEFILL) + break; + i--; + if (i == 0) + break; + } + if ((i >= 2) && (((size_t)p) & 2)) { + if (*(short *)p != (short)(MEMENTO_FREEFILL | (MEMENTO_FREEFILL<<8))) + goto mismatch; + p += 2; + i -= 2; + if (i == 0) + break; + } + i -= 4; + while (i >= 0) { + if (*(int *)p != (MEMENTO_FREEFILL | + (MEMENTO_FREEFILL<<8) | + (MEMENTO_FREEFILL<<16) | + (MEMENTO_FREEFILL<<24))) + goto mismatch; + p += 4; + i -= 4; + } + i += 4; + if ((i >= 2) && (((size_t)p) & 2)) { + if (*(short *)p != (short)(MEMENTO_FREEFILL | (MEMENTO_FREEFILL<<8))) + goto mismatch; + p += 2; + i -= 2; + } +mismatch: + while (i) { + if (*p++ != (char)MEMENTO_FREEFILL) + break; + i--; + } + } while (0); if (i) { data->freeCorrupt = 1; data->index = b->rawsize-i; @@ -240,6 +294,7 @@ /* FAIL! Will have been reported to user earlier, so just exit. */ return; } + VALGRIND_MAKE_MEM_DEFINED(blks->tail, sizeof(*blks->tail)); if (*blks->tail == head) { /* Removing the tail of the list */ if (prev == NULL) { @@ -338,17 +393,17 @@ } static int Memento_listBlock(Memento_BlkHeader *b, - void *arg) + void *arg) { int *counts = (int *)arg; - fprintf(stderr, " 0x%x:(size=%d,num=%d)\n", - MEMBLK_TOBLK(b), b->rawsize, b->sequence); + fprintf(stderr, " 0x%p:(size=%d,num=%d)\n", + MEMBLK_TOBLK(b), (int)b->rawsize, b->sequence); counts[0]++; counts[1]+= b->rawsize; return 0; } -static void Memento_listBlocks(void) { +void Memento_listBlocks(void) { int counts[2]; counts[0] = 0; counts[1] = 0; @@ -358,6 +413,25 @@ fprintf(stderr, " Total size of blocks = %d\n", counts[1]); } +static int Memento_listNewBlock(Memento_BlkHeader *b, + void *arg) +{ + if (b->flags & Memento_Flag_OldBlock) + return 0; + b->flags |= Memento_Flag_OldBlock; + return Memento_listBlock(b, arg); +} + +void Memento_listNewBlocks(void) { + int counts[2]; + counts[0] = 0; + counts[1] = 0; + fprintf(stderr, "Blocks allocated and still extant since last list:\n"); + Memento_appBlocks(&globals.used, Memento_listNewBlock, &counts[0]); + fprintf(stderr, " Total number of blocks = %d\n", counts[0]); + fprintf(stderr, " Total size of blocks = %d\n", counts[1]); +} + static void Memento_fin(void) { Memento_checkAllMemory(); @@ -443,9 +517,17 @@ #ifdef MEMENTO_HAS_FORK #include -#include #include #include +#ifdef MEMENTO_STACKTRACE_METHOD +#if MEMENTO_STACKTRACE_METHOD == 1 +#include +#endif +#endif + +/* FIXME: Find some portable way of getting this */ +/* MacOSX has 10240, Ubuntu seems to have 256 */ +#define OPEN_MAX 10240 /* stashed_map[j] = i means that filedescriptor i-1 was duplicated to j */ int stashed_map[OPEN_MAX]; @@ -453,6 +535,22 @@ static void Memento_signal(void) { fprintf(stderr, "SEGV after Memory squeezing @ %d\n", globals.squeezed); + +#ifdef MEMENTO_STACKTRACE_METHOD +#if MEMENTO_STACKTRACE_METHOD == 1 + { + void *array[100]; + size_t size; + + size = backtrace(array, 100); + fprintf(stderr, "------------------------------------------------------------------------\n"); + fprintf(stderr, "Backtrace:\n"); + backtrace_symbols_fd(array, size, 2); + fprintf(stderr, "------------------------------------------------------------------------\n"); + } +#endif +#endif + exit(1); } @@ -502,6 +600,19 @@ } #endif +int Memento_failThisEvent(void) +{ + if (!globals.inited) + Memento_init(); + + Memento_event(); + + if ((globals.squeezing) && (!globals.squeezed)) + squeeze(); + + return globals.failing; +} + void *Memento_malloc(size_t s) { Memento_BlkHeader *memblk; @@ -537,6 +648,7 @@ memblk->rawsize = s; memblk->sequence = globals.sequence; memblk->lastCheckedOK = memblk->sequence; + memblk->flags = 0; Memento_addBlockHead(&globals.used, memblk, 0); return MEMBLK_TOBLK(memblk); } @@ -560,12 +672,12 @@ &data, memblk); if (!data.found) { /* Failure! */ - fprintf(stderr, "Attempt to %s block 0x%x(size=%d,num=%d) not on allocated list!\n", + fprintf(stderr, "Attempt to %s block 0x%p(size=%d,num=%d) not on allocated list!\n", action, memblk, memblk->rawsize, memblk->sequence); Memento_breakpoint(); return 1; } else if (data.preCorrupt || data.postCorrupt) { - fprintf(stderr, "Block 0x%x(size=%d,num=%d) found to be corrupted on %s!\n", + fprintf(stderr, "Block 0x%p(size=%d,num=%d) found to be corrupted on %s!\n", action, memblk->rawsize, memblk->sequence, action); if (data.preCorrupt) { fprintf(stderr, "Preguard corrupted\n"); @@ -695,7 +807,7 @@ fprintf(stderr, "Allocated blocks:\n"); data->found |= 2; } - fprintf(stderr, " Block 0x%x(size=%d,num=%d)", + fprintf(stderr, " Block 0x%p(size=%d,num=%d)", memblk, memblk->rawsize, memblk->sequence); if (data->preCorrupt) { fprintf(stderr, " Preguard "); @@ -724,10 +836,10 @@ fprintf(stderr, "Freed blocks:\n"); data->found |= 4; } - fprintf(stderr, " 0x%x(size=%d,num=%d) ", + fprintf(stderr, " 0x%p(size=%d,num=%d) ", MEMBLK_TOBLK(memblk), memblk->rawsize, memblk->sequence); if (data->freeCorrupt) { - fprintf(stderr, "index %d (address 0x%x) onwards ", data->index, + fprintf(stderr, "index %d (address 0x%p) onwards ", data->index, &((char *)MEMBLK_TOBLK(memblk))[data->index]); if (data->preCorrupt) { fprintf(stderr, "+ preguard "); @@ -843,7 +955,7 @@ data.flags = 0; Memento_appBlocks(&globals.used, Memento_containsAddr, &data); if (data.blk != NULL) { - fprintf(stderr, "Address 0x%x is in %sallocated block 0x%x(size=%d,num=%d)\n", + fprintf(stderr, "Address 0x%p is in %sallocated block 0x%p(size=%d,num=%d)\n", data.addr, (data.flags == 1 ? "" : (data.flags == 2 ? "preguard of " : "postguard of ")), @@ -854,7 +966,7 @@ data.flags = 0; Memento_appBlocks(&globals.free, Memento_containsAddr, &data); if (data.blk != NULL) { - fprintf(stderr, "Address 0x%x is in %sfreed block 0x%x(size=%d,num=%d)\n", + fprintf(stderr, "Address 0x%p is in %sfreed block 0x%p(size=%d,num=%d)\n", data.addr, (data.flags == 1 ? "" : (data.flags == 2 ? "preguard of " : "postguard of ")), @@ -950,5 +1062,13 @@ return MEMENTO_UNDERLYING_CALLOC(n, s); } +void (Memento_listBlocks)(void) +{ +} + +void (Memento_listNewBlocks)(void) +{ +} + #endif diff -Nru ghostscript-9.04~dfsg/base/memento.h ghostscript-9.05~dfsg~20120125/base/memento.h --- ghostscript-9.04~dfsg/base/memento.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/memento.h 2011-11-12 18:29:08.000000000 +0000 @@ -103,6 +103,33 @@ * allocations and discover that the corruption happens between events * X and X+100. You can then rerun using Memento_paranoidAt(X), and * it'll only start exhaustively checking when it reaches X. + * + * More than one memory allocator? + * + * If you have more than one memory allocator in the system (like for + * instance the ghostscript chunk allocator, that builds on top of the + * standard malloc and returns chunks itself), then there are some things + * to note: + * + * * If the secondary allocator gets its underlying blocks from calling + * malloc, then those will be checked by Memento, but 'subblocks' that + * are returned to the secondary allocator will not. There is currently + * no way to fix this other than trying to bypass the secondary + * allocator. One way I have found to do this with the chunk allocator + * is to tweak its idea of a 'large block' so that it puts every + * allocation in its own chunk. Clearly this negates the point of having + * a secondary allocator, and is therefore not recommended for general + * use. + * + * * Again, if the secondary allocator gets its underlying blocks from + * calling malloc (and hence Memento) leak detection should still work + * (but whole blocks will be detected rather than subblocks). + * + * * If on every allocation attempt the secondary allocator calls into + * Memento_failThisEvent(), and fails the allocation if it returns true + * then more useful features can be used; firstly memory squeezing will + * work, and secondly, Memento will have a "finer grained" paranoia + * available to it. */ #ifndef MEMENTO_H @@ -146,6 +173,10 @@ int Memento_find(void *a); void Memento_breakpoint(void); int Memento_failAt(int); +int Memento_failThisEvent(void); + +void Memento_listBlocks(void); +void Memento_listNewBlocks(void); void *Memento_malloc(size_t s); void *Memento_realloc(void *, size_t s); @@ -178,6 +209,9 @@ #define Memento_find(A) 0 #define Memento_breakpoint() do {} while (0) #define Memento_failAt(A) 0 +#define Memento_failThisEvent() 0 +#define Memento_listBlocks() do {} while (0) +#define Memento_listNewBlocks() do {} while (0) #endif /* MEMENTO */ diff -Nru ghostscript-9.04~dfsg/base/minftrsz.c ghostscript-9.05~dfsg~20120125/base/minftrsz.c --- ghostscript-9.04~dfsg/base/minftrsz.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/minftrsz.c 2011-09-29 11:01:33.000000000 +0000 @@ -14,7 +14,6 @@ /* Support functions for 1bpp Fax/Tiff devices */ #include "minftrsz.h" #include "gserrors.h" -#include "gserror.h" #include "gsmalloc.h" #include "memory_.h" diff -Nru ghostscript-9.04~dfsg/base/mkromfs.c ghostscript-9.05~dfsg~20120125/base/mkromfs.c --- ghostscript-9.04~dfsg/base/mkromfs.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/mkromfs.c 2011-09-29 11:01:33.000000000 +0000 @@ -44,6 +44,8 @@ * -d romprefix directory in %rom% file system (a prefix string on filename) * -c compression on * -b compression off (binary). + * -C postscript 'compaction' on + * -B postscript 'compaction' off * -g initfile gconfig_h * special handling to read the 'gs_init.ps' file (from * the current -P prefix path), and read the gconfig.h for @@ -95,6 +97,7 @@ */ typedef struct romfs_inode_s { + unsigned long disc_length; /* length of file on disc */ unsigned long length; /* blocks is (length+ROMFS_BLOCKSIZE-1)/ROMFS_BLOCKSIZE */ char *name; /* nul terminated */ unsigned long *data_lengths; /* this could be short if ROMFS_BLOCKSIZE */ @@ -205,8 +208,8 @@ void inode_clear(romfs_inode* node); void inode_write(FILE *out, romfs_inode *node, int compression, int inode_count, int*totlen); void process_path(char *path, const char *os_prefix, const char *rom_prefix, - Xlist_element *Xlist_head, - int compression, int *inode_count, int *totlen, FILE *out); + Xlist_element *Xlist_head, int compression, + int compaction, int *inode_count, int *totlen, FILE *out); int process_initfile(char *initfile, char *gconfig_h, const char *os_prefix, const char *rom_prefix, int compression, int *inode_count, int *totlen, FILE *out); @@ -264,7 +267,7 @@ /* clear the internal memory of an inode */ void inode_clear(romfs_inode* node) { - int i, blocks = (node->length+ROMFS_BLOCKSIZE-1)/ROMFS_BLOCKSIZE; + int i, blocks = (node->disc_length+ROMFS_BLOCKSIZE-1)/ROMFS_BLOCKSIZE; if (node) { if (node->data) { @@ -339,11 +342,1060 @@ #endif } +/* Simple ps compaction routines; strip comments, compact whitespace */ +typedef enum { + PSC_BufferIn = 0, + PSC_InComment, + PSC_InString, + PSC_InHexString, + PSC_BufferOut, + PSC_BufferCopy, +} psc_state; + +typedef int (psc_getc)(void *); +typedef void (psc_ungetc)(int, void *); +typedef int (psc_feof)(void *); + +typedef struct { + psc_state state; + int inpos; + int inmax; + int outpos; + int outend; + int outmax; + int buffercopy; + int wasascii; + char *bufferin; + char *bufferout; + psc_getc *pgetc; + psc_ungetc *unpgetc; + psc_feof *peof; + void *file; + int names; + int binary; + int noescape; + int escaping; + int paren; + int firstnum; +} pscompstate; + +static void pscompact_start(pscompstate *psc, psc_getc *myfgetc, psc_ungetc *myungetc, psc_feof *myfeof, void *myfile, int names, int binary, int firstnum) +{ + psc->state = PSC_BufferIn; + psc->bufferin = malloc(80); + psc->bufferout = malloc(80); + if ((psc->bufferin == NULL) || (psc->bufferout == NULL)) { + fprintf(stderr, "Malloc failed in ps compaction\n"); + exit(1); + } + psc->inmax = 80; + psc->outmax = 80; + psc->inpos = 0; + psc->wasascii = 0; + psc->pgetc = myfgetc; + psc->unpgetc = myungetc; + psc->peof = myfeof; + psc->file = myfile; + psc->names = names; + psc->binary = binary; + psc->noescape = 0; + psc->escaping = 0; + psc->paren = 0; + psc->firstnum = firstnum; +} + +static void pscompact_end(pscompstate *psc) +{ + free(psc->bufferin); + free(psc->bufferout); +} + +static void pscompact_copy(pscompstate *psc, int c, int n) +{ + psc->bufferout[0] = c; + psc->outend = 1; + psc->outpos = 0; + psc->buffercopy = n; + if (n == 0) + psc->state = PSC_BufferOut; + else + psc->state = PSC_BufferCopy; +} + +static void pscompact_copy2(pscompstate *psc, int c1, int c2, int n) +{ + psc->bufferout[0] = c1; + psc->bufferout[1] = c2; + psc->outend = 2; + psc->outpos = 0; + psc->buffercopy = n; + if (n == 0) + psc->state = PSC_BufferOut; + else + psc->state = PSC_BufferCopy; +} + +static void pscompact_copy3(pscompstate *psc, int c1, int c2, int c3, int n) +{ + psc->bufferout[0] = c1; + psc->bufferout[1] = c2; + psc->bufferout[2] = c3; + psc->outend = 3; + psc->outpos = 0; + psc->buffercopy = n; + if (n == 0) + psc->state = PSC_BufferOut; + else + psc->state = PSC_BufferCopy; +} + +static void pscompact_buffer(pscompstate *psc, int c) +{ + if (psc->inpos == psc->inmax) { + psc->inmax *= 2; + psc->bufferin = realloc(psc->bufferin, psc->inmax * 2); + if (psc->bufferin == NULL) { + fprintf(stderr, "Realloc failed in pscompaction\n"); + exit(1); + } + } + psc->bufferin[psc->inpos++] = c; +} + +static void pscompact_bufferatstart(pscompstate *psc, int c) +{ + if (psc->inpos == psc->inmax) { + psc->inmax *= 2; + psc->bufferin = realloc(psc->bufferin, psc->inmax * 2); + if (psc->bufferin == NULL) { + fprintf(stderr, "Realloc failed in pscompaction\n"); + exit(1); + } + } + memmove(psc->bufferin+1, psc->bufferin, psc->inpos); + psc->inpos++; + psc->bufferin[0] = c; +} + +static void pscompact_copyinout(pscompstate *psc) +{ + if (psc->outmax < psc->inpos) { + psc->outmax = psc->inmax; + psc->bufferout = realloc(psc->bufferout, psc->outmax); + if (psc->bufferout == NULL) { + fprintf(stderr, "Realloc failed in pscompaction\n"); + exit(1); + } + } + memcpy(psc->bufferout, psc->bufferin, psc->inpos); + psc->outpos = 0; + psc->outend = psc->inpos; + psc->state = PSC_BufferOut; + psc->inpos = 0; +} + +static void pscompact_copyinout_bin(pscompstate *psc) +{ + pscompact_copyinout(psc); + psc->noescape = 1; +} + +static void pscompact_hex2ascii(pscompstate *psc) +{ + int i = 0; + int o = 0; + + while (i < psc->inpos) { + int v = 0; + + if ((psc->bufferin[i] >= '0') && (psc->bufferin[i] <= '9')) { + v = (psc->bufferin[i] - '0')<<4; + } else if ((psc->bufferin[i] >= 'a') && (psc->bufferin[i] <= 'f')) { + v = (psc->bufferin[i] - 'a' + 10)<<4; + } else if ((psc->bufferin[i] >= 'A') && (psc->bufferin[i] <= 'F')) { + v = (psc->bufferin[i] - 'A' + 10)<<4; + } else { + fprintf(stderr, "Malformed hexstring in pscompaction!\n"); + exit(1); + } + i++; + + if (i == psc->inpos) { + /* End of string */ + } else if ((psc->bufferin[i] >= '0') && (psc->bufferin[i] <= '9')) { + v += psc->bufferin[i] - '0'; + } else if ((psc->bufferin[i] >= 'a') && (psc->bufferin[i] <= 'f')) { + v += psc->bufferin[i] - 'a' + 10; + } else if ((psc->bufferin[i] >= 'A') && (psc->bufferin[i] <= 'F')) { + v += psc->bufferin[i] - 'A' + 10; + } else { + fprintf(stderr, "Malformed hexstring in pscompaction!\n"); + exit(1); + } + i++; + psc->bufferin[o++] = v; + } + psc->inpos = o; +} + +static const char *pscompact_names[] = +{ + "abs", + "add", + "aload", + "anchorsearch", + "and", + "arc", + "arcn", + "arct", + "arcto", + "array", + "ashow", + "astore", + "awidthshow", + "begin", + "bind", + "bitshift", + "ceiling", + "charpath", + "clear", + "cleartomark", + "clip", + "clippath", + "closepath", + "concat", + "concatmatrix", + "copy", + "count", + "counttomark", + "currentcmykcolor", + "currentdash", + "currentdict", + "currentfile", + "currentfont", + "currentgray", + "currentgstate", + "currenthsbcolor", + "currentlinecap", + "currentlinejoin", + "currentlinewidth", + "currentmatrix", + "currentpoint", + "currentrgbcolor", + "currentshared", + "curveto", + "cvi", + "cvlit", + "cvn", + "cvr", + "cvrs", + "cvs", + "cvx", + "def", + "defineusername", + "dict", + "div", + "dtransform", + "dup", + "end", + "eoclip", + "eofill", + "eoviewclip", + "eq", + "exch", + "exec", + "exit", + "file", + "fill", + "findfont", + "flattenpath", + "floor", + "flush", + "flushfile", + "for", + "forall", + "ge", + "get", + "getinterval", + "grestore", + "gsave", + "gstate", + "gt", + "identmatrix", + "idiv", + "idtransform", + "if", + "ifelse", + "image", + "imagemask", + "index", + "ineofill", + "infill", + "initviewclip", + "inueofill", + "inufill", + "invertmatrix", + "itransform", + "known", + "le", + "length", + "lineto", + "load", + "loop", + "lt", + "makefont", + "matrix", + "maxlength", + "mod", + "moveto", + "mul", + "ne", + "neg", + "newpath", + "not", + "null", + "or", + "pathbbox", + "pathforall", + "pop", + "print", + "printobject", + "put", + "putinterval", + "rcurveto", + "read", + "readhexstring", + "readline", + "readstring", + "rectclip", + "rectfill", + "rectstroke", + "rectviewclip", + "repeat", + "restore", + "rlineto", + "rmoveto", + "roll", + "rotate", + "round", + "save", + "scale", + "scalefont", + "search", + "selectfont", + "setbbox", + "setcachedevice", + "setcachedevice2", + "setcharwidth", + "setcmykcolor", + "setdash", + "setfont", + "setgray", + "setgstate", + "sethsbcolor", + "setlinecap", + "setlinejoin", + "setlinewidth", + "setmatrix", + "setrgbcolor", + "setshared", + "shareddict", + "show", + "showpage", + "stop", + "stopped", + "store", + "string", + "stringwidth", + "stroke", + "strokepath", + "sub", + "systemdict", + "token", + "transform", + "translate", + "truncate", + "type", + "uappend", + "ucache", + "ueofill", + "ufill", + "undef", + "upath", + "userdict", + "ustroke", + "viewclip", + "viewclippath", + "where", + "widthshow", + "write", + "writehexstring", + "writeobject", + "writestring", + "wtranslation", + "xor", + "xshow", + "xyshow", + "yshow", + "FontDirectory", + "SharedFontDirectory", + "Courier%", + "Courier-Bold", + "Courier-BoldOblique", + "Courier-Oblique", + "Helvetica", + "Helvetica-Bold", + "Helvetica-BoldOblique", + "Helvetica-Oblique", + "Symbol", + "Times-Bold", + "Times-BoldItalic", + "Times-Italic", + "Times-Roman", + "execuserobject", + "currentcolor", + "currentcolorspace", + "currentglobal", + "execform", + "filter", + "findresource", + "globaldict", + "makepattern", + "setcolor", + "setcolorspace", + "setglobal", + "setpagedevice", + "setpattern" +}; + +static int pscompact_isname(pscompstate *psc, int *i) +{ + int off = 0; + int n; + + if (psc->bufferin[0] == '/') + off = 1; + for (n = 0; n < sizeof(pscompact_names)/sizeof(char *); n++) { + if (strncmp(pscompact_names[n], &psc->bufferin[off], psc->inpos-off) == 0) { + /* Match! */ + if (off) + *i = -1-n; + else + *i = n; + return 1; + } + } + return 0; +} + +static int pscompact_isint(pscompstate *psc, int *i) +{ + int pos = 0; + + if ((psc->bufferin[0] == '+') || (psc->bufferin[0] == '-')) { + pos = 1; + } + if (pos >= psc->inpos) + return 0; + if ((psc->inpos > pos+3) && + (strncmp(&psc->bufferin[pos], "16#", 3) == 0)) { + /* hex */ + int v = 0; + pos += 3; + while (pos < psc->inpos) { + if ((psc->bufferin[pos] >= '0') && (psc->bufferin[pos] <= '9')) + v = v*16 + psc->bufferin[pos] - '0'; + else if ((psc->bufferin[pos] >= 'a') && (psc->bufferin[pos] <= 'f')) + v = v*16 + psc->bufferin[pos] - 'a' + 10; + else if ((psc->bufferin[pos] >= 'A') && (psc->bufferin[pos] <= 'F')) + v = v*16 + psc->bufferin[pos] - 'A' + 10; + else + return 0; + pos++; + } + if (psc->bufferin[0] == '-') + v = -v; + *i = v; + return 1; + } + + do { + if ((psc->bufferin[pos] < '0') || (psc->bufferin[pos] > '9')) + return 0; + pos++; + } while (pos < psc->inpos); + + if (psc->inpos == psc->inmax) { + psc->inmax *= 2; + psc->bufferin = realloc(psc->bufferin, psc->inmax); + } + psc->bufferin[psc->inpos] = 0; + *i = atoi(psc->bufferin); + return 1; +} + +static int pscompact_isfloat(pscompstate *psc, float *f) +{ + int pos = 0; + int point = 0; + + if ((psc->bufferin[0] == '+') || (psc->bufferin[0] == '-')) { + pos = 1; + } + if (pos >= psc->inpos) + return 0; + do { + if ((psc->bufferin[pos] >= '0') && (psc->bufferin[pos] <= '9')) { + /* Digits are OK */ + } else if ((psc->bufferin[pos] == '.') && (point == 0)) { + /* as are points, but only the first one */ + point = 1; + } else { + /* Anything else is a failure */ + return 0; + } + pos++; + } while (pos < psc->inpos); + + if (psc->inpos == psc->inmax) { + psc->inmax *= 2; + psc->bufferin = realloc(psc->bufferin, psc->inmax); + } + psc->bufferin[psc->inpos] = 0; + *f = atof(psc->bufferin); + return 1; +} + +static unsigned long pscompact_getcompactedblock(pscompstate *psc, unsigned char *ubuf, unsigned long ulen) +{ + unsigned char *out; + int c; + + if (ulen == 0) + return 0; + out = ubuf; + do { + switch (psc->state) { + case PSC_BufferIn: + c = psc->pgetc(psc->file); + if ((c <= 32) || (c == EOF)) { + /* Whitespace */ + if (psc->inpos == 0) { + /* Leading whitespace, just bin it */ + break; + } + } else if (c == '(') { + /* Start of a string */ + if (psc->inpos == 0) { + /* Go into string state */ + psc->state = PSC_InString; + psc->paren = 1; + break; + } + } else if (c == '>') { + /* End of a dictionary */ + if (psc->inpos == 0) { + /* Just output it (with no whitespace) */ + *out++ = c; + break; + } + } else if ((c == '{') || (c == '}') || + (c == '[') || (c == ']')) { + /* Stand alone token bytes */ + if (psc->inpos == 0) { + /* Process now and be done with it */ + *out++ = c; + psc->wasascii = 0; + break; + } + } else if ((c >= 128) && (c <= 131)) { + fprintf(stderr, "Can't compact files with binary object sequences in!"); + exit(1); + } else if ((c == 132) || (c == 133) || (c == 138) || (c == 139) || (c == 140)) { + /* 32 bit integers or reals */ + if (psc->inpos == 0) { + pscompact_copy(psc, c, 4); + break; + } + } else if ((c == 134) || (c == 135)) { + /* 16 bit integers */ + if (psc->inpos == 0) { + pscompact_copy(psc, c, 2); + break; + } + } else if ((c == 136) || (c == 141) || (c == 145) || + (c == 146) || (c == 147) || (c == 148)) { + /* 8 bit integers or bools or pool name */ + if (psc->inpos == 0) { + pscompact_copy(psc, c, 1); + break; + } + } else if (c == 137) { + /* fixed point */ + if (psc->inpos == 0) { + int r = psc->pgetc(psc->file); + if (r & 32) { + pscompact_copy2(psc, c, r, 2); + } else { + pscompact_copy2(psc, c, r, 4); + } + break; + } + } else if (c == 142) { + /* short string */ + if (psc->inpos == 0) { + int n = psc->pgetc(psc->file); + pscompact_copy2(psc, c, n, n); + break; + } + } else if (c == 143) { + /* long string */ + if (psc->inpos == 0) { + int n1 = psc->pgetc(psc->file); + int n2 = psc->pgetc(psc->file); + pscompact_copy3(psc, c, n1, n2, (n1<<8) + n2); + break; + } + } else if (c == 144) { + /* long string */ + if (psc->inpos == 0) { + int n1 = psc->pgetc(psc->file); + int n2 = psc->pgetc(psc->file); + pscompact_copy3(psc, c, n1, n2, n1 + (n2<<8)); + break; + } + } else if ((c >= 149) && (c <= 159)) { + fprintf(stderr, "Can't compact files with binary postscript byte %d in!", c); + exit(1); + } else if (c == '%') { + if (psc->inpos == 0) { + psc->state = PSC_InComment; + break; + } + } else if (c == '<') { + if (psc->inpos == 0) { + psc->state = PSC_InHexString; + break; + } + } else if ((c == '/') && + (psc->inpos > 0) && + (psc->bufferin[psc->inpos-1] != '/')) { + /* We hit a / while not in a prefix of them - stop the + * buffering. */ + } else { + /* Stick c into the buffer and continue */ + pscompact_buffer(psc, c); + break; + } + /* If we reach here, we have a complete buffer full. We need + * to write it (or something equivalent to it) out. */ + if (c > 32) { + /* Put c back into the file to process next time */ + psc->unpgetc(c, psc->file); + } + if (psc->binary) { + int i; + float f; + /* Is it a number? */ + if (pscompact_isint(psc, &i)) { + if (psc->firstnum) { + /* Don't alter the first number in a file */ + psc->firstnum = 0; + } else if ((i >= -128) && (i <= 127)) { + /* Encode as a small integer */ + psc->bufferout[0] = 136; + psc->bufferout[1] = i & 255; + psc->inpos = 0; + psc->outend = 2; + psc->wasascii = 0; + psc->noescape = 1; + psc->state = PSC_BufferOut; + break; + } else if ((i >= -0x8000) && (i <= 0x7FFF)) { + /* Encode as a 16 bit integer */ + psc->bufferout[0] = 135; + psc->bufferout[1] = i & 255; + psc->bufferout[2] = (i>>8) & 255; + psc->inpos = 0; + psc->outpos = 0; + psc->outend = 3; + psc->wasascii = 0; + psc->noescape = 1; + psc->state = PSC_BufferOut; + break; + } else { + /* Encode as a 32 bit integer */ + psc->bufferout[0] = 133; + psc->bufferout[1] = i & 255; + psc->bufferout[2] = (i>>8) & 255; + psc->bufferout[3] = (i>>16) & 255; + psc->bufferout[4] = (i>>24) & 255; + psc->inpos = 0; + psc->outpos = 0; + psc->outend = 5; + psc->wasascii = 0; + psc->noescape = 1; + psc->state = PSC_BufferOut; + break; + } + } else if ((sizeof(float) == 4) && pscompact_isfloat(psc, &f)) { + /* Encode as a 32 bit float */ + union { + float f; + unsigned char c[4]; + } fc; + fc.f = 1.0; + if ((fc.c[0] == 0) && (fc.c[1] == 0) && + (fc.c[2] == 0x80) && (fc.c[3] == 0x3f)) { + fc.f = f; + psc->bufferout[0] = 139; + psc->bufferout[1] = (char)fc.c[0]; + psc->bufferout[2] = (char)fc.c[1]; + psc->bufferout[3] = (char)fc.c[2]; + psc->bufferout[4] = (char)fc.c[3]; + psc->inpos = 0; + psc->outpos = 0; + psc->outend = 5; + psc->wasascii = 0; + psc->noescape = 1; + psc->state = PSC_BufferOut; + break; + } else if ((fc.c[0] == 0x3f) && (fc.c[1] == 0x80) && + (fc.c[2] == 0) && (fc.c[3] == 0)) { + fc.f = f; + psc->bufferout[0] = 139; + psc->bufferout[1] = (char)fc.c[3]; + psc->bufferout[2] = (char)fc.c[2]; + psc->bufferout[3] = (char)fc.c[1]; + psc->bufferout[4] = (char)fc.c[0]; + psc->inpos = 0; + psc->outpos = 0; + psc->outend = 5; + psc->wasascii = 0; + psc->noescape = 1; + psc->state = PSC_BufferOut; + break; + } + } + if ((psc->inpos == 4) && + (strncmp(psc->bufferin, "true", 4) == 0)) { + /* Encode as a 32 bit integer */ + psc->bufferout[0] = 141; + psc->bufferout[1] = 1; + psc->inpos = 0; + psc->outpos = 0; + psc->outend = 2; + psc->wasascii = 0; + psc->noescape = 1; + psc->state = PSC_BufferOut; + break; + } + if ((psc->inpos == 5) && + (strncmp(psc->bufferin, "false", 5) == 0)) { + /* Encode as a 32 bit integer */ + psc->bufferout[0] = 141; + psc->bufferout[1] = 0; + psc->inpos = 0; + psc->outpos = 0; + psc->outend = 2; + psc->wasascii = 0; + psc->noescape = 1; + psc->state = PSC_BufferOut; + break; + } + if (psc->binary && psc->names && pscompact_isname(psc, &i)) { + /* Encode as a name lookup */ + if (i >= 0) { + /* Executable */ + psc->bufferout[0] = 146; + psc->bufferout[1] = i; + } else { + /* Literal */ + psc->bufferout[0] = 145; + psc->bufferout[1] = 1-i; + } + psc->inpos = 0; + psc->outpos = 0; + psc->outend = 2; + psc->wasascii = 0; + psc->noescape = 1; + psc->state = PSC_BufferOut; + break; + } + } + if ((psc->wasascii) && (psc->bufferin[0]!='/')) + *out++ = 32; + pscompact_copyinout(psc); + psc->wasascii = 1; + break; + case PSC_BufferOut: + { + unsigned char c = psc->bufferout[psc->outpos++]; + if (psc->noescape) { + } else if ((c == 10) && (psc->outpos < psc->outend)) { + if (!psc->escaping) { + c = '\\'; + psc->outpos--; + psc->escaping = 1; + } else { + c = 'n'; + psc->escaping = 0; + } + } else if (c == 9) { + if (!psc->escaping) { + c = '\\'; + psc->outpos--; + psc->escaping = 1; + } else { + c = 't'; + psc->escaping = 0; + } + } else if (c == 8) { + if (!psc->escaping) { + c = '\\'; + psc->outpos--; + psc->escaping = 1; + } else { + c = 'b'; + psc->escaping = 0; + } + } else if (c == 12) { + if (!psc->escaping) { + c = '\\'; + psc->outpos--; + psc->escaping = 1; + } else { + c = 'f'; + psc->escaping = 0; + } + } else if (c == 13) { + if (!psc->escaping) { + c = '\\'; + psc->outpos--; + psc->escaping = 1; + } else { + c = 'r'; + psc->escaping = 0; + } + } else if (c == '\\') { + if (!psc->escaping) { + psc->outpos--; + psc->escaping = 1; + } else { + psc->escaping = 0; + } + } else if ((c == ')') && (psc->outpos < psc->outend)) { + if (!psc->escaping) { + c = '\\'; + psc->outpos--; + psc->escaping = 1; + } else { + c = ')'; + psc->escaping = 0; + } + } else if ((c == '(') && (psc->outpos > 1)) { + if (!psc->escaping) { + c = '\\'; + psc->outpos--; + psc->escaping = 1; + } else { + c = '('; + psc->escaping = 0; + } + } else if (((c < 32) && (c != 10)) || (c >= 128)) { + if (psc->escaping == 0) { + c = '\\'; + psc->outpos--; + psc->escaping = 1; + } else if (psc->escaping == 1) { + c = '0' + ((c >> 6)&3); + psc->outpos--; + psc->escaping = 2; + } else if (psc->escaping == 2) { + c = '0' + ((c >> 3)&7); + psc->outpos--; + psc->escaping = 3; + } else if (psc->escaping == 3) { + c = '0' + (c&7); + psc->escaping = 0; + } + } + *out++ = c; + if (psc->outpos == psc->outend) { + psc->outpos = 0; + psc->outend = 0; + psc->noescape = 0; + psc->state = PSC_BufferIn; + } + break; + } + case PSC_BufferCopy: + if (psc->outpos < psc->outend) { + *out++ = psc->bufferout[psc->outpos++]; + break; + } + *out++ = psc->pgetc(psc->file); + psc->buffercopy--; + if (psc->buffercopy == 0) { + psc->outpos = 0; + psc->outend = 0; + psc->state = PSC_BufferIn; + } + break; + case PSC_InString: + c = psc->pgetc(psc->file); + if ((c == ')') && (--psc->paren == 0)) { + psc->wasascii = 0; + if (psc->binary) { + /* Write out the string as binary */ + if (psc->inpos < 256) { + pscompact_bufferatstart(psc, psc->inpos); + pscompact_bufferatstart(psc, 142); + pscompact_copyinout_bin(psc); + break; + } else if (psc->inpos < 65536) { + pscompact_bufferatstart(psc, psc->inpos>>8); + pscompact_bufferatstart(psc, psc->inpos & 255); + pscompact_bufferatstart(psc, 144); + pscompact_copyinout_bin(psc); + break; + } + } + /* if all else fails, just write it out as an ascii + * string. */ + pscompact_bufferatstart(psc, '('); + pscompact_buffer(psc, ')'); + pscompact_copyinout(psc); + break; + } else if (c == '\\') { + c = psc->pgetc(psc->file); + if (c == 10) + break; + else if (c == 'b') + c = 8; + else if (c == 't') + c = 9; + else if (c == 'n') + c = 10; + else if (c == 'f') + c = 12; + else if (c == 'r') + c = 13; + else if ((c >= '0') && (c <= '7')) { + int d; + c = (c - '0'); + d = psc->pgetc(psc->file); + if ((d >= '0') && (d <= '7')) { + c = (c<<3) + (d-'0'); + d = psc->pgetc(psc->file); + if ((d >= '0') && (d <= '7')) { + c = (c<<3) + (d-'0'); + } else { + psc->unpgetc(d, psc->file); + } + } else { + psc->unpgetc(d, psc->file); + } + c &= 0xFF; + } + } else if (c == '(') { + psc->paren++; + } + pscompact_buffer(psc, c); + break; + case PSC_InComment: + /* Watch for an EOL, otherwise swallow */ + c = psc->pgetc(psc->file); + if ((c == 13) || (c == 10)) { + if ((psc->inpos >= 3) && + (strncmp(psc->bufferin, "END", 3) == 0)) { + /* Special comment to retain */ + pscompact_bufferatstart(psc, '%'); + pscompact_buffer(psc, 10); + pscompact_copyinout(psc); + break; + } + if ((psc->inpos >= 7) && + (strncmp(psc->bufferin, "NAMESOK", 7) == 0)) { + psc->names = 1; + pscompact_bufferatstart(psc, '%'); + pscompact_buffer(psc, 10); + pscompact_copyinout(psc); + break; + } + if ((psc->inpos >= 8) && + (strncmp(psc->bufferin, "BINARYOK", 8) == 0)) { + psc->binary = 1; + pscompact_bufferatstart(psc, '%'); + pscompact_buffer(psc, 10); + pscompact_copyinout(psc); + break; + } + /* Throw the buffered line away, and go back to buffering */ + psc->inpos = 0; + psc->state = PSC_BufferIn; + break; + } + pscompact_buffer(psc, c); + break; + case PSC_InHexString: + c = psc->pgetc(psc->file); + if (c == '<') { + /* Dictionary */ + pscompact_copy2(psc, '<', '<', 0); + break; + } else if (c == '~') { + /* FIXME: ASCII85 encoded! */ + fprintf(stderr, "ASCII85 encoded strings unsupported in pscompaction\n"); + exit(1); + } else if (c == '>') { + psc->wasascii = 0; + if (psc->binary) { + pscompact_hex2ascii(psc); + if (psc->inpos < 256) { + pscompact_bufferatstart(psc, psc->inpos); + pscompact_bufferatstart(psc, 142); + pscompact_copyinout_bin(psc); + } else if (psc->inpos < 65536) { + pscompact_bufferatstart(psc, psc->inpos>>8); + pscompact_bufferatstart(psc, psc->inpos & 255); + pscompact_bufferatstart(psc, 144); + pscompact_copyinout_bin(psc); + } else { + fprintf(stderr, "HexString more than 64K in pscompaction\n"); + exit(1); + } + break; + } + /* If all else fails, write it out as an ascii hexstring + * again */ + pscompact_bufferatstart(psc, '<'); + pscompact_buffer(psc, '>'); + pscompact_copyinout(psc); + break; + } else if (c <= 32) { + /* Swallow whitespace */ + break; + } else if (((c >= 'A') && (c <= 'Z')) || + ((c >= 'a') && (c <= 'z')) || + ((c >= '0') && (c <= '9'))) { + pscompact_buffer(psc, c); + } else { + fprintf(stderr, "Unexpected char when parsing hexstring in pscompaction\n"); + exit(1); + } + break; + } + } while ((out-ubuf != ulen) && (!psc->peof(psc->file))); + return out-ubuf; +} + /* This relies on the gp_enumerate_* which should not return directories, nor */ /* should it recurse into directories (unlike Adobe's implementation) */ /* paths are checked to see if they are an ordinary file or a path */ -void process_path(char *path, const char *os_prefix, const char *rom_prefix, Xlist_element *Xlist_head, - int compression, int *inode_count, int *totlen, FILE *out) +void process_path(char *path, const char *os_prefix, const char *rom_prefix, + Xlist_element *Xlist_head, int compression, + int compaction, int *inode_count, int *totlen, FILE *out) { int namelen, excluded, save_count=*inode_count; Xlist_element *Xlist_scan; @@ -355,6 +1407,8 @@ unsigned char *ubuf, *cbuf; unsigned long ulen, clen; FILE *in; + unsigned long psc_len; + pscompstate psc = { 0 }; prefixed_path = malloc(1024); found_path = malloc(1024); @@ -400,21 +1454,30 @@ printf("unable to open file for processing: %s\n", found_path); continue; } + /* printf("compacting %s\n", found_path); */ /* rom_filename + strlen(rom_prefix) is first char after the new prefix we want to add */ /* found_path + strlen(os_prefix) is the file name after the -P prefix */ rom_filename[strlen(rom_prefix)] = 0; /* truncate afater prefix */ strcat(rom_filename, found_path + strlen(os_prefix)); node->name = rom_filename; /* without -P prefix, with -d rom_prefix */ fseek(in, 0, SEEK_END); - node->length = ftell(in); + node->disc_length = node->length = ftell(in); blocks = (node->length+ROMFS_BLOCKSIZE-1) / ROMFS_BLOCKSIZE + 1; node->data_lengths = calloc(blocks, sizeof(*node->data_lengths)); node->data = calloc(blocks, sizeof(*node->data)); fclose(in); in = fopen(found_path, "rb"); + ulen = strlen(found_path); block = 0; + psc_len = 0; + if (compaction) + pscompact_start(&psc, (psc_getc*)&fgetc, (psc_ungetc*)&ungetc, (psc_feof*)&feof, in, 1, 0, 0); while (!feof(in)) { - ulen = fread(ubuf, 1, ROMFS_BLOCKSIZE, in); + if (compaction) + ulen = pscompact_getcompactedblock(&psc, ubuf, ROMFS_BLOCKSIZE); + else + ulen = fread(ubuf, 1, ROMFS_BLOCKSIZE, in); + psc_len += ulen; if (!ulen) break; clen = ROMFS_CBUFSIZE; if (compression) { @@ -434,6 +1497,12 @@ block++; } fclose(in); + if (compaction) { + /* printf("%s: Compaction saved %d bytes (before compression)\n", + * found_path, node->length - psc_len); */ + pscompact_end(&psc); + node->length = psc_len; + } /* write out data for this file */ inode_write(out, node, compression, *inode_count, totlen); /* clean up */ @@ -487,7 +1556,7 @@ unsigned char data[ROMFS_BLOCKSIZE]; }; -#define LINE_SIZE 128 +#define LINE_SIZE 1024 /* Globals used for gs_init processing */ char linebuf[LINE_SIZE * 2]; /* make it plenty long to avoid overflow */ @@ -495,6 +1564,35 @@ in_block_t *in_block_tail = NULL; unsigned char *curr_block_p, *curr_block_end; +typedef struct { + in_block_t *block; + int pos; + int eof; +} in_block_file; + +static int ib_getc(in_block_file *ibf) { + if ((ibf->block == in_block_tail) && + (ibf->pos == curr_block_p - in_block_tail->data)) { + ibf->eof = 1; + return -1; + } + if (ibf->pos == ROMFS_BLOCKSIZE) { + ibf->block = ibf->block->next; + ibf->pos = 0; + } + return ibf->block->data[ibf->pos++]; +} + +static void ib_ungetc(int c, in_block_file *ibf) +{ + ibf->pos--; +} + +static int ib_feof(in_block_file *ibf) +{ + return ibf->eof; +} + int process_initfile(char *initfile, char *gconfig_h, const char *os_prefix, const char *rom_prefix, int compression, int *inode_count, @@ -508,6 +1606,7 @@ FILE *in; FILE *config; in_block_t *in_block = NULL; + int compaction = 1; ubuf = malloc(ROMFS_BLOCKSIZE); cbuf = malloc(ROMFS_CBUFSIZE); @@ -544,6 +1643,40 @@ fclose(config); /**********/ + if (compaction) + { + in_block_t *comp_block_head; + in_block_t *comp_block; + pscompstate psc; + in_block_file ibf; + int ulen; + + ibf.block = in_block_head; + ibf.pos = 0; + ibf.eof = 0; + + comp_block = malloc(sizeof(*comp_block)); + comp_block_head = comp_block; + pscompact_start(&psc, (psc_getc*)&ib_getc, (psc_ungetc*)&ib_ungetc, (psc_feof*)&ib_feof, &ibf, 0, 0, 1); + do { + ulen = pscompact_getcompactedblock(&psc, comp_block->data, ROMFS_BLOCKSIZE); + comp_block->next = NULL; + if (ulen == ROMFS_BLOCKSIZE) { + comp_block->next = malloc(sizeof(*comp_block)); + comp_block = comp_block->next; + } + } while (ulen == ROMFS_BLOCKSIZE); + pscompact_end(&psc); + while (in_block_head != NULL) { + in_block = in_block_head->next; + free(in_block_head); + in_block_head = in_block; + } + in_block_head = comp_block_head; + in_block_tail = comp_block; + curr_block_p = in_block_tail->data + ulen; + } + node->length = 0; in_block = in_block_head; while (in_block != NULL) { @@ -551,6 +1684,7 @@ in_block != in_block_tail ? ROMFS_BLOCKSIZE : curr_block_p - in_block->data; in_block = in_block->next; } + node->disc_length = node->length; blocks = (node->length+ROMFS_BLOCKSIZE-1) / ROMFS_BLOCKSIZE + 1; node->data_lengths = calloc(blocks, sizeof(*node->data_lengths)); @@ -599,6 +1733,7 @@ flush_line_buf(int len) { int remaining_len = len; int move_len; + int line_offset = 0; if (len > LINE_SIZE) { printf("*** warning, flush_line called with len (%d) > LINE_SIZE (%d)\n", @@ -615,8 +1750,9 @@ /* move the data into the in_block buffer */ do { move_len = min(remaining_len, curr_block_end - curr_block_p); - memcpy(curr_block_p, linebuf, move_len); + memcpy(curr_block_p, linebuf + line_offset, move_len); curr_block_p += move_len; + line_offset += move_len; if (curr_block_p == curr_block_end) { /* start a new data block appended to the list of blocks */ in_block_tail->next = calloc(1, sizeof(in_block_t)); @@ -853,6 +1989,7 @@ return NULL; } prefix_add(os_prefix, filename, prefixed_path); + printf("including: '%s'\n", prefixed_path); filep = fopen(prefixed_path, "rb"); free(prefixed_path); return filep; @@ -886,8 +2023,10 @@ psname[strlen(psname) - 1] = 0; ps = prefix_open(os_prefix, psname + 1); - if (ps == 0) + if (ps == 0) { + fprintf(stderr, "Failed to open '%s' - aborting\n", psname+1); exit(1); + } mergefile(os_prefix, psname + 1, ps, config, intact || do_intact); } else if (!strcmp(psname, "INITFILES")) { /* @@ -980,6 +2119,7 @@ char *initfile, *gconfig_h; int atarg = 1; int compression = 1; /* default to doing compression */ + int compaction = 0; Xlist_element *Xlist_scan, *Xlist_head = NULL; if (argc < 2) { @@ -996,6 +2136,8 @@ " -d romprefix directory in %%rom file system (just a prefix string on filename)\n" " -c compression on\n" " -b compression off (binary).\n" + " -C postscript 'compaction' on\n" + " -B postscript 'compaction' off\n" " -g initfile gconfig_h \n" " special handling to read the 'gs_init.ps' file (from\n" " the current -P prefix path), and read the gconfig.h for\n" @@ -1046,6 +2188,12 @@ case 'c': compression = 1; break; + case 'B': + compaction = 0; + break; + case 'C': + compaction = 1; + break; case 'd': if (++atarg == argc) { printf(" option %s missing required argument\n", argv[atarg-1]); @@ -1090,7 +2238,7 @@ } /* process a path or file */ process_path(argv[atarg], os_prefix, rom_prefix, Xlist_head, - compression, &inode_count, &totlen, out); + compression, compaction, &inode_count, &totlen, out); } /* now write out the array of nodes */ diff -Nru ghostscript-9.04~dfsg/base/msvclib.mak ghostscript-9.05~dfsg~20120125/base/msvclib.mak --- ghostscript-9.04~dfsg/base/msvclib.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/msvclib.mak 2011-09-29 11:01:33.000000000 +0000 @@ -183,13 +183,6 @@ LCMS2SRCDIR=lcms2 !endif -# Define the directory where the imdi library source is stored. -# See devs.mak for more information - -!ifndef IMDISRCDIR -IMDISRCDIR=imdi -!endif - # Define any other compilation flags. !ifndef CFLAGS diff -Nru ghostscript-9.04~dfsg/base/opdfread.h ghostscript-9.05~dfsg~20120125/base/opdfread.h --- ghostscript-9.04~dfsg/base/opdfread.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/opdfread.h 2012-01-07 20:18:22.000000000 +0000 @@ -726,8 +726,15 @@ "}if\n", "pop pop 3 index 3 index 2 copy\n", "currentglobal false setglobal 3 1 roll\n", +"currentpagedevice dup /PageSize known{\n", +"/PageSize get aload pop}{\n", +"0 0}ifelse\n", +"round cvi 2 index round cvi eq\n", +"exch round cvi 3 index round cvi eq and{\n", +"pop pop}{\n", "2 array astore\n", -"<< exch/PageSize exch >>setpagedevice\n", +"<< exch /PageSize exch >> setpagedevice\n", +"} ifelse\n", "userdict/PDFR_InitialGS gstate put\n", "setglobal\n", "}if\n", @@ -1563,6 +1570,16 @@ "neg exch neg exch rlineto\n", "closepath stroke\n", "}bind def\n", +"/SaveResourcesToStack{", +"[//PDFReader/OldResources known{", +"//PDFReader/OldResources get}{null}ifelse\n", +"//PDFReader/CurrentObject get/Context get/Resources get]", +"//PDFReader/OldResources 3 -1 roll put}bind def\n", +"/RestoreResourcesFromStack{", +"//PDFReader/OldResources get dup\n", +"0 get//PDFReader/OldResources 3 -1 roll put\n", +"1 get//PDFReader/CurrentObject get/Context get/Resources 3 -1 roll put", +"} bind def\n", "/BuildChar\n", "{//PDFR_DEBUG{\n", "(BuildChar )print dup//=only exec( )print\n", @@ -1575,8 +1592,13 @@ "dup null eq{\n", "pop//NotDef exec\n", "}{\n", -"CharProcs exch//knownget exec{\n", -"//RunDelayedStream exec\n", +"CharProcs exch//knownget exec{", +"currentfont/Font get/Resources//knownget exec{", +"exec SaveResourcesToStack", +"//PDFReader/CurrentObject get/Context get", +"/Resources 3 -1 roll put", +"//RunDelayedStream exec RestoreResourcesFromStack", +"}{//RunDelayedStream exec}ifelse", "}{\n", "//NotDef exec\n", "}ifelse\n", @@ -1829,6 +1851,8 @@ "nseg2 add/idroff etab 2 index nseg2 getinterval def\n", "pop\n", "/firstcode startc 0 getu16 16#ff00 and dup 16#f000 ne{pop 0}if def\n", +"/lastcode firstcode def\n", +"/striptopbyte false def\n", "/putglyph{\n", "glyphs code 3 -1 roll put/code code 1 add def\n", "}bind def\n", @@ -1836,11 +1860,18 @@ "/i2 exch def\n", "/scode startc i2 getu16 def\n", "/ecode endc i2 getu16 def\n", -"numcodes scode firstcode sub\n", -"exch sub 0 .max ecode scode sub 1 add add\n", -"exch 1 index add exch\n", -"numcodes add/numcodes exch def\n", -"}for array def\n", +"ecode lastcode gt {\n", +"/lastcode ecode def\n", +"}if\n", +"}for pop\n", +"firstcode 16#f000 ge lastcode firstcode sub 255 le and {\n", +"lastcode 255 and\n", +"/striptopbyte true def\n", +"} {\n", +"lastcode\n", +"}ifelse\n", +"1 add\n", +"array def\n", "glyphs length 1024 ge{\n", ".array1024z 0 1024 glyphs length 1023 sub{glyphs exch 2 index putinterval}for\n", "glyphs dup length 1024 sub 3 -1 roll\n", @@ -1865,9 +1896,19 @@ "}if\n", "idroff i2 getu16 dup 0 eq{\n", "pop scode delta add 65535 and 1 ecode delta add 65535 and\n", +"striptopbyte {\n", +"/code scode 255 and def\n", +"} {\n", +"/code scode def\n", +"} ifelse\n", "{putglyph}for\n", "}{\n", "/gloff exch 14 nseg2 3 mul add 2 add i2 add add def\n", +"striptopbyte {\n", +"/code scode 255 and def\n", +"} {\n", +"/code scode def\n", +"} ifelse\n", "0 1 ecode scode sub{\n", "2 mul gloff add etab exch getu16\n", "dup 0 ne{delta add 65535 and}if putglyph\n", @@ -2780,7 +2821,7 @@ "[4 1 roll\n", "{\n", "4 2 roll\n", -"excp mul add\n", +"exp mul add\n", "}aload pop\n", "]cvx\n", "}{\n", @@ -2958,7 +2999,7 @@ "dup 0 get/CalGray eq{\n", "1 get\n", "dup/Gamma//knownget exec{\n", -"[exch/exp load]cvx\n", +"[exch[exch/exp load]cvx dup dup]\n", "1 index exch/DecodeLMN exch put\n", "}if\n", "[exch/CIEBasedA exch]\n", @@ -3098,6 +3139,13 @@ "2 copy 3 exch put\n", "pop\n", "}if\n", +"dup 0 get/Pattern eq{\n", +"dup length 1 gt{dup\n", +"1 get dup type/arraytype eq{\n", +"ResolveColorSpaceArray\n", +"1 index 1 3 -1 roll put\n", +"}{pop}ifelse}if\n", +"}if\n", "PDFR_DEBUG{\n", "(Construcrted color space :)=\n", "dup ==\n", diff -Nru ghostscript-9.04~dfsg/base/openjpeg.mak ghostscript-9.05~dfsg~20120125/base/openjpeg.mak --- ghostscript-9.04~dfsg/base/openjpeg.mak 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/openjpeg.mak 2011-09-29 11:01:33.000000000 +0000 @@ -0,0 +1,166 @@ +# Copyright (C) 2006 Artifex Software, Inc. +# All Rights Reserved. +# +# This software is provided AS-IS with no warranty, either express or +# implied. +# +# This software is distributed under license and may not be copied, modified +# or distributed except as expressly authorized under the terms of that +# license. Refer to licensing information at http://www.artifex.com/ +# or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, +# San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. +# +# $Id$ + +# makefile for Luratech lwf_jp2 library code. +# Users of this makefile must define the following: +# SHARE_JPX - whether to compile in or link to the library +# JPXSRCDIR - the library source directory +# +# gs.mak and friends define the following: +# JPXOBJDIR - the output obj directory +# JPXGENDIR - generated (.dev) file directory +# JPX_OPENJPEG_I_ - include path for the library headers +# JPXCF_ - cflags for building the library +# +# We define the openjpeg.dev target and its dependencies +# +# This partial makefile compiles the openjpeg library for use in +# Ghostscript. + +OPEN_JPEG_MAK=$(GLSRC)openjpeg.mak + +OPEN_JPEG_SRC=$(JPXSRCDIR)$(D)libopenjpeg$(D) +OPEN_JPEG_GEN=$(JPXOBJDIR)$(D) + +OPEN_JPEG_PREFIX=opj_ +OPEN_JPEG_OBJ=$(JPXOBJDIR)$(D) +OPEN_JPEG_CONFIG_H=$(OPEN_JPEG_GEN)opj_config.h + + +# source files to build from the CSDK source + +open_jpeg_OBJS = \ + $(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)bio.$(OBJ) \ + $(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)cio.$(OBJ) \ + $(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)dwt.$(OBJ) \ + $(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)event.$(OBJ) \ + $(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)image.$(OBJ) \ + $(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)j2k.$(OBJ) \ + $(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)j2k_lib.$(OBJ) \ + $(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)jp2.$(OBJ) \ + $(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)jpt.$(OBJ) \ + $(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)mct.$(OBJ) \ + $(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)mqc.$(OBJ) \ + $(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)openjpeg.$(OBJ) \ + $(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)pi.$(OBJ) \ + $(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)raw.$(OBJ) \ + $(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)t1.$(OBJ) \ + $(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)t2.$(OBJ) \ + $(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)tcd.$(OBJ) \ + $(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)tgt.$(OBJ) \ + +open_jpeg_HDRS = \ + $(OPEN_JPEG_SRC)bio.h \ + $(OPEN_JPEG_SRC)cio.h \ + $(OPEN_JPEG_SRC)dwt.h \ + $(OPEN_JPEG_SRC)event.h \ + $(OPEN_JPEG_SRC)fix.h \ + $(OPEN_JPEG_SRC)image.h \ + $(OPEN_JPEG_SRC)int.h \ + $(OPEN_JPEG_SRC)j2k.h \ + $(OPEN_JPEG_SRC)j2k_lib.h \ + $(OPEN_JPEG_SRC)jp2.h \ + $(OPEN_JPEG_SRC)jpt.h \ + $(OPEN_JPEG_SRC)mct.h \ + $(OPEN_JPEG_SRC)mqc.h \ + $(OPEN_JPEG_SRC)openjpeg.h \ + $(OPEN_JPEG_SRC)opj_includes.h \ + $(OPEN_JPEG_SRC)opj_malloc.h \ + $(OPEN_JPEG_SRC)pi.h \ + $(OPEN_JPEG_SRC)raw.h \ + $(OPEN_JPEG_SRC)t1.h \ + $(OPEN_JPEG_SRC)t1_luts.h \ + $(OPEN_JPEG_SRC)t2.h \ + $(OPEN_JPEG_SRC)tcd.h \ + $(OPEN_JPEG_SRC)tgt.h \ + +$(OPEN_JPEG_CONFIG_H): $(TOP_MAKEFILES) $(JPXSRCDIR)$(D)opj_config.h.in.user + $(CP_) $(JPXSRCDIR)$(D)opj_config.h.in.user $(OPEN_JPEG_CONFIG_H) + +# switch in the selected library .dev +$(OPEN_JPEG_GEN)openjpeg.dev : $(TOP_MAKEFILES) $(OPEN_JPEG_GEN)openjpeg_$(SHARE_JPX).dev + $(CP_) $(OPEN_JPEG_GEN)openjpeg_$(SHARE_JPX).dev $(OPEN_JPEG_GEN)openjpeg.dev + +# external link .dev +$(OPEN_JPEG_GEN)openjpeg_1.dev : $(TOP_MAKEFILES) $(OPEN_JPEG_MAK) $(ECHOGS_XE) + $(SETMOD) $(OPEN_JPEG_GEN)openjpeg_1 -lib lib_openjpeg + +# compile our own .dev +$(OPEN_JPEG_GEN)openjpeg_0.dev : $(TOP_MAKEFILES) $(OPEN_JPEG_MAK) $(ECHOGS_XE) $(open_jpeg_OBJS) + $(SETMOD) $(OPEN_JPEG_GEN)openjpeg_0 $(open_jpeg_OBJS) + +# define our specific compiler +OPEN_JPEG_CC=$(CC) $(CFLAGS) $(D_)OPJ_STATIC$(_D) $(I_)$(OPEN_JPEG_GEN)$(_I) $(I_)$(JPX_OPENJPEG_I_)$(_I) $(I_)$(JPX_OPENJPEG_I_)$(D)..$(_I) $(JPXCF_) +OPEN_JPEG_O=$(O_)$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX) + +OPEN_JPEG_DEP=$(AK) $(OPEN_JPEG_MAK) + +# explicit rules for building each source file +# for simplicity we have every source file depend on all headers + +$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)bio.$(OBJ) : $(OPEN_JPEG_SRC)bio.c $(OPEN_JPEG_DEP) $(open_jpeg_HDRS) $(OPEN_JPEG_CONFIG_H) + $(OPEN_JPEG_CC) $(OPEN_JPEG_O)bio.$(OBJ) $(C_) $(OPEN_JPEG_SRC)bio.c + +$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)cio.$(OBJ) : $(OPEN_JPEG_SRC)cio.c $(OPEN_JPEG_DEP) $(open_jpeg_HDRS) $(OPEN_JPEG_CONFIG_H) + $(OPEN_JPEG_CC) $(OPEN_JPEG_O)cio.$(OBJ) $(C_) $(OPEN_JPEG_SRC)cio.c + +$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)dwt.$(OBJ) : $(OPEN_JPEG_SRC)dwt.c $(OPEN_JPEG_DEP) $(open_jpeg_HDRS) $(OPEN_JPEG_CONFIG_H) + $(OPEN_JPEG_CC) $(OPEN_JPEG_O)dwt.$(OBJ) $(C_) $(OPEN_JPEG_SRC)dwt.c + +$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)event.$(OBJ) : $(OPEN_JPEG_SRC)event.c $(OPEN_JPEG_DEP) $(open_jpeg_HDRS) $(OPEN_JPEG_CONFIG_H) + $(OPEN_JPEG_CC) $(OPEN_JPEG_O)event.$(OBJ) $(C_) $(OPEN_JPEG_SRC)event.c + +$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)image.$(OBJ) : $(OPEN_JPEG_SRC)image.c $(OPEN_JPEG_DEP) $(open_jpeg_HDRS) $(OPEN_JPEG_CONFIG_H) + $(OPEN_JPEG_CC) $(OPEN_JPEG_O)image.$(OBJ) $(C_) $(OPEN_JPEG_SRC)image.c + +$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)j2k.$(OBJ) : $(OPEN_JPEG_SRC)j2k.c $(OPEN_JPEG_DEP) $(open_jpeg_HDRS) $(OPEN_JPEG_CONFIG_H) + $(OPEN_JPEG_CC) $(OPEN_JPEG_O)j2k.$(OBJ) $(C_) $(OPEN_JPEG_SRC)j2k.c + +$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)j2k_lib.$(OBJ) : $(OPEN_JPEG_SRC)j2k_lib.c $(OPEN_JPEG_DEP) $(open_jpeg_HDRS) $(OPEN_JPEG_CONFIG_H) + $(OPEN_JPEG_CC) $(OPEN_JPEG_O)j2k_lib.$(OBJ) $(C_) $(OPEN_JPEG_SRC)j2k_lib.c + +$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)jp2.$(OBJ) : $(OPEN_JPEG_SRC)jp2.c $(OPEN_JPEG_DEP) $(open_jpeg_HDRS) $(OPEN_JPEG_CONFIG_H) + $(OPEN_JPEG_CC) $(OPEN_JPEG_O)jp2.$(OBJ) $(C_) $(OPEN_JPEG_SRC)jp2.c + +$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)jpt.$(OBJ) : $(OPEN_JPEG_SRC)jpt.c $(OPEN_JPEG_DEP) $(open_jpeg_HDRS) $(OPEN_JPEG_CONFIG_H) + $(OPEN_JPEG_CC) $(OPEN_JPEG_O)jpt.$(OBJ) $(C_) $(OPEN_JPEG_SRC)jpt.c + +$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)mct.$(OBJ) : $(OPEN_JPEG_SRC)mct.c $(OPEN_JPEG_DEP) $(open_jpeg_HDRS) $(OPEN_JPEG_CONFIG_H) + $(OPEN_JPEG_CC) $(OPEN_JPEG_O)mct.$(OBJ) $(C_) $(OPEN_JPEG_SRC)mct.c + +$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)mqc.$(OBJ) : $(OPEN_JPEG_SRC)mqc.c $(OPEN_JPEG_DEP) $(open_jpeg_HDRS) $(OPEN_JPEG_CONFIG_H) + $(OPEN_JPEG_CC) $(OPEN_JPEG_O)mqc.$(OBJ) $(C_) $(OPEN_JPEG_SRC)mqc.c + +$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)openjpeg.$(OBJ) : $(OPEN_JPEG_SRC)openjpeg.c $(OPEN_JPEG_DEP) $(open_jpeg_HDRS) $(OPEN_JPEG_CONFIG_H) + $(OPEN_JPEG_CC) $(OPEN_JPEG_O)openjpeg.$(OBJ) $(C_) $(OPEN_JPEG_SRC)openjpeg.c + +$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)pi.$(OBJ) : $(OPEN_JPEG_SRC)pi.c $(OPEN_JPEG_DEP) $(open_jpeg_HDRS) $(OPEN_JPEG_CONFIG_H) + $(OPEN_JPEG_CC) $(OPEN_JPEG_O)pi.$(OBJ) $(C_) $(OPEN_JPEG_SRC)pi.c + +$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)raw.$(OBJ) : $(OPEN_JPEG_SRC)raw.c $(OPEN_JPEG_DEP) $(open_jpeg_HDRS) $(OPEN_JPEG_CONFIG_H) + $(OPEN_JPEG_CC) $(OPEN_JPEG_O)raw.$(OBJ) $(C_) $(OPEN_JPEG_SRC)raw.c + +$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)t1.$(OBJ) : $(OPEN_JPEG_SRC)t1.c $(OPEN_JPEG_DEP) $(open_jpeg_HDRS) $(OPEN_JPEG_CONFIG_H) + $(OPEN_JPEG_CC) $(OPEN_JPEG_O)t1.$(OBJ) $(C_) $(OPEN_JPEG_SRC)t1.c + +$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)t2.$(OBJ) : $(OPEN_JPEG_SRC)t2.c $(OPEN_JPEG_DEP) $(open_jpeg_HDRS) $(OPEN_JPEG_CONFIG_H) + $(OPEN_JPEG_CC) $(OPEN_JPEG_O)t2.$(OBJ) $(C_) $(OPEN_JPEG_SRC)t2.c + +$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)tcd.$(OBJ) : $(OPEN_JPEG_SRC)tcd.c $(OPEN_JPEG_DEP) $(open_jpeg_HDRS) $(OPEN_JPEG_CONFIG_H) + $(OPEN_JPEG_CC) $(OPEN_JPEG_O)tcd.$(OBJ) $(C_) $(OPEN_JPEG_SRC)tcd.c + +$(OPEN_JPEG_OBJ)$(OPEN_JPEG_PREFIX)tgt.$(OBJ) : $(OPEN_JPEG_SRC)tgt.c $(OPEN_JPEG_DEP) $(open_jpeg_HDRS) $(OPEN_JPEG_CONFIG_H) + $(OPEN_JPEG_CC) $(OPEN_JPEG_O)tgt.$(OBJ) $(C_) $(OPEN_JPEG_SRC)tgt.c + +# end of file diff -Nru ghostscript-9.04~dfsg/base/openvms.mak ghostscript-9.05~dfsg~20120125/base/openvms.mak --- ghostscript-9.04~dfsg/base/openvms.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/openvms.mak 2012-01-25 08:44:24.000000000 +0000 @@ -141,7 +141,7 @@ # Which CMS are we using? # Options are currently lcms or lcms2 -WHICH_CMS=lcms +WHICH_CMS=lcms2 # IJS has not been ported to OpenVMS. If you do the port, # you'll need to set these values. You'll also need to @@ -154,11 +154,6 @@ #IJSSRCDIR=[.ijs] #IJSEXECTYPE=unix -# Define the directory where the imdi source are stored. -# See imdi.mak for more information - -IMDISRCDIR=[.imdi] - # Note that built-in third-party libraries aren't available. SHARE_JPEG=0 @@ -239,7 +234,7 @@ DEVICE_DEVS13=$(DD)pngmono.dev $(DD)pngmonod.dev $(DD)pnggray.dev $(DD)png16.dev $(DD)png256.dev $(DD)png16m.dev $(DD)pngalpha.dev DEVICE_DEVS14=$(DD)jpeg.dev $(DD)jpeggray.dev $(DD)jpegcmyk.dev DEVICE_DEVS15=$(DD)pdfwrite.dev $(DD)pswrite.dev $(DD)ps2write.dev $(DD)epswrite.dev $(DD)txtwrite.dev $(DD)pxlmono.dev $(DD)pxlcolor.dev -DEVICE_DEVS16=$(DD)bbox.dev +DEVICE_DEVS16=$(DD)bbox.dev $(DD)inkcov.dev # Overflow from DEVS9 DEVICE_DEVS17=$(DD)pnm.dev $(DD)pnmraw.dev $(DD)ppm.dev $(DD)ppmraw.dev $(DD)pkm.dev $(DD)pkmraw.dev $(DD)pksm.dev $(DD)pksmraw.dev $(DD)pamcmyk32.dev DEVICE_DEVS18= diff -Nru ghostscript-9.04~dfsg/base/rinkj/rinkj-epson870.c ghostscript-9.05~dfsg~20120125/base/rinkj/rinkj-epson870.c --- ghostscript-9.04~dfsg/base/rinkj/rinkj-epson870.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/rinkj/rinkj-epson870.c 2011-11-12 18:29:08.000000000 +0000 @@ -897,7 +897,13 @@ z->vertpos = ysc; - if (status < 0) return status; + if (status < 0) + { + free (thisbuf); + if (rle) + free (compress_buf); + return status; + } for (i = 0; i < z->num_chan; i++) { @@ -920,7 +926,13 @@ (x >> 16) & 0xff, (x >> 24) & 0xff); - if (status < 0) return status; + if (status < 0) + { + free(thisbuf); + if (rle) + free(compress_buf); + return status; + } } status = rinkj_byte_stream_printf (z->out, "\033i%c%c%c%c%c%c%c", @@ -930,7 +942,13 @@ xsb_out & 0xff, (xsb_out >> 8) & 0xff, m & 0xff, m >> 8); - if (status < 0) return status; + if (status < 0) + { + free(thisbuf); + if (rle) + free(compress_buf); + return status; + } for (j = 0; j < m; j++) { const char *line; diff -Nru ghostscript-9.04~dfsg/base/saes.c ghostscript-9.05~dfsg~20120125/base/saes.c --- ghostscript-9.04~dfsg/base/saes.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/saes.c 2011-09-29 11:01:34.000000000 +0000 @@ -17,7 +17,6 @@ #include "memory_.h" #include "gserrors.h" -#include "gserror.h" #include "strimpl.h" #include "saes.h" diff -Nru ghostscript-9.04~dfsg/base/sarc4.c ghostscript-9.05~dfsg~20120125/base/sarc4.c --- ghostscript-9.04~dfsg/base/sarc4.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sarc4.c 2011-09-29 11:01:34.000000000 +0000 @@ -17,7 +17,6 @@ #include "memory_.h" #include "gserrors.h" -#include "gserror.h" #include "strimpl.h" #include "sarc4.h" diff -Nru ghostscript-9.04~dfsg/base/scfparam.c ghostscript-9.05~dfsg~20120125/base/scfparam.c --- ghostscript-9.04~dfsg/base/scfparam.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/scfparam.c 2011-09-29 11:01:34.000000000 +0000 @@ -14,7 +14,6 @@ /* $Id$ */ /* CCITTFax filter parameter setting and reading */ #include "std.h" -#include "gserror.h" #include "gserrors.h" #include "gstypes.h" #include "gsmemory.h" diff -Nru ghostscript-9.04~dfsg/base/scommon.h ghostscript-9.05~dfsg~20120125/base/scommon.h --- ghostscript-9.04~dfsg/base/scommon.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/scommon.h 2011-11-12 18:29:08.000000000 +0000 @@ -157,7 +157,7 @@ */ #define STREAM_MAX_ERROR_STRING 79 #define stream_state_common\ - const stream_template *template;\ + const stream_template *templat;\ gs_memory_t *memory;\ stream_proc_report_error((*report_error));\ int min_left; /* required bytes for lookahead */ \ diff -Nru ghostscript-9.04~dfsg/base/sdcparam.c ghostscript-9.05~dfsg~20120125/base/sdcparam.c --- ghostscript-9.04~dfsg/base/sdcparam.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sdcparam.c 2011-11-12 18:29:08.000000000 +0000 @@ -15,7 +15,6 @@ /* DCT filter parameter setting and reading */ #include "memory_.h" #include "jpeglib_.h" -#include "gserror.h" #include "gserrors.h" #include "gstypes.h" #include "gsmemory.h" @@ -504,12 +503,12 @@ /* Put Huffman tables. */ static int find_huff_values(JHUFF_TBL ** table_ptrs, int num_tables, - const UINT8 counts[16], const UINT8 * values, int codes_size) + const UINT8 * counts, const UINT8 * values, int codes_size) { int j; for (j = 0; j < num_tables; ++j) - if (!memcmp(table_ptrs[j]->bits, counts, sizeof(counts)) && + if (!memcmp(table_ptrs[j]->bits, counts, 16*sizeof(counts[0])) && !memcmp(table_ptrs[j]->huffval, values, codes_size * sizeof(values[0]))) break; diff -Nru ghostscript-9.04~dfsg/base/sdctd.c ghostscript-9.05~dfsg~20120125/base/sdctd.c --- ghostscript-9.04~dfsg/base/sdctd.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sdctd.c 2011-11-12 18:29:08.000000000 +0000 @@ -101,6 +101,40 @@ return 0; } +static int +compact_jpeg_buffer(stream_cursor_read *pr) +{ + byte *o, *i; + + /* Search backwards from the end for 2 consecutive 0xFFs */ + o = (byte *)pr->limit; + while (o - pr->ptr >= 2) { + if (*o-- == 0xFF) { + if (*o == 0xFF) + goto compact; + o--; + } + } + return 0; +compact: + i = o-1; + do { + /* Skip i backwards over 0xFFs */ + while ((i != pr->ptr) && (*i == 0xFF)) + i--; + /* Repeatedly copy from i to o */ + while (i != pr->ptr) { + byte c = *i--; + *o-- = c; + if (c == 0xFF) + break; + } + } while (i != pr->ptr); + + pr->ptr = o; + return o - i; +} + /* Process a buffer */ static int s_DCTD_process(stream_state * st, stream_cursor_read * pr, @@ -186,8 +220,8 @@ if_debug4('w', "[wdd]width=%u, components=%d, scan_line_size=%u, min_out_size=%u\n", jddp->dinfo.output_width, jddp->dinfo.output_components, - ss->scan_line_size, jddp->template.min_out_size); - if (ss->scan_line_size > (uint) jddp->template.min_out_size) { + ss->scan_line_size, jddp->templat.min_out_size); + if (ss->scan_line_size > (uint) jddp->templat.min_out_size) { /* Create a spare buffer for oversize scanline */ jddp->scanline_buffer = gs_alloc_bytes_immovable(gs_memory_stable(jddp->memory), @@ -236,8 +270,25 @@ (int)jddp->faked_eoi); pr->ptr = (jddp->faked_eoi ? pr->limit : src->next_input_byte - 1); - if (!read) + if (!read) { + /* We are suspending. If nothing was consumed, and the + * buffer was full, compact the data in the buffer. If + * this fails to save anything, then we'll never succeed; + * throw an error to avoid an infinite loop. + * The tricky part here is knowing "if the buffer is + * full"; we do that by comparing the number of bytes in + * the buffer with the min_in_size set for the stream. + */ + /* TODO: If we ever find a file with valid data that trips + * this test, we should implement a scheme whereby we keep + * a local buffer and copy the data into it. The local + * buffer can be grown as required. */ + if ((src->next_input_byte-1 == pr->ptr) && + (pr->limit - pr->ptr >= ss->templat->min_in_size) && + (compact_jpeg_buffer(pr) == 0)) + return ERRC; return 0; /* need more data */ + } if (jddp->scanline_buffer != NULL) { jddp->bytes_in_scanline = ss->scan_line_size; goto dumpbuffer; @@ -276,7 +327,7 @@ gs_free_object(ss->data.common->memory, ss->data.decompress, "s_DCTD_release"); /* Switch the template pointer back in case we still need it. */ - st->template = &s_DCTD_template; + st->templat = &s_DCTD_template; } /* Stream template */ diff -Nru ghostscript-9.04~dfsg/base/sdcte.c ghostscript-9.05~dfsg~20120125/base/sdcte.c --- ghostscript-9.04~dfsg/base/sdcte.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sdcte.c 2011-12-08 09:35:23.000000000 +0000 @@ -23,6 +23,9 @@ #include "sdct.h" #include "sjpeg.h" +#define ICC_OVERHEAD 16 +#define MAX_MARKER_DATA_SIZE (65535 - ICC_OVERHEAD) + public_st_jpeg_compress_data(); /* ------ DCTEncode ------ */ @@ -69,6 +72,8 @@ ss->data.common->memory = ss->jpeg_memory; ss->data.compress->cinfo.dest = dest; ss->phase = 0; + ss->icc_marker = 0; + ss->icc_position = -1; return 0; } @@ -128,7 +133,71 @@ dest->free_in_buffer = pw->limit - pw->ptr; ss->phase = 3; /* falls through */ - case 3: /* markers written, processing data */ + case 3: + /* If we have it, then write out the ICC profile */ + /* Due to size limitations allowed in APP0 markers, the profile + may have to be written in mutiple markers */ + if (ss->icc_profile != NULL) { + static const char marker[2] = {0xFF, 0xE2}; /* JPEG_APP0 + 2 */ + byte num_mark; + + /* Number of markers */ + num_mark = ss->icc_profile->buffer_size / MAX_MARKER_DATA_SIZE; + if (num_mark * MAX_MARKER_DATA_SIZE < ss->icc_profile->buffer_size) { + num_mark++; + } + while (ss->icc_marker < num_mark) { + ulong offset = ss->icc_marker * MAX_MARKER_DATA_SIZE; + ulong size; + + size = ss->icc_profile->buffer_size - offset; + if (size > MAX_MARKER_DATA_SIZE) + size = MAX_MARKER_DATA_SIZE; + + /* In this case we are just getting started with the + header of the marker. Write that portion out */ + if (ss->icc_position == -1) { + byte length_byte[2]; + byte curr_mark = ss->icc_marker + 1; + ulong total_length; + + if ((uint) (pw->limit - pw->ptr) < (sizeof(marker) + ICC_OVERHEAD)) + return 1; + total_length = size + ICC_OVERHEAD; + memcpy(pw->ptr + 1, marker, sizeof(marker)); + length_byte[0] = total_length >> 8; + length_byte[1] = total_length & 0xFF; + memcpy(pw->ptr + 3, length_byte, sizeof(length_byte)); + memcpy(pw->ptr + 5, "ICC_PROFILE", 12); /* Null included */ + memcpy(pw->ptr + 17, &curr_mark, 1); + memcpy(pw->ptr + 18, &num_mark, 1); + pw->ptr += sizeof(marker) + ICC_OVERHEAD; + ss->icc_position = 0; + } + /* Now write out the actual profile data */ + while (ss->icc_position < size) { + ulong avail_bytes, num_bytes; + + avail_bytes = (ulong) (pw->limit - pw->ptr); + if (avail_bytes == 0) + return 1; + num_bytes = (size - ss->icc_position); + if (num_bytes > avail_bytes) + num_bytes = avail_bytes; + memcpy(pw->ptr + 1, ss->icc_profile->buffer + offset + ss->icc_position, num_bytes); + ss->icc_position += num_bytes; + pw->ptr += num_bytes; + } + /* Move on to the next marker */ + ++ss->icc_marker; + ss->icc_position = -1; + } + dest->next_output_byte = pw->ptr + 1; + dest->free_in_buffer = pw->limit - pw->ptr; + } + ss->phase = 4; + /* falls through */ + case 4: /* markers written, processing data */ while (jcdp->cinfo.image_height > jcdp->cinfo.next_scanline) { int written; @@ -161,9 +230,9 @@ return 1; /* output full */ pr->ptr += ss->scan_line_size; } - ss->phase = 4; + ss->phase = 5; /* falls through */ - case 4: /* all data processed, finishing */ + case 5: /* all data processed, finishing */ /* jpeg_finish_compress can't suspend, so write its output * to a fixed-size internal buffer. */ @@ -174,9 +243,9 @@ jcdp->fcb_size = dest->next_output_byte - jcdp->finish_compress_buf; jcdp->fcb_pos = 0; - ss->phase = 5; + ss->phase = 6; /* falls through */ - case 5: /* copy the final data to the output */ + case 6: /* copy the final data to the output */ if (jcdp->fcb_pos < jcdp->fcb_size) { int count = min(jcdp->fcb_size - jcdp->fcb_pos, pw->limit - pw->ptr); @@ -205,7 +274,7 @@ gs_free_object(ss->data.common->memory, ss->data.compress, "s_DCTE_release"); /* Switch the template pointer back in case we still need it. */ - st->template = &s_DCTE_template; + st->templat = &s_DCTE_template; } /* Stream template */ diff -Nru ghostscript-9.04~dfsg/base/sdct.h ghostscript-9.05~dfsg~20120125/base/sdct.h --- ghostscript-9.04~dfsg/base/sdct.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sdct.h 2011-12-08 09:35:23.000000000 +0000 @@ -19,6 +19,7 @@ # define sdct_INCLUDED #include "setjmp_.h" /* for jmp_buf */ +#include "gscms.h" /* ------ DCT filters ------ */ @@ -45,7 +46,7 @@ #define jpeg_stream_data_common\ /* We put a copy of the stream template here, because */\ /* the minimum buffer sizes depend on the image parameters. */\ - stream_template template;\ + stream_template templat;\ struct jpeg_error_mgr err;\ gsfix_jmp_buf exit_jmpbuf;\ gs_memory_t *memory; /* heap for library allocations */\ @@ -115,6 +116,10 @@ jpeg_compress_data *compress; jpeg_decompress_data *decompress; } data; + /* ICC Profile information */ + cmm_profile_t *icc_profile; /* This pointer is NOT in GC memory */ + byte icc_marker; + ulong icc_position; /* DCTEncode sets this before initialization; * DCTDecode cannot set it until the JPEG headers are read. */ diff -Nru ghostscript-9.04~dfsg/base/sddparam.c ghostscript-9.05~dfsg~20120125/base/sddparam.c --- ghostscript-9.04~dfsg/base/sddparam.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sddparam.c 2011-09-29 11:01:34.000000000 +0000 @@ -15,7 +15,6 @@ /* DCTDecode filter parameter setting and reading */ #include "std.h" #include "jpeglib_.h" -#include "gserror.h" #include "gserrors.h" #include "gstypes.h" #include "gsmemory.h" diff -Nru ghostscript-9.04~dfsg/base/sdeparam.c ghostscript-9.05~dfsg~20120125/base/sdeparam.c --- ghostscript-9.04~dfsg/base/sdeparam.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sdeparam.c 2011-09-29 11:01:34.000000000 +0000 @@ -15,7 +15,6 @@ /* DCTEncode filter parameter setting and reading */ #include "memory_.h" #include "jpeglib_.h" -#include "gserror.h" #include "gserrors.h" #include "gstypes.h" #include "gsmemory.h" diff -Nru ghostscript-9.04~dfsg/base/sfxcommon.c ghostscript-9.05~dfsg~20120125/base/sfxcommon.c --- ghostscript-9.04~dfsg/base/sfxcommon.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sfxcommon.c 2011-09-29 11:01:34.000000000 +0000 @@ -18,7 +18,6 @@ #include "unistd_.h" #include "gsmemory.h" #include "gp.h" -#include "gserror.h" #include "gserrors.h" #include "stream.h" diff -Nru ghostscript-9.04~dfsg/base/sfxstdio.c ghostscript-9.05~dfsg~20120125/base/sfxstdio.c --- ghostscript-9.04~dfsg/base/sfxstdio.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sfxstdio.c 2011-09-29 11:01:34.000000000 +0000 @@ -20,7 +20,6 @@ #include "gdebug.h" #include "gpcheck.h" #include "gp.h" -#include "gserror.h" #include "gserrors.h" #include "stream.h" #include "strimpl.h" diff -Nru ghostscript-9.04~dfsg/base/sha2.c ghostscript-9.05~dfsg~20120125/base/sha2.c --- ghostscript-9.04~dfsg/base/sha2.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sha2.c 2012-01-07 20:18:22.000000000 +0000 @@ -241,8 +241,8 @@ * only. */ void SHA512_Last(SHA512_CTX*); -void SHA256_Transform(SHA256_CTX*, const sha2_word32*); -void SHA512_Transform(SHA512_CTX*, const sha2_word64*); +void pSHA256_Transform(SHA256_CTX*, const sha2_word32*); +void pSHA512_Transform(SHA512_CTX*, const sha2_word64*); /*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/ /* Hash constant words K for SHA-256: */ @@ -352,7 +352,7 @@ static const char *sha2_hex_digits = "0123456789abcdef"; /*** SHA-256: *********************************************************/ -void SHA256_Init(SHA256_CTX* context) { +void pSHA256_Init(SHA256_CTX* context) { if (context == (SHA256_CTX*)0) { return; } @@ -397,7 +397,7 @@ (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \ j++ -void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) { +void pSHA256_Transform(SHA256_CTX* context, const sha2_word32* data) { sha2_word32 a, b, c, d, e, f, g, h, s0, s1; sha2_word32 T1, *W256; int j; @@ -455,7 +455,7 @@ #else /* SHA2_UNROLL_TRANSFORM */ -void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) { +void pSHA256_Transform(SHA256_CTX* context, const sha2_word32* data) { sha2_word32 a, b, c, d, e, f, g, h, s0, s1; sha2_word32 T1, T2, *W256; int j; @@ -535,7 +535,7 @@ #endif /* SHA2_UNROLL_TRANSFORM */ -void SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) { +void pSHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) { unsigned int freespace, usedspace; if (len == 0) { @@ -557,7 +557,7 @@ context->bitcount += freespace << 3; len -= freespace; data += freespace; - SHA256_Transform(context, (sha2_word32*)context->buffer); + pSHA256_Transform(context, (sha2_word32*)context->buffer); } else { /* The buffer is not yet full */ MEMCPY_BCOPY(&context->buffer[usedspace], data, len); @@ -569,7 +569,7 @@ } while (len >= SHA256_BLOCK_LENGTH) { /* Process as many complete blocks as we can */ - SHA256_Transform(context, (sha2_word32*)data); + pSHA256_Transform(context, (sha2_word32*)data); context->bitcount += SHA256_BLOCK_LENGTH << 3; len -= SHA256_BLOCK_LENGTH; data += SHA256_BLOCK_LENGTH; @@ -583,7 +583,7 @@ usedspace = freespace = 0; } -void SHA256_Final(sha2_byte digest[], SHA256_CTX* context) { +void pSHA256_Final(sha2_byte digest[], SHA256_CTX* context) { sha2_word32 *d = (sha2_word32*)digest; unsigned int usedspace; @@ -609,7 +609,7 @@ MEMSET_BZERO(&context->buffer[usedspace], SHA256_BLOCK_LENGTH - usedspace); } /* Do second-to-last transform: */ - SHA256_Transform(context, (sha2_word32*)context->buffer); + pSHA256_Transform(context, (sha2_word32*)context->buffer); /* And set-up for the last transform: */ MEMSET_BZERO(context->buffer, SHA256_SHORT_BLOCK_LENGTH); @@ -625,7 +625,7 @@ *(sha2_word64*)&context->buffer[SHA256_SHORT_BLOCK_LENGTH] = context->bitcount; /* Final transform: */ - SHA256_Transform(context, (sha2_word32*)context->buffer); + pSHA256_Transform(context, (sha2_word32*)context->buffer); #if BYTE_ORDER == LITTLE_ENDIAN { @@ -642,7 +642,7 @@ } /* Clean up state data: */ - MEMSET_BZERO(context, sizeof(context)); + MEMSET_BZERO(context, sizeof(*context)); usedspace = 0; } @@ -654,7 +654,7 @@ assert(context != (SHA256_CTX*)0); if (buffer != (char*)0) { - SHA256_Final(digest, context); + pSHA256_Final(digest, context); for (i = 0; i < SHA256_DIGEST_LENGTH; i++) { *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4]; @@ -663,7 +663,7 @@ } *buffer = (char)0; } else { - MEMSET_BZERO(context, sizeof(context)); + MEMSET_BZERO(context, sizeof(*context)); } MEMSET_BZERO(digest, SHA256_DIGEST_LENGTH); return buffer; @@ -672,8 +672,8 @@ char* SHA256_Data(const sha2_byte* data, size_t len, char digest[SHA256_DIGEST_STRING_LENGTH]) { SHA256_CTX context; - SHA256_Init(&context); - SHA256_Update(&context, data, len); + pSHA256_Init(&context); + pSHA256_Update(&context, data, len); return SHA256_End(&context, digest); } @@ -722,7 +722,7 @@ (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \ j++ -void SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) { +void pSHA512_Transform(SHA512_CTX* context, const sha2_word64* data) { sha2_word64 a, b, c, d, e, f, g, h, s0, s1; sha2_word64 T1, *W512 = (sha2_word64*)context->buffer; int j; @@ -777,7 +777,7 @@ #else /* SHA2_UNROLL_TRANSFORM */ -void SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) { +void pSHA512_Transform(SHA512_CTX* context, const sha2_word64* data) { sha2_word64 a, b, c, d, e, f, g, h, s0, s1; sha2_word64 T1, T2, *W512 = (sha2_word64*)context->buffer; int j; @@ -877,7 +877,7 @@ ADDINC128(context->bitcount, freespace << 3); len -= freespace; data += freespace; - SHA512_Transform(context, (sha2_word64*)context->buffer); + pSHA512_Transform(context, (sha2_word64*)context->buffer); } else { /* The buffer is not yet full */ MEMCPY_BCOPY(&context->buffer[usedspace], data, len); @@ -889,7 +889,7 @@ } while (len >= SHA512_BLOCK_LENGTH) { /* Process as many complete blocks as we can */ - SHA512_Transform(context, (sha2_word64*)data); + pSHA512_Transform(context, (sha2_word64*)data); ADDINC128(context->bitcount, SHA512_BLOCK_LENGTH << 3); len -= SHA512_BLOCK_LENGTH; data += SHA512_BLOCK_LENGTH; @@ -924,7 +924,7 @@ MEMSET_BZERO(&context->buffer[usedspace], SHA512_BLOCK_LENGTH - usedspace); } /* Do second-to-last transform: */ - SHA512_Transform(context, (sha2_word64*)context->buffer); + pSHA512_Transform(context, (sha2_word64*)context->buffer); /* And set-up for the last transform: */ MEMSET_BZERO(context->buffer, SHA512_BLOCK_LENGTH - 2); @@ -941,7 +941,7 @@ *(sha2_word64*)&context->buffer[SHA512_SHORT_BLOCK_LENGTH+8] = context->bitcount[0]; /* Final transform: */ - SHA512_Transform(context, (sha2_word64*)context->buffer); + pSHA512_Transform(context, (sha2_word64*)context->buffer); } void SHA512_Final(sha2_byte digest[], SHA512_CTX* context) { @@ -970,7 +970,7 @@ } /* Zero out state data */ - MEMSET_BZERO(context, sizeof(context)); + MEMSET_BZERO(context, sizeof(*context)); } char *SHA512_End(SHA512_CTX* context, char buffer[]) { @@ -990,7 +990,7 @@ } *buffer = (char)0; } else { - MEMSET_BZERO(context, sizeof(context)); + MEMSET_BZERO(context, sizeof(*context)); } MEMSET_BZERO(digest, SHA512_DIGEST_LENGTH); return buffer; @@ -1044,7 +1044,7 @@ } /* Zero out state data */ - MEMSET_BZERO(context, sizeof(context)); + MEMSET_BZERO(context, sizeof(*context)); } char *SHA384_End(SHA384_CTX* context, char buffer[]) { @@ -1064,7 +1064,7 @@ } *buffer = (char)0; } else { - MEMSET_BZERO(context, sizeof(context)); + MEMSET_BZERO(context, sizeof(*context)); } MEMSET_BZERO(digest, SHA384_DIGEST_LENGTH); return buffer; diff -Nru ghostscript-9.04~dfsg/base/sha2.h ghostscript-9.05~dfsg~20120125/base/sha2.h --- ghostscript-9.04~dfsg/base/sha2.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sha2.h 2011-12-08 09:35:23.000000000 +0000 @@ -115,9 +115,9 @@ #ifndef NOPROTO #ifdef SHA2_USE_INTTYPES_H -void SHA256_Init(SHA256_CTX *); -void SHA256_Update(SHA256_CTX*, const uint8_t*, size_t); -void SHA256_Final(uint8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*); +void pSHA256_Init(SHA256_CTX *); +void pSHA256_Update(SHA256_CTX*, const uint8_t*, size_t); +void pSHA256_Final(uint8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*); char* SHA256_End(SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]); char* SHA256_Data(const uint8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]); @@ -135,9 +135,9 @@ #else /* SHA2_USE_INTTYPES_H */ -void SHA256_Init(SHA256_CTX *); -void SHA256_Update(SHA256_CTX*, const u_int8_t*, size_t); -void SHA256_Final(u_int8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*); +void pSHA256_Init(SHA256_CTX *); +void pSHA256_Update(SHA256_CTX*, const u_int8_t*, size_t); +void pSHA256_Final(u_int8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*); char* SHA256_End(SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]); char* SHA256_Data(const u_int8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]); @@ -157,9 +157,9 @@ #else /* NOPROTO */ -void SHA256_Init(); -void SHA256_Update(); -void SHA256_Final(); +void pSHA256_Init(); +void pSHA256_Update(); +void pSHA256_Final(); char* SHA256_End(); char* SHA256_Data(); diff -Nru ghostscript-9.04~dfsg/base/shcgen.c ghostscript-9.05~dfsg~20120125/base/shcgen.c --- ghostscript-9.04~dfsg/base/shcgen.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/shcgen.c 2011-09-29 11:01:34.000000000 +0000 @@ -18,7 +18,6 @@ #include "stdio_.h" #include /* for qsort */ #include "gdebug.h" -#include "gserror.h" #include "gserrors.h" #include "gsmemory.h" #include "scommon.h" diff -Nru ghostscript-9.04~dfsg/base/sidscale.c ghostscript-9.05~dfsg~20120125/base/sidscale.c --- ghostscript-9.04~dfsg/base/sidscale.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sidscale.c 2011-11-12 18:29:08.000000000 +0000 @@ -66,7 +66,7 @@ idownscale_x(void /* PixelIn */ * tmp, const void /* PixelIn */ *src, stream_ISpecialDownScale_state *const ss) { int c, i; - int Colors = ss->params.Colors; + int Colors = ss->params.spp_interp; int WidthIn = ss->params.WidthIn; int prev_y; int cur_y; @@ -148,7 +148,7 @@ idownscale_y(void /*PixelOut */ *dst, const void /* PixelIn */ *tmp, stream_ISpecialDownScale_state *const ss) { - int kn = ss->params.WidthOut * ss->params.Colors; + int kn = ss->params.WidthOut * ss->params.spp_interp; int kc; float scale = (float) ss->params.MaxValueOut/255.0; @@ -176,7 +176,7 @@ for ( kc = 0; kc < kn; ++kc, pp++ ) { if_debug1('W', " %d", *pp); - ((bits16 *)dst)[kc] = (*pp)*scale; + ((bits16 *)dst)[kc] = (bits16)((*pp)*scale); } } else { /* sizeofPixelIn == 2 */ const bits16 *pp = (bits16 *)tmp; @@ -216,8 +216,10 @@ ss->sizeofPixelIn = ss->params.BitsPerComponentIn / 8; ss->sizeofPixelOut = ss->params.BitsPerComponentOut / 8; - ss->src_size = ss->params.WidthIn * ss->sizeofPixelIn * ss->params.Colors; - ss->dst_size = ss->params.WidthOut * ss->sizeofPixelOut * ss->params.Colors; + ss->src_size = + ss->params.WidthIn * ss->sizeofPixelIn * ss->params.spp_interp; + ss->dst_size = + ss->params.WidthOut * ss->sizeofPixelOut * ss->params.spp_interp; /* Initialize destination DDAs. */ ss->dst_x = 0; @@ -228,13 +230,16 @@ dda_init(ss->dda_y, 0, ss->params.HeightOut, ss->params.HeightIn); /* create intermediate image to hold horizontal zoom */ - ss->tmp = gs_alloc_byte_array(mem, ss->params.WidthOut * ss->params.Colors, - ss->sizeofPixelIn, "image_scale tmp"); + ss->tmp = + gs_alloc_byte_array(mem, ss->params.WidthOut * ss->params.spp_interp, + ss->sizeofPixelIn, "image_scale tmp"); /* Allocate buffers for 1 row of source and destination. */ - ss->dst = gs_alloc_byte_array(mem, ss->params.WidthOut * ss->params.Colors, - ss->sizeofPixelOut, "image_scale dst"); - ss->src = gs_alloc_byte_array(mem, ss->params.WidthIn * ss->params.Colors, - ss->sizeofPixelIn, "image_scale src"); + ss->dst = + gs_alloc_byte_array(mem, ss->params.WidthOut * ss->params.spp_interp, + ss->sizeofPixelOut, "image_scale dst"); + ss->src = + gs_alloc_byte_array(mem, ss->params.WidthIn * ss->params.spp_interp, + ss->sizeofPixelIn, "image_scale src"); if (ss->tmp == 0 || ss->dst == 0 || ss->src == 0) { s_ISpecialDownScale_release(st); return ERRC; diff -Nru ghostscript-9.04~dfsg/base/siinterp.c ghostscript-9.05~dfsg~20120125/base/siinterp.c --- ghostscript-9.04~dfsg/base/siinterp.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/siinterp.c 2011-09-29 11:01:34.000000000 +0000 @@ -41,8 +41,8 @@ /* The client sets the params values before initialization. */ stream_image_scale_state_common; /* = state_common + params */ /* The init procedure sets the following. */ - int sizeofPixelIn; /* bytes per input pixel, 1 or 2 * Colors */ - int sizeofPixelOut; /* bytes per output pixel, 1 or 2 * Colors */ + int sizeofPixelIn; /* bytes per input pixel, 1 or 2 * spp_interp */ + int sizeofPixelOut; /* bytes per output pixel, 1 or 2 * spp_interp */ uint src_size; /* bytes per row of input */ uint dst_size; /* bytes per row of output */ void /*PixelOut */ *prev; /* previous row of input data in output fmt, */ @@ -75,9 +75,9 @@ gs_memory_t *mem = ss->memory; ss->sizeofPixelIn = - ss->params.BitsPerComponentIn / 8 * ss->params.Colors; + ss->params.BitsPerComponentIn / 8 * ss->params.spp_interp; ss->sizeofPixelOut = - ss->params.BitsPerComponentOut / 8 * ss->params.Colors; + ss->params.BitsPerComponentOut / 8 * ss->params.spp_interp; ss->src_size = ss->sizeofPixelIn * ss->params.WidthIn; ss->dst_size = ss->sizeofPixelOut * ss->params.WidthOut; @@ -106,7 +106,7 @@ (ss->params.MaxValueIn == ss->params.MaxValueOut ? SCALE_SAME : SCALE_8_8) : (ss->params.MaxValueIn == 255 && ss->params.MaxValueOut == frac_1 ? - (ss->params.Colors == 3 ? SCALE_8_16_BYTE2FRAC_3 : + (ss->params.spp_interp == 3 ? SCALE_8_16_BYTE2FRAC_3 : SCALE_8_16_BYTE2FRAC) : SCALE_8_16_GENERAL)) : (ss->params.BitsPerComponentOut == 8 ? SCALE_16_8 : @@ -150,14 +150,14 @@ break; case SCALE_8_8: case SCALE_8_8_ALIGNED: - for (c = ss->params.Colors; --c >= 0; ++in, ++out) + for (c = ss->params.spp_interp; --c >= 0; ++in, ++out) *out = (byte)(*in * ss->params.MaxValueOut / ss->params.MaxValueIn); break; case SCALE_8_16_BYTE2FRAC: case SCALE_8_16_BYTE2FRAC_ALIGNED: /* could be optimized */ case SCALE_8_16_BYTE2FRAC_3: /* could be optimized */ - for (c = ss->params.Colors; --c >= 0; ++in, out += 2) { + for (c = ss->params.spp_interp; --c >= 0; ++in, out += 2) { uint b = *in; uint value = byte2frac(b); @@ -178,7 +178,7 @@ break; case SCALE_8_16_GENERAL: case SCALE_8_16_GENERAL_ALIGNED: /* could be optimized */ - for (c = ss->params.Colors; --c >= 0; ++in, out += 2) { + for (c = ss->params.spp_interp; --c >= 0; ++in, out += 2) { uint value = *in * ss->params.MaxValueOut / ss->params.MaxValueIn; @@ -187,14 +187,14 @@ break; case SCALE_16_8: case SCALE_16_8_ALIGNED: - for (c = ss->params.Colors; --c >= 0; in += 2, ++out) + for (c = ss->params.spp_interp; --c >= 0; in += 2, ++out) *out = (byte)(*(const bits16 *)in * ss->params.MaxValueOut / ss->params.MaxValueIn); break; case SCALE_16_16: case SCALE_16_16_ALIGNED: /* could be optimized */ - for (c = ss->params.Colors; --c >= 0; in += 2, out += 2) { + for (c = ss->params.spp_interp; --c >= 0; in += 2, out += 2) { uint value = *(const bits16 *)in * ss->params.MaxValueOut / ss->params.MaxValueIn; diff -Nru ghostscript-9.04~dfsg/base/simscale.c ghostscript-9.05~dfsg~20120125/base/simscale.c --- ghostscript-9.04~dfsg/base/simscale.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/simscale.c 2011-09-29 11:01:34.000000000 +0000 @@ -16,7 +16,6 @@ #include "memory_.h" #include "gserrors.h" -#include "gserror.h" #include "strimpl.h" #include "sisparam.h" #include "simscale.h" diff -Nru ghostscript-9.04~dfsg/base/siscale.c ghostscript-9.05~dfsg~20120125/base/siscale.c --- ghostscript-9.04~dfsg/base/siscale.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/siscale.c 2011-09-29 11:01:34.000000000 +0000 @@ -30,7 +30,7 @@ /* Auxiliary structures. */ typedef struct { - float weight; /* float or scaled fraction */ + double weight; /* float or scaled fraction */ } CONTRIB; typedef struct { @@ -404,7 +404,7 @@ static void calculate_dst_contrib(stream_IScale_state * ss, int y) { - uint row_size = ss->params.WidthOut * ss->params.Colors; + uint row_size = ss->params.WidthOut * ss->params.spp_interp; int last_index = calculate_contrib(&ss->dst_next_list, ss->dst_items, (double)ss->params.EntireHeightOut / ss->params.EntireHeightIn, @@ -470,11 +470,13 @@ ss->sizeofPixelOut = ss->params.BitsPerComponentOut / 8; ss->src_y = 0; - ss->src_size = ss->params.WidthIn * ss->sizeofPixelIn * ss->params.Colors; + ss->src_size = + ss->params.WidthIn * ss->sizeofPixelIn * ss->params.spp_interp; ss->src_offset = 0; ss->dst_y = 0; ss->src_y_offset = ss->params.src_y_offset; - ss->dst_size = ss->params.WidthOut * ss->sizeofPixelOut * ss->params.Colors; + ss->dst_size = + ss->params.WidthOut * ss->sizeofPixelOut * ss->params.spp_interp; ss->dst_offset = 0; /* create intermediate image to hold horizontal zoom */ @@ -486,7 +488,7 @@ ss->tmp = (byte *) gs_alloc_byte_array(mem, ss->max_support, (ss->params.WidthOut * - ss->params.Colors * sizeof(float)), + ss->params.spp_interp * sizeof(float)), "image_scale tmp"); ss->contrib = (CLIST *) gs_alloc_byte_array(mem, max(ss->params.WidthOut, @@ -505,10 +507,12 @@ ss->max_support*2, sizeof(CONTRIB), "image_scale contrib_dst[*]"); /* Allocate buffers for 1 row of source and destination. */ - ss->dst = gs_alloc_byte_array(mem, ss->params.WidthOut * ss->params.Colors, - ss->sizeofPixelOut, "image_scale dst"); - ss->src = gs_alloc_byte_array(mem, ss->params.WidthIn * ss->params.Colors, - ss->sizeofPixelIn, "image_scale src"); + ss->dst = + gs_alloc_byte_array(mem, ss->params.WidthOut * ss->params.spp_interp, + ss->sizeofPixelOut, "image_scale dst"); + ss->src = + gs_alloc_byte_array(mem, ss->params.WidthIn * ss->params.spp_interp, + ss->sizeofPixelIn, "image_scale src"); if (ss->tmp == 0 || ss->contrib == 0 || ss->items == 0 || ss->dst_items == 0 || ss->dst == 0 || ss->src == 0 ) { @@ -521,7 +525,7 @@ (double)ss->params.EntireWidthOut / ss->params.EntireWidthIn, 0, 0, ss->params.WidthOut, ss->params.WidthIn, ss->params.WidthOut, ss->params.WidthIn, ss->params.WidthIn, - ss->params.Colors, 255. / ss->params.MaxValueIn, + ss->params.spp_interp, 255. / ss->params.MaxValueIn, horiz->filter_width, horiz->filter, horiz->min_scale); /* Prepare the weights for the first output row. */ @@ -593,8 +597,8 @@ } /* Apply filter to zoom vertically from tmp to dst. */ zoom_y(row, ss->sizeofPixelOut, ss->params.MaxValueOut, ss->tmp, - ss->params.WidthOut, ss->params.WidthOut, ss->params.Colors, - &ss->dst_next_list, ss->dst_items); + ss->params.WidthOut, ss->params.WidthOut, + ss->params.spp_interp, &ss->dst_next_list, ss->dst_items); /* Idiotic C coercion rules allow T* and void* to be */ /* inter-assigned freely, but not compared! */ if ((void *)row != ss->dst) /* no buffering */ @@ -643,9 +647,9 @@ if_debug2('w', "[w]zoom_x y = %d to tmp row %d\n", ss->src_y, (ss->src_y % ss->max_support)); zoom_x(ss->tmp + (ss->src_y % ss->max_support) * - ss->params.WidthOut * ss->params.Colors, row, + ss->params.WidthOut * ss->params.spp_interp, row, ss->sizeofPixelIn, ss->params.WidthOut, ss->params.WidthIn, - ss->params.Colors, ss->contrib, ss->items); + ss->params.spp_interp, ss->contrib, ss->items); pr->ptr += rcount; ++(ss->src_y); goto top; diff -Nru ghostscript-9.04~dfsg/base/sisparam.h ghostscript-9.05~dfsg~20120125/base/sisparam.h --- ghostscript-9.04~dfsg/base/sisparam.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sisparam.h 2011-09-29 11:01:34.000000000 +0000 @@ -46,7 +46,8 @@ /* Define image scaling stream parameters. */ typedef struct stream_image_scale_params_s { - int Colors; /* >= 1 */ + int spp_decode; /* >= 1 */ + int spp_interp; /* If we do CM first, may not equal spp_decode */ int BitsPerComponentIn; /* bits per input value, 8 or 16 */ uint MaxValueIn; /* max value of input component, */ /* 0 < MaxValueIn < 1 << BitsPerComponentIn */ @@ -61,6 +62,8 @@ int EntireHeightIn; /* Height of entire input image. */ int EntireWidthOut; /* Height of entire output image. */ int EntireHeightOut; /* Height of entire output image. */ + bool early_cm; /* If this is set, then we will perform + color managment before interpolating */ } stream_image_scale_params_t; /* Define a generic image scaling stream state. */ diff -Nru ghostscript-9.04~dfsg/base/sjbig2.c ghostscript-9.05~dfsg~20120125/base/sjbig2.c --- ghostscript-9.04~dfsg/base/sjbig2.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sjbig2.c 2012-01-25 08:44:24.000000000 +0000 @@ -19,7 +19,6 @@ #include "stdio_.h" /* sprintf() for debug output */ #include "gserrors.h" -#include "gserror.h" #include "gdebug.h" #include "strimpl.h" #include "sjbig2.h" @@ -105,6 +104,7 @@ /* allocate a context with which to parse our global segments */ ctx = jbig2_ctx_new(NULL, JBIG2_OPTIONS_EMBEDDED, NULL, s_jbig2decode_error, NULL); + if (ctx == NULL) return 0; /* parse the global bitstream */ code = jbig2_data_in(ctx, data, length); @@ -149,13 +149,14 @@ { stream_jbig2decode_state *const state = (stream_jbig2decode_state *) ss; Jbig2GlobalCtx *global_ctx = state->global_ctx; /* may be NULL */ + state->error = 0; /* initialize the decoder with the parsed global context if any */ state->decode_ctx = jbig2_ctx_new(NULL, JBIG2_OPTIONS_EMBEDDED, global_ctx, s_jbig2decode_error, ss); state->image = 0; - state->error = 0; - return 0; /* todo: check for allocation failure */ + + return (state->error); } /* process a section of the input and return any decoded data. diff -Nru ghostscript-9.04~dfsg/base/sjbig2_luratech.c ghostscript-9.05~dfsg~20120125/base/sjbig2_luratech.c --- ghostscript-9.04~dfsg/base/sjbig2_luratech.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sjbig2_luratech.c 2011-10-17 13:34:52.000000000 +0000 @@ -17,7 +17,6 @@ #include "memory_.h" #include "malloc_.h" /* should use a gs mem pointer */ #include "gserrors.h" -#include "gserror.h" #include "gdebug.h" #include "strimpl.h" #include "sjbig2_luratech.h" @@ -189,9 +188,11 @@ /* else return data from the image stream */ offset -= state->global_size; + if (state->infill <= offset) + return 0; available = state->infill - offset; - if (available > size) available = size; - if (available <= 0) return 0; + if (available > size) + available = size; memcpy(buffer, state->inbuf + offset, available); return available; diff -Nru ghostscript-9.04~dfsg/base/sjpegd.c ghostscript-9.05~dfsg~20120125/base/sjpegd.c --- ghostscript-9.04~dfsg/base/sjpegd.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sjpegd.c 2011-09-29 11:01:34.000000000 +0000 @@ -17,6 +17,7 @@ #include "string_.h" #include "jpeglib_.h" #include "jerror_.h" +#include "gserrors.h" #include "gx.h" #include "strimpl.h" #include "sdct.h" diff -Nru ghostscript-9.04~dfsg/base/sjpx.c ghostscript-9.05~dfsg~20120125/base/sjpx.c --- ghostscript-9.04~dfsg/base/sjpx.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sjpx.c 2011-09-29 11:01:34.000000000 +0000 @@ -15,7 +15,6 @@ /* JPXDecode filter implementation -- hooks in libjasper */ #include "memory_.h" -#include "gserror.h" #include "gdebug.h" #include "strimpl.h" #include "gsmalloc.h" diff -Nru ghostscript-9.04~dfsg/base/sjpx_luratech.c ghostscript-9.05~dfsg~20120125/base/sjpx_luratech.c --- ghostscript-9.04~dfsg/base/sjpx_luratech.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sjpx_luratech.c 2011-09-29 11:01:34.000000000 +0000 @@ -17,7 +17,6 @@ #include "memory_.h" #include "malloc_.h" #include "gserrors.h" -#include "gserror.h" #include "gdebug.h" #include "strimpl.h" #include "sjpx_luratech.h" diff -Nru ghostscript-9.04~dfsg/base/sjpx_openjpeg.c ghostscript-9.05~dfsg~20120125/base/sjpx_openjpeg.c --- ghostscript-9.04~dfsg/base/sjpx_openjpeg.c 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sjpx_openjpeg.c 2011-11-21 08:55:19.000000000 +0000 @@ -0,0 +1,543 @@ + +/* Copyright (C) 2011 Artifex Software, Inc. + All Rights Reserved. + + This software is provided AS-IS with no warranty, either express or + implied. + + This software is distributed under license and may not be copied, modified + or distributed except as expressly authorized under the terms of that + license. Refer to licensing information at http://www.artifex.com/ + or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. +*/ + +/* $Id$ */ +/* opj filter implementation using OpenJPeg library */ + +#include "memory_.h" +#include "malloc_.h" +#include "gserrors.h" +#include "gdebug.h" +#include "strimpl.h" +#include "sjpx_openjpeg.h" + + +/* As with the /JBIG2Decode filter, we let the library do its + memory management through malloc() etc. and rely on our release() + proc being called to deallocate state. +*/ + +gs_private_st_simple(st_jpxd_state, stream_jpxd_state, + "JPXDecode filter state"); /* creates a gc object for our state, + defined in sjpx.h */ + +static int s_opjd_accumulate_input(stream_jpxd_state *state, stream_cursor_read * pr); + +/* initialize the steam. + this involves allocating the stream and image structures, and + initializing the decoder. + */ +static int +s_opjd_init(stream_state * ss) +{ + stream_jpxd_state *const state = (stream_jpxd_state *) ss; + opj_dparameters_t parameters; /* decompression parameters */ + + if (state->jpx_memory == NULL) { + state->jpx_memory = ss->memory->non_gc_memory; + } + + /* get a decoder handle */ + state->opj_dinfo_p = opj_create_decompress(CODEC_JP2); + + if (state->opj_dinfo_p == NULL) + return_error(gs_error_VMerror); + + /* catch events using our callbacks and give a local context */ + //opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); + + /* set decoding parameters to default values */ + opj_set_default_decoder_parameters(¶meters); + + /* setup the decoder decoding parameters using user parameters */ + opj_setup_decoder(state->opj_dinfo_p, ¶meters); + + state->image = NULL; + state->inbuf = NULL; + state->inbuf_size = 0; + state->inbuf_fill = 0; + state->out_offset = 0; + state->img_offset = 0; + state->pdata = NULL; + state->sign_comps = NULL; + + return 0; +} + +/* calculate the real component data idx after scaling */ +static inline unsigned long +get_scaled_idx(stream_jpxd_state *state, int compno, unsigned long idx, unsigned long x, unsigned long y) +{ + if (state->samescale) + return idx; + + return (y/state->image->comps[compno].dy*state->width + x)/state->image->comps[compno].dx; +} + +/* convert state->image from YCrCb to RGB */ +static int +s_jpxd_ycc_to_rgb(stream_jpxd_state *state) +{ + unsigned int max_value = ~(-1 << state->image->comps[0].prec); /* maximum of channel value */ + int flip_value = 1 << (state->image->comps[0].prec-1); + int p[3], q[3], i; + int sgnd[2]; /* Cr, Cb */ + unsigned long x, y, idx; + int *row_bufs[3]; + + if (state->out_numcomps != 3) + return -1; + + for (i=0; i<2; i++) + sgnd[i] = state->image->comps[i+1].sgnd; + + for (i=0; i<3; i++) + row_bufs[i] = malloc(sizeof(int)*state->width); + + if (!row_bufs[0] || !row_bufs[1] || !row_bufs[2]) + return_error(gs_error_VMerror); + + idx=0; + for (y=0; yheight; y++) + { + /* backup one row. the real buffer might be overriden when there is scale */ + for (i=0; i<3; i++) + { + if ((y % state->image->comps[i].dy) == 0) /* get the buffer once every dy rows */ + memcpy(row_bufs[i], &(state->image->comps[i].data[get_scaled_idx(state, i, idx, 0, y)]), sizeof(int)*state->width/state->image->comps[i].dx); + } + for (x=0; xwidth; x++, idx++) + { + for (i = 0; i < 3; i++) + p[i] = row_bufs[i][x/state->image->comps[i].dx]; + + if (!sgnd[0]) + p[1] -= flip_value; + if (!sgnd[1]) + p[2] -= flip_value; + + /* rotate to RGB */ +#ifdef JPX_USE_IRT + q[1] = p[0] - ((p[1] + p[2])>>2); + q[0] = p[1] + q[1]; + q[2] = p[2] + q[1]; +#else + q[0] = (int)((double)p[0] + 1.402 * p[2]); + q[1] = (int)((double)p[0] - 0.34413 * p[1] - 0.71414 * p[2]); + q[2] = (int)((double)p[0] + 1.772 * p[1]); +#endif + /* clamp */ + for (i = 0; i < 3; i++){ + if (q[i] < 0) q[i] = 0; + else if (q[i] > max_value) q[i] = max_value; + } + + /* write out the pixel */ + for (i = 0; i < 3; i++) + state->image->comps[i].data[get_scaled_idx(state, i, idx, x, y)] = q[i]; + } + } + + for (i=0; i<3; i++) + free(row_bufs[i]); + + return 0; +} + +static int decode_image(stream_jpxd_state * const state) +{ + opj_cio_t *cio = NULL; + int numprimcomp = 0, alpha_comp = -1, compno; + + /* open a byte stream */ + cio = opj_cio_open((opj_common_ptr)state->opj_dinfo_p, state->inbuf, state->inbuf_fill); + if (cio == NULL) + return ERRC; + + /* decode the stream and fill the image structure */ + state->image = opj_decode(state->opj_dinfo_p, cio, state->colorspace == gs_jpx_cs_indexed); + if(state->image == NULL) + { + dlprintf("openjpeg: failed to decode image!\n"); + opj_cio_close(cio); + return ERRC; + } + + /* close the byte stream */ + opj_cio_close(cio); + + /* check dimension and prec */ + if (state->image->numcomps == 0) + return ERRC; + + state->width = state->image->comps[0].w; + state->height = state->image->comps[0].h; + state->bpp = state->image->comps[0].prec; + state->samescale = true; + for(compno = 1; compno < state->image->numcomps; compno++) + { + if (state->bpp != state->image->comps[compno].prec) + return ERRC; // Not supported. + if (state->width < state->image->comps[compno].w) + state->width = state->image->comps[compno].w; + if (state->height < state->image->comps[compno].h) + state->height = state->image->comps[compno].h; + if (state->image->comps[compno].dx != state->image->comps[0].dx || + state->image->comps[compno].dy != state->image->comps[0].dy) + state->samescale = false; + } + + + /* find alpha component and regular color component by channel definition */ + for(compno = 0; compno < state->image->numcomps; compno++) + { + if (state->image->comps[compno].typ == CTYPE_COLOR) + numprimcomp++; + else if (state->image->comps[compno].typ == CTYPE_OPACITY) + alpha_comp = compno; + } + + /* color space and number of components */ + switch(state->image->color_space) + { + case CLRSPC_GRAY: + state->colorspace = gs_jpx_cs_gray; + break; + case CLRSPC_CMYK: + state->colorspace = gs_jpx_cs_cmyk; + break; + case CLRSPC_UNKNOWN: /* make the best guess based on number of channels */ + { + if (numprimcomp < 3) + { + state->colorspace = gs_jpx_cs_gray; + } + else if (numprimcomp == 4) + { + state->colorspace = gs_jpx_cs_cmyk; + } + else + { + state->colorspace = gs_jpx_cs_rgb; + } + break; + } + default: /* CLRSPC_SRGB, CLRSPC_SYCC, CLRSPC_ERGB, CLRSPC_EYCC */ + state->colorspace = gs_jpx_cs_rgb; + } + + state->alpha_comp = -1; + if (state->alpha) + { + state->alpha_comp = alpha_comp; + state->out_numcomps = 1; + } + else + state->out_numcomps = numprimcomp; + + /* round up bpp to multiple of 8, eg 12->16 */ + if ((state->colorspace != gs_jpx_cs_gray && !state->image->has_palette) || state->bpp>8) + state->bpp = (state->bpp+7)/8*8; + + /* calculate total data */ + state->totalbytes = state->width*state->height*state->bpp*state->out_numcomps/8; + + /* convert input from YCC to RGB */ + if (state->image->color_space == CLRSPC_SYCC || state->image->color_space == CLRSPC_EYCC) + s_jpxd_ycc_to_rgb(state); + + state->pdata = malloc(sizeof(int*)*state->image->numcomps); + if (!state->pdata) + return_error(gs_error_VMerror); + + /* compensate for signed data (signed => unsigned) */ + state->sign_comps = malloc(sizeof(int)*state->image->numcomps); + if (!state->sign_comps) + return_error(gs_error_VMerror); + + for(compno = 0; compno < state->image->numcomps; compno++) + { + if (state->image->comps[compno].sgnd) + state->sign_comps[compno] = ((state->bpp%8)==0) ? 0x80 : (1<<(state->bpp-1)); + else + state->sign_comps[compno] = 0; + } + + return 0; +} + +static int process_one_trunk(stream_jpxd_state * const state, stream_cursor_write * pw) +{ + /* read data from image to pw */ + unsigned long out_size = pw->limit - pw->ptr; + int bytepp1 = state->bpp/8; /* bytes / pixel for one output component */ + int bytepp = state->out_numcomps*state->bpp/8; /* bytes / pixel all compoments */ + unsigned long write_size = min(out_size-(bytepp?(out_size%bytepp):0), state->totalbytes-state->out_offset); + unsigned long in_offset = state->out_offset*8/state->bpp/state->out_numcomps; /* component data offset */ + int shift_bit = state->bpp-state->image->comps[0].prec; /*difference between input and output bit-depth*/ + int img_numcomps = min(state->out_numcomps, state->image->numcomps), /* the actual number of channel data used */ + compno; + unsigned long i; int b; + byte *pend = pw->ptr+write_size+1; /* end of write data */ + + if (state->bpp < 8) + in_offset = state->img_offset; + + pw->ptr++; + + if (state->alpha && state->alpha_comp == -1) + {/* return 0xff for all */ + memset(pw->ptr, 0xff, write_size); + pw->ptr += write_size; + } + else if (state->samescale) + { + if (state->alpha) + state->pdata[0] = &(state->image->comps[state->alpha_comp].data[in_offset]); + else + { + for (compno=0; compnopdata[compno] = &(state->image->comps[compno].data[in_offset]); + } + if (shift_bit == 0 && state->bpp == 8) /* optimized for the most common case */ + { + while (pw->ptr < pend) + { + for (compno=0; compnoptr++) = *(state->pdata[compno]++) + state->sign_comps[compno]; /* copy input buffer to output */ + } + } + else + { + if ((state->bpp%8)==0) + { + while (pw->ptr < pend) + { + for (compno=0; compnoptr++) = (((*(state->pdata[compno]) << shift_bit) >> (8*(bytepp1-b-1)))) + + (b==0 ? state->sign_comps[compno] : 0); /* split and shift input int to output bytes */ + state->pdata[compno]++; + } + } + } + else + { + /* only grayscale can have such bit-depth, also shift_bit = 0, bpp < 8 */ + unsigned long image_total = state->width*state->height; + while (pw->ptr < pend) + { + int bt=0; + for (i=0; i<8/state->bpp; i++) + { + bt = bt<bpp; + if (state->img_offset < image_total && !(i!=0 && state->img_offset % state->width == 0)) + { + bt += *(state->pdata[0]++) + state->sign_comps[0]; + state->img_offset++; + } + } + *(pw->ptr++) = bt; + } + } + } + } + else + { + /* sampling required */ + unsigned long y_offset = in_offset / state->width; + unsigned long x_offset = in_offset % state->width; + while (pw->ptr < pend) + { + if ((state->bpp%8)==0) + { + if (state->alpha) + { + int in_offset_scaled = (y_offset/state->image->comps[state->alpha_comp].dy*state->width + x_offset)/state->image->comps[state->alpha_comp].dx; + for (b=0; bptr++) = (((state->image->comps[state->alpha_comp].data[in_offset_scaled] << shift_bit) >> (8*(bytepp1-b-1)))) + + (b==0 ? state->sign_comps[state->alpha_comp] : 0); + } + else + { + for (compno=0; compnoimage->comps[compno].dy*state->width + x_offset)/state->image->comps[compno].dx; + for (b=0; bptr++) = (((state->image->comps[compno].data[in_offset_scaled] << shift_bit) >> (8*(bytepp1-b-1)))) + + (b==0 ? state->sign_comps[compno] : 0); + } + } + x_offset++; + if (x_offset >= state->width) + { + y_offset++; + x_offset = 0; + } + } + else + { + unsigned long image_total = state->width*state->height; + int compno = state->alpha ? state->alpha_comp : 0; + /* only grayscale can have such bit-depth, also shift_bit = 0, bpp < 8 */ + int bt=0; + for (i=0; i<8/state->bpp; i++) + { + bt = bt<bpp; + if (state->img_offset < image_total && !(i!=0 && state->img_offset % state->width == 0)) + { + int in_offset_scaled = (y_offset/state->image->comps[compno].dy*state->width + x_offset)/state->image->comps[compno].dx; + bt += state->image->comps[compno].data[in_offset_scaled] + state->sign_comps[compno]; + state->img_offset++; + x_offset++; + if (x_offset >= state->width) + { + y_offset++; + x_offset = 0; + } + } + } + *(pw->ptr++) = bt; + } + } + } + state->out_offset += write_size; + pw->ptr--; + if (state->out_offset == state->totalbytes) + return EOFC; /* all data returned */ + else + return 1; /* need more calls */ + } + +/* process a section of the input and return any decoded data. + see strimpl.h for return codes. + */ +static int +s_opjd_process(stream_state * ss, stream_cursor_read * pr, + stream_cursor_write * pw, bool last) +{ + stream_jpxd_state *const state = (stream_jpxd_state *) ss; + long in_size = pr->limit - pr->ptr; + + if (state->opj_dinfo_p == NULL) + return ERRC; + + if (in_size > 0) + { + /* buffer available data */ + s_opjd_accumulate_input(state, pr); + } + + if (last == 1) + { + if (state->image == NULL) + { + int ret = decode_image(state); + if (ret != 0) + return ret; + } + + /* copy out available data */ + return process_one_trunk(state, pw); + + } + + /* ask for more data */ + return 0; +} + +/* Set the defaults */ +static void +s_opjd_set_defaults(stream_state * ss) { + stream_jpxd_state *const state = (stream_jpxd_state *) ss; + + state->alpha = false; + state->colorspace = gs_jpx_cs_rgb; +} + +/* stream release. + free all our decoder state. + */ +static void +s_opjd_release(stream_state *ss) +{ + stream_jpxd_state *const state = (stream_jpxd_state *) ss; + + /* free image data structure */ + if (state->image) + opj_image_destroy(state->image); + + /* free decoder handle */ + if (state->opj_dinfo_p) + opj_destroy_decompress(state->opj_dinfo_p); + + /* free input buffer */ + if (state->inbuf) + free(state->inbuf); + + if (state->pdata) + free(state->pdata); + + if (state->sign_comps) + free(state->sign_comps); +} + + +static int +s_opjd_accumulate_input(stream_jpxd_state *state, stream_cursor_read * pr) +{ + long in_size = pr->limit - pr->ptr; + + /* grow the input buffer if needed */ + if (state->inbuf_size < state->inbuf_fill + in_size) + { + unsigned char *new_buf; + unsigned long new_size = state->inbuf_size==0 ? in_size : state->inbuf_size; + + while (new_size < state->inbuf_fill + in_size) + new_size = new_size << 1; + + if_debug1('s', "[s]opj growing input buffer to %lu bytes\n", + new_size); + if (state->inbuf == NULL) + new_buf = (byte *) malloc(new_size); + else + new_buf = (byte *) realloc(state->inbuf, new_size); + if (new_buf == NULL) return_error( gs_error_VMerror); + + state->inbuf = new_buf; + state->inbuf_size = new_size; + } + + /* copy the available input into our buffer */ + /* note that the gs stream library uses offset-by-one + indexing of its buffers while we use zero indexing */ + memcpy(state->inbuf + state->inbuf_fill, pr->ptr + 1, in_size); + state->inbuf_fill += in_size; + pr->ptr += in_size; + + return 0; +} + +/* stream template */ +const stream_template s_jpxd_template = { + &st_jpxd_state, + s_opjd_init, + s_opjd_process, + 1024, 1024, /* min in and out buffer sizes we can handle + should be ~32k,64k for efficiency? */ + s_opjd_release, + s_opjd_set_defaults +}; diff -Nru ghostscript-9.04~dfsg/base/sjpx_openjpeg.h ghostscript-9.05~dfsg~20120125/base/sjpx_openjpeg.h --- ghostscript-9.04~dfsg/base/sjpx_openjpeg.h 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/sjpx_openjpeg.h 2011-11-21 08:55:19.000000000 +0000 @@ -0,0 +1,66 @@ +/* Copyright (C) 2011 Artifex Software, Inc. + All Rights Reserved. + + This software is provided AS-IS with no warranty, either express or + implied. + + This software is distributed under license and may not be copied, modified + or distributed except as expressly authorized under the terms of that + license. Refer to licensing information at http://www.artifex.com/ + or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. +*/ + +/* $Id$ */ +/* Definitions for sopj filter (OpenJpeg) */ + +#ifndef SJPX_OPENJPEG_INCLUDED +#define SJPX_OPENJPEG_INCLUDED + +/* Requires scommon.h; strimpl.h if any templates are referenced */ + +#include "scommon.h" +#include "openjpeg.h" + +/* define colorspace enumeration for the decompressed image data */ +typedef enum { + gs_jpx_cs_unset, /* colorspace hasn't been set */ + gs_jpx_cs_gray, /* single component grayscale image */ + gs_jpx_cs_rgb, /* three component (s)RGB image */ + gs_jpx_cs_cmyk, /* four component CMYK image */ + gs_jpx_cs_indexed /* PDF image wants raw index values */ +} gs_jpx_cs; + +/* Stream state for the jpx codec using openjpeg + * We rely on our finalization call to free the + * associated handle and pointers. + */ +typedef struct stream_jpxd_state_s +{ + stream_state_common; /* a define from scommon.h */ + const gs_memory_t *jpx_memory; + opj_dinfo_t *opj_dinfo_p; + opj_image_t *image; + int width, height, bpp; + bool samescale; + + gs_jpx_cs colorspace; /* requested output colorspace */ + bool alpha; /* return opacity channel */ + + unsigned char *inbuf; /* input data buffer */ + unsigned long inbuf_size; + unsigned long inbuf_fill; + + unsigned long totalbytes; /* output total */ + unsigned long out_offset; /* output bytes already returned previously */ + unsigned long img_offset; /* offset in the image data buffer for each channel, only used when output bpp%8 !=0 */ + + int **pdata; /* pointers to image data */ + int out_numcomps; /* real number of channels to use */ + int alpha_comp; /* input index of alpha channel */ + int *sign_comps; /* compensate for signed data (signed => unsigned) */ +} stream_jpxd_state; + +extern const stream_template s_jpxd_template; + +#endif diff -Nru ghostscript-9.04~dfsg/base/slzwe.c ghostscript-9.05~dfsg~20120125/base/slzwe.c --- ghostscript-9.04~dfsg/base/slzwe.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/slzwe.c 2011-09-29 11:01:34.000000000 +0000 @@ -183,6 +183,8 @@ else { if ( code != code_eod ) { q = lzw_put_code(ss, q, code); /* put out final code */ + if (ss->next_code == limit_code && ss->next_code != encode_max) + ss->code_size++; } q = lzw_put_code(ss, q, code_eod); if ( ss->bits_left < 8 ) diff -Nru ghostscript-9.04~dfsg/base/smd5.c ghostscript-9.05~dfsg~20120125/base/smd5.c --- ghostscript-9.04~dfsg/base/smd5.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/smd5.c 2011-11-12 18:29:08.000000000 +0000 @@ -68,7 +68,7 @@ if (ss == NULL || s == NULL) goto err; - ss->template = &s_MD5E_template; + ss->templat = &s_MD5E_template; if (s_init_filter(s, ss, digest, digest_size, NULL) < 0) goto err; s->strm = s; @@ -112,7 +112,7 @@ if (ss == NULL || s == NULL || buffer == NULL) goto err; - ss->template = &s_MD5C_template; + ss->templat = &s_MD5C_template; if (s_init_filter(s, ss, buffer, buffer_size, NULL) < 0) goto err; s->strm = strm; diff -Nru ghostscript-9.04~dfsg/base/spsdf.c ghostscript-9.05~dfsg~20120125/base/spsdf.c --- ghostscript-9.04~dfsg/base/spsdf.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/spsdf.c 2011-11-12 18:29:08.000000000 +0000 @@ -17,7 +17,6 @@ #include "string_.h" #include "gstypes.h" #include "gsmemory.h" -#include "gserror.h" #include "gserrors.h" #include "spprint.h" #include "spsdf.h" @@ -37,7 +36,7 @@ { uint added = 0; uint i; - const stream_template *template; + const stream_template *templat; stream_AXE_state state; stream_state *st = NULL; @@ -77,11 +76,11 @@ if (added < size || (print_ok & PRINT_HEX_NOT_OK)) { /* More efficient, or mandatory, to represent as PostScript string. */ - template = &s_PSSE_template; + templat = &s_PSSE_template; stream_putc(s, '('); } else { /* More efficient, and permitted, to represent as hex string. */ - template = &s_AXE_template; + templat = &s_AXE_template; st = (stream_state *) & state; s_AXE_init_inline(&state); stream_putc(s, '<'); @@ -99,7 +98,7 @@ do { /* One picky compiler complains if we initialize to buf - 1. */ w.ptr = buf; w.ptr--; - status = (*template->process) (st, &r, &w, true); + status = (*templat->process) (st, &r, &w, true); stream_write(s, buf, (uint) (w.ptr + 1 - buf)); } while (status == 1); diff -Nru ghostscript-9.04~dfsg/base/ssha2.c ghostscript-9.05~dfsg~20120125/base/ssha2.c --- ghostscript-9.04~dfsg/base/ssha2.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/ssha2.c 2011-12-08 09:35:23.000000000 +0000 @@ -28,7 +28,7 @@ { stream_SHA256E_state *const ss = (stream_SHA256E_state *) st; - SHA256_Init(&ss->sha256); + pSHA256_Init(&ss->sha256); return 0; } @@ -41,12 +41,12 @@ int status = 0; if (pr->ptr < pr->limit) { - SHA256_Update(&ss->sha256, pr->ptr + 1, pr->limit - pr->ptr); + pSHA256_Update(&ss->sha256, pr->ptr + 1, pr->limit - pr->ptr); pr->ptr = pr->limit; } if (last) { if (pw->limit - pw->ptr >= 32) { - SHA256_Final(pw->ptr + 1, &ss->sha256); + pSHA256_Final(pw->ptr + 1, &ss->sha256); pw->ptr += 32; status = EOFC; } else @@ -68,7 +68,7 @@ if (ss == NULL || s == NULL) goto err; - ss->template = &s_SHA256E_template; + ss->templat = &s_SHA256E_template; if (s_init_filter(s, ss, digest, digest_size, NULL) < 0) goto err; s->strm = s; diff -Nru ghostscript-9.04~dfsg/base/stream.c ghostscript-9.05~dfsg~20120125/base/stream.c --- ghostscript-9.04~dfsg/base/stream.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/stream.c 2011-11-12 18:29:08.000000000 +0000 @@ -72,9 +72,10 @@ /* We only do this for file streams, because other kinds of streams */ /* may attempt to free storage when closing. */ static void -stream_finalize(void *vptr) +stream_finalize(const gs_memory_t *cmem, void *vptr) { stream *const st = vptr; + (void)cmem; /* unused */ if_debug2('u', "[u]%s 0x%lx\n", (!s_is_valid(st) ? "already closed:" : @@ -125,10 +126,10 @@ /* Allocate a stream state and initialize it minimally. */ void -s_init_state(stream_state *st, const stream_template *template, +s_init_state(stream_state *st, const stream_template *templat, gs_memory_t *mem) { - st->template = template; + st->templat = templat; st->memory = mem; st->report_error = s_no_report_error; st->min_left = 0; @@ -154,7 +155,7 @@ s_std_init(register stream * s, byte * ptr, uint len, const stream_procs * pp, int modes) { - s->template = &s_no_template; + s->templat = &s_no_template; s->cbuf = ptr; s->srptr = s->srlimit = s->swptr = ptr - 1; s->swlimit = ptr - 1 + len; @@ -299,7 +300,7 @@ /* Clear pointers for GC */ s->strm = 0; s->state = (stream_state *) s; - s->template = &s_no_template; + s->templat = &s_no_template; /* Free the file name. */ if (s->file_name.data) { gs_free_const_string(s->memory, s->file_name.data, s->file_name.size, @@ -420,7 +421,7 @@ return status; st = s->state; if (st != 0) { - stream_proc_release((*release)) = st->template->release; + stream_proc_release((*release)) = st->templat->release; if (release != 0) (*release) (st); if (st != (stream_state *) s && st->memory != 0) @@ -517,7 +518,7 @@ if (wanted >= s->bsize >> 2 && (st = s->state) != 0 && - wanted >= st->template->min_out_size && + wanted >= st->templat->min_out_size && s->end_status == 0 && left == 0 ) { @@ -885,7 +886,7 @@ if_debug5('s', "[s]write process 0x%lx(%s), nr=%u, nw=%u, end=%d\n", (ulong)curr, - gs_struct_type_name(curr->state->template->stype), + gs_struct_type_name(curr->state->templat->stype), (uint)(pr->limit - pr->ptr), (uint)(pw->limit - pw->ptr), end); status = curr->end_status; @@ -1146,15 +1147,15 @@ s_init_filter(stream *fs, stream_state *fss, byte *buf, uint bsize, stream *target) { - const stream_template *template = fss->template; + const stream_template *templat = fss->templat; - if (bsize < template->min_in_size) + if (bsize < templat->min_in_size) return ERRC; s_std_init(fs, buf, bsize, &s_filter_write_procs, s_mode_write); - fs->procs.process = template->process; + fs->procs.process = templat->process; fs->state = fss; - if (template->init) { - fs->end_status = (template->init)(fss); + if (templat->init) { + fs->end_status = (templat->init)(fss); if (fs->end_status < 0) return fs->end_status; } @@ -1162,19 +1163,19 @@ return 0; } stream * -s_add_filter(stream **ps, const stream_template *template, +s_add_filter(stream **ps, const stream_template *templat, stream_state *ss, gs_memory_t *mem) { stream *es; stream_state *ess; - uint bsize = max(template->min_in_size, 256); /* arbitrary */ + uint bsize = max(templat->min_in_size, 256); /* arbitrary */ byte *buf; /* * Ensure enough buffering. This may require adding an additional * stream. */ - if (bsize > (*ps)->bsize && template->process != s_NullE_template.process) { + if (bsize > (*ps)->bsize && templat->process != s_NullE_template.process) { stream_template null_template; null_template = s_NullE_template; @@ -1190,7 +1191,7 @@ return 0; } ess = (ss == 0 ? (stream_state *)es : ss); - ess->template = template; + ess->templat = templat; ess->memory = mem; es->memory = mem; if (s_init_filter(es, ess, buf, bsize, *ps) < 0) diff -Nru ghostscript-9.04~dfsg/base/szlibc.c ghostscript-9.05~dfsg~20120125/base/szlibc.c --- ghostscript-9.04~dfsg/base/szlibc.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/szlibc.c 2011-09-29 11:01:34.000000000 +0000 @@ -14,7 +14,6 @@ /* $Id$ */ /* Code common to zlib encoding and decoding streams */ #include "std.h" -#include "gserror.h" #include "gserrors.h" #include "gstypes.h" #include "gsmemory.h" diff -Nru ghostscript-9.04~dfsg/base/ttfmain.c ghostscript-9.05~dfsg~20120125/base/ttfmain.c --- ghostscript-9.04~dfsg/base/ttfmain.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/ttfmain.c 2011-11-12 18:29:08.000000000 +0000 @@ -178,45 +178,45 @@ /*-------------------------------------------------------------------*/ -void ttfFont__init(ttfFont *this, ttfMemory *mem, +void ttfFont__init(ttfFont *self, ttfMemory *mem, void (*DebugRepaint)(ttfFont *), int (*DebugPrint)(ttfFont *, const char *s, ...), const gs_memory_t *DebugMem) { - memset(this, 0, sizeof(*this)); - this->DebugRepaint = DebugRepaint; - this->DebugPrint = DebugPrint; - this->DebugMem = DebugMem; + memset(self, 0, sizeof(*self)); + self->DebugRepaint = DebugRepaint; + self->DebugPrint = DebugPrint; + self->DebugMem = DebugMem; } -void ttfFont__finit(ttfFont *this) -{ ttfMemory *mem = this->tti->ttf_memory; - - if (this->exec) { - if (this->inst) - Context_Destroy(this->exec); +void ttfFont__finit(ttfFont *self) +{ ttfMemory *mem = self->tti->ttf_memory; + + if (self->exec) { + if (self->inst) + Context_Destroy(self->exec); else { /* Context_Create was not called - see ttfFont__Open. Must not call Context_Destroy for proper 'lock' count. */ } } - this->exec = NULL; - if (this->inst) - Instance_Destroy(this->inst); - mem->free(mem, this->inst, "ttfFont__finit"); - this->inst = NULL; - if (this->face) - Face_Destroy(this->face); - mem->free(mem, this->face, "ttfFont__finit"); - this->face = NULL; + self->exec = NULL; + if (self->inst) + Instance_Destroy(self->inst); + mem->free(mem, self->inst, "ttfFont__finit"); + self->inst = NULL; + if (self->face) + Face_Destroy(self->face); + mem->free(mem, self->face, "ttfFont__finit"); + self->face = NULL; } #define MAX_SUBGLYPH_NESTING 3 /* Arbitrary. We need this because we don't want a ttfOutliner__BuildGlyphOutline recursion while a glyph is loaded in ttfReader. */ -FontError ttfFont__Open(ttfInterpreter *tti, ttfFont *this, ttfReader *r, +FontError ttfFont__Open(ttfInterpreter *tti, ttfFont *self, ttfReader *r, unsigned int nTTC, float w, float h, bool design_grid) { char sVersion[4], sVersion1[4] = {0, 1, 0, 0}; @@ -228,8 +228,8 @@ ttfMemory *mem = tti->ttf_memory; F26Dot6 ww, hh; - this->tti = tti; - this->design_grid = design_grid; + self->tti = tti; + self->design_grid = design_grid; r->Read(r, sVersion, 4); if(!memcmp(sVersion, "ttcf", 4)) { unsigned int nFonts; @@ -264,85 +264,85 @@ ttfReader__UInt(r); /* nCheckSum */ nOffset = ttfReader__UInt(r); nLength = ttfReader__UInt(r); - e = ttfFont__get_table_ptr(this, sTag); + e = ttfFont__get_table_ptr(self, sTag); if (e != NULL) { e->nPos = nOffset; e->nLen = nLength; } } - r->Seek(r, this->t_head.nPos + offset_of(sfnt_FontHeader, flags)); - this->nFlags = ttfReader__UShort(r); - r->Seek(r, this->t_head.nPos + offset_of(sfnt_FontHeader, unitsPerEm)); - this->nUnitsPerEm = ttfReader__UShort(r); - r->Seek(r, this->t_head.nPos + offset_of(sfnt_FontHeader, indexToLocFormat)); - this->nIndexToLocFormat = ttfReader__UShort(r); - r->Seek(r, this->t_maxp.nPos + offset_of(sfnt_maxProfileTable, numGlyphs)); - this->nNumGlyphs = ttfReader__UShort(r); - r->Seek(r, this->t_maxp.nPos + offset_of(sfnt_maxProfileTable, maxComponentElements)); - this->nMaxComponents = ttfReader__UShort(r); - if(this->nMaxComponents < 10) - this->nMaxComponents = 10; /* work around DynaLab bug in lgoth.ttf */ - r->Seek(r, this->t_hhea.nPos + offset_of(sfnt_MetricsHeader, numberLongMetrics)); - this->nLongMetricsHorz = ttfReader__UShort(r); - if (this->t_vhea.nPos != 0) { - r->Seek(r, this->t_vhea.nPos + offset_of(sfnt_MetricsHeader, numberLongMetrics)); - this->nLongMetricsVert = ttfReader__UShort(r); + r->Seek(r, self->t_head.nPos + offset_of(sfnt_FontHeader, flags)); + self->nFlags = ttfReader__UShort(r); + r->Seek(r, self->t_head.nPos + offset_of(sfnt_FontHeader, unitsPerEm)); + self->nUnitsPerEm = ttfReader__UShort(r); + r->Seek(r, self->t_head.nPos + offset_of(sfnt_FontHeader, indexToLocFormat)); + self->nIndexToLocFormat = ttfReader__UShort(r); + r->Seek(r, self->t_maxp.nPos + offset_of(sfnt_maxProfileTable, numGlyphs)); + self->nNumGlyphs = ttfReader__UShort(r); + r->Seek(r, self->t_maxp.nPos + offset_of(sfnt_maxProfileTable, maxComponentElements)); + self->nMaxComponents = ttfReader__UShort(r); + if(self->nMaxComponents < 10) + self->nMaxComponents = 10; /* work around DynaLab bug in lgoth.ttf */ + r->Seek(r, self->t_hhea.nPos + offset_of(sfnt_MetricsHeader, numberLongMetrics)); + self->nLongMetricsHorz = ttfReader__UShort(r); + if (self->t_vhea.nPos != 0) { + r->Seek(r, self->t_vhea.nPos + offset_of(sfnt_MetricsHeader, numberLongMetrics)); + self->nLongMetricsVert = ttfReader__UShort(r); } else - this->nLongMetricsVert = 0; - if (tti->usage_size < this->nMaxComponents * MAX_SUBGLYPH_NESTING) { + self->nLongMetricsVert = 0; + if (tti->usage_size < self->nMaxComponents * MAX_SUBGLYPH_NESTING) { tti->ttf_memory->free(tti->ttf_memory, tti->usage, "ttfFont__Open"); tti->usage_size = 0; tti->usage = mem->alloc_bytes(mem, - sizeof(ttfSubGlyphUsage) * this->nMaxComponents * MAX_SUBGLYPH_NESTING, + sizeof(ttfSubGlyphUsage) * self->nMaxComponents * MAX_SUBGLYPH_NESTING, "ttfFont__Open"); if (tti->usage == NULL) return fMemoryError; - tti->usage_size = this->nMaxComponents * MAX_SUBGLYPH_NESTING; + tti->usage_size = self->nMaxComponents * MAX_SUBGLYPH_NESTING; } - this->face = mem->alloc_struct(mem, (const ttfMemoryDescriptor *)&st_TFace, "ttfFont__Open"); - if (this->face == NULL) + self->face = mem->alloc_struct(mem, (const ttfMemoryDescriptor *)&st_TFace, "ttfFont__Open"); + if (self->face == NULL) return fMemoryError; - memset(this->face, 0, sizeof(*this->face)); - this->face->r = r; - this->face->font = this; - this->exec = tti->exec; - code = Face_Create(this->face); + memset(self->face, 0, sizeof(*self->face)); + self->face->r = r; + self->face->font = self; + self->exec = tti->exec; + code = Face_Create(self->face); if (code) return fMemoryError; code = r->Error(r); if (code < 0) return fBadFontData; - this->inst = mem->alloc_struct(mem, (const ttfMemoryDescriptor *)&st_TInstance, "ttfFont__Open"); - if (this->inst == NULL) + self->inst = mem->alloc_struct(mem, (const ttfMemoryDescriptor *)&st_TInstance, "ttfFont__Open"); + if (self->inst == NULL) return fMemoryError; - memset(this->inst, 0, sizeof(*this->inst)); - code = Context_Create(this->exec, this->face); /* See comment in the implementation of Context_Create. */ + memset(self->inst, 0, sizeof(*self->inst)); + code = Context_Create(self->exec, self->face); /* See comment in the implementation of Context_Create. */ if (code == TT_Err_Out_Of_Memory) return fMemoryError; - code = Instance_Create(this->inst, this->face); + code = Instance_Create(self->inst, self->face); if (code == TT_Err_Out_Of_Memory) return fMemoryError; if (code) return fBadFontData; - for(k = 0; k < this->face->cvtSize; k++) - this->inst->cvt[k] = shortToF26Dot6(this->face->cvt[k]); - code = Instance_Init(this->inst); + for(k = 0; k < self->face->cvtSize; k++) + self->inst->cvt[k] = shortToF26Dot6(self->face->cvt[k]); + code = Instance_Init(self->inst); if (code == TT_Err_Out_Of_Memory) return fMemoryError; if (code >= TT_Err_Invalid_Opcode && code <= TT_Err_Invalid_Displacement) code1 = fBadInstruction; else if (code) return fBadFontData; - I.z = this->inst; + I.z = self->inst; if (design_grid) - ww = hh = shortToF26Dot6(this->nUnitsPerEm); + ww = hh = shortToF26Dot6(self->nUnitsPerEm); else { /* Round towards zero for a better view of mirrored characters : */ ww = floatToF26Dot6(w); hh = floatToF26Dot6(h); } code = TT_Set_Instance_CharSizes(I, ww, hh); - this->inst->metrics = this->exec->metrics; + self->inst->metrics = self->exec->metrics; if (code == TT_Err_Invalid_Engine) return fPatented; if (code == TT_Err_Out_Of_Memory) @@ -356,18 +356,18 @@ return code; } -static void ttfFont__StartGlyph(ttfFont *this) -{ Context_Load( this->exec, this->inst ); - if ( this->inst->GS.instruct_control & 2 ) - this->exec->GS = Default_GraphicsState; +static void ttfFont__StartGlyph(ttfFont *self) +{ Context_Load( self->exec, self->inst ); + if ( self->inst->GS.instruct_control & 2 ) + self->exec->GS = Default_GraphicsState; else - this->exec->GS = this->inst->GS; - this->tti->usage_top = 0; + self->exec->GS = self->inst->GS; + self->tti->usage_top = 0; } -static void ttfFont__StopGlyph(ttfFont *this) +static void ttfFont__StopGlyph(ttfFont *self) { - Context_Save(this->exec, this->inst); + Context_Save(self->exec, self->inst); } /*-------------------------------------------------------------------*/ @@ -450,15 +450,15 @@ /*-------------------------------------------------------------------*/ -void ttfOutliner__init(ttfOutliner *this, ttfFont *f, ttfReader *r, ttfExport *exp, +void ttfOutliner__init(ttfOutliner *self, ttfFont *f, ttfReader *r, ttfExport *exp, bool bOutline, bool bFirst, bool bVertical) { - this->r = r; - this->bOutline = bOutline; - this->bFirst = bFirst; - this->pFont = f; - this->bVertical = bVertical; - this->exp = exp; + self->r = r; + self->bOutline = bOutline; + self->bFirst = bFirst; + self->pFont = f; + self->bVertical = bVertical; + self->exp = exp; } static void MoveGlyphOutline(TGlyph_Zone *pts, int nOffset, ttfGlyphOutline *out, FixMatrix *m) @@ -478,10 +478,10 @@ } } -static FontError ttfOutliner__BuildGlyphOutlineAux(ttfOutliner *this, int glyphIndex, +static FontError ttfOutliner__BuildGlyphOutlineAux(ttfOutliner *self, int glyphIndex, FixMatrix *m_orig, ttfGlyphOutline* gOutline) -{ ttfFont *pFont = this->pFont; - ttfReader *r = this->r; +{ ttfFont *pFont = self->pFont; + ttfReader *r = self->r; ttfInterpreter *tti = pFont->tti; short sideBearing; FontError error = fNoError; @@ -498,16 +498,16 @@ const byte *glyph = NULL; int glyph_size; - if (r->get_metrics(r, glyphIndex, this->bVertical, &sideBearing, &nAdvance) < 0) { + if (r->get_metrics(r, glyphIndex, self->bVertical, &sideBearing, &nAdvance) < 0) { /* fixme: the error code is missing due to interface restrictions. */ goto errex; } gOutline->sideBearing = shortToF26Dot6(sideBearing); gOutline->advance.x = shortToF26Dot6(nAdvance); gOutline->advance.y = 0; - this->bFirst = FALSE; + self->bFirst = FALSE; - if (!this->bOutline) + if (!self->bOutline) return fNoError; if (!r->LoadGlyph(r, glyphIndex, &glyph, &glyph_size)) return fGlyphNotFound; @@ -623,7 +623,7 @@ pts->touch += nPointsStored; pts->contours += nContoursStored; tti->usage_top += nUsage; - code = ttfOutliner__BuildGlyphOutlineAux(this, e->index, m_orig, &out); + code = ttfOutliner__BuildGlyphOutlineAux(self, e->index, m_orig, &out); pts->org_x -= nPointsStored; pts->org_y -= nPointsStored; pts->cur_x -= nPointsStored; @@ -713,7 +713,7 @@ unsigned int nPos; unsigned int n_ins; - if (this->nContoursTotal + gOutline->contourCount > exec->n_contours) { + if (self->nContoursTotal + gOutline->contourCount > exec->n_contours) { error = fBadFontData; goto ex; } endPoints = pts->contours; @@ -724,7 +724,7 @@ error = fBadFontData; goto ex; } nPoints = gOutline->pointCount = endPoints[gOutline->contourCount - 1] + 1; - if (this->nPointsTotal + nPoints + 2 > exec->n_points) { + if (self->nPointsTotal + nPoints + 2 > exec->n_points) { error = fBadFontData; goto ex; } n_ins = ttfReader__Short(r); @@ -745,7 +745,7 @@ } } /* Lets do X */ - { short coord = (this->bVertical ? 0 : sideBearing - subglyph.bbox.xMin); + { short coord = (self->bVertical ? 0 : sideBearing - subglyph.bbox.xMin); F26Dot6* x = pts->org_x; onCurve = pts->touch; while (onCurve < stop) { @@ -778,8 +778,8 @@ } } MoveGlyphOutline(pts, 0, gOutline, m_orig); - this->nContoursTotal += gOutline->contourCount; - this->nPointsTotal += nPoints; + self->nContoursTotal += gOutline->contourCount; + self->nPointsTotal += nPoints; if (!skip_instructions && !r->Error(r) && n_ins && bInsOK && !(pFont->inst->GS.instruct_control & 1)) { TGlyph_Zone *pts = &exec->pts; @@ -832,7 +832,7 @@ return error; } -static FontError ttfOutliner__BuildGlyphOutline(ttfOutliner *this, int glyphIndex, +static FontError ttfOutliner__BuildGlyphOutline(ttfOutliner *self, int glyphIndex, float orig_x, float orig_y, ttfGlyphOutline* gOutline) { FixMatrix m_orig = {1 << 16, 0, 0, 1 << 16, 0, 0}; @@ -840,16 +840,16 @@ /* Round towards zero like old character coordinate conversions do. */ m_orig.tx = floatToF16Dot16(orig_x); m_orig.ty = floatToF16Dot16(orig_y); - return ttfOutliner__BuildGlyphOutlineAux(this, glyphIndex, &m_orig, gOutline); + return ttfOutliner__BuildGlyphOutlineAux(self, glyphIndex, &m_orig, gOutline); } #define AVECTOR_BUG 1 /* Work around a bug in AVector fonts. */ -void ttfOutliner__DrawGlyphOutline(ttfOutliner *this) -{ ttfGlyphOutline* out = &this->out; - FloatMatrix *m = &this->post_transform; - ttfFont *pFont = this->pFont; - ttfExport *exp = this->exp; +void ttfOutliner__DrawGlyphOutline(ttfOutliner *self) +{ ttfGlyphOutline* out = &self->out; + FloatMatrix *m = &self->post_transform; + ttfFont *pFont = self->pFont; + ttfExport *exp = self->exp; TExecution_Context *exec = pFont->exec; TGlyph_Zone *pts = &exec->pts; short* endP = pts->contours; @@ -867,8 +867,8 @@ # endif TransformF26Dot6PointFloat(&p1, out->advance.x, out->advance.y, m); - p1.x -= this->post_transform.tx; - p1.y -= this->post_transform.ty; + p1.x -= self->post_transform.tx; + p1.y -= self->post_transform.ty; exp->SetWidth(exp, &p1); sp = -1; for (ctr = out->contourCount; ctr != 0; --ctr) { @@ -914,7 +914,7 @@ px = AVE(x[0], x[ep]); py = AVE(y[0], y[ep]); } - this->ppx = px; this->ppy = py; + self->ppx = px; self->ppy = py; TransformF26Dot6PointFloat(&p0, px, py, m); exp->MoveTo(exp, &p0); @@ -925,10 +925,10 @@ if (onCurve[prevIndex] & 1) { px = x[pt]; py = y[pt]; - if (this->ppx != px || this->ppy != py) { + if (self->ppx != px || self->ppy != py) { TransformF26Dot6PointFloat(&p1, px, py, m); exp->LineTo(exp, &p1); - this->ppx = px; this->ppy = py; + self->ppx = px; self->ppy = py; p0 = p1; } } @@ -957,7 +957,7 @@ nextX = AVE(px, x[nextIndex]); nextY = AVE(py, y[nextIndex]); } - if (this->ppx != nextX || this->ppy != nextY) { + if (self->ppx != nextX || self->ppy != nextY) { double dx1, dy1, dx2, dy2, dx3, dy3; const double prec = 1e-6; @@ -972,7 +972,7 @@ exp->CurveTo(exp, &p1, &p2, &p3); else exp->LineTo(exp, &p3); - this->ppx = nextX; this->ppy = nextY; + self->ppx = nextX; self->ppy = nextY; p0 = p3; } } @@ -986,28 +986,28 @@ } } -FontError ttfOutliner__Outline(ttfOutliner *this, int glyphIndex, +FontError ttfOutliner__Outline(ttfOutliner *self, int glyphIndex, float orig_x, float orig_y, FloatMatrix *m1) -{ ttfFont *pFont = this->pFont; +{ ttfFont *pFont = self->pFont; FontError error; - this->post_transform = *m1; - this->out.contourCount = 0; - this->out.pointCount = 0; - this->out.bCompound = FALSE; - this->nPointsTotal = 0; - this->nContoursTotal = 0; - this->out.advance.x = this->out.advance.y = 0; + self->post_transform = *m1; + self->out.contourCount = 0; + self->out.pointCount = 0; + self->out.bCompound = FALSE; + self->nPointsTotal = 0; + self->nContoursTotal = 0; + self->out.advance.x = self->out.advance.y = 0; ttfFont__StartGlyph(pFont); - error = ttfOutliner__BuildGlyphOutline(this, glyphIndex, orig_x, orig_y, &this->out); + error = ttfOutliner__BuildGlyphOutline(self, glyphIndex, orig_x, orig_y, &self->out); ttfFont__StopGlyph(pFont); if (pFont->nUnitsPerEm <= 0) pFont->nUnitsPerEm = 1024; if (pFont->design_grid) { - this->post_transform.a /= pFont->nUnitsPerEm; - this->post_transform.b /= pFont->nUnitsPerEm; - this->post_transform.c /= pFont->nUnitsPerEm; - this->post_transform.d /= pFont->nUnitsPerEm; + self->post_transform.a /= pFont->nUnitsPerEm; + self->post_transform.b /= pFont->nUnitsPerEm; + self->post_transform.c /= pFont->nUnitsPerEm; + self->post_transform.d /= pFont->nUnitsPerEm; } if (error != fNoError && error != fPatented) return error; diff -Nru ghostscript-9.04~dfsg/base/ugcclib.mak ghostscript-9.05~dfsg~20120125/base/ugcclib.mak --- ghostscript-9.04~dfsg/base/ugcclib.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/ugcclib.mak 2011-10-06 06:43:10.000000000 +0000 @@ -39,6 +39,7 @@ # We don't expect to build debug or profiling configurations.... DEBUGDIRPREFIX= +MEMENTODIRPREFIX= PGDIRPREFIX= JSRCDIR=jpeg @@ -76,11 +77,6 @@ IJSSRCDIR=ijs IJSEXECTYPE=unix -# Define the directory where the imdi library source is stored. -# See devs.mak for more information - -IMDISRCDIR=imdi - # Define how to build the library archives. (These are not used in any # standard configuration.) diff -Nru ghostscript-9.04~dfsg/base/unixansi.mak ghostscript-9.05~dfsg~20120125/base/unixansi.mak --- ghostscript-9.04~dfsg/base/unixansi.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/unixansi.mak 2012-01-25 08:44:24.000000000 +0000 @@ -100,6 +100,7 @@ # the standard binaries. DEBUGDIRPREFIX=debug +MEMENTODIRPREFIX=mem PGDIRPREFIX=pg # Define whether to compile in the FreeType library, and if so, where @@ -186,7 +187,7 @@ # Which CMS are we using? # Options are currently lcms or lcms2 -WHICH_CMS=lcms +WHICH_CMS=lcms2 # Define the directory where the ijs source is stored, # and the process forking method to use for the server. @@ -197,11 +198,6 @@ IJSSRCDIR=ijs IJSEXECTYPE=unix -# Define the directory where the imdi library source is stored. -# See devs.mak for more information - -IMDISRCDIR=imdi - # Define how to build the library archives. (These are not used in any # standard configuration.) @@ -360,7 +356,7 @@ DEVICE_DEVS13=$(DD)pngmono.dev $(DD)pngmonod.dev $(DD)pnggray.dev $(DD)png16.dev $(DD)png256.dev $(DD)png16m.dev $(DD)pngalpha.dev DEVICE_DEVS14=$(DD)jpeg.dev $(DD)jpeggray.dev $(DD)jpegcmyk.dev DEVICE_DEVS15=$(DD)pdfwrite.dev $(DD)pswrite.dev $(DD)ps2write.dev $(DD)epswrite.dev $(DD)txtwrite.dev $(DD)pxlmono.dev $(DD)pxlcolor.dev -DEVICE_DEVS16=$(DD)bbox.dev +DEVICE_DEVS16=$(DD)bbox.dev $(DD)inkcov.dev # Overflow from DEVS9 DEVICE_DEVS17=$(DD)pnm.dev $(DD)pnmraw.dev $(DD)ppm.dev $(DD)ppmraw.dev $(DD)pkm.dev $(DD)pkmraw.dev $(DD)pksm.dev $(DD)pksmraw.dev $(DD)pamcmyk32.dev DEVICE_DEVS18= diff -Nru ghostscript-9.04~dfsg/base/unix-aux.mak ghostscript-9.05~dfsg~20120125/base/unix-aux.mak --- ghostscript-9.04~dfsg/base/unix-aux.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/unix-aux.mak 2011-09-29 11:01:34.000000000 +0000 @@ -118,6 +118,8 @@ if ( test -f $(INCLUDE)/ndir.h ); then $(ECHOGS_XE) -a $(gconfig__h) -x 23 define HAVE_NDIR_H; else true; fi if ( test -f $(INCLUDE)/sys/dir.h ); then $(ECHOGS_XE) -a $(gconfig__h) -x 23 define HAVE_SYS_DIR_H; else true; fi if ( test -f $(INCLUDE)/sys/ndir.h ); then $(ECHOGS_XE) -a $(gconfig__h) -x 23 define HAVE_SYS_NDIR_H; else true; fi - if ( test -f $(INCLUDE)/sys/time.h ); then $(ECHOGS_XE) -a $(gconfig__h) -x 23 define HAVE_SYS_TIME_H; else true; fi + if ( test -f $(INCLUDE)/sys/time.h ); then $(ECHOGS_XE) -a $(gconfig__h) -x 23 ifndef HAVE_SYS_TIME_H ; \ + $(ECHOGS_XE) -a $(gconfig__h) -x 23 define HAVE_SYS_TIME_H ; \ + $(ECHOGS_XE) -a $(gconfig__h) -x 23 endif; else true; fi if ( test -f $(INCLUDE)/sys/times.h ); then $(ECHOGS_XE) -a $(gconfig__h) -x 23 define HAVE_SYS_TIMES_H; else true; fi if ( test -f $(JSRCDIR)/jmemsys.h); then true; else $(ECHOGS_XE) -a $(gconfig__h) -x 23 define DONT_HAVE_JMEMSYS_H; fi diff -Nru ghostscript-9.04~dfsg/base/unix-dll.mak ghostscript-9.05~dfsg~20120125/base/unix-dll.mak --- ghostscript-9.04~dfsg/base/unix-dll.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/unix-dll.mak 2011-10-06 06:43:10.000000000 +0000 @@ -63,7 +63,7 @@ #GS_SONAME_MAJOR=$(GS_SONAME_BASE).$(GS_VERSION_MAJOR).$(GS_SOEXT) #GS_SONAME_MAJOR_MINOR=$(GS_SONAME_BASE).$(GS_VERSION_MAJOR).$(GS_VERSION_MINOR).$(GS_SOEXT) #LDFLAGS_SO=-dynamiclib -flat_namespace -#LDFLAGS_SO=-dynamiclib -install_name $(GS_SONAME_MAJOR_MINOR) +LDFLAGS_SO_MAC=-dynamiclib -install_name $(GS_SONAME_MAJOR_MINOR) #LDFLAGS_SO=-dynamiclib -install_name $(FRAMEWORK_NAME) GS_SO=$(BINDIR)/$(GS_SONAME) @@ -108,14 +108,14 @@ @if test -z "$(MAKE)" -o -z "`$(MAKE) --version 2>&1 | grep GNU`";\ then echo "Warning: this target requires gmake";\ fi - $(MAKE) so-subtarget BUILDDIRPREFIX=$(SODIRPREFIX) + $(MAKE) so-subtarget$(FOR_MAC) BUILDDIRPREFIX=$(SODIRPREFIX) # Debug shared object sodebug: @if test -z "$(MAKE)" -o -z "`$(MAKE) --version 2>&1 | grep GNU`";\ then echo "Warning: this target requires gmake";\ fi - $(MAKE) so-subtarget GENOPT='-DDEBUG' BUILDDIRPREFIX=$(SODEBUGDIRPREFIX) + $(MAKE) so-subtarget$(FOR_MAC) GENOPT='-DDEBUG' BUILDDIRPREFIX=$(SODEBUGDIRPREFIX) so-subtarget: $(MAKE) $(SODEFS) GENOPT='$(GENOPT)' LDFLAGS='$(LDFLAGS)'\ @@ -131,13 +131,29 @@ CFLAGS='$(CFLAGS_STANDARD) $(GCFLAGS) $(XCFLAGS)' prefix=$(prefix)\ $(GSSOC_XE) $(GSSOX_XE) +# special so-subtarget for MAC OS X +so-subtarget_1: + $(MAKE) $(SODEFS) GENOPT='$(GENOPT)' LDFLAGS='$(LDFLAGS)'\ + CFLAGS='$(CFLAGS_STANDARD) $(GCFLAGS) $(XCFLAGS)' prefix=$(prefix)\ + directories + $(MAKE) $(SODEFS) GENOPT='$(GENOPT)' LDFLAGS='$(LDFLAGS)'\ + CFLAGS='$(CFLAGS_STANDARD) $(GCFLAGS) $(XCFLAGS)' prefix=$(prefix)\ + $(AUXDIR)/echogs$(XEAUX) $(AUXDIR)/genarch$(XEAUX) + $(MAKE) $(SODEFS) GENOPT='$(GENOPT)' LDFLAGS='$(LDFLAGS) $(LDFLAGS_SO_MAC)'\ + CFLAGS='$(CFLAGS_STANDARD) $(CFLAGS_SO) $(GCFLAGS) $(XCFLAGS)'\ + prefix=$(prefix) + $(MAKE) $(SODEFS) GENOPT='$(GENOPT)' LDFLAGS='$(LDFLAGS)'\ + CFLAGS='$(CFLAGS_STANDARD) $(GCFLAGS) $(XCFLAGS)' prefix=$(prefix)\ + $(GSSOC_XE) $(GSSOX_XE) + + install-so: $(MAKE) install-so-subtarget BUILDDIRPREFIX=$(SODIRPREFIX) install-sodebug: $(MAKE) install-so-subtarget GENOPT='-DDEBUG' BUILDDIRPREFIX=$(SODEBUGDIRPREFIX) -install-so-subtarget: so-subtarget +install-so-subtarget: so-subtarget$(FOR_MAC) -mkdir -p $(DESTDIR)$(prefix) -mkdir -p $(DESTDIR)$(datadir) -mkdir -p $(DESTDIR)$(gsdir) diff -Nru ghostscript-9.04~dfsg/base/unix-end.mak ghostscript-9.05~dfsg~20120125/base/unix-end.mak --- ghostscript-9.04~dfsg/base/unix-end.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/unix-end.mak 2011-10-06 06:43:10.000000000 +0000 @@ -45,6 +45,17 @@ debugclean: $(MAKE) $(DEBUGDEFS) clean +# Define a rule for building memento configurations. +MEMENTODEFS=GENOPT='-DMEMENTO -DDEBUG' \ + CFLAGS='$(CFLAGS_DEBUG) $(GCFLAGS) $(XCFLAGS)'\ + BUILDDIRPREFIX=$(MEMENTODIRPREFIX) + +memento: + $(MAKE) $(MEMENTODEFS) default + +mementoclean: + $(MAKE) $(MEMENTODEFS) clean + # Emacs tags maintenance. TAGS: diff -Nru ghostscript-9.04~dfsg/base/unix-gcc.mak ghostscript-9.05~dfsg~20120125/base/unix-gcc.mak --- ghostscript-9.04~dfsg/base/unix-gcc.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/unix-gcc.mak 2012-01-25 08:44:24.000000000 +0000 @@ -113,6 +113,7 @@ # the standard binaries. DEBUGDIRPREFIX=debug +MEMENTODIRPREFIX=mem PGDIRPREFIX=pg # Define whether to compile in the FreeType library, and if so, where @@ -199,7 +200,7 @@ # Which CMS are we using? # Options are currently lcms or lcms2 -WHICH_CMS=lcms +WHICH_CMS=lcms2 # Define the directory where the ijs source is stored, # and the process forking method to use for the server. @@ -213,11 +214,6 @@ # Define how to build the library archives. (These are not used in any # standard configuration.) -# Define the directory where the imdi library source is stored. -# See devs.mak for more information - -IMDISRCDIR=imdi - AR=ar ARFLAGS=qc RANLIB=ranlib @@ -413,7 +409,7 @@ DEVICE_DEVS13=$(DD)pngmono.dev $(DD)pngmonod.dev $(DD)pnggray.dev $(DD)png16.dev $(DD)png256.dev $(DD)png16m.dev $(DD)pngalpha.dev DEVICE_DEVS14=$(DD)jpeg.dev $(DD)jpeggray.dev $(DD)jpegcmyk.dev DEVICE_DEVS15=$(DD)pdfwrite.dev $(DD)pswrite.dev $(DD)ps2write.dev $(DD)epswrite.dev $(DD)txtwrite.dev $(DD)pxlmono.dev $(DD)pxlcolor.dev -DEVICE_DEVS16=$(DD)bbox.dev +DEVICE_DEVS16=$(DD)bbox.dev $(DD)inkcov.dev DEVICE_DEVS17=$(DD)plan.dev $(DD)planm.dev $(DD)plang.dev $(DD)planc.dev $(DD)plank.dev diff -Nru ghostscript-9.04~dfsg/base/unixinst.mak ghostscript-9.05~dfsg~20120125/base/unixinst.mak --- ghostscript-9.04~dfsg/base/unixinst.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/unixinst.mak 2012-01-25 08:44:24.000000000 +0000 @@ -130,7 +130,8 @@ Fonts.htm Helpers.htm Hershey.htm \ History1.htm History2.htm History3.htm History4.htm \ History5.htm History6.htm History7.htm History8.htm \ - Details.htm Details8.htm \ + History9.htm \ + Details.htm Details8.htm Details9.htm \ Htmstyle.htm Humor.htm Issues.htm Install.htm Language.htm \ Lib.htm Maintain.htm Make.htm New-user.htm \ News.htm Projects.htm Ps-style.htm Ps2epsi.htm Ps2pdf.htm \ @@ -146,7 +147,7 @@ # install the man pages for each locale MAN_LCDIRS=. de MAN1_LINKS_PS2PS=eps2eps -MAN1_LINKS_PS2PDF=ps2pdf12 ps2pdf13 +MAN1_LINKS_PS2PDF=ps2pdf12 ps2pdf13 ps2pdf14 MAN1_LINKS_GSLP=gsbj gsdj gsdj500 gslj install-man: $(PSMANDIR)/gs.1 $(SH) -c 'test -d $(DESTDIR)$(mandir) || mkdir -p $(DESTDIR)$(mandir)' @@ -167,7 +168,7 @@ ln -s ps2pdf.$(man1ext) $$f.$(man1ext) ) ;\ done ;\ fi ;\ - if ( test -f $$man1dir/ps2lp.$(man1ext) ) ;\ + if ( test -f $$man1dir/gslp.$(man1ext) ) ;\ then for f in $(MAN1_LINKS_GSLP) ;\ do ( cd $$man1dir; rm -f $$f.$(man1ext) ;\ ln -s gslp.$(man1ext) $$f.$(man1ext) ) ;\ diff -Nru ghostscript-9.04~dfsg/base/version.mak ghostscript-9.05~dfsg~20120125/base/version.mak --- ghostscript-9.04~dfsg/base/version.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/version.mak 2011-09-29 11:01:34.000000000 +0000 @@ -16,10 +16,10 @@ # Major and minor version numbers. # MINOR0 is different from MINOR only if MINOR is a single digit. GS_VERSION_MAJOR=9 -GS_VERSION_MINOR=04 -GS_VERSION_MINOR0=04 +GS_VERSION_MINOR=05 +GS_VERSION_MINOR0=05 # Revision date: year x 10000 + month x 100 + day. -GS_REVISIONDATE=20110805 +GS_REVISIONDATE=20110330 # Derived values GS_VERSION=$(GS_VERSION_MAJOR)$(GS_VERSION_MINOR0) GS_DOT_VERSION=$(GS_VERSION_MAJOR).$(GS_VERSION_MINOR0) diff -Nru ghostscript-9.04~dfsg/base/winlib.mak ghostscript-9.05~dfsg~20120125/base/winlib.mak --- ghostscript-9.04~dfsg/base/winlib.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/winlib.mak 2012-01-25 08:44:24.000000000 +0000 @@ -111,7 +111,7 @@ # Which CMS are we using? !ifndef WHICH_CMS -WHICH_CMS=lcms +WHICH_CMS=lcms2 !endif # Define the files to be removed by `make clean'. @@ -140,6 +140,7 @@ !include $(GLSRCDIR)\jasper.mak !include $(GLSRCDIR)\ldf_jb2.mak !include $(GLSRCDIR)\lwf_jp2.mak +!include $(GLSRCDIR)\openjpeg.mak !include $(GLSRCDIR)\icclib.mak !include $(GLSRCDIR)\$(WHICH_CMS).mak !include $(GLSRCDIR)\ijs.mak @@ -206,7 +207,7 @@ $(GLOBJ)gp_mshdl.$(OBJ): $(GLSRC)gp_mshdl.c $(AK)\ $(ctype__h) $(errno__h) $(stdio__h) $(string__h)\ - $(gserror_h) $(gsmemory_h) $(gstypes_h) $(gxiodev_h) + $(gsmemory_h) $(gstypes_h) $(gxiodev_h) $(gserrors_h) $(GLCC) $(GLO_)gp_mshdl.$(OBJ) $(C_) $(GLSRC)gp_mshdl.c # Define MS-Windows printer (file system) as a separable feature. @@ -218,7 +219,7 @@ $(GLOBJ)gp_msprn.$(OBJ): $(GLSRC)gp_msprn.c $(AK)\ $(ctype__h) $(errno__h) $(stdio__h) $(string__h)\ - $(gserror_h) $(gsmemory_h) $(gstypes_h) $(gxiodev_h) + $(gsmemory_h) $(gstypes_h) $(gxiodev_h) $(GLCCWIN) $(GLO_)gp_msprn.$(OBJ) $(C_) $(GLSRC)gp_msprn.c # Define MS-Windows polling as a separable feature diff -Nru ghostscript-9.04~dfsg/base/wtsimdi.c ghostscript-9.05~dfsg~20120125/base/wtsimdi.c --- ghostscript-9.04~dfsg/base/wtsimdi.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/base/wtsimdi.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,79 +0,0 @@ -/* Copyright (C) 2005-2006 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ - -/* $Id$ */ - -/* - * Create an imdi memory device for page or band buffering, - * possibly preceded by a plane extraction device. - */ -int -wtsimdi_create_buf_device(gx_device **pbdev, gx_device *target, - const gx_render_plane_t *render_plane, gs_memory_t *mem, bool for_band) -{ - int plane_index = (render_plane ? render_plane->index : -1); - int depth; - const gx_device_memory *mdproto; - gx_device_memory *mdev; - - if (plane_index >= 0) - depth = render_plane->depth; - else - depth = target->color_info.depth; - mdproto = gdev_mem_device_for_bits(depth); - if (mdproto == 0) - return_error(gs_error_rangecheck); - if (mem) { - mdev = gs_alloc_struct(mem, gx_device_memory, &st_device_memory, - "create_buf_device"); - if (mdev == 0) - return_error(gs_error_VMerror); - } else { - mdev = (gx_device_memory *)*pbdev; - } - if (target == (gx_device *)mdev) { - /* The following is a special hack for setting up printer devices. */ - assign_dev_procs(mdev, mdproto); - check_device_separable((gx_device *)mdev); - gx_device_fill_in_procs((gx_device *)mdev); - } else - gs_make_mem_device(mdev, mdproto, mem, (for_band ? 1 : 0), - (target == (gx_device *)mdev ? NULL : target)); - mdev->width = target->width; - /* - * The matrix in the memory device is irrelevant, - * because all we do with the device is call the device-level - * output procedures, but we may as well set it to - * something halfway reasonable. - */ - gs_deviceinitialmatrix(target, &mdev->initial_matrix); - /****** QUESTIONABLE, BUT BETTER THAN OMITTING ******/ - mdev->color_info = target->color_info; - *pbdev = (gx_device *)mdev; - return 0; -} - -#define wtsimdi_prn_procs(print_page)\ - { print_page,\ - gx_default_print_page_copies,\ - { wtsimdi_create_buf_device,\ - gx_default_size_buf_device,\ - gx_default_setup_buf_device,\ - gx_default_destroy_buf_device\ - },\ - gdev_prn_default_get_space_params,\ - gx_default_start_render_thread,\ - gx_default_open_render_device,\ - gx_default_close_render_device,\ - gx_default_buffer_page\ - } diff -Nru ghostscript-9.04~dfsg/configure ghostscript-9.05~dfsg~20120125/configure --- ghostscript-9.04~dfsg/configure 2011-08-05 11:12:44.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/configure 1970-01-01 00:00:00.000000000 +0000 @@ -1,11072 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.67. -# -# -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software -# Foundation, Inc. -# -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in #( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - # We cannot yet assume a decent shell, so we have to provide a - # neutralization value for shells without unset; and this also - # works around shells that cannot unset nonexistent variables. - BASH_ENV=/dev/null - ENV=/dev/null - (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, -$0: including any error possibly output before this -$0: message. Then install a modern shell, or manually run -$0: the script under such a shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -test -n "$DJDIR" || exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIBOBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= - -# Identity of this package. -PACKAGE_NAME= -PACKAGE_TARNAME= -PACKAGE_VERSION= -PACKAGE_STRING= -PACKAGE_BUGREPORT= -PACKAGE_URL= - -ac_unique_file="psi/gs.c" -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='LTLIBOBJS -GCFLAGS -DBG_CFLAGS -OPT_CFLAGS -HAVE_BYTESWAP_H -HAVE_BSWAP32 -HAVE_SSE2 -HAVE_SETLOCALE -HAVE_MKSTEMP64 -HAVE_FILE64 -HAVE_MKSTEMP -fontpath -X11_DEVS -INSTALL_SHARED -DYNAMIC_LIBS -DYNAMIC_LDFLAGS -DYNAMIC_FLAGS -DYNAMIC_DEVS -DYNAMIC_CFLAGS -PNG_DEVS -IJS_DEVS -JBIG2_DEVS -SVG_DEVS -CUPS_DEVS -F_DEVS -P_DEVS -COMPILE_INITS -GS -XLIBS -X_LDFLAGS -X_EXTRA_LIBS -X_LIBS -X_PRE_LIBS -X_CFLAGS -XMKMF -OMNIDEVS -SOC_LOADER -SOC_LIBS -SOC_CFLAGS -GTKCONFIG -JPXDEVS -SHARE_JASPER -JPXDIR -JPX_AUTOCONF_CFLAGS -JPX_DECODER -JBIG2_AUTOCONF_CFLAGS -JBIG2DEVS -SHARE_JBIG2 -JBIG2DIR -JBIG2_DECODER -IJSLIB -SHAREIJS -IJSDIR -CUPSPDFTORASTER -LCUPSIINCLUDE -LCUPSINCLUDE -LCUPSBUILDTYPE -SHARELCUPSI -SHARELCUPS -CUPSINSTALL -CUPSDATA -CUPSSERVERROOT -CUPSSERVERBIN -CUPSINCLUDE -CUPSLIBDIRS -CUPSLIBS -CUPSCFLAGS -CUPSCONFIG -LIBTIFFDIR -TIFFDEVS -SHARE_LIBTIFF -LCMS2DIR -LCMSDIR -SHARELCMS -LIBPNGDIR -SHARE_LIBPNG -FT_SYS_ZLIB -ZLIBDIR -SHARE_ZLIB -LIBJPEGDIR -SHARE_LIBJPEG -FT_LIBS -FT_CFLAGS -FTSRCDIR -SHARE_FT -FT_BRIDGE -UFST_LIB_EXT -UFST_CFLAGS -UFST_ROOT -INSERT_UFST_BRIDGE_EQUAL_ONE -DBUS_LIBS -DBUS_CFLAGS -HAVE_DBUS -FONTCONFIG_LIBS -FONTCONFIG_CFLAGS -HAVE_FONTCONFIG -UTF8DEVS -HAVE_LIBIDN -PTHREAD_LIBS -SYNC -LIBOBJS -OBJDIR_BSDMAKE_WORKAROUND -EGREP -GREP -SET_DT_SONAME -INSTALL_CONTRIB -CONTRIBINCLUDE -PKGCONFIG -RANLIB -SED_EXTENDED_REGEX_OPT -SED -CPP -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_contrib -with_libiconv -with_libidn -with_libpaper -enable_fontconfig -enable_dbus -enable_freetype -with_ufst -with_system_libtiff -enable_cups -with_pdftoraster -with_local_cups -with_install_cups -with_ijs -with_luratech -with_jbig2dec -with_jasper -enable_gtk -with_omni -with_x -with_gs -enable_compile_inits -with_drivers -with_driversfile -enable_dynamic -with_fontpath -enable_sse2 -enable_bswap32 -enable_byteswap_h -' - ac_precious_vars='build_alias -host_alias -target_alias -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CPP -XMKMF' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used" >&2 - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures this package to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -X features: - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -_ACEOF -fi - -if test -n "$ac_init_help"; then - - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-contrib Do not include contributed drivers - --disable-fontconfig Don't use fontconfig to list system fonts - --disable-dbus Do not use dbus to communicate with external - services - --disable-freetype Disable freetype for font rasterization - --disable-cups Don't include CUPS support - --disable-gtk Don't build the gtk loader - --disable-compile-inits Don't compile in initialization files - --enable-dynamic Enable dynamically loaded drivers - --disable-sse2 Do not use sse2 instrinsics - --disable-bswap32 Do not use bswap32 instrinsic - --disable-byteswap-h Do not use byteswap.h functions - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-libiconv=[no/gnu/native] - use the libiconv library - --without-libidn don't use libidn to support Unicode passwords - --without-libpaper disable libpaper support - --with-ufst=UFST_ROOT_DIR - Use UFST - --with-system-libtiff Force using the systems libtiff - --without-pdftoraster Don't include CUPS' pdftoraster filter - --with-local-cups Force using the GS supplied cups code - only useful - for debugging - --with-install-cups Install the cups conversion tools - --without-ijs disable IJS driver support - --without-luratech do not try to use the Luratech library for JBIG2 nor - JPX decoding - --without-jbig2dec disable JBIG2 decode support - --without-jasper don't use the JasPer library for JPEG 2000 - --with-omni enable the omni driver - --with-x use the X Window System - --with-gs=NAME name of the Ghostscript executible [[gs]] - --with-drivers=LIST Drivers to support, separated by commas. - Either list the drivers or use aliases: - ALL = all drivers - FILES = all file format drivers - PRINTERS = all printer drivers - Printers: - APPLE = all Apple printers - BROTHER = all Brother printers - CANON = all Canon printers - EPSON = all Epson printers - HP = all HP printers - IBM = all IBM printers - JAPAN = older japanese printers - LEXMARK = all Lexmark printers - OKI = all OKI printers - PCLXL = all PCL XL/6 printers - File formats: - BMP = Output to bmp files - FAX = Output to fax files - JPEG = Output to JPEG files - PBM = Output to PBM/PNM - PCX = Output to PCX - PNG = Output to PNG - PS = Output to PostScript/PDF - TIFF = Output to TIFF - WTS = WTS Halftoning devices - ETS = ETS Halftoning devices - You can mix both variants, e.g. - --with-drivers=HP,stcolor would build HP drivers and - the Epson stcolor driver. - Aliases must be uppercase (a 3rd party driver might - have the same name). - Default: ALL - --with-driversfile=FILE Drivers to support from file, separated by newlines. - --with-fontpath set font search path for gs - -Some influential environment variables: - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CPP C preprocessor - XMKMF Path to xmkmf, Makefile generator for X Window System - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to the package provider. -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -configure -generated by GNU Autoconf 2.67 - -Copyright (C) 2010 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -# ac_fn_c_try_compile LINENO -# -------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_compile - -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_c_try_link LINENO -# ----------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_link - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval "test \"\${$3+set}\"" = set; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_c_check_header_mongrel - -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_c_check_header_compile - -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES -# ------------------------------------------- -# Tests whether TYPE exists after having included INCLUDES, setting cache -# variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_c_check_type - -# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES -# ---------------------------------------------------- -# Tries to find if the field MEMBER exists in type AGGR, after including -# INCLUDES, setting cache variable VAR accordingly. -ac_fn_c_check_member () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 -$as_echo_n "checking for $2.$3... " >&6; } -if eval "test \"\${$4+set}\"" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$5 -int -main () -{ -static $2 ac_aggr; -if (ac_aggr.$3) -return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$4=yes" -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$5 -int -main () -{ -static $2 ac_aggr; -if (sizeof ac_aggr.$3) -return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$4=yes" -else - eval "$4=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$4 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_c_check_member - -# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES -# -------------------------------------------- -# Tries to find the compile-time value of EXPR in a program that includes -# INCLUDES, setting VAR accordingly. Returns whether the value could be -# computed -ac_fn_c_compute_int () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_lo=0 ac_mid=0 - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=$ac_mid; break -else - as_fn_arith $ac_mid + 1 && ac_lo=$as_val - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=-1 ac_mid=-1 - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_lo=$ac_mid; break -else - as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - ac_lo= ac_hi= -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=$ac_mid -else - as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in #(( -?*) eval "$3=\$ac_lo"; ac_retval=0 ;; -'') ac_retval=1 ;; -esac - else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -static long int longval () { return $2; } -static unsigned long int ulongval () { return $2; } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (($2) < 0) - { - long int i = longval (); - if (i != ($2)) - return 1; - fprintf (f, "%ld", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ($2)) - return 1; - fprintf (f, "%lu", i); - } - /* Do not output a trailing newline, as this causes \r\n confusion - on some platforms. */ - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - echo >>conftest.val; read $3 &5 -$as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_c_check_func -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by $as_me, which was -generated by GNU Autoconf 2.67. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append ac_configure_args1 " '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - $as_echo "## ---------------- ## -## Cache variables. ## -## ---------------- ##" - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - $as_echo "## ----------------- ## -## Output variables. ## -## ----------------- ##" - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## -## File substitutions. ## -## ------------------- ##" - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - $as_echo "## ----------- ## -## confdefs.h. ## -## ----------- ##" - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -$as_echo "/* confdefs.h */" > confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5 ; } - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - - - -CFLAGS="${CFLAGS:=}" -CPPFLAGS="${CPPFLAGS:=}" -CXXFLAGS="${CXXFLAGS:=}" -LDFLAGS="${LDFLAGS:=}" - - - - - - - -save_cflags=$CFLAGS -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5 ; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5 ; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5 ; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5 ; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if test "${ac_cv_objext+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5 ; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5 ; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CFLAGS=$save_cflags - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if test "${ac_cv_path_SED+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_SED_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - -SED_EXTENDED_REGEX_OPT=-nre -sed_variant=`sed --version 2>&1` -sed_variant=`echo $sed_variant|sed -e 's/ .*//'` -if test "$sed_variant" != GNU ; then -SED_EXTENDED_REGEX_OPT=-nEe -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_RANLIB+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -#AC_PROG_INSTALL - -# Extract the first word of "pkg-config", so it can be a program name with args. -set dummy pkg-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_PKGCONFIG+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $PKGCONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -PKGCONFIG=$ac_cv_path_PKGCONFIG -if test -n "$PKGCONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5 -$as_echo "$PKGCONFIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - - -# Check whether --enable-contrib was given. -if test "${enable_contrib+set}" = set; then : - enableval=$enable_contrib; -fi - -CONTRIBINCLUDE="include contrib/contrib.mak" -INSTALL_CONTRIB="install-contrib-extras" -if test x$enable_contrib = xno; then - CONTRIBINCLUDE="" - INSTALL_CONTRIB="" - CFLAGS="$CFLAGS -DNOCONTRIB" -fi - - - - -#AC_CANONICAL_HOST - -CC_OPT_FLAGS_TO_TRY="-O" -SET_DT_SONAME="-soname=" - -case `uname` in - Linux*|GNU*) - if test $ac_cv_c_compiler_gnu = yes; then - CC_OPT_FLAGS_TO_TRY="-O2" - CC_DBG_FLAGS_TO_TRY="-g -O0" - fi - ;; - *BSD) - if test $ac_cv_c_compiler_gnu = yes; then - CC_OPT_FLAGS_TO_TRY="-O2" - CC_DBG_FLAGS_TO_TRY="-g -O0" - fi - ;; - Darwin*) - if test $ac_cv_c_compiler_gnu = yes; then - CC_OPT_FLAGS_TO_TRY="-O2" - CC_DBG_FLAGS_TO_TRY="-g -O0" - fi - ;; - SunOS) - CC_OPT_FLAGS_TO_TRY="-O2" - # the trailing space is required! - if test $ac_cv_c_compiler_gnu = no; then - SET_DT_SONAME="-h " - fi - CC_DBG_FLAGS_TO_TRY="-g -O0" - ;; -esac - - - - -if test $ac_cv_c_compiler_gnu = yes; then - cflags_to_try="-Wall -Wstrict-prototypes -Wundef \ --Wmissing-declarations -Wmissing-prototypes -Wwrite-strings \ --Wno-strict-aliasing -Wdeclaration-after-statement \ --fno-builtin -fno-common" - optflags_to_try="$CC_OPT_FLAGS_TO_TRY" - dbgflags_to_try="$CC_DBG_FLAGS_TO_TRY" -else - cflags_to_try= - optflags_to_try="$CC_OPT_FLAGS_TO_TRY" - dbgflags_to_try="$CC_DBG_FLAGS_TO_TRY" -fi - -# debug configurarion is available by default with "make debug" -#AC_ARG_ENABLE([debug], AC_HELP_STRING([--enable-debug], -# [turn on debugging])) -#if test x$enable_debug = xyes; then -# optflags_to_try="-g" -# CFLAGS="-DDEBUG $CFLAGS" -#fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking supported compiler flags" >&5 -$as_echo_n "checking supported compiler flags... " >&6; } -old_cflags=$CFLAGS -echo -for flag in $optflags_to_try; do - CFLAGS="$CFLAGS $flag" - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - - echo " $flag" - OPT_CFLAGS="$OPT_CFLAGS $flag" - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - CFLAGS=$old_cflags -done -for flag in $cflags_to_try; do - CFLAGS="$CFLAGS $flag" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - - echo " $flag" - GCFLAGS="$GCFLAGS $flag" - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - CFLAGS=$old_cflags -done -old_cflags=$CFLAGS -echo -for flag in $dbgflags_to_try; do - CFLAGS="$CFLAGS $flag" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - - echo " $flag" - DBG_CFLAGS="$DBG_CFLAGS $flag" - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - CFLAGS=$old_cflags -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ...done." >&5 -$as_echo " ...done." >&6; } - - -ac_header_dirent=no -for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do - as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 -$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } -if eval "test \"\${$as_ac_Header+set}\"" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include <$ac_hdr> - -int -main () -{ -if ((DIR *) 0) -return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$as_ac_Header=yes" -else - eval "$as_ac_Header=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$as_ac_Header - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 -_ACEOF - -ac_header_dirent=$ac_hdr; break -fi - -done -# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. -if test $ac_header_dirent = dirent.h; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 -$as_echo_n "checking for library containing opendir... " >&6; } -if test "${ac_cv_search_opendir+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_func_search_save_LIBS=$LIBS -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char opendir (); -int -main () -{ -return opendir (); - ; - return 0; -} -_ACEOF -for ac_lib in '' dir; do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - fi - if ac_fn_c_try_link "$LINENO"; then : - ac_cv_search_opendir=$ac_res -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext - if test "${ac_cv_search_opendir+set}" = set; then : - break -fi -done -if test "${ac_cv_search_opendir+set}" = set; then : - -else - ac_cv_search_opendir=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 -$as_echo "$ac_cv_search_opendir" >&6; } -ac_res=$ac_cv_search_opendir -if test "$ac_res" != no; then : - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - -fi - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 -$as_echo_n "checking for library containing opendir... " >&6; } -if test "${ac_cv_search_opendir+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_func_search_save_LIBS=$LIBS -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char opendir (); -int -main () -{ -return opendir (); - ; - return 0; -} -_ACEOF -for ac_lib in '' x; do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - fi - if ac_fn_c_try_link "$LINENO"; then : - ac_cv_search_opendir=$ac_res -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext - if test "${ac_cv_search_opendir+set}" = set; then : - break -fi -done -if test "${ac_cv_search_opendir+set}" = set; then : - -else - ac_cv_search_opendir=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 -$as_echo "$ac_cv_search_opendir" >&6; } -ac_res=$ac_cv_search_opendir -if test "$ac_res" != no; then : - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - -fi - -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if test "${ac_cv_path_GREP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if test "${ac_cv_path_EGREP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if test "${ac_cv_header_stdc+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -for ac_header in errno.h fcntl.h limits.h malloc.h memory.h stdlib.h string.h strings.h sys/ioctl.h sys/param.h sys/time.h syslog.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - - -OBJDIR_BSDMAKE_WORKAROUND=obj - -case `uname` in - *BSD) - OBJDIR_BSDMAKEWORKAOROUND="notobj" - ;; -esac - - -# for gdev3b1.c (AT&T terminal interface) -ac_fn_c_check_header_mongrel "$LINENO" "sys/window.h" "ac_cv_header_sys_window_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_window_h" = x""yes; then : - -fi - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 -$as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if test "${ac_cv_c_const+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -/* FIXME: Include the comments suggested by Paul. */ -#ifndef __cplusplus - /* Ultrix mips cc rejects this. */ - typedef int charset[2]; - const charset cs; - /* SunOS 4.1.1 cc rejects this. */ - char const *const *pcpcc; - char **ppc; - /* NEC SVR4.0.2 mips cc rejects this. */ - struct point {int x, y;}; - static struct point const zero = {0,0}; - /* AIX XL C 1.02.0.0 rejects this. - It does not let you subtract one const X* pointer from another in - an arm of an if-expression whose if-part is not a constant - expression */ - const char *g = "string"; - pcpcc = &g + (g ? g-g : 0); - /* HPUX 7.0 cc rejects these. */ - ++pcpcc; - ppc = (char**) pcpcc; - pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this. */ - char *t; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; - if (s) return 0; - } - { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25, 17}; - const int *foo = &x[0]; - ++foo; - } - { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ - typedef const int *iptr; - iptr p = 0; - ++p; - } - { /* AIX XL C 1.02.0.0 rejects this saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; - } - { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; - if (!foo) return 0; - } - return !cs[0] && !zero.x; -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_const=yes -else - ac_cv_c_const=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 -$as_echo "$ac_cv_c_const" >&6; } -if test $ac_cv_c_const = no; then - -$as_echo "#define const /**/" >>confdefs.h - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 -$as_echo_n "checking for inline... " >&6; } -if test "${ac_cv_c_inline+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_inline=no -for ac_kw in inline __inline__ __inline; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __cplusplus -typedef int foo_t; -static $ac_kw foo_t static_foo () {return 0; } -$ac_kw foo_t foo () {return 0; } -#endif - -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_inline=$ac_kw -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - test "$ac_cv_c_inline" != no && break -done - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 -$as_echo "$ac_cv_c_inline" >&6; } - -case $ac_cv_c_inline in - inline | yes) ;; - *) - case $ac_cv_c_inline in - no) ac_val=;; - *) ac_val=$ac_cv_c_inline;; - esac - cat >>confdefs.h <<_ACEOF -#ifndef __cplusplus -#define inline $ac_val -#endif -_ACEOF - ;; -esac - -ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default" -if test "x$ac_cv_type_mode_t" = x""yes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define mode_t int -_ACEOF - -fi - -ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" -if test "x$ac_cv_type_off_t" = x""yes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define off_t long int -_ACEOF - -fi - -ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = x""yes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define size_t unsigned int -_ACEOF - -fi - -ac_fn_c_check_member "$LINENO" "struct stat" "st_blocks" "ac_cv_member_struct_stat_st_blocks" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_blocks" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_STAT_ST_BLOCKS 1 -_ACEOF - - -$as_echo "#define HAVE_ST_BLOCKS 1" >>confdefs.h - -else - case " $LIBOBJS " in - *" fileblocks.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS fileblocks.$ac_objext" - ;; -esac - -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 -$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } -if test "${ac_cv_header_time+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include - -int -main () -{ -if ((struct tm *) 0) -return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_time=yes -else - ac_cv_header_time=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 -$as_echo "$ac_cv_header_time" >&6; } -if test $ac_cv_header_time = yes; then - -$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 -$as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } -if test "${ac_cv_struct_tm+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include - -int -main () -{ -struct tm tm; - int *p = &tm.tm_sec; - return !p; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_struct_tm=time.h -else - ac_cv_struct_tm=sys/time.h -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 -$as_echo "$ac_cv_struct_tm" >&6; } -if test $ac_cv_struct_tm = sys/time.h; then - -$as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h - -fi - - -if test "x$ac_cv_header_stdint_h" != xyes; then - ac_fn_c_check_type "$LINENO" "int8_t" "ac_cv_type_int8_t" "#include -" -if test "x$ac_cv_type_int8_t" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_INT8_T 1 -_ACEOF - - -fi -ac_fn_c_check_type "$LINENO" "int16_t" "ac_cv_type_int16_t" "#include -" -if test "x$ac_cv_type_int16_t" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_INT16_T 1 -_ACEOF - - -fi -ac_fn_c_check_type "$LINENO" "int32_t" "ac_cv_type_int32_t" "#include -" -if test "x$ac_cv_type_int32_t" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_INT32_T 1 -_ACEOF - - -fi -ac_fn_c_check_type "$LINENO" "uint8_t" "ac_cv_type_uint8_t" "#include -" -if test "x$ac_cv_type_uint8_t" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_UINT8_T 1 -_ACEOF - - -fi -ac_fn_c_check_type "$LINENO" "uint16_t" "ac_cv_type_uint16_t" "#include -" -if test "x$ac_cv_type_uint16_t" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_UINT16_T 1 -_ACEOF - - -fi -ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "#include -" -if test "x$ac_cv_type_uint32_t" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_UINT32_T 1 -_ACEOF - - -fi - - if test "$ac_cv_type_uint8_t" = yes; then - $as_echo "#define SYS_TYPES_HAS_STDINT_TYPES 1" >>confdefs.h - - GCFLAGS="$GCFLAGS -DSYS_TYPES_HAS_STDINT_TYPES" - fi -fi - -if test "$ac_cv_c_const" != yes; then - GCFLAGS="$GCFLAGS -Dconst=" -fi -if test "x$ac_cv_header_stdint_h" = xyes; then - GCFLAGS="$GCFLAGS -DHAVE_STDINT_H" -fi - -uint64_type="none" - # The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long int" >&5 -$as_echo_n "checking size of unsigned long int... " >&6; } -if test "${ac_cv_sizeof_unsigned_long_int+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long int))" "ac_cv_sizeof_unsigned_long_int" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_unsigned_long_int" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (unsigned long int) -See \`config.log' for more details" "$LINENO" 5 ; } - else - ac_cv_sizeof_unsigned_long_int=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long_int" >&5 -$as_echo "$ac_cv_sizeof_unsigned_long_int" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_UNSIGNED_LONG_INT $ac_cv_sizeof_unsigned_long_int -_ACEOF - - - if test $ac_cv_sizeof_unsigned_long_int = 8; then - uint64_type="unsigned long int" - else - # The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long long" >&5 -$as_echo_n "checking size of unsigned long long... " >&6; } -if test "${ac_cv_sizeof_unsigned_long_long+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long long))" "ac_cv_sizeof_unsigned_long_long" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_unsigned_long_long" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (unsigned long long) -See \`config.log' for more details" "$LINENO" 5 ; } - else - ac_cv_sizeof_unsigned_long_long=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long_long" >&5 -$as_echo "$ac_cv_sizeof_unsigned_long_long" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_UNSIGNED_LONG_LONG $ac_cv_sizeof_unsigned_long_long -_ACEOF - - - if test $ac_cv_sizeof_unsigned_long_long = 8; then - uint64_type="unsigned long long" - else - # The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned __int64" >&5 -$as_echo_n "checking size of unsigned __int64... " >&6; } -if test "${ac_cv_sizeof_unsigned___int64+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned __int64))" "ac_cv_sizeof_unsigned___int64" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_unsigned___int64" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (unsigned __int64) -See \`config.log' for more details" "$LINENO" 5 ; } - else - ac_cv_sizeof_unsigned___int64=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned___int64" >&5 -$as_echo "$ac_cv_sizeof_unsigned___int64" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_UNSIGNED___INT64 $ac_cv_sizeof_unsigned___int64 -_ACEOF - - - if test $ac_cv_sizeof_unsigned___int64 = 8; then - uint64_type="unsigned __int64" - else - # The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of u_int64_t" >&5 -$as_echo_n "checking size of u_int64_t... " >&6; } -if test "${ac_cv_sizeof_u_int64_t+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (u_int64_t))" "ac_cv_sizeof_u_int64_t" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_u_int64_t" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (u_int64_t) -See \`config.log' for more details" "$LINENO" 5 ; } - else - ac_cv_sizeof_u_int64_t=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_u_int64_t" >&5 -$as_echo "$ac_cv_sizeof_u_int64_t" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_U_INT64_T $ac_cv_sizeof_u_int64_t -_ACEOF - - - if test $ac_cv_sizeof_u_int64_t = 8; then - uint64_type="u_int64_t" - fi - fi - fi - fi -if test "$uint64_type" != "none"; then - GCFLAGS="$GCFLAGS -DGX_COLOR_INDEX_TYPE=\"$uint64_type\"" -fi - - -SUBCONFIG_OPTS="" - -if test x$build_alias != x; then -SUBCONFIG_OPTS="$SUBCONFIG_OPTS --build=$build_alias" -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 -$as_echo_n "checking for cos in -lm... " >&6; } -if test "${ac_cv_lib_m_cos+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lm $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char cos (); -int -main () -{ -return cos (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_m_cos=yes -else - ac_cv_lib_m_cos=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 -$as_echo "$ac_cv_lib_m_cos" >&6; } -if test "x$ac_cv_lib_m_cos" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBM 1 -_ACEOF - - LIBS="-lm $LIBS" - -fi - - -SYNC="nosync" -PTHREAD_LIBS="" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 -$as_echo_n "checking for pthread_create in -lpthread... " >&6; } -if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_create (); -int -main () -{ -return pthread_create (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_pthread_pthread_create=yes -else - ac_cv_lib_pthread_pthread_create=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 -$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } -if test "x$ac_cv_lib_pthread_pthread_create" = x""yes; then : - - SYNC=posync; - PTHREAD_LIBS="-lpthread" - -fi - - - - - -# Check whether --with-libiconv was given. -if test "${with_libiconv+set}" = set; then : - withval=$with_libiconv; -else - with_libiconv=maybe -fi - -found_iconv=no -case $with_libiconv in - maybe) - # Check in the C library first - ac_fn_c_check_func "$LINENO" "iconv_open" "ac_cv_func_iconv_open" -if test "x$ac_cv_func_iconv_open" = x""yes; then : - with_libiconv=no; found_iconv=yes -fi - - # Check if we have GNU libiconv - if test $found_iconv = "no"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libiconv_open in -liconv" >&5 -$as_echo_n "checking for libiconv_open in -liconv... " >&6; } -if test "${ac_cv_lib_iconv_libiconv_open+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-liconv $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char libiconv_open (); -int -main () -{ -return libiconv_open (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_iconv_libiconv_open=yes -else - ac_cv_lib_iconv_libiconv_open=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_libiconv_open" >&5 -$as_echo "$ac_cv_lib_iconv_libiconv_open" >&6; } -if test "x$ac_cv_lib_iconv_libiconv_open" = x""yes; then : - with_libiconv=gnu; found_iconv=yes -fi - - fi - # Check if we have a iconv in -liconv, possibly from vendor - if test $found_iconv = "no"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv_open in -liconv" >&5 -$as_echo_n "checking for iconv_open in -liconv... " >&6; } -if test "${ac_cv_lib_iconv_iconv_open+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-liconv $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char iconv_open (); -int -main () -{ -return iconv_open (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_iconv_iconv_open=yes -else - ac_cv_lib_iconv_iconv_open=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_iconv_open" >&5 -$as_echo "$ac_cv_lib_iconv_iconv_open" >&6; } -if test "x$ac_cv_lib_iconv_iconv_open" = x""yes; then : - with_libiconv=native; found_iconv=yes -fi - - fi - ;; - no) - found_iconv=no - ;; - gnu|yes) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libiconv_open in -liconv" >&5 -$as_echo_n "checking for libiconv_open in -liconv... " >&6; } -if test "${ac_cv_lib_iconv_libiconv_open+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-liconv $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char libiconv_open (); -int -main () -{ -return libiconv_open (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_iconv_libiconv_open=yes -else - ac_cv_lib_iconv_libiconv_open=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_libiconv_open" >&5 -$as_echo "$ac_cv_lib_iconv_libiconv_open" >&6; } -if test "x$ac_cv_lib_iconv_libiconv_open" = x""yes; then : - with_libiconv=gnu; found_iconv=yes -fi - - ;; - native) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv_open in -liconv" >&5 -$as_echo_n "checking for iconv_open in -liconv... " >&6; } -if test "${ac_cv_lib_iconv_iconv_open+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-liconv $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char iconv_open (); -int -main () -{ -return iconv_open (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_iconv_iconv_open=yes -else - ac_cv_lib_iconv_iconv_open=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_iconv_open" >&5 -$as_echo "$ac_cv_lib_iconv_iconv_open" >&6; } -if test "x$ac_cv_lib_iconv_iconv_open" = x""yes; then : - with_libiconv=native; found_iconv=yes -fi - - ;; -esac -if test x$found_iconv != xno -a x$with_libiconv != xno ; then - LIBS="$LIBS -liconv" -fi - -case $with_libiconv in - gnu) - -$as_echo "#define USE_LIBICONV_GNU 1" >>confdefs.h - - CFLAGS="$CFLAGS -DUSE_LIBICONV_GNU" - ;; - native) - -$as_echo "#define USE_LIBICONV_NATIVE 1" >>confdefs.h - - ;; -esac - - -# Check whether --with-libidn was given. -if test "${with_libidn+set}" = set; then : - withval=$with_libidn; -else - with_libidn=maybe -fi - -if test x$with_libidn != xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stringprep in -lidn" >&5 -$as_echo_n "checking for stringprep in -lidn... " >&6; } -if test "${ac_cv_lib_idn_stringprep+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lidn $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char stringprep (); -int -main () -{ -return stringprep (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_idn_stringprep=yes -else - ac_cv_lib_idn_stringprep=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_idn_stringprep" >&5 -$as_echo "$ac_cv_lib_idn_stringprep" >&6; } -if test "x$ac_cv_lib_idn_stringprep" = x""yes; then : - - with_libidn=no - ac_fn_c_check_header_mongrel "$LINENO" "stringprep.h" "ac_cv_header_stringprep_h" "$ac_includes_default" -if test "x$ac_cv_header_stringprep_h" = x""yes; then : - with_libidn=yes -fi - - - -else - - if test x$with_libidn != xmaybe; then - as_fn_error $? "libidn not found" "$LINENO" 5 - fi - with_libidn=no - -fi - -fi -HAVE_LIBIDN='' -UTF8DEVS='' -if test x$with_libidn != xno; then - HAVE_LIBIDN=-DHAVE_LIBIDN - LIBS="$LIBS -lidn" - - if test x$found_iconv != xno; then - UTF8DEVS='$(PSD)utf8.dev' - fi -fi - - - - -# Check whether --with-libpaper was given. -if test "${with_libpaper+set}" = set; then : - withval=$with_libpaper; -fi - -if test x$with_libpaper != xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for systempapername in -lpaper" >&5 -$as_echo_n "checking for systempapername in -lpaper... " >&6; } -if test "${ac_cv_lib_paper_systempapername+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpaper $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char systempapername (); -int -main () -{ -return systempapername (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_paper_systempapername=yes -else - ac_cv_lib_paper_systempapername=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_paper_systempapername" >&5 -$as_echo "$ac_cv_lib_paper_systempapername" >&6; } -if test "x$ac_cv_lib_paper_systempapername" = x""yes; then : - with_libpaper=yes -else - - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: disabling support for libpaper" >&5 -$as_echo "$as_me: WARNING: disabling support for libpaper" >&2;} - with_libpaper=no - -fi - -fi -if test x$with_libpaper != xno; then - ac_fn_c_check_header_mongrel "$LINENO" "paper.h" "ac_cv_header_paper_h" "$ac_includes_default" -if test "x$ac_cv_header_paper_h" = x""yes; then : - with_libpaper=yes -else - - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: disabling support for libpaper" >&5 -$as_echo "$as_me: WARNING: disabling support for libpaper" >&2;} - with_libpaper=no - -fi - - -fi - -if test x$with_libpaper != xno; then - LIBS="$LIBS -lpaper" - -$as_echo "#define USE_LIBPAPER 1" >>confdefs.h - - CFLAGS="$CFLAGS -DUSE_LIBPAPER" -fi - -HAVE_FONTCONFIG="" -FONTCONFIG_CFLAGS="" -FONTCONFIG_LIBS="" -# Check whether --enable-fontconfig was given. -if test "${enable_fontconfig+set}" = set; then : - enableval=$enable_fontconfig; -fi - -if test "$enable_fontconfig" != "no"; then - # We MUST NOT use PKG_CHECK_MODULES since it is a) not a standard - # autoconf macro and b) requires pkg-config on the system, which is - # NOT standard on ANY OS, including Linux! - if test "x$PKGCONFIG" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fontconfig with pkg-config" >&5 -$as_echo_n "checking for fontconfig with pkg-config... " >&6; } - if $PKGCONFIG --exists fontconfig; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - FONTCONFIG_CFLAGS="$CFLAGS `$PKGCONFIG --cflags fontconfig`" - FONTCONFIG_LIBS="`$PKGCONFIG --libs fontconfig`" - HAVE_FONTCONFIG=-DHAVE_FONTCONFIG - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - fi - if test -z "$HAVE_FONTCONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FcInitLoadConfigAndFonts in -lfontconfig" >&5 -$as_echo_n "checking for FcInitLoadConfigAndFonts in -lfontconfig... " >&6; } -if test "${ac_cv_lib_fontconfig_FcInitLoadConfigAndFonts+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lfontconfig $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char FcInitLoadConfigAndFonts (); -int -main () -{ -return FcInitLoadConfigAndFonts (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_fontconfig_FcInitLoadConfigAndFonts=yes -else - ac_cv_lib_fontconfig_FcInitLoadConfigAndFonts=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fontconfig_FcInitLoadConfigAndFonts" >&5 -$as_echo "$ac_cv_lib_fontconfig_FcInitLoadConfigAndFonts" >&6; } -if test "x$ac_cv_lib_fontconfig_FcInitLoadConfigAndFonts" = x""yes; then : - - ac_fn_c_check_header_mongrel "$LINENO" "fontconfig/fontconfig.h" "ac_cv_header_fontconfig_fontconfig_h" "$ac_includes_default" -if test "x$ac_cv_header_fontconfig_fontconfig_h" = x""yes; then : - - FONTCONFIG_LIBS="-lfontconfig" - HAVE_FONTCONFIG="-DHAVE_FONTCONFIG" - -fi - - - -fi - - fi -fi - - - - -HAVE_DBUS="" -DBUS_CFLAGS="" -DBUS_LIBS="" -# Check whether --enable-dbus was given. -if test "${enable_dbus+set}" = set; then : - enableval=$enable_dbus; -fi - -if test "$enable_dbus" != "no"; then - if test "x$PKGCONFIG" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbus with pkg-config" >&5 -$as_echo_n "checking for dbus with pkg-config... " >&6; } - if $PKGCONFIG --exists dbus-1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - DBUS_CFLAGS="$CFLAGS `$PKGCONFIG --cflags dbus-1`" - DBUS_LIBS="`$PKGCONFIG --libs dbus-1`" - HAVE_DBUS=-DHAVE_DBUS - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - fi - if test -z "$HAVE_DBUS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbus_message_iter_get_basic in -ldbus" >&5 -$as_echo_n "checking for dbus_message_iter_get_basic in -ldbus... " >&6; } -if test "${ac_cv_lib_dbus_dbus_message_iter_get_basic+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldbus $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dbus_message_iter_get_basic (); -int -main () -{ -return dbus_message_iter_get_basic (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dbus_dbus_message_iter_get_basic=yes -else - ac_cv_lib_dbus_dbus_message_iter_get_basic=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dbus_dbus_message_iter_get_basic" >&5 -$as_echo "$ac_cv_lib_dbus_dbus_message_iter_get_basic" >&6; } -if test "x$ac_cv_lib_dbus_dbus_message_iter_get_basic" = x""yes; then : - - ac_fn_c_check_header_mongrel "$LINENO" "dbus-1.0/dbus/dbus.h" "ac_cv_header_dbus_1_0_dbus_dbus_h" "$ac_includes_default" -if test "x$ac_cv_header_dbus_1_0_dbus_dbus_h" = x""yes; then : - - DBUS_LIBS="-ldbus-1 -lpthread -lrt" - HAVE_DBUS="-DHAVE_DBUS" - -fi - - - -fi - - fi -fi - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if test "${ac_cv_lib_dl_dlopen+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBDL 1 -_ACEOF - - LIBS="-ldl $LIBS" - -fi - - -# Check whether --enable-freetype was given. -if test "${enable_freetype+set}" = set; then : - enableval=$enable_freetype; -fi - -FT_BRIDGE=0 -SHARE_FT=0 -FTSRCDIR= -FT_CFLAGS= -FT_LIBS= - - -# Check whether --with-ufst was given. -if test "${with_ufst+set}" = set; then : - withval=$with_ufst; -else - with_ufst=no -fi - -INSERT_UFST_BRIDGE_EQUAL_ONE= -UFST_ROOT= -UFST_CFLAGS= -UFST_LIB_EXT= -if test -d $with_ufst; then -INSERT_UFST_BRIDGE_EQUAL_ONE="UFST_BRIDGE=1" -UFST_ROOT=$with_ufst -UFST_CFLAGS=-DGCCx86 -UFST_LIB_EXT=.a -fi - - - - - -if test x"$enable_freetype" != xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for local freetype library source" >&5 -$as_echo_n "checking for local freetype library source... " >&6; } - for dir in freetype2 freetype; do - if test -f $dir/src/base/ftbbox.c; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SHARE_FT=0 - FTSRCDIR="$dir" - FT_CFLAGS="-I$dir/include" - FT_BRIDGE=1 - break; - fi - done - if test -z $FTSRCDIR; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - if test "x$PKGCONFIG" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for system freetype with pkg-config" >&5 -$as_echo_n "checking for system freetype with pkg-config... " >&6; } - if $PKGCONFIG --exists freetype2; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - FT_CFLAGS="$CFLAGS `$PKGCONFIG --cflags freetype2`" - FT_LIBS="`$PKGCONFIG --libs freetype2`" - FT_BRIDGE=1 - SHARE_FT=1 - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: freetype library source not found...using native rasterizer" >&5 -$as_echo "$as_me: WARNING: freetype library source not found...using native rasterizer" >&2;} - fi - fi - fi -fi - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for local jpeg library source" >&5 -$as_echo_n "checking for local jpeg library source... " >&6; } -LIBJPEGDIR=src -if test -f jpeg/jpeglib.h; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: jpeg" >&5 -$as_echo "jpeg" >&6; } - SHARE_LIBJPEG=0 - LIBJPEGDIR=jpeg -elif test -f jpeg-6b/jpeglib.h; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: jpeg-6b" >&5 -$as_echo "jpeg-6b" >&6; } - SHARE_LIBJPEG=0 - LIBJPEGDIR=jpeg-6b -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_set_defaults in -ljpeg" >&5 -$as_echo_n "checking for jpeg_set_defaults in -ljpeg... " >&6; } -if test "${ac_cv_lib_jpeg_jpeg_set_defaults+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ljpeg $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char jpeg_set_defaults (); -int -main () -{ -return jpeg_set_defaults (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_jpeg_jpeg_set_defaults=yes -else - ac_cv_lib_jpeg_jpeg_set_defaults=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_set_defaults" >&5 -$as_echo "$ac_cv_lib_jpeg_jpeg_set_defaults" >&6; } -if test "x$ac_cv_lib_jpeg_jpeg_set_defaults" = x""yes; then : - - for ac_header in jpeglib.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" -if test "x$ac_cv_header_jpeglib_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_JPEGLIB_H 1 -_ACEOF - SHARE_LIBJPEG=1 -fi - -done - - -fi - -fi -if test -z "$SHARE_LIBJPEG"; then - as_fn_error $? "I wasn't able to find a copy - of the jpeg library. This is required for compiling - ghostscript. Please download a copy of the source, - e.g. from http://www.ijg.org/, unpack it at the - top level of the gs source tree, and rename - the directory to 'jpeg'. - " "$LINENO" 5 -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for jmemsys.h" >&5 -$as_echo_n "checking for jmemsys.h... " >&6; } -if test -r $LIBJPEGDIR/jmemsys.h; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - -$as_echo "#define DONT_HAVE_JMEMSYS_H 1" >>confdefs.h - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for local zlib source" >&5 -$as_echo_n "checking for local zlib source... " >&6; } -# we must define ZLIBDIR regardless because png.mak does a -I$(ZLIBDIR) -# this seems a harmless default -ZLIBDIR=src -if test -d zlib; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SHARE_ZLIB=0 - ZLIBDIR=zlib -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for deflate in -lz" >&5 -$as_echo_n "checking for deflate in -lz... " >&6; } -if test "${ac_cv_lib_z_deflate+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lz $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char deflate (); -int -main () -{ -return deflate (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_z_deflate=yes -else - ac_cv_lib_z_deflate=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_deflate" >&5 -$as_echo "$ac_cv_lib_z_deflate" >&6; } -if test "x$ac_cv_lib_z_deflate" = x""yes; then : - - for ac_header in zlib.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" -if test "x$ac_cv_header_zlib_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_ZLIB_H 1 -_ACEOF - SHARE_ZLIB=1 -fi - -done - - -fi - -fi -if test -z "$SHARE_ZLIB"; then - as_fn_error $? "I did not find a copy of zlib on your system. - Please either install it, or unpack a copy of the source in a - local directory named 'zlib'. See http://www.gzip.org/zlib/ - for more information. - " "$LINENO" 5 -fi - -FT_SYS_ZLIB="" -if test x$FT_BRIDGE != x0; then - if test xx$SHARE_FT != x1; then - if test x$SHARE_ZLIB != x0; then - FT_SYS_ZLIB="-DFT_CONFIG_OPTION_SYSTEM_ZLIB" - fi - fi -fi - - - - - -LIBPNGDIR=src -PNGDEVS='' -PNGDEVS_ALL='png48 png16m pnggray pngmono png256 png16 pngalpha' -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for local png library source" >&5 -$as_echo_n "checking for local png library source... " >&6; } -if test -f libpng/pngread.c; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SHARE_LIBPNG=0 - LIBPNGDIR=libpng - PNGDEVS="$PNGDEVS_ALL" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_create_write_struct in -lpng" >&5 -$as_echo_n "checking for png_create_write_struct in -lpng... " >&6; } -if test "${ac_cv_lib_png_png_create_write_struct+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpng -lz $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char png_create_write_struct (); -int -main () -{ -return png_create_write_struct (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_png_png_create_write_struct=yes -else - ac_cv_lib_png_png_create_write_struct=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_create_write_struct" >&5 -$as_echo "$ac_cv_lib_png_png_create_write_struct" >&6; } -if test "x$ac_cv_lib_png_png_create_write_struct" = x""yes; then : - - for ac_header in png.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default" -if test "x$ac_cv_header_png_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_PNG_H 1 -_ACEOF - - SHARE_LIBPNG=1 - PNGDEVS="$PNGDEVS_ALL" - -else - SHARE_LIBPNG=0 -fi - -done - - -else - SHARE_LIBPNG=0 -fi - -fi -if test -z "$PNGDEVS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: disabling png output devices" >&5 -$as_echo "$as_me: disabling png output devices" >&6;} -fi - - -#AC_SUBST(PNGDEVS) - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for local lcms library source" >&5 -$as_echo_n "checking for local lcms library source... " >&6; } -LCMSDIR=lcms -SHARELCMS=0 -if test -f $LCMSDIR/include/lcms.h; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cmsCreateXYZProfile in -llcms" >&5 -$as_echo_n "checking for cmsCreateXYZProfile in -llcms... " >&6; } -if test "${ac_cv_lib_lcms_cmsCreateXYZProfile+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-llcms $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char cmsCreateXYZProfile (); -int -main () -{ -return cmsCreateXYZProfile (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_lcms_cmsCreateXYZProfile=yes -else - ac_cv_lib_lcms_cmsCreateXYZProfile=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lcms_cmsCreateXYZProfile" >&5 -$as_echo "$ac_cv_lib_lcms_cmsCreateXYZProfile" >&6; } -if test "x$ac_cv_lib_lcms_cmsCreateXYZProfile" = x""yes; then : - - for ac_header in lcms.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "lcms.h" "ac_cv_header_lcms_h" "$ac_includes_default" -if test "x$ac_cv_header_lcms_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LCMS_H 1 -_ACEOF - SHARELCMS=1;LCMSDIR="" -fi - -done - - -fi - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for local lcms2 library source" >&5 -$as_echo_n "checking for local lcms2 library source... " >&6; } -LCMS2DIR=lcms2 -if test -f $LCMS2DIR/include/lcms2.h; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cmsCreateXYZProfile in -llcms2" >&5 -$as_echo_n "checking for cmsCreateXYZProfile in -llcms2... " >&6; } -if test "${ac_cv_lib_lcms2_cmsCreateXYZProfile+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-llcms2 $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char cmsCreateXYZProfile (); -int -main () -{ -return cmsCreateXYZProfile (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_lcms2_cmsCreateXYZProfile=yes -else - ac_cv_lib_lcms2_cmsCreateXYZProfile=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lcms2_cmsCreateXYZProfile" >&5 -$as_echo "$ac_cv_lib_lcms2_cmsCreateXYZProfile" >&6; } -if test "x$ac_cv_lib_lcms2_cmsCreateXYZProfile" = x""yes; then : - - for ac_header in lcms2.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "lcms2.h" "ac_cv_header_lcms2_h" "$ac_includes_default" -if test "x$ac_cv_header_lcms2_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LCMS2_H 1 -_ACEOF - LCMS2DIR="" -fi - -done - - -fi - -fi - - - - - - -# Check whether --with-system-libtiff was given. -if test "${with_system_libtiff+set}" = set; then : - withval=$with_system_libtiff; -else - with_system_libtiff=check -fi - -TIFFDEVS='' -TIFFDEVS_ALL='$(DD)tiffs $(DD)tiff12nc $(DD)tiff24nc $(DD)tiff48nc $(DD)tiff32nc $(DD)tiff64nc $(DD)tiffcrle $(DD)tifflzw $(DD)tiffpack $(DD)tiffgray $(DD)tiffsep $(DD)tiffscaled' -case "x$with_system_libtiff" in - xcheck) - if test -d tiff; then - LIBTIFFDIR=tiff - HAVE_LOCAL_LIBTIFF=1 - SHARE_LIBTIFF=0 - else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFOpen in -ltiff" >&5 -$as_echo_n "checking for TIFFOpen in -ltiff... " >&6; } -if test "${ac_cv_lib_tiff_TIFFOpen+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ltiff -ljpeg $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char TIFFOpen (); -int -main () -{ -return TIFFOpen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_tiff_TIFFOpen=yes -else - ac_cv_lib_tiff_TIFFOpen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFOpen" >&5 -$as_echo "$ac_cv_lib_tiff_TIFFOpen" >&6; } -if test "x$ac_cv_lib_tiff_TIFFOpen" = x""yes; then : - for ac_header in tiff.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "tiff.h" "ac_cv_header_tiff_h" "$ac_includes_default" -if test "x$ac_cv_header_tiff_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_TIFF_H 1 -_ACEOF - HAVE_SYSTEM_LIBTIFF=1;SHARE_LIBTIFF=1 -fi - -done - -fi - - fi - if test "x$HAVE_LOCAL_LIBTIFF" = x && test "x$HAVE_SYSTEM_LIBTIFF" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find a copy of libtiff on your system. -Disabling tiff output devices." >&5 -$as_echo "$as_me: Could not find a copy of libtiff on your system. -Disabling tiff output devices." >&6;} - else - TIFFDEVS="$TIFFDEVS_ALL" - fi - ;; - xyes) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFOpen in -ltiff" >&5 -$as_echo_n "checking for TIFFOpen in -ltiff... " >&6; } -if test "${ac_cv_lib_tiff_TIFFOpen+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ltiff -ljpeg $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char TIFFOpen (); -int -main () -{ -return TIFFOpen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_tiff_TIFFOpen=yes -else - ac_cv_lib_tiff_TIFFOpen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFOpen" >&5 -$as_echo "$ac_cv_lib_tiff_TIFFOpen" >&6; } -if test "x$ac_cv_lib_tiff_TIFFOpen" = x""yes; then : - for ac_header in tiff.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "tiff.h" "ac_cv_header_tiff_h" "$ac_includes_default" -if test "x$ac_cv_header_tiff_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_TIFF_H 1 -_ACEOF - HAVE_SYSTEM_LIBTIFF=1;SHARE_LIBTIFF=1 -fi - -done - -fi - - if test "x$HAVE_SYSTEM_LIBTIFF" != x; then - SHARE_LIBTIFF=1 - TIFFDEVS="$TIFFDEVS_ALL" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find a copy of libtiff on your system. -Disabling tiff output devices." >&5 -$as_echo "$as_me: Could not find a copy of libtiff on your system. -Disabling tiff output devices." >&6;} - fi - ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for local libtiff source" >&5 -$as_echo_n "checking for local libtiff source... " >&6; } - if test -d tiff; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - LIBTIFFDIR=tiff - SHARE_LIBTIFF=0 - TIFFDEVS="$TIFFDEVS_ALL" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find local copy of libtiff. -Disabling tiff output devices." >&5 -$as_echo "$as_me: Could not find local copy of libtiff. -Disabling tiff output devices." >&6;} - fi - ;; -esac - -if test $SHARE_LIBTIFF -eq 0; then - echo - echo "Running libtiff configure script..." - olddir=`pwd` - cd $LIBTIFFDIR && ./configure --disable-jbig $SUBCONFIG_OPTS - status=$? - if test "$status" -ne 0 ; then - as_fn_error $status "libtiff configure script failed" "$LINENO" 5 - fi - cd $olddir - echo - echo "Continuing with Ghostscript configuration..." -fi - - - - - - -# Check whether --enable-cups was given. -if test "${enable_cups+set}" = set; then : - enableval=$enable_cups; -fi - - - -# Check whether --with-pdftoraster was given. -if test "${with_pdftoraster+set}" = set; then : - withval=$with_pdftoraster; -fi - - - -# Check whether --with-local-cups was given. -if test "${with_local_cups+set}" = set; then : - withval=$with_local_cups; with_local_cups=yes -else - with_local_cups=no -fi - - - -# Check whether --with-install-cups was given. -if test "${with_install_cups+set}" = set; then : - withval=$with_install_cups; CUPSINSTALL=install-cups -else - CUPSINSTALL= -fi - - -CUPSDEV="" -CUPSINCLUDE="" -CUPSCFLAGS="" -CUPSLIBS="" -CUPSLIBDIRS="" -CUPSCONFIG="${CUPSCONFIG:=}" -CUPSSERVERBIN="" -CUPSSERVERROOT="" -CUPSDATA="" -CUPSVERSION="0" -CUPSPDFTORASTER="0" - -SHARELCUPS=1 -SHARELCUPSI=1 - -if ( test -d cups ); then - if test x$enable_cups != xno; then - if test x$with_local_cups != xyes; then - # Extract the first word of "cups-config", so it can be a program name with args. -set dummy cups-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CUPSCONFIG+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $CUPSCONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_CUPSCONFIG="$CUPSCONFIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_CUPSCONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -CUPSCONFIG=$ac_cv_path_CUPSCONFIG -if test -n "$CUPSCONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CUPSCONFIG" >&5 -$as_echo "$CUPSCONFIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - ac_fn_c_check_header_mongrel "$LINENO" "cups/raster.h" "ac_cv_header_cups_raster_h" "$ac_includes_default" -if test "x$ac_cv_header_cups_raster_h" = x""yes; then : - -else - CUPSCONFIG="" -fi - - - if test "x$CUPSCONFIG" != x; then - CUPSCFLAGS="`$CUPSCONFIG --cflags` $CFLAGS" -# CUPSLINK="`$CUPSCONFIG --ldflags` `$CUPSCONFIG --static --image --libs | sed -e '1,$s/-lssl//'` $LIBS" - CUPSLINK="`$CUPSCONFIG --ldflags` `$CUPSCONFIG --image --libs`" - -# the makefile wants a list of just the library names -for gs_item in $CUPSLINK; do - gs_stripped_item=`echo "$gs_item" | sed -e 's/^-l//'` - if test "x$gs_stripped_item" != "x$gs_item"; then - CUPSLIBS="$CUPSLIBS $gs_stripped_item" - fi -done - - -for gs_item in $CUPSLINK; do - gs_stripped_item=`echo "$gs_item" | sed -e 's/-L//'` - if test "x$gs_stripped_item" != "x$gs_item"; then - CUPSLIBDIRS="$CUPSLIBDIRS $gs_stripped_item" - fi -done - - CUPSSERVERROOT="`$CUPSCONFIG --serverroot`" - CUPSSERVERBIN="`$CUPSCONFIG --serverbin`" - CUPSDATA="`$CUPSCONFIG --datadir`" - CUPSINCLUDE="include cups/cups.mak" - CUPSDEV="cups" - CUPSVERSION="`$CUPSCONFIG --version`" - LCUPSINCLUDE="include \$(GLSRCDIR)/lcups.mak" - LCUPSIINCLUDE="include \$(GLSRCDIR)/lcupsi.mak" - if ( test x$with_pdftoraster != xno ); then - if test "$CUPSVERSION" ">" "1.2"; then - CUPSPDFTORASTER="1" - fi - fi - fi - else - if test "$(uname)" = "Linux"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: * USING LOCAL CUPS SOURCE *" >&5 -$as_echo "$as_me: WARNING: * USING LOCAL CUPS SOURCE *" >&2;} - SHARELCUPS=0 - SHARELCUPSI=0 - LCUPSBUILDTYPE=linux - LCUPSINCLUDE="include \$(GLSRCDIR)/lcups.mak" - LCUPSIINCLUDE="include \$(GLSRCDIR)/lcupsi.mak" - CUPSDEV="cups" - - fi - fi - fi -fi - -#AC_SUBST(CUPSDEV) - - - - - - - - - - - - - - - - - - - -# Check whether --with-ijs was given. -if test "${with_ijs+set}" = set; then : - withval=$with_ijs; -fi - - IJSDIR=src - IJSDEVS='' - SHAREIJS=0 -if test x$with_ijs != xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for local ijs library source" >&5 -$as_echo_n "checking for local ijs library source... " >&6; } - if test -d ijs; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - IJSDIR=ijs - IJSDEVS='ijs' - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ijs_server_init in -lijs" >&5 -$as_echo_n "checking for ijs_server_init in -lijs... " >&6; } -if test "${ac_cv_lib_ijs_ijs_server_init+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lijs $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char ijs_server_init (); -int -main () -{ -return ijs_server_init (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_ijs_ijs_server_init=yes -else - ac_cv_lib_ijs_ijs_server_init=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ijs_ijs_server_init" >&5 -$as_echo "$ac_cv_lib_ijs_ijs_server_init" >&6; } -if test "x$ac_cv_lib_ijs_ijs_server_init" = x""yes; then : - - for ac_header in ijs/ijs.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "ijs/ijs.h" "ac_cv_header_ijs_ijs_h" "$ac_includes_default" -if test "x$ac_cv_header_ijs_ijs_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_IJS_IJS_H 1 -_ACEOF - SHAREIJS=1 -fi - -done - - -fi - - if test $SHAREIJS -eq 1 ; then - IJSLIB=ijs - # This is for safety - it prevents our header search path going outside the GS source tree - IJSDIR='$(GLOBJDIR)' - IJSDEVS='ijs' - fi - fi -fi - - - -#AC_SUBST(IJSDEVS) - - -JBIG2_DECODER= -JBIG2DIR=src -SHARE_JBIG2=0 -JBIG2DEVS='' -JBIG2_AUTOCONF_CFLAGS= - -LURATECHDIR=luratech - - -# Check whether --with-luratech was given. -if test "${with_luratech+set}" = set; then : - withval=$with_luratech; -fi - - - -if test x$with_luratech != xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for local Luratech JBIG2 library source" >&5 -$as_echo_n "checking for local Luratech JBIG2 library source... " >&6; } - if test -d luratech/ldf_jb2; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - JBIG2_DECODER=luratech - SHARE_JBIG2=0 - JBIG2DIR=luratech/ldf_jb2 - if test `uname` = Darwin*; then - JBIG2_AUTOCONF_CFLAGS="-DUSE_LDF_JB2 -DMAC -DMAC_OS_X_BUILD" - else - JBIG2_AUTOCONF_CFLAGS="-DUSE_LDF_JB2 -DLINUX" - fi - JBIG2DEVS='$(PSD)jbig2.dev' - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi -fi - -if test "x$JBIG2_DECODER" = x; then - -# Check whether --with-jbig2dec was given. -if test "${with_jbig2dec+set}" = set; then : - withval=$with_jbig2dec; -fi - - if test x$with_jbig2dec != xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for local jbig2dec library source" >&5 -$as_echo_n "checking for local jbig2dec library source... " >&6; } - for d in jbig2dec jbig2dec-0.2 jbig2dec-0.3; do - test -d "$d" && JBIG2DIR=$d && break - done - if test "x$JBIG2DIR" != xsrc; then - JBIG2_DECODER=jbig2dec - echo "Running jbig2dec configure script..." - olddir=`pwd` - cd $JBIG2DIR && ./configure $SUBCONFIG_OPTS - status=$? - if test "$status" -ne 0 ; then - as_fn_error $status "jbig2dec configure script failed" "$LINENO" 5 - fi - if test "$status" -eq 0 ; then - JBIG2_AUTOCONF_CFLAGS=-DHAVE_CONFIG_H - fi - cd $olddir - echo - echo "Continuing with Ghostscript configuration..." - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JBIG2DIR" >&5 -$as_echo "$JBIG2DIR" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jbig2_page_out in -ljbig2dec" >&5 -$as_echo_n "checking for jbig2_page_out in -ljbig2dec... " >&6; } -if test "${ac_cv_lib_jbig2dec_jbig2_page_out+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ljbig2dec $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char jbig2_page_out (); -int -main () -{ -return jbig2_page_out (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_jbig2dec_jbig2_page_out=yes -else - ac_cv_lib_jbig2dec_jbig2_page_out=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jbig2dec_jbig2_page_out" >&5 -$as_echo "$ac_cv_lib_jbig2dec_jbig2_page_out" >&6; } -if test "x$ac_cv_lib_jbig2dec_jbig2_page_out" = x""yes; then : - - SHARE_JBIG2=1 - -else - - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: disabling support for JBIG2 files" >&5 -$as_echo "$as_me: WARNING: disabling support for JBIG2 files" >&2;} - with_jbig2dec=no - -fi - - if test x$with_jbig2dec != xno; then - JBIG2_DECODER=jbig2dec - fi - fi - fi - if test x$with_jbig2dec != xno; then - if test x$ac_cv_header_stdint_h != xyes && test x$ac_cv_header_inttypes_h != xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: JBIG2 support requires stdint types which do not seem to be available." >&5 -$as_echo "$as_me: WARNING: JBIG2 support requires stdint types which do not seem to be available." >&2;} - else - JBIG2DEVS='$(PSD)jbig2.dev' - fi - fi -fi - - - - - - - -JPXDIR=src -SHARE_JASPER=0 -JPXDEVS='' -JPX_DECODER= -JPX_AUTOCONF_CFLAGS= - -if test x$with_luratech != xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for local Luratech JPEG2K library source" >&5 -$as_echo_n "checking for local Luratech JPEG2K library source... " >&6; } - if test -d luratech/lwf_jp2; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - JPX_DECODER=luratech - SHARE_JASPER=0 - JPXDIR=luratech/lwf_jp2 - if test `uname` = Darwin*; then - JPX_AUTOCONF_CFLAGS="-DUSE_LWF_JP2 -DMAC -DMAC_OS_X_BUILD" - else - JPX_AUTOCONF_CFLAGS="-DUSE_LWF_JP2 -DLINUX" - fi - JPXDEVS='$(PSD)jpx.dev' - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi -fi - - -if test "x$JPX_DECODER" = x; then - -# Check whether --with-jasper was given. -if test "${with_jasper+set}" = set; then : - withval=$with_jasper; -fi - - if test x$with_jasper != xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for local jasper library source" >&5 -$as_echo_n "checking for local jasper library source... " >&6; } - for d in jasper jasper-1.7*; do - test -d "$d" && JPXDIR=$d && break - done - if test "x$JPXDIR" != xsrc; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JPXDIR" >&5 -$as_echo "$JPXDIR" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for local jasper configure script" >&5 -$as_echo_n "checking for local jasper configure script... " >&6; } - if test -x $JPXDIR/configure; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - echo - echo "Running jasper configure script..." - olddir=`pwd` - cd $JPXDIR && ./configure $SUBCONFIG_OPTS - status=$? - if test "$status" -ne 0 ; then - as_fn_error $status "jasper configure script failed" "$LINENO" 5 - fi - cd $olddir - echo - echo "Continuing with Ghostscript configuration..." - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for local jasper autogen.sh script" >&5 -$as_echo_n "checking for local jasper autogen.sh script... " >&6; } - if test -x $JPXDIR/autogen.sh; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - echo - echo "Running jasper autogen script..." - olddir=`pwd` - cd $JPXDIR && ./autogen.sh - status=$? - if test "$status" -ne 0 ; then - as_fn_error $status "jasper autogen script failed" "$LINENO" 5 - fi - cd $olddir - echo - echo "Continuing with Ghostscript configuration..." - else - as_fn_error $? " -Unable to find $JPXDIR/src/libjasper/include/jas_config.h, -or generate generate such a file for this system. You will -have to build one by hand, or configure, build and install -the jasper library separately. - -You can also pass --without-jasper to configure to disable -JPEG 2000 PDF image support entirely. -" "$LINENO" 5 - fi - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jas_image_create in -ljasper" >&5 -$as_echo_n "checking for jas_image_create in -ljasper... " >&6; } -if test "${ac_cv_lib_jasper_jas_image_create+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ljasper $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char jas_image_create (); -int -main () -{ -return jas_image_create (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_jasper_jas_image_create=yes -else - ac_cv_lib_jasper_jas_image_create=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jasper_jas_image_create" >&5 -$as_echo "$ac_cv_lib_jasper_jas_image_create" >&6; } -if test "x$ac_cv_lib_jasper_jas_image_create" = x""yes; then : - - SHARE_JASPER=1 - -else - - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: disabling support for JPEG 2000 images" >&5 -$as_echo "$as_me: WARNING: disabling support for JPEG 2000 images" >&2;} - with_jasper=no - -fi - - fi - fi - if test x$with_jasper != xno; then - JPX_DECODER=jasper - JPX_AUTOCONF_CFLAGS="-DJAS_CONFIGURE" - JPXDEVS='$(PSD)jpx.dev' - fi -fi - - - - - - - - -# Check whether --enable-gtk was given. -if test "${enable_gtk+set}" = set; then : - enableval=$enable_gtk; -fi - -SOC_CFLAGS="" -SOC_LIBS="" -SOC_LOADER="dxmainc.c" -if test "x$enable_gtk" != "xno"; then - # Try GTK+ 2.x first... - if test "x$PKGCONFIG" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK+ 2.x" >&5 -$as_echo_n "checking for GTK+ 2.x... " >&6; } - if $PKGCONFIG --exists gtk+-2.0; then - SOC_LOADER="dxmain.c" - SOC_CFLAGS="`$PKGCONFIG gtk+-2.0 --cflags`" - SOC_LIBS="`$PKGCONFIG gtk+-2.0 --libs`" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - fi - - # Then fall back on GTK+ 1.x... - if test "x$SOC_LOADER" = x; then - # Extract the first word of "gtk-config", so it can be a program name with args. -set dummy gtk-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_GTKCONFIG+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $GTKCONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_GTKCONFIG="$GTKCONFIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_GTKCONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -GTKCONFIG=$ac_cv_path_GTKCONFIG -if test -n "$GTKCONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKCONFIG" >&5 -$as_echo "$GTKCONFIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - if test "x$GTKCONFIG" != x; then - SOC_LOADER="dxmain.c" - SOC_CFLAGS="`$GTKCONFIG --cflags`" - SOC_LIBS="`$GTKCONFIG --libs`" - fi - fi -fi - - - - - -# Check whether --with-omni was given. -if test "${with_omni+set}" = set; then : - withval=$with_omni; -fi - -OMNIDEVS='' -INCLUDEOMNI=no -if ( ! test -z "$CONTRIBINCLUDE" ) && ( test x$with_omni = xyes ); then - INCLUDEOMNI=yes - OMNIDEVS='$(DD)omni.dev' - - if test -n "$GCC"; then - LIBS="$LIBS -lstdc++" - fi -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 -$as_echo_n "checking for X... " >&6; } - - -# Check whether --with-x was given. -if test "${with_x+set}" = set; then : - withval=$with_x; -fi - -# $have_x is `yes', `no', `disabled', or empty when we do not yet know. -if test "x$with_x" = xno; then - # The user explicitly disabled X. - have_x=disabled -else - case $x_includes,$x_libraries in #( - *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5 ;; #( - *,NONE | NONE,*) if test "${ac_cv_have_x+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - # One or both of the vars are not set, and there is no cached value. -ac_x_includes=no ac_x_libraries=no -rm -f -r conftest.dir -if mkdir conftest.dir; then - cd conftest.dir - cat >Imakefile <<'_ACEOF' -incroot: - @echo incroot='${INCROOT}' -usrlibdir: - @echo usrlibdir='${USRLIBDIR}' -libdir: - @echo libdir='${LIBDIR}' -_ACEOF - if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then - # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. - for ac_var in incroot usrlibdir libdir; do - eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" - done - # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. - for ac_extension in a so sl dylib la dll; do - if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && - test -f "$ac_im_libdir/libX11.$ac_extension"; then - ac_im_usrlibdir=$ac_im_libdir; break - fi - done - # Screen out bogus values from the imake configuration. They are - # bogus both because they are the default anyway, and because - # using them would break gcc on systems where it needs fixed includes. - case $ac_im_incroot in - /usr/include) ac_x_includes= ;; - *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; - esac - case $ac_im_usrlibdir in - /usr/lib | /usr/lib64 | /lib | /lib64) ;; - *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; - esac - fi - cd .. - rm -f -r conftest.dir -fi - -# Standard set of common directories for X headers. -# Check X11 before X11Rn because it is often a symlink to the current release. -ac_x_header_dirs=' -/usr/X11/include -/usr/X11R7/include -/usr/X11R6/include -/usr/X11R5/include -/usr/X11R4/include - -/usr/include/X11 -/usr/include/X11R7 -/usr/include/X11R6 -/usr/include/X11R5 -/usr/include/X11R4 - -/usr/local/X11/include -/usr/local/X11R7/include -/usr/local/X11R6/include -/usr/local/X11R5/include -/usr/local/X11R4/include - -/usr/local/include/X11 -/usr/local/include/X11R7 -/usr/local/include/X11R6 -/usr/local/include/X11R5 -/usr/local/include/X11R4 - -/usr/X386/include -/usr/x386/include -/usr/XFree86/include/X11 - -/usr/include -/usr/local/include -/usr/unsupported/include -/usr/athena/include -/usr/local/x11r5/include -/usr/lpp/Xamples/include - -/usr/openwin/include -/usr/openwin/share/include' - -if test "$ac_x_includes" = no; then - # Guess where to find include files, by looking for Xlib.h. - # First, try using that file with no special directory specified. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # We can compile using X headers with no special include directory. -ac_x_includes= -else - for ac_dir in $ac_x_header_dirs; do - if test -r "$ac_dir/X11/Xlib.h"; then - ac_x_includes=$ac_dir - break - fi -done -fi -rm -f conftest.err conftest.i conftest.$ac_ext -fi # $ac_x_includes = no - -if test "$ac_x_libraries" = no; then - # Check for the libraries. - # See if we find them without any special options. - # Don't add to $LIBS permanently. - ac_save_LIBS=$LIBS - LIBS="-lX11 $LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -XrmInitialize () - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - LIBS=$ac_save_LIBS -# We can link X programs with no special library path. -ac_x_libraries= -else - LIBS=$ac_save_LIBS -for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` -do - # Don't even attempt the hair of trying to link an X program! - for ac_extension in a so sl dylib la dll; do - if test -r "$ac_dir/libX11.$ac_extension"; then - ac_x_libraries=$ac_dir - break 2 - fi - done -done -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi # $ac_x_libraries = no - -case $ac_x_includes,$ac_x_libraries in #( - no,* | *,no | *\'*) - # Didn't find X, or a directory has "'" in its name. - ac_cv_have_x="have_x=no";; #( - *) - # Record where we found X for the cache. - ac_cv_have_x="have_x=yes\ - ac_x_includes='$ac_x_includes'\ - ac_x_libraries='$ac_x_libraries'" -esac -fi -;; #( - *) have_x=yes;; - esac - eval "$ac_cv_have_x" -fi # $with_x != no - -if test "$have_x" != yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 -$as_echo "$have_x" >&6; } - no_x=yes -else - # If each of the values was on the command line, it overrides each guess. - test "x$x_includes" = xNONE && x_includes=$ac_x_includes - test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries - # Update the cache value to reflect the command line values. - ac_cv_have_x="have_x=yes\ - ac_x_includes='$x_includes'\ - ac_x_libraries='$x_libraries'" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 -$as_echo "libraries $x_libraries, headers $x_includes" >&6; } -fi - -if test "$no_x" = yes; then - # Not all programs may use this symbol, but it does not hurt to define it. - -$as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h - - X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= -else - if test -n "$x_includes"; then - X_CFLAGS="$X_CFLAGS -I$x_includes" - fi - - # It would also be nice to do this for all -L options, not just this one. - if test -n "$x_libraries"; then - X_LIBS="$X_LIBS -L$x_libraries" - # For Solaris; some versions of Sun CC require a space after -R and - # others require no space. Words are not sufficient . . . . - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 -$as_echo_n "checking whether -R must be followed by a space... " >&6; } - ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" - ac_xsave_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - X_LIBS="$X_LIBS -R$x_libraries" -else - LIBS="$ac_xsave_LIBS -R $x_libraries" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - X_LIBS="$X_LIBS -R $x_libraries" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 -$as_echo "neither works" >&6; } -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_c_werror_flag=$ac_xsave_c_werror_flag - LIBS=$ac_xsave_LIBS - fi - - # Check for system-dependent libraries X programs must link with. - # Do this before checking for the system-independent R6 libraries - # (-lICE), since we may need -lsocket or whatever for X linking. - - if test "$ISC" = yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" - else - # Martyn Johnson says this is needed for Ultrix, if the X - # libraries were built with DECnet support. And Karl Berry says - # the Alpha needs dnet_stub (dnet does not exist). - ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char XOpenDisplay (); -int -main () -{ -return XOpenDisplay (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 -$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } -if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldnet $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dnet_ntoa (); -int -main () -{ -return dnet_ntoa (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dnet_dnet_ntoa=yes -else - ac_cv_lib_dnet_dnet_ntoa=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 -$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } -if test "x$ac_cv_lib_dnet_dnet_ntoa" = x""yes; then : - X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" -fi - - if test $ac_cv_lib_dnet_dnet_ntoa = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 -$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } -if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldnet_stub $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dnet_ntoa (); -int -main () -{ -return dnet_ntoa (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dnet_stub_dnet_ntoa=yes -else - ac_cv_lib_dnet_stub_dnet_ntoa=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 -$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } -if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = x""yes; then : - X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" -fi - - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LIBS="$ac_xsave_LIBS" - - # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, - # to get the SysV transport functions. - # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) - # needs -lnsl. - # The nsl library prevents programs from opening the X display - # on Irix 5.2, according to T.E. Dickey. - # The functions gethostbyname, getservbyname, and inet_addr are - # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. - ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" -if test "x$ac_cv_func_gethostbyname" = x""yes; then : - -fi - - if test $ac_cv_func_gethostbyname = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 -$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } -if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lnsl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char gethostbyname (); -int -main () -{ -return gethostbyname (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_nsl_gethostbyname=yes -else - ac_cv_lib_nsl_gethostbyname=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 -$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } -if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then : - X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" -fi - - if test $ac_cv_lib_nsl_gethostbyname = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 -$as_echo_n "checking for gethostbyname in -lbsd... " >&6; } -if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lbsd $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char gethostbyname (); -int -main () -{ -return gethostbyname (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_bsd_gethostbyname=yes -else - ac_cv_lib_bsd_gethostbyname=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 -$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } -if test "x$ac_cv_lib_bsd_gethostbyname" = x""yes; then : - X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" -fi - - fi - fi - - # lieder@skyler.mavd.honeywell.com says without -lsocket, - # socket/setsockopt and other routines are undefined under SCO ODT - # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary - # on later versions), says Simon Leinen: it contains gethostby* - # variants that don't use the name server (or something). -lsocket - # must be given before -lnsl if both are needed. We assume that - # if connect needs -lnsl, so does gethostbyname. - ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" -if test "x$ac_cv_func_connect" = x""yes; then : - -fi - - if test $ac_cv_func_connect = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 -$as_echo_n "checking for connect in -lsocket... " >&6; } -if test "${ac_cv_lib_socket_connect+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsocket $X_EXTRA_LIBS $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char connect (); -int -main () -{ -return connect (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_socket_connect=yes -else - ac_cv_lib_socket_connect=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 -$as_echo "$ac_cv_lib_socket_connect" >&6; } -if test "x$ac_cv_lib_socket_connect" = x""yes; then : - X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" -fi - - fi - - # Guillermo Gomez says -lposix is necessary on A/UX. - ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" -if test "x$ac_cv_func_remove" = x""yes; then : - -fi - - if test $ac_cv_func_remove = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 -$as_echo_n "checking for remove in -lposix... " >&6; } -if test "${ac_cv_lib_posix_remove+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lposix $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char remove (); -int -main () -{ -return remove (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_posix_remove=yes -else - ac_cv_lib_posix_remove=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 -$as_echo "$ac_cv_lib_posix_remove" >&6; } -if test "x$ac_cv_lib_posix_remove" = x""yes; then : - X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" -fi - - fi - - # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. - ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" -if test "x$ac_cv_func_shmat" = x""yes; then : - -fi - - if test $ac_cv_func_shmat = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 -$as_echo_n "checking for shmat in -lipc... " >&6; } -if test "${ac_cv_lib_ipc_shmat+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lipc $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shmat (); -int -main () -{ -return shmat (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_ipc_shmat=yes -else - ac_cv_lib_ipc_shmat=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 -$as_echo "$ac_cv_lib_ipc_shmat" >&6; } -if test "x$ac_cv_lib_ipc_shmat" = x""yes; then : - X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" -fi - - fi - fi - - # Check for libraries that X11R6 Xt/Xaw programs need. - ac_save_LDFLAGS=$LDFLAGS - test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" - # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to - # check for ICE first), but we must link in the order -lSM -lICE or - # we get undefined symbols. So assume we have SM if we have ICE. - # These have to be linked with before -lX11, unlike the other - # libraries we check for below, so use a different variable. - # John Interrante, Karl Berry - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 -$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } -if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lICE $X_EXTRA_LIBS $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char IceConnectionNumber (); -int -main () -{ -return IceConnectionNumber (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_ICE_IceConnectionNumber=yes -else - ac_cv_lib_ICE_IceConnectionNumber=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 -$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } -if test "x$ac_cv_lib_ICE_IceConnectionNumber" = x""yes; then : - X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" -fi - - LDFLAGS=$ac_save_LDFLAGS - -fi - - -X_LDFLAGS="" -X_CFLAGS="" -X_DEVS="" -X_LIBS="" - -if test x$no_x != xyes; then - if test "$x_libraries" = "/usr/lib"; then - echo "Ignoring X library directory \"$x_libraries\" requested by configure." - x_libraries="NONE" - fi - if test ! "$x_libraries" = "NONE" -a ! "$x_libraries" = ""; then - X_LDFLAGS="-L$x_libraries" - if test "$uname" = "SunOS"; then - X_LDFLAGS="$X_LDFLAGS -R$x_libraries" - fi - fi - - if test "$x_includes" = "/usr/include"; then - echo "Ignoring X include directory \"$x_includes\" requested by configure." - x_includes="NONE" - fi - if test ! "$x_includes" = "NONE" -a ! "$x_includes" = ""; then - X_CFLAGS="-I$x_includes" - fi - - SAVELIBS="$LIBS" - SAVELDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $X_LDFLAGS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XOpenDisplay in -lX11" >&5 -$as_echo_n "checking for XOpenDisplay in -lX11... " >&6; } -if test "${ac_cv_lib_X11_XOpenDisplay+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lX11 $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char XOpenDisplay (); -int -main () -{ -return XOpenDisplay (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_X11_XOpenDisplay=yes -else - ac_cv_lib_X11_XOpenDisplay=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_X11_XOpenDisplay" >&5 -$as_echo "$ac_cv_lib_X11_XOpenDisplay" >&6; } -if test "x$ac_cv_lib_X11_XOpenDisplay" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBX11 1 -_ACEOF - - LIBS="-lX11 $LIBS" - -fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XdbeQueryExtension in -lXext" >&5 -$as_echo_n "checking for XdbeQueryExtension in -lXext... " >&6; } -if test "${ac_cv_lib_Xext_XdbeQueryExtension+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lXext $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char XdbeQueryExtension (); -int -main () -{ -return XdbeQueryExtension (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_Xext_XdbeQueryExtension=yes -else - ac_cv_lib_Xext_XdbeQueryExtension=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XdbeQueryExtension" >&5 -$as_echo "$ac_cv_lib_Xext_XdbeQueryExtension" >&6; } -if test "x$ac_cv_lib_Xext_XdbeQueryExtension" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBXEXT 1 -_ACEOF - - LIBS="-lXext $LIBS" - -fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XtAppCreateShell in -lXt" >&5 -$as_echo_n "checking for XtAppCreateShell in -lXt... " >&6; } -if test "${ac_cv_lib_Xt_XtAppCreateShell+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lXt $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char XtAppCreateShell (); -int -main () -{ -return XtAppCreateShell (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_Xt_XtAppCreateShell=yes -else - ac_cv_lib_Xt_XtAppCreateShell=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xt_XtAppCreateShell" >&5 -$as_echo "$ac_cv_lib_Xt_XtAppCreateShell" >&6; } -if test "x$ac_cv_lib_Xt_XtAppCreateShell" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBXT 1 -_ACEOF - - LIBS="-lXt $LIBS" - -fi - - - LDFLAGS="$SAVELDFLAGS" - LIBS="$SAVELIBS" - - if test "$ac_cv_lib_Xt_XtAppCreateShell" = yes; then - X11DEVS="x11 x11alpha x11cmyk x11mono x11_ x11alt_ x11cmyk2 x11cmyk4 x11cmyk8 x11rg16x x11rg32x x11gray2 x11gray4" - X_DEVS=$X11DEVS - # the makefile wants a list of just the library names in X_LIBS - -# the makefile wants a list of just the library names -for gs_item in -lXt $X_PRE_LIBS -lXext -lX11 $X_EXTRA_LIBS; do - gs_stripped_item=`echo "$gs_item" | sed -e 's/^-l//'` - if test "x$gs_stripped_item" != "x$gs_item"; then - X_LIBS="$X_LIBS $gs_stripped_item" - fi -done - - fi -fi - - - - -#AC_SUBST(X_DEVS) -#AC_SUBST(X11DEVS) - - - -# Check whether --with-gs was given. -if test "${with_gs+set}" = set; then : - withval=$with_gs; GS="$with_gs" -else - GS='gs' -fi - - - -COMPILE_INITS="1" -# Check whether --enable-compile-inits was given. -if test "${enable_compile_inits+set}" = set; then : - enableval=$enable_compile_inits; - if test "x$enable_compile_inits" = xno; then - COMPILE_INITS="0" - fi -fi - - - - -# Check whether --with-drivers was given. -if test "${with_drivers+set}" = set; then : - withval=$with_drivers; drivers="$withval" -else - drivers="ALL" -fi - - - -# Check whether --with-driversfile was given. -if test "${with_driversfile+set}" = set; then : - withval=$with_driversfile; driversfile="$withval" -else - driversfile="" -fi - - -if test "x$driversfile" != x; then - # Add drivers from file... - drivers="`tr '\n' ',' <$driversfile`" -fi - -P_DEVS0="" -F_DEVS0="" -CUPS_DEVS0="" -SVG_DEVS0="" -JBIG2_DEVS="" -IJS_DEVS0="" -PNG_DEVS0="" -X11_DEVS0="" - - -HP_DEVS='cdj500 djet500 djet500c dnj650c cljet5pr deskjet laserjet ljetplus ljet2p ljet3 ljet3d ljet4 ljet4d lj4dith lj5mono lj5gray cdeskjet cdjcolor cdjmono cdj550 pj pjxl pjxl300 lp2563 paintjet pjetxl cljet5 cljet5c pxlmono pxlcolor cdj670 cdj850 cdj880 cdj890 cdj970 cdj1600 cdnj500 chp2200 pcl3 hpdjplus hpdjportable hpdj310 hpdj320 hpdj340 hpdj400 hpdj500 hpdj500c hpdj510 hpdj520 hpdj540 hpdj550c hpdj560c hpdj600 hpdj660c hpdj670c hpdj680c hpdj690c hpdj850c hpdj855c hpdj870c hpdj890c hpdj1120c lj3100sw' -PCLXL_DEVS='pxlmono pxlcolor' -EPSON_DEVS='eps9high eps9mid epson epsonc escp lp8000 lq850 photoex st800 stcolor alc1900 alc2000 alc4000 alc4100 alc8500 alc8600 alc9100 lp3000c lp8000c lp8200c lp8300c lp8500c lp8800c lp9000c lp9200c lp9500c lp9800c lps6500 epl2050 epl2050p epl2120 epl2500 epl2750 epl5800 epl5900 epl6100 epl6200 lp1800 lp1900 lp2200 lp2400 lp2500 lp7500 lp7700 lp7900 lp8100 lp8300f lp8400f lp8600 lp8600f lp8700 lp8900 lp9000b lp9100 lp9200b lp9300 lp9400 lp9600 lp9600s lps4500 eplcolor eplmono' -CANON_DEVS='bj10e bj200 bjc600 bjc800 lbp8 lips3 bjcmono bjcgray bjccmyk bjccolor' -LEXMARK_DEVS='lxm5700m lx5000 lxm3200 lex2050 lex3200 lex5700 lex7000' -BROTHER_DEVS='hl7x0 hl1240 hl1250' -APPLE_DEVS='appledmp iwhi iwlo iwlq' -IBM_DEVS='ibmpro jetp3852' -OKI_DEVS='oki182 okiibm oki4w' -JAPAN_DEVS='lips4 lips4v ljet4pjl lj4dithp dj505j picty180 lips2p bjc880j pr201 pr150 pr1000 pr1000_4 jj100 bj10v bj10vh mj700v2c mj500c mj6000c mj8000c fmpr fmlbp ml600 lbp310 lbp320 md50Mono md50Eco md1xMono escpage lp2000 npdl rpdl' -MISC_PDEVS='uniprint ap3250 atx23 atx24 atx38 coslw2p coslwxl cp50 declj250 fs600 imagen lj250 m8510 necp6 oce9050 r4081 sj48 tek4696 t4693d2 t4693d4 t4693d8 dl2100 la50 la70 la75 la75plus ln03 xes md2k md5k gdi samsunggdi' -OPVP_DEVS='opvp oprp' - -ETS_HALFTONING_DEVS='rinkj' - -BMP_DEVS='bmpmono bmpgray bmpsep1 bmpsep8 bmp16 bmp256 bmp16m bmp32b' -FAX_DEVS='cfax dfaxlow dfaxhigh fax tfax tiffg3 tiffg32d tiffg4 faxg3 faxg32d faxg4' -JPEG_DEVS='jpeg jpeggray jpegcmyk' -# PNG_DEVS='png16 png16m png256 pngalpha pnggray pngmono' -TIFF_DEVS='tiffs tiff12nc tiff24nc tiff48nc tiff32nc tiff64nc tiffcrle tifflzw tiffpack tiffgray tiffsep tiffsep1 tiffscaled tiffscaled8 tiffscaled24' -PCX_DEVS='pcxmono pcxgray pcx16 pcx256 pcx24b pcxcmyk pcx2up' -PBM_DEVS='pbm pbmraw pgm pgmraw pgnm pgnmraw pnm pnmraw ppm ppmraw pkm pkmraw pksm pksmraw pam' -PS_DEVS='psdf psdcmyk psdrgb pdfwrite pswrite ps2write epswrite psgray psmono psrgb bbox' -WTS_HALFTONING_DEVS='imdi simdi wtsimdi wtscmyk' -MISC_FDEVS='ccr cgm24 cgm8 cgmmono cif inferno mag16 mag256 mgr4 mgr8 mgrgray2 mgrgray4 mgrgray8 mgrmono miff24 plan9bm sgirgb sunhmono bit bitrgb bitrgbtags bitcmyk devicen spotcmyk xcf' -SVGDEV='svgwrite' - -while test -n "$drivers"; do - if echo $drivers |grep "," >/dev/null; then - THIS="`echo $drivers |sed -e 's/,.*//'`" - drivers="`echo $drivers |sed -e \"s/$THIS,//\"`" - else - THIS=$drivers - drivers="" - fi - case "$THIS" in - ALL) - # ALL = PRINTERS + FILES... - if test -z "$drivers"; then - drivers="PRINTERS,FILES,X11" - else - drivers="$drivers,PRINTERS,FILES,X11" - fi - ;; - PRINTERS) - P_DEVS0="$P_DEVS0 $CANON_DEVS $EPSON_DEVS $HP_DEVS $LEXMARK_DEVS $BROTHER_DEVS $APPLE_DEVS $IBM_DEVS $OKI_DEVS $JAPAN_DEVS $MISC_PDEVS $ETS_HALFTONING_DEVS $OPVP_DEVS" - IJS_DEVS0="$IJSDEVS" - ;; - FILES) - F_DEVS0="$F_DEVS0 $BMP_DEVS $FAX_DEVS $JPEG_DEVS $TIFF_DEVS $PCX_DEVS $PBM_DEVS $PS_DEVS $WTS_HALFTONING_DEVS $MISC_FDEVS" - CUPS_DEVS0="$CUPSDEV" - JBIG2_DEVS="$JBIG2DEVS" - PNG_DEVS0="$PNGDEVS" - ;; - APPLE) - # All Apple printers - P_DEVS0="$P_DEVS0 $APPLE_DEVS" - ;; - BMP) - # BMP file format - F_DEVS0="$F_DEVS0 $BMP_DEVS" - ;; - CANON) - # All Canon printers - P_DEVS0="$P_DEVS0 $CANON_DEVS" - ;; - EPSON) - # All Epson printers - P_DEVS0="$P_DEVS0 $EPSON_DEVS" - ;; - FAX) - # Fax file formats - F_DEVS0="$F_DEVS0 $FAX_DEVS" - ;; - JPEG) - # Jpeg file formats - F_DEVS0="$F_DEVS0 $JPEG_DEVS" - ;; - JBIG2) - # JBIG file formats - JBIG2_DEVS="$JBIG2DEVS" - ;; - PNG) - # PNG file formats - PNG_DEVS0="$PNGDEVS" - ;; - TIFF) - # TIFF file formats - F_DEVS0="$F_DEVS0 $TIFF_DEVS" - ;; - PCLXL) - # PCL XL/PCL 6 drivers - F_DEVS0="$F_DEVS0 $PCLXL_DEVS" - ;; - PCX) - # PCX file formats - F_DEVS0="$F_DEVS0 $PCX_DEVS" - ;; - PBM) - # PBM file formats - F_DEVS0="$F_DEVS0 $PBM_DEVS" - ;; - CUPS) - # CUPS file format - CUPS_DEVS0="$CUPSDEV" - ;; - HP) - # All HP printers - P_DEVS0="$P_DEVS0 $HP_DEVS" - ;; - LEXMARK) - # All Lexmark printers - P_DEVS0="$P_DEVS0 $LEXMARK_DEVS" - ;; - BROTHER) - # All Brother printers - P_DEVS0="$P_DEVS0 $BROTHER_DEVS" - ;; - OKI) - # All OKI printers - P_DEVS0="$P_DEVS0 $OKI_DEVS" - ;; - IBM) - # All IBM printers - P_DEVS0="$P_DEVS0 $IBM_DEVS" - ;; - IJS) - # IJS printers - IJS_DEVS0="$IJSDEVS" - ;; - JAPAN) - # All old japanese printers - P_DEVS0="$P_DEVS0 $JAPAN_DEVS" - ;; - PS) - # PostScript/PDF writing - F_DEVS0="$F_DEVS0 $PS_DEVS" - ;; - SVG) - # PostScript/PDF writing - SVG_DEVS0="$SVGDEV" - ;; - WTS) - # WTS Halftoning devices - F_DEVS0="$F_DEVS0 $WTS_HALFTONING_DEVS" - ;; - ETS) - # ETS Halftoning devices - F_DEVS0="$F_DEVS0 $ETS_HALFTONING_DEVS" - ;; - X11) - # X11 display devices - X11_DEVS0="$X_DEVS" - ;; - opvp) - # Open Vector Printing driver... - if test x$ac_cv_lib_dl_dlopen != xno -a x$found_iconv != xno; then - P_DEVS0="$P_DEVS0 $OPVP_DEVS" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to include opvp/oprp driver due to missing or disabled prerequisites..." >&5 -$as_echo "$as_me: WARNING: Unable to include opvp/oprp driver due to missing or disabled prerequisites..." >&2;} - fi - ;; - *) - # It's a driver name (or a user messup) - P_DEVS0="$P_DEVS0 `echo $THIS |sed -e 's,\.dev$,,'`" - ;; - esac -done - -noncontribmakefiles=`find . -name '*.mak' -print | grep -v '^\./contrib/'` -# No need to include opvp/oprp driver without iconv/libiconv. -if test -n "$P_DEVS0"; then - if test x$found_iconv = xno ; then - P_DEVS0=`echo $P_DEVS0 | sed -e 's|opvp||' -e 's|oprp||'` - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to include opvp/oprp driver due to missing iconv/libiconv..." >&5 -$as_echo "$as_me: WARNING: Unable to include opvp/oprp driver due to missing iconv/libiconv..." >&2;} - fi - -# Remove contributed drivers if requested and make sure we don't have any -# duplicates in there, add $(DD)foo.dev constructs - P_DEVS=`(for i in $P_DEVS0; do d='$(DD)'${i}.dev; if ( grep '^'$d $noncontribmakefiles 2>&1 >/dev/null ) || ( ! test -z "$CONTRIBINCLUDE" ); then echo $d; fi; done) | sort | uniq | tr '\012\015' ' '` -fi - -if test -n "$F_DEVS0"; then - F_DEVS=`(for i in $F_DEVS0; do d='$(DD)'${i}.dev; if ( grep '^'$d $noncontribmakefiles 2>&1 >/dev/null) || ( ! test -z "$CONTRIBINCLUDE" ); then echo $d; fi; done) | sort | uniq | tr '\012\015' ' '` -fi - -if test -n "$CUPS_DEVS0"; then - CUPS_DEVS=`(for i in $CUPS_DEVS0; do d='$(DD)'${i}.dev; if ( grep '^'$d $noncontribmakefiles 2>&1 >/dev/null) || ( ! test -z "$CONTRIBINCLUDE" ); then echo $d; fi; done) | sort | uniq | tr '\012\015' ' '` -fi - -if test -n "$SVG_DEVS0"; then - SVG_DEVS=`(for i in $SVG_DEVS0; do d='$(DD)'${i}.dev; if ( grep '^'$d $noncontribmakefiles 2>&1 >/dev/null) || ( ! test -z "$CONTRIBINCLUDE" ); then echo $d; fi; done) | sort | uniq | tr '\012\015' ' '` -fi - -if test -n "$IJS_DEVS0"; then - IJS_DEVS=`(for i in $IJS_DEVS0; do d='$(DD)'${i}.dev; if ( grep '^'$d $noncontribmakefiles 2>&1 >/dev/null) || ( ! test -z "$CONTRIBINCLUDE" ); then echo $d; fi; done) | sort | uniq | tr '\012\015' ' '` -fi - -if test -n "$PNG_DEVS0"; then - PNG_DEVS=`(for i in $PNG_DEVS0; do d='$(DD)'${i}.dev; if ( grep '^'$d $noncontribmakefiles 2>&1 >/dev/null) || ( ! test -z "$CONTRIBINCLUDE" ); then echo $d; fi; done) | sort | uniq | tr '\012\015' ' '` -fi - -if test -n "$X11_DEVS0"; then - X11_DEVS=`(for i in $X11_DEVS0; do d='$(DD)'${i}.dev; if ( grep '^'$d $noncontribmakefiles 2>&1 >/dev/null) || ( ! test -z "$CONTRIBINCLUDE" ); then echo $d; fi; done) | sort | uniq | tr '\012\015' ' '` -fi - - - - - - - - - -# This now gets done after handling --enable-dynamic -# AC_SUBST(X11_DEVS) - -DYNAMIC_CFLAGS="" -DYNAMIC_DEVS="" -DYNAMIC_FLAGS="" -DYNAMIC_LDFLAGS="" -DYNAMIC_LIBS="" -INSTALL_SHARED="" - -case `uname` in - Linux*|GNU*) - DYNAMIC_CFLAGS="-fPIC" - DYNAMIC_LDFLAGS="-fPIC -shared" - if test $ac_cv_c_compiler_gnu = yes; then - # GCC high level flag - DYNAMIC_LIBS="-rdynamic -ldl" - else - DYNAMIC_LIBS="" - fi - ;; - *BSD) - DYNAMIC_CFLAGS="-fPIC" - DYNAMIC_LDFLAGS="-fPIC -shared" - DYNAMIC_LIBS="" - ;; - Darwin*) - DYNAMIC_LDFLAGS="-dynamiclib" - DYNAMIC_LIBS="" - ;; - SunOS) - if test $ac_cv_c_compiler_gnu = yes; then - DYNAMIC_CFLAGS="-fPIC" - else - DYNAMIC_CFLAGS="-KPIC" - fi - DYNAMIC_LDFLAGS="-G" - DYNAMIC_LIBS="" - ;; -esac - -# Check whether --enable-dynamic was given. -if test "${enable_dynamic+set}" = set; then : - enableval=$enable_dynamic; - case `uname` in - Linux*|GNU*) - INSTALL_SHARED="install-shared" - if test "x$X_DEVS" != x; then - DYNAMIC_DEVS="\$(GLOBJDIR)/X11.so" - else - DYNAMIC_DEVS="" - fi - DYNAMIC_FLAGS="-DGS_DEVS_SHARED -DGS_DEVS_SHARED_DIR=\\\"\$(gssharedir)\\\"" - X11_DEVS="" - OPT_CFLAGS="$DYNAMIC_CFLAGS $OPT_CFLAGS" - DBG_CFLAGS="$DYNAMIC_CFLAGS $DBG_CFLAGS" - ;; - *BSD) - DYNAMIC_DEVS="\$(GLOBJDIR)/X11.so" - DYNAMIC_FLAGS="-DGS_DEVS_SHARED -DGS_DEVS_SHARED_DIR=\\\"\$(gssharedir)\\\"" - X11_DEVS="" - OPT_CFLAGS="$DYNAMIC_CFLAGS $OPT_CFLAGS" - DBG_CFLAGS="$DYNAMIC_CFLAGS $DBG_CFLAGS" - ;; - Darwin*) - INSTALL_SHARED="install-shared" - DYNAMIC_FLAGS="-DGS_DEVS_SHARED -DGS_DEVS_SHARED_DIR=\\\"\$(gssharedir)\\\"" - X11_DEVS="" - OPT_CFLAGS="$DYNAMIC_CFLAGS $OPT_CFLAGS" - DBG_CFLAGS="$DYNAMIC_CFLAGS $DBG_CFLAGS" - ;; - SunOS) - DYNAMIC_DEVS="\$(GLOBJDIR)/X11.so" - DYNAMIC_FLAGS="-DGS_DEVS_SHARED -DGS_DEVS_SHARED_DIR=\\\"\$(gssharedir)\\\"" - OPT_CFLAGS="$DYNAMIC_CFLAGS $OPT_CFLAGS" - DBG_CFLAGS="$DYNAMIC_CFLAGS $DBG_CFLAGS" - ;; - *) - as_fn_error $? "Sorry, dynamic driver support not available on this platform!" "$LINENO" 5 - ;; - esac - -fi - - - - - - - - - - - -# Check whether --with-fontpath was given. -if test "${with_fontpath+set}" = set; then : - withval=$with_fontpath; fontpath="$withval" -else - fontpath="" -fi - - -if test "x$prefix" = xNONE; then - prefix=/usr/local -fi - -if test "x$datadir" = 'x${prefix}/share'; then - datadir="$prefix/share" -fi - -if test "x$fontpath" = "x"; then - # These font directories are used by various Linux distributions... - fontpath="$datadir/fonts/default/ghostscript" - fontpath="${fontpath}:$datadir/fonts/default/Type1" - fontpath="${fontpath}:$datadir/fonts/default/TrueType" - - # These font directories are used by IRIX... - fontpath="${fontpath}:/usr/lib/DPS/outline/base" - - # These font directories are used by Solaris... - fontpath="${fontpath}:/usr/openwin/lib/X11/fonts/Type1" - fontpath="${fontpath}:/usr/openwin/lib/X11/fonts/TrueType" - - # This font directory is used by CUPS... - if test "x$CUPSCONFIG" != x; then - fontpath="${fontpath}:`$CUPSCONFIG --datadir`/fonts" - fi -fi - - - - -for ac_func in mkstemp -do : - ac_fn_c_check_func "$LINENO" "mkstemp" "ac_cv_func_mkstemp" -if test "x$ac_cv_func_mkstemp" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_MKSTEMP 1 -_ACEOF - HAVE_MKSTEMP=-DHAVE_MKSTEMP -fi -done - - - -for ac_func in fopen64 -do : - ac_fn_c_check_func "$LINENO" "fopen64" "ac_cv_func_fopen64" -if test "x$ac_cv_func_fopen64" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_FOPEN64 1 -_ACEOF - HAVE_FILE64=-DHAVE_FILE64 -fi -done - - - -for ac_func in mkstemp64 -do : - ac_fn_c_check_func "$LINENO" "mkstemp64" "ac_cv_func_mkstemp64" -if test "x$ac_cv_func_mkstemp64" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_MKSTEMP64 1 -_ACEOF - HAVE_MKSTEMP64=-DHAVE_MKSTEMP64 -fi -done - - - -for ac_func in setlocale -do : - ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale" -if test "x$ac_cv_func_setlocale" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_SETLOCALE 1 -_ACEOF - HAVE_SETLOCALE=-DHAVE_SETLOCALE -fi -done - - - -if test $ac_cv_c_compiler_gnu = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 -$as_echo_n "checking whether $CC needs -traditional... " >&6; } -if test "${ac_cv_prog_gcc_traditional+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_pattern="Autoconf.*'x'" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -Autoconf TIOCGETP -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "$ac_pattern" >/dev/null 2>&1; then : - ac_cv_prog_gcc_traditional=yes -else - ac_cv_prog_gcc_traditional=no -fi -rm -f conftest* - - - if test $ac_cv_prog_gcc_traditional = no; then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -Autoconf TCGETA -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "$ac_pattern" >/dev/null 2>&1; then : - ac_cv_prog_gcc_traditional=yes -fi -rm -f conftest* - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 -$as_echo "$ac_cv_prog_gcc_traditional" >&6; } - if test $ac_cv_prog_gcc_traditional = yes; then - CC="$CC -traditional" - fi -fi - - -ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" -if test "x$ac_cv_type_pid_t" = x""yes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define pid_t int -_ACEOF - -fi - -for ac_header in vfork.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default" -if test "x$ac_cv_header_vfork_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_VFORK_H 1 -_ACEOF - -fi - -done - -for ac_func in fork vfork -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - -if test "x$ac_cv_func_fork" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5 -$as_echo_n "checking for working fork... " >&6; } -if test "${ac_cv_func_fork_works+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_func_fork_works=cross -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ - - /* By Ruediger Kuhlmann. */ - return fork () < 0; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_fork_works=yes -else - ac_cv_func_fork_works=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5 -$as_echo "$ac_cv_func_fork_works" >&6; } - -else - ac_cv_func_fork_works=$ac_cv_func_fork -fi -if test "x$ac_cv_func_fork_works" = xcross; then - case $host in - *-*-amigaos* | *-*-msdosdjgpp*) - # Override, as these systems have only a dummy fork() stub - ac_cv_func_fork_works=no - ;; - *) - ac_cv_func_fork_works=yes - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 -$as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} -fi -ac_cv_func_vfork_works=$ac_cv_func_vfork -if test "x$ac_cv_func_vfork" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5 -$as_echo_n "checking for working vfork... " >&6; } -if test "${ac_cv_func_vfork_works+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_func_vfork_works=cross -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Thanks to Paul Eggert for this test. */ -$ac_includes_default -#include -#ifdef HAVE_VFORK_H -# include -#endif -/* On some sparc systems, changes by the child to local and incoming - argument registers are propagated back to the parent. The compiler - is told about this with #include , but some compilers - (e.g. gcc -O) don't grok . Test for this by using a - static variable whose address is put into a register that is - clobbered by the vfork. */ -static void -#ifdef __cplusplus -sparc_address_test (int arg) -# else -sparc_address_test (arg) int arg; -#endif -{ - static pid_t child; - if (!child) { - child = vfork (); - if (child < 0) { - perror ("vfork"); - _exit(2); - } - if (!child) { - arg = getpid(); - write(-1, "", 0); - _exit (arg); - } - } -} - -int -main () -{ - pid_t parent = getpid (); - pid_t child; - - sparc_address_test (0); - - child = vfork (); - - if (child == 0) { - /* Here is another test for sparc vfork register problems. This - test uses lots of local variables, at least as many local - variables as main has allocated so far including compiler - temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris - 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should - reuse the register of parent for one of the local variables, - since it will think that parent can't possibly be used any more - in this routine. Assigning to the local variable will thus - munge parent in the parent process. */ - pid_t - p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), - p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); - /* Convince the compiler that p..p7 are live; otherwise, it might - use the same hardware register for all 8 local variables. */ - if (p != p1 || p != p2 || p != p3 || p != p4 - || p != p5 || p != p6 || p != p7) - _exit(1); - - /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent - from child file descriptors. If the child closes a descriptor - before it execs or exits, this munges the parent's descriptor - as well. Test for this by closing stdout in the child. */ - _exit(close(fileno(stdout)) != 0); - } else { - int status; - struct stat st; - - while (wait(&status) != child) - ; - return ( - /* Was there some problem with vforking? */ - child < 0 - - /* Did the child fail? (This shouldn't happen.) */ - || status - - /* Did the vfork/compiler bug occur? */ - || parent != getpid() - - /* Did the file descriptor bug occur? */ - || fstat(fileno(stdout), &st) != 0 - ); - } -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_vfork_works=yes -else - ac_cv_func_vfork_works=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5 -$as_echo "$ac_cv_func_vfork_works" >&6; } - -fi; -if test "x$ac_cv_func_fork_works" = xcross; then - ac_cv_func_vfork_works=$ac_cv_func_vfork - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 -$as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} -fi - -if test "x$ac_cv_func_vfork_works" = xyes; then - -$as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h - -else - -$as_echo "#define vfork fork" >>confdefs.h - -fi -if test "x$ac_cv_func_fork_works" = xyes; then - -$as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h - -fi - -for ac_header in stdlib.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" -if test "x$ac_cv_header_stdlib_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_STDLIB_H 1 -_ACEOF - -fi - -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 -$as_echo_n "checking for GNU libc compatible malloc... " >&6; } -if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_func_malloc_0_nonnull=no -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined STDC_HEADERS || defined HAVE_STDLIB_H -# include -#else -char *malloc (); -#endif - -int -main () -{ -return ! malloc (0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_malloc_0_nonnull=yes -else - ac_cv_func_malloc_0_nonnull=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 -$as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } -if test $ac_cv_func_malloc_0_nonnull = yes; then : - -$as_echo "#define HAVE_MALLOC 1" >>confdefs.h - -else - $as_echo "#define HAVE_MALLOC 0" >>confdefs.h - - case " $LIBOBJS " in - *" malloc.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS malloc.$ac_objext" - ;; -esac - - -$as_echo "#define malloc rpl_malloc" >>confdefs.h - -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working memcmp" >&5 -$as_echo_n "checking for working memcmp... " >&6; } -if test "${ac_cv_func_memcmp_working+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_func_memcmp_working=no -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ - - /* Some versions of memcmp are not 8-bit clean. */ - char c0 = '\100', c1 = '\200', c2 = '\201'; - if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0) - return 1; - - /* The Next x86 OpenStep bug shows up only when comparing 16 bytes - or more and with at least one buffer not starting on a 4-byte boundary. - William Lewis provided this test program. */ - { - char foo[21]; - char bar[21]; - int i; - for (i = 0; i < 4; i++) - { - char *a = foo + i; - char *b = bar + i; - strcpy (a, "--------01111111"); - strcpy (b, "--------10000000"); - if (memcmp (a, b, 16) >= 0) - return 1; - } - return 0; - } - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_memcmp_working=yes -else - ac_cv_func_memcmp_working=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_memcmp_working" >&5 -$as_echo "$ac_cv_func_memcmp_working" >&6; } -test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in - *" memcmp.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" - ;; -esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 -$as_echo_n "checking return type of signal handlers... " >&6; } -if test "${ac_cv_type_signal+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include - -int -main () -{ -return *(signal (0, 0)) (0) == 1; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_signal=int -else - ac_cv_type_signal=void -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 -$as_echo "$ac_cv_type_signal" >&6; } - -cat >>confdefs.h <<_ACEOF -#define RETSIGTYPE $ac_cv_type_signal -_ACEOF - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5 -$as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; } -if test "${ac_cv_func_lstat_dereferences_slashed_symlink+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - rm -f conftest.sym conftest.file -echo >conftest.file -if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then - if test "$cross_compiling" = yes; then : - ac_cv_func_lstat_dereferences_slashed_symlink=no -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -struct stat sbuf; - /* Linux will dereference the symlink and fail, as required by POSIX. - That is better in the sense that it means we will not - have to compile and use the lstat wrapper. */ - return lstat ("conftest.sym/", &sbuf) == 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_lstat_dereferences_slashed_symlink=yes -else - ac_cv_func_lstat_dereferences_slashed_symlink=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -else - # If the `ln -s' command failed, then we probably don't even - # have an lstat function. - ac_cv_func_lstat_dereferences_slashed_symlink=no -fi -rm -f conftest.sym conftest.file - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 -$as_echo "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } - -test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && - -cat >>confdefs.h <<_ACEOF -#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 -_ACEOF - - -if test "x$ac_cv_func_lstat_dereferences_slashed_symlink" = xno; then - case " $LIBOBJS " in - *" lstat.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS lstat.$ac_objext" - ;; -esac - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat accepts an empty string" >&5 -$as_echo_n "checking whether stat accepts an empty string... " >&6; } -if test "${ac_cv_func_stat_empty_string_bug+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_func_stat_empty_string_bug=yes -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -struct stat sbuf; - return stat ("", &sbuf) == 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_stat_empty_string_bug=no -else - ac_cv_func_stat_empty_string_bug=yes -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_stat_empty_string_bug" >&5 -$as_echo "$ac_cv_func_stat_empty_string_bug" >&6; } -if test $ac_cv_func_stat_empty_string_bug = yes; then - case " $LIBOBJS " in - *" stat.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS stat.$ac_objext" - ;; -esac - - -cat >>confdefs.h <<_ACEOF -#define HAVE_STAT_EMPTY_STRING_BUG 1 -_ACEOF - -fi - -for ac_func in vprintf -do : - ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" -if test "x$ac_cv_func_vprintf" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_VPRINTF 1 -_ACEOF - -ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" -if test "x$ac_cv_func__doprnt" = x""yes; then : - -$as_echo "#define HAVE_DOPRNT 1" >>confdefs.h - -fi - -fi -done - - -for ac_func in bzero dup2 floor gettimeofday memchr memmove memset mkdir mkfifo modf pow putenv rint setenv sqrt strchr strerror strrchr strspn strstr -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - - -HAVE_SSE2="" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#include -int main (int argc, char *argv) -{ - __m128i input1; - return(0); -} - -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - HAVE_SSE2="-DHAVE_SSE2" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - -# Check whether --enable-sse2 was given. -if test "${enable_sse2+set}" = set; then : - enableval=$enable_sse2; - if test "x$enable_sse2" = xno; then - HAVE_SSE2="" - fi -fi - - - - - -HAVE_BSWAP32="" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int main (int argc, char *argv) -{ - int a = __builtin_bswap32(argc); - return(0); -} - -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - HAVE_BSWAP32="-DHAVE_BSWAP32" -else - HAVE_BSWAP32="" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - -# Check whether --enable-bswap32 was given. -if test "${enable_bswap32+set}" = set; then : - enableval=$enable_bswap32; - if test "x$enable_bswap32" = xno; then - HAVE_BSWAP32="" - fi -fi - - - - - -HAVE_BYTESWAP_H="" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#include "byteswap.h" -int main (int argc, char *argv) -{ - int a = bswap_32(argc); - return(0); -} - -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - HAVE_BYTESWAP_H="-DHAVE_BYTESWAP_H" -else - HAVE_BYTESWAP_H="" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -# Check whether --enable-byteswap-h was given. -if test "${enable_byteswap_h+set}" = set; then : - enableval=$enable_byteswap_h; - if test "x$enable_byteswap-h" = xno; then - HAVE_BYTESWAP_H="" - fi -fi - - - - - - - - - -ac_config_files="$ac_config_files Makefile" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - test "x$cache_file" != "x/dev/null" && - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - cat confcache >$cache_file - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -# -# If the first sed substitution is executed (which looks for macros that -# take arguments), then branch to the quote section. Otherwise, -# look for a macro that doesn't take arguments. -ac_script=' -:mline -/\\$/{ - N - s,\\\n,, - b mline -} -t clear -:clear -s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g -t quote -s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g -t quote -b any -:quote -s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g -s/\[/\\&/g -s/\]/\\&/g -s/\$/$$/g -H -:any -${ - g - s/^\n// - s/\n/ /g - p -} -' -DEFS=`sed -n "$ac_script" confdefs.h` - - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - - -: ${CONFIG_STATUS=./config.status} -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by $as_me, which was -generated by GNU Autoconf 2.67. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - -Configuration files: -$config_files - -Report bugs to the package provider." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -config.status -configured by $0, generated by GNU Autoconf 2.67, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2010 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h | --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= - trap 'exit_status=$? - { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - - -eval set X " :F $CONFIG_FILES " -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$tmp/stdin" - case $ac_file in - -) cat "$tmp/out" && rm -f "$tmp/out";; - *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - - - - esac - -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - - -if ( test -d cups ); then -ac_config_files="$ac_config_files cups/pstopxl" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - test "x$cache_file" != "x/dev/null" && - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - cat confcache >$cache_file - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -# -# If the first sed substitution is executed (which looks for macros that -# take arguments), then branch to the quote section. Otherwise, -# look for a macro that doesn't take arguments. -ac_script=' -:mline -/\\$/{ - N - s,\\\n,, - b mline -} -t clear -:clear -s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g -t quote -s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g -t quote -b any -:quote -s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g -s/\[/\\&/g -s/\]/\\&/g -s/\$/$$/g -H -:any -${ - g - s/^\n// - s/\n/ /g - p -} -' -DEFS=`sed -n "$ac_script" confdefs.h` - - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - - -: ${CONFIG_STATUS=./config.status} -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by $as_me, which was -generated by GNU Autoconf 2.67. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - -Configuration files: -$config_files - -Report bugs to the package provider." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -config.status -configured by $0, generated by GNU Autoconf 2.67, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2010 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h | --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "cups/pstopxl") CONFIG_FILES="$CONFIG_FILES cups/pstopxl" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= - trap 'exit_status=$? - { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - - -eval set X " :F $CONFIG_FILES " -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$tmp/stdin" - case $ac_file in - -) cat "$tmp/out" && rm -f "$tmp/out";; - *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - - - - esac - -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - -chmod +x cups/pstopxl -fi - diff -Nru ghostscript-9.04~dfsg/configure.ac ghostscript-9.05~dfsg~20120125/configure.ac --- ghostscript-9.04~dfsg/configure.ac 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/configure.ac 1970-01-01 00:00:00.000000000 +0000 @@ -1,1679 +0,0 @@ -dnl Copyright (C) 2001-2007 Artifex Software, Inc. -dnl All Rights Reserved. - -dnl This software is provided AS-IS with no warranty, either express or -dnl implied. - -dnl This software is distributed under license and may not be copied, modified -dnl or distributed except as expressly authorized under the terms of that -dnl license. Refer to licensing information at http://www.artifex.com/ -dnl or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, -dnl San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. - -dnl $Id$ - -dnl Process this file with autoconf to produce a configure script - -dnl ------------------------------------------------ -dnl Initialization and Versioning -dnl ------------------------------------------------ - -AC_INIT -AC_PREREQ(2.52) -AC_CONFIG_SRCDIR(psi/gs.c) - -dnl Inherit compiler flags from the environment... -CFLAGS="${CFLAGS:=}" -CPPFLAGS="${CPPFLAGS:=}" -CXXFLAGS="${CXXFLAGS:=}" -LDFLAGS="${LDFLAGS:=}" - -dnl -------------------------------------------------- -dnl Local utilities -dnl -------------------------------------------------- - -dnl GS_SPLIT_LIBS( LIBS, LINKLINE ) -dnl Split a unix-style link line into a list of -dnl bare library names. For example, the line -dnl '-L/usr/X11R6/lib -lX11 -lXt' splits into -dnl LIB='X11 Xt' -dnl -AC_DEFUN([GS_SPLIT_LIBS], [ -# the makefile wants a list of just the library names -for gs_item in $2; do - gs_stripped_item=`echo "$gs_item" | sed -e 's/^-l//'` - if test "x$gs_stripped_item" != "x$gs_item"; then - $1="$[$1] $gs_stripped_item" - fi -done -]) - -dnl GS_SPLIT_LIBPATHS( LIBPATHS, LINKLINE ) -dnl Split a unix-style link line into a list of -dnl bare search path entries. For example, -dnl '-L/usr/X11R6/lib -lX11 -L/opt/lib -lXt' -dnl splits to LIBPATHS='/usr/X11R6/lib /opt/lib' -dnl -AC_DEFUN([GS_SPLIT_LIBPATHS], [ -for gs_item in $2; do - gs_stripped_item=`echo "$gs_item" | sed -e 's/-L//'` - if test "x$gs_stripped_item" != "x$gs_item"; then - $1="$[$1] $gs_stripped_item" - fi -done -]) - -dnl -------------------------------------------------- -dnl Check for programs -dnl -------------------------------------------------- - -dnl AC_PROG_CC likes to add '-g -O2' to CFLAGS. however, -dnl we ignore those flags and construct our own. -save_cflags=$CFLAGS -AC_PROG_CC -AC_PROG_CPP -CFLAGS=$save_cflags - -AC_PROG_SED -dnl See if it is GNU sed or else. -dnl - need more work to tell SED features. -SED_EXTENDED_REGEX_OPT=-nre -sed_variant=`sed --version 2>&1` -sed_variant=`echo $sed_variant|sed -e 's/ .*//'` -if test "$sed_variant" != GNU ; then -SED_EXTENDED_REGEX_OPT=-nEe -fi -AC_SUBST(SED_EXTENDED_REGEX_OPT) - -AC_PROG_RANLIB -#AC_PROG_INSTALL - -dnl pkg-config is used for several tests now... -AC_PATH_PROG(PKGCONFIG, pkg-config) - -dnl -------------------------------------------------- -dnl Allow excluding the contributed drivers -dnl -------------------------------------------------- - -AC_ARG_ENABLE([contrib], AC_HELP_STRING([--disable-contrib], - [Do not include contributed drivers])) -CONTRIBINCLUDE="include contrib/contrib.mak" -INSTALL_CONTRIB="install-contrib-extras" -if test x$enable_contrib = xno; then - CONTRIBINCLUDE="" - INSTALL_CONTRIB="" - CFLAGS="$CFLAGS -DNOCONTRIB" -fi -AC_SUBST(CONTRIBINCLUDE) -AC_SUBST(INSTALL_CONTRIB) - -dnl -------------------------------------------------- -dnl Set build flags based on environment -dnl -------------------------------------------------- - -#AC_CANONICAL_HOST - -CC_OPT_FLAGS_TO_TRY="-O" -SET_DT_SONAME="-soname=" - -case `uname` in - Linux*|GNU*) - if test $ac_cv_prog_gcc = yes; then - CC_OPT_FLAGS_TO_TRY="-O2" - CC_DBG_FLAGS_TO_TRY="-g -O0" - fi - ;; - *BSD) - if test $ac_cv_prog_gcc = yes; then - CC_OPT_FLAGS_TO_TRY="-O2" - CC_DBG_FLAGS_TO_TRY="-g -O0" - fi - ;; - Darwin*) - if test $ac_cv_prog_gcc = yes; then - CC_OPT_FLAGS_TO_TRY="-O2" - CC_DBG_FLAGS_TO_TRY="-g -O0" - fi - ;; - SunOS) - CC_OPT_FLAGS_TO_TRY="-O2" - # the trailing space is required! - if test $ac_cv_prog_gcc = no; then - SET_DT_SONAME="-h " - fi - CC_DBG_FLAGS_TO_TRY="-g -O0" - ;; -esac - -AC_SUBST(SET_DT_SONAME) - - -if test $ac_cv_prog_gcc = yes; then - cflags_to_try="-Wall -Wstrict-prototypes -Wundef \ --Wmissing-declarations -Wmissing-prototypes -Wwrite-strings \ --Wno-strict-aliasing -Wdeclaration-after-statement \ --fno-builtin -fno-common" - optflags_to_try="$CC_OPT_FLAGS_TO_TRY" - dbgflags_to_try="$CC_DBG_FLAGS_TO_TRY" -else - cflags_to_try= - optflags_to_try="$CC_OPT_FLAGS_TO_TRY" - dbgflags_to_try="$CC_DBG_FLAGS_TO_TRY" -fi - -# debug configurarion is available by default with "make debug" -#AC_ARG_ENABLE([debug], AC_HELP_STRING([--enable-debug], -# [turn on debugging])) -#if test x$enable_debug = xyes; then -# optflags_to_try="-g" -# CFLAGS="-DDEBUG $CFLAGS" -#fi - -AC_MSG_CHECKING([supported compiler flags]) -old_cflags=$CFLAGS -echo -for flag in $optflags_to_try; do - CFLAGS="$CFLAGS $flag" - AC_TRY_COMPILE(, [return 0;], [ - echo " $flag" - OPT_CFLAGS="$OPT_CFLAGS $flag" - ]) - CFLAGS=$old_cflags -done -for flag in $cflags_to_try; do - CFLAGS="$CFLAGS $flag" - AC_TRY_COMPILE(, [return 0;], [ - echo " $flag" - GCFLAGS="$GCFLAGS $flag" - ]) - CFLAGS=$old_cflags -done -old_cflags=$CFLAGS -echo -for flag in $dbgflags_to_try; do - CFLAGS="$CFLAGS $flag" - AC_TRY_COMPILE(, [return 0;], [ - echo " $flag" - DBG_CFLAGS="$DBG_CFLAGS $flag" - ]) - CFLAGS=$old_cflags -done - -AC_MSG_RESULT([ ...done.]) - -dnl -------------------------------------------------- -dnl Check for headers -dnl -------------------------------------------------- - -AC_HEADER_DIRENT -AC_HEADER_STDC -AC_CHECK_HEADERS([errno.h fcntl.h limits.h malloc.h memory.h stdlib.h string.h strings.h sys/ioctl.h sys/param.h sys/time.h syslog.h unistd.h]) - -dnl -------------------------------------------------- -dnl Check for *BSD and apply BSD Make workaround -dnl - BSD Make treats obj special and cd into it first. -dnl -------------------------------------------------- - -OBJDIR_BSDMAKE_WORKAROUND=obj - -case `uname` in - *BSD) - OBJDIR_BSDMAKEWORKAOROUND="notobj" - ;; -esac -AC_SUBST(OBJDIR_BSDMAKE_WORKAROUND) - -# for gdev3b1.c (AT&T terminal interface) -AC_CHECK_HEADER([sys/window.h]) - -dnl -------------------------------------------------- -dnl Check for typedefs, structures, etc -dnl -------------------------------------------------- - -AC_C_CONST -AC_C_INLINE -AC_TYPE_MODE_T -AC_TYPE_OFF_T -AC_TYPE_SIZE_T -AC_STRUCT_ST_BLOCKS -AC_HEADER_TIME -AC_STRUCT_TM - -dnl see if we're on a system that puts the *int*_t types -dnl from stdint.h in sys/types.h -if test "x$ac_cv_header_stdint_h" != xyes; then - AC_CHECK_TYPES([int8_t, int16_t, int32_t, uint8_t, uint16_t, uint32_t],,,[#include ]) - if test "$ac_cv_type_uint8_t" = yes; then - AC_DEFINE([SYS_TYPES_HAS_STDINT_TYPES]) - GCFLAGS="$GCFLAGS -DSYS_TYPES_HAS_STDINT_TYPES" - fi -fi - -dnl we aren't interested in all of DEFS, so manually insert -dnl the flags we care about -if test "$ac_cv_c_const" != yes; then - GCFLAGS="$GCFLAGS -Dconst=" -fi -if test "x$ac_cv_header_stdint_h" = xyes; then - GCFLAGS="$GCFLAGS -DHAVE_STDINT_H" -fi - -dnl try to find a 64 bit type for devicen color index -uint64_type="none" - AC_CHECK_SIZEOF(unsigned long int) - if test $ac_cv_sizeof_unsigned_long_int = 8; then - uint64_type="unsigned long int" - else - AC_CHECK_SIZEOF(unsigned long long) - if test $ac_cv_sizeof_unsigned_long_long = 8; then - uint64_type="unsigned long long" - else - AC_CHECK_SIZEOF(unsigned __int64) - if test $ac_cv_sizeof_unsigned___int64 = 8; then - uint64_type="unsigned __int64" - else - AC_CHECK_SIZEOF(u_int64_t) - if test $ac_cv_sizeof_u_int64_t = 8; then - uint64_type="u_int64_t" - fi - fi - fi - fi -dnl we don't need to do anything if a 64-bit type wasn't found -dnl the code falls back to a (probably 32-bit) default -if test "$uint64_type" != "none"; then - GCFLAGS="$GCFLAGS -DGX_COLOR_INDEX_TYPE=\"$uint64_type\"" -fi - -dnl -------------------------------------------------- -dnl Set options that we want to pass into all other -dnl configure scripts we might call -dnl -------------------------------------------------- - -SUBCONFIG_OPTS="" - -if test x$build_alias != x; then -SUBCONFIG_OPTS="$SUBCONFIG_OPTS --build=$build_alias" -fi - - -dnl -------------------------------------------------- -dnl Check for libraries -dnl -------------------------------------------------- - -AC_CHECK_LIB(m, cos) - -SYNC="nosync" -PTHREAD_LIBS="" -AC_CHECK_LIB(pthread, pthread_create, [ - SYNC=posync; - PTHREAD_LIBS="-lpthread" -]) -AC_SUBST(SYNC) -AC_SUBST(PTHREAD_LIBS) - -dnl Tests for iconv (Needed for OpenPrinting Vector, "opvp" output device) -AC_ARG_WITH(libiconv, - [AC_HELP_STRING([--with-libiconv=@<:@no/gnu/native@:>@], - [use the libiconv library])],, - [with_libiconv=maybe]) -found_iconv=no -case $with_libiconv in - maybe) - # Check in the C library first - AC_CHECK_FUNC(iconv_open, [with_libiconv=no; found_iconv=yes]) - # Check if we have GNU libiconv - if test $found_iconv = "no"; then - AC_CHECK_LIB(iconv, libiconv_open, [with_libiconv=gnu; found_iconv=yes]) - fi - # Check if we have a iconv in -liconv, possibly from vendor - if test $found_iconv = "no"; then - AC_CHECK_LIB(iconv, iconv_open, [with_libiconv=native; found_iconv=yes]) - fi - ;; - no) - found_iconv=no - ;; - gnu|yes) - AC_CHECK_LIB(iconv, libiconv_open, [with_libiconv=gnu; found_iconv=yes]) - ;; - native) - AC_CHECK_LIB(iconv, iconv_open, [with_libiconv=native; found_iconv=yes]) - ;; -esac -if test x$found_iconv != xno -a x$with_libiconv != xno ; then - LIBS="$LIBS -liconv" -fi - -case $with_libiconv in - gnu) - AC_DEFINE(USE_LIBICONV_GNU, 1, [Using GNU libiconv]) - CFLAGS="$CFLAGS -DUSE_LIBICONV_GNU" - ;; - native) - AC_DEFINE(USE_LIBICONV_NATIVE, 1, [Using a native implementation of iconv in a separate library]) - ;; -esac - -dnl Check for libidn (needed for Unicode password support) -AC_ARG_WITH(libidn, - [AC_HELP_STRING([--without-libidn], - [don't use libidn to support Unicode passwords])],, - [with_libidn=maybe]) -if test x$with_libidn != xno; then - AC_CHECK_LIB(idn, stringprep, [ - with_libidn=no - AC_CHECK_HEADER([stringprep.h], [with_libidn=yes]) - ], [ - if test x$with_libidn != xmaybe; then - AC_MSG_ERROR([libidn not found]) - fi - with_libidn=no - ]) -fi -HAVE_LIBIDN='' -UTF8DEVS='' -if test x$with_libidn != xno; then - HAVE_LIBIDN=-DHAVE_LIBIDN - LIBS="$LIBS -lidn" - - if test x$found_iconv != xno; then - UTF8DEVS='$(PSD)utf8.dev' - fi -fi -AC_SUBST(HAVE_LIBIDN) -AC_SUBST(UTF8DEVS) - -dnl Tests for libpaper (to determine system default paper size) -AC_ARG_WITH([libpaper], - AC_HELP_STRING([--without-libpaper], - [disable libpaper support])) -if test x$with_libpaper != xno; then - AC_CHECK_LIB(paper, systempapername, [with_libpaper=yes], - [ - AC_MSG_WARN([disabling support for libpaper]) - with_libpaper=no - ]) -fi -if test x$with_libpaper != xno; then - AC_CHECK_HEADER([paper.h], [with_libpaper=yes], - [ - AC_MSG_WARN([disabling support for libpaper]) - with_libpaper=no - ]) -fi - -if test x$with_libpaper != xno; then - LIBS="$LIBS -lpaper" - AC_DEFINE(USE_LIBPAPER, 1, [Using libpaper]) - CFLAGS="$CFLAGS -DUSE_LIBPAPER" -fi - -dnl Fontconfig support -HAVE_FONTCONFIG="" -FONTCONFIG_CFLAGS="" -FONTCONFIG_LIBS="" -AC_ARG_ENABLE([fontconfig], AC_HELP_STRING([--disable-fontconfig], - [Don't use fontconfig to list system fonts])) -if test "$enable_fontconfig" != "no"; then - # We MUST NOT use PKG_CHECK_MODULES since it is a) not a standard - # autoconf macro and b) requires pkg-config on the system, which is - # NOT standard on ANY OS, including Linux! - if test "x$PKGCONFIG" != x; then - AC_MSG_CHECKING(for fontconfig with pkg-config) - if $PKGCONFIG --exists fontconfig; then - AC_MSG_RESULT(yes) - FONTCONFIG_CFLAGS="$CFLAGS `$PKGCONFIG --cflags fontconfig`" - FONTCONFIG_LIBS="`$PKGCONFIG --libs fontconfig`" - HAVE_FONTCONFIG=-DHAVE_FONTCONFIG - else - AC_MSG_RESULT(no) - fi - fi - if test -z "$HAVE_FONTCONFIG"; then - AC_CHECK_LIB([fontconfig], [FcInitLoadConfigAndFonts], [ - AC_CHECK_HEADER([fontconfig/fontconfig.h], [ - FONTCONFIG_LIBS="-lfontconfig" - HAVE_FONTCONFIG="-DHAVE_FONTCONFIG" - ]) - ]) - fi -fi -AC_SUBST(HAVE_FONTCONFIG) -AC_SUBST(FONTCONFIG_CFLAGS) -AC_SUBST(FONTCONFIG_LIBS) - -dnl DBus support -HAVE_DBUS="" -DBUS_CFLAGS="" -DBUS_LIBS="" -AC_ARG_ENABLE([dbus], AC_HELP_STRING([--disable-dbus], - [Do not use dbus to communicate with external services])) -if test "$enable_dbus" != "no"; then - if test "x$PKGCONFIG" != x; then - AC_MSG_CHECKING(for dbus with pkg-config) - if $PKGCONFIG --exists dbus-1; then - AC_MSG_RESULT(yes) - DBUS_CFLAGS="$CFLAGS `$PKGCONFIG --cflags dbus-1`" - DBUS_LIBS="`$PKGCONFIG --libs dbus-1`" - HAVE_DBUS=-DHAVE_DBUS - else - AC_MSG_RESULT(no) - fi - fi - if test -z "$HAVE_DBUS"; then - AC_CHECK_LIB([dbus], [dbus_message_iter_get_basic], [ - AC_CHECK_HEADER([dbus-1.0/dbus/dbus.h], [ - DBUS_LIBS="-ldbus-1 -lpthread -lrt" - HAVE_DBUS="-DHAVE_DBUS" - ]) - ]) - fi -fi -AC_SUBST(HAVE_DBUS) -AC_SUBST(DBUS_CFLAGS) -AC_SUBST(DBUS_LIBS) - -AC_CHECK_LIB(dl, dlopen) - -AC_ARG_ENABLE([freetype], AC_HELP_STRING([--disable-freetype], - [Disable freetype for font rasterization])) -FT_BRIDGE=0 -SHARE_FT=0 -FTSRCDIR= -FT_CFLAGS= -FT_LIBS= - -dnl UFST detection -AC_ARG_WITH([ufst], AC_HELP_STRING([--with-ufst=UFST_ROOT_DIR], - [Use UFST]), - [], [with_ufst=no]) -INSERT_UFST_BRIDGE_EQUAL_ONE= -UFST_ROOT= -UFST_CFLAGS= -UFST_LIB_EXT= -if test -d $with_ufst; then -INSERT_UFST_BRIDGE_EQUAL_ONE="UFST_BRIDGE=1" -UFST_ROOT=$with_ufst -UFST_CFLAGS=-DGCCx86 -UFST_LIB_EXT=.a -fi -AC_SUBST(INSERT_UFST_BRIDGE_EQUAL_ONE) -AC_SUBST(UFST_ROOT) -AC_SUBST(UFST_CFLAGS) -AC_SUBST(UFST_LIB_EXT) - -if test x"$enable_freetype" != xno; then - AC_MSG_CHECKING([for local freetype library source]) - dnl We prefer freetype2 over freetype, so it is easy to override - dnl the included freetype source with a checkout from upstream. - for dir in freetype2 freetype; do - if test -f $dir/src/base/ftbbox.c; then - AC_MSG_RESULT(yes) - SHARE_FT=0 - FTSRCDIR="$dir" - FT_CFLAGS="-I$dir/include" - FT_BRIDGE=1 - break; - fi - done - if test -z $FTSRCDIR; then - AC_MSG_RESULT([no]) - if test "x$PKGCONFIG" != x; then - AC_MSG_CHECKING(for system freetype with pkg-config) - if $PKGCONFIG --exists freetype2; then - AC_MSG_RESULT(yes) - FT_CFLAGS="$CFLAGS `$PKGCONFIG --cflags freetype2`" - FT_LIBS="`$PKGCONFIG --libs freetype2`" - FT_BRIDGE=1 - SHARE_FT=1 - else - AC_MSG_RESULT(no) - AC_MSG_WARN([freetype library source not found...using native rasterizer]) - fi - fi - fi -fi -AC_SUBST(FT_BRIDGE) -AC_SUBST(SHARE_FT) -AC_SUBST(FTSRCDIR) -AC_SUBST(FT_CFLAGS) -AC_SUBST(FT_LIBS) - -AC_MSG_CHECKING([for local jpeg library source]) -dnl At present, we give the local source priority over the shared -dnl build, so that the D_MAX_BLOCKS_IN_MCU patch will be applied. -dnl A more sophisticated approach would be to test the shared lib -dnl to see whether it has already been patched. -LIBJPEGDIR=src -if test -f jpeg/jpeglib.h; then - AC_MSG_RESULT([jpeg]) - SHARE_LIBJPEG=0 - LIBJPEGDIR=jpeg -elif test -f jpeg-6b/jpeglib.h; then - AC_MSG_RESULT([jpeg-6b]) - SHARE_LIBJPEG=0 - LIBJPEGDIR=jpeg-6b -else - AC_MSG_RESULT([no]) - AC_CHECK_LIB(jpeg, jpeg_set_defaults, [ - AC_CHECK_HEADERS([jpeglib.h], [SHARE_LIBJPEG=1]) - ]) -fi -if test -z "$SHARE_LIBJPEG"; then - AC_MSG_ERROR([I wasn't able to find a copy - of the jpeg library. This is required for compiling - ghostscript. Please download a copy of the source, - e.g. from http://www.ijg.org/, unpack it at the - top level of the gs source tree, and rename - the directory to 'jpeg'. - ]) -fi -AC_SUBST(SHARE_LIBJPEG) -AC_SUBST(LIBJPEGDIR) -dnl check for the internal jpeg memory header -AC_MSG_CHECKING([for jmemsys.h]) -if test -r $LIBJPEGDIR/jmemsys.h; then - AC_MSG_RESULT([yes]) -else - AC_MSG_RESULT([no]) - AC_DEFINE([DONT_HAVE_JMEMSYS_H], 1, - [define if the libjpeg memory system prototypes aren't available]) -fi - -AC_MSG_CHECKING([for local zlib source]) -dnl zlib is needed for language level 3, and libpng -# we must define ZLIBDIR regardless because png.mak does a -I$(ZLIBDIR) -# this seems a harmless default -ZLIBDIR=src -if test -d zlib; then - AC_MSG_RESULT([yes]) - SHARE_ZLIB=0 - ZLIBDIR=zlib -else - AC_MSG_RESULT([no]) - AC_CHECK_LIB(z, deflate, [ - AC_CHECK_HEADERS(zlib.h, [SHARE_ZLIB=1]) - ]) -fi -if test -z "$SHARE_ZLIB"; then - AC_MSG_ERROR([I did not find a copy of zlib on your system. - Please either install it, or unpack a copy of the source in a - local directory named 'zlib'. See http://www.gzip.org/zlib/ - for more information. - ]) -fi - -dnl if GS is to use the system zlib, freetype -dnl should do the same -FT_SYS_ZLIB="" -if test x$FT_BRIDGE != x0; then - if test xx$SHARE_FT != x1; then - if test x$SHARE_ZLIB != x0; then - FT_SYS_ZLIB="-DFT_CONFIG_OPTION_SYSTEM_ZLIB" - fi - fi -fi - -AC_SUBST(SHARE_ZLIB) -AC_SUBST(ZLIBDIR) -AC_SUBST(FT_SYS_ZLIB) - -dnl png for the png output device; it also requires zlib -LIBPNGDIR=src -PNGDEVS='' -PNGDEVS_ALL='png48 png16m pnggray pngmono png256 png16 pngalpha' -AC_MSG_CHECKING([for local png library source]) -if test -f libpng/pngread.c; then - AC_MSG_RESULT([yes]) - SHARE_LIBPNG=0 - LIBPNGDIR=libpng - PNGDEVS="$PNGDEVS_ALL" -else - AC_MSG_RESULT([no]) - AC_CHECK_LIB(png, png_create_write_struct, [ - AC_CHECK_HEADERS(png.h, [ - SHARE_LIBPNG=1 - PNGDEVS="$PNGDEVS_ALL" - ], [SHARE_LIBPNG=0]) - ], [SHARE_LIBPNG=0], [-lz]) -fi -if test -z "$PNGDEVS"; then - AC_MSG_NOTICE([disabling png output devices]) -fi -AC_SUBST(SHARE_LIBPNG) -AC_SUBST(LIBPNGDIR) -#AC_SUBST(PNGDEVS) - -AC_MSG_CHECKING([for local lcms library source]) -LCMSDIR=lcms -SHARELCMS=0 -if test -f $LCMSDIR/include/lcms.h; then - AC_MSG_RESULT([yes]) -else -AC_CHECK_LIB(lcms, cmsCreateXYZProfile, [ - AC_CHECK_HEADERS([lcms.h], [SHARELCMS=1;LCMSDIR=""]) - ]) -fi - -AC_MSG_CHECKING([for local lcms2 library source]) -LCMS2DIR=lcms2 -if test -f $LCMS2DIR/include/lcms2.h; then - AC_MSG_RESULT([yes]) -else -AC_CHECK_LIB(lcms2, cmsCreateXYZProfile, [ - AC_CHECK_HEADERS([lcms2.h], [LCMS2DIR=""]) - ]) -fi - -AC_SUBST(SHARELCMS) -AC_SUBST(LCMSDIR) -AC_SUBST(LCMS2DIR) - -dnl look for libtiff, it also requires lib -dnl png for the png output device; it also requires zlib -AC_ARG_WITH([system-libtiff], AC_HELP_STRING([--with-system-libtiff], - [Force using the systems libtiff]), - [], [with_system_libtiff=check]) -TIFFDEVS='' -TIFFDEVS_ALL='$(DD)tiffs $(DD)tiff12nc $(DD)tiff24nc $(DD)tiff48nc $(DD)tiff32nc $(DD)tiff64nc $(DD)tiffcrle $(DD)tifflzw $(DD)tiffpack $(DD)tiffgray $(DD)tiffsep $(DD)tiffscaled' -case "x$with_system_libtiff" in - xcheck) - if test -d tiff; then - LIBTIFFDIR=tiff - HAVE_LOCAL_LIBTIFF=1 - SHARE_LIBTIFF=0 - else - AC_CHECK_LIB(tiff, TIFFOpen, - [AC_CHECK_HEADERS(tiff.h, [HAVE_SYSTEM_LIBTIFF=1;SHARE_LIBTIFF=1])], - [], [-ljpeg]) - fi - if test "x$HAVE_LOCAL_LIBTIFF" = x && test "x$HAVE_SYSTEM_LIBTIFF" = x; then - AC_MSG_NOTICE([Could not find a copy of libtiff on your system. -Disabling tiff output devices.]) - else - TIFFDEVS="$TIFFDEVS_ALL" - fi - ;; - xyes) - AC_CHECK_LIB(tiff, TIFFOpen, - [AC_CHECK_HEADERS(tiff.h, [HAVE_SYSTEM_LIBTIFF=1;SHARE_LIBTIFF=1])], - [], [-ljpeg]) - if test "x$HAVE_SYSTEM_LIBTIFF" != x; then - SHARE_LIBTIFF=1 - TIFFDEVS="$TIFFDEVS_ALL" - else - AC_MSG_NOTICE([Could not find a copy of libtiff on your system. -Disabling tiff output devices.]) - fi - ;; - xno) - AC_MSG_CHECKING([for local libtiff source]) - if test -d tiff; then - AC_MSG_RESULT([yes]) - LIBTIFFDIR=tiff - SHARE_LIBTIFF=0 - TIFFDEVS="$TIFFDEVS_ALL" - else - AC_MSG_RESULT([no]) - AC_MSG_NOTICE([Could not find local copy of libtiff. -Disabling tiff output devices.]) - fi - ;; -esac - -if test $SHARE_LIBTIFF -eq 0; then - echo - echo "Running libtiff configure script..." - olddir=`pwd` - cd $LIBTIFFDIR && ./configure --disable-jbig $SUBCONFIG_OPTS - status=$? - if test "$status" -ne 0 ; then - AC_MSG_ERROR([libtiff configure script failed], $status) - fi - cd $olddir - echo - echo "Continuing with Ghostscript configuration..." -fi - -AC_SUBST(SHARE_LIBTIFF) -AC_SUBST(TIFFDEVS) -AC_SUBST(LIBTIFFDIR) - - -dnl look for CUPS... -AC_ARG_ENABLE([cups], AC_HELP_STRING([--disable-cups], - [Don't include CUPS support])) - -AC_ARG_WITH([pdftoraster], AC_HELP_STRING([--without-pdftoraster], - [Don't include CUPS' pdftoraster filter])) - -AC_ARG_WITH([local-cups], AC_HELP_STRING([--with-local-cups], - [Force using the GS supplied cups code - only useful for debugging]), - [with_local_cups=yes], [with_local_cups=no]) - -AC_ARG_WITH([install-cups], AC_HELP_STRING([--with-install-cups], - [Install the cups conversion tools]), - [CUPSINSTALL=install-cups], [CUPSINSTALL=]) - -CUPSDEV="" -CUPSINCLUDE="" -CUPSCFLAGS="" -CUPSLIBS="" -CUPSLIBDIRS="" -CUPSCONFIG="${CUPSCONFIG:=}" -CUPSSERVERBIN="" -CUPSSERVERROOT="" -CUPSDATA="" -CUPSVERSION="0" -CUPSPDFTORASTER="0" - -SHARELCUPS=1 -SHARELCUPSI=1 - -if ( test -d cups ); then - if test x$enable_cups != xno; then - if test x$with_local_cups != xyes; then - AC_PATH_PROG(CUPSCONFIG,cups-config) - AC_CHECK_HEADER([cups/raster.h],[],[CUPSCONFIG=""]) - if test "x$CUPSCONFIG" != x; then - dnl Use values from CUPS config... - CUPSCFLAGS="`$CUPSCONFIG --cflags` $CFLAGS" -# CUPSLINK="`$CUPSCONFIG --ldflags` `$CUPSCONFIG --static --image --libs | sed -e '1,$s/-lssl//'` $LIBS" - CUPSLINK="`$CUPSCONFIG --ldflags` `$CUPSCONFIG --image --libs`" - GS_SPLIT_LIBS([CUPSLIBS], [$CUPSLINK]) - GS_SPLIT_LIBPATHS([CUPSLIBDIRS],[$CUPSLINK]) - CUPSSERVERROOT="`$CUPSCONFIG --serverroot`" - CUPSSERVERBIN="`$CUPSCONFIG --serverbin`" - CUPSDATA="`$CUPSCONFIG --datadir`" - CUPSINCLUDE="include cups/cups.mak" - CUPSDEV="cups" - CUPSVERSION="`$CUPSCONFIG --version`" - LCUPSINCLUDE="include \$(GLSRCDIR)/lcups.mak" - LCUPSIINCLUDE="include \$(GLSRCDIR)/lcupsi.mak" - if ( test x$with_pdftoraster != xno ); then - if test "$CUPSVERSION" ">" "1.2"; then - CUPSPDFTORASTER="1" - fi - fi - fi - else - if test "$(uname)" = "Linux"; then - AC_MSG_WARN([* USING LOCAL CUPS SOURCE *]) - SHARELCUPS=0 - SHARELCUPSI=0 - LCUPSBUILDTYPE=linux - LCUPSINCLUDE="include \$(GLSRCDIR)/lcups.mak" - LCUPSIINCLUDE="include \$(GLSRCDIR)/lcupsi.mak" - CUPSDEV="cups" - - fi - fi - fi -fi - -#AC_SUBST(CUPSDEV) -AC_SUBST(CUPSCFLAGS) -AC_SUBST(CUPSLIBS) -AC_SUBST(CUPSLIBDIRS) -AC_SUBST(CUPSINCLUDE) -AC_SUBST(CUPSSERVERBIN) -AC_SUBST(CUPSSERVERROOT) -AC_SUBST(CUPSDATA) -AC_SUBST(CUPSINSTALL) - -AC_SUBST(SHARELCUPS) -AC_SUBST(SHARELCUPSI) -AC_SUBST(LCUPSBUILDTYPE) -AC_SUBST(LCUPSINCLUDE) -AC_SUBST(LCUPSIINCLUDE) - - -AC_SUBST(CUPSPDFTORASTER) - -dnl look for IJS implementation -AC_ARG_WITH([ijs], AC_HELP_STRING([--without-ijs], - [disable IJS driver support])) -dnl set safe defaults - IJSDIR=src - IJSDEVS='' - SHAREIJS=0 -if test x$with_ijs != xno; then - AC_MSG_CHECKING([for local ijs library source]) - if test -d ijs; then - AC_MSG_RESULT([yes]) - IJSDIR=ijs - IJSDEVS='ijs' - else - AC_MSG_RESULT([no]) - AC_CHECK_LIB(ijs, ijs_server_init, [ - AC_CHECK_HEADERS(ijs/ijs.h, [SHAREIJS=1]) - ]) - if test $SHAREIJS -eq 1 ; then - IJSLIB=ijs - # This is for safety - it prevents our header search path going outside the GS source tree - IJSDIR='$(GLOBJDIR)' - IJSDEVS='ijs' - fi - fi -fi -AC_SUBST(IJSDIR) -AC_SUBST(SHAREIJS) -AC_SUBST(IJSLIB) -#AC_SUBST(IJSDEVS) - - -JBIG2_DECODER= -JBIG2DIR=src -SHARE_JBIG2=0 -JBIG2DEVS='' -JBIG2_AUTOCONF_CFLAGS= - -dnl Luratech detection -LURATECHDIR=luratech - -AC_ARG_WITH([luratech], AC_HELP_STRING([--without-luratech], - [do not try to use the Luratech library for JBIG2 nor JPX decoding])) - - -if test x$with_luratech != xno; then - AC_MSG_CHECKING([for local Luratech JBIG2 library source]) - if test -d luratech/ldf_jb2; then - AC_MSG_RESULT([yes]) - JBIG2_DECODER=luratech - SHARE_JBIG2=0 - JBIG2DIR=luratech/ldf_jb2 - if test `uname` = Darwin*; then - JBIG2_AUTOCONF_CFLAGS="-DUSE_LDF_JB2 -DMAC -DMAC_OS_X_BUILD" - else - JBIG2_AUTOCONF_CFLAGS="-DUSE_LDF_JB2 -DLINUX" - fi - JBIG2DEVS='$(PSD)jbig2.dev' - else - AC_MSG_RESULT([no]) - fi -fi - -if test "x$JBIG2_DECODER" = x; then - dnl look for jbig2dec - AC_ARG_WITH([jbig2dec], AC_HELP_STRING([--without-jbig2dec], - [disable JBIG2 decode support])) - if test x$with_jbig2dec != xno; then - AC_MSG_CHECKING([for local jbig2dec library source]) - for d in jbig2dec jbig2dec-0.2 jbig2dec-0.3; do - test -d "$d" && JBIG2DIR=$d && break - done - if test "x$JBIG2DIR" != xsrc; then - JBIG2_DECODER=jbig2dec - echo "Running jbig2dec configure script..." - olddir=`pwd` - cd $JBIG2DIR && ./configure $SUBCONFIG_OPTS - status=$? - if test "$status" -ne 0 ; then - AC_MSG_ERROR([jbig2dec configure script failed], $status) - fi - if test "$status" -eq 0 ; then - JBIG2_AUTOCONF_CFLAGS=-DHAVE_CONFIG_H - fi - cd $olddir - echo - echo "Continuing with Ghostscript configuration..." - AC_MSG_RESULT([$JBIG2DIR]) - else - AC_MSG_RESULT([no]) - AC_CHECK_LIB([jbig2dec], [jbig2_page_out], [ - SHARE_JBIG2=1 - ], [ - AC_MSG_WARN([disabling support for JBIG2 files]) - with_jbig2dec=no - ]) - if test x$with_jbig2dec != xno; then - JBIG2_DECODER=jbig2dec - fi - fi - fi - if test x$with_jbig2dec != xno; then - if test x$ac_cv_header_stdint_h != xyes && test x$ac_cv_header_inttypes_h != xyes; then - AC_MSG_WARN([JBIG2 support requires stdint types which do not seem to be available.]) - else - JBIG2DEVS='$(PSD)jbig2.dev' - fi - fi -fi - -AC_SUBST(JBIG2_DECODER) -AC_SUBST(JBIG2DIR) -AC_SUBST(SHARE_JBIG2) -AC_SUBST(JBIG2DEVS) -AC_SUBST(JBIG2_AUTOCONF_CFLAGS) - -JPXDIR=src -SHARE_JASPER=0 -JPXDEVS='' -JPX_DECODER= -JPX_AUTOCONF_CFLAGS= - -if test x$with_luratech != xno; then - AC_MSG_CHECKING([for local Luratech JPEG2K library source]) - if test -d luratech/lwf_jp2; then - AC_MSG_RESULT([yes]) - JPX_DECODER=luratech - SHARE_JASPER=0 - JPXDIR=luratech/lwf_jp2 - if test `uname` = Darwin*; then - JPX_AUTOCONF_CFLAGS="-DUSE_LWF_JP2 -DMAC -DMAC_OS_X_BUILD" - else - JPX_AUTOCONF_CFLAGS="-DUSE_LWF_JP2 -DLINUX" - fi - JPXDEVS='$(PSD)jpx.dev' - else - AC_MSG_RESULT([no]) - fi -fi - - -if test "x$JPX_DECODER" = x; then - dnl look for the jasper JPEG 2000 library - AC_ARG_WITH([jasper], AC_HELP_STRING([--without-jasper], - [don't use the JasPer library for JPEG 2000])) - if test x$with_jasper != xno; then - AC_MSG_CHECKING([for local jasper library source]) - for d in jasper jasper-1.7*; do - test -d "$d" && JPXDIR=$d && break - done - if test "x$JPXDIR" != xsrc; then - AC_MSG_RESULT([$JPXDIR]) - AC_MSG_CHECKING([for local jasper configure script]) - if test -x $JPXDIR/configure; then - AC_MSG_RESULT([yes]) - echo - echo "Running jasper configure script..." - olddir=`pwd` - cd $JPXDIR && ./configure $SUBCONFIG_OPTS - status=$? - if test "$status" -ne 0 ; then - AC_MSG_ERROR([jasper configure script failed], $status) - fi - cd $olddir - echo - echo "Continuing with Ghostscript configuration..." - else - AC_MSG_RESULT([no]) - AC_MSG_CHECKING([for local jasper autogen.sh script]) - if test -x $JPXDIR/autogen.sh; then - AC_MSG_RESULT([yes]) - echo - echo "Running jasper autogen script..." - olddir=`pwd` - cd $JPXDIR && ./autogen.sh - status=$? - if test "$status" -ne 0 ; then - AC_MSG_ERROR([jasper autogen script failed], $status) - fi - cd $olddir - echo - echo "Continuing with Ghostscript configuration..." - else - AC_MSG_ERROR([ -Unable to find $JPXDIR/src/libjasper/include/jas_config.h, -or generate generate such a file for this system. You will -have to build one by hand, or configure, build and install -the jasper library separately. - -You can also pass --without-jasper to configure to disable -JPEG 2000 PDF image support entirely. -]) - fi - fi - else - AC_MSG_RESULT([no]) - AC_CHECK_LIB([jasper], [jas_image_create], [ - SHARE_JASPER=1 - ], [ - AC_MSG_WARN([disabling support for JPEG 2000 images]) - with_jasper=no - ]) - fi - fi - if test x$with_jasper != xno; then - JPX_DECODER=jasper - JPX_AUTOCONF_CFLAGS="-DJAS_CONFIGURE" - JPXDEVS='$(PSD)jpx.dev' - fi -fi - - -AC_SUBST(JPX_DECODER) -AC_SUBST(JPX_AUTOCONF_CFLAGS) -AC_SUBST(JPXDIR) -AC_SUBST(SHARE_JASPER) -AC_SUBST(JPXDEVS) - -dnl check if we can/should build the gtk loader -AC_ARG_ENABLE([gtk], AC_HELP_STRING([--disable-gtk], - [Don't build the gtk loader])) -SOC_CFLAGS="" -SOC_LIBS="" -SOC_LOADER="dxmainc.c" -if test "x$enable_gtk" != "xno"; then - # Try GTK+ 2.x first... - if test "x$PKGCONFIG" != x; then - AC_MSG_CHECKING(for GTK+ 2.x) - if $PKGCONFIG --exists gtk+-2.0; then - SOC_LOADER="dxmain.c" - SOC_CFLAGS="`$PKGCONFIG gtk+-2.0 --cflags`" - SOC_LIBS="`$PKGCONFIG gtk+-2.0 --libs`" - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - fi - fi - - # Then fall back on GTK+ 1.x... - if test "x$SOC_LOADER" = x; then - AC_PATH_PROG(GTKCONFIG, gtk-config) - if test "x$GTKCONFIG" != x; then - SOC_LOADER="dxmain.c" - SOC_CFLAGS="`$GTKCONFIG --cflags`" - SOC_LIBS="`$GTKCONFIG --libs`" - fi - fi -fi -AC_SUBST(SOC_CFLAGS) -AC_SUBST(SOC_LIBS) -AC_SUBST(SOC_LOADER) - -dnl look for omni implementation -AC_ARG_WITH([omni], AC_HELP_STRING([--with-omni], - [enable the omni driver])) -dnl set safe defaults -OMNIDEVS='' -INCLUDEOMNI=no -if ( ! test -z "$CONTRIBINCLUDE" ) && ( test x$with_omni = xyes ); then - INCLUDEOMNI=yes - OMNIDEVS='$(DD)omni.dev' - - if test -n "$GCC"; then - LIBS="$LIBS -lstdc++" - fi -fi -AC_SUBST(OMNIDEVS) - -dnl optional X11 for display devices -AC_PATH_XTRA - -X_LDFLAGS="" -X_CFLAGS="" -X_DEVS="" -X_LIBS="" - -if test x$no_x != xyes; then - if test "$x_libraries" = "/usr/lib"; then - echo "Ignoring X library directory \"$x_libraries\" requested by configure." - x_libraries="NONE" - fi - if test ! "$x_libraries" = "NONE" -a ! "$x_libraries" = ""; then - X_LDFLAGS="-L$x_libraries" - if test "$uname" = "SunOS"; then - X_LDFLAGS="$X_LDFLAGS -R$x_libraries" - fi - fi - - if test "$x_includes" = "/usr/include"; then - echo "Ignoring X include directory \"$x_includes\" requested by configure." - x_includes="NONE" - fi - if test ! "$x_includes" = "NONE" -a ! "$x_includes" = ""; then - X_CFLAGS="-I$x_includes" - fi - - SAVELIBS="$LIBS" - SAVELDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $X_LDFLAGS" - - AC_CHECK_LIB(X11,XOpenDisplay) - AC_CHECK_LIB(Xext,XdbeQueryExtension) - AC_CHECK_LIB(Xt,XtAppCreateShell) - - LDFLAGS="$SAVELDFLAGS" - LIBS="$SAVELIBS" - - if test "$ac_cv_lib_Xt_XtAppCreateShell" = yes; then - X11DEVS="x11 x11alpha x11cmyk x11mono x11_ x11alt_ x11cmyk2 x11cmyk4 x11cmyk8 x11rg16x x11rg32x x11gray2 x11gray4" - X_DEVS=$X11DEVS - # the makefile wants a list of just the library names in X_LIBS - GS_SPLIT_LIBS([X_LIBS], - [-lXt $X_PRE_LIBS -lXext -lX11 $X_EXTRA_LIBS]) - fi -fi - -AC_SUBST(X_LDFLAGS) -AC_SUBST(X_CFLAGS) -AC_SUBST(X_LIBS) -#AC_SUBST(X_DEVS) -#AC_SUBST(X11DEVS) -AC_SUBST(XLIBS) - -dnl executible name -AC_ARG_WITH([gs], AC_HELP_STRING([--with-gs=NAME], - [name of the Ghostscript executible [[gs]]]), - [GS="$with_gs"],[GS='gs']) -AC_SUBST(GS) - -dnl do we compile the postscript initialization files into Ghostscript? -COMPILE_INITS="1" -AC_ARG_ENABLE([compile-inits], AC_HELP_STRING([--disable-compile-inits], - [Don't compile in initialization files]),[ - if test "x$enable_compile_inits" = xno; then - COMPILE_INITS="0" - fi]) -AC_SUBST(COMPILE_INITS) - -dnl look for drivers to compile... -AC_ARG_WITH(drivers, -[ --with-drivers=LIST Drivers to support, separated by commas. - Either list the drivers or use aliases: - ALL = all drivers - FILES = all file format drivers - PRINTERS = all printer drivers - Printers: - APPLE = all Apple printers - BROTHER = all Brother printers - CANON = all Canon printers - EPSON = all Epson printers - HP = all HP printers - IBM = all IBM printers - JAPAN = older japanese printers - LEXMARK = all Lexmark printers - OKI = all OKI printers - PCLXL = all PCL XL/6 printers - File formats: - BMP = Output to bmp files - FAX = Output to fax files - JPEG = Output to JPEG files - PBM = Output to PBM/PNM - PCX = Output to PCX - PNG = Output to PNG - PS = Output to PostScript/PDF - TIFF = Output to TIFF - WTS = WTS Halftoning devices - ETS = ETS Halftoning devices - You can mix both variants, e.g. - --with-drivers=HP,stcolor would build HP drivers and - the Epson stcolor driver. - Aliases must be uppercase (a 3rd party driver might - have the same name). - Default: ALL],drivers="$withval",drivers="ALL") - -AC_ARG_WITH(driversfile, -[ --with-driversfile=FILE Drivers to support from file, separated by newlines.], -driversfile="$withval",driversfile="") - -if test "x$driversfile" != x; then - # Add drivers from file... - drivers="`tr '\n' ',' <$driversfile`" -fi - -dnl Check which drivers we'd like to support. -P_DEVS0="" -F_DEVS0="" -CUPS_DEVS0="" -SVG_DEVS0="" -JBIG2_DEVS="" -IJS_DEVS0="" -PNG_DEVS0="" -X11_DEVS0="" - - -dnl Known printers -HP_DEVS='cdj500 djet500 djet500c dnj650c cljet5pr deskjet laserjet ljetplus ljet2p ljet3 ljet3d ljet4 ljet4d lj4dith lj5mono lj5gray cdeskjet cdjcolor cdjmono cdj550 pj pjxl pjxl300 lp2563 paintjet pjetxl cljet5 cljet5c pxlmono pxlcolor cdj670 cdj850 cdj880 cdj890 cdj970 cdj1600 cdnj500 chp2200 pcl3 hpdjplus hpdjportable hpdj310 hpdj320 hpdj340 hpdj400 hpdj500 hpdj500c hpdj510 hpdj520 hpdj540 hpdj550c hpdj560c hpdj600 hpdj660c hpdj670c hpdj680c hpdj690c hpdj850c hpdj855c hpdj870c hpdj890c hpdj1120c lj3100sw' -PCLXL_DEVS='pxlmono pxlcolor' -EPSON_DEVS='eps9high eps9mid epson epsonc escp lp8000 lq850 photoex st800 stcolor alc1900 alc2000 alc4000 alc4100 alc8500 alc8600 alc9100 lp3000c lp8000c lp8200c lp8300c lp8500c lp8800c lp9000c lp9200c lp9500c lp9800c lps6500 epl2050 epl2050p epl2120 epl2500 epl2750 epl5800 epl5900 epl6100 epl6200 lp1800 lp1900 lp2200 lp2400 lp2500 lp7500 lp7700 lp7900 lp8100 lp8300f lp8400f lp8600 lp8600f lp8700 lp8900 lp9000b lp9100 lp9200b lp9300 lp9400 lp9600 lp9600s lps4500 eplcolor eplmono' -CANON_DEVS='bj10e bj200 bjc600 bjc800 lbp8 lips3 bjcmono bjcgray bjccmyk bjccolor' -LEXMARK_DEVS='lxm5700m lx5000 lxm3200 lex2050 lex3200 lex5700 lex7000' -BROTHER_DEVS='hl7x0 hl1240 hl1250' -APPLE_DEVS='appledmp iwhi iwlo iwlq' -IBM_DEVS='ibmpro jetp3852' -OKI_DEVS='oki182 okiibm oki4w' -JAPAN_DEVS='lips4 lips4v ljet4pjl lj4dithp dj505j picty180 lips2p bjc880j pr201 pr150 pr1000 pr1000_4 jj100 bj10v bj10vh mj700v2c mj500c mj6000c mj8000c fmpr fmlbp ml600 lbp310 lbp320 md50Mono md50Eco md1xMono escpage lp2000 npdl rpdl' -MISC_PDEVS='uniprint ap3250 atx23 atx24 atx38 coslw2p coslwxl cp50 declj250 fs600 imagen lj250 m8510 necp6 oce9050 r4081 sj48 tek4696 t4693d2 t4693d4 t4693d8 dl2100 la50 la70 la75 la75plus ln03 xes md2k md5k gdi samsunggdi' -OPVP_DEVS='opvp oprp' - -ETS_HALFTONING_DEVS='rinkj' - -dnl Known file formats -BMP_DEVS='bmpmono bmpgray bmpsep1 bmpsep8 bmp16 bmp256 bmp16m bmp32b' -FAX_DEVS='cfax dfaxlow dfaxhigh fax tfax tiffg3 tiffg32d tiffg4 faxg3 faxg32d faxg4' -JPEG_DEVS='jpeg jpeggray jpegcmyk' -# PNG_DEVS='png16 png16m png256 pngalpha pnggray pngmono' -TIFF_DEVS='tiffs tiff12nc tiff24nc tiff48nc tiff32nc tiff64nc tiffcrle tifflzw tiffpack tiffgray tiffsep tiffsep1 tiffscaled tiffscaled8 tiffscaled24' -PCX_DEVS='pcxmono pcxgray pcx16 pcx256 pcx24b pcxcmyk pcx2up' -PBM_DEVS='pbm pbmraw pgm pgmraw pgnm pgnmraw pnm pnmraw ppm ppmraw pkm pkmraw pksm pksmraw pam' -PS_DEVS='psdf psdcmyk psdrgb pdfwrite pswrite ps2write epswrite psgray psmono psrgb bbox' -WTS_HALFTONING_DEVS='imdi simdi wtsimdi wtscmyk' -MISC_FDEVS='ccr cgm24 cgm8 cgmmono cif inferno mag16 mag256 mgr4 mgr8 mgrgray2 mgrgray4 mgrgray8 mgrmono miff24 plan9bm sgirgb sunhmono bit bitrgb bitrgbtags bitcmyk devicen spotcmyk xcf' -SVGDEV='svgwrite' - -while test -n "$drivers"; do - if echo $drivers |grep "," >/dev/null; then - THIS="`echo $drivers |sed -e 's/,.*//'`" - drivers="`echo $drivers |sed -e \"s/$THIS,//\"`" - else - THIS=$drivers - drivers="" - fi - case "$THIS" in - ALL) - # ALL = PRINTERS + FILES... - if test -z "$drivers"; then - drivers="PRINTERS,FILES,X11" - else - drivers="$drivers,PRINTERS,FILES,X11" - fi - ;; - PRINTERS) - P_DEVS0="$P_DEVS0 $CANON_DEVS $EPSON_DEVS $HP_DEVS $LEXMARK_DEVS $BROTHER_DEVS $APPLE_DEVS $IBM_DEVS $OKI_DEVS $JAPAN_DEVS $MISC_PDEVS $ETS_HALFTONING_DEVS $OPVP_DEVS" - IJS_DEVS0="$IJSDEVS" - ;; - FILES) - F_DEVS0="$F_DEVS0 $BMP_DEVS $FAX_DEVS $JPEG_DEVS $TIFF_DEVS $PCX_DEVS $PBM_DEVS $PS_DEVS $WTS_HALFTONING_DEVS $MISC_FDEVS" - CUPS_DEVS0="$CUPSDEV" - JBIG2_DEVS="$JBIG2DEVS" - PNG_DEVS0="$PNGDEVS" - ;; - APPLE) - # All Apple printers - P_DEVS0="$P_DEVS0 $APPLE_DEVS" - ;; - BMP) - # BMP file format - F_DEVS0="$F_DEVS0 $BMP_DEVS" - ;; - CANON) - # All Canon printers - P_DEVS0="$P_DEVS0 $CANON_DEVS" - ;; - EPSON) - # All Epson printers - P_DEVS0="$P_DEVS0 $EPSON_DEVS" - ;; - FAX) - # Fax file formats - F_DEVS0="$F_DEVS0 $FAX_DEVS" - ;; - JPEG) - # Jpeg file formats - F_DEVS0="$F_DEVS0 $JPEG_DEVS" - ;; - JBIG2) - # JBIG file formats - JBIG2_DEVS="$JBIG2DEVS" - ;; - PNG) - # PNG file formats - PNG_DEVS0="$PNGDEVS" - ;; - TIFF) - # TIFF file formats - F_DEVS0="$F_DEVS0 $TIFF_DEVS" - ;; - PCLXL) - # PCL XL/PCL 6 drivers - F_DEVS0="$F_DEVS0 $PCLXL_DEVS" - ;; - PCX) - # PCX file formats - F_DEVS0="$F_DEVS0 $PCX_DEVS" - ;; - PBM) - # PBM file formats - F_DEVS0="$F_DEVS0 $PBM_DEVS" - ;; - CUPS) - # CUPS file format - CUPS_DEVS0="$CUPSDEV" - ;; - HP) - # All HP printers - P_DEVS0="$P_DEVS0 $HP_DEVS" - ;; - LEXMARK) - # All Lexmark printers - P_DEVS0="$P_DEVS0 $LEXMARK_DEVS" - ;; - BROTHER) - # All Brother printers - P_DEVS0="$P_DEVS0 $BROTHER_DEVS" - ;; - OKI) - # All OKI printers - P_DEVS0="$P_DEVS0 $OKI_DEVS" - ;; - IBM) - # All IBM printers - P_DEVS0="$P_DEVS0 $IBM_DEVS" - ;; - IJS) - # IJS printers - IJS_DEVS0="$IJSDEVS" - ;; - JAPAN) - # All old japanese printers - P_DEVS0="$P_DEVS0 $JAPAN_DEVS" - ;; - PS) - # PostScript/PDF writing - F_DEVS0="$F_DEVS0 $PS_DEVS" - ;; - SVG) - # PostScript/PDF writing - SVG_DEVS0="$SVGDEV" - ;; - WTS) - # WTS Halftoning devices - F_DEVS0="$F_DEVS0 $WTS_HALFTONING_DEVS" - ;; - ETS) - # ETS Halftoning devices - F_DEVS0="$F_DEVS0 $ETS_HALFTONING_DEVS" - ;; - X11) - # X11 display devices - X11_DEVS0="$X_DEVS" - ;; - opvp) - # Open Vector Printing driver... - if test x$ac_cv_lib_dl_dlopen != xno -a x$found_iconv != xno; then - P_DEVS0="$P_DEVS0 $OPVP_DEVS" - else - AC_MSG_WARN(Unable to include opvp/oprp driver due to missing or disabled prerequisites...) - fi - ;; - *) - # It's a driver name (or a user messup) - P_DEVS0="$P_DEVS0 `echo $THIS |sed -e 's,\.dev$,,'`" - ;; - esac -done - -noncontribmakefiles=`find . -name '*.mak' -print | grep -v '^\./contrib/'` -# No need to include opvp/oprp driver without iconv/libiconv. -if test -n "$P_DEVS0"; then - if test x$found_iconv = xno ; then - P_DEVS0=`echo $P_DEVS0 | sed -e 's|opvp||' -e 's|oprp||'` - AC_MSG_WARN(Unable to include opvp/oprp driver due to missing iconv/libiconv...) - fi - -# Remove contributed drivers if requested and make sure we don't have any -# duplicates in there, add $(DD)foo.dev constructs - P_DEVS=`(for i in $P_DEVS0; do d='$(DD)'${i}.dev; if ( grep '^'$d $noncontribmakefiles 2>&1 >/dev/null ) || ( ! test -z "$CONTRIBINCLUDE" ); then echo $d; fi; done) | sort | uniq | tr '\012\015' ' '` -fi - -if test -n "$F_DEVS0"; then - F_DEVS=`(for i in $F_DEVS0; do d='$(DD)'${i}.dev; if ( grep '^'$d $noncontribmakefiles 2>&1 >/dev/null) || ( ! test -z "$CONTRIBINCLUDE" ); then echo $d; fi; done) | sort | uniq | tr '\012\015' ' '` -fi - -if test -n "$CUPS_DEVS0"; then - CUPS_DEVS=`(for i in $CUPS_DEVS0; do d='$(DD)'${i}.dev; if ( grep '^'$d $noncontribmakefiles 2>&1 >/dev/null) || ( ! test -z "$CONTRIBINCLUDE" ); then echo $d; fi; done) | sort | uniq | tr '\012\015' ' '` -fi - -if test -n "$SVG_DEVS0"; then - SVG_DEVS=`(for i in $SVG_DEVS0; do d='$(DD)'${i}.dev; if ( grep '^'$d $noncontribmakefiles 2>&1 >/dev/null) || ( ! test -z "$CONTRIBINCLUDE" ); then echo $d; fi; done) | sort | uniq | tr '\012\015' ' '` -fi - -if test -n "$IJS_DEVS0"; then - IJS_DEVS=`(for i in $IJS_DEVS0; do d='$(DD)'${i}.dev; if ( grep '^'$d $noncontribmakefiles 2>&1 >/dev/null) || ( ! test -z "$CONTRIBINCLUDE" ); then echo $d; fi; done) | sort | uniq | tr '\012\015' ' '` -fi - -if test -n "$PNG_DEVS0"; then - PNG_DEVS=`(for i in $PNG_DEVS0; do d='$(DD)'${i}.dev; if ( grep '^'$d $noncontribmakefiles 2>&1 >/dev/null) || ( ! test -z "$CONTRIBINCLUDE" ); then echo $d; fi; done) | sort | uniq | tr '\012\015' ' '` -fi - -if test -n "$X11_DEVS0"; then - X11_DEVS=`(for i in $X11_DEVS0; do d='$(DD)'${i}.dev; if ( grep '^'$d $noncontribmakefiles 2>&1 >/dev/null) || ( ! test -z "$CONTRIBINCLUDE" ); then echo $d; fi; done) | sort | uniq | tr '\012\015' ' '` -fi - -AC_SUBST(P_DEVS) -AC_SUBST(F_DEVS) -AC_SUBST(CUPS_DEVS) -AC_SUBST(SVG_DEVS) -AC_SUBST(JBIG2_DEVS) -AC_SUBST(IJS_DEVS) -AC_SUBST(PNG_DEVS) - -# This now gets done after handling --enable-dynamic -# AC_SUBST(X11_DEVS) - -dnl Dynamic device support. -DYNAMIC_CFLAGS="" -DYNAMIC_DEVS="" -DYNAMIC_FLAGS="" -DYNAMIC_LDFLAGS="" -DYNAMIC_LIBS="" -INSTALL_SHARED="" - -case `uname` in - Linux*|GNU*) - DYNAMIC_CFLAGS="-fPIC" - DYNAMIC_LDFLAGS="-fPIC -shared" - if test $ac_cv_prog_gcc = yes; then - # GCC high level flag - DYNAMIC_LIBS="-rdynamic -ldl" - else - DYNAMIC_LIBS="" - fi - ;; - *BSD) - DYNAMIC_CFLAGS="-fPIC" - DYNAMIC_LDFLAGS="-fPIC -shared" - DYNAMIC_LIBS="" - ;; - Darwin*) - DYNAMIC_LDFLAGS="-dynamiclib" - DYNAMIC_LIBS="" - ;; - SunOS) - if test $ac_cv_prog_gcc = yes; then - DYNAMIC_CFLAGS="-fPIC" - else - DYNAMIC_CFLAGS="-KPIC" - fi - DYNAMIC_LDFLAGS="-G" - DYNAMIC_LIBS="" - ;; -esac - -AC_ARG_ENABLE([dynamic], AC_HELP_STRING([--enable-dynamic], - [Enable dynamically loaded drivers]), -[ - case `uname` in - Linux*|GNU*) - INSTALL_SHARED="install-shared" - if test "x$X_DEVS" != x; then - DYNAMIC_DEVS="\$(GLOBJDIR)/X11.so" - else - DYNAMIC_DEVS="" - fi - DYNAMIC_FLAGS="-DGS_DEVS_SHARED -DGS_DEVS_SHARED_DIR=\\\"\$(gssharedir)\\\"" - X11_DEVS="" - OPT_CFLAGS="$DYNAMIC_CFLAGS $OPT_CFLAGS" - DBG_CFLAGS="$DYNAMIC_CFLAGS $DBG_CFLAGS" - ;; - *BSD) - DYNAMIC_DEVS="\$(GLOBJDIR)/X11.so" - DYNAMIC_FLAGS="-DGS_DEVS_SHARED -DGS_DEVS_SHARED_DIR=\\\"\$(gssharedir)\\\"" - X11_DEVS="" - OPT_CFLAGS="$DYNAMIC_CFLAGS $OPT_CFLAGS" - DBG_CFLAGS="$DYNAMIC_CFLAGS $DBG_CFLAGS" - ;; - Darwin*) - INSTALL_SHARED="install-shared" - DYNAMIC_FLAGS="-DGS_DEVS_SHARED -DGS_DEVS_SHARED_DIR=\\\"\$(gssharedir)\\\"" - X11_DEVS="" - OPT_CFLAGS="$DYNAMIC_CFLAGS $OPT_CFLAGS" - DBG_CFLAGS="$DYNAMIC_CFLAGS $DBG_CFLAGS" - ;; - SunOS) - DYNAMIC_DEVS="\$(GLOBJDIR)/X11.so" - DYNAMIC_FLAGS="-DGS_DEVS_SHARED -DGS_DEVS_SHARED_DIR=\\\"\$(gssharedir)\\\"" - OPT_CFLAGS="$DYNAMIC_CFLAGS $OPT_CFLAGS" - DBG_CFLAGS="$DYNAMIC_CFLAGS $DBG_CFLAGS" - ;; - *) - AC_MSG_ERROR([Sorry, dynamic driver support not available on this platform!]) - ;; - esac -]) - -AC_SUBST(DYNAMIC_CFLAGS) -AC_SUBST(DYNAMIC_DEVS) -AC_SUBST(DYNAMIC_FLAGS) -AC_SUBST(DYNAMIC_LDFLAGS) -AC_SUBST(DYNAMIC_LIBS) -AC_SUBST(INSTALL_SHARED) -AC_SUBST(X11_DEVS) - -dnl look for default font path... -AC_ARG_WITH([fontpath], AC_HELP_STRING([--with-fontpath], - [set font search path for gs]), fontpath="$withval", fontpath="") - -dnl Fix "prefix" variable... -if test "x$prefix" = xNONE; then - prefix=/usr/local -fi - -dnl Fix "datadir" variable... -if test "x$datadir" = 'x${prefix}/share'; then - datadir="$prefix/share" -fi - -dnl Fix "fontpath" variable... -if test "x$fontpath" = "x"; then - # These font directories are used by various Linux distributions... - fontpath="$datadir/fonts/default/ghostscript" - fontpath="${fontpath}:$datadir/fonts/default/Type1" - fontpath="${fontpath}:$datadir/fonts/default/TrueType" - - # These font directories are used by IRIX... - fontpath="${fontpath}:/usr/lib/DPS/outline/base" - - # These font directories are used by Solaris... - fontpath="${fontpath}:/usr/openwin/lib/X11/fonts/Type1" - fontpath="${fontpath}:/usr/openwin/lib/X11/fonts/TrueType" - - # This font directory is used by CUPS... - if test "x$CUPSCONFIG" != x; then - fontpath="${fontpath}:`$CUPSCONFIG --datadir`/fonts" - fi -fi - -AC_SUBST(fontpath) - -dnl -------------------------------------------------- -dnl Check for library functions -dnl -------------------------------------------------- - -AC_CHECK_FUNCS([mkstemp], [HAVE_MKSTEMP=-DHAVE_MKSTEMP]) -AC_SUBST(HAVE_MKSTEMP) - -AC_CHECK_FUNCS([fopen64], [HAVE_FILE64=-DHAVE_FILE64]) -AC_SUBST(HAVE_FILE64) - -AC_CHECK_FUNCS([mkstemp64], [HAVE_MKSTEMP64=-DHAVE_MKSTEMP64]) -AC_SUBST(HAVE_MKSTEMP64) - -AC_CHECK_FUNCS([setlocale], [HAVE_SETLOCALE=-DHAVE_SETLOCALE]) -AC_SUBST(HAVE_SETLOCALE) - -AC_PROG_GCC_TRADITIONAL - -dnl NB: We don't actually provide autoconf-switched fallbacks for any -dnl of these functions, so the checks are purely informational. -AC_FUNC_FORK -AC_FUNC_MALLOC -AC_FUNC_MEMCMP -AC_TYPE_SIGNAL -AC_FUNC_STAT -AC_FUNC_VPRINTF -AC_CHECK_FUNCS([bzero dup2 floor gettimeofday memchr memmove memset mkdir mkfifo modf pow putenv rint setenv sqrt strchr strerror strrchr strspn strstr]) - -dnl -------------------------------------------------- -dnl check for sse2 intrinsics -dnl -------------------------------------------------- - -HAVE_SSE2="" -AC_LINK_IFELSE([ -#include -int main (int argc, char *argv[]) -{ - __m128i input1; - return(0); -} -],HAVE_SSE2="-DHAVE_SSE2") - -AC_ARG_ENABLE([sse2], AC_HELP_STRING([--disable-sse2], - [Do not use sse2 instrinsics]), [ - if test "x$enable_sse2" = xno; then - HAVE_SSE2="" - fi]) - -AC_SUBST(HAVE_SSE2) - -dnl -------------------------------------------------- -dnl check for byte swap intrinsics -dnl -------------------------------------------------- - -HAVE_BSWAP32="" -AC_LINK_IFELSE([ -int main (int argc, char *argv[]) -{ - int a = __builtin_bswap32(argc); - return(0); -} -],HAVE_BSWAP32="-DHAVE_BSWAP32", HAVE_BSWAP32="") - -AC_ARG_ENABLE([bswap32], AC_HELP_STRING([--disable-bswap32], - [Do not use bswap32 instrinsic]), [ - if test "x$enable_bswap32" = xno; then - HAVE_BSWAP32="" - fi]) - -AC_SUBST(HAVE_BSWAP32) - -dnl -------------------------------------------------- -dnl check for byte swap header -dnl -------------------------------------------------- - -HAVE_BYTESWAP_H="" -AC_COMPILE_IFELSE([ -#include "byteswap.h" -int main (int argc, char *argv[]) -{ - int a = bswap_32(argc); - return(0); -} -],HAVE_BYTESWAP_H="-DHAVE_BYTESWAP_H", HAVE_BYTESWAP_H="") - -AC_ARG_ENABLE([byteswap-h], AC_HELP_STRING([--disable-byteswap-h], - [Do not use byteswap.h functions]), [ - if test "x$enable_byteswap-h" = xno; then - HAVE_BYTESWAP_H="" - fi]) - -AC_SUBST(HAVE_BYTESWAP_H) - -dnl -------------------------------------------------- -dnl Do substitutions -dnl -------------------------------------------------- - -AC_SUBST(OPT_CFLAGS) -AC_SUBST(DBG_CFLAGS) -AC_SUBST(GCFLAGS) - -AC_OUTPUT(Makefile) - -if ( test -d cups ); then -AC_OUTPUT(cups/pstopxl) -chmod +x cups/pstopxl -fi - diff -Nru ghostscript-9.04~dfsg/contrib/contrib.mak ghostscript-9.05~dfsg~20120125/contrib/contrib.mak --- ghostscript-9.04~dfsg/contrib/contrib.mak 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/contrib/contrib.mak 2011-09-29 11:01:34.000000000 +0000 @@ -101,7 +101,6 @@ # lips4v Canon LIPS IV vector mode driver # lips4 Canon LIPS IV raster mode driver # ln03 DEC LN03 -# lx5000 Lexmark 5000 # lxm3200 Lexmark 3200, Z31, Z12 # md1xMono Alps MD-1000/1300/1500 (monochrome mode, japanese) # md2k Alps MD-2000/2010/4000/1000/1300/1500 @@ -330,7 +329,7 @@ escv_=$(GLOBJ)gdevescv.$(OBJ) -$(GLOBJ)gdevescv.$(OBJ) : $(ESCV_SRC)gdevescv.c $(ESCV_SRC)gdevescv.h $(PDEVH) +$(GLOBJ)gdevescv.$(OBJ) : $(ESCV_SRC)gdevescv.c $(ESCV_SRC)gdevescv.h $(PDEVH) $(time__h) $(GLCC) -DA4 $(GLO_)gdevescv.$(OBJ) $(C_) $(escv_opts) $(ESCV_SRC)gdevescv.c $(DD)alc1900.dev : $(escv_) $(DD)page.dev @@ -511,18 +510,6 @@ $(GLCC) $(GLO_)gdevlx7.$(OBJ) $(C_) $(CONTRIBSRC)gdevlx7.c -### ----------------- LexMark 5000 printer ----------------------------- ### -### Note: this driver was contributed by users. Please contact: ### -### Peter B. West ### - -lx5000_=$(GLOBJ)gdevlx50.$(OBJ) -$(DD)lx5000.dev : $(lx5000_) - $(SETPDEV) $(DD)lx5000 $(lx5000_) - -$(GLOBJ)gdevlx50.$(OBJ) : $(CONTRIBSRC)gdevlx50.c $(PDEVH) - $(GLCC) $(GLO_)gdevlx50.$(OBJ) $(C_) $(CONTRIBSRC)gdevlx50.c - - ### ----------- Lexmark 3200 device ------------ ### lxm3200_=$(GLOBJ)gdevlx32.$(OBJ) diff -Nru ghostscript-9.04~dfsg/contrib/gdevlx50.c ghostscript-9.05~dfsg~20120125/contrib/gdevlx50.c --- ghostscript-9.04~dfsg/contrib/gdevlx50.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/contrib/gdevlx50.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,2724 +0,0 @@ -/* - - Copyright (C) 1999,2000 Peter B. West - Portions Copyright (C) 1999 Aladdin Enterprises. All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License 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 U.S.A. - - This program may also be distributed as part of Aladdin Ghostscript, - under the terms of the Aladdin Free Public License (the "License"). - - Every copy of Aladdin Ghostscript must include a copy of the - License, normally in a plain ASCII text file named PUBLIC. The - License grants you the right to copy, modify and redistribute - Aladdin Ghostscript, but only under certain conditions described in - the License. Among other things, the License requires that the - copyright notice and this notice be preserved on all copies. - - The author, Peter B. West, may be contacted via e-mail as - pbwest@netscape.net - or by post at - 1/32 Bent Street - Toowong, Brisbane, - QLD, AUSTRALIA. 4066 - - http://www.powerup.com.au/~pbwest - - Based on the driver for the Lexmark 5700, pioneered by - Stephen Taylor setaylor@ma.ultranet.com staylor@cs.wpi.edu - and on other pioneering work on the Lexmark 7000 by - Henryk Paluch - - My heartfelt thanks to these blokes (i.e. guys, fellows). - - I should also like to thank Marija Svilans, through whom I discovered the - work of Stephen and Henryk. - - My deepest praise and thanksgiving is reserved for the Author of all that - is Good, Beautiful and True; my Lord and my God, Jesus Christ. - "...all things were made through Him, and without Him was not anything - made that was made." John 1:3 - - Peter B. West pbwest@netscape.net - (First release: Friday, 8th October, 1999.) - -*/ - -/*$Id: gdevlx50.c,v 1.4 2002/07/30 18:53:21 easysw Exp $*/ -/* - * Lexmark 5000 ink-jet printer driver for Ghostscript - * - * Black and colour cartridges supported - NO PHOTO CARTRIDGE support yet. - * - * defines the lx5000 device for printing in black-and-white and colour - * at 600x600 (default), 1200x600 & 300x600 dpi, unidirectional. - * - * I use the command - * gs -sOutputFile=/dev/lp0 -sDEVICE=lx5000 file.ps - * - * For black-only printing, use - * gs -sOutputFile=/dev/lp0 -sDEVICE=lx5000 -dBitsPerPixel=1 file.ps - * For compatibility with earlier versions of the code, the following - * equivalent command is still supported. - * gs -sOutputFile=/dev/lp0 -sDEVICE=lx5000 -dCMYK=false file.ps - * - * For 1200x600 printing, add the argument - * -r1200x600 - * For 300x600 printing, add the argument - * -r300x600 - * - * A number of integer valued options are available. - * These options are accessed as arguments of the form - * -doptionname=optionvalue - * Optionname Optionvalue range - * BitsPerPixel 1 or 4 - * HeadSeparation 1 - 30 - * AlignA 0 - 30 - * AlignB 0 - 15 - * DryingTime 0 - 60 - * - * BitsPerPixel currently only defines Black-only (1) or CMYK (4). - * -dBitsPerPixel=4 is the default, and is eauivalent to the older form - * -dCMYK=true - * [ HeadSeparation varies from print-cartridge to print-cartridge and - * 16 (the default) usually works fine. Stephen Taylor] - * - * AlignA is the horizontal alignment adjustment between the colour and - * the black pens. This distance will vary with each pair of cartridges. - * - * AlignB is the vertical alignment distance between the colour and black - * pens, and will also vary with each pair of cartridges. - * - * These values can be determined by running the alignment test; i.e, - * by writing the printer data file blckalgn.out to the device. - * - * cat blckalgn.out >/dev/lp0 - * - * This file is now part of the distribution for the driver. - * - * DryingTime is used to include a delay after printing a page, to allow the - * page to dry to some extent before a subsequent page is printed and fed on - * top of it. The range of values is 0-60. - * - * Ancilliary files: - * - * blckalgn.out As mentioned above,this is a file of printer commands - * which will print the allignment page for the 5000. - * Usage: cat blckalgn.out >/dev/lp0 (or appropriate printer device) - * - * blckhcln.out This is a file of printer commands to print the head - * cleaning sequences. - * Usage: cat blckhcln.out >/dev/lp0 - * - * showcarts.out This is a file with the printer command to move the - * printer cartridges into position for changing a - * cartridge. - * Usage: cat showcarts.out >/dev/lp0 - * - * parkcarts.out This is a file with the printer command to move the - * printer cartridges back to a parked position. - * Usage: cat parkcarts.out >/dev/lp0 - * - ================== K N O W N P R O B L E M S ======================= - - PROBLEMS WITH 1200dpi horizontally - - This release was delayed by a bug in the production of black output - (including black pixels in colour output) at 1200 Xdpi which - manifested as the truncation of black swipes. In the RedHat test - page, for example, the black background to the hat in the RedHat - logo would abruptly halt, and no more of the black swipe would be - printed. This was difficult to track down, because of the sheer - size of the otuput file produced, and I ran out of time to find and - fix it, although I was beginning to suspect a problem with the - parallel driver. (It is always tempting to blame someone else.) - - When I recently returned to this problem, and tried the test print - again on the unchanged binary, the bug had disappeared. In the - meantime, I had added more physical memory to the system, and - upgraded my 6.0 system to the 6.1 kernel (2.2.12), the 6.1 glibc - version (2.1.2-11) and miscellaneous other 6.1 rpms. - - All was not lost, however. When I tested black-only printing at - 1200dpi, the problem re-appeared. I have come to the conclusion - that the 5000 simply cannot print at 1200dpi. I have tested this by - printing solid bars of black at 600 and 1200 dpi. The 600dpi bar - (all nozzles on for most of the width of the paper) produces the - expected bar. Doing the same thing at 1200dpi produces movement of - the printhead, but only the beginnings of a bar. Reducing the - demand by printing from only every second nozzle get an intermediate - result; the printing of the bar starts, but the nozzle lines trail - off and dry up at various points in the traversal of the - page. leaving an effect somthing like a tattered flag. - - How does the Windows driver do it? When printing a high density - black-only page, the driver prints repeated overlays offset by half - the height of the print swathe. Although I have not analysed these - swathes in detail, I suspect that the function of this "halving" is - simply to halve the printed pixel density, and thereby eliminate the - problem discussed above. - - I have taken the "half-height" printing method for granted ever - since I read a passing reference to it in the H-P Jounal articles on - PPA, but I misunderstood it. I had thought that it was a way of - performing a pseudo-doubling of the VERTICAL print density by - overprinting adjacent pairs of lines. I was originally unaware that - the 5000 supported native 1200x600 resolution. The problem, as far - as I can determine, is that the 5000 does NOT support such printing. - And if the printer is not going to support 1200dpi horizontally, - neither am I. - - PROBLEMS WITH PRINTER DATA "JAMMING" - - I am experiencing an annoying problem with my 5000 on my AST Bravo - P100 (yes, really) system under RedHat linux (6.0 with kernel - 2.2.12-20 and glibc 2.1.2-11). The printer frequently fails to - respond between print jobs, and sometimes between pages of the same - print job. The only way to wake it up is to power cycle the - printer. I have no idea why this is, of whether it is a general - problem. I would appreciate all feedback on this problem. - - I have received feedback on this from Bob Clark - . He realised that the printer - was queueing status data to be read from the same device. When this - queue (which appears to be 64 bytes long) fills up, the printer - stalls until it is reset (by a power cycle or by some as yet - undiscovered escape sequence), or until the status data is read. - That's the problem, but I do not have a clean solution yet. - - *================================================= - Other requirements for compiling this driver:- - ================================================= - The Ghostscript 6.0 source distribution, available from - http://www.cs.wisc.edu/~ghost/aladdin/get600.html - - This includes reasonable html documentation on compiling GS. - - For users of RPM-based systems like Red Hat, I have a source RPM - available which automates most of the process of compiling and - installing Ghostscript. A discussion of the details of compiling - and installing with this source RPM is available on my web page at - . - - The RPM includes a number of patch files which are applied to the - pristine Ghostscript 6.0 sources. Users of non-RPM systems can - extract these patches from the cpio archive which is also noted in - the instructions. - - I have compiled and tested on a RedHat 6.0 i386 system, using - egcs-2.91.66 19990314/Linux (egcs-1.1.2 release), so the relevant - system-specific .mak file for me was unix-gcc.mak. The .mak file - of general application is contrib.mak. - - */ - -/************************************************************************ - * I N C L U D E F I L E S * - ************************************************************************/ -#include "std.h" -#include -#include "gdevprn.h" -#include "gsparam.h" -#include "gsmalloc.h" - -/************************************************************************ - * R C S I D E N T S T R I N G S * - ************************************************************************/ -const char Id[] = - "$Id: gdevlx50.c,v 1.4 2002/07/30 18:53:21 easysw Exp $"; -const char RCSFile[] = "$RCSFile$"; -const char Revision[] = "$Revision: 1.4 $"; -const char Author[] = - "Peter B. West pbwest@netscape.net\n" - "$Author: easysw $\n"; -/*=========================================================================== - In gxdevice.h, the default width and height are expressed in 10ths of an - inch. The conversion to mm will therefore, not be exact. - - These values are immediately converted to (x,y) pixels for storage in the - width and height fields defined in the gx_device_common macro which is - defined in gxdevcli.h. These in turn are converted to points and stored - in the float MediaSize[2] array in gx_device_common by the - std_device_part_2_ macro in gxdevice.h. - - The same macro stores the (x,y)dpi values in the float arrays - HWResolution[2] and MarginsHWResolution[2]. - - The macro prn_device_std_margins_body in gdevprn.h provides for X and Y - offsets, as well as left, bottom, right and top margin values. X & Y are - expressed in inches, as are all the other margin values. - - The X & Y offsets are known as Margins in gx_device_common. They provide - the offset from the physical page corner (presumably top left, but may - depend on the position of 0,0) to 0,0 in the device co-ordinate system. - These values are converted by prn_device_std_margins_body into _negated_ - (x,y)dpi and stored in the float Margins[2] array. - - The left, bottom, right and top margin values are converted to points, - and stored in the float HWMargins[4] array. Note that these values are - defined relative to the physical paper, not the co-ordinate system. The - Margins array is used to transform from physical page offsets to the - device co-ordinate system. - - The implications of this are that the X & Y offset from page corner to - 0,0 should be defined as accurately as possible. The other four margins - should then be defined for a comprehensive coverage of the physical page. - The definitions of paper size given in 10ths of an inch in gxdevice.h are - a constraint. - - I presume that the intention of the transformation from 0,0 to - the physical page is to leave the defined width and height mapped - onto the physical page, and for the left and top margins to then restore - those two dimensions of the accessible page. The result would be, if the - values of X & Y offset precisely reversed the values of left and top - HWMargins, that the top left hand printable point would be at device - co-ordinates 0,0. The bottom and right HWMargins would then provide the - necessary clipping of the co-ordinate system to keep output within the - printable area. - - In fact, this is the way the x, Y offsets and the left and top margin - values are set up in the default prn_device_std_body macro in gdevprn.h. - In that macro, the X, Y offset values (expressed in inches) are simply - copied from the left and top margins. - - What I have found with my 5000, is that it can print on virtually the - whole area of the paper. This shows some remarkable paper handling cap- - ability. This capability almost demands that 0,0 in the device co-ordin- - ate system be _outside_ the paper area. It is. On my printer, the X - offset from the physical page top left corner is 48 600ths of an inch - - a little less than 6 points. - - The physical paper is a little narrower than 8.3 inches (210.82 mm), so - the attempt to print right to the 8.3" margin falls short by about 16 - 600ths, or about 2 points. When 0,0 falls _within_ the page, the combin- - ed margin clipping ensures that the driver will never issue printer com- - mands which exceed the defined width and height of the page. What - happens when 0,0 is outside the page? This implies, especially when the - hardware is capable of printing to the edges of the paper, that the - driver may issue print commands whose offsets exceed the defined width of - the page, in order to print to the right edge of the paper. I don't know - whether Ghostscript will allow this. - - Print width - |<------------ 8.3" ----------->| - | | - | | - +-------------- ~ --------------+ - |<-->| 2 pts - | |<----- Paper width --------->| - 6 pts |<---->| | - +-------------- ~ ------------+ - - In this case, the X offset is going to be negative, and the device co- - ordinate value of X for the left edge of the paper is going to almost 50 - 600ths. It is a good idea to apply some restrictions on printing to the - edge of the paper, so a HWMargin should be applied. - - The problem with setting the margins is this: Ghostscript knows where the - top and left sides of the page are relative to 0,0, because it is spec- - ifically informed of these values. It has no way of knowing where the - bottom and right of the page are, except from the height and width values. - These are only provided to an accuracy of a tenth of an inch, so the - assumed right and bottom margins may fall short of or overrun the edge of - the paper. - - In these circumstances, it seems a good idea to provide HWMargin values - designed to enforce a uniform margin around all of the edges. The left & - top margins can be given directly; the others must be worked out so that - when applied with reference to the height and width parameters, they - result in the same margin. - - For example, on my 5000, 0,0 is approximately 48/600" (about 6 points) to - the left of the physical page. When I print at an offset from 0 of - 8.3", the default A4 width, the print is approximately 32/600" (about 4 - points) inside the right edge of the page. That is, 8.3" is (48-32)/600" - too wide for the physical page. - - 4 points (4/72") is 0.05555", and 32/600" is 0.053333". If I set a left - HWMargin of 0.053", and Ghostscript obliges by mapping a new printable - origin 4 points inside the left edge of the paper, with 8.3" of print- - able line to the right of it, my left margin will need to account for the - extra 16/600" that GS thinks exists on the right, and for the actual - margin of 0.053" that I want to establish on the right. I think. - - The interest in the top margin is that it seems to be keyed to the colour - pens. These form three blocks of nozzles vertically aligned in the - colour print head. - - --- -- +-----+ v Alignment B - ^ ^ | | v --- +-----+ --- - | 64 | C | -- --- +-----+ --- | | ^ - | v v | | 40 ^ | | ^ | | | - | -- -- +-----+ -- | | | | | | - | 24 ^ | | | | | | - | -- -- +-----+ | | | | | | - | ^ ^ | | | | | | | - 240 64 | M | 192 | K | | K | 208 - | v v | | | | | | | - | -- -- +-----+ | | | | | | - | 24 v | | | | | | - | -- -- +-----+ -- | | | | | | - | ^ ^ | | 40 v | | | | | - | 64 | Y | -- --- +-----+ | | v - v v | | ^ +-----+ --- - --- -- +-----+ - - The colour pens have 64 nozzles each, and the black has 208. Black can - also be driven in colour compatibility mode, when it uses 192 nozzles - only, the same as the total number of colour nozzles. In order to align - the black nozzles with the colour, an alignment value is specified in the - initialization sequence for the page. This value is in turn determined - by printing an alignment page under control of the printer driver (See - ancilliary files above.) - - Note that when an odd number is specified as Alignment B, an odd numbered - nozzle will be mapped as nozzle 0 of the 192 nozzle black pen, so the - even/odd association of nozzle numbers will be reversed; i.e., nozzle 0 - will become and ODD nozzle. - - The paper handler seems to assume that the paper load position is with - the page lined up immediately before the lowest nozzle of the YELLOW pen. - (Note that the paper is being fed in from the bottom of the printheads.) - When I issue a paper feed instruction of 480 (240x2) 1200ths, and print a - three-colour bar, the top of the CYAN pen is just on the physical page. - Efectively, the Y component of 0,0 is right at the top of the page, with - respect to the YELLOW pen. Y=0 with respect to the 192 nozzle black pen - is always constant, and with respect to the 208 pen, can be determined - from Alignment B. - - *===========================================================================*/ - -/************************************************************************ - * B A S I C M A C R O S * - ************************************************************************/ - -#define A5_11_5000 1 -#define A5_11_5700 2 - -#define ALIGN_A_DEF 15 -#define ALIGN_A_OFFSET 5 /* in pageinit escape sequence */ -#define ALIGN_B_DEF 8 -#define ALIGN_B_OFFSET 6 /* in pageinit escape sequence */ - -#define HEADSEP_DEF 16 - /* number of pixels between even columns in */ - /* output and odd ones */ -#define DRY_TIME_DEF 0 /* Default pause for page to dry */ - -/************************************************************************ - * P R I N T E R T Y P E D E F I N I T I O N S * - ************************************************************************/ - -#ifndef LX_BI -# define LX_UNI - /* or define LX_BI */ -#endif -#define MIN_LX5000_X 300 -#define MAX_LX5000_X 1200 -#define DEF_LX5000_X 600 -#define MIN_LX5000_Y 600 -#define MAX_LX5000_Y 1200 -#define DEF_LX5000_Y MIN_LX5000_Y - -#ifndef LX5000_XDPI -# define LX5000_XDPI DEF_LX5000_X -#endif -#ifndef LX5000_YDPI -# define LX5000_YDPI DEF_LX5000_Y -#endif - - /* Multiply lines by FEED_FACTOR when feeding - paper. The 5000 feeds in 1200ths. */ -#define FEED_FACTOR ( 1200/LX5000_YDPI ) - -#define LX5000_XOFFSET_TO_0_0_XDPI (-48.0) -#define LX5000_YOFFSET_TO_0_0_YDPI (0.0) - -#define LX5000_XOFFSET_TO_0_0 ( LX5000_XOFFSET_TO_0_0_XDPI/LX5000_XDPI ) -#define LX5000_YOFFSET_TO_0_0 ( LX5000_YOFFSET_TO_0_0_YDPI/LX5000_YDPI ) - -/* The theory */ -#define LX5000_LEFT_HWMARGIN_INS 0.053 -#define LX5000_BOTTOM_HWMARGIN_INS 0.067 -#define LX5000_RIGHT_HWMARGIN_INS 0.08 -#define LX5000_TOP_HWMARGIN_INS 0.053 -/**/ -/* The practice -?? -*/ - -#define LINE_PAD_BYTES 8 - /* number of bytes of padding on each end of */ - /* scan line to account for head separation */ - /* N.B. Keep this value 16-bit aligned. */ - -#define RIGHTWARD 0 -#define LEFTWARD 1 - -#define SWIPE_WORD_BITS 16 - /* Bits per directory word */ -#define BLACK_NOZZLES 208 - /* height of printhead in pixels */ -#define _1COLOUR_NOZZLES 64 - /* Height of one colour pen in pixels */ - - /* Height of colour compatible black swipe */ -#define BLK_COLOUR_NOZZLES (_1COLOUR_NOZZLES * 3) - - /* number of shorts described by each */ - /* full black column directory */ -#define BLK_SWIPE_WORDS ( BLACK_NOZZLES / SWIPE_WORD_BITS ) -#define COLOUR_SWIPE_WORDS ( BLK_COLOUR_NOZZLES / SWIPE_WORD_BITS ) - /* and for a colour swipe command */ -#define _1COLOUR_WORDS ( _1COLOUR_NOZZLES / SWIPE_WORD_BITS ) - /* and for a single colour pen */ - -#define BLK_DIRECTORY_MASK (( ~0 << BLK_SWIPE_WORDS ) ^ ~0 ) -#define COLOUR_DIRECTORY_MASK (( ~0 << COLOUR_SWIPE_WORDS ) ^ ~0 ) -#define DIRECTORY_TYPE_BIT 0x2000 - /* Directory type: Set = normal; - unset = repeat compression */ - -#define COLOUR_PEN_GAP 24 /* Defined in equivalent nozzles. This will */ - /* also be the offset from the top of the */ - /* first colour pen to the top of the colour */ - /* compatible black pen. */ -#define COLOUR_PEN_DIFF ( _1COLOUR_NOZZLES + COLOUR_PEN_GAP ) - /* The difference between corresponding */ - /* nozzle positions (e.g. bottom nozzle) on */ - /* contiguous colour pens. */ - - /* The intial pen scanline positions are */ - /* defined with reference to the first */ - /* printable line (line 0) on the page. The */ - /* initial colour cartridge position is */ - /* immediately above line 0. */ -#define INITIAL_YELLOW_BOTTOM_LINE ( -1 ) - - /* The pen buffer size must be a power of */ - /* 2, so that the index into the buffer */ - /* will either wrap within that size on */ - /* increment, or be able to be masked to */ - /* force a wrap of the index into the */ - /* circular pen buffers. See discussion */ - /* of pen buffers in lx5000_print_page(). */ -#define COLOUR_BUF_MASK 0xff - /* 2^8 - 1 */ -#define COLOUR_BUF_LINES ( COLOUR_BUF_MASK + 1 ) - -/************************************************************************ - * S W I P E C O M M A N D M A C R O S * - ************************************************************************/ - -#define SWIPE_LEADER 0x1b, '*', 4 - /* Lead-in bytes for swipe command */ - -#define CMDLEN_X 3 - /* Index in swipe command of 4 byte */ - -#define DIRECTION_X 7 - /* Index in swipe cmd of direction flag */ - -#define UNIDIRECTIONAL 0 -#define BIDIRECTIONAL 1 - -#define HEADSPEED_X 8 - /* Index in swipe cmd of head speed */ - /* Head speeds for various densities */ -#define _300X 1 -#define _600X 2 -#define _1200X 5 - -#define PEN_X 9 - /* Index of 2 byte pen selectors */ -#define BLACK0 1 -#define BLACK1 1 -#define COLOUR0 2 -#define COLOUR1 0 - -#define NOZZLE_COUNT_X 11 - /* Index of nozzle count selector */ -#define _192NOZZLES 0x18 -#define _208NOZZLES 0x1a - -#define UNKNOWN1_X 12 - /* Index of an unknown byte */ -#define UNKNOWN1VAL 0 -#define NUM_COLUMNS_X 13 - /* Index in swipe command of 2 byte */ - /* column count */ -#define _1ST_COLUMN_X 15 - /* Index in swipe command of 2 byte */ - /* first column horizontal offset */ -#define LAST_COLUMN_X 17 - /* Index in swipe command of 2 byte */ - /* last column horizontal offset */ - -#define SWIPE_HDR_END_X 19 -#define SWIPE_HDR_END_LEN 7 -#define SWIPE_HDR_END 0, 0, '+', 'p', 'b', 'w', 1 - /* Final byte sequence of swipe cmd header */ - -#define SWIPE_HDR_LEN ( SWIPE_HDR_END_X + SWIPE_HDR_END_LEN ) - -/************************************************************************ - * C O L O U R H A N D L I N G M A C R O S * - ************************************************************************/ -/* Macros for the relative position on the colour components in */ -/* gx_color_index, the driver defined representation of individual */ -/* colours. */ - -#define BLACK_X 0 -#define YELLOW_X 1 -#define MAGENTA_X 2 -#define CYAN_X 3 - -#define LO_PEN 0 -#define HI_PEN 1 - - /* Colour defines for lx5000 black printer */ - -# define NUM_COMPONENTS_BLK 1 -# define BITS_PER_PIXEL_BLK 1 -# define MAX_GREY_BLK 1 -# define MAX_RGB_BLK 0 -# define DITHER_GREYS_BLK 2 -# define DITHER_COLOURS_BLK 0 - - /* Colour defines for lx5000 colour printer */ -# define NUM_COMPONENTS_CMY 4 -# define BITS_PER_PIXEL_CMY 4 -# define MAX_GREY_CMY 1 -# define MAX_RGB_CMY 1 -# define DITHER_GREYS_CMY 2 -# define DITHER_COLOURS_CMY 2 - -# define MIN_COLOUR BLACK_X -# define MAX_COLOUR CYAN_X -# define BLACK_PEN BLACK_X -# define _1ST_CMY_COLOUR YELLOW_X -# define LAST_CMY_COLOUR CYAN_X - -#define BPP BITS_PER_PIXEL_CMY - /* N.B. This is only required for - processCMYKline */ -# define PIXEL_MASK (( 1 << BPP ) - 1 ) -# define INITIAL_PIXEL_SHIFT ( ( sizeof( uchar ) * 8 ) - BPP ) - -#define NUM_COLOURS ( MAX_COLOUR - MIN_COLOUR + 1 ) -#define PENS_PER_COLOUR 2 -#define NUM_PENS ( NUM_COLOURS * PENS_PER_COLOUR ) - -#define BITS_PER_COLOUR (BITS_PER_PIXEL_CMY / NUM_COMPONENTS_CMY) - -#define DEF_NUM_COLOURS NUM_COLOURS -#define DEF_PENS_PER_COLOUR 1 -#define DEF_LINE_INCREMENT 1 - -/* !!!!!!!!!!!!!!!!!!!!! WARNING, WARNING, WILL ROBINSON !!!!!!!!!!!!!!!!!!!!*/ - /* If BPP ever exceeds 8, this will break - badly, as will the whole of processCMYKline. - PIXELS_PER_BYTE is used when skipping over - empty bytes in processCMYKline(). Each - empty scanline byte skips over this many - bits in the colourBufs. */ -#define PIXELS_PER_BYTE (8 / BPP) - -#define COLOUR_MASK (( 1 << ( BITS_PER_COLOUR ) ) - 1 ) - -/************************************************************************ - * Memory allocation macros * - * ( For use with getColourBufs & releaseAllocations ) * - ************************************************************************/ -#define ALLOCATE true -#define DEALLOCATE false - -/************************************************************************ - * " F U N C T I O N A L " M A C R O S * - ************************************************************************/ -/************************************************************************ - * Macro to fill the swipe header * - ************************************************************************/ - -#define FILL_SWIPE_HEADER( swipeHdr, len, dir, speed, pen0, pen1, nozzles, \ - unknown, numcols, firstcol, lastcol ) \ - swipeHdr[ CMDLEN_X ] = ( ( len >> 24 ) & 0xff ); \ - swipeHdr[ CMDLEN_X + 1 ] = ( ( len >> 16 ) & 0xff ); \ - swipeHdr[ CMDLEN_X + 2 ] = ( ( len >> 8 ) & 0xff ); \ - swipeHdr[ CMDLEN_X + 3 ] = ( len & 0xff ); \ - swipeHdr[ DIRECTION_X ] = dir; \ - swipeHdr[ HEADSPEED_X ] = speed; \ - swipeHdr[ PEN_X ] = pen0; \ - swipeHdr[ PEN_X + 1 ] = pen1; \ - swipeHdr[ NOZZLE_COUNT_X ] = nozzles; \ - swipeHdr[ UNKNOWN1_X ] = unknown; \ - swipeHdr[ NUM_COLUMNS_X ] = ( numcols >> 8 ); \ - swipeHdr[ NUM_COLUMNS_X + 1 ] = ( numcols & 0xff ); \ - swipeHdr[ _1ST_COLUMN_X ] = ( firstcol >> 8 ); \ - swipeHdr[ _1ST_COLUMN_X + 1 ] = ( firstcol & 0xff ); \ - swipeHdr[ LAST_COLUMN_X ] = ( lastcol >> 8 ); \ - swipeHdr[ LAST_COLUMN_X + 1 ] = ( lastcol & 0xff ) - -/************************************************************************ - * Macros to manipulate bit pointers in bitBuf & scanPixels structs * - ************************************************************************/ -#define BIT_TO_MASK( n ) ( 0x80 >> ( n ) ) -#define INC_BIT( bitPtr ) \ -do { \ - if ( ! ((bitPtr).xBit >>= 1 )) \ - { (bitPtr).xByte++ ; (bitPtr).xBit = 0x80; } \ -} while (0) - -#define DEC_BIT( bitPtr ) \ -do { \ - if ( ! ( (bitPtr).xBit = (( (bitPtr).xBit << 1 ) & 0xff ))) \ - { (bitPtr).xByte-- ; (bitPtr).xBit = 1; } \ -} while (0) - -/************************************************************************ - * Macro for defining gx_device_procs structure * - ************************************************************************/ - -#define lx5000_proctab(get_params, put_params, map_color_rgb, map_cmyk_color)\ -{ gdev_prn_open,\ - gx_default_get_initial_matrix,\ - NULL, /* sync_output */\ - gdev_prn_output_page,\ - gdev_prn_close,\ - NULL, /* map_rgb_color */\ - map_color_rgb,\ - NULL, /* fill_rectangle */\ - NULL, /* tile_rectangle */\ - NULL, /* copy_mono */\ - NULL, /* copy_color */\ - NULL, /* draw_line */\ - NULL, /* get_bits */\ - get_params,\ - put_params,\ - map_cmyk_color,\ - NULL, /* get_xfont_procs */\ - NULL, /* get_xfont_device */\ - NULL, /* map_rgb_alpha_color */\ - gx_page_device_get_page_device /* get_page_device */\ -} - -/************************************************************************ - * T Y P E D E F S E N U M S & E X T E R N A L S T O R A G E * - ************************************************************************/ - /* The procedure descriptors */ - /* declare functions */ -static dev_proc_print_page(lx5000_print_page); -static dev_proc_get_params(lx5000_get_params); -static dev_proc_put_params(lx5000_put_params); - -static dev_proc_map_cmyk_color(lx5000_map_cmyk_color); -static dev_proc_map_color_rgb(lx5000_map_color_rgb); - -static const gx_device_procs lx5000_procs = - lx5000_proctab( - lx5000_get_params, - lx5000_put_params, - lx5000_map_color_rgb, - lx5000_map_cmyk_color - ); - - /* The device descriptors */ - /* define a subclass containing useful state */ - /* a sub-class of gx_device_printer */ -typedef struct lx5000_device_s { - gx_device_common; - gx_prn_device_common; - int alignA; - int alignB; - int headSeparation; - int dryTime; /* Seconds delay at end of page for drying */ - int pensPerColour; /* 1 for 600Y; 2 for 1200Y */ - int lineIncrement; /* 1 for 600Y; 2 for 1200Y */ - int scanLineBytes; /* Returned by GS */ - int penLineBytes; /* When scanline colour elements are each - reduced to a single bit, this is the result- - ing line length in bytes. */ - int penLineLen; /* penLineBytes + BOL + EOL padding */ - int penBufSize; /* penLineLen * no. of lines */ - int swipeBufSize; /* calculated size of a swipe command buffer */ - bool isCMYK; -} lx5000_device; - - /* Define a structure for a pointer to an */ - /* individual bit in a scanline */ -typedef struct bufBit_s { - byte *xByte; /* Pointer to byte in buffer */ - uchar xBit; /* Mask for invidual bit in byte */ -} bufBit; - -typedef struct penData_s { - int topLine; /* Top printable line of this pen */ - int bottomLine; /* Bottom printable line of this pen */ - int nextPrintLine; /* Next line to be printed, this pen */ - - int initialBottomLine; - int bottomToBottomYellow; - int topToBottomYellow; - int finalLine; -} penData; - - /* Structure for extracting pixels from the - initial scan line, which must be int - aligned. */ -typedef struct scanPixels_s { - uchar *scanByte; /* Pointer to a byte in the scan buffer */ - int pixShift; /* Shift required to get next pixel to */ -} scanPixels; /* the LSBits of the word. */ - - /* Standard lx5000 device */ -lx5000_device far_data gs_lx5000_device = { - prn_device_margins_body - ( lx5000_device, - lx5000_procs, - "lx5000", - DEFAULT_WIDTH_10THS, - DEFAULT_HEIGHT_10THS, - LX5000_XDPI, /* x dpi */ - LX5000_YDPI, /* y dpi */ - /* Offset inches from page left to 0,0 */ - LX5000_XOFFSET_TO_0_0, - /* Offset inches from page top to 0,0 */ - LX5000_YOFFSET_TO_0_0, - LX5000_LEFT_HWMARGIN_INS, /* margins */ - LX5000_BOTTOM_HWMARGIN_INS, - LX5000_RIGHT_HWMARGIN_INS, - LX5000_TOP_HWMARGIN_INS, - NUM_COMPONENTS_CMY, /* colour info */ - BITS_PER_PIXEL_CMY, /* " */ - MAX_GREY_CMY, /* " */ - MAX_RGB_CMY, /* " */ - DITHER_GREYS_CMY, /* " */ - DITHER_COLOURS_CMY, /* " */ - lx5000_print_page - ), - ALIGN_A_DEF, /* default(!) horizontal pen alignment */ - ALIGN_B_DEF, /* default(!) vertical pen alignment */ - HEADSEP_DEF, /* default headSeparation value */ - DRY_TIME_DEF, /* Default page drying time */ - DEF_PENS_PER_COLOUR, - DEF_LINE_INCREMENT, - 0, /* scanLineBytes */ - 0, /* penLineBytes */ - 0, /* penLineLen */ - 0, /* penBufSize */ - 0, /* swipeBufSize */ - true /* isCMYK - defaults to using colour */ -}; - -static const gx_device_color_info color_info_cmy = - dci_values(NUM_COMPONENTS_CMY, - BITS_PER_PIXEL_CMY, - MAX_GREY_CMY, - MAX_RGB_CMY, - DITHER_GREYS_CMY, - DITHER_COLOURS_CMY); - -static const gx_device_color_info color_info_blk = - dci_values(NUM_COMPONENTS_BLK, - BITS_PER_PIXEL_BLK, - MAX_GREY_BLK, - MAX_RGB_BLK, - DITHER_GREYS_BLK, - DITHER_COLOURS_BLK); - -/************************************************************************ - ************************************************************************ - * D R I V E R P R O C E D U R E S * - ************************************************************************ - ************************************************************************/ - -/************************************************************************ - * U T I L I T Y P R O C E D U R E S * - ************************************************************************/ - -/*----------------------------------------------------------------------* - * i n i t P e n C o n s t a n t s ( ) * - *----------------------------------------------------------------------* - *----------------------------------------------------------------------*/ -static void -initPenConstants( lx5000_device *lx5000dev, - penData pens[NUM_COLOURS][PENS_PER_COLOUR] ) -{ - /* Indexed by pensPerColour. */ - static const int nozzleCount[ NUM_COLOURS ][ PENS_PER_COLOUR + 1 ] = - { - { -1, BLACK_NOZZLES, (BLACK_NOZZLES / 2) }, - { -1, _1COLOUR_NOZZLES, (_1COLOUR_NOZZLES / 2) }, - { -1, _1COLOUR_NOZZLES, (_1COLOUR_NOZZLES / 2) }, - { -1, _1COLOUR_NOZZLES, (_1COLOUR_NOZZLES / 2) } - }; - - int colour, pen; - int pensPerColour = lx5000dev->pensPerColour; - - pens[YELLOW_X][LO_PEN].initialBottomLine = -1; - pens[MAGENTA_X][LO_PEN].initialBottomLine = - pens[YELLOW_X][LO_PEN].initialBottomLine - - COLOUR_PEN_DIFF; - pens[CYAN_X][LO_PEN].initialBottomLine = - pens[MAGENTA_X][LO_PEN].initialBottomLine - - COLOUR_PEN_DIFF; - pens[BLACK_X][LO_PEN].initialBottomLine = - pens[YELLOW_X][LO_PEN].initialBottomLine - - COLOUR_PEN_GAP - + ( SWIPE_WORD_BITS - lx5000dev->alignB ); - - for ( colour = 0; colour < NUM_COLOURS; colour++ ) - { - pens[colour][LO_PEN].bottomToBottomYellow - = pens[YELLOW_X][LO_PEN].initialBottomLine - - pens[colour][LO_PEN].initialBottomLine; - } - - if ( pensPerColour == 1 ) - { - pens[BLACK_X][LO_PEN].topToBottomYellow = - BLK_COLOUR_NOZZLES + COLOUR_PEN_GAP - + lx5000dev->alignB - 1; - pens[YELLOW_X][LO_PEN].topToBottomYellow = _1COLOUR_NOZZLES - 1; - pens[MAGENTA_X][LO_PEN].topToBottomYellow = - pens[YELLOW_X][LO_PEN].topToBottomYellow - + COLOUR_PEN_DIFF; - pens[CYAN_X][LO_PEN].topToBottomYellow = - pens[MAGENTA_X][LO_PEN].topToBottomYellow - + COLOUR_PEN_DIFF; - - for ( colour = 0; colour < NUM_COLOURS; colour++ ) - { - pens[colour][HI_PEN].topToBottomYellow - = pens[colour][LO_PEN].topToBottomYellow; - pens[colour][HI_PEN].initialBottomLine - = pens[colour][LO_PEN].initialBottomLine; - pens[colour][HI_PEN].bottomToBottomYellow - = pens[colour][LO_PEN].bottomToBottomYellow; - } - } - else /* pensPerColour > 1 */ - { - pens[BLACK_X][HI_PEN].topToBottomYellow = - BLK_COLOUR_NOZZLES + COLOUR_PEN_GAP - + lx5000dev->alignB - 1; - pens[BLACK_X][LO_PEN].topToBottomYellow = - pens[BLACK_X][HI_PEN].topToBottomYellow - - nozzleCount[BLACK_X][pensPerColour]; - pens[YELLOW_X][HI_PEN].topToBottomYellow = _1COLOUR_NOZZLES - 1; - pens[YELLOW_X][LO_PEN].topToBottomYellow = - pens[YELLOW_X][HI_PEN].topToBottomYellow - - nozzleCount[YELLOW_X][pensPerColour]; - pens[MAGENTA_X][HI_PEN].topToBottomYellow = - pens[YELLOW_X][HI_PEN].topToBottomYellow - + COLOUR_PEN_DIFF; - pens[MAGENTA_X][LO_PEN].topToBottomYellow = - pens[MAGENTA_X][HI_PEN].topToBottomYellow - -nozzleCount[MAGENTA_X][pensPerColour]; - pens[CYAN_X][HI_PEN].topToBottomYellow = - pens[MAGENTA_X][HI_PEN].topToBottomYellow - + COLOUR_PEN_DIFF; - pens[CYAN_X][LO_PEN].topToBottomYellow = - pens[CYAN_X][HI_PEN].topToBottomYellow - - nozzleCount[CYAN_X][pensPerColour]; - - for ( colour = 0; colour < NUM_COLOURS; colour++ ) - { - pens[colour][HI_PEN].bottomToBottomYellow = - pens[colour][LO_PEN].bottomToBottomYellow - + nozzleCount[colour][pensPerColour]; - pens[colour][HI_PEN].initialBottomLine = - pens[colour][LO_PEN].initialBottomLine - - nozzleCount[colour][pensPerColour]; - } - } - - for ( colour = 0; colour < NUM_COLOURS; colour++ ) - { - for ( pen = 0; pen < PENS_PER_COLOUR; pen++ ) - { - pens[colour][pen].finalLine = - ( lx5000dev->height ) + pens[colour][pen].topToBottomYellow; - } - } -} - -/*----------------------------------------------------------------------* - * p a g e I n i t ( ) * - *----------------------------------------------------------------------* - *----------------------------------------------------------------------*/ -static void -pageInit( unsigned int alignA, unsigned int alignB, FILE *prn_stream ) -{ - static char page_init[] = { - 0x1b, '*', 'm', 0, 0x40, ALIGN_A_DEF, ALIGN_B_DEF, 0xf, 0xf - }; - - page_init[ALIGN_A_OFFSET] = (uchar)alignA; - page_init[ALIGN_B_OFFSET] = (uchar)alignB; - - fwrite( page_init, 1, sizeof( page_init ), prn_stream ); -} - -/*----------------------------------------------------------------------* - * p a g e E n d ( ) * - *----------------------------------------------------------------------* - *----------------------------------------------------------------------*/ -static void -pageEnd( FILE *prn_stream ) -{ - static const char page_end[] = { - 0x1b,'*', 7, 0x65 - }; - - fwrite( page_end, 1, sizeof( page_end ), prn_stream ); - /* Do it twice - that's what the Windows */ - /* driver for the 5000 does */ - fwrite( page_end, 1, sizeof( page_end ), prn_stream ); -} - -/*----------------------------------------------------------------------* - * f e e d P a p e r ( ) * - *----------------------------------------------------------------------* - *----------------------------------------------------------------------*/ -static void -feedPaper( lx5000_device *lx5000dev, int newLine, int *currentLine, - penData pens[NUM_COLOURS][PENS_PER_COLOUR], - FILE *prn_stream ) -{ - static const char feed_paper[] = { - 0x1b, '*', 3 - }; - - ushort _1200ths; - int colour, pen; - - if ( newLine >= *currentLine ) - { - _1200ths = (ushort)(( newLine - *currentLine ) * FEED_FACTOR ); - fwrite( feed_paper, 1, sizeof( feed_paper ), prn_stream ); - putc( _1200ths >> 8 , prn_stream); - putc( _1200ths & 0xff, prn_stream ); - - *currentLine = newLine; - - for ( colour = 0; - colour < lx5000dev->color_info.num_components; - colour++ ) - for ( pen = 0; pen < lx5000dev->pensPerColour; pen++ ) - { - pens[colour][pen].topLine = - newLine - pens[colour][pen].topToBottomYellow; - pens[colour][pen].bottomLine = - newLine - pens[colour][pen].bottomToBottomYellow; - } - - } -} - -/*----------------------------------------------------------------------* - * g e t C o l o u r B u f s ( ) * - *----------------------------------------------------------------------* - Return pointers to the allocated buffers in those pointers whose addresses - have been passed as parameters, or release the allocations. - - Allocation is indicated by a true value of the argument `allocate'. - - The buffers themselves are allocated and the pointers to them are kept - in static storage. On the first call, the buffers are allocated, and the - pointers to them are maintained in static storage. On all subsequent - calls, the pointer contents are simply returned. - - Deallocation is indicated by a false value of the argument `allocate'. - - If the pointers are non-null, the allocated memory is released, and - the pointer values are set to NULL. - - N.B. The arrays are defined in terms of the maximum values for the array - dimensions, even though the actual usage of each dimension is dynamically - determined. E.g. colourBufs is dimensioned [NUM_COLOURS], - even though the number of colour dimensions actually used is determined - by the variable numColours, which will be 1 if the driver is being used - in black-only mode. - *----------------------------------------------------------------------*/ -static int -getColourBufs( lx5000_device *lx5000dev, - byte **lineBufferPtr, byte *colourBufPtrs[], - byte **swipeBufPtr, bool allocate ) -{ - static byte *colourBufs[ NUM_COLOURS ]; - /* Only an array of pointers; OK if too big */ - static byte *lineBuffer = NULL; - static byte *swipeBuf = NULL; - - int colour; - int colourBufNull = 0; - int numColours = lx5000dev->color_info.num_components; - - if ( allocate ) - { - if ( lineBuffer == NULL ) - { - /* Initialise the pen buffers */ - for ( colour = 0; colour < numColours; colour++ ) - colourBufs[ colour ] = NULL; - - /*---------------------------------------------------------------* - Derive the size of a colour buffer line: If the number of - components is one and the number of bits per pixel is one, then - there is only one bit per pixel in the scan line, so the colour - buffer line is the same size. - - Otherwise, reduce each gx_color_index element in the scan line to - one bit in the penprint buffer. - *--------------------------------------------------------------*/ - - if (lx5000dev->color_info.num_components > GX_DEVICE_COLOR_MAX_COMPONENTS) - return_error(gs_error_limitcheck); - - lx5000dev->scanLineBytes = gdev_mem_bytes_per_scan_line( - (gx_device *)lx5000dev ); - lx5000dev->penLineBytes = - ( lx5000dev->color_info.num_components == 1 - && lx5000dev->color_info.depth == 1 ) - ? lx5000dev->scanLineBytes - : ( lx5000dev->scanLineBytes / lx5000dev->color_info.num_components); - - lx5000dev->penLineLen = - lx5000dev->penLineBytes + ( LINE_PAD_BYTES * 2); - - lx5000dev->penBufSize - = lx5000dev->penLineLen * COLOUR_BUF_LINES; - - /* swipeBuf size: - * No. of columns = No. of bits in the linebuf - * Bits per column = maximum swipe height - * Bytes per column = Bits per column / 8 + 2 byte directory - * Total bytes = Bytes/column * no. of columns + header bytes - */ - lx5000dev->swipeBufSize = - ((lx5000dev->penLineLen * 8) - * ((BLACK_NOZZLES / 8) + 2) + SWIPE_HDR_LEN); - - /* Allocate a buffer for a single scan line */ - lineBuffer = (byte *)gs_alloc_byte_array - ( gs_lib_ctx_get_non_gc_memory_t(), lx5000dev->scanLineBytes, 1, - "lx5000_print_page(lineBuffer)" ); - - swipeBuf = (byte *)gs_alloc_byte_array - ( gs_lib_ctx_get_non_gc_memory_t(), lx5000dev->swipeBufSize, 1, - "lx5000_print_page(swipeBuf)" ); - - for ( colour = 0 ; colour < numColours; colour++ ) - { - if ( ( colourBufs[colour] = - (byte *)gs_alloc_byte_array - ( gs_lib_ctx_get_non_gc_memory_t(), lx5000dev->penBufSize, 1, - "lx5000_print_page(colourBufs)" - ) - ) == NULL ) - { - colourBufNull = 1; - colour = numColours; - } - } - /* Check allocations */ - if ( lineBuffer == NULL || colourBufNull || swipeBuf == NULL ) { - getColourBufs( lx5000dev, lineBufferPtr, colourBufPtrs, - swipeBufPtr, DEALLOCATE ); - return_error( gs_error_VMerror ); - } - } - /* Clear the black buffer, iff ! isCMYK. If CMYK, scan lines are - processed by processCMYKlines(), and buffer lines are cleared - individually, before a new scan line is processed. As part of this - clearing, the line EOL and BOL pads are also cleared. - If ! CMYK, the black-only scan line is read or copied directly - into the black buffer, without clearing the buffer. Therefore, the - line pad regions must either be cleared individually for each line - processed, or cleared once when the buffer is allocated. - */ - if ( ! lx5000dev->isCMYK ) - memset( colourBufs[BLACK_X], 0, lx5000dev->penBufSize ); - - /* Return the values */ - *lineBufferPtr = lineBuffer; - *swipeBufPtr = swipeBuf; - for ( colour = 0; colour < numColours; colour++ ) - colourBufPtrs[colour] = colourBufs[colour]; - - return 0; - } - else /* Deallocate the buffers */ - { - for ( colour = 0; colour < numColours; colour++ ) - { - if ( colourBufs[colour] != NULL ) - gs_free_object( gs_lib_ctx_get_non_gc_memory_t(), - (char *)colourBufs[colour], - "lx5000_print_page(colourBufs)" ); - colourBufs[ colour ] = NULL; - colourBufPtrs[ colour ] = NULL; - } - if ( swipeBuf != NULL ) - gs_free_object( gs_lib_ctx_get_non_gc_memory_t(), - (char *)swipeBuf, "lx5000_print_page(swipeBuf)" ); - swipeBuf = NULL; - *swipeBufPtr = NULL; - if ( lineBuffer != NULL ) - gs_free_object( gs_lib_ctx_get_non_gc_memory_t(), - (char *)lineBuffer, "lx5000_print_page(lineBuffer)" ); - lineBuffer = NULL; - *lineBufferPtr = NULL; - return 0; - } -} - -/*----------------------------------------------------------------------* - * p r o c e s s C M Y K l i n e ( ) * - *----------------------------------------------------------------------* - Given a scan line number, a pointer to a scan line, an array of pointers to - individual colour buffers, and an array of the individual pen scanBit - arrays, distribute the scan line elements into the colour buffers. - - N.B. The empty indicator for each line for each pen buffer must also be - set by this procedure. - - Things like dithering may well end up in here. - *----------------------------------------------------------------------*/ -static void -processCMYKline( lx5000_device *lx5000dev, int linenum, - byte *lineBuffer, byte *scanLine, - byte *colourBufs[NUM_COLOURS], - bufBit - colourLines[NUM_COLOURS][PENS_PER_COLOUR][COLOUR_BUF_LINES], - penData pens[NUM_COLOURS][PENS_PER_COLOUR], - bool lineEmpty[NUM_COLOURS][ COLOUR_BUF_LINES ] ) -{ - int colour; - int numColours = lx5000dev->color_info.num_components; - - uchar colourBits[ 8 ]; - uchar lineIndex; - uchar scanPixel; - scanPixels nextPixel; - bufBit nextBit[ 8 ]; - /* The end of the (scan)line. */ - uchar *scanEnd = scanLine + lx5000dev->scanLineBytes; - - nextPixel.scanByte = scanLine; /* Set up the moving pixel pointer. */ - nextPixel.pixShift = INITIAL_PIXEL_SHIFT; - lineIndex = (uchar)( linenum & COLOUR_BUF_MASK ); - - for ( colour = 0; colour < numColours; colour++ ) - { - /* Set up the moving output bit pointer for - each of the colours. */ - nextBit[ colour ].xByte = colourBufs[ colour ] + LINE_PAD_BYTES - + ( lineIndex * lx5000dev->penLineLen ); - nextBit[ colour ].xBit = BIT_TO_MASK( 0 ); - /* Clear the colourBuf line if necessary */ - if ( ! lineEmpty[ colour ][ lineIndex ] ) - { - memset( nextBit[ colour ].xByte - LINE_PAD_BYTES, - 0, lx5000dev->penLineLen ); - lineEmpty[ colour ][ lineIndex ] = true; - } - } - /* Is the line empty? */ - if (( ! *scanLine ) && - ! memcmp( scanLine, scanLine + 1, lx5000dev->scanLineBytes - 1 )) - return; /* N.B. empty flag is pre-set to true */ - - while ( nextPixel.scanByte < scanEnd ) - { - int colour; - int cmy; /* Used to detect if C+M+Y set */ - int skipPixels, skipBytes, skipBits; - /* Number of consecutive empty pixels, equiv- - alent bytes and remainder bits just skipped - over in the CMYK line being processed. */ - - /* Get next pixel and increment the pointer */ - scanPixel = - ( ( *(nextPixel.scanByte) >> nextPixel.pixShift ) & PIXEL_MASK ); - - /* pixShift is the number of bits to right-shift the scanByte - before applying PIXEL_MASK. When we attempt to decrement - it past 0, it's time to look at the next scanByte. - N.B. We assume that the subtraction of BPP will end with - zero, i.e., that there are an integral number of BPPs in - INITIAL_PIXEL_SHIFT. We test for <= 0 just - in case this condition gets violated. - */ - skipPixels = 0; - if ( nextPixel.pixShift <= 0 ) - { - nextPixel.scanByte++; - nextPixel.pixShift = INITIAL_PIXEL_SHIFT; - /* If the next byte is empty, skip it */ - while (( ! *nextPixel.scanByte ) && nextPixel.scanByte < scanEnd ) - { - nextPixel.scanByte++; - skipPixels += PIXELS_PER_BYTE; - } - } - else - nextPixel.pixShift -= BPP; - /* Get the black bit(s) */ - colourBits[ BLACK_X ] = scanPixel & COLOUR_MASK; - scanPixel >>= BITS_PER_COLOUR; - /* Set to catch all ANDed bits from colours */ - cmy = ~0; - for ( colour = YELLOW_X; colour <= CYAN_X; colour++ ) - { - colourBits[ colour ] = scanPixel & COLOUR_MASK; - cmy &= scanPixel & COLOUR_MASK; - scanPixel >>= BITS_PER_COLOUR; - } - if ( ( cmy ^ COLOUR_MASK ) == 0 ) /* C, M & Y all set == COLOUR_MASK */ - { - colourBits[ YELLOW_X ] = - colourBits[ MAGENTA_X ] = colourBits[ CYAN_X ] = 0; - colourBits[ BLACK_X ] = COLOUR_MASK; - } - /* Now set the colourBuf bits */ - skipBytes = skipPixels >> 3; - skipBits = skipPixels & 7; - for ( colour = 0; colour < numColours; colour++ ) - { - if ( colourBits[ colour ] ) - { - *( nextBit[ colour ].xByte ) |= nextBit[ colour ].xBit; - lineEmpty[ colour ][ lineIndex ] = false; - } - INC_BIT( nextBit[ colour ] ); - if ( skipPixels ) - { - int bitSkip = skipBits; - - nextBit[ colour ].xByte += skipBytes; - while ( bitSkip-- ) - { - INC_BIT( nextBit[ colour ] ); - } - } - } - } -} - -/*----------------------------------------------------------------------* - * r e f r e s h B u f f e r ( ) * - *----------------------------------------------------------------------* - Given pointers to the values of the next line to retrieve from GS, and - the next printable line, the GS line buffer, the per colour bit buffers, - the per colour arrays containing the per line `empty' - indicators, and the per pen penData structs, containing the next print - line for each pen, refresh the buffer, and perform initial processing on - the lines read from GS. - - When the scan line is for a black-only device, the line bits can be read - directly into the appropriate colour buffer at the appropriate place. - - When the scan lines hold colour info, each line must undergo CMYK pro- - cessing to derive the individual arrays of single-colour bits. - - Refreshing the buffers involves reading lines into the circular colour - buffers until COLOUR_BUF_LINES have been read, or until the available - lines have been exhausted. - - On return, nextLineToPrint must be set to the said line number, or beyond - the end of the page, if no more remain to be printed. - *----------------------------------------------------------------------*/ -static void -refreshBuffer( lx5000_device *lx5000dev, - int *nextLineToGet, int *nextLineToPrint, - byte *lineBuffer, byte *colourBufs[], - bufBit - colourLines[NUM_COLOURS][PENS_PER_COLOUR][COLOUR_BUF_LINES], - penData pens[NUM_COLOURS][PENS_PER_COLOUR], - bool lineEmpty[NUM_COLOURS][COLOUR_BUF_LINES] ) -{ - byte *lineBuf; - uchar nextToGet; /* Circular buffer pointer, 0 to ff */ - int bufferOffset; - int colour, pen; - int _1stPrintable; /* Across all pens */ - int numColours = lx5000dev->color_info.num_components; - - /* Establish the next line to print, if it - is already in the buffer. */ - _1stPrintable = pens[YELLOW_X][LO_PEN].finalLine; - for ( colour = 0; colour < numColours; colour++ ) - { - for ( pen = 0; pen < lx5000dev->pensPerColour; pen++ ) - if ( pens[ colour ][ pen ].nextPrintLine < _1stPrintable) - _1stPrintable = pens[ colour ][ pen ].nextPrintLine; - } - *nextLineToPrint = _1stPrintable; - - nextToGet = (uchar)(*nextLineToGet & COLOUR_BUF_MASK); - /* nextLineToPrint may be set high (i.e. not - known), or may be a known print line. */ - while ( ( *nextLineToGet < *nextLineToPrint - || ( *nextLineToGet - *nextLineToPrint ) < COLOUR_BUF_LINES ) - && *nextLineToGet < lx5000dev->height ) - { - bufferOffset = LINE_PAD_BYTES + ( lx5000dev->penLineLen * nextToGet ); - - if ( ! lx5000dev->isCMYK ) - { - /* For black-only, read the bits directly into - the colour buffer. */ - gdev_prn_get_bits( (gx_device_printer *)lx5000dev, *nextLineToGet, - colourBufs[BLACK_X] + bufferOffset, &lineBuf ); - /* If necessary, copy the bits into the actual - buffer. */ - if ( lineBuf != colourBufs[BLACK_X] + bufferOffset ) - memcpy(colourBufs[BLACK_X] + bufferOffset, - lineBuf, lx5000dev->penLineBytes); - /* Check for a printing line */ - if ( *(colourBufs[BLACK_X] + bufferOffset) != 0 - || memcmp( colourBufs[BLACK_X] + bufferOffset, - colourBufs[BLACK_X] + bufferOffset + 1, - lx5000dev->scanLineBytes - 1 )) - lineEmpty[ BLACK_X ][ nextToGet ] = false; - else - lineEmpty[ BLACK_X ][ nextToGet ] = true; - } - else /* CMYK printing */ - { - /* Process a CMYK line from GS */ - gdev_prn_get_bits( (gx_device_printer *)lx5000dev, - *nextLineToGet, lineBuffer, &lineBuf ); - processCMYKline( lx5000dev, *nextLineToGet, lineBuffer, lineBuf, - colourBufs, colourLines, pens, lineEmpty ); - } - for (colour = 0; colour < numColours; colour++ ) - { - /* Check for printing line - - N.B. For two-pen colour, this becomes more - complicated. The relationship between the - first print line of the lower and of the - upper pen is determined by odd/even line - numbers, although this is not an essential - relationship. Blank lines at the top of - the lower pen could be skipped, and the - first available line could be printed by - the lower pen. */ - if ( ! lineEmpty[colour][nextToGet] ) - { - if ( pens[colour][LO_PEN].nextPrintLine > *nextLineToGet ) - pens[colour][LO_PEN].nextPrintLine = *nextLineToGet; - if ( *nextLineToPrint > *nextLineToGet ) - *nextLineToPrint = *nextLineToGet; - } - } - ++*nextLineToGet; - nextToGet = ( *nextLineToGet & COLOUR_BUF_MASK ); /* N.B. This is safer - than just doing the increment, in case the - buffer length changes. */ - } - /* Check that no buffer padding is necessary */ - if ( *nextLineToPrint < lx5000dev->height ) - { - while ( ( *nextLineToGet - *nextLineToPrint ) < COLOUR_BUF_LINES ) - { /* Last refresh fell short of COLOUR_BUF_LINES - because last line of page was reached. - Pad the buffer to COLOUR_BUF_LINES with 0 - (no print) bytes. */ - for ( colour = 0; colour < numColours; colour++ ) - { /* Fill the colour line buffer, incl pad */ - memset( colourBufs[colour] - + ( lx5000dev->penLineLen * nextToGet ), - 0, lx5000dev->penLineLen ); - /* Set empty indicator - note that firstBit - is NOT set here. */ - lineEmpty[colour][nextToGet] = true; - } - ++*nextLineToGet; - nextToGet = ( *nextLineToGet & COLOUR_BUF_MASK ); - } - } -} - -/*----------------------------------------------------------------------* - * c a r t r i d g e M o v e T o ( ) * - *----------------------------------------------------------------------* - Given the array of penBits structures for each pen, containing the - nextPrintLine value for the pen, return the line position to - which the colour cartridge must be moved to print that line with the - TOP nozzle of the required pen. - If the print line for any pen is within the current range of that pen, - a line less than the current colour head position will be returned. - If colour is not defined, return a value off the end of the page. - *----------------------------------------------------------------------*/ -static int -cartridgeMoveTo( lx5000_device *lx5000dev, - penData pens[NUM_COLOURS][PENS_PER_COLOUR], - int _1stColour, int lastColour ) -{ - if ( _1stColour != BLACK_X && ! lx5000dev->isCMYK ) - /* Send back an off-the-page value */ - return pens[CYAN_X][LO_PEN].finalLine; - else - { - int colour, pen, minLine; - - minLine = pens[CYAN_X][LO_PEN].finalLine; /* Initialise high */ - /* For each pen, calculate a moveto value - which will print the next line with the - first nozzle of that pen. - Return the minimum of these values. */ - for ( colour = _1stColour; colour <= lastColour; colour++ ) - for ( pen = 0; pen < lx5000dev->pensPerColour; pen++ ) - if ( ( pens[colour][pen].nextPrintLine - + pens[colour][pen].topToBottomYellow ) - < minLine ) - minLine = - pens[colour][pen].nextPrintLine - + pens[colour][pen].topToBottomYellow; - - return minLine; - } -} -/*----------------------------------------------------------------------* - * s e t C o l o u r C o l u m n E x t e n t ( ) * - *----------------------------------------------------------------------* - Given a colour buffer, a single array of colourBits structures, - 1st and last lines, 1st nozzle, and the addresses of - _1stColumn, lastColumn and columnExtent variables, calculate and set - these column variables after stripping leading and trailing white space. - *----------------------------------------------------------------------*/ -static void -setColourColumnExtent( lx5000_device *lx5000dev, byte *colourBuf, - bool lineEmpty[COLOUR_BUF_LINES], - int _1stLine, int _1stNozzle, int lastLine, - int *_1stColumn, int *lastColumn, int *columnExtent ) -{ - uchar _1stIndex; - int firstPrintByte, lastPrintByte; - int line; - - line = _1stLine; - firstPrintByte = lx5000dev->penLineBytes; - lastPrintByte = 0; - - for ( ; line <= lastLine; line += lx5000dev->lineIncrement ) - { /* For each active line in swipe */ - int columnByte; - - _1stIndex = line & COLOUR_BUF_MASK; - if ( lineEmpty[ _1stIndex ] ) - continue; /* If the line is empty, skip it. */ - /* Otherwise, scan from the beginning to any - previously found non-zero byte for the - beginning of the active column extent. */ - for ( columnByte = 0; columnByte < firstPrintByte; columnByte++ ) - if ( colourBuf[ _1stIndex * lx5000dev->penLineLen - + LINE_PAD_BYTES + columnByte ] ) - { - firstPrintByte = columnByte; - break; - } - /* Scan from the end of the line to any pre- - viously found non-zero byte for the end of - the active column extent. */ - for ( columnByte = lx5000dev->penLineBytes; - columnByte > lastPrintByte; columnByte-- ) - if ( colourBuf[ _1stIndex * lx5000dev->penLineLen - + LINE_PAD_BYTES + columnByte ] ) - { - lastPrintByte = columnByte; - break; - } - } - /* If we have no extent, there are no - printable lines for this pen. */ - if ( firstPrintByte > lastPrintByte ) - { - *_1stColumn = firstPrintByte * 8; - *lastColumn = lastPrintByte * 8; - *columnExtent = 0; - return; - } - - *_1stColumn = firstPrintByte * 8; - *lastColumn = lastPrintByte * 8 + 7 + lx5000dev->headSeparation; - *columnExtent = ( *lastColumn - *_1stColumn ) + 1; - -} - -/*----------------------------------------------------------------------* - * s e t C o l o u r L i n e s ( ) * - *----------------------------------------------------------------------* - Given a single colour/pen buffer, a single array of bufBit structures, - 1st and last lines, 1st nozzle, print direction, and - _1stColumn, lastColumn and columnExtent variables, set up the pointers - to the first actual column of each line, taking account of even and odd - nozzle numbers. - *----------------------------------------------------------------------*/ -static void -setColourLines( lx5000_device *lx5000dev, - byte *colourBuf, bufBit colourLines[COLOUR_BUF_LINES], - int _1stLine, int _1stNozzle, int lastLine, int direction, - int _1stColumn, int lastColumn ) -{ - uchar _1stIndex; - int line, nozzle, bit, headSep, headSepBytes, headSepBits; - int firstPrintByte, lastPrintByte, lastPrintBit; - bufBit startPtr; - - /* Now initialize the penBits bufBit structures to point to the - beginning and end of the extent for each of the active lines in - this swipe - - Adjust the beginning for all EVEN nozzles by moving it to the - left by HeadSeparation bits. - */ - - headSep = lx5000dev->headSeparation; - if ( lx5000dev->x_pixels_per_inch == 300.0 ) - headSep = headSep >> 1; /* Halve the value at 300 dpi */ - if ( lx5000dev->x_pixels_per_inch == 1200.0 ) - headSep = headSep << 1; /* Double the value at 1200dpi */ - headSepBytes = headSep / 8; - headSepBits = headSep % 8; - - firstPrintByte = _1stColumn / 8; - lastPrintByte = lastColumn / 8; - lastPrintBit = lastColumn % 8; - - if ( direction == RIGHTWARD ) - { - /* Set up the ODD columns first */ - startPtr.xByte = colourBuf + LINE_PAD_BYTES + firstPrintByte; - startPtr.xBit = BIT_TO_MASK( 0 ); - line = _1stLine; - nozzle = _1stNozzle; /* Is 1st nozzle effectively odd? */ - if ( ! ( nozzle & 1 ) ) /* Nozzle is even, so increment */ - line += lx5000dev->lineIncrement; - for ( ; line <= lastLine; line += ( lx5000dev->lineIncrement << 1 ) ) - { - _1stIndex = (uchar)( line & COLOUR_BUF_MASK ); - colourLines[_1stIndex].xByte = - startPtr.xByte + _1stIndex * lx5000dev->penLineLen; - colourLines[_1stIndex].xBit = startPtr.xBit; - } - /* Set up EVEN columns */ - startPtr.xByte -= headSepBytes; - for ( bit = 0; bit < headSepBits; bit++ ) - { - DEC_BIT( startPtr ); - } - line = _1stLine; - nozzle = _1stNozzle; /* Is 1st nozzle effectively even? */ - if ( nozzle & 1 ) /* Nozzle is odd, so increment */ - line += lx5000dev->lineIncrement; - for ( ; line <= lastLine; line += ( lx5000dev->lineIncrement << 1 ) ) - { - _1stIndex = (uchar)( line & COLOUR_BUF_MASK ); - colourLines[_1stIndex].xByte = - startPtr.xByte + _1stIndex * lx5000dev->penLineLen; - colourLines[_1stIndex].xBit = startPtr.xBit; - } - } - else /* direction == LEFTWARD */ - { - /* Set up the ODD columns first */ - startPtr.xByte = colourBuf + LINE_PAD_BYTES + lastPrintByte; - startPtr.xBit = BIT_TO_MASK( lastPrintBit ); - line = _1stLine; - nozzle = _1stNozzle; /* Is 1st nozzle effectively odd? */ - if ( ! ( nozzle & 1 ) ) /* Nozzle is even, so increment */ - line += lx5000dev->lineIncrement; - for ( ; line <= lastLine; line += ( lx5000dev->lineIncrement << 1 ) ) - { - _1stIndex = (uchar)( line & COLOUR_BUF_MASK ); - colourLines[_1stIndex].xByte = - startPtr.xByte + _1stIndex * lx5000dev->penLineLen; - colourLines[_1stIndex].xBit = startPtr.xBit; - } - /* Set up EVEN columns */ - startPtr.xByte -= headSepBytes; - for ( bit = 0; bit < headSepBits; bit++ ) - { - DEC_BIT( startPtr ); - } - line = _1stLine; - nozzle = _1stNozzle; /* Is 1st nozzle effectively even? */ - if ( nozzle & 1 ) /* Nozzle is odd, so increment */ - line += lx5000dev->lineIncrement; - for ( ; line <= lastLine; line += ( lx5000dev->lineIncrement << 1 ) ) - { - _1stIndex = (uchar)( line & COLOUR_BUF_MASK ); - colourLines[_1stIndex].xByte = - startPtr.xByte + _1stIndex * lx5000dev->penLineLen; - colourLines[_1stIndex].xBit = startPtr.xBit; - } - } -} - -/*----------------------------------------------------------------------* - * p r i n t S w i p e ( ) * - *----------------------------------------------------------------------* - *----------------------------------------------------------------------*/ -static void -printSwipe( lx5000_device *lx5000dev, byte *colourBufs[NUM_COLOURS], - bufBit - colourLines[NUM_COLOURS][PENS_PER_COLOUR][COLOUR_BUF_LINES], - penData pens[NUM_COLOURS][PENS_PER_COLOUR], - bool lineEmpty[NUM_COLOURS][COLOUR_BUF_LINES], byte *swipeBuf, - int *nextLineToPrint, int *nextLineToGet, int direction, - int _1stColour, int lastColour, FILE *prn_stream ) -{ - /*--------------------------------------------------------------------* - For unidirectional colour swathes, the effective print direction on - a 5000 is reversed. The implication of this is that, once the extent - of the printing columns has been determined, the data for the colour - pens must be fed to the head bit-reversed; i.e., set the bit pointer - to the last column to be printed, and decrement the bit pointer until - all of the columns have been printed. - *--------------------------------------------------------------------*/ - - static const char swipeHeader[SWIPE_HDR_LEN] = { - SWIPE_LEADER, - 0, 0, 0, 0, /* command length */ - 0, /* direction */ - 0, /* head speed */ - 0, 0, /* pen selector */ - 0, /* nozzle count */ - 0, /* don't know */ - 0, 0, /* number of columns */ - 0, 0, /* 1st column */ - 0, 0, /* last column */ - SWIPE_HDR_END - }; - - static const int wordsPerPen[NUM_COLOURS][PENS_PER_COLOUR + 1] = - { - { -1, - BLACK_NOZZLES / SWIPE_WORD_BITS, - BLACK_NOZZLES / SWIPE_WORD_BITS / 2 - }, - { -1, - _1COLOUR_NOZZLES / SWIPE_WORD_BITS, - _1COLOUR_NOZZLES / SWIPE_WORD_BITS / 2 - }, - { -1, - _1COLOUR_NOZZLES / SWIPE_WORD_BITS, - _1COLOUR_NOZZLES / SWIPE_WORD_BITS / 2 - }, - { -1, - _1COLOUR_NOZZLES / SWIPE_WORD_BITS, - _1COLOUR_NOZZLES / SWIPE_WORD_BITS / 2 - } - }; - - int _1stNozzle[NUM_COLOURS][PENS_PER_COLOUR]; - /* 1st active nozzle for pen */ - int lastNozzle[NUM_COLOURS][PENS_PER_COLOUR]; - /* Last nozzle of this pen */ - int _1stLine[NUM_COLOURS][PENS_PER_COLOUR]; - /* Line no. of first print line for pen */ - int _1stPenColumn[NUM_COLOURS][PENS_PER_COLOUR]; - int lastPenColumn[NUM_COLOURS][PENS_PER_COLOUR]; - /* Per-pen values... */ - int penExtent[NUM_COLOURS][PENS_PER_COLOUR]; - int _1stColumn; /* ...and overall values of... */ - int lastColumn; - int columnExtent; /* Column range after */ - /* stripping leading and trailing white space*/ - int column; /* Loop variable - current column */ - int line; /* Loop variables - line corresponding to - current nozzle & temp line variable. */ - uchar lineIndex; /* Circular index into pen buffer, - corresponding to current line. */ - int swipeCmdLen; /* Length of the swipe command */ - int colour, pen; - byte *outp; - int x_dpi = (int)( lx5000dev->x_pixels_per_inch + 0.1 ); - - /* Initialize worst case values for column - extremities. */ - _1stColumn = lx5000dev->penLineBytes * 8 - + 7 + lx5000dev->headSeparation; - lastColumn = 0; - /* Set up extents on a per-colour basis. */ - for ( colour = _1stColour; colour <= lastColour; colour++ ) - for ( pen = 0; pen < lx5000dev->pensPerColour; pen++ ) - { - _1stLine[colour][pen] = pens[colour][pen].nextPrintLine; - _1stNozzle[colour][pen] = _1stLine[colour][pen] - - pens[colour][pen].topLine; - lastNozzle[colour][pen] = pens[colour][pen].bottomLine - - pens[colour][pen].topLine; - - setColourColumnExtent( lx5000dev, colourBufs[colour], - lineEmpty[colour], _1stLine[colour][pen], - _1stNozzle[colour][pen], - pens[colour][pen].bottomLine, - &_1stPenColumn[colour][pen], - &lastPenColumn[colour][pen], - &penExtent[colour][pen] ); - /* Get the overall extents for the swipe */ - if ( _1stPenColumn[colour][pen] < _1stColumn ) - _1stColumn = _1stPenColumn[colour][pen]; - if ( lastPenColumn[colour][pen] > lastColumn ) - lastColumn = lastPenColumn[colour][pen]; - } - /* Set overall extent */ - columnExtent = ( lastColumn - _1stColumn ) + 1; - - /* Set the column range for each of the colour - pens now that the full extent is known. */ - for ( colour = _1stColour; colour <= lastColour; colour++ ) - for ( pen = 0; pen < lx5000dev->pensPerColour; pen++ ) - { - setColourLines( lx5000dev, colourBufs[colour], - colourLines[colour][pen], - _1stLine[colour][pen], _1stNozzle[colour][pen], - pens[colour][pen].bottomLine, direction, - _1stColumn, lastColumn ); - } - - memcpy( swipeBuf, swipeHeader, SWIPE_HDR_LEN ); - outp = swipeBuf + SWIPE_HDR_LEN; - /* For each column of the output, build two - stripes. One uses the standard directory - scheme, and the other uses the repeat - compression scheme. Output the more - compact result. */ - for ( column = _1stColumn; column <= lastColumn; column++ ) - { - ushort dataword; /* Loop transient - contents of swipe data - word currently under construction. */ - ushort lastWord; /* Last data word constructed for repeat - compression directory method. */ - int nozzle; /* Loop variable - current nozzle */ - /* The arrays of the two sets of data words - generated by each of the swipe construction - methods for a single swipe. Does not - include the 16 bit directory word. */ - int wordCount1; /* The count of words in the column arrays, */ - int wordCount2; /* below. */ - ushort column1[BLK_SWIPE_WORDS]; - ushort column2[BLK_SWIPE_WORDS]; - int columnWord; /* Current word within column. */ - bufBit *lineBit; /* Loop transient - current scan line bit */ - ushort wordBit; /* Current bit within swipe word - incremented - by right shifts. */ - ushort directoryBit; /* Current bit within directory word. It - indicates the currently active set of 16 - nozzles. Incremented by left shifts. */ - ushort directory1; /* The directories for the two methods. Each */ - ushort directory2; /* bit controls one following 16bit word. */ - - if ( _1stColour == BLACK_X ) - { - directory1 = (ushort)(BLK_DIRECTORY_MASK); /* empty */ - directory2 = (ushort)(BLK_DIRECTORY_MASK); /* empty */ - } - else - { - directory1 = (ushort)(COLOUR_DIRECTORY_MASK); /* empty */ - directory2 = (ushort)(COLOUR_DIRECTORY_MASK); /* empty */ - } - directory1 |= DIRECTORY_TYPE_BIT; /* Normal directory */ - directory2 &= ~DIRECTORY_TYPE_BIT; /* Repeat compression - directory */ - /* LSBit of directory refers to 1st following - word */ - directoryBit = 1; - lastWord = 0; - wordCount1 = 0; - wordCount2 = 0; - /* Note that the order of the pens in the - datawords (top nozzle to bottom) is - CMY, the reverse of the numbering */ - /*------------------------------------------ - N.B. What are the implications of this for - pen processing within a colour? - -----------------------------------------*/ - for ( colour = lastColour; colour >= _1stColour; colour-- ) - for ( pen = 0; pen < lx5000dev->pensPerColour; pen++ ) - { - dataword = 0; - nozzle = 0; - line = _1stLine[colour][pen]; - /* If there are any non-printing nozzles at - the top of the printhead, set up the entries - for them here. */ - while ( ( ( _1stNozzle[colour][pen] - nozzle ) - >= SWIPE_WORD_BITS ) - && ( nozzle <= lastNozzle[colour][pen] ) ) - { - if ( lastWord != 0 ) - { - directory2 &= ~directoryBit; - column2[ wordCount2++ ] = dataword; - lastWord = dataword; - } - nozzle += SWIPE_WORD_BITS; - directoryBit <<= 1; - } - /* Shift over any remaining empty bits in - the current column word. */ - wordBit = ( 1 << ( SWIPE_WORD_BITS - 1 )); - wordBit >>= ( _1stNozzle[colour][pen] - nozzle ); - - for ( columnWord = _1stNozzle[colour][pen] / SWIPE_WORD_BITS; - columnWord < - wordsPerPen[colour][lx5000dev->pensPerColour]; - columnWord++ ) - { - while ( wordBit ) - { - lineIndex = (uchar)( line & COLOUR_BUF_MASK ); - /* Get the bit from the next line */ - lineBit = &colourLines[colour][pen][lineIndex]; - if ( *(lineBit->xByte) & lineBit->xBit ) - dataword |= wordBit; - wordBit >>= 1; - if ( direction == LEFTWARD ) - { - DEC_BIT( *lineBit ); - } - else - { - INC_BIT( *lineBit ); - } - line += lx5000dev->lineIncrement; - } - /* Do we have a non-null dataword? */ - if ( dataword )/* For normal compression, every nonempty */ - { /* dataword is noted and sent to printer */ - directory1 &= ~directoryBit; - column1[ wordCount1++ ] = dataword; - } - if ( dataword != lastWord ) /* For repeat compression, */ - { /* only datawords which change are recorded */ - directory2 &= ~directoryBit; - column2[ wordCount2++ ] = dataword; - lastWord = dataword; - } - /* Look at next set of nozzles */ - directoryBit <<= 1; - dataword = 0; - /* Reset dataword bit mask to 1st bit */ - wordBit = ( 1 << ( SWIPE_WORD_BITS - 1 )); - } - } - /* Output the smaller array of column words - - is it normal or repeat compressed? */ - if ( wordCount1 < wordCount2 ) - { /* A normal directory + data */ - int i; - - *outp++ = directory1 >> 8; - *outp++ = directory1 & 0xff; - for ( i = 0; i < wordCount1; i++ ) - { - *outp++ = column1[ i ] >> 8; - *outp++ = column1[ i ] & 0xff; - } - } - else - { /* A repeat compression directory + data */ - int i; - - *outp++ = directory2 >> 8; - *outp++ = directory2 & 0xff; - for ( i = 0; i < wordCount2; i++ ) - { - *outp++ = column2[ i ] >> 8; - *outp++ = column2[ i ] & 0xff; - } - } - } - /* Set up the header and output the swipe */ - swipeCmdLen = outp - swipeBuf; - { - int ps1, ps2, direction, density, nozzles; - - direction = UNIDIRECTIONAL; - if ( x_dpi == 300 ) - { - density = _300X; - } - else - { - if ( x_dpi == 1200 ) - density = _1200X; - else - density = _600X; - } - - if ( _1stColour == BLACK_X ) - { - ps1 = BLACK0; - ps2 = BLACK1; - nozzles = _208NOZZLES; - } - else - { - ps1 = COLOUR0; - ps2 = COLOUR1; - nozzles = _192NOZZLES; - } - FILL_SWIPE_HEADER( swipeBuf, swipeCmdLen, direction, density, - ps1, ps2, nozzles, UNKNOWN1VAL, - columnExtent, _1stColumn, lastColumn ); - } - fwrite( swipeBuf,1, outp - swipeBuf, prn_stream ); - - for ( colour = _1stColour; colour <= lastColour; colour++ ) - for ( pen = 0; pen < lx5000dev->pensPerColour; pen++ ) - { - /* Scan the buffer for the next print line, - if present. If not, set sentinel value. */ - if ( pens[colour][pen].nextPrintLine - <= pens[colour][pen].bottomLine - || pens[colour][pen].nextPrintLine >= *nextLineToGet ) - { - pens[colour][pen].nextPrintLine = - pens[YELLOW_X][LO_PEN].finalLine; - line = pens[colour][pen].bottomLine + 1; - while ( line < *nextLineToGet ) - { - lineIndex = (uchar)( line & COLOUR_BUF_MASK ); - if ( ! lineEmpty[colour][ lineIndex ] ) - { - pens[colour][pen].nextPrintLine = line; - break; - } - line += lx5000dev->lineIncrement; - } - } - } -} - -/*----------------------------------------------------------------------* - * l x 5 0 0 0 _ p r i n t _ p a g e ( ) * - *----------------------------------------------------------------------* - Send the page to the printer. - *----------------------------------------------------------------------*/ -static int -lx5000_print_page( gx_device_printer *pdev, FILE *prn_stream ) -{ - /* - Data structures for the buffer: - - ------------------------------------------------------------------* - C O L O U R B U F F E R S - ------------------------------------------------------------------* - The colour buffers contain the individual colour bits that will - actually be passed to the print heads; therefore, there is one bit - per printable element. So far, the correspondence between the - gx_color_index elements in the scan line and the individual print - bits is 1-to-1. - - For the colour driver, the colour buffers will be: - Cbuffer, Mbuffer, Ybuffer and Kbuffer - while for the black driver, only Kbuffer is used. - (See BUFFER HANDLING MACROS.) - - ------------------------------------------------------------------* - D E T E R M I N I N G B U F F E R S I Z E - ------------------------------------------------------------------* - The colour buffers are circular buffers: in order to implement this - characteristic, the size of the buffer must be 2^n. The buffers may - then be indexed by the scan line number, masked by 2^n - 1. - - The buffer must be able to accommodate the maximum range of scan - lines that might be affected by a single swipe command. For colour - pens this is 240 ( 3 x 64 pens + 2 x 24 inter-pen gaps). For the - black pen, this is 208. Therefore, the minimum buffer size is 256. - In fact, this is probably also the optimal buffer size, as there seems - to be no advantage in buffering twice the number of scan line required - to hold any individual swipe. - - ------------------------------------------------------------------* - S T R U C T U R E O F T H E C O L O U R B U F F E R S - ------------------------------------------------------------------* - The colour buffers hold the data for individual colour printheads, - extracted from the original data provided as scan lines. When the - data for each colour is extracted from the scan line, it is placed - into a line of the colour buffer corresponding to the scan line. - - Within each line of the colour buffer, the data is structured like so: - +-------+------------------- ~ ---------------------+-------+ - | Pad | Scan line data bits for one colour | Pad | - | bytes | | bytes | - +-------+-------------------------------------------+-------+ - - When the scan line data is first processed, the colour data is copied - into the colour buffer in the position indicated above. This line of - data is padded on both ends. The size of the pad is sufficient to - account for the number of bits of head separation between the EVEN - and ODD rows of nozzles in each print head; by default 16. - - The individual lines are accessed through an array of colourLines struct- - ures. This is defined in the TYPEDEFS & EXTERNAL STORAGE secion above. - - The colourLines structure contains a byte pointer which points to one of - the bytes of an individual colour buffer line, and an unsigned char - which is a single bit mask isolating one bit of the byte pointed to by - the other element. - typedef struct bufBit_s { - byte * xByte; - uchar xBit; - } bufBit; - - The colourLines structure holds one instance of a bufBit; it points to - the first bit of the scan line. In general, the bit pointers for the - first bit of the EVEN columns will point to the beginning of the - extracted scan line data. For the ODD columns, the first bit - will point into the leading PAD bytes by 16 bits before the start of - the actual scan line data. - - In this way, all of the complications of managing the separation - between the EVEN and ODD columns on the heads is contained in the - set-up procedures for the pointers in the scanLines array. If it is - required to reverse the adjustments of EVEN and ODD columns (for bi- - directional printing, for example) this is achieved by adjusting the - firstBit entries in this array. - - That, at any rate, is the theory. It seemed like a good idea at the - time. - - */ - - static const unsigned char init_string[] = { - 0xa5, 0, 6, 0x40, 3, 3, 0xc0, 0x0f, 0x0f, - 0xa5, 0, 3, 0x40, 4, 5, - 0xa5, 0, 3, 0x40, 4, 6, - 0xa5, 0, 3, 0x40, 4, 7, - 0xa5, 0, 3, 0x40, 4, 8, - 0xa5, 0, 4, 0x40, 0xe0, 0xb, 3, - 0xa5, 0, 11, 0x40, 0xe0, 0x41, 0, 0, 0, 0, 0, 0, 0, A5_11_5000, - 0xa5, 0, 6, 0x40, 5, 0, 0, 0x80, 0, - 0x1b, '*', 7, 0x73, 0x30, - 0x1b, '*', 'm', 0, 0x14, 3, 0x84, 2, 0, 1, 0xf4, - 0x1b, '*', 7, 0x63, - 0x1b, '*', 'm', 0, 0x42, 0, 0, - 0xa5, 0, 5, 0x40, 0xe0, 0x80, 8, 7 - }; - - byte *lineBuffer; - byte *swipeBuffer; - byte *colourBufs[ NUM_COLOURS ]; - bufBit colourLines[NUM_COLOURS][PENS_PER_COLOUR][COLOUR_BUF_LINES]; - bool lineEmpty[ NUM_COLOURS ][ COLOUR_BUF_LINES ]; - penData pens[ NUM_COLOURS ][ PENS_PER_COLOUR ]; - /* nextLineToPrint is the top unprinted line - in the buffers. It is adjusted as lines - are processed and printed. Its sentinel - value is pens[YELLOW_X][LO_PEN].finalLine. - When any line - which is not blank is read from GS & - processed, nextLineToPrint will be set to - this line if it is less than the current - value. - - nextLineToGet is the next scanline to read - from GS. */ - int nextLineToPrint; - int nextLineToGet = 0; - /* The current bottom line position of - the colour cartridge. */ - int bottomYellowLine; - int retval; - - lx5000_device *lx5000dev = (lx5000_device *)pdev; - - nextLineToPrint = pens[YELLOW_X][LO_PEN].finalLine; - bottomYellowLine = INITIAL_YELLOW_BOTTOM_LINE; - /* Allocate the buffer storage */ - if ( ( retval = getColourBufs( lx5000dev, &lineBuffer, colourBufs, - &swipeBuffer, ALLOCATE ) )) - return retval; - - initPenConstants( lx5000dev, pens ); - /* Initialize the lineEmpty[] and pens[] arrays - - should happen during parameter setup process */ - { - int colour, pen, line; - - for ( colour = 0; - colour < lx5000dev->color_info.num_components; - colour++ ) - { - for ( pen = 0; pen < lx5000dev->pensPerColour; pen++ ) - { - pens[colour][pen].nextPrintLine = - pens[YELLOW_X][LO_PEN].finalLine; - - pens[colour][pen].bottomLine = - pens[colour][pen].initialBottomLine; - pens[colour][pen].topLine = - bottomYellowLine - - pens[colour][pen].topToBottomYellow; - } - for ( line = 0; line < COLOUR_BUF_LINES; line++ ) - /* Force the zeroing of the line first time through */ - lineEmpty[colour][line] = false; - } - } - - /* Initialize the printer and reset margins. */ - pageInit( (uchar)lx5000dev->alignA, (uchar)lx5000dev->alignB, prn_stream ); - fwrite( init_string, 1, sizeof( init_string ), prn_stream ); - - /*--------------------------------------------------------------* - Assume that COLOUR_BUF_LINES of data are available, starting with - nextLineToPrint. Work out which cartridge will be doing the - printing, and how far it will have to move. - - Something is available to be printed. This may (should?) involve - initial paper movement to line up the appropriate pen. Deciding - on when to move the paper and by how much is tricky. One aim is - to minimize paper movements. - - Check for black vs colour printing first. If the required - movement for any of the colour pens is less than the required - movement for the black pen, print a colour swathe, adjust all of - the colour buffer values, and the nextLineToPrint value if - necessary. - - Then refreshBuffer() and take another look. Sooner or later, - the next required movement of the colour cartridge will exceed - the movement required of the black cartridge. Print a black - swathe. Whether to move the black cartridge for this print is - determined by checking on the subsequent colour cartridge - movement. - - If the difference between the required movement for the black - and the required movement for the colour is less than or equal - to one colour pen depth, do not move the pen before printing the - black swathe. - - Adjust black buffer values, including nextLineToPrint, which will - (almost?) certainly change after a black print. refreshBuffer() - and try again. - - A note on 192 vs 208 black swathes. I can see the reasons for - using the 192 swathes. When printing solid blocks with some of - each colour and black on each scan line, use of 192 nozzles - obviates the need for any black-related head movement. A black - swathe can be printed on every third movement of the heads, and, - in the circumstances sketched above, will use all 192 nozzles. - - Obviously, the same simple algorithm can be used when the colours - are less densely packed. The Alignment B value, coded into the - header of every swipe command, automatically adjusts the first - pen of the set of 192 within a range of 0-15, so that the 192 - nozzles are symmetrically arranged with respect to the colour - pens. The complication is that the EVEN/ODD status of the - nozzles in the 208 set is unaffected, even though the numbering - may change. - - It originally seemed to me that it was completely unnecessary - to use the 192 nozzle set. The alignment value was needed to - get the positioning right, but for all other purposes, the - 208 set could be used, and adjustments made on the fly. - However, I when considering the printing of pseudo 1200Y - pages, which involves the use of half-height pseudo-pens, it - became clear that the calculation of the half-height of a - pens would be greatly simplified by the use of 192 nozzles. - This would leave the height of a pseudo-pen at an integral - number of 16-bit datawords. - - As a result, I will use 192 nozzles only when printing at - Nx1200Ydpi. - - *--------------------------------------------------------------*/ - refreshBuffer( lx5000dev, &nextLineToGet, &nextLineToPrint, - lineBuffer, colourBufs, colourLines, pens, lineEmpty ); - while ( nextLineToPrint < pdev->height ) - { - int blackDirection = RIGHTWARD; - int colourDirection = LEFTWARD; - /* Target of next move of colour cartridge */ - int nextColourLine; - int nextBlack208Line = cartridgeMoveTo( lx5000dev, pens, - BLACK_X, - BLACK_X ); - - /* In Black-only mode, cartridgeMoveTo - will return an off-page value for the - colour pens. */ - nextColourLine = cartridgeMoveTo( lx5000dev, pens, - _1ST_CMY_COLOUR, - LAST_CMY_COLOUR ); - if ( lx5000dev->isCMYK && nextColourLine <= nextBlack208Line ) - { /* Move the head & print a 3-colour swathe */ - feedPaper( lx5000dev, nextColourLine, &bottomYellowLine, pens, - prn_stream ); - printSwipe( lx5000dev, colourBufs, colourLines, pens, - lineEmpty, swipeBuffer, - &nextLineToPrint, &nextLineToGet, colourDirection, - _1ST_CMY_COLOUR, LAST_CMY_COLOUR, - prn_stream ); - } - else - { - feedPaper( lx5000dev, nextBlack208Line, &bottomYellowLine, - pens, prn_stream ); - printSwipe( lx5000dev, colourBufs, colourLines, pens, - lineEmpty, swipeBuffer, - &nextLineToPrint, &nextLineToGet, blackDirection, - BLACK_X, BLACK_X, - prn_stream ); - } - refreshBuffer( lx5000dev, &nextLineToGet, &nextLineToPrint, - lineBuffer, colourBufs, colourLines, pens, lineEmpty ); - } /* ends the loop for swipes of the print head.*/ - - /* Eject the page, reinitialize the printer */ - pageEnd( prn_stream ); - fflush( prn_stream ); - getColourBufs( lx5000dev, &lineBuffer, colourBufs, &swipeBuffer, - DEALLOCATE ); - if ( lx5000dev->dryTime ) - sleep( lx5000dev->dryTime ); - - return 0; -} - -/* - * There are a number of parameters which can differ between ink cartridges. - * The Windows driver asks you to recalibrate every time you load a new - * cartridge. - * - * [The Lexmark 5700 black - * cartridge has two columns of dots, separated by about 16 pixels. - * This `head separation' distance can vary between cartridges, so - * we provide a parameter to set it. In my small experience I've not - * set the corresponding parameter in windows to anything greater than 17 - * or smaller than 15, but it would seem that it can vary from 1 to 32, - * based on the calibration choices offered. - * Stephen Taylor's comment on the 5700 ] - * - * N.B. The above discussion relates to the 5700. On the 5000, in the - * Windows driver at any rate, there is no adjustment for the pixel - * distance between the rows of jets on the one print head. - * - * There are, however, two values which are always encoded into the initial - * escape sequence that the Windows driver sends to the printer for each - * new page: alignA the horizontal alignment between the colour and the - * black pens, and alignB, the vertical alignment between the same pens. - * - * AlignC is a black-only alignment, which seems to have something to do - * with bi-directional alignment. - * - * AlignD is a colour-only alignment, corresponding to AlignC. - * - * [As I understand the rules laid out in gsparams.h, - * lx5000_get_params is supposed to return the current values of parameters - * and lx5000_put_params is supposed to set up values in the lx5000_device - * structure which can be used by the lx5000_print_page routine. - * I've copied my routines from gdevcdj.c - * Stephen Taylor] - * - * DryingTime is a delay to allow page drying before a new page is fed - * through. - * - * CMYK is a boolean parameter which specifies colour capability. Set - * -dCMYK=false for black-only printing. - * - * See lx5000_put_params() for the legal ranges of values for these parameters. - * - */ - -/*----------------------------------------------------------------------* - * l x 5 0 0 0 b _ g e t _ p a r a m s ( ) * - *----------------------------------------------------------------------*/ -static int -lx5000_get_params( gx_device *pdev, gs_param_list *plist ) -/*----------------------------------------------------------------------*/ -{ - lx5000_device *lx5000dev = (lx5000_device *)pdev; - int code = gdev_prn_get_params( pdev, plist ); - - if ( code < 0 || - ( code = - param_write_int( plist, "HeadSeparation", - &lx5000dev->headSeparation )) < 0 || - ( code = param_write_int(plist, "AlignA", &lx5000dev->alignA)) < 0 || - ( code = param_write_int(plist, "AlignB", &lx5000dev->alignB)) < 0 || - ( code = param_write_bool( plist, "CMYK", &lx5000dev->isCMYK )) < 0 || - ( code = param_write_bool( plist, - "DryingTime", &lx5000dev->dryTime )) < 0 - ) - return code; - - return code; -} - -/*----------------------------------------------------------------------* - * l x 5 0 0 0 b _ p u t _ p a r a m _ i n t ( ) * - *----------------------------------------------------------------------*/ -static int -lx5000_put_param_int( - gs_param_list *plist, gs_param_name pname, - int *pvalue, int minval, int maxval, int ecode - ) -/*----------------------------------------------------------------------*/ -{ - int code, value; - - switch ( code = param_read_int( plist, pname, &value ) ) - { - default: - return code; - case 0: - if ( value < minval || value > maxval ) - { - code = - param_signal_error( plist, pname, gs_error_rangecheck ); - ecode = ( code < 0 ? code : ecode ); - } - else - *pvalue = value; - case 1: - return ecode; - } -} - -/*----------------------------------------------------------------------* - * l x 5 0 0 0 b _ p u t _ p a r a m _ b o o l ( ) * - *----------------------------------------------------------------------*/ -static int -lx5000_put_param_bool( - gs_param_list *plist, gs_param_name pname, - bool *pvalue, int ecode - ) -/*----------------------------------------------------------------------*/ -{ - int code; - - switch ( code = param_read_bool( plist, pname, pvalue ) ) - { - default: - ecode = code; - param_signal_error(plist, pname, ecode); - return code; - case 1: - case 0: - return ecode; - } -} - -/*----------------------------------------------------------------------* - * l x 5 0 0 0 b _ p u t _ p a r a m s ( ) * - *----------------------------------------------------------------------*/ -static int -lx5000_put_params( gx_device *pdev, gs_param_list *plist ) -/*----------------------------------------------------------------------*/ -/* put_params is supposed to check all the parameters before setting any. */ -/*----------------------------------------------------------------------*/ -{ - lx5000_device *lx5000dev = (lx5000_device *)pdev; - - int ecode, code = 0; - int headSeparation = lx5000dev->headSeparation; - int alignA = lx5000dev->alignA; - int alignB = lx5000dev->alignB; - int dryTime = lx5000dev->dryTime; - int bitsPerPixel = lx5000dev->isCMYK ? 4 : 1; - int oldBPP = bitsPerPixel; - bool isCMYK = lx5000dev->isCMYK; - bool isCMYK_old = isCMYK; - - code = lx5000_put_param_int( plist, "HeadSeparation", &headSeparation, - 8, 24, code ); /* 8 - 24 columns */ - - code = lx5000_put_param_int( plist, "AlignA", &alignA, 0, 30, code ); - /* 0 - 30 columns */ - - code = lx5000_put_param_int( plist, "AlignB", &alignB, 0, 15, code ); - /* 0 -15 nozzles */ - - code = lx5000_put_param_int( plist, "DryingTime", &dryTime, 0, 60, code ); - /* 0 -60 seconds */ - - code = lx5000_put_param_int - ( plist, "BitsPerPixel", &bitsPerPixel, 1, 4, code ); - /* Black cartridge only */ - - code = lx5000_put_param_bool( plist, "CMYK", &isCMYK, code ); - /* Black cartridge only */ - - /* Take precautions against input errors */ - if ( bitsPerPixel != 1 ) { bitsPerPixel = 4; } - - if ( isCMYK != isCMYK_old || bitsPerPixel != oldBPP ) - { - bool isCMYK_new; - /* What has changed? Assume that initial values were consistent, - and set isCMYK to a value consistent with the changed args - If both have changed, give precedence to isCMYK - */ - if ( bitsPerPixel != oldBPP ) - { - if ( bitsPerPixel == 1 ) - { isCMYK_new = false; } - else - { isCMYK_new = true; }; - } - if ( isCMYK != isCMYK_old ) - { isCMYK_new = isCMYK; } - - isCMYK = isCMYK_new; - bitsPerPixel = isCMYK ? 4 : 1; - - if ( isCMYK ) - { - lx5000dev->color_info = color_info_cmy; - dev_proc(pdev, map_cmyk_color) = lx5000_map_cmyk_color; - dev_proc(pdev, map_rgb_color) = NULL; - dev_proc(pdev, map_color_rgb) = lx5000_map_color_rgb; - } - else - { - lx5000dev->color_info = color_info_blk; - dev_proc(pdev, map_cmyk_color) = NULL; - dev_proc(pdev, map_rgb_color) = gdev_prn_map_rgb_color; - dev_proc(pdev, map_color_rgb) = gdev_prn_map_color_rgb; - } - if ( pdev->is_open ) - gs_closedevice(pdev); - } - - /* call super class put_params */ - ecode = gdev_prn_put_params( pdev, plist ); - - if ( ecode < 0 || code < 0 ) - { - if ( isCMYK != isCMYK_old ) - { - if ( ! isCMYK ) - { - lx5000dev->color_info = color_info_cmy; - dev_proc(pdev, map_cmyk_color) = lx5000_map_cmyk_color; - dev_proc(pdev, map_rgb_color) = NULL; - dev_proc(pdev, map_color_rgb) = lx5000_map_color_rgb; - } - else - { - lx5000dev->color_info = color_info_blk; - dev_proc(pdev, map_cmyk_color) = NULL; - dev_proc(pdev, map_rgb_color) = gdev_prn_map_rgb_color; - dev_proc(pdev, map_color_rgb) = gdev_prn_map_color_rgb; - } - if ( pdev->is_open ) - gs_closedevice(pdev); - } - return ecode < 0 ? ecode : code; - } - - /* looks like everything okay; */ - /* go ahead and set parameters */ - lx5000dev->headSeparation = headSeparation; - lx5000dev->alignA = alignA; - lx5000dev->alignB = alignB; - lx5000dev->dryTime = dryTime; - lx5000dev->isCMYK = isCMYK; - /* N.B. I am only setting these values here - - should they also be set as part of the "two - phase commit" of parameter changes? My - code is the only place these things are - accessed. */ - if ( lx5000dev->y_pixels_per_inch == MAX_LX5000_Y ) - { - lx5000dev->pensPerColour = 2; - lx5000dev->lineIncrement = 2; - } - else - { - lx5000dev->pensPerColour = 1; - lx5000dev->lineIncrement = 1; - } - if ( code == 1 ) return ecode; - return 0; -} - -/*----------------------------------------------------------------------* - * The following colour handling procedures are lifted from gdevbit.c - *----------------------------------------------------------------------*/ -/* Map color to RGB. This has 3 separate cases, but since it is rarely */ -/* used, we do a case test rather than providing 3 separate routines. */ -static int -lx5000_map_color_rgb(gx_device * dev, gx_color_index color, - gx_color_value rgb[3]) -{ - int depth = dev->color_info.depth; - int ncomp = dev->color_info.num_components; - int bpc = depth / ncomp; - uint mask = (1 << bpc) - 1; - -#define cvalue(c) ((gx_color_value)((ulong)(c) * gx_max_color_value / mask)) - - /* Map CMYK back to RGB. */ - - gx_color_index cshift = color; - uint c, m, y, k; - - k = cshift & mask; - cshift >>= bpc; - y = cshift & mask; - cshift >>= bpc; - m = cshift & mask; - c = cshift >> bpc; - /* We use our improved conversion rule.... */ - rgb[0] = cvalue((mask - c) * (mask - k) / mask); - rgb[1] = cvalue((mask - m) * (mask - k) / mask); - rgb[2] = cvalue((mask - y) * (mask - k) / mask); - - return 0; -#undef cvalue -} - -/* Map CMYK to color. */ -static gx_color_index -lx5000_map_cmyk_color(gx_device * dev, const gx_color_value cv[]) -{ - int bpc = dev->color_info.depth / 4; - int drop = sizeof(gx_color_value) * 8 - bpc; - gx_color_value cyan = cv[0], magenta = cv[1], yellow = cv[2], black = cv[3]; - gx_color_index color = - ((((((cyan >> drop) << bpc) + - (magenta >> drop)) << bpc) + - (yellow >> drop)) << bpc) + - (black >> drop); - - return (color == gx_no_color_index ? color ^ 1 : color); -} - -/*=============== Clean up my #define's =================*/ -#undef A5_11_5000 -#undef A5_11_5700 -#undef ALIGN_A_DEF -#undef ALIGN_A_OFFSET -#undef ALIGN_B_DEF -#undef ALIGN_B_OFFSET -#undef HEADSEP_DEF -#undef DRY_TIME_DEF -#undef LX_UNI -#undef MIN_LX5000_X -#undef MAX_LX5000_X -#undef DEF_LX5000_X -#undef MIN_LX5000_Y -#undef MAX_LX5000_Y -#undef DEF_LX5000_Y -#undef LX5000_XDPI -#undef LX5000_YDPI -#undef FEED_FACTOR -#undef LX5000_XOFFSET_TO_0_0_XDPI -#undef LX5000_YOFFSET_TO_0_0_YDPI -#undef LX5000_XOFFSET_TO_0_0 -#undef LX5000_YOFFSET_TO_0_0 -#undef LX5000_LEFT_HWMARGIN_INS -#undef LX5000_BOTTOM_HWMARGIN_INS -#undef LX5000_RIGHT_HWMARGIN_INS -#undef LX5000_TOP_HWMARGIN_INS -#undef LINE_PAD_BYTES -#undef RIGHTWARD -#undef LEFTWARD -#undef SWIPE_WORD_BITS -#undef BLACK_NOZZLES -#undef _1COLOUR_NOZZLES -#undef BLK_COLOUR_NOZZLES -#undef BLK_SWIPE_WORDS -#undef COLOUR_SWIPE_WORDS -#undef _1COLOUR_WORDS -#undef BLK_DIRECTORY_MASK -#undef COLOUR_DIRECTORY_MASK -#undef DIRECTORY_TYPE_BIT -#undef COLOUR_PEN_GAP -#undef COLOUR_PEN_DIFF -#undef INITIAL_YELLOW_BOTTOM_LINE -#undef COLOUR_BUF_MASK -#undef COLOUR_BUF_LINES -#undef SWIPE_LEADER -#undef CMDLEN_X -#undef DIRECTION_X -#undef UNIDIRECTIONAL -#undef BIDIRECTIONAL -#undef HEADSPEED_X -#undef _300X -#undef _600X -#undef _1200Y -#undef PEN_X -#undef BLACK0 -#undef BLACK1 -#undef COLOUR0 -#undef COLOUR1 -#undef NOZZLE_COUNT_X -#undef _192NOZZLES -#undef _208NOZZLES -#undef UNKNOWN1_X -#undef UNKNOWN1VAL -#undef NUM_COLUMNS_X -#undef _1ST_COLUMN_X -#undef LAST_COLUMN_X -#undef SWIPE_HDR_END_X -#undef SWIPE_HDR_END_LEN -#undef SWIPE_HDR_END -#undef SWIPE_HDR_LEN -#undef BLACK_X -#undef YELLOW_X -#undef MAGENTA_X -#undef CYAN_X -#undef LO_PEN -#undef HI_PEN -#undef NUM_COMPONENTS_BLK -#undef BITS_PER_PIXEL_BLK -#undef MAX_GREY_BLK -#undef MAX_RGB_BLK -#undef DITHER_GREYS_BLK -#undef DITHER_COLOURS_BLK -#undef NUM_COMPONENTS_CMY -#undef BITS_PER_PIXEL_CMY -#undef MAX_GREY_CMY -#undef MAX_RGB_CMY -#undef DITHER_GREYS_CMY -#undef DITHER_COLOURS_CMY -#undef MIN_COLOUR -#undef MAX_COLOUR -#undef BLACK_PEN -#undef _1ST_CMY_COLOUR -#undef LAST_CMY_COLOUR -#undef BPP -#undef PIXEL_MASK -#undef INITIAL_PIXEL_SHIFT -#undef NUM_COLOURS -#undef PENS_PER_COLOUR -#undef NUM_PENS -#undef BITS_PER_COLOUR -#undef DEF_NUM_COLOURS -#undef DEF_PENS_PER_COLOUR -#undef DEF_LINE_INCREMENT -#undef PIXELS_PER_BYTE -#undef COLOUR_MASK -#undef ALLOCATE -#undef DEALLOCATE -#undef FILL_SWIPE_HEADER -#undef BIT_TO_MASK -#undef INC_BIT -#undef DEC_BIT -#undef lx5000_proctab diff -Nru ghostscript-9.04~dfsg/contrib/japanese/gdevmjc.c ghostscript-9.05~dfsg~20120125/contrib/japanese/gdevmjc.c --- ghostscript-9.04~dfsg/contrib/japanese/gdevmjc.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/contrib/japanese/gdevmjc.c 2011-11-12 18:29:08.000000000 +0000 @@ -401,13 +401,13 @@ code = put_param_int(plist, "Yellow", &yellow, 0, INT_MAX, code); code = put_param_int(plist, "Black", &black, 0, INT_MAX, code); - if ((code == param_read_bool(plist, + if ((code = param_read_bool(plist, (param_name = "Unidirectional"), &direction))< 0) { param_signal_error(plist, param_name, ecode = code); } - if ((code == param_read_bool(plist, + if ((code = param_read_bool(plist, (param_name = "Microweave"), µweave))< 0) { param_signal_error(plist, param_name, ecode = code); diff -Nru ghostscript-9.04~dfsg/contrib/lips4/gdevl4v.c ghostscript-9.05~dfsg~20120125/contrib/lips4/gdevl4v.c --- ghostscript-9.04~dfsg/contrib/lips4/gdevl4v.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/contrib/lips4/gdevl4v.c 2011-09-29 11:01:34.000000000 +0000 @@ -78,6 +78,8 @@ #include "gdevvec.h" #if 0 #include "gdevpstr.h" +#else +#include "spprint.h" #endif #include "ghost.h" #include "gzstate.h" diff -Nru ghostscript-9.04~dfsg/contrib/pcl3/doc/reports.txt ghostscript-9.05~dfsg~20120125/contrib/pcl3/doc/reports.txt --- ghostscript-9.04~dfsg/contrib/pcl3/doc/reports.txt 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/contrib/pcl3/doc/reports.txt 2011-09-29 11:01:34.000000000 +0000 @@ -1,18 +1,18 @@ #****************************************************************************** -# File: @(#)$Id: reports.txt,v 2.13 2001/08/14 16:20:35 Martin Rel $ +# File: @(#)$Id: reports.txt,v 2.16+ 2003/05/07 15:24:17 Martin Exp $ # Contents: Hardware compatibility reports for pcl3 # Author: Martin Lottermoser, Greifswaldstrasse 28, 38124 Braunschweig, -# Germany. E-mail: Martin.Lottermoser@t-online.de. +# Germany. Electronically: Martin.Lottermoser at t-online.de. # #****************************************************************************** # * -# Copyright (C) 2000, 2001 by Martin Lottermoser * +# Copyright (C) 2000, 2001, 2002, 2003 by Martin Lottermoser * # All rights reserved * # * #****************************************************************************** # # For a description of the format and the meaning of the entries in this file, -# see how-to-report.txt. +# see how-to-report.txt in the pcl3 distribution. # # The reports are sorted by the following criteria: # - company and printer name (basically alphabetically ascending) @@ -37,7 +37,6 @@ # (includes 2000Cse, 2000Cxi, and 2000CN) Name: Torsten Ian Smith -E-mail address: torstenian@get2net.dk Date: 2001-04-18 Printer: HP 2000C Version 9.5.1.R Ghostscript version: 6.50 @@ -47,7 +46,6 @@ -sSubdevice=unspec -sMedium=plain -sPrintQuality=1 Name: Torsten Ian Smith -E-mail address: torstenian@get2net.dk Date: 2001-04-08 Printer: HP 2000C Version 9.5.1.R Ghostscript version: 6.01 @@ -62,7 +60,6 @@ # Hewlett-Packard 2500CM Professional Series Color Printer (model C2685A) Name: Ian Leonard -E-mail address: ghostscript@denver.com.au Date: 2001-07-17 Printer: HP Deskjet 2500CM C2685A FW-8.3.6 Ghostscript version: 6.50 @@ -79,17 +76,56 @@ Success: -sDEVICE=pcl3 -sSubdevice=unspec -dSendNULs=600 -sPJLLanguage=PCL3GUI -dOnlyCRD -r300 -sColourModel=CMYK -dBlackLevels=4 -dCMYLevels=4 -sPrintQuality=presentation - -sMedium=transparency -dCompressionMethod=9 + -sMedium=transparency -dCompressionMethod=9. The above worked only if the command << /PCLInit1 <1B2A6F375708090000070101> >> setpagedevice was included before the document to be printed. #****************************************************************************** +# Hewlett-Packard DesignJet 500 42" (non-PS) (Wide-format printer) + +Name: Sergey Zaikov +Date: 21.04.2003 +Printer: HP DesignJet 500 42", Engine F/W:A.02.01 +Ghostscript version: AFPL, revision 704 +pcl3 version: 3.3 +Remarks: 1. Really needs gamma-correction. + 2. I didn't try to print with 300dpi. +Success: gs -sDEVICE=pcl3 -sSubdevice=unspec -sPJLLanguage=PCL3GUI -dOnlyCRD \ + -r600 -sColourModel=CMYK -dCMYLevels=4 -sPrintQuality=presentation\ + -sMedium=plain -sIntensityRendering=Floyd-Steinberg \ + -sOutputFile=levels-test.prn levels-test.ps +Remarks: -sIntensityRendering other then Floyd-Steinberg gives blank fields + from 0 to 17 at test with 43 levels. + -sIntensityRendering=halftone doesn't need gamma-correction, + but black fields from 0 to 27 are blank. + -dCMYLevels=2 leads to the insertion of broad white horizontal stripes + (height 13+/-0.5 mm) between parts of the page. + +#****************************************************************************** + +# Hewlett-Packard DeskJet 670C + +Name: Francesco Potortì +Date: 2003-02-20 +Printer: hp deskjet 670c +Ghostscript version: Debian gs 6.53-3 (GPL) +pcl3 version: 3.3 +Success: -sDEVICE=pcl3 -sModel=unspec + -r300 -sColourMode=mono -sPrintQuality=draft. +Success: -sDEVICE=pcl3 -sModel=unspec + -r600 -sColourMode=mono -sPrintQuality=draft. +Success: -sDEVICE=pcl3 -sModel=unspec + -r600 -sColourMode=mono -sPrintQuality=presentation. +Success: -sDEVICE=pcl3 -sModel=unspec + -r600 -sColourMode=CMYK -sPrintQuality=presentation. + +#****************************************************************************** + # Hewlett-Packard DeskJet 697C Name: Oliver Schurr -E-mail address: schurro@georgetown.edu Date: 2001-02-02 Printer: Hewlett-Packard DeskJet 697C Ghostscript version: AFPL GS 6.50 @@ -107,7 +143,6 @@ # Hewlett-Packard DeskJet 850C (model C2145A) Name: Martin Lottermoser -E-mail address: Martin.Lottermoser@t-online.de Date: 2000-10-21 Printer: Hewlett-Packard DeskJet 850C, model C2145A, revision: 9.20 01/14/95 Ghostscript version: Aladdin ghostscript 6.01 @@ -162,10 +197,27 @@ #****************************************************************************** +# Hewlett-Packard DeskJet 940C + +Name: Francesco Potortì +Date: 2003-02-20 +Printer: hp deskjet 940c +Ghostscript version: Debian gs 6.53-3 (GPL) +pcl3 version: 3.3 +Success: -sDEVICE=pcl3 -sModel=unspec + -r300 -sColourMode=mono -sPrintQuality=draft. +Success: -sDEVICE=pcl3 -sModel=unspec + -r600 -sColourMode=mono -sPrintQuality=draft. +Success: -sDEVICE=pcl3 -sModel=unspec + -r600 -sColourMode=mono -sPrintQuality=presentation. +Success: -sDEVICE=pcl3 -sModel=unspec + -r600 -sColourMode=CMYK -sPrintQuality=presentation. + +#****************************************************************************** + # Hewlett-Packard DeskJet 970C (model C6429A) Name: Patrick Brison -E-mail address: pbn@rtbf.be Date: 2001/01/29 Printer: DeskJet970Cxi (model C6429A) Serial Number: ES989130ZPJQ @@ -293,7 +345,6 @@ # Hewlett-Packard DeskJet 1100C Name: Klaus Reimann -E-mail address: Klaus.Reimann@itap.physik.uni-stuttgart.de Date: 2000-12-08 Printer: HP DJ 1100C Ghostscript version: 6.30 @@ -304,7 +355,6 @@ Name: Klaus Reimann -E-mail address: Klaus.Reimann@itap.physik.uni-stuttgart.de Date: 2000-12-08 Printer: HP DJ 1100C Ghostscript version: 6.30 @@ -487,3 +537,43 @@ BOTTOM: 17/48" LEFT: 7/48" RIGHT: 17/48" + +#****************************************************************************** + +# Xerox WorkCentre M940 + +Name: Rafael Escovar +Date: 2002-03-18 +Printer: Xerox WorkCentre M940 +Ghostscript version: GNU 6.53 +pcl3 version: 3.3 + +Remarks: I have problems when printing multipage documents. + This is fixed using -dConfigureEveryPage=true (which I shall omit + in the Success and Failure lines). + +Success: -sDEVICE=pcl3 -sSubdevice=unspec -r600 -sPrintQuality=normal + -sMedium=plain -sColorModel=Gray. + I get perfect output. Grayscaling seems to be correct. + There was an excess of black ink which was fixed preprocessing a file + with postscript command: + {0.3 exp} settransfer + +Success: -sDEVICE=pcl3 -sSubdevice=unspec -r600 -sPrintQuality=normal + -sMedium=plain -sColorModel=CMY+K. + I get perfect output. + +Failure: -sDEVICE=pcl3 -sSubdevice=unspec -r600x300 -sPrintQuality=normal + -sMedium=plain -sColorModel=Gray or CMY+K. + The output is Ok, but flat. What was printed in one page before gets + printed in half a page. + +Failure: -sDEVICE=pcl3 -sSubdevice=unspec -r300 -sPrintQuality=normal + -sMedium=plain -sColorModel=Gray or CMY+K. + The output is partly readable but very overlapped. + +Failure: -sDEVICE=pcl3 -sSubdevice=unspec -r600 -sPrintQuality=normal + -sMedium=plain -sColorModel=CMYK. + CMYK mode seems not to work with my printer. Although I get perfectly clear + output the color disposition is not correct (I get blanks where there should + be color). diff -Nru ghostscript-9.04~dfsg/cups/cups.mak ghostscript-9.05~dfsg~20120125/cups/cups.mak --- ghostscript-9.04~dfsg/cups/cups.mak 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/cups/cups.mak 2011-11-12 18:35:10.000000000 +0000 @@ -55,7 +55,7 @@ if [ "$(CUPSPDFTORASTER)" = "1" ]; then \ $(INSTALL_PROGRAM) $(GSTORASTER_XE) $(DESTDIR)$(CUPSSERVERBIN)/filter; \ fi - $(INSTALL_PROGRAM) cups/pstopxl $(DESTDIR)$(CUPSSERVERBIN)/filter + $(INSTALL_PROGRAM) cups/gstopxl $(DESTDIR)$(CUPSSERVERBIN)/filter -mkdir -p $(DESTDIR)$(CUPSSERVERROOT) if [ "$(CUPSPDFTORASTER)" = "1" ]; then \ $(INSTALL_DATA) cups/gstoraster.convs $(DESTDIR)$(CUPSSERVERROOT); \ diff -Nru ghostscript-9.04~dfsg/cups/gdevcups.c ghostscript-9.05~dfsg~20120125/cups/gdevcups.c --- ghostscript-9.04~dfsg/cups/gdevcups.c 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/cups/gdevcups.c 2011-10-06 06:43:10.000000000 +0000 @@ -77,6 +77,10 @@ #include #include +/* the extremely noisy DEBUG2 messages are now dependent on CUPS_DEBUG2 */ +/* this can be enabled during the 'make' or by uncommenting the following */ +/* #define CUPS_DEBUG2 */ + #undef private #define private @@ -171,7 +175,7 @@ private dev_proc_open_device(cups_open); private int cups_print_pages(gx_device_printer *, FILE *, int); private int cups_put_params(gx_device *, gs_param_list *); -private void cups_set_color_info(gx_device *); +private int cups_set_color_info(gx_device *); private dev_proc_sync_output(cups_sync_output); private prn_dev_proc_get_space_params(cups_get_space_params); @@ -225,6 +229,7 @@ unsigned short EncodeLUT[gx_max_color_value + 1];/* RGB value to output color LUT */ int Density[CUPS_MAX_VALUE + 1];/* Density LUT */ int Matrix[3][3][CUPS_MAX_VALUE + 1];/* Color transform matrix LUT */ + int user_icc; int cupsRasterVersion; /* Used by cups_put_params(): */ @@ -425,7 +430,10 @@ {0x00}, /* DecodeLUT */ {0x00}, /* EncodeLUT */ {0x00}, /* Density */ - {0x00}, /* Matrix */ + {{{0x00},{0x00},{0x00}}, + {{0x00},{0x00},{0x00}}, + {{0x00},{0x00},{0x00}}}, /* Matrix */ + 0, /* user_icc */ 3 /* cupsRasterVersion */ }; @@ -451,9 +459,9 @@ private int cups_close(gx_device *pdev) /* I - Device info */ { -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf1("DEBUG2: cups_close(%p)\n", pdev); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ dprintf("INFO: Rendering completed\n"); @@ -549,9 +557,9 @@ i ++) ci = (ci << shift) | cups->EncodeLUT[cv[i]]; -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf2("DEBUG2: cv[0]=%d -> %llx\n", cv[0], ci); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ /* * Handle 6-color output... @@ -731,6 +739,8 @@ else return -1; break; + default: + break; } return -1; } @@ -756,9 +766,9 @@ cups_get_matrix(gx_device *pdev, /* I - Device info */ gs_matrix *pmat) /* O - Physical transform matrix */ { -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf2("DEBUG2: cups_get_matrix(%p, %p)\n", pdev, pmat); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ /* * Set the raster width and height... @@ -776,9 +786,9 @@ /* * Do landscape orientation... */ -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf("DEBUG2: Landscape matrix: XX=0 XY=+1 YX=+1 YY=0\n"); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ pmat->xx = 0.0; pmat->xy = (float)cups->header.HWResolution[1] / 72.0; pmat->yx = (float)cups->header.HWResolution[0] / 72.0; @@ -791,9 +801,9 @@ /* * Do portrait orientation... */ -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf("DEBUG2: Portrait matrix: XX=+1 XY=0 YX=0 YY=-1\n"); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ pmat->xx = (float)cups->header.HWResolution[0] / 72.0; pmat->xy = 0.0; pmat->yx = 0.0; @@ -815,7 +825,7 @@ } #endif /* CUPS_RASTER_SYNCv1 */ -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf2("DEBUG2: width = %d, height = %d\n", cups->header.cupsWidth, cups->header.cupsHeight); dprintf4("DEBUG2: PageSize = [ %d %d ], HWResolution = [ %d %d ]\n", @@ -826,7 +836,7 @@ pdev->HWMargins[3]); dprintf6("DEBUG2: matrix = [ %.3f %.3f %.3f %.3f %.3f %.3f ]\n", pmat->xx, pmat->xy, pmat->yx, pmat->yy, pmat->tx, pmat->ty); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ } @@ -847,24 +857,24 @@ bool b; /* Temporary boolean value */ -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf2("DEBUG2: cups_get_params(%p, %p)\n", pdev, plist); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ /* * First process the "standard" page device parameters... */ -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf("DEBUG2: before gdev_prn_get_params()\n"); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ if ((code = gdev_prn_get_params(pdev, plist)) < 0) return (code); -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf("DEBUG2: after gdev_prn_get_params()\n"); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ /* * Then write the CUPS parameters... @@ -1052,9 +1062,9 @@ return (code); #endif /* CUPS_RASTER_SYNCv1 */ -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf("DEBUG2: Leaving cups_get_params()\n"); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ return (0); } @@ -1075,9 +1085,9 @@ cache_units[255]; /* Cache size units */ -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf2("DEBUG2: cups_get_space_params(%p, %p)\n", pdev, space_params); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ if ((cache_env = getenv("RIP_MAX_CACHE")) != NULL) { @@ -1106,9 +1116,9 @@ if (cache_size == 0) return; -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf1("DEBUG2: cache_size = %.0f\n", cache_size); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ space_params->MaxBitmap = (long)cache_size; space_params->BufferSpace = (long)cache_size; @@ -1156,10 +1166,10 @@ ciel, ciea, cieb; /* CIE Lab colors */ -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf6("DEBUG2: cups_map_cmyk(%p, %d, %d, %d, %d, %p)\n", pdev, c, m, y, k, out); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ /* * Convert the CMYK color to the destination colorspace... @@ -1182,15 +1192,18 @@ case CUPS_CSPACE_RGB : case CUPS_CSPACE_RGBW : + c0 = c + k; + c1 = m + k; + c2 = y + k; if (cups->header.cupsColorSpace == CUPS_CSPACE_RGBW) { - c0 = c; - c1 = m; - c2 = y; - c3 = k; - } else { - c0 = c + k; - c1 = m + k; - c2 = y + k; + if ((k >= frac_1 - 1) || + ((c0 >= frac_1) && (c1 >= frac_1) && (c2 >= frac_1))) { + c0 = frac_1; + c1 = frac_1; + c2 = frac_1; + c3 = frac_1; + } else + c3 = 0; } if (c0 < 0) @@ -1212,11 +1225,12 @@ out[2] = frac_1 - (frac)cups->Density[c2]; if (cups->header.cupsColorSpace == CUPS_CSPACE_RGBW) { - if (c3 < 0) - c3 = 0; - else if (c3 > frac_1) - c3 = frac_1; - out[3] = frac_1 - (frac)cups->Density[c3]; + if (c3 == 0) + out[3] = frac_1; + else if (c3 == frac_1) + out[3] = 0; + else + out[3] = frac_1; } break; @@ -1578,7 +1592,7 @@ # endif /* CUPS_RASTER_HAVE_COLORIMETRIC */ } -#ifdef DEBUG +#ifdef CUPS_DEBUG2 switch (cups->color_info.num_components) { default : @@ -1596,7 +1610,7 @@ out[0], out[1], out[2], out[3]); break; } -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ } @@ -1609,10 +1623,10 @@ frac g, /* I - Grayscale value */ frac *out) /* O - Device colors */ { -#ifdef DEBUG2 +#ifdef CUPS_DEBUG22 dprintf3("DEBUG2: cups_map_gray(%p, %d, %p)\n", pdev, g, out); -#endif /* DEBUG2 */ +#endif /* CUPS_DEBUG22 */ /* * Just use the CMYK mapper... @@ -1640,10 +1654,10 @@ int tc, tm, ty; /* Temporary color values */ -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf6("DEBUG2: cups_map_rgb(%p, %p, %d, %d, %d, %p)\n", pdev, pis, r, g, b, out); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ /* * Compute CMYK values... @@ -1732,17 +1746,19 @@ y = cv[2]; k = cv[3]; -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf5("DEBUG2: cups_map_cmyk_color(%p, %d, %d, %d, %d)\n", pdev, c, m, y, k); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ /* * Setup the color info data as needed... */ - if (pdev->color_info.num_components == 0) - cups_set_color_info(pdev); + if (pdev->color_info.num_components == 0) { + if (cups_set_color_info(pdev) < 0) + return(gx_no_color_index); + } /* * Density correct... @@ -1862,10 +1878,10 @@ break; } -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf9("DEBUG2: CMYK (%d,%d,%d,%d) -> CMYK %08x (%d,%d,%d,%d)\n", c, m, y, k, (unsigned)i, ic, im, iy, ik); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ /* * Make sure we don't get a CMYK color of 255, 255, 255, 255... @@ -1892,21 +1908,23 @@ gx_color_value c, m, y, k, divk; /* Colors, Black & divisor */ -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf3("DEBUG2: cups_map_color_rgb(%p, %d, %p)\n", pdev, (unsigned)color, prgb); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ /* * Setup the color info data as needed... */ - if (pdev->color_info.num_components == 0) - cups_set_color_info(pdev); + if (pdev->color_info.num_components == 0) { + if (cups_set_color_info(pdev) < 0) + return(gx_no_color_index); + } -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf1("DEBUG2: COLOR %08x = ", (unsigned)color); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ /* * Extract the color components from the color index... @@ -2034,10 +2052,15 @@ * cups->DecodeLUT actually maps to RGBW, not CMYK... */ - k = cups->DecodeLUT[c3]; - c = cups->DecodeLUT[c0] + k - gx_max_color_value; - m = cups->DecodeLUT[c1] + k - gx_max_color_value; - y = cups->DecodeLUT[c2] + k - gx_max_color_value; + if (c3 == 0) { + c = 0; + m = 0; + y = 0; + } else { + c = cups->DecodeLUT[c0]; + m = cups->DecodeLUT[c1]; + y = cups->DecodeLUT[c2]; + } if (c > gx_max_color_value) prgb[0] = gx_max_color_value; @@ -2125,9 +2148,9 @@ # endif /* CUPS_RASTER_HAVE_COLORIMETRIC */ } -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf3("DEBUG2: RGB values: %d,%d,%d\n", prgb[0], prgb[1], prgb[2]); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ return (0); } @@ -2159,16 +2182,18 @@ g = cv[1]; b = cv[2]; -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf4("DEBUG2: cups_map_rgb_color(%p, %d, %d, %d)\n", pdev, r, g, b); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ /* * Setup the color info data as needed... */ - if (pdev->color_info.num_components == 0) - cups_set_color_info(pdev); + if (pdev->color_info.num_components == 0) { + if (cups_set_color_info(pdev) < 0) + return(gx_no_color_index); + } /* * Do color correction as needed... @@ -2282,20 +2307,20 @@ switch (cups->header.cupsBitsPerColor) { default : - i = 0x0e; + i = 0x00; break; case 2 : - i = 0xfc; + i = 0x00; break; case 4 : - i = 0xfff0; + i = 0x0000; break; case 8 : - i = 0xffffff00; + i = 0x00000000; break; #ifdef GX_COLOR_INDEX_TYPE case 16 : - i = 0xffffffffffff0000; + i = 0x0000000000000000; break; #endif /* GX_COLOR_INDEX_TYPE */ } @@ -2418,10 +2443,10 @@ #endif /* GX_COLOR_INDEX_TYPE */ } -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf8("DEBUG2: CMY (%d,%d,%d) -> CMYK %08x (%d,%d,%d,%d)\n", r, g, b, (unsigned)i, ic, im, iy, ik); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ break; case CUPS_CSPACE_YMCK : @@ -2677,9 +2702,9 @@ # endif /* CUPS_RASTER_HAVE_COLORIMETRIC */ } -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf4("DEBUG2: RGB %d,%d,%d = %08x\n", r, g, b, (unsigned)i); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ return (i); } @@ -2695,9 +2720,9 @@ { int code; /* Return status */ -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf1("DEBUG2: cups_open(%p)\n", pdev); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ dprintf("INFO: Start rendering...\n"); cups->printer_procs.get_space_params = cups_get_space_params; @@ -2708,7 +2733,9 @@ cups->page = 1; } - cups_set_color_info(pdev); + if ((code = cups_set_color_info(pdev)) < 0) { + return(code); + } if ((code = gdev_prn_open(pdev)) != 0) return (code); @@ -2741,10 +2768,10 @@ (void)fp; /* reference unused file pointer to prevent compiler warning */ -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf3("DEBUG2: cups_print_pages(%p, %p, %d)\n", pdev, fp, num_copies); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ /* * Figure out the number of bytes per line... @@ -2780,11 +2807,11 @@ srcbytes = gdev_prn_raster(pdev); -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf4("DEBUG2: cupsBitsPerPixel = %d, cupsWidth = %d, cupsBytesPerLine = %d, srcbytes = %d\n", cups->header.cupsBitsPerPixel, cups->header.cupsWidth, cups->header.cupsBytesPerLine, srcbytes); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ src = (unsigned char *)gs_malloc(pdev->memory->non_gc_memory, srcbytes, 1, "cups_print_pages"); @@ -2813,9 +2840,9 @@ { RasterVersion = ppdFindAttr(cups->PPD, "cupsRasterVersion", NULL); if (RasterVersion) { -#ifdef DEBUG +#ifdef CUPS_DEBUG2 dprintf1("DEBUG2: cupsRasterVersion = %s\n", RasterVersion->value); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG2 */ cups->cupsRasterVersion = atoi(RasterVersion->value); if ((cups->cupsRasterVersion != 2) && (cups->cupsRasterVersion != 3)) { @@ -2847,11 +2874,11 @@ num_copies = 1; } -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf3("DEBUG2: cupsWidth = %d, cupsHeight = %d, cupsBytesPerLine = %d\n", cups->header.cupsWidth, cups->header.cupsHeight, cups->header.cupsBytesPerLine); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ for (copy = num_copies; copy > 0; copy --) { @@ -2929,10 +2956,13 @@ int xflip = 0, yflip = 0; int found = 0; - -#ifdef DEBUG + gs_param_string icc_pro_dummy; + int old_cmps = cups->color_info.num_components; + int old_depth = cups->color_info.depth; + +#ifdef CUPS_DEBUG dprintf2("DEBUG2: cups_put_params(%p, %p)\n", pdev, plist); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ /* * Process other options for CUPS... @@ -3024,6 +3054,11 @@ margins_set = param_read_float_array(plist, "Margins", &arrayval) == 0; color_set = param_read_int(plist, "cupsColorSpace", &intval) == 0 || param_read_int(plist, "cupsBitsPerColor", &intval) == 0; + + if (!cups->user_icc) { + cups->user_icc = param_read_string(plist, "OutputICCProfile", &icc_pro_dummy) == 0; + } + /* We set the old dimensions to 1 if we have a color depth change, so that memory reallocation gets forced. This is perhaps not the correct approach to prevent crashes like in bug 690435. We keep it for the @@ -3125,7 +3160,9 @@ cups->Profile = strdup((char *)stringval.data); } - cups_set_color_info(pdev); + if ((code = cups_set_color_info(pdev)) < 0) { + return(code); + } /* * Then process standard page device options... @@ -3134,12 +3171,20 @@ if ((code = gdev_prn_put_params(pdev, plist)) < 0) return (code); + /* If cups_set_color_info() changed the color model of the device we want to + * force the raster memory to be recreated/reinitialized + */ + if (cups->color_info.num_components != old_cmps || cups->color_info.depth != old_depth) { + width_old = 0; + height_old = 0; + } + else { /* pdev->width/height may have been changed by the call to * gdev_prn_put_params() */ - width_old = pdev->width; - height_old = pdev->height; - + width_old = pdev->width; + height_old = pdev->height; + } /* * Update margins/sizes as needed... */ @@ -3150,10 +3195,10 @@ * Compute the page margins... */ -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf2("DEBUG: Updating PageSize to [%.0f %.0f]...\n", cups->MediaSize[0], cups->MediaSize[1]); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ memset(margins, 0, sizeof(margins)); @@ -3161,31 +3206,31 @@ if (cups->PPD != NULL) { -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf1("DEBUG2: cups->header.Duplex = %d\n", cups->header.Duplex); dprintf1("DEBUG2: cups->header.Tumble = %d\n", cups->header.Tumble); dprintf1("DEBUG2: cups->page = %d\n", cups->page); dprintf1("DEBUG2: cups->PPD = %p\n", cups->PPD); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ backside = ppdFindAttr(cups->PPD, "cupsBackSide", NULL); if (backside) { -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf1("DEBUG2: cupsBackSide = %s\n", backside->value); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ cups->PPD->flip_duplex = 0; } -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf1("DEBUG2: cups->PPD->flip_duplex = %d\n", cups->PPD->flip_duplex); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ backsiderequiresflippedmargins = ppdFindAttr(cups->PPD, "APDuplexRequiresFlippedMargin", NULL); -#ifdef DEBUG +#ifdef CUPS_DEBUG if (backsiderequiresflippedmargins) dprintf1("DEBUG2: APDuplexRequiresFlippedMargin = %s\n", backsiderequiresflippedmargins->value); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ if (cups->header.Duplex && (cups->header.Tumble && @@ -3195,14 +3240,14 @@ xflip = 1; if (backsiderequiresflippedmargins && !strcasecmp(backsiderequiresflippedmargins->value, "False")) { -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf("DEBUG2: (1) Flip: X=1 Y=0\n"); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ yflip = 0; } else { -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf("DEBUG2: (1) Flip: X=1 Y=1\n"); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ yflip = 1; } } @@ -3214,14 +3259,14 @@ xflip = 0; if (backsiderequiresflippedmargins && !strcasecmp(backsiderequiresflippedmargins->value, "False")) { -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf("DEBUG2: (2) Flip: X=0 Y=1\n"); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ yflip = 1; } else { -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf("DEBUG2: (2) Flip: X=0 Y=0\n"); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ yflip = 0; } } @@ -3236,22 +3281,22 @@ xflip = 1; if (backsiderequiresflippedmargins && !strcasecmp(backsiderequiresflippedmargins->value, "True")) { -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf("DEBUG2: (3) Flip: X=1 Y=0\n"); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ yflip = 0; } else { -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf("DEBUG2: (3) Flip: X=1 Y=1\n"); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ yflip = 1; } } else { -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf("DEBUG2: (4) Flip: X=0 Y=0\n"); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ xflip = 0; yflip = 0; } @@ -3272,9 +3317,9 @@ } if (found == 0) cups->header.cupsPageSizeName[0] = '\0'; } -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf1("DEBUG2: cups->header.cupsPageSizeName = %s\n", cups->header.cupsPageSizeName); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ #endif /* CUPS_RASTER_SYNCv1 */ /* @@ -3312,9 +3357,9 @@ * Standard size... */ -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf1("DEBUG: size = %s\n", size->name); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ gx_device_set_media_size(pdev, size->width, size->length); @@ -3371,9 +3416,9 @@ * Standard size in landscape orientation... */ -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf1("DEBUG: landscape size = %s\n", size->name); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ gx_device_set_media_size(pdev, size->length, size->width); @@ -3398,9 +3443,9 @@ * Custom size... */ -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf("DEBUG: size = Custom\n"); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ cups->landscape = 0; @@ -3417,10 +3462,10 @@ } } -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf4("DEBUG: margins[] = [ %f %f %f %f ]\n", margins[0], margins[1], margins[2], margins[3]); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ } /* @@ -3479,10 +3524,10 @@ * Device is open and size has changed, so reallocate... */ -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf4("DEBUG2: Reallocating memory, [%.0f %.0f] = %dx%d pixels...\n", pdev->MediaSize[0], pdev->MediaSize[1], width, height); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ if ((code = gdev_prn_maybe_realloc_memory((gx_device_printer *)pdev, &sp_old, @@ -3490,10 +3535,10 @@ transp_old)) < 0) return (code); -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf4("DEBUG2: Reallocated memory, [%.0f %.0f] = %dx%d pixels...\n", pdev->MediaSize[0], pdev->MediaSize[1], width, height); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ } else { @@ -3501,10 +3546,10 @@ * Device isn't yet open, so just save the new width and height... */ -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf4("DEBUG: Setting initial media size, [%.0f %.0f] = %dx%d pixels...\n", pdev->MediaSize[0], pdev->MediaSize[1], width, height); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ pdev->width = width; pdev->height = height; @@ -3610,7 +3655,7 @@ cups->header.cupsWidth = cups->width; cups->header.cupsHeight = cups->height; -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf1("DEBUG2: ppd = %p\n", cups->PPD); dprintf2("DEBUG2: PageSize = [ %.3f %.3f ]\n", pdev->MediaSize[0], pdev->MediaSize[1]); @@ -3624,7 +3669,7 @@ dprintf4("DEBUG2: HWMargins = [ %.3f %.3f %.3f %.3f ]\n", pdev->HWMargins[0], pdev->HWMargins[1], pdev->HWMargins[2], pdev->HWMargins[3]); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ return (0); } @@ -3634,7 +3679,7 @@ * the required output. */ -private void +private int cups_set_color_info(gx_device *pdev) /* I - Device info */ { int i, j, k; /* Looping vars */ @@ -3643,11 +3688,11 @@ float m[3][3]; /* Color correction matrix */ char resolution[41]; /* Resolution string */ ppd_profile_t *profile; /* Color profile information */ - int code; + int code = 0; -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf1("DEBUG2: cups_set_color_info(%p)\n", pdev); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ #ifndef GX_COLOR_INDEX_TYPE if (cups->header.cupsBitsPerColor > 8) @@ -3901,22 +3946,22 @@ cups->EncodeLUT[i] = j; -#ifdef DEBUG +#ifdef CUPS_DEBUG if (i == 0 || cups->EncodeLUT[i] != cups->EncodeLUT[i - 1]) dprintf2("DEBUG2: cups->EncodeLUT[%d] = %d\n", i, (int)cups->EncodeLUT[i]); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ } -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf1("DEBUG2: cups->EncodeLUT[0] = %d\n", (int)cups->EncodeLUT[0]); dprintf2("DEBUG2: cups->EncodeLUT[%d] = %d\n", gx_max_color_value, (int)cups->EncodeLUT[gx_max_color_value]); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ for (i = 0; i < cups->color_info.dither_grays; i ++) cups->DecodeLUT[i] = gx_max_color_value * i / max_lut; -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf2("DEBUG: num_components = %d, depth = %d\n", cups->color_info.num_components, cups->color_info.depth); dprintf2("DEBUG: cupsColorSpace = %d, cupsColorOrder = %d\n", @@ -3927,7 +3972,7 @@ cups->color_info.max_gray, cups->color_info.dither_grays); dprintf2("DEBUG: max_color = %d, dither_colors = %d\n", cups->color_info.max_color, cups->color_info.dither_colors); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ /* * Set the color profile as needed... @@ -3941,9 +3986,9 @@ if (cups->Profile && cups->header.cupsBitsPerColor == 8) #endif /* dev_t_proc_encode_color */ { -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf1("DEBUG: Using user-defined profile \"%s\"...\n", cups->Profile); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ if (sscanf(cups->Profile, "%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f", &d, &g, m[0] + 0, m[0] + 1, m[0] + 2, @@ -3998,9 +4043,9 @@ if (i < cups->PPD->num_profiles) { -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf("DEBUG: Using color profile in PPD file!\n"); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ cups->HaveProfile = 1; @@ -4019,11 +4064,11 @@ { cups->Matrix[i][j][k] = (int)((float)k * m[i][j] + 0.5); -#ifdef DEBUG +#ifdef CUPS_DEBUG if ((k & 4095) == 0) dprintf4("DEBUG2: cups->Matrix[%d][%d][%d] = %d\n", i, j, k, cups->Matrix[i][j][k]); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ } @@ -4033,10 +4078,10 @@ pow((float)k / (float)CUPS_MAX_VALUE, g) + 0.5); -#ifdef DEBUG +#ifdef CUPS_DEBUG if ((k & 4095) == 0) dprintf2("DEBUG2: cups->Density[%d] = %d\n", k, cups->Density[k]); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ } } else @@ -4044,23 +4089,90 @@ for (k = 0; k <= CUPS_MAX_VALUE; k ++) cups->Density[k] = k; } - /* Set up the ICC profile for ghostscript to use based upon the color space. - This is different than the PPD profile above which appears to be some sort - of matrix based TRC profile */ - switch (cups->header.cupsColorSpace) { - /* Use RGB profile for this */ - case CUPS_CSPACE_RGBW: - if (pdev->icc_struct == NULL) { - pdev->icc_struct = gsicc_new_device_profile_array(pdev->memory); - } - if (pdev->icc_struct->device_profile[gsDEFAULTPROFILE] == NULL) { - code = gsicc_set_device_profile(pdev, pdev->memory, - DEFAULT_RGB_ICC, gsDEFAULTPROFILE); - } - break; - default: - break; + if (!cups->user_icc) { + /* Set up the ICC profile for ghostscript to use based upon the color space. + This is different than the PPD profile above which appears to be some sort + of matrix based TRC profile */ + switch (cups->header.cupsColorSpace) + { + default : + case CUPS_CSPACE_RGBW : + case CUPS_CSPACE_RGB : + case CUPS_CSPACE_RGBA : + case CUPS_CSPACE_CMY : + case CUPS_CSPACE_YMC : +# ifdef CUPS_RASTER_HAVE_COLORIMETRIC + case CUPS_CSPACE_CIELab : + case CUPS_CSPACE_ICC1 : + case CUPS_CSPACE_ICC2 : + case CUPS_CSPACE_ICC3 : + case CUPS_CSPACE_ICC4 : + case CUPS_CSPACE_ICC5 : + case CUPS_CSPACE_ICC6 : + case CUPS_CSPACE_ICC7 : + case CUPS_CSPACE_ICC8 : + case CUPS_CSPACE_ICC9 : + case CUPS_CSPACE_ICCA : + case CUPS_CSPACE_ICCB : + case CUPS_CSPACE_ICCC : + case CUPS_CSPACE_ICCD : + case CUPS_CSPACE_ICCE : + case CUPS_CSPACE_ICCF : +# endif /* CUPS_RASTER_HAVE_COLORIMETRIC */ + if (!pdev->icc_struct || (pdev->icc_struct && + pdev->icc_struct->device_profile[gsDEFAULTPROFILE]->data_cs != gsRGB)) { + + if (pdev->icc_struct) { + rc_decrement(pdev->icc_struct, "cups_set_color_info"); + } + pdev->icc_struct = gsicc_new_device_profile_array(pdev->memory); + + code = gsicc_set_device_profile(pdev, pdev->memory, + (char *)DEFAULT_RGB_ICC, gsDEFAULTPROFILE); + } + break; + + case CUPS_CSPACE_W : + case CUPS_CSPACE_WHITE : + case CUPS_CSPACE_K : + case CUPS_CSPACE_GOLD : + case CUPS_CSPACE_SILVER : + if (!pdev->icc_struct || (pdev->icc_struct && + pdev->icc_struct->device_profile[gsDEFAULTPROFILE]->data_cs != gsGRAY)) { + + if (pdev->icc_struct) { + rc_decrement(pdev->icc_struct, "cups_set_color_info"); + } + pdev->icc_struct = gsicc_new_device_profile_array(pdev->memory); + + code = gsicc_set_device_profile(pdev, pdev->memory->non_gc_memory, + (char *)DEFAULT_GRAY_ICC, gsDEFAULTPROFILE); + } + break; + case CUPS_CSPACE_KCMYcm : +# ifdef CUPS_RASTER_HAVE_COLORIMETRIC + case CUPS_CSPACE_CIEXYZ : +#endif + case CUPS_CSPACE_CMYK : + case CUPS_CSPACE_YMCK : + case CUPS_CSPACE_KCMY : + case CUPS_CSPACE_GMCK : + case CUPS_CSPACE_GMCS : + if (!pdev->icc_struct || (pdev->icc_struct && + pdev->icc_struct->device_profile[gsDEFAULTPROFILE]->data_cs != gsCMYK)) { + + if (pdev->icc_struct) { + rc_decrement(pdev->icc_struct, "cups_set_color_info"); + } + pdev->icc_struct = gsicc_new_device_profile_array(pdev->memory); + + code = gsicc_set_device_profile(pdev, pdev->memory, + (char *)DEFAULT_CMYK_ICC, gsDEFAULTPROFILE); + } + break; + } } + return(code); } /* @@ -4099,19 +4211,19 @@ ystart, yend, ystep; /* Loop control for scanline order */ ppd_attr_t *backside = NULL; -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf1("DEBUG2: cups->header.Duplex = %d\n", cups->header.Duplex); dprintf1("DEBUG2: cups->header.Tumble = %d\n", cups->header.Tumble); dprintf1("DEBUG2: cups->page = %d\n", cups->page); dprintf1("DEBUG2: cups->PPD = %p\n", cups->PPD); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ if (cups->PPD) { backside = ppdFindAttr(cups->PPD, "cupsBackSide", NULL); if (backside) { -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf1("DEBUG2: cupsBackSide = %s\n", backside->value); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ cups->PPD->flip_duplex = 0; } } @@ -4145,10 +4257,10 @@ ystep = 1; } -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf3("DEBUG: cups_print_chunked: xflip = %d, yflip = %d, height = %d\n", xflip, yflip, cups->height); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ /* * Loop through the page bitmap and write chunked pixels, reversing as @@ -4326,19 +4438,19 @@ ystart, yend, ystep; /* Loop control for scanline order */ ppd_attr_t *backside = NULL; -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf1("DEBUG2: cups->header.Duplex = %d\n", cups->header.Duplex); dprintf1("DEBUG2: cups->header.Tumble = %d\n", cups->header.Tumble); dprintf1("DEBUG2: cups->page = %d\n", cups->page); dprintf1("DEBUG2: cups->PPD = %p\n", cups->PPD); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ if (cups->PPD) { backside = ppdFindAttr(cups->PPD, "cupsBackSide", NULL); if (backside) { -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf1("DEBUG2: cupsBackSide = %s\n", backside->value); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ cups->PPD->flip_duplex = 0; } } @@ -4372,10 +4484,10 @@ ystep = 1; } -#ifdef DEBUG +#ifdef CUPS_DEBUG dprintf3("DEBUG: cups_print_chunked: xflip = %d, yflip = %d, height = %d\n", xflip, yflip, cups->height); -#endif /* DEBUG */ +#endif /* CUPS_DEBUG */ /* * Loop through the page bitmap and write banded pixels... We have diff -Nru ghostscript-9.04~dfsg/cups/gstopxl.in ghostscript-9.05~dfsg~20120125/cups/gstopxl.in --- ghostscript-9.04~dfsg/cups/gstopxl.in 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/cups/gstopxl.in 2011-11-12 18:36:12.000000000 +0000 @@ -0,0 +1,191 @@ +#!/bin/sh +# +# "$Id$" +# +# CUPS PCL XL/PCL 6 filter script for Ghostscript. +# +# Copyright 2001-2005 by Easy Software Products. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# + +# Installation directories... +prefix=@prefix@ +exec_prefix=@exec_prefix@ +bindir=@bindir@ + +# Set the library/font path... +GS_LIB="${CUPS_FONTPATH:=/usr/share/cups/fonts}" +export GS_LIB + +# Determine the PCL XL/PCL 6 driver to use... +if test "x$PPD" != x; then + colordevice=`grep '^*ColorDevice:' "$PPD" | awk -F: '{print $2}'` + case "$colordevice" in + *True* | *true*) + device="pxlcolor" + ;; + *) + device="pxlmono" + ;; + esac +else + device="pxlmono" +fi + +# Apply PPD settings. + +ps_code= +ppd_opts= + +resolution= +eval "$(printf "%s" "$5" | sed @SED_EXTENDED_REGEX_OPT@ 's/.*(^|[[:space:]])Resolution=([0-9.]+(x[0-9.]+)?).*/resolution="${resolution:-\2}"/p')" +if test -e "$PPD"; then + eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's/^\*DefaultResolution:[[:space:]]+([0-9.]+(x[0-9.]+)?).*/resolution="${resolution:-\1}"/p' "$PPD")" +fi +echo "DEBUG: Resolution: $resolution" >&2 +if test -n "$resolution"; then + ppd_opts="${ppd_opts:+$ppd_opts }-r$resolution" +fi + +pagesize= +eval "$(printf "%s" "$5" | sed @SED_EXTENDED_REGEX_OPT@ 's/.*(^|[[:space:]])(media|PageSize)=([^[:space:]]+).*/pagesize="${pagesize:-\3}"/p')" +if test -e "$PPD"; then + eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's/^\*DefaultPageSize:[[:space:]]+([^[:space:]]+).*/pagesize="${pagesize:-\1}"/p' "$PPD")" +fi +echo "DEBUG: Page size: $pagesize" >&2 +width= +height= +if test -n "$pagesize" && test -e "$PPD"; then + eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's|^\*PaperDimension[[:space:]]+'"$pagesize"'/[^:]+:[[:space:]]+"([^[:space:]]+)[[:space:]]+([^[:space:]]+)".*|width="\1"; height="\2"|p' "$PPD")" +fi +echo "DEBUG: Width: $width, height: $height" >&2 +if test -n "$width"; then + ppd_opts="${ppd_opts:+$ppd_opts }-dDEVICEWIDTHPOINTS=$width" +fi +if test -n "$height"; then + ppd_opts="${ppd_opts:+$ppd_opts }-dDEVICEHEIGHTPOINTS=$height" +fi + +bl_x= +bl_y= +tr_x= +tr_y= +if test -n "$pagesize" && test -e "$PPD"; then + eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's|^\*ImageableArea[[:space:]]+'"$pagesize"'/[^:]+:[[:space:]]+"([^[:space:]]+)[[:space:]]+([^[:space:]]+)[[:space:]]+([^[:space:]]+)[[:space:]]+([^[:space:]]+)".*|bl_x="\1"; bl_y="\2"; tr_x="\3"; tr_y="\4"|p' "$PPD")" +fi +echo "DEBUG: Absolute margins: $bl_x, $bl_y, $tr_x, $tr_y" >&2 +margin_l= +margin_b= +margin_r= +margin_t= +if test -n "$width" && test -n "$height" && \ + test -n "$bl_x" && test -n "$bl_y" && \ + test -n "$tr_x" && test -n "$tr_y"; then + margin_l="$bl_x" + margin_b="$bl_y" + margin_r="$(printf "scale=8; (%s)-(%s)\n" "$width" "$tr_x" | bc)" + margin_t="$(printf "scale=8; (%s)-(%s)\n" "$height" "$tr_y" | bc)" +fi +echo "DEBUG: Relative margins: $margin_l, $margin_b, $margin_r, $margin_t" >&2 +if test -n "$margin_l" && test -n "$margin_b" && \ + test -n "$margin_r" && test -n "$margin_t"; then + ps_code="${ps_code:+$ps_code }<>setpagedevice" +fi + +inputslot= +eval "$(printf "%s" "$5" | sed @SED_EXTENDED_REGEX_OPT@ 's/.*(^|[[:space:]])(InputSlot)=([^[:space:]]+).*/inputslot="${inputslot:-\3}"/p')" +if test -e "$PPD"; then + eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's/^\*DefaultInputSlot:[[:space:]]+([^[:space:]]+).*/inputslot="${inputslot:-\1}"/p' "$PPD")" +fi +echo "DEBUG: InputSlot: $inputslot" >&2 +inputslot_val= +if test -n "$inputslot" && test -e "$PPD"; then + eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's|^\*InputSlot[[:space:]]+'"$inputslot"'/[^:]+:[[:space:]]+"[[:space:]]*<[[:space:]]*<[[:space:]]*/MediaPosition[[:space:]]*([0-9]+)[[:space:]]*>[[:space:]]*>[[:space:]]*setpagedevice[[:space:]]*".*|inputslot_val="\1"|p' "$PPD")" +fi +echo "DEBUG: Value for MediaPosition: $inputslot_val" >&2 +if test -n "$inputslot_val"; then + ppd_opts="${ppd_opts:+$ppd_opts }-dMediaPosition=$inputslot_val" +fi + +colormodel= +eval "$(printf "%s" "$5" | sed @SED_EXTENDED_REGEX_OPT@ 's/.*(^|[[:space:]])(ColorModel)=([^[:space:]]+).*/colormodel="${colormodel:-\3}"/p')" +if test -e "$PPD"; then + eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's/^\*DefaultColorModel:[[:space:]]+([^[:space:]]+).*/colormodel="${colormodel:-\1}"/p' "$PPD")" +fi +echo "DEBUG: ColorModel: $colormodel" >&2 +if test "$colormodel" = "Gray"; then + device=pxlmono +fi +colormodel_val= +if test -n "$colormodel" && test -e "$PPD"; then + eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's|^\*ColorModel[[:space:]]+'"$colormodel"'/[^:]+:[[:space:]]+"[[:space:]]*<[[:space:]]*<[[:space:]]*/BitsPerPixel[[:space:]]*([0-9]*)[[:space:]]*>[[:space:]]*>[[:space:]]*setpagedevice[[:space:]]*".*|colormodel_val="\1"|p' "$PPD")" +fi +echo "DEBUG: Value for BitsPerPixel: $colormodel_val" >&2 +if test -n "$colormodel_val"; then + ppd_opts="${ppd_opts:+$ppd_opts }-dBitsPerPixel=$colormodel_val" +fi + +duplex= +eval "$(printf "%s" "$5" | sed @SED_EXTENDED_REGEX_OPT@ 's/.*(^|[[:space:]])(Duplex)=([^[:space:]]+).*/duplex="${duplex:-\3}"/p')" +if test -e "$PPD"; then + eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's/^\*DefaultDuplex:[[:space:]]+([^[:space:]]+).*/duplex="${duplex:-\1}"/p' "$PPD")" +fi +echo "DEBUG: Duplex: $duplex" >&2 +duplex_val= +tumble_val= +if test -n "$duplex" && test -e "$PPD"; then + eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's|^\*Duplex[[:space:]]+'"$duplex"'/[^:]+:[[:space:]]+"[[:space:]]*<[[:space:]]*<[[:space:]]*/Duplex[[:space:]]*([^[:space:]]*)[[:space:]]*(/Tumble[[:space:]]*([^[:space:]]*)[[:space:]]*)?>[[:space:]]*>[[:space:]]*setpagedevice[[:space:]]*".*|duplex_val="\1"; tumble_val="\3"|p' "$PPD")" +fi +echo "DEBUG: Value for Duplex: $duplex_val; Value for Tumble: $tumble_val" >&2 +if test -n "$duplex_val"; then + ppd_opts="${ppd_opts:+$ppd_opts }-dDuplex=$duplex_val" +fi +if test -n "$tumble_val"; then + ppd_opts="${ppd_opts:+$ppd_opts }-dTumble=$tumble_val" +fi + + +echo "DEBUG: PPD options: $ppd_opts" >&2 +echo "DEBUG: PostScript code from options: $ps_code" >&2 + +# Options we use with Ghostscript... +gsopts="-dQUIET -dPARANOIDSAFER -dNOPAUSE -dBATCH -dNOINTERPOLATE" +gsopts="$gsopts -sDEVICE=$device -sstdout=%stderr" + +# See if we have a filename on the command-line... +if [ -n "$6" ]; then + exec <"$6" +fi + +# We read the data into a temporary file as Ghostscript needs this to be +# able to also work with PDF input +tempfiles= +trap 'rm -f $tempfiles' 0 1 2 13 15 + +ifile=$(mktemp -t gstopxl.XXXXXX) +tempfiles="$tempfiles $ifile" + +cat >"$ifile" + +echo INFO: Starting GPL Ghostscript `$bindir/@GS@ --version`... 1>&2 +echo DEBUG: Running $bindir/@GS@ $gsopts $ppd_opts -sOUTPUTFILE="%stdout" -c "$ps_code" -f "$ifile" 1>&2 + +# Now run Ghostscript... +$bindir/@GS@ $gsopts $ppd_opts -sOUTPUTFILE="%stdout" -c "$ps_code" -f "$ifile" + +# +# End of "$Id$". +# diff -Nru ghostscript-9.04~dfsg/cups/pstopxl.in ghostscript-9.05~dfsg~20120125/cups/pstopxl.in --- ghostscript-9.04~dfsg/cups/pstopxl.in 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/cups/pstopxl.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,191 +0,0 @@ -#!/bin/sh -# -# "$Id$" -# -# CUPS PCL XL/PCL 6 filter script for Ghostscript. -# -# Copyright 2001-2005 by Easy Software Products. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# - -# Installation directories... -prefix=@prefix@ -exec_prefix=@exec_prefix@ -bindir=@bindir@ - -# Set the library/font path... -GS_LIB="${CUPS_FONTPATH:=/usr/share/cups/fonts}" -export GS_LIB - -# Determine the PCL XL/PCL 6 driver to use... -if test "x$PPD" != x; then - colordevice=`grep '^*ColorDevice:' "$PPD" | awk -F: '{print $2}'` - case "$colordevice" in - *True* | *true*) - device="pxlcolor" - ;; - *) - device="pxlmono" - ;; - esac -else - device="pxlmono" -fi - -# Apply PPD settings. - -ps_code= -ppd_opts= - -resolution= -eval "$(printf "%s" "$5" | sed @SED_EXTENDED_REGEX_OPT@ 's/.*(^|[[:space:]])Resolution=([0-9.]+(x[0-9.]+)?).*/resolution="${resolution:-\2}"/p')" -if test -e "$PPD"; then - eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's/^\*DefaultResolution:[[:space:]]+([0-9.]+(x[0-9.]+)?).*/resolution="${resolution:-\1}"/p' "$PPD")" -fi -echo "DEBUG: Resolution: $resolution" >&2 -if test -n "$resolution"; then - ppd_opts="${ppd_opts:+$ppd_opts }-r$resolution" -fi - -pagesize= -eval "$(printf "%s" "$5" | sed @SED_EXTENDED_REGEX_OPT@ 's/.*(^|[[:space:]])(media|PageSize)=([^[:space:]]+).*/pagesize="${pagesize:-\3}"/p')" -if test -e "$PPD"; then - eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's/^\*DefaultPageSize:[[:space:]]+([^[:space:]]+).*/pagesize="${pagesize:-\1}"/p' "$PPD")" -fi -echo "DEBUG: Page size: $pagesize" >&2 -width= -height= -if test -n "$pagesize" && test -e "$PPD"; then - eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's|^\*PaperDimension[[:space:]]+'"$pagesize"'/[^:]+:[[:space:]]+"([^[:space:]]+)[[:space:]]+([^[:space:]]+)".*|width="\1"; height="\2"|p' "$PPD")" -fi -echo "DEBUG: Width: $width, height: $height" >&2 -if test -n "$width"; then - ppd_opts="${ppd_opts:+$ppd_opts }-dDEVICEWIDTHPOINTS=$width" -fi -if test -n "$height"; then - ppd_opts="${ppd_opts:+$ppd_opts }-dDEVICEHEIGHTPOINTS=$height" -fi - -bl_x= -bl_y= -tr_x= -tr_y= -if test -n "$pagesize" && test -e "$PPD"; then - eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's|^\*ImageableArea[[:space:]]+'"$pagesize"'/[^:]+:[[:space:]]+"([^[:space:]]+)[[:space:]]+([^[:space:]]+)[[:space:]]+([^[:space:]]+)[[:space:]]+([^[:space:]]+)".*|bl_x="\1"; bl_y="\2"; tr_x="\3"; tr_y="\4"|p' "$PPD")" -fi -echo "DEBUG: Absolute margins: $bl_x, $bl_y, $tr_x, $tr_y" >&2 -margin_l= -margin_b= -margin_r= -margin_t= -if test -n "$width" && test -n "$height" && \ - test -n "$bl_x" && test -n "$bl_y" && \ - test -n "$tr_x" && test -n "$tr_y"; then - margin_l="$bl_x" - margin_b="$bl_y" - margin_r="$(printf "scale=8; (%s)-(%s)\n" "$width" "$tr_x" | bc)" - margin_t="$(printf "scale=8; (%s)-(%s)\n" "$height" "$tr_y" | bc)" -fi -echo "DEBUG: Relative margins: $margin_l, $margin_b, $margin_r, $margin_t" >&2 -if test -n "$margin_l" && test -n "$margin_b" && \ - test -n "$margin_r" && test -n "$margin_t"; then - ps_code="${ps_code:+$ps_code }<>setpagedevice" -fi - -inputslot= -eval "$(printf "%s" "$5" | sed @SED_EXTENDED_REGEX_OPT@ 's/.*(^|[[:space:]])(InputSlot)=([^[:space:]]+).*/inputslot="${inputslot:-\3}"/p')" -if test -e "$PPD"; then - eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's/^\*DefaultInputSlot:[[:space:]]+([^[:space:]]+).*/inputslot="${inputslot:-\1}"/p' "$PPD")" -fi -echo "DEBUG: InputSlot: $inputslot" >&2 -inputslot_val= -if test -n "$inputslot" && test -e "$PPD"; then - eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's|^\*InputSlot[[:space:]]+'"$inputslot"'/[^:]+:[[:space:]]+"[[:space:]]*<[[:space:]]*<[[:space:]]*/MediaPosition[[:space:]]*([0-9]+)[[:space:]]*>[[:space:]]*>[[:space:]]*setpagedevice[[:space:]]*".*|inputslot_val="\1"|p' "$PPD")" -fi -echo "DEBUG: Value for MediaPosition: $inputslot_val" >&2 -if test -n "$inputslot_val"; then - ppd_opts="${ppd_opts:+$ppd_opts }-dMediaPosition=$inputslot_val" -fi - -colormodel= -eval "$(printf "%s" "$5" | sed @SED_EXTENDED_REGEX_OPT@ 's/.*(^|[[:space:]])(ColorModel)=([^[:space:]]+).*/colormodel="${colormodel:-\3}"/p')" -if test -e "$PPD"; then - eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's/^\*DefaultColorModel:[[:space:]]+([^[:space:]]+).*/colormodel="${colormodel:-\1}"/p' "$PPD")" -fi -echo "DEBUG: ColorModel: $colormodel" >&2 -if test "$colormodel" = "Gray"; then - device=pxlmono -fi -colormodel_val= -if test -n "$colormodel" && test -e "$PPD"; then - eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's|^\*ColorModel[[:space:]]+'"$colormodel"'/[^:]+:[[:space:]]+"[[:space:]]*<[[:space:]]*<[[:space:]]*/BitsPerPixel[[:space:]]*([0-9]*)[[:space:]]*>[[:space:]]*>[[:space:]]*setpagedevice[[:space:]]*".*|colormodel_val="\1"|p' "$PPD")" -fi -echo "DEBUG: Value for BitsPerPixel: $colormodel_val" >&2 -if test -n "$colormodel_val"; then - ppd_opts="${ppd_opts:+$ppd_opts }-dBitsPerPixel=$colormodel_val" -fi - -duplex= -eval "$(printf "%s" "$5" | sed @SED_EXTENDED_REGEX_OPT@ 's/.*(^|[[:space:]])(Duplex)=([^[:space:]]+).*/duplex="${duplex:-\3}"/p')" -if test -e "$PPD"; then - eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's/^\*DefaultDuplex:[[:space:]]+([^[:space:]]+).*/duplex="${duplex:-\1}"/p' "$PPD")" -fi -echo "DEBUG: Duplex: $duplex" >&2 -duplex_val= -tumble_val= -if test -n "$duplex" && test -e "$PPD"; then - eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's|^\*Duplex[[:space:]]+'"$duplex"'/[^:]+:[[:space:]]+"[[:space:]]*<[[:space:]]*<[[:space:]]*/Duplex[[:space:]]*([^[:space:]]*)[[:space:]]*(/Tumble[[:space:]]*([^[:space:]]*)[[:space:]]*)?>[[:space:]]*>[[:space:]]*setpagedevice[[:space:]]*".*|duplex_val="\1"; tumble_val="\3"|p' "$PPD")" -fi -echo "DEBUG: Value for Duplex: $duplex_val; Value for Tumble: $tumble_val" >&2 -if test -n "$duplex_val"; then - ppd_opts="${ppd_opts:+$ppd_opts }-dDuplex=$duplex_val" -fi -if test -n "$tumble_val"; then - ppd_opts="${ppd_opts:+$ppd_opts }-dTumble=$tumble_val" -fi - - -echo "DEBUG: PPD options: $ppd_opts" >&2 -echo "DEBUG: PostScript code from options: $ps_code" >&2 - -# Options we use with Ghostscript... -gsopts="-dQUIET -dPARANOIDSAFER -dNOPAUSE -dBATCH -dNOINTERPOLATE" -gsopts="$gsopts -sDEVICE=$device -sstdout=%stderr" - -# See if we have a filename on the command-line... -if [ -n "$6" ]; then - exec <"$6" -fi - -# We read the data into a temporary file as Ghostscript needs this to be -# able to also work with PDF input -tempfiles= -trap 'rm -f $tempfiles' 0 1 2 13 15 - -ifile=$(mktemp -t pstopxl.XXXXXX) -tempfiles="$tempfiles $ifile" - -cat >"$ifile" - -echo INFO: Starting GPL Ghostscript `$bindir/@GS@ --version`... 1>&2 -echo DEBUG: Running $bindir/@GS@ $gsopts $ppd_opts -sOUTPUTFILE="%stdout" -c "$ps_code" -f "$ifile" 1>&2 - -# Now run Ghostscript... -$bindir/@GS@ $gsopts $ppd_opts -sOUTPUTFILE="%stdout" -c "$ps_code" -f "$ifile" - -# -# End of "$Id$". -# diff -Nru ghostscript-9.04~dfsg/cups/pxlcolor.ppd ghostscript-9.05~dfsg~20120125/cups/pxlcolor.ppd --- ghostscript-9.04~dfsg/cups/pxlcolor.ppd 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/cups/pxlcolor.ppd 2011-11-12 18:36:55.000000000 +0000 @@ -32,8 +32,8 @@ *Product: "(GPL Ghostscript)" *cupsVersion: 1.1 *cupsManualCopies: False -*cupsFilter: "application/vnd.cups-postscript 100 pstopxl" -*cupsFilter: "application/vnd.cups-pdf 0 pstopxl" +*cupsFilter: "application/vnd.cups-postscript 100 gstopxl" +*cupsFilter: "application/vnd.cups-pdf 0 gstopxl" *ModelName: "HP Color LaserJet Series PCL 6" *ShortNickName: "HP Color LaserJet Series PCL 6" *NickName: "HP Color LaserJet Series PCL 6 CUPS" diff -Nru ghostscript-9.04~dfsg/cups/pxlmono.ppd ghostscript-9.05~dfsg~20120125/cups/pxlmono.ppd --- ghostscript-9.04~dfsg/cups/pxlmono.ppd 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/cups/pxlmono.ppd 2011-11-12 18:37:23.000000000 +0000 @@ -32,8 +32,8 @@ *Product: "(GPL Ghostscript)" *cupsVersion: 1.1 *cupsManualCopies: False -*cupsFilter: "application/vnd.cups-postscript 100 pstopxl" -*cupsFilter: "application/vnd.cups-pdf 0 pstopxl" +*cupsFilter: "application/vnd.cups-postscript 100 gstopxl" +*cupsFilter: "application/vnd.cups-pdf 0 gstopxl" *ModelName: "HP LaserJet Series PCL 6" *ShortNickName: "HP LaserJet Series PCL 6" *NickName: "HP LaserJet Series PCL 6 CUPS" diff -Nru ghostscript-9.04~dfsg/debian/changelog ghostscript-9.05~dfsg~20120125/debian/changelog --- ghostscript-9.04~dfsg/debian/changelog 2011-11-24 06:02:08.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/debian/changelog 2012-01-25 23:09:30.000000000 +0000 @@ -1,3 +1,72 @@ +ghostscript (9.05~dfsg~20120125-0ubuntu1) precise; urgency=low + + * New upstream release + - GIT snapshot from January, 25 2012. + - Snapshot close before GS 9.05 upstream release to test for last bugs\ + before the release. + * debian/patches/020110812~46b4ee6-pxl-landscape.patch, + debian/patches/020110812~d9e044e-lips4v-fix.patch, + debian/patches/020110815-05b517b-gdevcups-c-eliminate-compiler-warning.patch, + debian/patches/020110815-1920f21-cups-raster-set-default-color-profiles.patch, + debian/patches/020110815-eb6b631-cups-raster-generate-cups-rgbw.patch, + debian/patches/020110816-781b738-cups-raster-fix-segfaults-on-color-model-change.patch, + debian/patches/020110816-d8da050-cups-raster-improve-black-recognition-on-cmyk-to-rgbw.patch, + debian/patches/020110817-766df64-cups-raster-suppress-warnings.patch, + debian/patches/020110819~fa67a1d.patch, + debian/patches/020110923-5688545-fix-setting-the-iccprofilesdir-userparam.patch, + debian/patches/020110923-7e048c5-dont-crash-when-not-finding-icc-profile.patch, + debian/patches/020111005-d5f1e72-clist-fix-for-rgbw-color-mode.patch, + debian/patches/020111114-4258227-lzw-encode-filter-fix.patch, + debian/patches/029111114-08dc129-ps2write-truetype-fix.patch, + debian/patches/020111122-5cce070-ps2write-postscript-duplex-command-insertion.patch, + debian/patches/020111122-cd8f397-ps2write-fix-handling-of-format-4-cmap-subtables-in-truetype-fonts.patch, + debian/patches/020111125-979f218-ps2write-fix-conversion-of-escaped-string-to-hex-string.patch, + debian/patches/020111209-5359a2d-do-not-use-hexadecimal-names-for-type42-charstrings-and-encoding.patch: Removed upstream patches. + * debian/patches/1001_autoconfigure_cms_choice.patch: Removed, build system + is appropriately approved by upstream. + * debian/rules: linked base/configure.ac and base/Makefile.in to package + root directory so that the autotools find them (needed on GIT snapshots). + * debian/rules, debian/control: Removed build dependency on liblcms1-dev, + icc34.h is shipped with Ghostscript now. + * debian/rules: Added ./icclib/ and ./openjpeg/ directories to + DEB_UPSTREAM_REPACKAGE_EXCLUDES and removed the files in Resource/CMap/ + (they are free now). + * debian/copyright: Added icclib/* and openjpeg/* to the list of excluded + files. Updated entries for the files in Resource/CMap/. Updated for renaming + cups/psto* to cups/gsto*. + * debian/symbols.common: Updated for new upstream source. Applied patch + which dpkg-gensymbols generated for debian/libgs9.symbols to this file. + * Merge from Debian testing, remaining changes (recover after accidental sync + in previous (upload): + - debian/control: + + Keep gs-common with dependency on ghostscript, still too many + packages assuming gs-common has the binaries. + + Really break and replace older ghostscript in libgs9-common. + - debian/control, debian/rules, debian/libgs__VER__.install.in, + debian/libgs-dev.install: Stop using d-shlibmove, it is not compatible + with libcms2. + - debian/rules, debian/ubuntu/apport-hook.py: Apport hook. + - debian/rules, debian/ghostscript-cups.ppd-updater: Added data file to + trigger the update of the PPD files of existing print queues by CUPS and + to tell CUPS which PPD files to use for the update and how to match them + with the PPDs of the existing queues. + - debian/rules: + + Generate ABI version number (variable "abi") correctly, cutting off + repackaging and pre-release parts. + + The scripts pv.sh and fixmswrd.pl are not shipped upstream any more, + so we do not need to delete them any more. + + Install ghostscript-cups.ppd-updater and remove the dependency on + cups-client from ghostscript-cups. + - debian/symbols.common: resync with Debian, with the exception of lcms2 + symbols which were only enabled in 9.04~dfsg-0ubuntu12 in Ubuntu. + - debian/copyright: update credits for the Ubuntu changes. + - debian/ghostscript.preinst: Use Ubuntu version numbers. + - debian/ghostscript-cups.postinst: Removed the post-install script which + was only there to update the PPDs of existing print queues. + - debian/watch: Search for .tar.bz2 source tarballs + + -- Till Kamppeter Wed, 25 Jan 2012 21:22:59 +0100 + ghostscript (9.04~dfsg-3) unstable; urgency=low [ Steve Langasek ] @@ -7,7 +76,7 @@ * Drop gs-gpl package: it was already a transitional package in lenny, and html2ps in squeeze is the last package to recommend it (nothing in wheezy references it). - * Eliminate the gs provides; nothing in squeeze or wheezy references it. + * Eliminate the gs provides; nothing in squeeze or wheezy references it. * Drop gs-common package: it was also transitional from lenny on, and latexmk in wheezy is the last package to reference it as a Suggests only. @@ -20,6 +89,134 @@ -- Jonas Smedegaard Thu, 24 Nov 2011 13:01:31 +0700 +ghostscript (9.04~dfsg-2ubuntu6) precise; urgency=low + + * debian/patches/020111209-5359a2d-do-not-use-hexadecimal-names-for-type42-charstrings-and-encoding.patch: + Do not use hexadecimal names for type42 Charstrings and Encoding. This fixes + substitution of certain characters by others when converting PDF to + PostScript with the "ps2write" output device (LP: #898532, upstream bug + #692711) + * debian/patches/020111125-979f218-ps2write-fix-conversion-of-escaped-string-to-hex-string.patch: + ps2write: Fix conversion of escaped string to Hex string (LP: #902145, + upstream bug #692612). + + -- Till Kamppeter Fri, 9 Dec 2011 13:45:59 +0100 + +ghostscript (9.04~dfsg-2ubuntu5) precise; urgency=low + + * No-change rebuild to drop spurious libsfgcc1 dependency on armhf. + + -- Adam Conrad Fri, 02 Dec 2011 17:27:55 -0700 + +ghostscript (9.04~dfsg-2ubuntu4) precise; urgency=low + + * debian/rules: Let the ghostscript binary package also provide gs-esp, + as several proprietary printer drivers still depend on gs-esp (LP: #897309). + + -- Till Kamppeter Fri, 2 Dec 2011 11:35:59 +0100 + +ghostscript (9.04~dfsg-2ubuntu3) precise; urgency=low + + * debian/patches/020111122-cd8f397-ps2write-fix-handling-of-format-4-cmap-subtables-in-truetype-fonts.patch: + ps2write: Fixed handling of format 4 CMAP subtables in TrueType fonte. This + made several characters coming out as garbage when converting PDF to + PostScript (LP: #891074). + * debian/patches/020111122-5cce070-ps2write-postscript-duplex-command-insertion.patch: + ps2write: Insertion of duplex printing commands from PPD files into + ps2write-generated PostScript did not have any effect, making duplex + printing on PostScript printers not work in many cases (LP: #885118). + + -- Till Kamppeter Tue, 22 Nov 2011 10:46:59 +0100 + +ghostscript (9.04~dfsg-2ubuntu2) precise; urgency=low + + * debian/patches/020111114-4258227-lzw-encode-filter-fix.patch: In the LZW + encoder filter increment the code size before writing out EOD when the + last code reaches the current limit code. Fix incorrect bytes or decoding + errors at the end of some LZW-encoded streams. Fixes problems of + ps2write producing PostScript output with spurious extra bytes + (LP: #890270, upstream bug #692679). + * debian/patches/029111114-08dc129-ps2write-truetype-fix.patch: Improved + the TrueType composite glyph handling of the "ps2write" output device. + This way PDF output of LibreOffice gets correctly converted to PostScript + for PostScript printers and PostScript-based drivers (LP: #879977, upstream + bug #879977). + + -- Till Kamppeter Mon, 14 Nov 2011 12:59:59 +0100 + +ghostscript (9.04~dfsg-2ubuntu1) precise; urgency=low + + * Merge from Debian testing, remaining changes: + - debian/control: + + gs-common: Reintroduce dependency on ghostscript, still too many + packages assuming gs-common has the binaries. + + Really break and replace older ghostscript in libgs9-common. + - debian/control, debian/rules, debian/libgs__VER__.install.in, + debian/libgs-dev.install: Stop using d-shlibmove, it is not compatible + with libcms2. + - Apport hook. + - debian/ghostscript-cups.ppd-updater: Added data file to trigger the + update of the PPD files of existing print queues by CUPS and to tell + CUPS which PPD files to use for the update and how to match them with + the PPDs of the existing queues. + - debian/rules: + + Generate ABI version number (variable "abi") correctly, cutting off + repackaging and pre-release parts. + + The scripts pv.sh and fixmswrd.pl are not shipped upstream any more, + so we do not need to delete them any more. + + Install ghostscript-cups.ppd-updater and remove the dependency on + cups-client from ghostscript-cups. + - debian/symbols.common: resync with Debian, with the exception of lcms2 + symbols which were only enabled in 9.04~dfsg-0ubuntu12 in Ubuntu. + - debian/copyright: update credits for the Ubuntu changes. + - upstream patches: + + 020110812~46b4ee6-pxl-landscape.patch: Fixed rendering + landscape-oriented input files with PCL-XL output through the pxlmono + and pxlcolor output devices + + 020110812~d9e044e-lips4v-fix.patch: Fixed lips4v driver + + 020110815-1920f21-cups-raster-set-default-color-profiles.patch: + Let the CUPS Raster output device set the correct default output + color space if none is explicitly selected via -sOutputICCProfile= + + 020110815-05b517b-gdevcups-c-eliminate-compiler-warning.patch: + Eliminated a compiler warning caused by the previous patch. + + 020110815-eb6b631-cups-raster-generate-cups-rgbw.patch: Let the CUPS + Raster output device generate RGBW as it is described in the CUPS + specification for the CUPS Raster format. + + 020110816-d8da050-cups-raster-improve-black-recognition-on-cmyk-to-rgbw.patch: + CUPS Raster: Improved recognition of black pixels on CMYK -> RGBW + conversion + + 020110816-781b738-cups-raster-fix-segfaults-on-color-model-change.patch: + Fix for segfaults in the CUPS Raster output device. + + 020110817-766df64-cups-raster-suppress-warnings.patch: Code cleanup + of the CUPS Raster device to suppress compiler warnings. + + 020110923-7e048c5-dont-crash-when-not-finding-icc-profile.patch, + 020110923-5688545-fix-setting-the-iccprofilesdir-userparam.patch: + correctly find color profiles, and correctly handle error when not + found instead of crashing. + + 020111005-d5f1e72-clist-fix-for-rgbw-color-mode.patch: Fixed color + handling in clist (banding) mode to correctly support RGBW color space + - debian/ghostscript.preinst: Use Ubuntu version numbers. + - debian/ghostscript-cups.postinst: Removed the post-install script which + was only there to update the PPDs of existing print queues. + - debian/watch: Search for .tar.bz2 source tarballs + * Dropped changes, included in Debian: + - debian/control: Build-depend on libdbus-1-dev. + - debian/copyright: Added lcms2/* to the list of excluded files. + - debian/rules: + + Added new "--with-install-cups" option to the ./configure command + line. + + Added ./lcms2/ directory to DEB_UPSTREAM_REPACKAGE_EXCLUDES. + + remove unneeded cidfmap correctly + - Enable D-Bus in the ./configure command line, build-depend on + libdbus-1-dev, and let ghostscript-cups recommend colord. + - Build Ghostscript against liblcms instead of liblcms1. + - debian/ghostscript.preinst: Clean up traces of Ghostscript in defoma + via "defoma-app purge gs", so that when updating packages which still + use defoma no warnings get issued. + * Mark ghostscript Multi-Arch: foreign. + + -- Steve Langasek Sun, 06 Nov 2011 10:50:36 -0800 + ghostscript (9.04~dfsg-2) unstable; urgency=low * Update copyright file: @@ -79,6 +276,289 @@ -- Jonas Smedegaard Sun, 02 Oct 2011 15:42:48 +0200 +ghostscript (9.04~dfsg-0ubuntu12) precise; urgency=low + + * debian/patches/1001_dont-crash-when-not-finding-icc-profile.patch, + debian/patches/020110923-5688545-fix-setting-the-iccprofilesdir-userparam.patch, + debian/patches/020110923-7e048c5-dont-crash-when-not-finding-icc-profile.patch: + Patch got applied upstream, replaced the patch by "official" upstream GIT + patches. No change in source code. + * debian/control, debian/rules: Build Ghostscript against liblcms instead + of liblcms1, to fix a crash on Apple-generated EPS figures (both + standalone or embedded in LaTeX-generated PostScript files, LP: #787067). + * debian/control, debian/rules, debian/libgs__VER__.install.in, + debian/libgs-dev.install: Stop using d-shlibmove, it is not compatible + with libcms2. + * debian/symbols.common: Updated. Applied patch which dpkg-gensymbols + generated for debian/libgs9.symbols to this file. + + -- Till Kamppeter Mon, 17 Oct 2011 15:52:31 +0200 + +ghostscript (9.04~dfsg-0ubuntu11) oneiric; urgency=low + + * debian/patches/020111005-d5f1e72-clist-fix-for-rgbw-color-mode.patch: + Fixed color handling in clist (banding) mode to correctly support RGBW + color space (LP: #864509, Upstream bug 692568). + + -- Till Kamppeter Thu, 6 Oct 2011 09:00:00 +0200 + +ghostscript (9.04~dfsg-0ubuntu10) oneiric; urgency=low + + * debian/patches/1001_dont-crash-when-not-finding-icc-profile.patch: + Updated patch to not only prevent the crash but also actually finding + the color profiles (Complete fix for LP: #856766, Upstream bug 692532). + + -- Till Kamppeter Fri, 23 Sep 2011 17:08:31 +0200 + +ghostscript (9.04~dfsg-0ubuntu9) oneiric; urgency=low + + * debian/patches/1001_dont-crash-when-not-finding-icc-profile.patch: + Handle error code if Ghostscript cannot load an ICC profile, to + avoid a crash (LP: #856766, Upstream bug 692532). + * debian/patches/1000_fix_segfaults_in_cups_raster_device.patch: Removed + old patch which is not applied any more. + * debian/symbols.common: Updated. Applied patch which dpkg-gensymbols + generated for debian/libgs9.symbols to this file. + + -- Till Kamppeter Fri, 23 Sep 2011 11:43:31 +0200 + +ghostscript (9.04~dfsg-0ubuntu8) oneiric; urgency=low + + * debian/rules: remove unneeded cidfmap correctly (LP: #853768) + + -- Mitsuya Shibata Mon, 19 Sep 2011 19:58:46 +0900 + +ghostscript (9.04~dfsg-0ubuntu7) oneiric; urgency=low + + * debian/rules: Do not use the XCFLAGS variable of "make" for setting + HAVE_SYS_TIME_H, as this breaks the X support via dynamically linking + output device module. + + -- Till Kamppeter Mon, 29 Aug 2011 15:54:31 +0200 + +ghostscript (9.04~dfsg-0ubuntu6) oneiric; urgency=low + + * debian/patches/020110817-766df64-cups-raster-suppress-warnings.patch: + Code cleanup of the CUPS Raster device to suppress compiler warnings. + * debian/patches/1000_fix_segfaults_in_cups_raster_device.patch, + debian/patches/020110816-781b738-cups-raster-fix-segfaults-on-color-model-change.patch: + Replaced patch by the appropriate patch from upstream. + + -- Till Kamppeter Wed, 17 Aug 2011 23:15:31 +0200 + +ghostscript (9.04~dfsg-0ubuntu5) oneiric; urgency=low + + * debian/ghostscript-cups.ppd-updater: Added data file to trigger the update + of the PPD files of existing print queues by CUPS and to tell CUPS which + PPD files to use for the update and how to match them with the PPDs of the + existing queues. + * debian/ghostscript-cups.postinst: Removed the post-install script which + was only there to update the PPDs of existing print queues. + * debian/rules: Install ghostscript-cups.ppd-updater and remove the + dependency on cups-client from ghostscript-cups. + * debian/patches/1000_fix_segfaults_in_cups_raster_device.patch: Temporary + fix for segfaults in the CUPS Raster output device. It stops the segfaults + but has a slight memory leak. A better fix is in the works by the upstream + developers. + + -- Till Kamppeter Mon, 15 Aug 2011 14:49:31 +0200 + +ghostscript (9.04~dfsg-0ubuntu4) oneiric; urgency=low + + * debian/patches/020110816-d8da050-cups-raster-improve-black-recognition-on-cmyk-to-rgbw.patch: + CUPS Raster: Improved recognition of black pixels on CMYK -> RGBW conversion + (Upstream bug 691922). + * debian/patches/020110815-1920f21-cups-raster-set-default-color-profiles.patch: + Let the CUPS Raster output device set the correct default output color + space if none is explicitly selected via the "-sOutputICCProfile=..." + (Upstream bug 691922). + * debian/patches/020110815-05b517b-gdevcups-c-eliminate-compiler-warning.patch: + Eliminated a compiler warning caused by the previous patch. + * debian/patches/020110815-eb6b631-cups-raster-generate-cups-rgbw.patch: + Let the CUPS Raster output device generate RGBW as it is described in the + CUPS specification for the CUPS Raster format (Upstream bug 691922). + + -- Till Kamppeter Mon, 15 Aug 2011 14:49:31 +0200 + +ghostscript (9.04~dfsg-0ubuntu3) oneiric; urgency=low + + * debian/rules: Add "XCFLAGS=-DHAVE_SYS_TIME_H=1" to the "make" command line + as the multiarch changes of libc6-dev ar not compatible with Ghostscript's + auto-detection of time.h (LP: #825054). + * debian/symbols.common: Updated. Applied patch which dpkg-gensymbols + generated for debian/libgs9.symbols to this file. + * debian/patches/020110812~46b4ee6-pxl-landscape.patch: Fixed rendering + landscape-oriented input files with PCL-XL output through the pxlmono + and pxlcolor output devices (Upstream bug 692128). + * debian/patches/020110812~d9e044e-lips4v-fix.patch: Fixed lips4v driver + (Upstream bug 690565). + + -- Till Kamppeter Fri, 12 Aug 2011 14:37:31 +0200 + +ghostscript (9.04~dfsg-0ubuntu2) oneiric; urgency=low + + * debian/rules: Enable D-Bus in the ./configure command line, build-depend + on libdbus-1-dev, and let ghostscript-cups recommend colord. All this is + needed for colord support (LP: #788099). + * debian/control: Build-depend on libdbus-1-dev. + + -- Till Kamppeter Wed, 10 Aug 2011 01:12:31 +0200 + +ghostscript (9.04~dfsg-0ubuntu1) oneiric; urgency=low + + * New upstream release + - Final 9.04 release, August, 5 2011 + - Flexibility for controlling color based upon the graphic object type. + Unique output ICC profiles and rendering intents for vector graphic, + image and text portions of a document can be set. It is also possible + to override source color specifications and use specified ICC + profiles and rendering intents for RGB and CMYK vector graphics, + images and text portions of a document. Finally, DeviceGray source + colors can now easily be specified to map either to K only or + composite CMYK when the output device supports CMYK colorants. + - New tiffscaled8 and tiffscaled24 devices. + - PDF interpreter now tries to continue interpreting after an error in + the input stream. + - Re-enabled x11alpha as the default device on Unix systems, the problems + with transparency are solved. + - Experimental text extraction device "txtwrite" with full Unicode support. + - Print rendering speed improvements for PDF input files (Upstream + bug #691755, LP: #568363, LP: #668800). + - Several fixes on the CUPS Raster output device to improve stability + (Upstream bug #691586, #692368, #692393, LP: #628030). + - Fixes on the RGBW color space support (needed for HP printers used with + HPLIP) of the CUPS Raster output device, to work with PDF input files + with transparency and to reproduce the colors correctly (Upstream bug + #691922). + - Added "-dNOINTERPOLATE" to the command lines of the CUPS filters to + get a significant rendering speed improvement. + - Fix of the pstopxl CUPS filter to make grayscale printing on color + printers working. + - The pxlmono/pxlcolor drivers produced huge output files in Ghostscript + 9.0x (Upstream bug 692329). + * debian/rules: Updated MD5 sum for original source tarball + * debian/watch: Search for .tar.bz2 source tarballs + * debian/symbols.common: Updated for new upstream source. Applied patch + which dpkg-gensymbols generated for debian/libgs9.symbols to this file. + + -- Till Kamppeter Fri, 05 Aug 2011 18:43:31 +0200 + +ghostscript (9.04~dfsg~20110801-0ubuntu1) oneiric; urgency=low + + * New upstream release + - GIT snapshot from August, 8 2011 + - Fixed RGBW color output of the CUPS Raster device (Upstream bug #691922). + - Fixed RGBW CUPS Raster output of file with transparency. + - Make CUPS filters call Ghostscript with the "-dNOINTERPOLATE" option. + - Let gstoraster not crash when it is called outside CUPS (Upstream bug + #692384). + - Let gstoraster output its error messages with a newline at the end + (Upstream bug #692385). + * debian/patches/1001_gstoraster_nointerpolate.patch, + debian/patches/fix-cups-raster-rgbw-output-of-files-with-transparency.patch: + Removed, incorporated upstream. + + -- Till Kamppeter Mon, 01 Aug 2011 17:16:12 +0200 + +ghostscript (9.04~dfsg~20110729-0ubuntu3) oneiric; urgency=low + + * debian/patches/fix-cups-raster-rgbw-output-of-files-with-transparency.patch: + Sync the patch with the final solution from upstream (Upstream bug #691922). + + -- Till Kamppeter Sat, 30 Jul 2011 09:47:01 +0200 + +ghostscript (9.04~dfsg~20110729-0ubuntu2) oneiric; urgency=low + + * debian/patches/fix-cups-raster-rgbw-output-of-files-with-transparency.patch: + Also corrected the colors of the RGBW output by applying the correct ICC + color profile. + + -- Till Kamppeter Sat, 30 Jul 2011 01:24:01 +0200 + +ghostscript (9.04~dfsg~20110729-0ubuntu1) oneiric; urgency=low + + * New upstream release + - GIT snapshot from July, 29 2011 (Release Candidate 1) + - Fix of a segfault when rendering a PDF file (Upstream bug #692368). + - Fix of pstopxl CUPS filter to make grayscale printing on color + printers working. + - The pxlmono/pxlcolor drivers produced huge output files in Ghostscript + 9.0x (Upstream bug 692329). + * debian/rules: Added new "--with-install-cups" option to the ./configure + command line. + * debian/rules: The scripts pv.sh and fixmswrd.pl are not shipped upstream + any more, so we do not need to delete them any more. + * debian/patches/fix-cups-raster-rgbw-output-of-files-with-transparency.patch: + PDF files came out as garbage when printing on color inkjet printers from + HP. This was due to the CUPS Raster output being messed up when the input + file is a PDF with transparency and the output color space is RGBW. + + -- Till Kamppeter Fri, 29 Jul 2011 10:59:01 +0200 + +ghostscript (9.04~dfsg~20110721-0ubuntu2) oneiric; urgency=low + + * debian/patches/1001_gstoraster_nointerpolate.patch: Make CUPS filters + call Ghostscript with the "-dNOINTERPOLATE" option. This makes the rendering + of the input files by a factor of 12 faster. This should really eliminate + all complaints of LP: #568363, LP: #668800, and other "printing too slow + bugs". + + -- Till Kamppeter Thu, 21 Jul 2011 20:55:03 +0200 + +ghostscript (9.04~dfsg~20110721-0ubuntu1) oneiric; urgency=low + + * New upstream release + - GIT snapshot from July, 21 2011. + - Significant rendering speed improvement for printing PDF files (Upstream + bug #691755, LP: #568363, LP: #668800). + * debian/symbols.common: Updated for new upstream source. Applied patch + which dpkg-gensymbols generated for debian/libgs9.symbols to this file. + + -- Till Kamppeter Thu, 21 Jul 2011 18:05:03 +0200 + +ghostscript (9.04~dfsg~20110715-0ubuntu1) oneiric; urgency=low + + * New upstream release + - GIT snapshot from July, 15 2011. + * debian/patches/020110406~a54df2d.patch, + debian/patches/020110408~0791cc8.patch, + debian/patches/020110408~507cbee.patch, + debian/patches/020110411~4509a49.patch, + debian/patches/020110412~78bb9a6.patch, + debian/patches/020110418~a05ab8a.patch, + debian/patches/020110420~20b6c78.patch, + debian/patches/020110420~4ddefa2.patch: Removed upstream patches. + * debian/rules: Generate ABI version number (variable "abi") correctly, + cutting off repackaging and pre-release parts. + * debian/rules: Added ./lcms2/ directory to DEB_UPSTREAM_REPACKAGE_EXCLUDES. + * debian/copyright: Added lcms2/* to the list of excluded files. + * debian/symbols.common: Updated for new upstream source. Applied patch + which dpkg-gensymbols generated for debian/libgs9.symbols to this file. + + -- Till Kamppeter Fri, 15 Jul 2011 16:49:55 +0200 + +ghostscript (9.02~dfsg-3ubuntu1) oneiric; urgency=low + + * Merge from debian unstable. Remaining changes: + - debian/ghostscript-cups.postinst: Fixed "lpstat -r" check for the + auto update of PPDs of existing queues. "lpstat -r" exits always with + status 0, we must check the actual output. Call lpstat, lpadmin, and + cupsctl with "-h /var/run/cups/cups.sock" to avoid querying remote + servers set up in /etc/cups/client.conf, and asking for passwords. + Thanks to Martin-Éric Racine for tracking this down and the solution! + See Debian bug #543468. Use signal names instead of numbers for trap, + quiesces a lintian bashism warning. + - debian/ghostscript.preinst: Clean up traces of Ghostscript in defoma + via "defoma-app purge gs", so that when updating packages which still + use defoma no warnings get issued. + - debian/ghostscript.preinst: Use Ubuntu version numbers. + - gs-common: Reintroduce dependency on ghostscript, still too many packages + assuming gs-common has the binaries. + - Really break and replace older ghostscript in libgs9-common. + - Apport hook. + + -- Till Kamppeter Tue, 12 Jul 2011 20:41:38 +0200 + ghostscript (9.02~dfsg-3) unstable; urgency=low * Tighten build-dependency on d-shlibs and drop overrides. @@ -86,6 +566,28 @@ -- Jonas Smedegaard Thu, 07 Jul 2011 22:52:03 +0200 +ghostscript (9.02~dfsg-2ubuntu1) oneiric; urgency=low + + * Merge with Debian; remaining changes: + - debian/ghostscript-cups.postinst: Fixed "lpstat -r" check for the + auto update of PPDs of existing queues. "lpstat -r" exits always with + status 0, we must check the actual output. Call lpstat, lpadmin, and + cupsctl with "-h /var/run/cups/cups.sock" to avoid querying remote + servers set up in /etc/cups/client.conf, and asking for passwords. + Thanks to Martin-Éric Racine for tracking this down and the solution! + See Debian bug #543468. Use signal names instead of numbers for trap, + quiesces a lintian bashism warning. + - debian/ghostscript.preinst: Clean up traces of Ghostscript in defoma + via "defoma-app purge gs", so that when updating packages which still + use defoma no warnings get issued. + - debian/ghostscript.preinst: Use Ubuntu version numbers. + - gs-common: Reintroduce dependency on ghostscript, still too many packages + assuming gs-common has the binaries. + - Really break and replace older ghostscript in libgs9-common. + - Apport hook. + + -- Matthias Klose Sat, 21 May 2011 18:33:04 +0200 + ghostscript (9.02~dfsg-2) unstable; urgency=low * Cherry-pick upstream fixes for severe bugs. @@ -160,6 +662,104 @@ -- Jonas Smedegaard Fri, 25 Feb 2011 00:08:29 +0100 +ghostscript (9.01~dfsg-1ubuntu5) natty; urgency=low + + * gs-common: Reintroduce dependency on ghostscript, still too many packages + assuming gs-common has the binaries. + + -- Matthias Klose Fri, 01 Apr 2011 15:01:16 +0200 + +ghostscript (9.01~dfsg-1ubuntu4) natty; urgency=low + + * debian/patches/012310_opvp-fixes-for-gs9: Fixes concerning the + compatibility of the OpenPrinting Vector ("opvp") output device with/ + Ghostscript 9.x. + + 1. If there is any ICCColor based image in the PostScript input, GS + crashes. + 2. Fallback when path is too complex for some kinds of printers. This + problem + + already existed in GS 8.x. + + Thanks to Koji Otani from BBR Inc., Japan. + + -- Till Kamppeter Fri, 25 Mar 2011 17:44:00 +0100 + +ghostscript (9.01~dfsg-1ubuntu3) natty; urgency=low + + * Really break and replace older ghostscript in libgs9-common. + + -- Colin Watson Wed, 23 Feb 2011 02:38:09 +0000 + +ghostscript (9.01~dfsg-1ubuntu2) natty; urgency=low + + * debian/rules, debian/ubuntu/apport-hook.py: Dropped the Apport hook on + the merge from Debian. Re-added it. + + -- Till Kamppeter Tue, 22 Feb 2011 20:37:00 +0100 + +ghostscript (9.01~dfsg-1ubuntu1) natty; urgency=low + + * Merge from debian unstable. Remaining changes: + - debian/ghostscript-cups.postinst: Fixed "lpstat -r" check for the + auto update of PPDs of existing queues. "lpstat -r" exits always with + status 0, we must check the actual output. Call lpstat, lpadmin, and + cupsctl with "-h /var/run/cups/cups.sock" to avoid querying remote + servers set up in /etc/cups/client.conf, and asking for passwords. + Thanks to Martin-Éric Racine for tracking this down and the solution! + See Debian bug #543468. Use signal names instead of numbers for trap, + quiesces a lintian bashism warning. + - debian/ghostscript.preinst: Clean up traces of Ghostscript in defoma + via "defoma-app purge gs", so that when updating packages which still + use defoma no warnings get issued. + - debian/ghostscript.preinst: Use Ubuntu version numbers. + + -- Till Kamppeter Tue, 22 Feb 2011 19:03:00 +0100 + +ghostscript (9.02~dfsg-1) unstable; urgency=low + + * New upstream release. + Closes: bug#620970. Thanks to Daniel Baumann. + + Fixes crash in CUPS driver. + Closes: bug#615202. + + [ Jonas Smedegaard ] + * Set libgs-dev to priority optional (not extra) to match override + file. + * Fix have libgs* depend on lib*-common, source-versioned to ensure + sanity while allow binNMUs. Thanks to Niels Thykier. + * Drop obsolete lintian overrides. + * Fix stop stripping convenience library icclib from upstream source: + Linkage against shared system library was not applied and is not yet + working. + * Update upstream download URL. Tidy note on DFSG repackaging copyright file. + * Drop patches 0001 and 1001: Applied upstream. + * Update copyright file: + + (Re)add licensing of icclib. + + Fix treat SunSoft part as exception (not separate license). + + Reorder Files sections to match hints file. + + Add new owners. + * Update symbols files. + + [ Didier Raboud ] + * Add a -dbg package. + Closes: #616024. + + -- Jonas Smedegaard Sat, 09 Apr 2011 06:56:28 +0200 + +ghostscript (9.01~dfsg-2) unstable; urgency=low + + * Really have ghostscript-cups and libgs9-common replace older + ghostscript. + Closes: bug#614729. Thanks to Colin Watson. + * Add patch 0001 to fix bus error on sparc. + Closes: bug#613642. Thanks to Julien Cristau, Chris Liddell and + others. + * Update copyright file: Extend a year. + + -- Jonas Smedegaard Fri, 25 Feb 2011 00:08:29 +0100 + ghostscript (9.01~dfsg-1) unstable; urgency=low * New upstream release. @@ -196,6 +796,121 @@ -- Jonas Smedegaard Sat, 12 Feb 2011 22:22:40 +0100 +ghostscript (9.01~dfsg-0ubuntu1) natty; urgency=low + + * New upstream release + o Final 9.01 release of Ghostscript + o Support for using the system's libijs. + Taken the ijs/ subdirectory out of the repackaged source tarball again + as support for an external libijs got added now (LP: #704913, LP: #704157). + * debian/control: Added libijs-dev to the build dependencies. + * debian/rules: Added ijs/ subdirectory back to the upstream source + repackaging check. + * debian/rules: Updated regular expression to check whether + Resource/Init/cidfmap is virtually empty. + * debian/rules: Added a "--override" for libijs to the d-shlibmove call. + * debian/symbols.common: Updated for new upstream source. Applied patch + which dpkg-gensymbols generated for debian/libgs9.symbols to this file. + + -- Till Kamppeter Thu, 12 Feb 2011 21:00:00 +0100 + +ghostscript (9.01~dfsg~svn12047-0ubuntu1) natty; urgency=low + + * New upstream release + o SVN snapshot rev. 12047 + Taken back the ijs subdirectory into the repackaged source tarball as + Ghostscript's build system does not support using an external, shared + libijs (LP: #704913, LP: #704157). + Removed the newly added ./cups/libs/ directory in the repackaging as + we use the CUPS libraries of the cups package. + * debian/rules: Removed ijs subdirectory from upstream source repackaging + check and added cups/libs/ subdirectory. + * debian/rules: Override a bug that if dynamically loadable X11 drivers are + uses ("./configure --enable-dynamic") that in the core Ghostscript library + the X11 drivers are also built in. This bug got most probably introduced + with SVN rev. 12025. + * debian/symbols.common: Updated for new upstream source. Applied patch + which dpkg-gensymbols generated for debian/libgs9.symbols to this file. + + -- Till Kamppeter Sat, 22 Jan 2011 11:25:36 +0100 + +ghostscript (9.01~dfsg~svn12005-0ubuntu1) natty; urgency=low + + * New upstream release + o SVN snapshot rev. 12005 + o DSC-conforming PostScript output of "ps2write" (Upstream bug #688495) + o Skip color management for non-standard color spaces (Upstream bug + #691760) + We skipped Ghostscript 9.00 in Ubuntu. New features from that release: + o ICC-profile-based color management + o Postscript interpreter's graphics state now stores two separate colour + space settings for stroking and filling, to better support the stroke + and fill colours required by the PDF interpreter. + o PDF-interpreter: Support for optional content, improved support of + JPX images in PDF files. + o For security reasons, Ghostscript no longer searches the current + directory by default. Use -P option to revert to old behavior. + o Bug fixes. + In addition to the non-free files in Resource/CMap/ and the source-less + PDFs in jasper/ excluded superfluous subdirs expat, freetype, icclib, ijs, + jasper, jbig2dec, lcms, libpng, tiff, and zlib when repackaging upstream + tarball. This reduces the tarball from 27 MB to 17 MB and eliminates the + need to mention these libraries in the debian/copyright file. Used the + command line "grep -li 'not altered' Resource/CMap/* | xargs rm" to + remove the non-free CMap files. The files Resource/CMap/Identity-UTF16-{HV} + are included again as they are from Artifex and not from Adobe, so they + fall under Artifex' license. + * debian/patches/: Dropped all patches except the two Debian-specific ones. + The patches were either backported from upstream or they are incorporated + upstream now. So we have a near patch-free Ghostscript again. + * debian/rules: Removed Resource/CMap/Identity-UTF16-{HV} from + upstream source repackaging check. + * debian/rules: Removed obsolete "--disable-cairo" option from the + ./configure command line. + * debian/rules: Determine ABI version number correctly also if we have an + SVN snapshot with "~svnXXXX" added to the upstream version number. + * Removed DEB_CLEAN_EXCLUDE definition, as the patch noise is removed + upstream. + * debian/symbols.common: Updated for new upstream source. Applied patch + which dpkg-gensymbols generated for debian/libgs9.symbols to this file. + * debian/ubuntu/apport-hook.py: Moved to debian/ubuntu/, to make implementing + a common Debian/Ubuntu VCS repository easier. + * debian/copyright: Added info about apport-hook.py and + Resource/CMap/Identity-UTF16-{HV}. + * Changes overtaken from Debian with the merge: + o Use source format 3.0 "quilt" (and not patchsys-quit.mk). Updated + README.source: normal builds need no special handling now. + o Patches are now managed with quilt + o debian/patches/README: Documented new patch naming scheme + o Renamed the two debian-specific patches according to the new naming + scheme. + o debian/symbols.common: Updated. + o debian/rules: Check completeness of debian/copyright file (fonts not + checked). + o debian/rules: Check whether source tarball is correctly repackaged. + o Added static library /usr/lib/libgs.a to -dev package. + o Use FreeType/FAPI disabled as it is still immature. + o Automatic upstream/ABI version check/update/warning for debian/control. + o Handle package dependencies in debian/rules, let debian/control be + appropriately generated. + * Merged 9.00 from debian experimental. Remaining Ubuntu-specific changes: + o Apport hook + o Updated post-install script of ghostscript-cups: Fixed "lpstat -r" check + for the auto update of PPDs of existing queues. "lpstat -r" exits always + with status 0, we must check the actual output. Call lpstat, lpadmin, and + cupsctl with "-h /var/run/cups/cups.sock" to avoid querying remote + servers set up in /etc/cups/client.conf, and asking for passwords. + Thanks to Martin-Éric Racine for tracking this down and the solution! + See Debian bug #543468. Use signal names instead of numbers for trap. + Quiesces a lintian bashism warning. + o Do not remove the CMap files as we do not use DeFoMa any more. + o Purge old defoma stuff to avoid warnings from defoma when updating + other packages which still use defoma (in debian/ghostscript.preinst). + o Use Ubuntu version numbers in debian/ghostscript.preinst + o Removed CMap link in debian/ghostscript.links.in + + -- Till Kamppeter Fri, 7 Jan 2011 8:36:36 +0100 + ghostscript (9.00~dfsg-4) experimental; urgency=low * Fix have libgs9 depend on libgs9-common. @@ -294,6 +1009,212 @@ -- Jonas Smedegaard Sun, 31 Oct 2010 04:46:34 +0100 +ghostscript (8.71.dfsg.2-0ubuntu9) natty; urgency=low + + * Removed noise introduced into source package by the previous upload. + + -- Till Kamppeter Wed, 8 Dec 2010 00:26:59 +0100 + +ghostscript (8.71.dfsg.2-0ubuntu8) natty; urgency=low + + * debian/ghostscript.preinst: Clean up traces of Ghostscript in defoma + via "defoma-app purge gs", so that when updating packages which still + use defoma no warnings get issued. + + -- Till Kamppeter Tue, 7 Dec 2010 23:59:59 +0100 + +ghostscript (8.71.dfsg.2-0ubuntu7) maverick; urgency=low + + * debian/control: Updated versioned dependency of ghostscript on gsfonts, + we need at least gsfonts 1:8.11+urwcyr1.0.7~pre44-4.1 now due to the + dropping of defoma. + + -- Till Kamppeter Mon, 20 Sep 2010 18:57:20 +0200 + +ghostscript (8.71.dfsg.2-0ubuntu6) maverick; urgency=low + + * debian/patches/substractive-gray-fix: Fixed the handling of substractive + monochrome/grayscale color spaces by the PDF interpreter. Such color + space is often used by the CUPS Raster output device, especially by + Gutenprint on monochrome laser printers. + + -- Till Kamppeter Wed, 1 Sep 2010 10:21:20 +0200 + +ghostscript (8.71.dfsg.2-0ubuntu5) maverick; urgency=low + + * debian/patches/cups-raster-fixes.dpatch: Do not do over-verbose debug + logging. This made rendering sigificantly slower and also made it more + difficult to read the CUPS error_log file (Upstream bug #690581). + + -- Till Kamppeter Thu, 12 Aug 2010 20:32:20 +0200 + +ghostscript (8.71.dfsg.2-0ubuntu4) maverick; urgency=low + + * debian/patches/cups-raster-fixes.dpatch: Added following fixes to the + patch: + o Eliminated compiler warning appearing after the recent memory + reallocation fixes. + o Support CUPS Raster level 2 (compressed) output (Upstream bug #689885). + o Improved memory management: Automatic buffer size determination if + RIP_MAX_CACHE variable is not set or not a non-zero number, BufferSpace + size is same as MaxBitmap, not 1/10 (Upstream bug #691499). + o Reallocate memory also if color depth changes during the job (Upstream + bug #690435). + * debian/patches/x11-device-do-not-create-huge-windows.dpatch: Some input + files made Ghostscript opening a huge window, much bigger than the usual + desktop, and sometimes using up all the computer's memory and making the + computer crash (Upstream bug #690444). + * debian/patches/check-all-pdfs-for-transparency.dpatch: Transparency in + PDFs is was only introduced in PDF 1.4 according to the Adobe specs, but + there are PDFs claiming to be of an older standard but they contain + transparency. With this patch all PDFs are checked for transparency + (Upstream bug #691273). + * debian/patches/pdf-rendering-performance.dpatch: Improved PDF rendering + performance by replacing the standard C floor() function by a simple macro + (Upstream bug #691504). + * debian/patches/x11-device-modularization-fixes.dpatch: Assorted fixes in + the modularization of the X11 output devices (Upstream bug #691510). + * debian/patches/device-n-init-variables-to-avoid-segfault.dpatch: Added + some missing initializations in DeviceN to avoid possible segmentation + faults (Upstream bug #690428). + * debian/patches/fix-imagem-output-device.dpatch: Fixed double-free + corruption of "imagen" output device (Upstream bug #690561). + + -- Till Kamppeter Sun, 8 Aug 2010 19:15:20 +0200 + +ghostscript (8.71.dfsg.2-0ubuntu3) maverick; urgency=low + + * SECURITY UPDATE: arbitrary code execution via unlimited recursive + procedure invocations (LP: #546009) + - debian/patches/CVE-2010-1628.dpatch: only initialize structures if + all allocations were successful in psi/ialloc.c, psi/idosave.h, + psi/isave.c. + - CVE-2010-1628 + + -- Marc Deslauriers Thu, 22 Jul 2010 12:19:37 +0200 + +ghostscript (8.71.dfsg.2-0ubuntu2) maverick; urgency=low + + * debian/patches/ps2pdf-hyperlinks.dpatch: Let ps2pdf create proper hyperlinks + (LP: #583990, upstream bug #691344). + + -- Till Kamppeter Mon, 19 Jul 2010 19:15:20 +0200 + +ghostscript (8.71.dfsg.2-0ubuntu1) maverick; urgency=low + + * New source tarball, still based on Ghostscript 8.71, but with less files + removed. As for most files in Resource/CMap/ Adobe has changed the license + we do not remove the files in Resource/CMap/ entirely but only the files + which have still a non-free license. As these files are only needed for + old CJK PDF files (of the Adobe Acrobat Reader 3-6 generation) for most + users this will reintroduce the same PDF and font compatibility as + upstream Ghostscript. See Ghostscript upstream bug 691212. This should fix + upstream bug 691345 and the Ghostscript part of LP: #321932. Used the + command line "grep -li 'not altered' Resource/CMap/* | xargs rm" to + remove these files. + * debian/README.Debian: Updated for the change in the removal of non-free + files from the upstream source tarball. + * debian/ghostscript.links: Removed links which got obsolete from defoma + removal. + * debian/dirs: Removed directories which got obsolete from defomo removal. + * debian/rules: Removed "fail-if-cmaps-exist" rule, as we do not remove + the entire Resource/CMap/ any more. + + -- Till Kamppeter Fri, 04 Jun 2010 10:54:20 +0200 + +ghostscript (8.71.dfsg.1-0ubuntu6) maverick; urgency=low + + * debian/ghostscript.prerm, debian/gs.defoma, debian/ghostscript.postrm, + debian/dirs, debian/ghostscript.links, debian/control, debian/rules, + debian/ghostscript.postinst, debian/ghostscript.preinst, + debian/update-gsfontmap: Merge changes from 8.71~dfsg2-1.1 (LP: #584597): + - Drop defoma. + - Add update-gsfontmap to provide cidfmap and Fontmap. + + -- Stefano Rivera Sun, 23 May 2010 18:13:43 +0200 + +ghostscript (8.71.dfsg.1-0ubuntu5.1) lucid-proposed; urgency=low + + * debian/patches/pdf-interpreter-segfault-fixes.dpatch, + debian/patches/cups-raster-fixes.dpatch, + debian/patches/fapi-buildchar-object-null-check.dpatch, + debian/patches/cups-raster-error-out-without-segfault-and-force-banding.dpatch, + debian/patches/cups-raster-fix-memory-reallocation.dpatch: Fixed several + problems in the PDF interpreter and the CUPS Raster output device of + Ghostscript to avoid Ghostscript erroring out or even crashing on many + input files when printing with a CUPS Raster driver (LP: 539708, upstream + bug #691014). Joined all changes on cups/gdevcups.c into one patch as + the patches are overlapping and parts of the old patches are undone. + + -- Till Kamppeter Thu, 29 Apr 2010 09:43:23 +0200 + +ghostscript (8.71.dfsg.1-0ubuntu5) lucid; urgency=low + + * debian/patches/pdf2dsc-fix-for-pdflatex-preview.dpatch: + Fix pdflatex preview mode using the patch from http://svn.ghostscript.com/viewvc?view=rev&revision=10778 + by William Bader (LP: #543266) + + -- Josh Holland Fri, 02 Apr 2010 08:25:31 +0100 + +ghostscript (8.71.dfsg.1-0ubuntu4) lucid; urgency=low + + * debian/patches/cups-raster-error-out-without-segfault-and-force-banding.dpatch: + Make the "cups" output device (CUPS Raster) error out correctly without + causing segfaults and also force banding mode as some PDFs do not render + otherwise (LP: #534525). + + -- Till Kamppeter Tue, 23 Mar 2010 10:22:23 +0100 + +ghostscript (8.71.dfsg.1-0ubuntu3) lucid; urgency=low + + * debian/patches/pdftoraster-wait-for-ghostscript.dpatch: pdftoraster exited + already before its Ghostscript subprocess finished. Thanks to Tim Waugh + from Red Hat for the fix. + * debian/patches/cups-raster-fix-memory-reallocation.dpatch: Fixed bug + in memory reallocation on bitmap size changes. Color depth was not + taken into account. This caused black pages to be printed with some + CUPS Raster drivers, like Turboprint. Fixes upstream bugs #691029 and + #691108. + * debian/patches/fix-broken-korean-example.dpatch: Fixed example file for + rendering Korean text. + + -- Till Kamppeter Tue, 9 Mar 2010 17:56:23 +0100 + +ghostscript (8.71.dfsg.1-0ubuntu2) lucid; urgency=low + + * no-cant-refill-scanner-input-buffer-error.dpatch: Ghostscript errored out + when getting fed with the Ubuntu test page + (/usr/share/system-config-printer/testpage-a4.ps) on stdin giving a + "Can't refill scanner input buffer" error. (Upstream bugs #691137, + #690909). + + -- Till Kamppeter Wed, 24 Feb 2010 10:08:23 +0100 + +ghostscript (8.71.dfsg.1-0ubuntu1) lucid; urgency=low + + * New upstream release + o libtiff-based tiff file output + o New "tiffsep1" output device produces halftoned separations at 1 bit + per pixel + o Improved FreeType-based font rasterizing (not yet used as default) + o Improved graphics library for vector graphics conversions + o Many bug fixes on the PCL-XL printer drivers ("pxlmono", "pxlcolor") + o Fixes on back side handling for duplex printing in the CUPS Raster + output device ("cups"). + * debian/patches/gs-cups-rgb-gamma.dpatch, + debian/patches/cljet5-mediasize-fix.dpatch, + debian/patches/pxl-driver-fixes.dpatch, + debian/patches/gs-cups-fix-backside-on-duplex-jobs.dpatch: Removed patches + backported from upstream. + * debian/patches/fix-build-of-executables.dpatch: Fix build of the "gs" + executable, it was built as a shared library and not as an executable. + This lead to an immediate segfault even before "main()" got called. + Thanks to Robin Watts from Ghostscript for the quick fix. + * debian/control: Added build dependency on libtiff-dev. + * debian/ghostscript.links: s/8.70/8.71/ + + -- Till Kamppeter Thu, 11 Feb 2010 11:31:23 +0100 + ghostscript (8.71~dfsg2-6) unstable; urgency=low * Acknowledge pseudo-NMUs. @@ -536,6 +1457,93 @@ -- Jonas Smedegaard Mon, 15 Feb 2010 23:39:11 +0100 +ghostscript (8.70.dfsg.1-0ubuntu5) lucid; urgency=low + + * debian/patches/gs-cups-fix-backside-on-duplex-jobs.dpatch: The "cups" + output device (generating input for the CUPS Raster drivers) did not + update the margins and page orientation for the back sides in time and + so the back side was often the wrong way around, especially with printers + which print the back sides backwards, like HP inkjets. The problem occurs + only with PostScript as input and not with PDF, which made the bug not + showing in Ubuntu and Debian. This change is applied to Ubuntu's + Ghostscript so that Lucid users regression-test it before Ghostscript + 8.71 gets released in February (HPLIP upstream bug: LP: #484928). + + -- Till Kamppeter Tue, 26 Jan 2010 15:25:23 +0100 + +ghostscript (8.70.dfsg.1-0ubuntu4) lucid; urgency=low + + * debian/patches/pxl-driver-fixes.dpatch: Several upstream bug fixes + on the PCL-XL drivers ("pxlcolor"/"pxlmono") in Ghostscript, especially + also for PDF input. Thanks to Hin-Tak Leung on putting all that work + into this driver which stayed nearly untouched for around 10 years. + (LP: #361772). + + -- Till Kamppeter Mon, 7 Dec 2009 20:23:23 +0100 + +ghostscript (8.70.dfsg.1-0ubuntu3) karmic; urgency=low + + * debian/patches/cljet5-mediasize-fix.dpatch: Upstream fix for the media + size handling of the "cljet5" printer driver. + + -- Till Kamppeter Mon, 12 oct 2009 15:47:23 +0200 + +ghostscript (8.70.dfsg.1-0ubuntu2) karmic; urgency=low + + * debian/ghostscript-cups.postinst: Fixed "lpstat -r" check for the + auto update of PPDs of existing queues. "lpstat -r" exits always with + status 0, we must check the actual output. Call lpstat, lpadmin, and + cupsctl with "-h /var/run/cups/cups.sock" to avoid querying remote + servers set up in /etc/cups/client.conf, and asking for passwords. + Thanks to Martin-Éric Racine for tracking this down and the solution! + See Debian bug #543468. Use signal names instead of numbers for trap. + Quiesces a lintian bashism warning. + * debian/rules: Remove /usr/bin/ps2pdf from the ghostscript package, it was + treated by update-alternatives for a longer time already (LP: #429856). + + -- Till Kamppeter Fri, 18 Sep 2009 15:37:23 +0200 + +ghostscript (8.70.dfsg.1-0ubuntu1) karmic; urgency=low + + * New upstream release + o License is now GPLv3 or later + o No functional change. This is only to let the final release not + appear as a release candidate in the help output and documentation + and also to reflect the new license. + * debian/copyright: License change. + + -- Till Kamppeter Sat, 01 Aug 2009 19:04:40 +0200 + +ghostscript (8.70.dfsg.1~rc1-0ubuntu1) karmic; urgency=low + + * New upstream release + o Fixes many transparency problems: color space conversion, mask contexts, + patterns, ... + o Fixes in font handling, especially when generating PDF + o Improvements in robustness, correctness, and performance + o New generic Esc/Page drivers: "eplmono", "eplcolor" + o New "cdnj500" driver for many HP DesignJet printers + o License is now GPLv2 or later and not GPLv2-only any more + o Merged all patches of the Ubuntu and Debian packages upstream + o Fixes LP: #196009 + * debian/patches/33_bad-params-to-xinitimage-on-large-bitmaps.dpatch, + debian/patches/35_bitcmyk-blank-output.dpatch, + debian/patches/37_fix-segfault-in-cups-raster-output-device.dpatch, + debian/patches/38_CVE-2009-0583_0584.dpatch, + debian/patches/40_pdfwrite-numcopies.dpatch, + debian/patches/41_CVE-2009-0196.dpatch, + debian/patches/42_CVE-2009-0792.dpatch, + debian/patches/43_add-cdnj500-driver.dpatch, + debian/patches/45_cups-device-pagesize-margins-duplex-fixes.dpatch, + debian/patches/47_ps2write-segfault-fix.dpatch, + debian/patches/50_ps2write-do-not-advertize-dsc-conformance.dpatch, + debian/patches/53_fix-pstoraster-for-call-with-input-filename.dpatch: + Removed patches backported from upstream. + * debian/copyright: License change. + * debian/ghostscript.links: s/8.64/8.70/ + + -- Till Kamppeter Wed, 29 Jul 2009 09:47:54 +0200 + ghostscript (8.70~dfsg-2.1) unstable; urgency=low * Non-maintainer upload. @@ -568,6 +1576,255 @@ -- Jonas Smedegaard Sun, 02 Aug 2009 12:05:15 +0200 +ghostscript (8.64.dfsg.1-0ubuntu15) karmic; urgency=low + + * debian/patches/43_add-cdnj500-driver.dpatch: Set rendering intent for + the "Presentation" quality in the "cdnj500" driver to "Perceptual", this + gives better colors than the original "SATURATION". + + -- Till Kamppeter Mon, 13 Jul 2009 14:22:49 +0200 + +ghostscript (8.64.dfsg.1-0ubuntu14) karmic; urgency=low + + * debian/control: Moved dependencies of ghostscript-cups on cups, + cups-client back to Depends:, for post-install this is sufficient. + + -- Till Kamppeter Tue, 2 Jun 2009 09:43:49 +0200 + +ghostscript (8.64.dfsg.1-0ubuntu13) karmic; urgency=low + + * debian/control: Moved dependencies of ghostscript-cups on cups, + cups-client, and perl-base to Pre-Depends:, as only this way it is + assured that these packages are configured (especially CUPS daemon + running) before this package gets configured (update of the PPDs of + existing queues). + + -- Till Kamppeter Mon, 1 Jun 2009 20:35:49 +0200 + +ghostscript (8.64.dfsg.1-0ubuntu12) karmic; urgency=low + + * debian/control: Removed unneeded "perl" from Depends:. This is only + needed for Perl applications, not for a simple "perl -p -e ..." in the + postinst script. + + -- Till Kamppeter Tue, 26 May 2009 16:53:49 +0200 + +ghostscript (8.64.dfsg.1-0ubuntu11) karmic; urgency=low + + * debian/patches/53_fix-pstoraster-for-call-with-input-filename.dpatch: + pstoraster did not work when called with an input file name as the 6th + command line argument. + + * debian/patches/50_ps2write-do-not-advertize-dsc-conformance.dpatch: + The "ps2write" output device produces PostScript which is not + DSC-conforming, so do not advertize it as DSC-conforming with a + "%!PS-Adobe-..." magic string. Use "%!" instead. Otherwise the "pstops" + CUPS filter cannot handle this output (LP: #377011). + + * debian/patches/45_cups-device-pagesize-margins-duplex-fixes.dpatch: + Fixed recognition of page size via /cupsPageSizeName. All page sizes were + considered custom sizes if /cupsPageSizeName was not set. + + -- Till Kamppeter Thu, 21 May 2009 15:25:49 +0200 + +ghostscript (8.64.dfsg.1-0ubuntu10) karmic; urgency=low + + * debian/control, debian/rules, debian/ghostscript.postinst, + debian/ghostscript-cups.postinst: Splitted off the CUPS-related files + into its own package, so that the requirements of cups and cups-client + for the automatic update of the PPDs of existing print queues do not + apply to the ghostscript core package. Added cups and cups-client to + the Depnds: entry of the new ghostscript-cups, so that the automatic + updates of the PPDs also works on updates to a new release of the + distribution and not only on single-package updates. Added also perl + as dependency to the ghostscript-cups package as it is also needed + for the automatic PPD updates. + + -- Till Kamppeter Mon, 18 May 2009 23:19:49 +0200 + +ghostscript (8.64.dfsg.1-0ubuntu9) karmic; urgency=low + + * debian/patches/47_ps2write-segfault-fix.dpatch: The "ps2write" output + device segfaults on the testfile.pdf of the CUPS test suite, making + CUPS FTBFS if "ps2write" is used by one of the CUPS filters (Upstream + bug #690475). + + * debian/patches/45_cups-device-pagesize-margins-duplex-fixes.dpatch: + The CUPS Raster output device did not handle the unprintable margins + correctly on landscape-oriented pages and on back sides. Added also + support for the PPD keywords "*cupsBackSide:" and + "*APDuplexRequiresFlippedMargin:". + + * debian/patches/43_add-cdnj500-driver.dpatch: Added driver "cdnj500" for + HP DesignJet 500 and 800. + + -- Till Kamppeter Tue, 12 May 2009 15:49:49 +0200 + +ghostscript (8.64.dfsg.1-0ubuntu8) jaunty; urgency=low + + * SECURITY UPDATE: possible arbitrary code execution via JBIG2 symbol + dictionary segments + - debian/patches/41_CVE-2009-0196.dpatch: validate size of runlength + in export symbol table in jbig2dec/jbig2_symbol_dict.c. + - CVE-2009-0196 + * SECURITY UPDATE: denial of service and possible arbitrary code + execution via integer overflows in icclib + - debian/patches/42_CVE-2009-0792.dpatch: fix numerous overflows in + icclib/icc.c. + - CVE-2009-0792 + + -- Marc Deslauriers Thu, 09 Apr 2009 09:27:31 -0400 + +ghostscript (8.64.dfsg.1-0ubuntu7) jaunty; urgency=low + + * debian/patches/40_pdfwrite-numcopies.dpatch: PDF output device of + Ghostscript did not take into account /#copies or /NumCopies in the + PostScript input, which made some applications, like OpenOffice.org + print only one copy also if more than one copy is requested. No + Ghostscript prints multiple copies with "pdfwrite" if it is called + with "-dDoNumCopies" (LP: #320391, upstream bug #690355). + + -- Till Kamppeter Sun, 5 Apr 2009 22:11:49 +0200 + +ghostscript (8.64.dfsg.1-0ubuntu6) jaunty; urgency=low + + * SECURITY UPDATE: Arbitrary code execution due to integer overflows and + insufficient upper-bounds checks in the ICC library + - debian/patches/38_CVE-2009-0583_0584.dpatch: fix multiple integer + overflows and perform bounds checking in icclib/icc.c. + - CVE-2009-0583 + - CVE-2009-0584 + + -- Marc Deslauriers Fri, 27 Mar 2009 08:51:14 -0400 + +ghostscript (8.64.dfsg.1-0ubuntu5) jaunty; urgency=low + + * debian/patches/00list: Really apply the patch for LP: #333429. + + -- Till Kamppeter Wed, 25 Mar 2009 18:32:49 +0100 + +ghostscript (8.64.dfsg.1-0ubuntu4) jaunty; urgency=low + + * debian/patches/37_fix-segfault-in-cups-raster-output-device.dpatch: + Fixed segfault in the "cups" (CUPS Raster) output device of Ghostscript + (LP: #333429, upstream bug 690338). + + * debian/ghostscript.postinst: Silenced non-fatal error messages when + post-install script updates PPDs and there are PPDs not belonging to + a CUPS queue in /etc/cups/ppd/ (LP: #345866). + + -- Till Kamppeter Wed, 25 Mar 2009 16:13:49 +0100 + +ghostscript (8.64.dfsg.1-0ubuntu3) jaunty; urgency=low + + * debian/local/apport-hook.py, debian/rules: Added apport hook (LP: #338442). + + -- Till Kamppeter Thu, 19 Mar 2009 12:39:49 +0100 + +ghostscript (8.64.dfsg.1-0ubuntu2) jaunty; urgency=low + + * debian/patches/35_bitcmyk-blank-output.dpatch: The bitcmyk output device + produces zero length output (LP: #331127, upstream bug #690287). + + -- Till Kamppeter Wed, 18 Feb 2009 19:52:54 +0100 + +ghostscript (8.64.dfsg.1-0ubuntu1) jaunty; urgency=low + + * New upstream release (Ghostscript 8.64 final release) + o No functional change. This is only to let the final release not + appear as a release candidate in the help output and documentation. + + -- Till Kamppeter Tue, 03 Feb 2009 21:42:54 +0100 + +ghostscript (8.64.dfsg.1~svn9432-0ubuntu1) jaunty; urgency=low + + * New upstream release (SVN rev 9432, RC3) + o Fix regression of X output being broken with large images or other + cases of the image buffer being used (Upstream bug #690222, #690260). + o Fixed the bbox output device for example3.ps in LP: #160203. + + -- Till Kamppeter Mon, 02 Feb 2009 21:42:53 +0100 + +ghostscript (8.64.dfsg.1~svn9415-0ubuntu1) jaunty; urgency=low + + * New upstream release (SVN rev 9415, RC2) + o Fix problem of X display not completely clearing the previous page + before drawing the next page (Upstream bug #690255). + + -- Till Kamppeter Wed, 28 Jan 2009 00:12:16 +0100 + +ghostscript (8.64.dfsg.1~svn9403-0ubuntu1) jaunty; urgency=low + + * New upstream release (SVN rev 9403, RC1) + o Output of PDF-to-PostScript conversion was not DSC-conforming and + prevented CUPS from switching trays when the page size changes in + the middle of the document (LP: #310575) + o All but one Debian patches are incorporated upstream now. + * debian/patches/32_improve-handling-of-media-size-changes-from-gv.dpatch: + Removed, applied upstream. + + -- Till Kamppeter Tue, 27 Jan 2009 10:28:07 +0100 + +ghostscript (8.64.dfsg.1~svn9377-0ubuntu1) jaunty; urgency=low + + * New upstream release (SVN rev 9377) + o Fixes many bugs concerning PDF rendering, to make the PDF printing + workflow correctly working. + o Fixes long-standing bugs in many drivers, like input paper tray and + duplex options not working for the built-in PCL 4, 5, 5c, 5e, and + 6/XL drivers, PDF input not working for bjc600, bjc800, and cups + output devices, several options not working and uninitialized + memory with cups output device. + o Merged nearly all patches of the Ubuntu and Debian packages upstream. + o Fixes LP: #317810, LP: #314439, LP: #314018. + * debian/patches/03_libpaper_support.dpatch, + debian/patches/11_gs-cjk_font_glyph_handling_fix.dpatch, + debian/patches/12_gs-cjk_vertical_writing_metrics_fix.dpatch, + debian/patches/13_gs-cjk_cjkps_examples.dpatch, + debian/patches/20_bbox_segv_fix.dpatch, + debian/patches/21_brother_7x0_gdi_fix.dpatch, + debian/patches/22_epsn_margin_workaround.dpatch, + debian/patches/24_gs_man_fix.dpatch, + debian/patches/25_toolbin_insecure_tmp_usage_fix.dpatch, + debian/patches/26_assorted_script_fixes.dpatch, + debian/patches/29_gs_css_fix.dpatch, + debian/patches/30_ps2pdf_man_improvement.dpatch, + debian/patches/31_fix-gc-sigbus.dpatch, + debian/patches/34_ftbfs-on-hurd-fix.dpatch, + debian/patches/35_disable_libcairo.dpatch, + debian/patches/38_pxl-duplex.dpatch, + debian/patches/39_pxl-resolution.dpatch, + debian/patches/42_gs-init-ps-delaybind-fix.dpatch, + debian/patches/45_bjc600-bjc800-pdf-input.dpatch, + debian/patches/48_cups-output-device-pdf-duplex-uninitialized-memory-fix.dpatch, + debian/patches/50_lips4-floating-point-exception.dpatch, + debian/patches/52_cups-device-logging.dpatch, + debian/patches/55_pcl-input-slot-fix.dpatch, + debian/patches/57_pxl-input-slot-fix.dpatch, + debian/patches/60_pxl-cups-driver-pdf.dpatch, + debian/patches/62_onebitcmyk-pdf.dpatch, + debian/patches/65_too-big-temp-files-1.dpatch, + debian/patches/67_too-big-temp-files-2.dpatch, + debian/patches/70_take-into-account-data-in-stream-buffer-before-refill.dpatch: + Removed, applied upstream. + * debian/patches/01_docdir_fix_for_debian.dpatch, + debian/patches/02_gs_man_fix_debian.dpatch, + debian/patches/01_docdir-fix-for-debian.dpatch, + debian/patches/02_docdir-fix-for-debian.dpatch: Renamed patches to + make merging with Debian easier. + * debian/patches/32_improve-handling-of-media-size-changes-from-gv.dpatch, + debian/patches/33_bad-params-to-xinitimage-on-large-bitmaps.dpatch: + regenerated for new source directory structure. + * debian/rules: Corrected paths to remove cidfmap (it is in Resource/Init/ + in GS 8.64) and to install headers (source paths are psi/ and base/ now). + * debian/rules: Remove all fontmaps, as DeFoMa replaces them. + * debian/local/pdftoraster/pdftoraster.c, + debian/local/pdftoraster/pdftoraster.convs, debian/rules: Removed + added pdftoraster filter and use the one which comes with Ghostscript. + * debian/ghostscript.links: s/8.63/8.64/ + + -- Till Kamppeter Tue, 20 Jan 2009 16:40:45 +0100 + ghostscript (8.64~dfsg-13) unstable; urgency=low * Fix ghostscript-cups to recommend (not depend on) cups and @@ -830,6 +2087,33 @@ -- Jonas Smedegaard Sun, 08 Mar 2009 01:16:27 +0100 +ghostscript (8.63.dfsg.1-2ubuntu2) jaunty; urgency=low + + * debian/rules: Removed /usr/share/ghostscript/8.63/lib/cidfmap, so that + DeFoMa's cidfmap gets used. Otherwise Ubuntu's CJK fonts will not get + found by Ghostscript (Thanks to Koji Otani from BBR Inc., Japan for the + hint). + + -- Till Kamppeter Tue, 6 Jan 2009 09:40:45 +0100 + +ghostscript (8.63.dfsg.1-2ubuntu1) jaunty; urgency=low + + * debian/patches/02_gs_man_fix_debian.dpatch: Corrected paths in the man + page. + * debian/patches/14_gs-cjk_big_cmap_post_table.dpatch, + debian/patches/23_gdevxini_segv_fix.dpatch, + debian/patches/28_print_encrypted_PDFs_from_adobe_reader_8.dpatch: + Removed obsolete patches which were not applied any more for longer time. + * debian/patches/48_cups-output-device-pdf-duplex-uninitialized-memory.patch.dpatch: + Removed accidentally generated file. + * Merge from debian unstable, remaining changes: + - gs-esp and gs-common depend only on ghostscript, not on ghostscript-x, + as gs-esp had already split off gs-esp-x in Ubuntu + - Resource/Font directory left in the .orig.tar.gz, therefore also left + the lines for removing faulty fonts in debian/rules active. + + -- Till Kamppeter Mon, 5 Jan 2009 12:21:45 +0100 + ghostscript (8.63.dfsg.1-2) unstable; urgency=low * libgs-dev: put versioned dependency on libgs8 - closes: #510691 @@ -918,6 +2202,162 @@ -- Masayuki Hatta (mhatta) Sun, 04 Jan 2009 09:30:13 +0900 +ghostscript (8.63.dfsg.1-0ubuntu13) jaunty; urgency=low + + * debian/patches/70_take-into-account-data-in-stream-buffer-before-refill.dpatch: + Certain files lead to a Ghostscript error due to wrong handling of the + stream buffer (LP: #306125, upstream bug #690090). + + * debian/patches/67_too-big-temp-files-2.dpatch: Complete fix for the too big + temporary files. Now the bug is completely fixed. Temp files are not much + bigger than the jobs themselves now (LP: #288570, upstream bug #690133). + + -- Till Kamppeter Sun, 14 Dec 2008 15:37:45 +0100 + +ghostscript (8.63.dfsg.1-0ubuntu12) jaunty; urgency=low + + * debian/patches/65_too-big-temp-files-1.dpatch: Ghostscript produced much too + big temporary files (> 10 GB) when printing photos from GNOME apps in + 1200 dpi. Part 1 of the fix which reduces the temp file size to less than + 2 GB (LP: #288570, upstream bug #690133). + + -- Till Kamppeter Wed, 3 Dec 2008 23:37:45 +0100 + +ghostscript (8.63.dfsg.1-0ubuntu11) jaunty; urgency=low + + * debian/patches/60_pxl-cups-driver-pdf.dpatch: The pstopxl filter did not + remove its temporary file after finishing. + + -- Till Kamppeter Sat, 29 Nov 2008 13:37:45 +0100 + +ghostscript (8.63.dfsg.1-0ubuntu10) jaunty; urgency=low + + * debian/ghostscript.postinst: Do not try to update the PPDs of existing + print queues if CUPS is not installed or not running (LP: #302532). + + -- Till Kamppeter Wed, 26 Nov 2008 22:26:45 +0100 + +ghostscript (8.63.dfsg.1-0ubuntu9) jaunty; urgency=low + + * debian/ghostscript.postinst: Added automatic update of the PPD files + of already existing print queues. + + -- Till Kamppeter Wed, 26 Nov 2008 18:18:22 +0100 + +ghostscript (8.63.dfsg.1-0ubuntu8) jaunty; urgency=low + + * Release for assorted upstream fixes. + + * debian/patches/52_cups-device-logging.dpatch: Made logging of the "cups" + output device much less verbose. The log of one jub in debug mode did not + fit into the maximum log file size of CUPS. + + * debian/patches/55_pcl-input-slot-fix.dpatch: Made the paper tray selection + via "-dMediaPosition=..." in the PCL 4/5/5e drivers work (Upstream bug + #690182). + + * debian/patches/57_pxl-input-slot-fix.dpatch: Made the paper tray selection + via "-dMediaPosition=..." in the PCL 6/XL drivers work. + + * debian/patches/60_pxl-cups-driver-pdf.dpatch: Made the PCL-XL CUPS filter + and PPDs work with PDF input. + + * debian/patches/62_onebitcmyk-pdf.dpatch: Check the whole Decode array to + detect special cases of identity and inverse decoding in PDF files + (Upstream bug #690178). + + -- Till Kamppeter Wed, 26 Nov 2008 11:30:22 +0200 + +ghostscript (8.63.dfsg.1-0ubuntu7) jaunty; urgency=low + + * debian/local/pdftoraster/pdftoraster.c, + debian/local/pdftoraster/pdftoraster.convs, debian/rules: Added pdftoraster + filter from the Ghostscript SVN repository (LP: #290395). + + * debian/control: Added conflict with cups < 1.3.9-4 because the pdftoraster + filter was there before. + + * debian/patches/50_lips4-floating-point-exception: Fixed floating-point + exception in "lips4" and other drivers (Upstream bug #690122). + + -- Till Kamppeter Tue, 11 Nov 2008 10:33:22 +0200 + +ghostscript (8.63.dfsg.1-0ubuntu6) intrepid; urgency=low + + * debian/patches/42_gs-init-ps-delaybind-fix.dpatch: Make "ps2ascii" working + again (LP: #281419, upstream bug #690124). + + * debian/patches/45_bjc600-bjc800-pdf-input.dpatch: Fix setting of the + "DitheringType" option. With PDF input Ghostscript crashes, with + PostScript input the "DitheringType" option was probably ignored + (Upstream bug #690032). + + * debian/patches/48_cups-output-device-pdf-duplex-uninitialized-memory.patch.dpatch: + Fixed several bugs in the "cups" (CUPS Raster) output device: + - Ghostscript crashed with PDF input data + - The "Duplex" and "MediaWeight" options were ignored + - There was uninitialized memory and wrong usage of pointers, potential + cause for segmentation faults or even vulnerabilities + - There were mismatches in data types, leading to possible breakage + of the "AdvanceDistance", "MediaWeight", and "cupsStringXX" options. + (Upstream bug #690101). + + -- Till Kamppeter Sun, 19 Oct 2008 12:48:22 +0200 + +ghostscript (8.63.dfsg.1-0ubuntu5) intrepid; urgency=low + + * debian/patches/38_pxl-duplex.dpatch: The Duplex option of the "pxlmono" + and "pxlcolor" drivers did not work (part 1 of the fix for LP: #282738). + + * debian/patches/39_pxl-resolution.dpatch: The resolution must be also set + as PJL command for the "pxlmono" and "pxlcolor" drivers. + + -- Till Kamppeter Mon, 13 Oct 2008 22:55:22 +0200 + +ghostscript (8.63.dfsg.1-0ubuntu4) intrepid; urgency=low + + * debian/control, debian/rules: Merge ghostscript-fonts back into + ghostscript, since this is not needed at present. + * debian/rules: Drop most of the fonts from ghostscript since gsfonts + ships newer versions. + + -- Steve Langasek Thu, 21 Aug 2008 07:29:40 +0000 + +ghostscript (8.63.dfsg.1-0ubuntu3) intrepid; urgency=low + + * debian/rules: Fixed typo (LP: #256975). + * debian/ghostscript.links: s/8.62/8.63/ + * debian/patches/35_disable_libcairo.dpatch: Added possibility to + compile Ghostscript without the "cairo" output device. The device + is still in experimental state and with its dependency on libcairo + it pulls in a dependency on X. + * debian/control, debian/rules: Build Ghostscript without the "cairo" + output device (LP: #256859). + + -- Till Kamppeter Mon, 11 Aug 2008 17:10:22 +0200 + +ghostscript (8.63.dfsg.1-0ubuntu2) intrepid; urgency=low + + * debian/control, debian/rules: Split the fonts off into its own + "ghostscript-fonts" package. Changes dependencies of "ghostscript" + package that either "ghostscript-fonts" or "gsfonts" can be used. + + -- Till Kamppeter Mon, 11 Aug 2008 10:10:22 +0200 + +ghostscript (8.63.dfsg.1-0ubuntu1) intrepid; urgency=low + + * New upstream release + * Merge from debian unstable, remaining changes: + - gs-esp and gs-common depend only on ghostscript, not on ghostscript-x, + as gs-esp had already split off gs-esp-x in Ubuntu + * debian/patches/12_gs-cjk_vertical_writing_metrics_fix.dpatch, + debian/patches/30_ps2pdf_man_improvement.dpatch: Adapted to upstream + changes. + * debian/control: Added libcairo2-dev to the build dependencies, as + Ghostscript has a libcairo-based output device now. + + -- Till Kamppeter Tue, 5 Aug 2008 11:10:22 +0200 + ghostscript (8.62.dfsg.1-3.2) unstable; urgency=low * Non-maintainer upload. @@ -946,6 +2386,23 @@ -- Masayuki Hatta (mhatta) Sun, 20 Jul 2008 08:59:17 +0900 +ghostscript (8.62.dfsg.1-2.1ubuntu1) intrepid; urgency=low + + * Merge from debian unstable, remaining changes: + - gs-esp and gs-common depend only on ghostscript, not on ghostscript-x, + as gs-esp had already split off gs-esp-x in Ubuntu + * debian/libgs8.shlibs: Removed. All libgs8 versions should have the same + API and ABI. The artificial restriction set by this file required all + reverse dependencies to be rebuilt for every stable release of Ghostscript. + * debian/ghostscript.doc-base: Removed. The file conflicts with the + corresponding file of ghostscript-doc and it also points to documentation + files which make only part of ghostscript-doc, so the files can be not + installed when this doc-base file is installed. + * debian/ghostscript-doc.doc-base: Corrected file mask for all HTML files. + The Ghostscript documentation is in *.htm files. + + -- Till Kamppeter Mon, 9 Jun 2008 18:41:22 +0200 + ghostscript (8.62.dfsg.1-2.1) unstable; urgency=high * Non-maintainer upload. @@ -1002,6 +2459,34 @@ -- Nico Golde Sat, 01 Mar 2008 11:18:27 +0100 +ghostscript (8.61.dfsg.1-1ubuntu3) hardy; urgency=low + + * SECURITY UPDATE: buffer overflow in color space handling code + * debian/patches/31_CVE-2008-0411.dpatch: fix zseticcspace() to perform + range checks + * References + CVE-2008-0411 + + -- Jamie Strandboge Tue, 08 Apr 2008 11:58:11 -0400 + +ghostscript (8.61.dfsg.1-1ubuntu2) hardy; urgency=low + + * Fix debian/libgs8.shlibs for ubuntu version number + + -- Jonathan Riddell Sat, 16 Feb 2008 18:45:47 +0000 + +ghostscript (8.61.dfsg.1-1ubuntu1) hardy; urgency=low + + * Merge from debian unstable, remaining changes: + - gs-esp and gs-common depend only on ghostscript, not on ghostscript-x, + as gs-esp had already split off gs-esp-x in Ubuntu + - Updated the KRGB patch from HP to the newest upstream version with + added checks for null forward device in the graphic procedures to fix + segfault bug LP: #69905 and corrected "force banding" code in gsijs_open + for small images (IE: hagaki in landscape). + + -- Till Kamppeter Wed, 6 Feb 2008 17:41:22 +0100 + ghostscript (8.61.dfsg.1-1) unstable; urgency=low [Masayuki Hatta] @@ -1038,6 +2523,57 @@ -- Masayuki Hatta (mhatta) Sun, 13 Jan 2008 02:13:25 +0900 +ghostscript (8.61.dfsg.1-0ubuntu5) hardy; urgency=low + + * debian/rules: Do not ship README.gz in ghostscript, it collides with + ghostscript-doc. (LP: #185602, Debian #460692) + + -- Martin Pitt Wed, 30 Jan 2008 11:11:03 +0100 + +ghostscript (8.61.dfsg.1-0ubuntu4) hardy; urgency=low + + * debian/patches/09_ijs_krgb_support.dpatch: Updated the KRGB patch from + HP to the newest upstream version with added checks for null forward + device in the graphic procedures to fix segfault bug LP: #69905 and + corrected "force banding" code in gsijs_open for small images (IE: + hagaki in landscape). + + -- Till Kamppeter Wed, 23 Jan 2008 13:17:43 +0000 + +ghostscript (8.61.dfsg.1-0ubuntu3) hardy; urgency=low + + * debian/patches/42_print_encrypted_PDFs_from_adobe_reader_8.dpatch: + Fixed printing of encrypted PDF files from Adobe Reader 8.1.1. This is + the real fix now and not only a workaround. (Ghostscript bug #689577, + Ubuntu bug LP: #172264). + + -- Till Kamppeter Mon, 12 Dec 2007 12:17:43 +0000 + +ghostscript (8.61.dfsg.1-0ubuntu2) hardy; urgency=low + + * Merge with Debian unstable. Remaining Ubuntu changes: + - gs-esp and gs-common depend only on ghostscript, not on ghostscript-x, + as gs-esp had already split off gs-esp-x in Ubuntu + - Upstream version 8.61 final + * debian/patches/40_cups_filters_with_buffered_input.dpatch: Modified + cups/psto* filters to let Ghostscript always use buffered input. This + works around a Ghostscript bug which prevents printing encrypted PDF + files with Adobe Reader 8.1.1 and Ghostscript built as shared library + (Ghostscript bug #689577, Ubuntu bug LP: #172264) + + -- Till Kamppeter Wed, 5 Dec 2007 13:17:43 +0000 + +ghostscript (8.61.dfsg.1-0ubuntu1) hardy; urgency=low + + * New upstream release + o Final 8.61 release + * debian/patches/09_ijs_krgb_support.dpatch: Adapted to upstream changes. + * debian/rules: Updated CUPS-related variables for "make install" calls. + * debian/rules: Remove /usr/include/ghostscript from the ghostscript + package, they go into libgs-dev. + + -- Till Kamppeter Thu, 22 Nov 2007 12:17:43 +0000 + ghostscript (8.61.dfsg.1~svn8187-3) unstable; urgency=low * Maintainer upload. @@ -2166,3 +3702,4 @@ (Sorry!) -- joost witteveen Thu, 31 Oct 1996 20:56:01 +0100 + diff -Nru ghostscript-9.04~dfsg/debian/control ghostscript-9.05~dfsg~20120125/debian/control --- ghostscript-9.04~dfsg/debian/control 2011-11-24 06:02:23.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/debian/control 2012-01-25 21:37:46.000000000 +0000 @@ -1,14 +1,14 @@ Source: ghostscript Section: text Priority: optional -Maintainer: Debian Printing Team +Maintainer: Ubuntu Developers +XSBC-Original-Maintainer: Debian Printing Team Build-Depends: cdbs (>= 0.4.72~), autoconf, debhelper, dh-buildinfo, devscripts, liblcms2-dev, - liblcms1-dev, libfreetype6-dev, libcups2-dev (>= 1.3.7), libcupsimage2-dev (>= 1.1.20final+rc1-4), @@ -61,6 +61,17 @@ printed on non-PostScript printers. Supported printers include common dot-matrix, inkjet and laser models. +Package: gs-common +Architecture: all +Priority: extra +Depends: ghostscript, ${cdbs:Depends}, + ${misc:Depends} +Description: Transitional dummy package for ghostscript + This is a dummy package provided for a smooth transition from previous + separately packages Ghostscript flavors now replaced by ghostscript. + . + It may safely be removed after installation. + Package: ghostscript-cups Architecture: any Depends: ${shlibs:Depends}, @@ -128,7 +139,8 @@ Section: libs Architecture: all Depends: ${misc:Depends} -Replaces: ${cdbs:Replaces} +Breaks: ghostscript (<< 9.01~dfsg-1) +Replaces: ${cdbs:Replaces}, ghostscript (<< 9.01~dfsg-1) Description: interpreter for the PostScript language and for PDF - common files GPL Ghostscript is used for PostScript/PDF preview and printing. Usually as a back-end to a program such as ghostview, it can display @@ -140,7 +152,21 @@ Package: libgs-dev Section: libdevel Architecture: any -Depends: ${devlibs:Depends}, +Depends: libgs9 (= ${binary:Version}), + libc6-dev, + libcups2-dev, + libcupsimage2-dev, + libfontconfig1-dev, + libidn11-dev, + libijs-dev, + libjasper-dev, + libjbig2dec0-dev, + libjpeg-dev, + liblcms2-dev, + libpaper-dev, + libpng12-0-dev, + libtiff4-dev, + zlib1g-dev, ${cdbs:Depends}, ${misc:Depends} Conflicts: ${cdbs:Conflicts} diff -Nru ghostscript-9.04~dfsg/debian/control.in ghostscript-9.05~dfsg~20120125/debian/control.in --- ghostscript-9.04~dfsg/debian/control.in 2011-11-24 06:42:42.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/debian/control.in 2012-01-25 23:36:32.000000000 +0000 @@ -32,6 +32,17 @@ printed on non-PostScript printers. Supported printers include common dot-matrix, inkjet and laser models. +Package: gs-common +Architecture: all +Priority: extra +Depends: ghostscript, ${cdbs:Depends}, + ${misc:Depends} +Description: Transitional dummy package for ghostscript + This is a dummy package provided for a smooth transition from previous + separately packages Ghostscript flavors now replaced by ghostscript. + . + It may safely be removed after installation. + Package: ghostscript-cups Architecture: any Depends: ${shlibs:Depends}, @@ -99,7 +110,8 @@ Section: libs Architecture: all Depends: ${misc:Depends} -Replaces: ${cdbs:Replaces} +Breaks: ghostscript (<< 9.01~dfsg-1) +Replaces: ${cdbs:Replaces}, ghostscript (<< 9.01~dfsg-1) Description: interpreter for the PostScript language and for PDF - common files GPL Ghostscript is used for PostScript/PDF preview and printing. Usually as a back-end to a program such as ghostview, it can display @@ -111,7 +123,21 @@ Package: libgs-dev Section: libdevel Architecture: any -Depends: ${devlibs:Depends}, +Depends: libgs9 (= ${binary:Version}), + libc6-dev, + libcups2-dev, + libcupsimage2-dev, + libfontconfig1-dev, + libidn11-dev, + libijs-dev, + libjasper-dev, + libjbig2dec0-dev, + libjpeg-dev, + liblcms2-dev, + libpaper-dev, + libpng12-0-dev, + libtiff4-dev, + zlib1g-dev, ${cdbs:Depends}, ${misc:Depends} Conflicts: ${cdbs:Conflicts} diff -Nru ghostscript-9.04~dfsg/debian/control.in.in ghostscript-9.05~dfsg~20120125/debian/control.in.in --- ghostscript-9.04~dfsg/debian/control.in.in 2011-11-24 03:43:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/debian/control.in.in 2012-01-25 20:35:59.000000000 +0000 @@ -32,6 +32,17 @@ printed on non-PostScript printers. Supported printers include common dot-matrix, inkjet and laser models. +Package: gs-common +Architecture: all +Priority: extra +Depends: ghostscript, ${cdbs:Depends}, + ${misc:Depends} +Description: Transitional dummy package for ghostscript + This is a dummy package provided for a smooth transition from previous + separately packages Ghostscript flavors now replaced by ghostscript. + . + It may safely be removed after installation. + Package: ghostscript-cups Architecture: any Depends: ${shlibs:Depends}, @@ -99,7 +110,8 @@ Section: libs Architecture: all Depends: ${misc:Depends} -Replaces: ${cdbs:Replaces} +Breaks: ghostscript (<< 9.01~dfsg-1) +Replaces: ${cdbs:Replaces}, ghostscript (<< 9.01~dfsg-1) Description: interpreter for the PostScript language and for PDF - common files GPL Ghostscript is used for PostScript/PDF preview and printing. Usually as a back-end to a program such as ghostview, it can display @@ -111,7 +123,21 @@ Package: libgs-dev Section: libdevel Architecture: any -Depends: ${devlibs:Depends}, +Depends: libgs9 (= ${binary:Version}), + libc6-dev, + libcups2-dev, + libcupsimage2-dev, + libfontconfig1-dev, + libidn11-dev, + libijs-dev, + libjasper-dev, + libjbig2dec0-dev, + libjpeg-dev, + liblcms2-dev, + libpaper-dev, + libpng12-0-dev, + libtiff4-dev, + zlib1g-dev, ${cdbs:Depends}, ${misc:Depends} Conflicts: ${cdbs:Conflicts} diff -Nru ghostscript-9.04~dfsg/debian/copyright ghostscript-9.05~dfsg~20120125/debian/copyright --- ghostscript-9.04~dfsg/debian/copyright 2011-11-24 05:54:22.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/debian/copyright 2012-01-25 22:39:59.000000000 +0000 @@ -4,73 +4,10 @@ Source: http://downloads.ghostscript.com/public/ Repackaged, excluding non-DFSG files and unused external projects Files-Excluded: - Resource/CMap/90ms-RKSJ-UCS2 - Resource/CMap/90pv-RKSJ-UCS2 - Resource/CMap/90pv-RKSJ-UCS2C - Resource/CMap/Adobe-CNS1-B5pc - Resource/CMap/Adobe-CNS1-ETenms-B5 - Resource/CMap/Adobe-CNS1-H-CID - Resource/CMap/Adobe-CNS1-H-Host - Resource/CMap/Adobe-CNS1-H-Mac - Resource/CMap/Adobe-CNS1-UCS2 - Resource/CMap/Adobe-GB1-GBK-EUC - Resource/CMap/Adobe-GB1-GBpc-EUC - Resource/CMap/Adobe-GB1-H-CID - Resource/CMap/Adobe-GB1-H-Host - Resource/CMap/Adobe-GB1-H-Mac - Resource/CMap/Adobe-GB1-UCS2 - Resource/CMap/Adobe-Japan1-90ms-RKSJ - Resource/CMap/Adobe-Japan1-90pv-RKSJ - Resource/CMap/Adobe-Japan1-H-CID - Resource/CMap/Adobe-Japan1-H-Host - Resource/CMap/Adobe-Japan1-H-Mac - Resource/CMap/Adobe-Japan1-PS-H - Resource/CMap/Adobe-Japan1-PS-V - Resource/CMap/Adobe-Japan1-UCS2 - Resource/CMap/Adobe-Korea1-H-CID - Resource/CMap/Adobe-Korea1-H-Host - Resource/CMap/Adobe-Korea1-H-Mac - Resource/CMap/Adobe-Korea1-KSCms-UHC - Resource/CMap/Adobe-Korea1-KSCpc-EUC - Resource/CMap/Adobe-Korea1-UCS2 - Resource/CMap/B5pc-UCS2 - Resource/CMap/B5pc-UCS2C - Resource/CMap/CNS01-RKSJ-H - Resource/CMap/CNS02-RKSJ-H - Resource/CMap/CNS03-RKSJ-H - Resource/CMap/CNS04-RKSJ-H - Resource/CMap/CNS05-RKSJ-H - Resource/CMap/CNS06-RKSJ-H - Resource/CMap/CNS07-RKSJ-H - Resource/CMap/CNS15-RKSJ-H - Resource/CMap/ETen-B5-UCS2 - Resource/CMap/GB-RKSJ-H - Resource/CMap/GBK-EUC-UCS2 - Resource/CMap/GBT-RKSJ-H - Resource/CMap/GBpc-EUC-UCS2 - Resource/CMap/GBpc-EUC-UCS2C - Resource/CMap/HK-RKSJ-H - Resource/CMap/Hojo-RKSJ-H - Resource/CMap/KSC-RKSJ-H - Resource/CMap/KSC2-RKSJ-H - Resource/CMap/KSCms-UHC-UCS2 - Resource/CMap/KSCpc-EUC-UCS2 - Resource/CMap/KSCpc-EUC-UCS2C - Resource/CMap/TCVN-RKSJ-H - Resource/CMap/UCS2-90ms-RKSJ - Resource/CMap/UCS2-90pv-RKSJ - Resource/CMap/UCS2-B5pc - Resource/CMap/UCS2-ETen-B5 - Resource/CMap/UCS2-GBK-EUC - Resource/CMap/UCS2-GBpc-EUC - Resource/CMap/UCS2-KSCms-UHC - Resource/CMap/UCS2-KSCpc-EUC - Resource/CMap/Identity-UTF16-H - Resource/CMap/Identity-UTF16-V -Files-Excluded: cups/libs/* expat/* freetype/* + icclib/* ijs/* jasper/* jbig2dec/* @@ -79,6 +16,7 @@ lcms/* lcms2/* libpng/* + openjpeg/* tiff/* zlib/* @@ -104,7 +42,11 @@ 2003-2004, Hewlett-Packard Development Company, LP License: GPL-3+~Artifex -Files: Resource/CMap/* +Files: Resource/CMap/Identity-UTF16-H +Copyright: 2003 Artifex Software +License: GPL-3+~Artifex + +Files: Resource/CMap/* Copyright: 1990-2010, Adobe Systems Incorporated License: other-Adobe @@ -112,10 +54,6 @@ Copyright: 1996-2001 Martin Lottermoser License: LGPL-2.1~pcl3 -Files: icclib/* -Copyright: 1997-2002, Graeme W. Gill -License: icclib - Files: imdi/* Copyright: 2000-2004, Graeme W. Gill License: GPL-2~IMDI @@ -176,7 +114,7 @@ License: GAP~configure Files: cups/gdevcups.c - cups/pstoraster.convs + cups/gstoraster.convs cups/pxlcolor.ppd cups/pxlmono.ppd Copyright: 1993-2006, Easy Software Products @@ -261,7 +199,7 @@ 2007, Artifex Software, Inc License: GPL-2+~you -Files: cups/pstopxl.in +Files: cups/gstopxl.in Copyright: 2001-2005, Easy Software Products License: GPL-2+~you @@ -361,6 +299,7 @@ Files: debian/* Copyright: 2004-2009, Masayuki Hatta (mhatta) 2009-2011, Jonas Smedegaard + 2007-2011, Till Kamppeter License: GPL-2+ Files: debian/update-gsfontmap diff -Nru ghostscript-9.04~dfsg/debian/ghostscript-cups.postinst ghostscript-9.05~dfsg~20120125/debian/ghostscript-cups.postinst --- ghostscript-9.04~dfsg/debian/ghostscript-cups.postinst 2011-11-24 03:43:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/debian/ghostscript-cups.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -#! /bin/bash - -set -e - -# Limit lp* commands to localhost to avoid hanging. See bug#543468 -lpopts='-h /var/run/cups/cups.sock' - -case "$1" in - configure) - # Do the following only if CUPS is running and the needed CUPS tools - # are available - if which lpstat > /dev/null 2>&1 \ - && which lpinfo > /dev/null 2>&1 \ - && which lpadmin > /dev/null 2>&1 \ - && LC_ALL=C lpstat $lpopts -r > /dev/null 2>&1; then - # Update the PPD files of all already installed print queues - driverregexp='lsb/usr/ghostscript/' - gennicknameregexp='' - [ ! -z "$gennicknameregexp" ] \ - && gennicknameregexp="; $gennicknameregexp" - gennicknameregexp='s/\s*\(recommended\)//'"$gennicknameregexp" - tempfiles= - trap 'rm -f $tempfiles; exit 0' 0 HUP INT QUIT ILL ABRT PIPE TERM - tmpfile1=`mktemp -t updateppds.XXXXXX` - tempfiles="$tempfiles $tmpfile1" - lpinfo $lpopts -m | grep -E $driverregexp > $tmpfile1 - cd /etc/cups/ppd - for ppd in *.ppd; do - [ -r "$ppd" ] || continue - queue=${ppd%.ppd} - lpstat $lpopts -p "$queue" >/dev/null 2>&1 || continue - nickname=`grep '\*NickName:' "$ppd" | cut -d '"' -f 2 | perl -p -e 's/\n$//' | perl -p -e "$gennicknameregexp" | perl -p -e 's/(\W)/\\\\$1/g'` - lang=`grep '\*LanguageVersion:' "$ppd" | cut -d ' ' -f 2 | perl -e 'print lc(<>)' | perl -p -e 's/[\r\n]//gs'` - ppdfound="0" - englishppduri="" - tmpfile2=`mktemp -t updateppds.XXXXXX` - tempfiles="$tempfiles $tmpfile2" - cat $tmpfile1 | perl -p -e "$gennicknameregexp" | grep -E '^\S+\s+.*'"$nickname"'$' | cut -d ' ' -f 1 > $tmpfile2 - while read newppduri; do - [ "$ppdfound" = "0" ] && lpadmin $lpopts -p "$queue" -m $newppduri 2>/dev/null || continue - newlang=`grep '\*LanguageVersion:' "$ppd" | cut -d ' ' -f 2 | perl -e 'print lc(<>)' | perl -p -e 's/[\r\n]//gs'` - [ "$newlang" = "$lang" ] && ppdfound="1" - [ "$newlang" = "english" ] && englishppduri="$newppduri" - done < $tmpfile2 - [ "$ppdfound" = "0" ] && [ ! -z "$englishppduri" ] && lpadmin $lpopts -p "$queue" -m $englishppduri 2>/dev/null && ppdfound="1" - [ "$ppdfound" = "1" ] && echo PPD for printer $queue updated >&2 - done - fi - ;; - abort-upgrade|abort-remove|abort-deconfigure) - ;; - *) - echo "postinst called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - -#DEBHELPER# - -exit 0 diff -Nru ghostscript-9.04~dfsg/debian/ghostscript-cups.ppd-updater ghostscript-9.05~dfsg~20120125/debian/ghostscript-cups.ppd-updater --- ghostscript-9.04~dfsg/debian/ghostscript-cups.ppd-updater 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/debian/ghostscript-cups.ppd-updater 2012-01-25 20:43:14.000000000 +0000 @@ -0,0 +1,2 @@ +DRIVER_REGEXP=lsb/usr/ghostscript/ +GENNICKNAME_REGEXP= diff -Nru ghostscript-9.04~dfsg/debian/ghostscript.preinst ghostscript-9.05~dfsg~20120125/debian/ghostscript.preinst --- ghostscript-9.04~dfsg/debian/ghostscript.preinst 2011-11-24 03:43:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/debian/ghostscript.preinst 2012-01-25 20:47:23.000000000 +0000 @@ -4,21 +4,14 @@ case "$1" in install|upgrade) - # Do away with update-alternative for /usr/bin/gs, we have one - # grand unified Ghostscript now! - if dpkg --compare-versions "$2" lt-nl "8.63.dfsg.1-1"; then - update-alternatives --remove-all gs || true - update-alternatives --remove-all gs.1 || true - fi - # Do away with update-alternative for /usr/bin/ps2pdf, upstream # provides it as a script - if dpkg --compare-versions "$2" lt-nl "8.64~dfsg-1"; then + if dpkg --compare-versions "$2" lt-nl "9.00~dfsg-2ubuntu1"; then update-alternatives --remove-all ps2pdf || true fi # Remove obsolete defoma files - if dpkg --compare-versions "$2" lt-nl "8.71~dfsg2-1"; then + if dpkg --compare-versions "$2" lt-nl "8.71.dfsg.1-0ubuntu5.2"; then rm -rf /var/lib/defoma/gs.d rm -f /etc/defoma/ghostscript.subst-rule rm -f /etc/defoma/ghostscript.subst-rule~ diff -Nru ghostscript-9.04~dfsg/debian/libgs-dev.install ghostscript-9.05~dfsg~20120125/debian/libgs-dev.install --- ghostscript-9.04~dfsg/debian/libgs-dev.install 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/debian/libgs-dev.install 2012-01-25 20:40:07.000000000 +0000 @@ -0,0 +1,3 @@ +usr/include/ghostscript +usr/lib/libgs.a +usr/lib/libgs.so diff -Nru ghostscript-9.04~dfsg/debian/libgs__VER__.install.in ghostscript-9.05~dfsg~20120125/debian/libgs__VER__.install.in --- ghostscript-9.04~dfsg/debian/libgs__VER__.install.in 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/debian/libgs__VER__.install.in 2012-01-25 20:38:43.000000000 +0000 @@ -0,0 +1 @@ +usr/lib/libgs.so.* diff -Nru ghostscript-9.04~dfsg/debian/patches/020110819~fa67a1d.patch ghostscript-9.05~dfsg~20120125/debian/patches/020110819~fa67a1d.patch --- ghostscript-9.04~dfsg/debian/patches/020110819~fa67a1d.patch 2011-11-24 03:43:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/debian/patches/020110819~fa67a1d.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -Description: Add sys/time.h definition only once - If unix-aux.mak finds sys/time.h exists, make definition it adds to - gconfig_.h conditional on it not being defined already (it can now be - defined in the compiler flags as setup by configure). -Origin: http://git.ghostscript.com/?p=ghostpdl.git;a=commit;h=fa67a1 -Author: Chris Liddell -Forwarded: yes -Last-Update: 2011-09-17 - ---- a/base/unix-aux.mak -+++ b/base/unix-aux.mak -@@ -118,6 +118,8 @@ - if ( test -f $(INCLUDE)/ndir.h ); then $(ECHOGS_XE) -a $(gconfig__h) -x 23 define HAVE_NDIR_H; else true; fi - if ( test -f $(INCLUDE)/sys/dir.h ); then $(ECHOGS_XE) -a $(gconfig__h) -x 23 define HAVE_SYS_DIR_H; else true; fi - if ( test -f $(INCLUDE)/sys/ndir.h ); then $(ECHOGS_XE) -a $(gconfig__h) -x 23 define HAVE_SYS_NDIR_H; else true; fi -- if ( test -f $(INCLUDE)/sys/time.h ); then $(ECHOGS_XE) -a $(gconfig__h) -x 23 define HAVE_SYS_TIME_H; else true; fi -+ if ( test -f $(INCLUDE)/sys/time.h ); then $(ECHOGS_XE) -a $(gconfig__h) -x 23 ifndef HAVE_SYS_TIME_H ; \ -+ $(ECHOGS_XE) -a $(gconfig__h) -x 23 define HAVE_SYS_TIME_H ; \ -+ $(ECHOGS_XE) -a $(gconfig__h) -x 23 endif; else true; fi - if ( test -f $(INCLUDE)/sys/times.h ); then $(ECHOGS_XE) -a $(gconfig__h) -x 23 define HAVE_SYS_TIMES_H; else true; fi - if ( test -f $(JSRCDIR)/jmemsys.h); then true; else $(ECHOGS_XE) -a $(gconfig__h) -x 23 define DONT_HAVE_JMEMSYS_H; fi diff -Nru ghostscript-9.04~dfsg/debian/patches/1001_autoconfigure_cms_choice.patch ghostscript-9.05~dfsg~20120125/debian/patches/1001_autoconfigure_cms_choice.patch --- ghostscript-9.04~dfsg/debian/patches/1001_autoconfigure_cms_choice.patch 2011-11-24 03:43:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/debian/patches/1001_autoconfigure_cms_choice.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -Description: Autoconfigure choice of CMS in use -Author: Jonas Smedegaard -Last-Update: 2011-10-02 - ---- a/base/configure.ac -+++ b/base/configure.ac -@@ -645,14 +645,17 @@ - AC_SUBST(LIBPNGDIR) - #AC_SUBST(PNGDEVS) - -+WHICHCMS= -+ - AC_MSG_CHECKING([for local lcms library source]) - LCMSDIR=lcms - SHARELCMS=0 - if test -f $LCMSDIR/include/lcms.h; then - AC_MSG_RESULT([yes]) -+ WHICHCMS=lcms - else - AC_CHECK_LIB(lcms, cmsCreateXYZProfile, [ -- AC_CHECK_HEADERS([lcms.h], [SHARELCMS=1;LCMSDIR=""]) -+ AC_CHECK_HEADERS([lcms.h], [SHARELCMS=1;LCMSDIR="";WHICHCMS=lcms]) - ]) - fi - -@@ -660,15 +663,17 @@ - LCMS2DIR=lcms2 - if test -f $LCMS2DIR/include/lcms2.h; then - AC_MSG_RESULT([yes]) -+ WHICHCMS=lcms2 - else - AC_CHECK_LIB(lcms2, cmsCreateXYZProfile, [ -- AC_CHECK_HEADERS([lcms2.h], [LCMS2DIR=""]) -+ AC_CHECK_HEADERS([lcms2.h], [SHARELCMS=1;LCMS2DIR="";WHICHCMS=lcms2]) - ]) - fi - - AC_SUBST(SHARELCMS) - AC_SUBST(LCMSDIR) - AC_SUBST(LCMS2DIR) -+AC_SUBST(WHICHCMS) - - dnl look for libtiff, it also requires lib - dnl png for the png output device; it also requires zlib ---- a/base/Makefile.in -+++ b/base/Makefile.in -@@ -271,7 +271,7 @@ - - # Which CMS are we using? - # Options are currently lcms or lcms2 --WHICH_CMS=lcms -+WHICH_CMS=@WHICHCMS@ - - # Define the directory where the ijs source is stored, - # and the process forking method to use for the server. ---- a/base/lib.mak -+++ b/base/lib.mak -@@ -2742,7 +2742,7 @@ - - - $(GLOBJ)gsicc_lcms2_1.$(OBJ) : $(GLSRC)gsicc_lcms2.c\ -- $(gsicc_cms_h) $(lcms2_h) $(gserror_h) $(gslibctx_h) $(lcms2_plugin_h) -+ $(gsicc_cms_h) $(gserror_h) $(gslibctx_h) - $(GLLCMS2CC) $(GLO_)gsicc_lcms2_1.$(OBJ) $(C_) $(GLSRC)gsicc_lcms2.c - - $(GLOBJ)gsicc_lcms2_0.$(OBJ) : $(GLSRC)gsicc_lcms2.c\ diff -Nru ghostscript-9.04~dfsg/debian/patches/1002_cms_typos.patch ghostscript-9.05~dfsg~20120125/debian/patches/1002_cms_typos.patch --- ghostscript-9.04~dfsg/debian/patches/1002_cms_typos.patch 2011-11-24 03:43:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/debian/patches/1002_cms_typos.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -Description: Fix a few comment typos in CMS-related makefiles -Author: Jonas Smedegaard -Last-Update: 2011-10-02 - ---- a/base/lcms2.mak -+++ b/base/lcms2.mak -@@ -14,7 +14,7 @@ - - # makefile for the lcms library code. - # Users of this makefile must define the following: --# SHARE_LCMS2 - whether to compile in or link to the library -+# SHARE_LCMS - whether to compile in or link to the library - # LCMS2SRCDIR - the library source directory - # - # gs.mak and friends define the following: ---- a/base/lcms.mak -+++ b/base/lcms.mak -@@ -18,7 +18,7 @@ - # LCMSSRCDIR - the library source directory - # - # gs.mak and friends define the following: --# LCSMOBJDIR - the output obj directory -+# LCMSOBJDIR - the output obj directory - # LCMSGENDIR - generated (.dev) file directory - # LCMSI_ LCMSCF_ - include and cflags for compiling the lib - diff -Nru ghostscript-9.04~dfsg/debian/patches/series ghostscript-9.05~dfsg~20120125/debian/patches/series --- ghostscript-9.04~dfsg/debian/patches/series 2011-11-24 03:43:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/debian/patches/series 2012-01-25 23:07:50.000000000 +0000 @@ -1,5 +1,3 @@ -020110819~fa67a1d.patch -1001_autoconfigure_cms_choice.patch 2001_docdir_fix_for_debian.patch 2002_gs_man_fix_debian.patch 2003_support_multiarch.patch diff -Nru ghostscript-9.04~dfsg/debian/rules ghostscript-9.05~dfsg~20120125/debian/rules --- ghostscript-9.04~dfsg/debian/rules 2011-11-24 06:00:14.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/debian/rules 2012-01-25 22:51:16.000000000 +0000 @@ -30,7 +30,7 @@ include /usr/share/cdbs/1/rules/utils.mk # ABI by default follows upstream version (without repackaging suffix) -abi = $(DEB_UPSTREAM_TARBALL_VERSION) +abi = $(shell echo $(DEB_UPSTREAM_TARBALL_VERSION) | sed 's/\~.*$$//') major := $(shell echo $(DEB_UPSTREAM_VERSION) | sed 's/\..*$$//') libname = libgs libpkgname = $(libname)$(major) @@ -39,76 +39,12 @@ DEB_UPSTREAM_URL = http://downloads.ghostscript.com/public DEB_UPSTREAM_TARBALL_MD5 = 9c2fb4af1eb609d09dba5bb0fa76173a -# Non-DFSG license limited to verbatim copying -DEB_UPSTREAM_REPACKAGE_EXCLUDES += ./Resource/CMap/90ms-RKSJ-UCS2 \ - ./Resource/CMap/90pv-RKSJ-UCS2 \ - ./Resource/CMap/90pv-RKSJ-UCS2C \ - ./Resource/CMap/Adobe-CNS1-B5pc \ - ./Resource/CMap/Adobe-CNS1-ETenms-B5 \ - ./Resource/CMap/Adobe-CNS1-H-CID \ - ./Resource/CMap/Adobe-CNS1-H-Host \ - ./Resource/CMap/Adobe-CNS1-H-Mac \ - ./Resource/CMap/Adobe-CNS1-UCS2 \ - ./Resource/CMap/Adobe-GB1-GBK-EUC \ - ./Resource/CMap/Adobe-GB1-GBpc-EUC \ - ./Resource/CMap/Adobe-GB1-H-CID \ - ./Resource/CMap/Adobe-GB1-H-Host \ - ./Resource/CMap/Adobe-GB1-H-Mac \ - ./Resource/CMap/Adobe-GB1-UCS2 \ - ./Resource/CMap/Adobe-Japan1-90ms-RKSJ \ - ./Resource/CMap/Adobe-Japan1-90pv-RKSJ \ - ./Resource/CMap/Adobe-Japan1-H-CID \ - ./Resource/CMap/Adobe-Japan1-H-Host \ - ./Resource/CMap/Adobe-Japan1-H-Mac \ - ./Resource/CMap/Adobe-Japan1-PS-H \ - ./Resource/CMap/Adobe-Japan1-PS-V \ - ./Resource/CMap/Adobe-Japan1-UCS2 \ - ./Resource/CMap/Adobe-Korea1-H-CID \ - ./Resource/CMap/Adobe-Korea1-H-Host \ - ./Resource/CMap/Adobe-Korea1-H-Mac \ - ./Resource/CMap/Adobe-Korea1-KSCms-UHC \ - ./Resource/CMap/Adobe-Korea1-KSCpc-EUC \ - ./Resource/CMap/Adobe-Korea1-UCS2 \ - ./Resource/CMap/B5pc-UCS2 \ - ./Resource/CMap/B5pc-UCS2C \ - ./Resource/CMap/CNS01-RKSJ-H \ - ./Resource/CMap/CNS02-RKSJ-H \ - ./Resource/CMap/CNS03-RKSJ-H \ - ./Resource/CMap/CNS04-RKSJ-H \ - ./Resource/CMap/CNS05-RKSJ-H \ - ./Resource/CMap/CNS06-RKSJ-H \ - ./Resource/CMap/CNS07-RKSJ-H \ - ./Resource/CMap/CNS15-RKSJ-H \ - ./Resource/CMap/ETen-B5-UCS2 \ - ./Resource/CMap/GB-RKSJ-H \ - ./Resource/CMap/GBK-EUC-UCS2 \ - ./Resource/CMap/GBT-RKSJ-H \ - ./Resource/CMap/GBpc-EUC-UCS2 \ - ./Resource/CMap/GBpc-EUC-UCS2C \ - ./Resource/CMap/HK-RKSJ-H \ - ./Resource/CMap/Hojo-RKSJ-H \ - ./Resource/CMap/KSC-RKSJ-H \ - ./Resource/CMap/KSC2-RKSJ-H \ - ./Resource/CMap/KSCms-UHC-UCS2 \ - ./Resource/CMap/KSCpc-EUC-UCS2 \ - ./Resource/CMap/KSCpc-EUC-UCS2C \ - ./Resource/CMap/TCVN-RKSJ-H \ - ./Resource/CMap/UCS2-90ms-RKSJ \ - ./Resource/CMap/UCS2-90pv-RKSJ \ - ./Resource/CMap/UCS2-B5pc \ - ./Resource/CMap/UCS2-ETen-B5 \ - ./Resource/CMap/UCS2-GBK-EUC \ - ./Resource/CMap/UCS2-GBpc-EUC \ - ./Resource/CMap/UCS2-KSCms-UHC \ - ./Resource/CMap/UCS2-KSCpc-EUC -DEB_UPSTREAM_REPACKAGE_EXCLUDES += ./Resource/CMap/Identity-UTF16-H \ - ./Resource/CMap/Identity-UTF16-V # Sources unavailable # (PDFs kept commented out as reminder, in case jasper iss included) #DEB_UPSTREAM_REPACKAGE_EXCLUDES += ./jasper/doc/*.pdf # convenience libraries cluttering authorship/licensing tracking DEB_UPSTREAM_REPACKAGE_EXCLUDES += ./cups/libs/ -DEB_UPSTREAM_REPACKAGE_EXCLUDES += ./expat/ ./freetype/ ./ijs/ ./jasper/ ./jbig2dec/ ./lcms/ ./lcms2/ ./libpng/ ./tiff/ ./zlib/ +DEB_UPSTREAM_REPACKAGE_EXCLUDES += ./expat/ ./freetype/ ./icclib/ ./ijs/ ./jasper/ ./jbig2dec/ ./lcms/ ./lcms2/ ./libpng/ ./openjpeg/ ./tiff/ ./zlib/ # convenience library enabling old non-standard option (see bug#582521) DEB_UPSTREAM_REPACKAGE_EXCLUDES += ./jpeg/ # convenience library implementing patented controversial JPEG XR format @@ -147,9 +83,8 @@ --with-drivers=ALL \ --with-fontpath=/var/lib/ghostscript/fonts:/usr/share/cups/fonts:/usr/share/ghostscript/fonts:/usr/local/lib/ghostscript/fonts:/usr/share/fonts -# liblcms1-dev needed for icc34.h - See doc/GS9_Color_Management.pdf gs_opts += WHICH_CMS=lcms2 SHARE_LCMS=1 LCMS2DIR=/usr -CDBS_BUILD_DEPENDS += , liblcms2-dev, liblcms1-dev +CDBS_BUILD_DEPENDS += , liblcms2-dev gs_opts += SHARE_FT=1 DEB_CONFIGURE_EXTRA_FLAGS += --enable-freetype @@ -161,7 +96,7 @@ CDBS_BUILD_DEPENDS += , libcups2-dev (>= 1.3.7), libcupsimage2-dev (>= 1.1.20final+rc1-4) CDBS_BUILD_DEPENDS += , libdbus-1-dev CDBS_DEPENDS_ghostscript-cups += , ghostscript (>= 8.64~dfsg-8) -CDBS_RECOMMENDS_ghostscript-cups += , cups, cups-client, colord +CDBS_RECOMMENDS_ghostscript-cups += , cups, colord CDBS_SUGGESTS_ghostscript += , ghostscript-cups DEB_MAKE_BUILD_TARGET = so gs.a $(gs_opts) @@ -182,10 +117,14 @@ infiles = $(filter-out debian/control.in debian/control.in.in, $(wildcard debian/*.in)) outfiles = $(subst $(libname)__VER__,$(libpkgname),$(basename $(infiles))) pre-build:: $(outfiles) + rm -f configure.ac; ln -s base/configure.ac . + rm -f Makefile.in; ln -s base/Makefile.in . $(outfiles): update-config debian/stamp-copyright-check sed $(SEDRULE_CONTENT) <$(subst $(libpkgname),$(libname)__VER__,$@).in >$@ + clean:: rm -f $(outfiles) + rm -f configure.ac Makefile.in pre-build clean:: fail-source-not-repackaged @@ -193,11 +132,11 @@ [ ! -f Makefile ] || $(MAKE) soclean [ ! -f Makefile ] || $(MAKE) distclean # These are somehow left... - rm -rf sobin soobj gs.a cups/pstoraster cups/pstopxl + rm -rf sobin soobj gs.a cups/gstoraster cups/gstopxl install/ghostscript:: # Remove some of the scripts - rm -f $(DEB_DESTDIR)/usr/bin/unix-lpr.sh $(DEB_DESTDIR)/usr/bin/lprsetup.sh $(DEB_DESTDIR)/usr/bin/pv.sh $(DEB_DESTDIR)/usr/bin/fixmswrd.pl + rm $(DEB_DESTDIR)/usr/bin/unix-lpr.sh $(DEB_DESTDIR)/usr/bin/lprsetup.sh # Do not include the Ghostscript loader executable with GTK support rm -f $(DEB_DESTDIR)/usr/bin/gsx @@ -207,6 +146,16 @@ mkdir -p $(DEB_DESTDIR)/usr/sbin/ install -m 755 debian/update-gsfontmap $(DEB_DESTDIR)/usr/sbin + # Install the ppd updater data files so that CUPS can update the + # PPDs of the already existing queue after each update of the + # ghostscript-cups packages + install -D -m 644 debian/ghostscript-cups.ppd-updater $(CURDIR)/debian/ghostscript-cups/usr/share/cups/ppd-updaters/ghostscript-cups + + # Install Apport hook (Ubuntu only) + if dpkg-vendor --is ubuntu; then \ + install -D -m 644 debian/ubuntu/apport-hook.py $(CURDIR)/debian/ghostscript/usr/share/apport/package-hooks/source_ghostscript.py; \ + fi + install/$(datapkgname):: # Strip CMap files (shipped separately, registered with DeFoMa) rm -rf $(DEB_DESTDIR)/usr/share/ghostscript/$(abi)/Resource/CMap @@ -216,16 +165,6 @@ install -m 644 gs.a \ $(DEB_DESTDIR)/usr/lib/libgs.a -# Let d-shlibs calculate development package dependencies -# and handle shared library install -binary-post-install/$(libpkgname):: debian/stamp-local-shlibs-$(libname) -debian/stamp-local-shlibs-$(libname): binary-install/$(libpkgname) - d-shlibmove --commit \ - --override s/liblcms2-2-dev/liblcms2-dev/ \ - --override s/ld1-dev// \ - --devunversioned --ignorelibdep \ - --movedev "debian/tmp/usr/include/*" usr/include/ \ - debian/tmp/usr/lib/$(libname).so clean:: rm -f debian/stamp-local-shlibs-$(libname) @@ -255,6 +194,10 @@ # Public virtual packages CDBS_PROVIDES_ghostscript += , postscript-viewer +# Transitional quirk: gs-esp merged into ghostscript +# TODO: drop when unused (was introduced before Lenny) +CDBS_PROVIDES_ghostscript += , gs-esp + # Transitional quirk: parts of ghostscript split into ghostscript-x # TODO: drop after Squeeze+1 (was introduced before Squeeze) CDBS_BREAKS_ghostscript += , ghostscript-x (<< 8.64~dfsg-8) diff -Nru ghostscript-9.04~dfsg/debian/symbols.common ghostscript-9.05~dfsg~20120125/debian/symbols.common --- ghostscript-9.04~dfsg/debian/symbols.common 2011-11-24 03:43:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/debian/symbols.common 2012-01-25 23:35:39.000000000 +0000 @@ -1,5 +1,5 @@ - ALWAYS_CONTONE@Base 8.71~dfsg-3~ - Author@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# ALWAYS_CONTONE@Base 8.71~dfsg-3~ +#MISSING: 9.05~dfsg~20120125-0ubuntu1# Author@Base 8.61.dfsg.1 BJL_command_set@Base 8.61.dfsg.1 BlackPoint_default@Base 8.61.dfsg.1 #MISSING: 9.00~dfsg-1# CPSI_mode@Base 8.61.dfsg.1 @@ -27,6 +27,7 @@ DecodeLMN_from_cache@Base 8.61.dfsg.1 Default_GraphicsState@Base 8.61.dfsg.1 DeviceCMYKComponents@Base 8.61.dfsg.1 + DoubleGlyphList@Base 9.05~dfsg~20120125-0ubuntu1 EncodeABC_from_cache@Base 8.61.dfsg.1 EncodeLMN_from_cache@Base 8.61.dfsg.1 Encode_default@Base 8.61.dfsg.1 @@ -57,7 +58,7 @@ #MISSING: 9.00~dfsg-1# GetSimpleScan@Base 8.61.dfsg.1 Get_CodeRange@Base 8.61.dfsg.1 Goto_CodeRange@Base 8.61.dfsg.1 - Id@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# Id@Base 8.61.dfsg.1 Instance_Create@Base 8.61.dfsg.1 Instance_Destroy@Base 8.61.dfsg.1 Instance_Init@Base 8.61.dfsg.1 @@ -78,25 +79,28 @@ Memento_find@Base 9.04~dfsg Memento_free@Base 9.04~dfsg Memento_getBlockNum@Base 9.04~dfsg + Memento_listBlocks@Base 9.05~dfsg~20120125-0ubuntu1 + Memento_listNewBlocks@Base 9.05~dfsg~20120125-0ubuntu1 Memento_malloc@Base 9.04~dfsg Memento_paranoidAt@Base 9.04~dfsg Memento_realloc@Base 9.04~dfsg Memento_setParanoia@Base 9.04~dfsg MulDiv_Round@Base 8.61.dfsg.1 - RCSFile@Base 8.61.dfsg.1 + QuadGlyphList@Base 9.05~dfsg~20120125-0ubuntu1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# RCSFile@Base 8.61.dfsg.1 Range3_default@Base 8.61.dfsg.1 Range4_default@Base 8.61.dfsg.1 RangeA_default@Base 8.61.dfsg.1 RenderTableT_default@Base 8.61.dfsg.1 RenderTableT_from_cache@Base 8.61.dfsg.1 - Revision@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# Revision@Base 8.61.dfsg.1 RunIns@Base 8.61.dfsg.1 SHA256_Data@Base 9.00~dfsg SHA256_End@Base 9.00~dfsg - SHA256_Final@Base 9.00~dfsg - SHA256_Init@Base 9.00~dfsg - SHA256_Transform@Base 9.00~dfsg - SHA256_Update@Base 9.00~dfsg +#MISSING: 9.05~dfsg~20120125-0ubuntu1# SHA256_Final@Base 9.00~dfsg +#MISSING: 9.05~dfsg~20120125-0ubuntu1# SHA256_Init@Base 9.00~dfsg +#MISSING: 9.05~dfsg~20120125-0ubuntu1# SHA256_Transform@Base 9.00~dfsg +#MISSING: 9.05~dfsg~20120125-0ubuntu1# SHA256_Update@Base 9.00~dfsg SHA384_Data@Base 9.00~dfsg SHA384_End@Base 9.00~dfsg SHA384_Final@Base 9.00~dfsg @@ -107,7 +111,7 @@ SHA512_Final@Base 9.00~dfsg SHA512_Init@Base 9.00~dfsg SHA512_Last@Base 9.00~dfsg - SHA512_Transform@Base 9.00~dfsg +#MISSING: 9.05~dfsg~20120125-0ubuntu1# SHA512_Transform@Base 9.00~dfsg SHA512_Update@Base 9.00~dfsg #MISSING: 9.00~dfsg-1# Save2Bytes@Base 8.61.dfsg.1 #MISSING: 9.00~dfsg-1# Save4Bytes@Base 8.61.dfsg.1 @@ -116,12 +120,14 @@ Scale_X@Base 8.61.dfsg.1 Scale_Y@Base 8.61.dfsg.1 Set_CodeRange@Base 8.61.dfsg.1 + SingleGlyphList@Base 9.05~dfsg~20120125-0ubuntu1 #MISSING: 9.00~dfsg-1# Smask_Luminosity_Mapping@Base 8.64~dfsg-3~ Sqrt64@Base 8.61.dfsg.1 TT_Set_Instance_CharSizes@Base 8.61.dfsg.1 TransformPQR_default@Base 8.61.dfsg.1 TransformPQR_from_cache@Base 8.61.dfsg.1 TransformPQR_lookup_proc_name@Base 8.61.dfsg.1 + TrebleGlyphList@Base 9.05~dfsg~20120125-0ubuntu1 Unset_CodeRange@Base 8.61.dfsg.1 UpdateScanLine@Base 8.61.dfsg.1 UpdateScanSize@Base 8.61.dfsg.1 @@ -305,73 +311,73 @@ cf_uncompressed_exit@Base 8.61.dfsg.1 cf_white_decode@Base 8.61.dfsg.1 cf_white_runs@Base 8.61.dfsg.1 - cgm_ALT_CHARACTER_SET_INDEX@Base 8.61.dfsg.1 - cgm_APPEND_TEXT@Base 8.61.dfsg.1 - cgm_ASPECT_SOURCE_FLAGS@Base 8.61.dfsg.1 - cgm_AUXILIARY_COLOR@Base 8.61.dfsg.1 - cgm_BEGIN_METAFILE@Base 8.61.dfsg.1 - cgm_BEGIN_PICTURE@Base 8.61.dfsg.1 - cgm_BEGIN_PICTURE_BODY@Base 8.61.dfsg.1 - cgm_CELL_ARRAY@Base 8.61.dfsg.1 - cgm_CHARACTER_EXPANSION_FACTOR@Base 8.61.dfsg.1 - cgm_CHARACTER_HEIGHT@Base 8.61.dfsg.1 - cgm_CHARACTER_ORIENTATION@Base 8.61.dfsg.1 - cgm_CHARACTER_SET_INDEX@Base 8.61.dfsg.1 - cgm_CHARACTER_SPACING@Base 8.61.dfsg.1 - cgm_CIRCLE@Base 8.61.dfsg.1 - cgm_CIRCULAR_ARC_3_POINT@Base 8.61.dfsg.1 - cgm_CIRCULAR_ARC_3_POINT_CLOSE@Base 8.61.dfsg.1 - cgm_CIRCULAR_ARC_CENTER@Base 8.61.dfsg.1 - cgm_CIRCULAR_ARC_CENTER_CLOSE@Base 8.61.dfsg.1 - cgm_CLIP_INDICATOR@Base 8.61.dfsg.1 - cgm_CLIP_RECTANGLE@Base 8.61.dfsg.1 - cgm_COLOR_TABLE@Base 8.61.dfsg.1 - cgm_DISJOINT_POLYLINE@Base 8.61.dfsg.1 - cgm_EDGE_BUNDLE_INDEX@Base 8.61.dfsg.1 - cgm_EDGE_COLOR@Base 8.61.dfsg.1 - cgm_EDGE_TYPE@Base 8.61.dfsg.1 - cgm_EDGE_VISIBILITY@Base 8.61.dfsg.1 - cgm_EDGE_WIDTH@Base 8.61.dfsg.1 - cgm_ELLIPSE@Base 8.61.dfsg.1 - cgm_ELLIPTICAL_ARC@Base 8.61.dfsg.1 - cgm_ELLIPTICAL_ARC_CLOSE@Base 8.61.dfsg.1 - cgm_END_METAFILE@Base 8.61.dfsg.1 - cgm_END_PICTURE@Base 8.61.dfsg.1 - cgm_FILL_BUNDLE_INDEX@Base 8.61.dfsg.1 - cgm_FILL_COLOR@Base 8.61.dfsg.1 - cgm_FILL_REFERENCE_POINT@Base 8.61.dfsg.1 - cgm_HATCH_INDEX@Base 8.61.dfsg.1 - cgm_INTERIOR_STYLE@Base 8.61.dfsg.1 - cgm_LINE_BUNDLE_INDEX@Base 8.61.dfsg.1 - cgm_LINE_COLOR@Base 8.61.dfsg.1 - cgm_LINE_TYPE@Base 8.61.dfsg.1 - cgm_LINE_WIDTH@Base 8.61.dfsg.1 - cgm_MARKER_BUNDLE_INDEX@Base 8.61.dfsg.1 - cgm_MARKER_COLOR@Base 8.61.dfsg.1 - cgm_MARKER_SIZE@Base 8.61.dfsg.1 - cgm_MARKER_TYPE@Base 8.61.dfsg.1 - cgm_PATTERN_INDEX@Base 8.61.dfsg.1 - cgm_PATTERN_SIZE@Base 8.61.dfsg.1 - cgm_POLYGON@Base 8.61.dfsg.1 - cgm_POLYGON_SET@Base 8.61.dfsg.1 - cgm_POLYLINE@Base 8.61.dfsg.1 - cgm_POLYMARKER@Base 8.61.dfsg.1 - cgm_RECTANGLE@Base 8.61.dfsg.1 - cgm_RESTRICTED_TEXT@Base 8.61.dfsg.1 - cgm_TEXT@Base 8.61.dfsg.1 - cgm_TEXT_ALIGNMENT@Base 8.61.dfsg.1 - cgm_TEXT_BUNDLE_INDEX@Base 8.61.dfsg.1 - cgm_TEXT_COLOR@Base 8.61.dfsg.1 - cgm_TEXT_FONT_INDEX@Base 8.61.dfsg.1 - cgm_TEXT_PATH@Base 8.61.dfsg.1 - cgm_TEXT_PRECISION@Base 8.61.dfsg.1 - cgm_TRANSPARENCY@Base 8.61.dfsg.1 - cgm_VDC_INTEGER_PRECISION@Base 8.61.dfsg.1 - cgm_VDC_REAL_PRECISION@Base 8.61.dfsg.1 - cgm_initialize@Base 8.61.dfsg.1 - cgm_set_metafile_elements@Base 8.61.dfsg.1 - cgm_set_picture_elements@Base 8.61.dfsg.1 - cgm_terminate@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_ALT_CHARACTER_SET_INDEX@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_APPEND_TEXT@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_ASPECT_SOURCE_FLAGS@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_AUXILIARY_COLOR@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_BEGIN_METAFILE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_BEGIN_PICTURE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_BEGIN_PICTURE_BODY@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_CELL_ARRAY@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_CHARACTER_EXPANSION_FACTOR@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_CHARACTER_HEIGHT@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_CHARACTER_ORIENTATION@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_CHARACTER_SET_INDEX@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_CHARACTER_SPACING@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_CIRCLE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_CIRCULAR_ARC_3_POINT@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_CIRCULAR_ARC_3_POINT_CLOSE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_CIRCULAR_ARC_CENTER@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_CIRCULAR_ARC_CENTER_CLOSE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_CLIP_INDICATOR@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_CLIP_RECTANGLE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_COLOR_TABLE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_DISJOINT_POLYLINE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_EDGE_BUNDLE_INDEX@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_EDGE_COLOR@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_EDGE_TYPE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_EDGE_VISIBILITY@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_EDGE_WIDTH@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_ELLIPSE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_ELLIPTICAL_ARC@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_ELLIPTICAL_ARC_CLOSE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_END_METAFILE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_END_PICTURE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_FILL_BUNDLE_INDEX@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_FILL_COLOR@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_FILL_REFERENCE_POINT@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_HATCH_INDEX@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_INTERIOR_STYLE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_LINE_BUNDLE_INDEX@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_LINE_COLOR@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_LINE_TYPE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_LINE_WIDTH@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_MARKER_BUNDLE_INDEX@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_MARKER_COLOR@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_MARKER_SIZE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_MARKER_TYPE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_PATTERN_INDEX@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_PATTERN_SIZE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_POLYGON@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_POLYGON_SET@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_POLYLINE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_POLYMARKER@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_RECTANGLE@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_RESTRICTED_TEXT@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_TEXT@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_TEXT_ALIGNMENT@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_TEXT_BUNDLE_INDEX@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_TEXT_COLOR@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_TEXT_FONT_INDEX@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_TEXT_PATH@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_TEXT_PRECISION@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_TRANSPARENCY@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_VDC_INTEGER_PRECISION@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_VDC_REAL_PRECISION@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_initialize@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_set_metafile_elements@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_set_picture_elements@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# cgm_terminate@Base 8.61.dfsg.1 charstring_execchar@Base 8.61.dfsg.1 charstring_font_get_refs@Base 8.61.dfsg.1 charstring_font_init@Base 8.61.dfsg.1 @@ -410,9 +416,11 @@ clip_call_copy_alpha@Base 8.61.dfsg.1 clip_call_copy_color@Base 8.61.dfsg.1 clip_call_copy_mono@Base 8.61.dfsg.1 - clip_call_copy_plane@Base 9.04~dfsg +#MISSING: 9.05~dfsg~20120125-0ubuntu1# clip_call_copy_plane@Base 9.04~dfsg + clip_call_copy_planes@Base 9.05~dfsg~20120125-0ubuntu1 clip_call_fill_mask@Base 8.61.dfsg.1 clip_call_fill_rectangle@Base 8.61.dfsg.1 + clip_call_strip_copy_rop2@Base 9.05~dfsg~20120125-0ubuntu1 clip_call_strip_copy_rop@Base 8.61.dfsg.1 clip_call_strip_tile_rectangle@Base 8.61.dfsg.1 clist_VMerror_recover@Base 8.61.dfsg.1 @@ -434,7 +442,8 @@ clist_copy_band_complexity@Base 8.61.dfsg.1 clist_copy_color@Base 8.61.dfsg.1 clist_copy_mono@Base 8.61.dfsg.1 - clist_copy_plane@Base 9.04~dfsg +#MISSING: 9.05~dfsg~20120125-0ubuntu1# clist_copy_plane@Base 9.04~dfsg + clist_copy_planes@Base 9.05~dfsg~20120125-0ubuntu1 clist_create_compositor@Base 8.61.dfsg.1 clist_data_size@Base 8.63.dfsg.1 clist_decompressor_init@Base 9.00~dfsg @@ -484,6 +493,7 @@ clist_select_tile_color0@Base 8.61.dfsg.1 clist_select_tile_color1@Base 8.61.dfsg.1 clist_setup_params@Base 8.61.dfsg.1 + clist_strip_copy_rop2@Base 9.05~dfsg~20120125-0ubuntu1 clist_strip_copy_rop@Base 8.61.dfsg.1 clist_strip_tile_rectangle@Base 8.61.dfsg.1 clist_stroke_path@Base 8.61.dfsg.1 @@ -1062,6 +1072,7 @@ gp_semaphore_signal@Base 8.61.dfsg.1 gp_semaphore_sizeof@Base 8.61.dfsg.1 gp_semaphore_wait@Base 8.61.dfsg.1 + gp_serialnumber@Base 9.05~dfsg~20120125-0ubuntu1 gp_setmode_binary@Base 8.61.dfsg.1 gp_stdin_read@Base 8.61.dfsg.1 gp_strerror@Base 8.61.dfsg.1 @@ -1070,7 +1081,7 @@ gray_cs_to_devn_cm@Base 8.61.dfsg.1 gray_cs_to_gray_cm@Base 8.61.dfsg.1 gs_abort@Base 8.61.dfsg.1 - gs_agl_ps@Base 9.01~ +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_agl_ps@Base 9.01~ gs_alc1900_device@Base 8.61.dfsg.1 gs_alc2000_device@Base 8.61.dfsg.1 gs_alc4000_device@Base 8.61.dfsg.1 @@ -1174,9 +1185,9 @@ gs_cdjmono_device@Base 8.61.dfsg.1 gs_cdnj500_device@Base 8.64~dfsg-3~ gs_cfax_device@Base 8.61.dfsg.1 - gs_cgm24_device@Base 8.61.dfsg.1 - gs_cgm8_device@Base 8.61.dfsg.1 - gs_cgmmono_device@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_cgm24_device@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_cgm8_device@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_cgmmono_device@Base 8.61.dfsg.1 gs_char_flatness@Base 8.61.dfsg.1 gs_charboxpath_begin@Base 8.61.dfsg.1 gs_charboxpath_n_init@Base 8.61.dfsg.1 @@ -1372,13 +1383,17 @@ gs_currenttexturetransparent@Base 8.71~dfsg gs_currenttransfer@Base 8.61.dfsg.1 gs_currentundercolorremoval@Base 8.61.dfsg.1 - gs_currentusewts@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_currentusewts@Base 8.61.dfsg.1 gs_curveto@Base 8.61.dfsg.1 gs_dashpath@Base 8.61.dfsg.1 gs_data_image_t_init@Base 8.61.dfsg.1 gs_dc_get_pattern_id@Base 8.63.dfsg.1 gs_debug@Base 8.61.dfsg.1 gs_debug_c@Base 8.61.dfsg.1 + gs_debug_flag_implied_by@Base 9.05~dfsg~20120125-0ubuntu1 + gs_debug_flags@Base 9.05~dfsg~20120125-0ubuntu1 + gs_debug_flags_list@Base 9.05~dfsg~20120125-0ubuntu1 + gs_debug_flags_parse@Base 9.05~dfsg~20120125-0ubuntu1 #MISSING: 9.00~dfsg-1# gs_debug_out@Base 8.61.dfsg.1 gs_declj250_device@Base 8.61.dfsg.1 gs_default_font_info@Base 8.61.dfsg.1 @@ -1616,10 +1631,11 @@ gs_imager_setmatrix@Base 8.61.dfsg.1 gs_imager_state_copied@Base 8.61.dfsg.1 gs_imager_state_copy@Base 8.61.dfsg.1 + gs_imager_state_finalize@Base 9.05~dfsg~20120125-0ubuntu1 gs_imager_state_initialize@Base 8.61.dfsg.1 gs_imager_state_pre_assign@Base 8.61.dfsg.1 gs_imager_state_release@Base 8.61.dfsg.1 - gs_imdi_device@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_imdi_device@Base 8.61.dfsg.1 gs_incachedevice@Base 8.61.dfsg.1 gs_includecolorspace@Base 8.61.dfsg.1 gs_indexed_limit_and_lookup@Base 8.63.dfsg.1 @@ -1633,6 +1649,7 @@ gs_initialize_wordimagedevice@Base 8.61.dfsg.1 gs_initmatrix@Base 8.61.dfsg.1 gs_initviewclip@Base 8.61.dfsg.1 + gs_inkcov_device@Base 9.05~dfsg~20120125-0ubuntu1 gs_interp_alloc_stacks@Base 8.61.dfsg.1 gs_interp_free_stacks@Base 8.61.dfsg.1 gs_interp_init@Base 8.61.dfsg.1 @@ -1698,9 +1715,9 @@ gs_lbp310_device@Base 8.61.dfsg.1 gs_lbp320_device@Base 8.61.dfsg.1 gs_lbp8_device@Base 8.61.dfsg.1 - gs_lcms2_free@Base 9.04~dfsg - gs_lcms2_malloc@Base 9.04~dfsg - gs_lcms2_realloc@Base 9.04~dfsg +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_lcms2_free@Base 9.04~dfsg +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_lcms2_malloc@Base 9.04~dfsg +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_lcms2_realloc@Base 9.04~dfsg gs_len_glyphs_release@Base 8.61.dfsg.1 gs_lex2050_device@Base 8.61.dfsg.1 gs_lex3200_device@Base 8.61.dfsg.1 @@ -1716,7 +1733,7 @@ gs_lib_init0@Base 8.61.dfsg.1 gs_lib_init1@Base 8.61.dfsg.1 gs_lib_init@Base 8.61.dfsg.1 - gs_lib_register_device@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_lib_register_device@Base 8.61.dfsg.1 gs_lineto@Base 8.61.dfsg.1 gs_lips2p_device@Base 8.61.dfsg.1 gs_lips3_device@Base 8.61.dfsg.1 @@ -1775,7 +1792,7 @@ gs_lps4500_device@Base 8.61.dfsg.1 gs_lps6500_device@Base 8.61.dfsg.1 gs_lq850_device@Base 8.61.dfsg.1 - gs_lx5000_device@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_lx5000_device@Base 8.61.dfsg.1 gs_lxm3200_device@Base 8.61.dfsg.1 gs_lxm5700m_device@Base 8.61.dfsg.1 gs_m8510_device@Base 8.61.dfsg.1 @@ -1788,6 +1805,7 @@ gs_main_init0@Base 8.61.dfsg.1 gs_main_init1@Base 8.61.dfsg.1 gs_main_init2@Base 8.61.dfsg.1 + gs_main_init2aux@Base 9.05~dfsg~20120125-0ubuntu1 gs_main_init_with_args@Base 8.61.dfsg.1 gs_main_instance_init_values@Base 8.61.dfsg.1 gs_main_lib_open@Base 8.61.dfsg.1 @@ -1826,6 +1844,7 @@ gs_malloc_wrapped_contents@Base 8.61.dfsg.1 gs_mapped_transfer@Base 8.61.dfsg.1 gs_mask_clip_device@Base 8.61.dfsg.1 + gs_matrix_compare@Base 9.05~dfsg~20120125-0ubuntu1 gs_matrix_fixed_from_matrix@Base 8.61.dfsg.1 gs_matrix_invert@Base 8.61.dfsg.1 gs_matrix_invert_to_double@Base 8.62.dfsg.1 @@ -1968,6 +1987,11 @@ gs_pksm_device@Base 8.61.dfsg.1 gs_pksmraw_device@Base 8.61.dfsg.1 gs_plan9bm_device@Base 8.61.dfsg.1 + gs_plan_device@Base 9.05~dfsg~20120125-0ubuntu1 + gs_planc_device@Base 9.05~dfsg~20120125-0ubuntu1 + gs_plang_device@Base 9.05~dfsg~20120125-0ubuntu1 + gs_plank_device@Base 9.05~dfsg~20120125-0ubuntu1 + gs_planm_device@Base 9.05~dfsg~20120125-0ubuntu1 gs_png16_device@Base 8.61.dfsg.1 gs_png16m_device@Base 8.61.dfsg.1 gs_png256_device@Base 8.61.dfsg.1 @@ -2149,7 +2173,7 @@ gs_settransfer_remap@Base 8.61.dfsg.1 gs_setundercolorremoval@Base 8.61.dfsg.1 gs_setundercolorremoval_remap@Base 8.61.dfsg.1 - gs_setusewts@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_setusewts@Base 8.61.dfsg.1 gs_sgirgb_device@Base 8.61.dfsg.1 gs_shading_A_fill_rectangle@Base 8.61.dfsg.1 gs_shading_A_init@Base 8.61.dfsg.1 @@ -2270,8 +2294,10 @@ gs_transform@Base 8.61.dfsg.1 gs_transform_color_buffer_generic@Base 8.64~dfsg-3~ gs_translate@Base 8.61.dfsg.1 + gs_translate_untransformed@Base 9.05~dfsg~20120125-0ubuntu1 gs_transparent_rop@Base 8.71~dfsg gs_truetype_font_info@Base 8.61.dfsg.1 + gs_txtwrite_device@Base 9.05~dfsg~20120125-0ubuntu1 gs_type0_define_font@Base 8.61.dfsg.1 gs_type0_init_fstack@Base 8.61.dfsg.1 gs_type0_make_font@Base 8.61.dfsg.1 @@ -2314,14 +2340,14 @@ gs_viewclippath@Base 8.61.dfsg.1 gs_widthshow_begin@Base 8.61.dfsg.1 gs_widthshow_n_init@Base 8.61.dfsg.1 - gs_wts_free_enum@Base 8.61.dfsg.1 - gs_wts_free_screen@Base 8.61.dfsg.1 - gs_wts_from_buf@Base 8.61.dfsg.1 - gs_wts_screen_enum_currentpoint@Base 8.61.dfsg.1 - gs_wts_screen_enum_new@Base 8.61.dfsg.1 - gs_wts_screen_enum_next@Base 8.61.dfsg.1 - gs_wtscmyk_device@Base 8.61.dfsg.1 - gs_wtsimdi_device@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_wts_free_enum@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_wts_free_screen@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_wts_from_buf@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_wts_screen_enum_currentpoint@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_wts_screen_enum_new@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_wts_screen_enum_next@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_wtscmyk_device@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gs_wtsimdi_device@Base 8.61.dfsg.1 gs_xcf_device@Base 8.61.dfsg.1 gs_xcfcmyk_device@Base 8.61.dfsg.1 gs_xes_device@Base 8.61.dfsg.1 @@ -2348,7 +2374,8 @@ gscms_get_clrtname@Base 9.00~dfsg gscms_get_input_channel_count@Base 9.00~dfsg gscms_get_link@Base 9.00~dfsg - gscms_get_link_proof@Base 9.00~dfsg +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gscms_get_link_proof@Base 9.00~dfsg + gscms_get_link_proof_devlink@Base 9.05~dfsg~20120125-0ubuntu1 gscms_get_name2device_link@Base 9.00~dfsg gscms_get_numberclrtnames@Base 9.00~dfsg gscms_get_output_channel_count@Base 9.00~dfsg @@ -2357,10 +2384,12 @@ gscms_get_profile_handle_mem@Base 9.00~dfsg gscms_release_link@Base 9.00~dfsg gscms_release_profile@Base 9.00~dfsg + gscms_set_icc_range@Base 9.05~dfsg~20120125-0ubuntu1 gscms_transform_color@Base 9.00~dfsg gscms_transform_color_buffer@Base 9.00~dfsg gscms_transform_named_color@Base 9.00~dfsg gsicc_add_cs@Base 9.00~dfsg + gsicc_alloc_link_entry@Base 9.05~dfsg~20120125-0ubuntu1 gsicc_cache_new@Base 9.00~dfsg gsicc_create_from_cal@Base 9.00~dfsg gsicc_create_froma@Base 9.00~dfsg @@ -2370,8 +2399,10 @@ gsicc_create_fromdefg@Base 9.00~dfsg gsicc_extract_profile@Base 9.04~dfsg gsicc_find_cs@Base 9.00~dfsg + gsicc_findcachelink@Base 9.05~dfsg~20120125-0ubuntu1 gsicc_finddevicen@Base 9.00~dfsg gsicc_get_default_type@Base 9.00~dfsg + gsicc_get_device_profile_comps@Base 9.05~dfsg~20120125-0ubuntu1 gsicc_get_gscs_profile@Base 9.00~dfsg gsicc_get_icc_buff_hash@Base 9.00~dfsg gsicc_get_link@Base 9.00~dfsg @@ -2390,9 +2421,11 @@ gsicc_init_iccmanager@Base 9.00~dfsg gsicc_init_profile_info@Base 9.00~dfsg gsicc_initialize_iccsmask@Base 9.00~dfsg + gsicc_link_free@Base 9.05~dfsg~20120125-0ubuntu1 gsicc_manager_new@Base 9.00~dfsg gsicc_new_device_profile_array@Base 9.04~dfsg gsicc_new_iccsmask@Base 9.00~dfsg + gsicc_nocm_get_link@Base 9.05~dfsg~20120125-0ubuntu1 gsicc_profile_new@Base 9.00~dfsg gsicc_profile_reference@Base 9.00~dfsg gsicc_profile_serialize@Base 9.00~dfsg @@ -2404,8 +2437,10 @@ gsicc_set_gscs_profile@Base 9.00~dfsg #MISSING: 9.04~dfsg-1# gsicc_set_icc_directory@Base 9.00~dfsg gsicc_set_iccsmaskprofile@Base 9.04~dfsg + gsicc_set_link_data@Base 9.05~dfsg~20120125-0ubuntu1 gsicc_set_profile@Base 9.00~dfsg gsicc_set_srcgtag_struct@Base 9.04~dfsg + gsicc_setrange_lab@Base 9.05~dfsg~20120125-0ubuntu1 gsicc_transform_named_color@Base 9.00~dfsg gstate_pattern_cache@Base 8.61.dfsg.1 gstate_set_pattern_cache@Base 8.61.dfsg.1 @@ -2486,6 +2521,7 @@ gx_cpath_includes_rectangle@Base 8.61.dfsg.1 gx_cpath_init_contained_shared@Base 8.61.dfsg.1 gx_cpath_init_local_shared@Base 8.61.dfsg.1 + gx_cpath_init_local_shared_nested@Base 9.05~dfsg~20120125-0ubuntu1 gx_cpath_inner_box@Base 8.61.dfsg.1 gx_cpath_intersect@Base 8.61.dfsg.1 gx_cpath_intersect_path_slow@Base 8.61.dfsg.1 @@ -2549,14 +2585,14 @@ gx_dc_type_data_none@Base 8.61.dfsg.1 gx_dc_type_data_null@Base 8.61.dfsg.1 gx_dc_type_data_pure@Base 8.61.dfsg.1 - gx_dc_type_data_wts@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gx_dc_type_data_wts@Base 8.61.dfsg.1 gx_dc_type_ht_binary@Base 8.61.dfsg.1 gx_dc_type_ht_colored@Base 8.61.dfsg.1 gx_dc_type_none@Base 8.61.dfsg.1 gx_dc_type_null@Base 8.61.dfsg.1 gx_dc_type_pattern@Base 8.61.dfsg.1 gx_dc_type_pure@Base 8.61.dfsg.1 - gx_dc_type_wts@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gx_dc_type_wts@Base 8.61.dfsg.1 gx_dc_write_color@Base 8.61.dfsg.1 gx_default_8bit_map_color_gray@Base 8.61.dfsg.1 gx_default_8bit_map_gray_color@Base 8.61.dfsg.1 @@ -2646,6 +2682,7 @@ gx_default_setup_buf_device@Base 8.61.dfsg.1 gx_default_size_buf_device@Base 8.61.dfsg.1 gx_default_start_render_thread@Base 8.61.dfsg.1 + gx_default_strip_copy_rop2@Base 9.05~dfsg~20120125-0ubuntu1 gx_default_strip_copy_rop@Base 8.61.dfsg.1 gx_default_strip_tile_rectangle@Base 8.61.dfsg.1 gx_default_stroke_path@Base 8.61.dfsg.1 @@ -2764,6 +2801,7 @@ gx_forward_put_params@Base 8.61.dfsg.1 gx_forward_ret_devn_params@Base 8.61.dfsg.1 gx_forward_set_graphics_type_tag@Base 9.04~dfsg + gx_forward_strip_copy_rop2@Base 9.05~dfsg~20120125-0ubuntu1 gx_forward_strip_copy_rop@Base 8.61.dfsg.1 gx_forward_strip_tile_rectangle@Base 8.61.dfsg.1 gx_forward_stroke_path@Base 8.61.dfsg.1 @@ -2810,7 +2848,9 @@ gx_ht_process_screen_memory@Base 8.61.dfsg.1 gx_ht_read_and_install@Base 8.61.dfsg.1 gx_ht_threshold_landscape@Base 9.02~dfsg + gx_ht_threshold_landscape_sub@Base 9.05~dfsg~20120125-0ubuntu1 gx_ht_threshold_row_bit@Base 9.02~dfsg + gx_ht_threshold_row_bit_sub@Base 9.05~dfsg~20120125-0ubuntu1 gx_ht_write@Base 8.61.dfsg.1 gx_ignore_end_image@Base 8.61.dfsg.1 gx_image1_end_image@Base 8.61.dfsg.1 @@ -2887,6 +2927,7 @@ gx_num_components_3@Base 8.61.dfsg.1 gx_num_components_4@Base 8.61.dfsg.1 gx_open_cache_device@Base 8.61.dfsg.1 + gx_outputfile_is_separate_pages@Base 9.05~dfsg~20120125-0ubuntu1 gx_overprint_generic_fill_rectangle@Base 8.61.dfsg.1 gx_overprint_sep_fill_rectangle_1@Base 8.61.dfsg.1 gx_overprint_sep_fill_rectangle_2@Base 8.61.dfsg.1 @@ -3040,7 +3081,8 @@ gx_upright_get_initial_matrix@Base 8.61.dfsg.1 gxclip2_dummy@Base 8.61.dfsg.1 gxht_thresh_image_init@Base 9.02~dfsg - gxht_thresh_plane@Base 9.04~dfsg +#MISSING: 9.05~dfsg~20120125-0ubuntu1# gxht_thresh_plane@Base 9.04~dfsg + gxht_thresh_planes@Base 9.05~dfsg~20120125-0ubuntu1 hc_put_code_proc@Base 8.61.dfsg.1 hc_put_last_bits_proc@Base 8.61.dfsg.1 height@Base 8.61.dfsg.1 @@ -3095,8 +3137,8 @@ image_init_color_cache@Base 9.02~dfsg imagen_procs@Base 8.61.dfsg.1 imasktab@Base 8.61.dfsg.1 - imdi_tab@Base 8.61.dfsg.1 - imdi_tab_free@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# imdi_tab@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# imdi_tab_free@Base 8.61.dfsg.1 imemory_new_mask@Base 8.61.dfsg.1 imemory_save_level@Base 8.61.dfsg.1 imemory_space@Base 8.61.dfsg.1 @@ -3105,7 +3147,7 @@ init_p9color@Base 8.61.dfsg.1 init_patch_fill_state@Base 8.61.dfsg.1 init_section@Base 8.61.dfsg.1 - init_write_tab@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# init_write_tab@Base 8.61.dfsg.1 initial_dictionaries@Base 8.61.dfsg.1 initial_dstack@Base 8.61.dfsg.1 int_gstate_alloc@Base 8.61.dfsg.1 @@ -3140,7 +3182,7 @@ jpeg_mem_init@Base 8.61.dfsg.1 jpeg_mem_term@Base 8.61.dfsg.1 jpeg_open_backing_store@Base 8.61.dfsg.1 - ktable@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# ktable@Base 8.61.dfsg.1 lib_file_open@Base 8.61.dfsg.1 lib_fopen@Base 8.61.dfsg.1 lips_media_selection@Base 8.61.dfsg.1 @@ -3173,6 +3215,7 @@ matrix2@Base 8.61.dfsg.1 media@Base 8.61.dfsg.1 mem_close@Base 8.61.dfsg.1 + mem_default_strip_copy_rop2@Base 9.05~dfsg~20120125-0ubuntu1 mem_default_strip_copy_rop@Base 8.61.dfsg.1 mem_draw_thin_line@Base 8.61.dfsg.1 mem_get_bits_rectangle@Base 8.61.dfsg.1 @@ -3234,9 +3277,9 @@ #MISSING: 9.00~dfsg-1# new_icmFileMem@Base 8.61.dfsg.1 #MISSING: 9.00~dfsg-1# new_icmFileStd_fp@Base 8.61.dfsg.1 #MISSING: 9.00~dfsg-1# new_icmFileStd_name@Base 8.61.dfsg.1 - new_imdi@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# new_imdi@Base 8.61.dfsg.1 new_pattern_trans_buff@Base 8.70~ - no_kfuncs@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# no_kfuncs@Base 8.61.dfsg.1 num_array_format@Base 8.61.dfsg.1 num_array_get@Base 8.61.dfsg.1 num_array_size@Base 8.61.dfsg.1 @@ -3268,6 +3311,11 @@ outprintf@Base 8.61.dfsg.1 outwrite@Base 8.61.dfsg.1 #MISSING: 8.64~dfsg-3# p9color@Base 8.61.dfsg.1 + pSHA256_Final@Base 9.05~dfsg~20120125-0ubuntu1 + pSHA256_Init@Base 9.05~dfsg~20120125-0ubuntu1 + pSHA256_Transform@Base 9.05~dfsg~20120125-0ubuntu1 + pSHA256_Update@Base 9.05~dfsg~20120125-0ubuntu1 + pSHA512_Transform@Base 9.05~dfsg~20120125-0ubuntu1 packed_get@Base 8.61.dfsg.1 pantone_op_defs@Base 8.61.dfsg.1 paperTable@Base 8.61.dfsg.1 @@ -3456,6 +3504,7 @@ pdf_end_write_image@Base 8.61.dfsg.1 pdf_enter_substream@Base 8.61.dfsg.1 pdf_exit_substream@Base 8.61.dfsg.1 + pdf_find_base14_name@Base 9.05~dfsg~20120125-0ubuntu1 pdf_find_glyph@Base 8.61.dfsg.1 pdf_find_named@Base 8.61.dfsg.1 pdf_find_resource_by_gs_id@Base 8.61.dfsg.1 @@ -4220,6 +4269,7 @@ swrite_position_only@Base 8.61.dfsg.1 swrite_proc@Base 8.61.dfsg.1 swrite_string@Base 8.61.dfsg.1 + sync_text_state@Base 9.05~dfsg~20120125-0ubuntu1 t1_hinter__closepath@Base 8.61.dfsg.1 t1_hinter__dotsection@Base 8.61.dfsg.1 t1_hinter__drop_hints@Base 8.61.dfsg.1 @@ -4314,19 +4364,19 @@ width@Base 8.61.dfsg.1 write_bmp_header@Base 8.61.dfsg.1 write_bmp_separated_header@Base 8.61.dfsg.1 - write_default@Base 8.61.dfsg.1 - write_entry@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# write_default@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# write_entry@Base 8.61.dfsg.1 write_matrix_in@Base 8.61.dfsg.1 - write_uchar@Base 8.61.dfsg.1 - write_uint@Base 8.61.dfsg.1 - write_ulong@Base 8.61.dfsg.1 - write_ulonglong@Base 8.61.dfsg.1 - write_ushort@Base 8.61.dfsg.1 - wts_get_samples@Base 8.61.dfsg.1 - wts_pick_cell_size@Base 8.61.dfsg.1 - wts_screen_from_enum@Base 8.61.dfsg.1 - wts_size@Base 8.61.dfsg.1 - wts_sort_cell@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# write_uchar@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# write_uint@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# write_ulong@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# write_ulonglong@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# write_ushort@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# wts_get_samples@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# wts_pick_cell_size@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# wts_screen_from_enum@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# wts_size@Base 8.61.dfsg.1 +#MISSING: 9.05~dfsg~20120125-0ubuntu1# wts_sort_cell@Base 8.61.dfsg.1 z1_data_procs@Base 8.61.dfsg.1 z1_glyph_info@Base 8.61.dfsg.1 z1_glyph_info_generic@Base 8.61.dfsg.1 diff -Nru ghostscript-9.04~dfsg/debian/ubuntu/apport-hook.py ghostscript-9.05~dfsg~20120125/debian/ubuntu/apport-hook.py --- ghostscript-9.04~dfsg/debian/ubuntu/apport-hook.py 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/debian/ubuntu/apport-hook.py 2012-01-25 20:41:20.000000000 +0000 @@ -0,0 +1,11 @@ +'''apport package hook for ghostscript + +(c) 2009 Canonical Ltd. +Author: Brian Murray +''' + +from apport.hookutils import * + +def add_info(report): + attach_hardware(report) + attach_printing(report) diff -Nru ghostscript-9.04~dfsg/debian/watch ghostscript-9.05~dfsg~20120125/debian/watch --- ghostscript-9.04~dfsg/debian/watch 2011-11-24 03:43:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/debian/watch 2012-01-25 20:48:18.000000000 +0000 @@ -1,4 +1,4 @@ # Run the "uscan" command to check for upstream updates and more. version=3 opts=dversionmangle=s/\~dfsg.*// \ - http://downloads.ghostscript.com/public/ghostscript-(\d+[^-]+)\.tar\.gz + http://downloads.ghostscript.com/public/ghostscript-(\d+[^-]+)\.tar\.bz2 diff -Nru ghostscript-9.04~dfsg/doc/API.htm ghostscript-9.05~dfsg~20120125/doc/API.htm --- ghostscript-9.04~dfsg/doc/API.htm 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/doc/API.htm 2012-01-07 20:18:22.000000000 +0000 @@ -684,9 +684,44 @@ memory allocation and updating. Each callback function contains a handle can be set using
+ -sDisplayHandle=1234 +
+

+Where "1234" is a string. The API was changed to use a string +rather than an integer/long value when support for 64 bit systems +arrived. A display "handle" is often a pointer, and since these +command line options have to survive being processed by Postscript +machinery, and Postscript only permits 32 bit number values, a +different representation was required. Hence changing the value +to a string, so that 64 bit values can be supported. The string +formats allowed are: +

+1234 - implicit base 10 +
+
+10#1234 - explicit base 10 +
+
+16#04d2 - explicit base 16 +
+

+The "number string" is parsed by the display device to retrieve +the number value, and is then assigned to the void pointer +parameter "pHandle" in the display device structure. Thus, for +a trivial example, passing -sDisplayHandle=0 will result +in the first parameter passed to your display device callbacks being: +(void *)0. +

+The previous API, using a number value: +

-dDisplayHandle=1234

+is still supported on 32 bit systems, but will cause a "typecheck" +error on 64 bit systems, and is considered deprecated. It should +not be used in new code. + +

The device raster format can be configured using

-dDisplayFormat=NNNN diff -Nru ghostscript-9.04~dfsg/doc/Develop.htm ghostscript-9.05~dfsg~20120125/doc/Develop.htm --- ghostscript-9.04~dfsg/doc/Develop.htm 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/doc/Develop.htm 2011-12-09 10:16:21.000000000 +0000 @@ -1191,14 +1191,6 @@ base/gxhttype.h, base/gzht.h. -
-Well tempered screening: -
-base/gswts.h, -base/gswts.c, -base/gxwts.h, -base/gxwts.c, -base/wtsimdi.c.

@@ -1529,11 +1521,6 @@ base/gsserial.c, base/gsserial.h. -

-Color mapping: -
-base/gdevimdi.c. -

Visual Trace

@@ -1788,12 +1775,6 @@

Other high-level devices

-Currently, the CGM driver is raster-only. If anyone cares seriously about -CGM in the future, this driver should be upgraded to a higher level. - -

- -
PCL XL output device (pxlmono, pxlcolor):
base/gdevpx.c, @@ -1909,14 +1890,6 @@ base/gdevtsep.c.
-(Low-level) CGM: -
-base/gdevcgm.c, -base/gdevcgml.c, -base/gdevcgml.h, -base/gdevcgmx.h. - -
Example DeviceN devices:
base/gdevdevn.c, @@ -2078,10 +2051,6 @@ base/rinkj/rinkj-screen-eb.h, lib/rinkj-2200-setup. -
-A device implementing Well Tempered Screening and IMDI color correction: -
-base/gdevwts.c.

PostScript interpreter

diff -Nru ghostscript-9.04~dfsg/doc/Devices.htm ghostscript-9.05~dfsg~20120125/doc/Devices.htm --- ghostscript-9.04~dfsg/doc/Devices.htm 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/doc/Devices.htm 2011-11-12 18:29:08.000000000 +0000 @@ -755,17 +755,22 @@

Text output

The txtwrite device will output the text contained in the original -document as Unicode (UTF-16). This device is currently under development -and should not be considered as being of production quality. +document as Unicode.

Options

-
-dTextFormat=0 | 1 (default is 0) -
Format 0 outputs Unicode text (with a Byte Order Mark) which approximates -to the layout of the text in the original document. Format 1 is intended -for use by developers and outputs Unicode along with information regarding -the format of the text (position, font name, point size, etc). +
-dTextFormat=0 | 1 | 2 | 3 (default is 3) +
Format 0 is intended for use by developers and outputs XML-escaped Unicode +along with information regarding the format of the text (position, font name, +point size, etc). The XML output is the same format as the MuPDF output, but +no additional processing is performed on the content, so no block detection.
+
Format 1 uses the same XML output format, but attempts similar processing to +MuPDF, and will output blocks of text. Note the alogrithm used is not the same +as the MuPDF code, and so the results will not be identical.
+
Format 2 outputs Unicode (UCS2) text (with a Byte Order Mark) which +approximates the layout of the text in the original document.
+
Format 3 is the same as format 2, but the text is encoded in UTF-8.

diff -Nru ghostscript-9.04~dfsg/doc/Drivers.htm ghostscript-9.05~dfsg~20120125/doc/Drivers.htm --- ghostscript-9.04~dfsg/doc/Drivers.htm 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/doc/Drivers.htm 2011-12-09 10:16:21.000000000 +0000 @@ -804,10 +804,40 @@ * W and a repetition height of H, the pixel at coordinate (X,Y) * corresponds to halftone pixel (X mod W, Y mod H), ignoring phase; * for a shifted halftone with shift S, the pixel at (X,Y) corresponds - * to halftone pixel ((X + S * floor(Y/H)) mod W, Y mod H). Requirements: - * strip_shift < rep_width - * strip_height % rep_height = 0 - * shift = (strip_shift * (size.y / strip_height)) % rep_width + * to halftone pixel ((X + S * floor(Y/H)) mod W, Y mod H). In other words, + * each Y increment of H shifts the strip left by S pixels. + * + * As for non-shifted tiles, a strip bitmap may include multiple copies + * in X or Y to reduce loop overhead. In this case, we must distinguish: + * - The height of an individual strip, which is the same as + * the height of the bitmap being replicated (rep_height, H); + * - The height of the entire bitmap (size.y). + * Similarly, we must distinguish: + * - The shift per strip (rep_shift, S); + * - The shift for the entire bitmap (shift). + * Note that shift = (rep_shift * size.y / rep_height) mod rep_width, + * so the shift member of the structure is only an accelerator. It is, + * however, an important one, since it indicates whether the overall + * bitmap requires shifting or not. + * + * Note that for shifted tiles, size.y is the size of the stored bitmap + * (1 or more strips), and NOT the height of the actual tile. The latter + * is not stored in the structure at all: it can be computed as H * W / + * gcd(S, W). + * + * If the bitmap consists of a multiple of W / gcd(S, W) copies in Y, the + * effective shift is zero, reducing it to a tile. For simplicity, we + * require that if shift is non-zero, the bitmap height be less than H * W / + * gcd(S, W). I.e., we don't allow strip bitmaps that are large enough to + * include a complete tile but that don't include an integral number of + * tiles. Requirements: + * rep_shift < rep_width + * shift = (rep_shift * (size.y / rep_height)) % rep_width + * + * For the benefit of the planar device, we now have a num_planes field. + * For chunky data this should be set to 1. For planar data, the data pointer + * points to the first plane of data; subsequent planes of data follow + * immediately after this as if there were num_planes * height lines of data. */ typedef struct gx_strip_bitmap_s { byte *data; @@ -815,9 +845,9 @@ gs_int_point size; /* width, height */ gx_bitmap_id id; ushort rep_width, rep_height; /* true size of tile */ - ushort strip_height; - ushort strip_shift; + ushort rep_shift; ushort shift; + int num_planes; } gx_strip_bitmap;

@@ -1753,11 +1783,26 @@ 9   0 if texture opaque, 1 if texture transparent - ?-10 + 10 +   + 1 if pdf transparency is in use, 0 otherwise. This makes no +difference to the rendering, but forces the raster operation to be considered +non-idempotent by internal routines. + 11 +   + 1 if the target of this operation is a specific plane, rather +than all planes. The plane in question is given by bits 13 upwards. This +is only used by the planar device. + 12-   - unused, must be 0 + If bit 11 = 1, then bits 12 upwards give the plane number to +operate on. Otherwise, should be set to 0. +

In general most devices should just check to see that bits they do not +handle (11 and above typically) are zero, and should jump to the default +implementation, or return an error otherwise. +

The raster operation follows the Microsoft and H-P specification. It is an 8-element truth table that specifies the output value for each of the @@ -2011,7 +2056,7 @@

The implementation fills entire triangle. The filling rule is same as for Polygon-level drawing. -A color for each pixel within the triangle to be computed as a linear interpolation +The color of each pixel within the triangle is computed as a linear interpolation of vertex colors.
The implementation may reject the request if the area or the color appears too complex @@ -2022,12 +2067,12 @@ Important note : Do not try to decompose the area within the implementation of fill_linear_color_triangle, because it can break the plane coverage contiguity and cause a dropout. -Instead request that graphics library to perform the decomposition. +Instead request that the graphics library should perform the decomposition. The graphics libary is smart enough to do that properly.
Important note : The implementation must handle a special case, when only 2 colors are specified. -It happens if p3 one is NULL. +It happens if p2 is NULL. This means that the color does not depend on the X coordinate, i.e. it forms a linear gradient along the Y axis. The implementation must not reject (return 0) such cases. @@ -2041,7 +2086,7 @@ so many ones as you need to fit the device color precision.
Important note : The fa argument may contain -the swap_axes bit set. In this case the implementation must swap (transpoze) +the swap_axes bit set. In this case the implementation must swap (transpose) X and Y axes.
Important note : The implementation must not paint outside the @@ -2049,7 +2094,7 @@ If fa->swap_axes is true, the clipping rectangle is transposed.
See gx_default_fill_linear_color_triangle -in gdevddrw.c as a sample code. +in gdevddrw.c for sample code. @@ -2066,9 +2111,9 @@ The default implementation of fill_linear_color_triangle calls this function 1-2 times per triangle. Besides that, this function may be called by the graphics library for other special cases, -when a decomposition into triangles appears undiserable. +when a decomposition into triangles appears undesirable.
-Rather the prototype can specify a bilinear color, +While the prototype can specify a bilinear color, we assume that the implementation handles linear colors only. This means that the implementation can ignore any of c0, c1, c2, c3 . The graphics library takes a special care of the color linearity @@ -2076,12 +2121,12 @@ is to avoid color precision problems.
Similarly to fill_linear_color_triangle , -this function may be called with only 2 colors, and may reject too comple areas. +this function may be called with only 2 colors, and may reject areas as being too complex. All those important notes are applicable here.
-A sample code may be found in in gxdtfill.h, rather it's a kind of complicated. +Sample code may be found in in gxdtfill.h; be aware it's rather complicated. A linear color function is generated from it as gx_fill_trapezoid_ns_lc -with the following template parametres : +with the following template parameters :
 #define LINEAR_COLOR 1 
@@ -2162,7 +2207,7 @@
 driver interface provides a set of high-level operations.  Normally these
 will have their default implementation, which converts the high-level
 operation to the low-level ones just described; however, drivers that
-generate high-level output formats such as CGM, or communicate with devices
+generate high-level output formats such as pdfwrite, or communicate with devices
 that have firmware for higher-level operations such as polygon fills, may
 implement these high-level operations directly.  For more details, please
 consult the source code, specifically:
diff -Nru ghostscript-9.04~dfsg/doc/figures/Ghost.eps ghostscript-9.05~dfsg~20120125/doc/figures/Ghost.eps
--- ghostscript-9.04~dfsg/doc/figures/Ghost.eps	2011-08-05 11:12:21.000000000 +0000
+++ ghostscript-9.05~dfsg~20120125/doc/figures/Ghost.eps	1970-01-01 00:00:00.000000000 +0000
@@ -1,8679 +0,0 @@
-%!PS-Adobe-3.1 EPSF-3.0
-%ADO_DSC_Encoding: Windows Roman
-%%Title: Ghost2.eps
-%%Creator: Adobe Illustrator(R) 13.0
-%%For: michaelv
-%%CreationDate: 9/1/2009
-%%BoundingBox: 0 0 1591 1594
-%%HiResBoundingBox: 0 0 1590.1602 1593.1617
-%%CropBox: 0 0 1590.1602 1593.1617
-%%LanguageLevel: 2
-%%DocumentData: Clean7Bit
-%ADOBeginClientInjection: DocumentHeader "AI11EPS"
-%%AI8_CreatorVersion: 13.0.1
%AI9_PrintingDataBegin
%ADO_BuildNumber: Adobe Illustrator(R) 13.0.1 x420 R agm 4.4379 ct 5.1039
%ADO_ContainsXMP: MainFirst

-%ADOEndClientInjection: DocumentHeader "AI11EPS"
-%%Pages: 1
-%%DocumentNeededResources: 
-%%DocumentSuppliedResources: procset Adobe_AGM_Image 1.0 0
-%%+ procset Adobe_CoolType_Utility_T42 1.0 0
-%%+ procset Adobe_CoolType_Utility_MAKEOCF 1.23 0
-%%+ procset Adobe_CoolType_Core 2.31 0
-%%+ procset Adobe_AGM_Core 2.0 0
-%%+ procset Adobe_AGM_Utils 1.0 0
-%%DocumentFonts: 
-%%DocumentNeededFonts: 
-%%DocumentNeededFeatures: 
-%%DocumentSuppliedFeatures: 
-%%DocumentProcessColors:  Cyan Magenta Yellow Black
-%%DocumentCustomColors: 
-%%CMYKCustomColor: 
-%%RGBCustomColor: 
-%%EndComments
-                                                                                                                                                                                                               
-                                                                                                                                                                                                                                                         
-                                                                                                                                                                                                                                                         
-                                                                                                                                                                                                                                                         
-                                                                                                                                                                                                                                                         
-                                                                                                                                                                                                                                                         
-%%BeginDefaults
-%%ViewingOrientation: 1 0 0 1
-%%EndDefaults
-%%BeginProlog
-%%BeginResource: procset Adobe_AGM_Utils 1.0 0
-%%Version: 1.0 0
-%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved.
-systemdict/setpacking known
-{currentpacking	true setpacking}if
-userdict/Adobe_AGM_Utils 73 dict dup begin put
-/bdf
-{bind def}bind def
-/nd{null def}bdf
-/xdf
-{exch def}bdf
-/ldf 
-{load def}bdf
-/ddf
-{put}bdf	
-/xddf
-{3 -1 roll put}bdf	
-/xpt
-{exch put}bdf
-/ndf
-{
-	exch dup where{
-		pop pop pop
-	}{
-		xdf
-	}ifelse
-}def
-/cdndf
-{
-	exch dup currentdict exch known{
-		pop pop
-	}{
-		exch def
-	}ifelse
-}def
-/gx
-{get exec}bdf
-/ps_level
-	/languagelevel where{
-		pop systemdict/languagelevel gx
-	}{
-		1
-	}ifelse
-def
-/level2 
-	ps_level 2 ge
-def
-/level3 
-	ps_level 3 ge
-def
-/ps_version
-	{version cvr}stopped{-1}if
-def
-/set_gvm
-{currentglobal exch setglobal}bdf
-/reset_gvm
-{setglobal}bdf
-/makereadonlyarray
-{
-	/packedarray where{pop packedarray
-	}{
-		array astore readonly}ifelse
-}bdf
-/map_reserved_ink_name
-{
-	dup type/stringtype eq{
-		dup/Red eq{
-			pop(_Red_)
-		}{
-			dup/Green eq{
-				pop(_Green_)
-			}{
-				dup/Blue eq{
-					pop(_Blue_)
-				}{
-					dup()cvn eq{
-						pop(Process)
-					}if
-				}ifelse
-			}ifelse
-		}ifelse
-	}if
-}bdf
-/AGMUTIL_GSTATE 22 dict def
-/get_gstate
-{
-	AGMUTIL_GSTATE begin
-	/AGMUTIL_GSTATE_clr_spc currentcolorspace def
-	/AGMUTIL_GSTATE_clr_indx 0 def
-	/AGMUTIL_GSTATE_clr_comps 12 array def
-	mark currentcolor counttomark
-		{AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put
-		/AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def}repeat pop
-	/AGMUTIL_GSTATE_fnt rootfont def
-	/AGMUTIL_GSTATE_lw currentlinewidth def
-	/AGMUTIL_GSTATE_lc currentlinecap def
-	/AGMUTIL_GSTATE_lj currentlinejoin def
-	/AGMUTIL_GSTATE_ml currentmiterlimit def
-	currentdash/AGMUTIL_GSTATE_do xdf/AGMUTIL_GSTATE_da xdf
-	/AGMUTIL_GSTATE_sa currentstrokeadjust def
-	/AGMUTIL_GSTATE_clr_rnd currentcolorrendering def
-	/AGMUTIL_GSTATE_op currentoverprint def
-	/AGMUTIL_GSTATE_bg currentblackgeneration cvlit def
-	/AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def
-	currentcolortransfer cvlit/AGMUTIL_GSTATE_gy_xfer xdf cvlit/AGMUTIL_GSTATE_b_xfer xdf
-		cvlit/AGMUTIL_GSTATE_g_xfer xdf cvlit/AGMUTIL_GSTATE_r_xfer xdf
-	/AGMUTIL_GSTATE_ht currenthalftone def
-	/AGMUTIL_GSTATE_flt currentflat def
-	end
-}def
-/set_gstate
-{
-	AGMUTIL_GSTATE begin
-	AGMUTIL_GSTATE_clr_spc setcolorspace
-	AGMUTIL_GSTATE_clr_indx{AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get
-	/AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def}repeat setcolor
-	AGMUTIL_GSTATE_fnt setfont
-	AGMUTIL_GSTATE_lw setlinewidth
-	AGMUTIL_GSTATE_lc setlinecap
-	AGMUTIL_GSTATE_lj setlinejoin
-	AGMUTIL_GSTATE_ml setmiterlimit
-	AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash
-	AGMUTIL_GSTATE_sa setstrokeadjust
-	AGMUTIL_GSTATE_clr_rnd setcolorrendering
-	AGMUTIL_GSTATE_op setoverprint
-	AGMUTIL_GSTATE_bg cvx setblackgeneration
-	AGMUTIL_GSTATE_ucr cvx setundercolorremoval
-	AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx
-		AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer
-	AGMUTIL_GSTATE_ht/HalftoneType get dup 9 eq exch 100 eq or
-		{
-		currenthalftone/HalftoneType get AGMUTIL_GSTATE_ht/HalftoneType get ne
-			{
-			 mark AGMUTIL_GSTATE_ht{sethalftone}stopped cleartomark
-			}if
-		}{
-		AGMUTIL_GSTATE_ht sethalftone
-		}ifelse
-	AGMUTIL_GSTATE_flt setflat
-	end
-}def
-/get_gstate_and_matrix
-{
-	AGMUTIL_GSTATE begin
-	/AGMUTIL_GSTATE_ctm matrix currentmatrix def
-	end
-	get_gstate
-}def
-/set_gstate_and_matrix
-{
-	set_gstate
-	AGMUTIL_GSTATE begin
-	AGMUTIL_GSTATE_ctm setmatrix
-	end
-}def
-/AGMUTIL_str256 256 string def
-/AGMUTIL_src256 256 string def
-/AGMUTIL_dst64 64 string def
-/AGMUTIL_srcLen nd
-/AGMUTIL_ndx nd
-/AGMUTIL_cpd nd
-/capture_cpd{
-	//Adobe_AGM_Utils/AGMUTIL_cpd currentpagedevice ddf
-}def
-/thold_halftone
-{
-	level3
-		{sethalftone currenthalftone}
-		{
-			dup/HalftoneType get 3 eq
-			{
-				sethalftone currenthalftone
-			}{
-				begin
-				Width Height mul{
-					Thresholds read{pop}if
-				}repeat
-				end
-				currenthalftone
-			}ifelse
-		}ifelse
-}def 
-/rdcmntline
-{
-	currentfile AGMUTIL_str256 readline pop
-	(%)anchorsearch{pop}if
-}bdf
-/filter_cmyk
-{	
-	dup type/filetype ne{
-		exch()/SubFileDecode filter
-	}{
-		exch pop
-	}
-	ifelse
-	[
-	exch
-	{
-		AGMUTIL_src256 readstring pop
-		dup length/AGMUTIL_srcLen exch def
-		/AGMUTIL_ndx 0 def
-		AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{
-			1 index exch get
-			AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put
-			/AGMUTIL_ndx AGMUTIL_ndx 1 add def
-		}for
-		pop
-		AGMUTIL_dst64 0 AGMUTIL_ndx getinterval
-	}
-	bind
-	/exec cvx
-	]cvx
-}bdf
-/filter_indexed_devn
-{
-	cvi Names length mul names_index add Lookup exch get
-}bdf
-/filter_devn
-{	
-	4 dict begin
-	/srcStr xdf
-	/dstStr xdf
-	dup type/filetype ne{
-		0()/SubFileDecode filter
-	}if
-	[
-	exch
-		[
-			/devicen_colorspace_dict/AGMCORE_gget cvx/begin cvx
-			currentdict/srcStr get/readstring cvx/pop cvx
-			/dup cvx/length cvx 0/gt cvx[
-				Adobe_AGM_Utils/AGMUTIL_ndx 0/ddf cvx
-				names_index Names length currentdict/srcStr get length 1 sub{
-					1/index cvx/exch cvx/get cvx
-					currentdict/dstStr get/AGMUTIL_ndx/load cvx 3 -1/roll cvx/put cvx
-					Adobe_AGM_Utils/AGMUTIL_ndx/AGMUTIL_ndx/load cvx 1/add cvx/ddf cvx
-				}for
-				currentdict/dstStr get 0/AGMUTIL_ndx/load cvx/getinterval cvx
-			]cvx/if cvx
-			/end cvx
-		]cvx
-		bind
-		/exec cvx
-	]cvx
-	end
-}bdf
-/AGMUTIL_imagefile nd
-/read_image_file
-{
-	AGMUTIL_imagefile 0 setfileposition
-	10 dict begin
-	/imageDict xdf
-	/imbufLen Width BitsPerComponent mul 7 add 8 idiv def
-	/imbufIdx 0 def
-	/origDataSource imageDict/DataSource get def
-	/origMultipleDataSources imageDict/MultipleDataSources get def
-	/origDecode imageDict/Decode get def
-	/dstDataStr imageDict/Width get colorSpaceElemCnt mul string def
-	imageDict/MultipleDataSources known{MultipleDataSources}{false}ifelse
-	{
-		/imbufCnt imageDict/DataSource get length def
-		/imbufs imbufCnt array def
-		0 1 imbufCnt 1 sub{
-			/imbufIdx xdf
-			imbufs imbufIdx imbufLen string put
-			imageDict/DataSource get imbufIdx[AGMUTIL_imagefile imbufs imbufIdx get/readstring cvx/pop cvx]cvx put
-		}for
-		DeviceN_PS2{
-			imageDict begin
-		 	/DataSource[DataSource/devn_sep_datasource cvx]cvx def
-			/MultipleDataSources false def
-			/Decode[0 1]def
-			end
-		}if
-	}{
-		/imbuf imbufLen string def
-		Indexed_DeviceN level3 not and DeviceN_NoneName or{
-			/srcDataStrs[imageDict begin
-				currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse
-				{
-					Width Decode length 2 div mul cvi string
-				}repeat
-				end]def		
-			imageDict begin
-		 	/DataSource[AGMUTIL_imagefile Decode BitsPerComponent false 1/filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource/exec cvx]cvx def
-			/Decode[0 1]def
-			end
-		}{
-			imageDict/DataSource[1 string dup 0 AGMUTIL_imagefile Decode length 2 idiv string/readstring cvx/pop cvx names_index/get cvx/put cvx]cvx put
-			imageDict/Decode[0 1]put
-		}ifelse
-	}ifelse
-	imageDict exch
-	load exec
-	imageDict/DataSource origDataSource put
-	imageDict/MultipleDataSources origMultipleDataSources put
-	imageDict/Decode origDecode put	
-	end
-}bdf
-/write_image_file
-{
-	begin
-	{(AGMUTIL_imagefile)(w+)file}stopped{
-		false
-	}{
-		Adobe_AGM_Utils/AGMUTIL_imagefile xddf 
-		2 dict begin
-		/imbufLen Width BitsPerComponent mul 7 add 8 idiv def
-		MultipleDataSources{DataSource 0 get}{DataSource}ifelse type/filetype eq{
-			/imbuf imbufLen string def
-		}if
-		1 1 Height MultipleDataSources not{Decode length 2 idiv mul}if{
-			pop
-			MultipleDataSources{
-			 	0 1 DataSource length 1 sub{
-					DataSource type dup
-					/arraytype eq{
-						pop DataSource exch gx
-					}{
-						/filetype eq{
-							DataSource exch get imbuf readstring pop
-						}{
-							DataSource exch get
-						}ifelse
-					}ifelse
-					AGMUTIL_imagefile exch writestring
-				}for
-			}{
-				DataSource type dup
-				/arraytype eq{
-					pop DataSource exec
-				}{
-					/filetype eq{
-						DataSource imbuf readstring pop
-					}{
-						DataSource
-					}ifelse
-				}ifelse
-				AGMUTIL_imagefile exch writestring
-			}ifelse
-		}for
-		end
-		true
-	}ifelse
-	end
-}bdf
-/close_image_file
-{
-	AGMUTIL_imagefile closefile(AGMUTIL_imagefile)deletefile
-}def
-statusdict/product known userdict/AGMP_current_show known not and{
-	/pstr statusdict/product get def
-	pstr(HP LaserJet 2200)eq 	
-	pstr(HP LaserJet 4000 Series)eq or
-	pstr(HP LaserJet 4050 Series )eq or
-	pstr(HP LaserJet 8000 Series)eq or
-	pstr(HP LaserJet 8100 Series)eq or
-	pstr(HP LaserJet 8150 Series)eq or
-	pstr(HP LaserJet 5000 Series)eq or
-	pstr(HP LaserJet 5100 Series)eq or
-	pstr(HP Color LaserJet 4500)eq or
-	pstr(HP Color LaserJet 4600)eq or
-	pstr(HP LaserJet 5Si)eq or
-	pstr(HP LaserJet 1200 Series)eq or
-	pstr(HP LaserJet 1300 Series)eq or
-	pstr(HP LaserJet 4100 Series)eq or 
-	{
- 		userdict/AGMP_current_show/show load put
-		userdict/show{
-		 currentcolorspace 0 get
-		 /Pattern eq
-		 {false charpath f}
-		 {AGMP_current_show}ifelse
-		}put
-	}if
-	currentdict/pstr undef
-}if
-/consumeimagedata
-{
-	begin
-	AGMIMG_init_common
-	currentdict/MultipleDataSources known not
-		{/MultipleDataSources false def}if
-	MultipleDataSources
-		{
-		DataSource 0 get type
-		dup/filetype eq
-			{
-			1 dict begin
-			/flushbuffer Width cvi string def
-			1 1 Height cvi
-				{
-				pop
-				0 1 DataSource length 1 sub
-					{
-					DataSource exch get
-					flushbuffer readstring pop pop
-					}for
-				}for
-			end
-			}if
-		dup/arraytype eq exch/packedarraytype eq or DataSource 0 get xcheck and
-			{
-			Width Height mul cvi
-				{
-				0 1 DataSource length 1 sub
-					{dup DataSource exch gx length exch 0 ne{pop}if}for
-				dup 0 eq
-					{pop exit}if
-				sub dup 0 le
-					{exit}if
-				}loop
-			pop
-			}if		
-		}
-		{
-		/DataSource load type 
-		dup/filetype eq
-			{
-			1 dict begin
-			/flushbuffer Width Decode length 2 idiv mul cvi string def
-			1 1 Height{pop DataSource flushbuffer readstring pop pop}for
-			end
-			}if
-		dup/arraytype eq exch/packedarraytype eq or/DataSource load xcheck and
-			{
-				Height Width BitsPerComponent mul 8 BitsPerComponent sub add 8 idiv Decode length 2 idiv mul mul
-					{
-					DataSource length dup 0 eq
-						{pop exit}if
-					sub dup 0 le
-						{exit}if
-					}loop
-				pop
-			}if
-		}ifelse
-	end
-}bdf
-/addprocs
-{
-	 2{/exec load}repeat
-	 3 1 roll
-	 [5 1 roll]bind cvx
-}def
-/modify_halftone_xfer
-{
-	currenthalftone dup length dict copy begin
-	 currentdict 2 index known{
-	 	1 index load dup length dict copy begin
-		currentdict/TransferFunction known{
-			/TransferFunction load
-		}{
-			currenttransfer
-		}ifelse
-		 addprocs/TransferFunction xdf 
-		 currentdict end def
-		currentdict end sethalftone
-	}{
-		currentdict/TransferFunction known{
-			/TransferFunction load 
-		}{
-			currenttransfer
-		}ifelse
-		addprocs/TransferFunction xdf
-		currentdict end sethalftone		
-		pop
-	}ifelse
-}def
-/clonearray
-{
-	dup xcheck exch
-	dup length array exch
-	Adobe_AGM_Core/AGMCORE_tmp -1 ddf 
-	{
-	Adobe_AGM_Core/AGMCORE_tmp 2 copy get 1 add ddf 
-	dup type/dicttype eq
-		{
-			Adobe_AGM_Core/AGMCORE_tmp get
-			exch
-			clonedict
-			Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf 
-		}if
-	dup type/arraytype eq
-		{
-			Adobe_AGM_Core/AGMCORE_tmp get exch
-			clonearray
-			Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf 
-		}if
-	exch dup
-	Adobe_AGM_Core/AGMCORE_tmp get 4 -1 roll put
-	}forall
-	exch{cvx}if
-}bdf
-/clonedict
-{
-	dup length dict
-	begin
-	{
-		dup type/dicttype eq
-			{clonedict}if
-		dup type/arraytype eq
-			{clonearray}if
-		def
-	}forall
-	currentdict
-	end
-}bdf
-/DeviceN_PS2
-{
-	/currentcolorspace AGMCORE_gget 0 get/DeviceN eq level3 not and
-}bdf
-/Indexed_DeviceN
-{
-	/indexed_colorspace_dict AGMCORE_gget dup null ne{
-		dup/CSDBase known{
-			/CSDBase get/CSD get_res/Names known 
-		}{
-			pop false
-		}ifelse
-	}{
-		pop false
-	}ifelse
-}bdf
-/DeviceN_NoneName
-{	
-	/Names where{
-		pop
-		false Names
-		{
-			(None)eq or
-		}forall
-	}{
-		false
-	}ifelse
-}bdf
-/DeviceN_PS2_inRip_seps
-{
-	/AGMCORE_in_rip_sep where
-	{
-		pop dup type dup/arraytype eq exch/packedarraytype eq or
-		{
-			dup 0 get/DeviceN eq level3 not and AGMCORE_in_rip_sep and
-			{
-				/currentcolorspace exch AGMCORE_gput
-				false
-			}{
-				true
-			}ifelse
-		}{
-			true
-		}ifelse
-	}{
-		true
-	}ifelse
-}bdf
-/base_colorspace_type
-{
-	dup type/arraytype eq{0 get}if
-}bdf
-/currentdistillerparams where{pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse
-{
-	/pdfmark_5{cleartomark}bind def
-}{
-	/pdfmark_5{pdfmark}bind def
-}ifelse
-/ReadBypdfmark_5
-{
-	currentfile exch 0 exch/SubFileDecode filter
-	/currentdistillerparams where 
-	{pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse
-	{flushfile cleartomark}
-	{/PUT pdfmark}ifelse 	
-}bdf
-/xpdfm
-{
-	{
-		dup 0 get/Label eq
-		{
-			aload length[exch 1 add 1 roll/PAGELABEL
-		}{
-			aload pop
-			[{ThisPage}<<5 -2 roll>>/PUT
-		}ifelse
-		pdfmark_5
-	}forall
-}bdf
-/ds{
-	Adobe_AGM_Utils begin
-}bdf
-/dt{
-	currentdict Adobe_AGM_Utils eq{
-		end
-	}if
-}bdf
-systemdict/setpacking known
-{setpacking}if
-%%EndResource
-%%BeginResource: procset Adobe_AGM_Core 2.0 0
-%%Version: 2.0 0
-%%Copyright: Copyright(C)1997-2007 Adobe Systems, Inc. All Rights Reserved.
-systemdict/setpacking known
-{
-	currentpacking
-	true setpacking
-}if
-userdict/Adobe_AGM_Core 209 dict dup begin put
-/Adobe_AGM_Core_Id/Adobe_AGM_Core_2.0_0 def
-/AGMCORE_str256 256 string def
-/AGMCORE_save nd
-/AGMCORE_graphicsave nd
-/AGMCORE_c 0 def
-/AGMCORE_m 0 def
-/AGMCORE_y 0 def
-/AGMCORE_k 0 def
-/AGMCORE_cmykbuf 4 array def
-/AGMCORE_screen[currentscreen]cvx def
-/AGMCORE_tmp 0 def
-/AGMCORE_&setgray nd
-/AGMCORE_&setcolor nd
-/AGMCORE_&setcolorspace nd
-/AGMCORE_&setcmykcolor nd
-/AGMCORE_cyan_plate nd
-/AGMCORE_magenta_plate nd
-/AGMCORE_yellow_plate nd
-/AGMCORE_black_plate nd
-/AGMCORE_plate_ndx nd
-/AGMCORE_get_ink_data nd
-/AGMCORE_is_cmyk_sep nd
-/AGMCORE_host_sep nd
-/AGMCORE_avoid_L2_sep_space nd
-/AGMCORE_distilling nd
-/AGMCORE_composite_job nd
-/AGMCORE_producing_seps nd
-/AGMCORE_ps_level -1 def
-/AGMCORE_ps_version -1 def
-/AGMCORE_environ_ok nd
-/AGMCORE_CSD_cache 0 dict def
-/AGMCORE_currentoverprint false def
-/AGMCORE_deltaX nd
-/AGMCORE_deltaY nd
-/AGMCORE_name nd
-/AGMCORE_sep_special nd
-/AGMCORE_err_strings 4 dict def
-/AGMCORE_cur_err nd
-/AGMCORE_current_spot_alias false def
-/AGMCORE_inverting false def
-/AGMCORE_feature_dictCount nd
-/AGMCORE_feature_opCount nd
-/AGMCORE_feature_ctm nd
-/AGMCORE_ConvertToProcess false def
-/AGMCORE_Default_CTM matrix def
-/AGMCORE_Default_PageSize nd
-/AGMCORE_Default_flatness nd
-/AGMCORE_currentbg nd
-/AGMCORE_currentucr nd
-/AGMCORE_pattern_paint_type 0 def
-/knockout_unitsq nd
-currentglobal true setglobal
-[/CSA/Gradient/Procedure]
-{
-	/Generic/Category findresource dup length dict copy/Category defineresource pop
-}forall
-setglobal
-/AGMCORE_key_known
-{
-	where{
-		/Adobe_AGM_Core_Id known
-	}{
-		false
-	}ifelse
-}ndf
-/flushinput
-{
-	save
-	2 dict begin
-	/CompareBuffer 3 -1 roll def
-	/readbuffer 256 string def
-	mark
-	{
-	currentfile readbuffer{readline}stopped
-		{cleartomark mark}
-		{
-		not
-			{pop exit}
-		if
-		CompareBuffer eq
-			{exit}
-		if
-		}ifelse
-	}loop
-	cleartomark
-	end
-	restore
-}bdf
-/getspotfunction
-{
-	AGMCORE_screen exch pop exch pop
-	dup type/dicttype eq{
-		dup/HalftoneType get 1 eq{
-			/SpotFunction get
-		}{
-			dup/HalftoneType get 2 eq{
-				/GraySpotFunction get
-			}{
-				pop
-				{
-					abs exch abs 2 copy add 1 gt{
-						1 sub dup mul exch 1 sub dup mul add 1 sub
-					}{
-						dup mul exch dup mul add 1 exch sub
-					}ifelse
-				}bind
-			}ifelse
-		}ifelse
-	}if
-}def
-/np
-{newpath}bdf
-/clp_npth
-{clip np}def
-/eoclp_npth
-{eoclip np}def
-/npth_clp
-{np clip}def
-/graphic_setup
-{
-	/AGMCORE_graphicsave save store
-	concat
-	0 setgray
-	0 setlinecap
-	0 setlinejoin
-	1 setlinewidth
-	[]0 setdash
-	10 setmiterlimit
-	np
-	false setoverprint
-	false setstrokeadjust
-	//Adobe_AGM_Core/spot_alias gx
-	/Adobe_AGM_Image where{
-		pop
-		Adobe_AGM_Image/spot_alias 2 copy known{
-			gx
-		}{
-			pop pop
-		}ifelse
-	}if
-	/sep_colorspace_dict null AGMCORE_gput
-	100 dict begin
-	/dictstackcount countdictstack def
-	/showpage{}def
-	mark
-}def
-/graphic_cleanup
-{
-	cleartomark
-	dictstackcount 1 countdictstack 1 sub{end}for
-	end
-	AGMCORE_graphicsave restore
-}def
-/compose_error_msg
-{
-	grestoreall initgraphics	
-	/Helvetica findfont 10 scalefont setfont
-	/AGMCORE_deltaY 100 def
-	/AGMCORE_deltaX 310 def
-	clippath pathbbox np pop pop 36 add exch 36 add exch moveto
-	0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto
-	0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath
-	0 AGMCORE_&setgray
-	gsave 1 AGMCORE_&setgray fill grestore 
-	1 setlinewidth gsave stroke grestore
-	currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto
-	/AGMCORE_deltaY 12 def
-	/AGMCORE_tmp 0 def
-	AGMCORE_err_strings exch get
-		{
-		dup 32 eq
-			{
-			pop
-			AGMCORE_str256 0 AGMCORE_tmp getinterval
-			stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt
-				{
-				currentpoint AGMCORE_deltaY sub exch pop
-				clippath pathbbox pop pop pop 44 add exch moveto
-				}if
-			AGMCORE_str256 0 AGMCORE_tmp getinterval show( )show
-			0 1 AGMCORE_str256 length 1 sub
-				{
-				AGMCORE_str256 exch 0 put
-				}for
-			/AGMCORE_tmp 0 def
-			}{
-				AGMCORE_str256 exch AGMCORE_tmp xpt
-				/AGMCORE_tmp AGMCORE_tmp 1 add def
-			}ifelse
-		}forall
-}bdf
-/AGMCORE_CMYKDeviceNColorspaces[
-	[/Separation/None/DeviceCMYK{0 0 0}]
-	[/Separation(Black)/DeviceCMYK{0 0 0 4 -1 roll}bind]
-	[/Separation(Yellow)/DeviceCMYK{0 0 3 -1 roll 0}bind]
-	[/DeviceN[(Yellow)(Black)]/DeviceCMYK{0 0 4 2 roll}bind]
-	[/Separation(Magenta)/DeviceCMYK{0 exch 0 0}bind]
-	[/DeviceN[(Magenta)(Black)]/DeviceCMYK{0 3 1 roll 0 exch}bind]
-	[/DeviceN[(Magenta)(Yellow)]/DeviceCMYK{0 3 1 roll 0}bind]
-	[/DeviceN[(Magenta)(Yellow)(Black)]/DeviceCMYK{0 4 1 roll}bind]
-	[/Separation(Cyan)/DeviceCMYK{0 0 0}]
-	[/DeviceN[(Cyan)(Black)]/DeviceCMYK{0 0 3 -1 roll}bind]
-	[/DeviceN[(Cyan)(Yellow)]/DeviceCMYK{0 exch 0}bind]
-	[/DeviceN[(Cyan)(Yellow)(Black)]/DeviceCMYK{0 3 1 roll}bind]
-	[/DeviceN[(Cyan)(Magenta)]/DeviceCMYK{0 0}]
-	[/DeviceN[(Cyan)(Magenta)(Black)]/DeviceCMYK{0 exch}bind]
-	[/DeviceN[(Cyan)(Magenta)(Yellow)]/DeviceCMYK{0}]
-	[/DeviceCMYK]
-]def
-/ds{
-	Adobe_AGM_Core begin
-	/currentdistillerparams where
-		{
-		pop currentdistillerparams/CoreDistVersion get 5000 lt
-			{<>setdistillerparams}if
-		}if	
-	/AGMCORE_ps_version xdf
-	/AGMCORE_ps_level xdf
-	errordict/AGM_handleerror known not{
-		errordict/AGM_handleerror errordict/handleerror get put
-		errordict/handleerror{
-			Adobe_AGM_Core begin
-			$error/newerror get AGMCORE_cur_err null ne and{
-				$error/newerror false put
-				AGMCORE_cur_err compose_error_msg
-			}if
-			$error/newerror true put
-			end
-			errordict/AGM_handleerror get exec
-			}bind put
-		}if
-	/AGMCORE_environ_ok 
-		ps_level AGMCORE_ps_level ge
-		ps_version AGMCORE_ps_version ge and 
-		AGMCORE_ps_level -1 eq or
-	def
-	AGMCORE_environ_ok not
-		{/AGMCORE_cur_err/AGMCORE_bad_environ def}if
-	/AGMCORE_&setgray systemdict/setgray get def
-	level2{
-		/AGMCORE_&setcolor systemdict/setcolor get def
-		/AGMCORE_&setcolorspace systemdict/setcolorspace get def
-	}if
-	/AGMCORE_currentbg currentblackgeneration def
-	/AGMCORE_currentucr currentundercolorremoval def
-	/AGMCORE_Default_flatness currentflat def
-	/AGMCORE_distilling
-		/product where{
-			pop systemdict/setdistillerparams known product(Adobe PostScript Parser)ne and
-		}{
-			false
-		}ifelse
-	def
-	/AGMCORE_GSTATE AGMCORE_key_known not{
-		/AGMCORE_GSTATE 21 dict def
-		/AGMCORE_tmpmatrix matrix def
-		/AGMCORE_gstack 32 array def
-		/AGMCORE_gstackptr 0 def
-		/AGMCORE_gstacksaveptr 0 def
-		/AGMCORE_gstackframekeys 14 def
-		/AGMCORE_&gsave/gsave ldf
-		/AGMCORE_&grestore/grestore ldf
-		/AGMCORE_&grestoreall/grestoreall ldf
-		/AGMCORE_&save/save ldf
-		/AGMCORE_&setoverprint/setoverprint ldf
-		/AGMCORE_gdictcopy{
-			begin
-			{def}forall
-			end
-		}def
-		/AGMCORE_gput{
-			AGMCORE_gstack AGMCORE_gstackptr get
-			3 1 roll
-			put
-		}def
-		/AGMCORE_gget{
-			AGMCORE_gstack AGMCORE_gstackptr get
-			exch
-			get
-		}def
-		/gsave{
-			AGMCORE_&gsave
-			AGMCORE_gstack AGMCORE_gstackptr get
-			AGMCORE_gstackptr 1 add
-			dup 32 ge{limitcheck}if
-			/AGMCORE_gstackptr exch store
-			AGMCORE_gstack AGMCORE_gstackptr get
-			AGMCORE_gdictcopy
-		}def
-		/grestore{
-			AGMCORE_&grestore
-			AGMCORE_gstackptr 1 sub
-			dup AGMCORE_gstacksaveptr lt{1 add}if
-			dup AGMCORE_gstack exch get dup/AGMCORE_currentoverprint known
-				{/AGMCORE_currentoverprint get setoverprint}{pop}ifelse
-			/AGMCORE_gstackptr exch store
-		}def
-		/grestoreall{
-			AGMCORE_&grestoreall
-			/AGMCORE_gstackptr AGMCORE_gstacksaveptr store 
-		}def
-		/save{
-			AGMCORE_&save
-			AGMCORE_gstack AGMCORE_gstackptr get
-			AGMCORE_gstackptr 1 add
-			dup 32 ge{limitcheck}if
-			/AGMCORE_gstackptr exch store
-			/AGMCORE_gstacksaveptr AGMCORE_gstackptr store
-			AGMCORE_gstack AGMCORE_gstackptr get
-			AGMCORE_gdictcopy
-		}def
-		/setoverprint{
-			dup/AGMCORE_currentoverprint exch AGMCORE_gput AGMCORE_&setoverprint
-		}def	
-		0 1 AGMCORE_gstack length 1 sub{
-				AGMCORE_gstack exch AGMCORE_gstackframekeys dict put
-		}for
-	}if
-	level3/AGMCORE_&sysshfill AGMCORE_key_known not and
-	{
-		/AGMCORE_&sysshfill systemdict/shfill get def
-		/AGMCORE_&sysmakepattern systemdict/makepattern get def
-		/AGMCORE_&usrmakepattern/makepattern load def
-	}if
-	/currentcmykcolor[0 0 0 0]AGMCORE_gput
-	/currentstrokeadjust false AGMCORE_gput
-	/currentcolorspace[/DeviceGray]AGMCORE_gput
-	/sep_tint 0 AGMCORE_gput
-	/devicen_tints[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]AGMCORE_gput
-	/sep_colorspace_dict null AGMCORE_gput
-	/devicen_colorspace_dict null AGMCORE_gput
-	/indexed_colorspace_dict null AGMCORE_gput
-	/currentcolor_intent()AGMCORE_gput
-	/customcolor_tint 1 AGMCORE_gput
-	/absolute_colorimetric_crd null AGMCORE_gput
-	/relative_colorimetric_crd null AGMCORE_gput
-	/saturation_crd null AGMCORE_gput
-	/perceptual_crd null AGMCORE_gput
-	currentcolortransfer cvlit/AGMCore_gray_xfer xdf cvlit/AGMCore_b_xfer xdf
-		 cvlit/AGMCore_g_xfer xdf cvlit/AGMCore_r_xfer xdf
-	<<
-	/MaxPatternItem currentsystemparams/MaxPatternCache get
-	>>
-	setuserparams
-	end
-}def
-/ps
-{
-	/setcmykcolor where{
-		pop
-		Adobe_AGM_Core/AGMCORE_&setcmykcolor/setcmykcolor load put
-	}if
-	Adobe_AGM_Core begin
-	/setcmykcolor
-	{
-		4 copy AGMCORE_cmykbuf astore/currentcmykcolor exch AGMCORE_gput
-		1 sub 4 1 roll
-		3{
-			3 index add neg dup 0 lt{
-				pop 0
-			}if
-			3 1 roll
-		}repeat
-		setrgbcolor pop
-	}ndf
-	/currentcmykcolor
-	{
-		/currentcmykcolor AGMCORE_gget aload pop
-	}ndf
-	/setoverprint
-	{pop}ndf
-	/currentoverprint
-	{false}ndf
-	/AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def
-	/AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def
-	/AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def
-	/AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def
-	/AGMCORE_plate_ndx 
-		AGMCORE_cyan_plate{
-			0
-		}{
-			AGMCORE_magenta_plate{
-				1
-			}{
-				AGMCORE_yellow_plate{
-					2
-				}{
-					AGMCORE_black_plate{
-						3
-					}{
-						4
-					}ifelse
-				}ifelse
-			}ifelse
-		}ifelse
-		def
-	/AGMCORE_have_reported_unsupported_color_space false def
-	/AGMCORE_report_unsupported_color_space
-	{
-		AGMCORE_have_reported_unsupported_color_space false eq
-		{
-			(Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.)==
-			Adobe_AGM_Core/AGMCORE_have_reported_unsupported_color_space true ddf
-		}if
-	}def
-	/AGMCORE_composite_job
-		AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def
-	/AGMCORE_in_rip_sep
-		/AGMCORE_in_rip_sep where{
-			pop AGMCORE_in_rip_sep
-		}{
-			AGMCORE_distilling 
-			{
-				false
-			}{
-				userdict/Adobe_AGM_OnHost_Seps known{
-					false
-				}{
-					level2{
-						currentpagedevice/Separations 2 copy known{
-							get
-						}{
-							pop pop false
-						}ifelse
-					}{
-						false
-					}ifelse
-				}ifelse
-			}ifelse
-		}ifelse
-	def
-	/AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def
-	/AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def
-	/AGM_preserve_spots 
-		/AGM_preserve_spots where{
-			pop AGM_preserve_spots
-		}{
-			AGMCORE_distilling AGMCORE_producing_seps or
-		}ifelse
-	def
-	/AGM_is_distiller_preserving_spotimages
-	{
-		currentdistillerparams/PreserveOverprintSettings known
-		{
-			currentdistillerparams/PreserveOverprintSettings get
-				{
-					currentdistillerparams/ColorConversionStrategy known
-					{
-						currentdistillerparams/ColorConversionStrategy get
-						/sRGB ne
-					}{
-						true
-					}ifelse
-				}{
-					false
-				}ifelse
-		}{
-			false
-		}ifelse
-	}def
-	/convert_spot_to_process where{pop}{
-		/convert_spot_to_process
-		{
-			//Adobe_AGM_Core begin
-			dup map_alias{
-				/Name get exch pop
-			}if
-			dup dup(None)eq exch(All)eq or
-				{
-				pop false
-				}{
-				AGMCORE_host_sep
-				{
-					gsave
-					1 0 0 0 setcmykcolor currentgray 1 exch sub
-					0 1 0 0 setcmykcolor currentgray 1 exch sub
-					0 0 1 0 setcmykcolor currentgray 1 exch sub
-					0 0 0 1 setcmykcolor currentgray 1 exch sub
-					add add add 0 eq
-					{
-						pop false
-					}{
-						false setoverprint
-						current_spot_alias false set_spot_alias
-						1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor
-						set_spot_alias
-						currentgray 1 ne
-					}ifelse
-					grestore
-				}{
-					AGMCORE_distilling
-					{
-						pop AGM_is_distiller_preserving_spotimages not
-					}{
-						//Adobe_AGM_Core/AGMCORE_name xddf
-						false
-						//Adobe_AGM_Core/AGMCORE_pattern_paint_type get 0 eq
-						AGMUTIL_cpd/OverrideSeparations known and
-						{
-							AGMUTIL_cpd/OverrideSeparations get
-							{
-								/HqnSpots/ProcSet resourcestatus
-								{
-									pop pop pop true
-								}if
-							}if
-						}if					
-						{
-							AGMCORE_name/HqnSpots/ProcSet findresource/TestSpot gx not
-						}{
-							gsave
-							[/Separation AGMCORE_name/DeviceGray{}]AGMCORE_&setcolorspace
-							false
-							AGMUTIL_cpd/SeparationColorNames 2 copy known
-							{
-								get
-								{AGMCORE_name eq or}forall
-								not
-							}{
-								pop pop pop true
-							}ifelse
-							grestore
-						}ifelse
-					}ifelse
-				}ifelse
-			}ifelse
-			end
-		}def
-	}ifelse
-	/convert_to_process where{pop}{
-		/convert_to_process
-		{
-			dup length 0 eq
-				{
-				pop false
-				}{
-				AGMCORE_host_sep
-				{
-				dup true exch
-					{
-					dup(Cyan)eq exch
-					dup(Magenta)eq 3 -1 roll or exch
-					dup(Yellow)eq 3 -1 roll or exch
-					dup(Black)eq 3 -1 roll or
-						{pop}
-						{convert_spot_to_process and}ifelse
-					}
-				forall
-					{
-					true exch
-						{
-						dup(Cyan)eq exch
-						dup(Magenta)eq 3 -1 roll or exch
-						dup(Yellow)eq 3 -1 roll or exch
-						(Black)eq or and
-						}forall
-						not
-					}{pop false}ifelse
-				}{
-				false exch
-					{
-					/PhotoshopDuotoneList where{pop false}{true}ifelse
-						{
-						dup(Cyan)eq exch
-						dup(Magenta)eq 3 -1 roll or exch
-						dup(Yellow)eq 3 -1 roll or exch
-						dup(Black)eq 3 -1 roll or
-						{pop}
-						{convert_spot_to_process or}ifelse
-						}
-						{
-						convert_spot_to_process or
-						}
-					ifelse
-					}
-				forall
-				}ifelse
-			}ifelse
-		}def
-	}ifelse	
-	/AGMCORE_avoid_L2_sep_space 
-		version cvr 2012 lt 
-		level2 and 
-		AGMCORE_producing_seps not and
-	def
-	/AGMCORE_is_cmyk_sep
-		AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or
-	def
-	/AGM_avoid_0_cmyk where{
-		pop AGM_avoid_0_cmyk
-	}{
-		AGM_preserve_spots 
-		userdict/Adobe_AGM_OnHost_Seps known 
-		userdict/Adobe_AGM_InRip_Seps known or
-		not and
-	}ifelse
-	{
-		/setcmykcolor[
-			{
-				4 copy add add add 0 eq currentoverprint and{
-					pop 0.0005
-				}if
-			}/exec cvx
-			/AGMCORE_&setcmykcolor load dup type/operatortype ne{
-				/exec cvx
-			}if
-		]cvx def
-	}if
-	/AGMCORE_IsSeparationAProcessColor
-		{
-		dup(Cyan)eq exch dup(Magenta)eq exch dup(Yellow)eq exch(Black)eq or or or
-		}def
-	AGMCORE_host_sep{
-		/setcolortransfer
-		{
-			AGMCORE_cyan_plate{
-				pop pop pop
-			}{
-			 	AGMCORE_magenta_plate{
-			 		4 3 roll pop pop pop
-			 	}{
-			 		AGMCORE_yellow_plate{
-			 			4 2 roll pop pop pop
-			 		}{
-			 			4 1 roll pop pop pop
-			 		}ifelse
-			 	}ifelse
-			}ifelse
-			settransfer 
-		}	
-		def
-		/AGMCORE_get_ink_data
-			AGMCORE_cyan_plate{
-				{pop pop pop}
-			}{
-			 	AGMCORE_magenta_plate{
-			 		{4 3 roll pop pop pop}
-			 	}{
-			 		AGMCORE_yellow_plate{
-			 			{4 2 roll pop pop pop}
-			 		}{
-			 			{4 1 roll pop pop pop}
-			 		}ifelse
-			 	}ifelse
-			}ifelse
-		def
-		/AGMCORE_RemoveProcessColorNames
-			{
-			1 dict begin
-			/filtername
-				{
-				dup/Cyan eq 1 index(Cyan)eq or
-					{pop(_cyan_)}if
-				dup/Magenta eq 1 index(Magenta)eq or
-					{pop(_magenta_)}if
-				dup/Yellow eq 1 index(Yellow)eq or
-					{pop(_yellow_)}if
-				dup/Black eq 1 index(Black)eq or
-					{pop(_black_)}if
-				}def
-			dup type/arraytype eq
-				{[exch{filtername}forall]}
-				{filtername}ifelse
-			end
-			}def
-		level3{
-			/AGMCORE_IsCurrentColor
-				{
-				dup AGMCORE_IsSeparationAProcessColor
-					{
-					AGMCORE_plate_ndx 0 eq
-						{dup(Cyan)eq exch/Cyan eq or}if
-					AGMCORE_plate_ndx 1 eq
-						{dup(Magenta)eq exch/Magenta eq or}if
-					AGMCORE_plate_ndx 2 eq
-						{dup(Yellow)eq exch/Yellow eq or}if
-					AGMCORE_plate_ndx 3 eq
-						{dup(Black)eq exch/Black eq or}if
-					AGMCORE_plate_ndx 4 eq
-						{pop false}if
-					}{
-					gsave
-					false setoverprint
-					current_spot_alias false set_spot_alias
-					1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor
-					set_spot_alias
-					currentgray 1 ne
-					grestore
-					}ifelse
-				}def
-			/AGMCORE_filter_functiondatasource
-				{	
-				5 dict begin
-				/data_in xdf
-				data_in type/stringtype eq
-					{
-					/ncomp xdf
-					/comp xdf
-					/string_out data_in length ncomp idiv string def
-					0 ncomp data_in length 1 sub
-						{
-						string_out exch dup ncomp idiv exch data_in exch ncomp getinterval comp get 255 exch sub put
-						}for
-					string_out
-					}{
-					string/string_in xdf
-					/string_out 1 string def
-					/component xdf
-					[
-					data_in string_in/readstring cvx
-						[component/get cvx 255/exch cvx/sub cvx string_out/exch cvx 0/exch cvx/put cvx string_out]cvx
-						[/pop cvx()]cvx/ifelse cvx
-					]cvx/ReusableStreamDecode filter
-				}ifelse
-				end
-				}def
-			/AGMCORE_separateShadingFunction
-				{
-				2 dict begin
-				/paint? xdf
-				/channel xdf
-				dup type/dicttype eq
-					{
-					begin
-					FunctionType 0 eq
-						{
-						/DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def
-						currentdict/Decode known
-							{/Decode Decode channel 2 mul 2 getinterval def}if
-						paint? not
-							{/Decode[1 1]def}if
-						}if
-					FunctionType 2 eq
-						{
-						paint?
-							{
-							/C0[C0 channel get 1 exch sub]def
-							/C1[C1 channel get 1 exch sub]def
-							}{
-							/C0[1]def
-							/C1[1]def
-							}ifelse			
-						}if
-					FunctionType 3 eq
-						{
-						/Functions[Functions{channel paint? AGMCORE_separateShadingFunction}forall]def			
-						}if
-					currentdict/Range known
-						{/Range[0 1]def}if
-					currentdict
-					end}{
-					channel get 0 paint? AGMCORE_separateShadingFunction
-					}ifelse
-				end
-				}def
-			/AGMCORE_separateShading
-				{
-				3 -1 roll begin
-				currentdict/Function known
-					{
-					currentdict/Background known
-						{[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if
-					Function 3 1 roll AGMCORE_separateShadingFunction/Function xdf
-					/ColorSpace[/DeviceGray]def
-					}{
-					ColorSpace dup type/arraytype eq{0 get}if/DeviceCMYK eq
-						{
-						/ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def
-						}{
-						ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put
-						}ifelse
-					ColorSpace 0 get/Separation eq
-						{
-							{
-								[1/exch cvx/sub cvx]cvx
-							}{
-								[/pop cvx 1]cvx
-							}ifelse
-							ColorSpace 3 3 -1 roll put
-							pop
-						}{
-							{
-								[exch ColorSpace 1 get length 1 sub exch sub/index cvx 1/exch cvx/sub cvx ColorSpace 1 get length 1 add 1/roll cvx ColorSpace 1 get length{/pop cvx}repeat]cvx
-							}{
-								pop[ColorSpace 1 get length{/pop cvx}repeat cvx 1]cvx
-							}ifelse
-							ColorSpace 3 3 -1 roll bind put
-						}ifelse
-					ColorSpace 2/DeviceGray put																		
-					}ifelse
-				end
-				}def
-			/AGMCORE_separateShadingDict
-				{
-				dup/ColorSpace get
-				dup type/arraytype ne
-					{[exch]}if
-				dup 0 get/DeviceCMYK eq
-					{
-					exch begin 
-					currentdict
-					AGMCORE_cyan_plate
-						{0 true}if
-					AGMCORE_magenta_plate
-						{1 true}if
-					AGMCORE_yellow_plate
-						{2 true}if
-					AGMCORE_black_plate
-						{3 true}if
-					AGMCORE_plate_ndx 4 eq
-						{0 false}if		
-					dup not currentoverprint and
-						{/AGMCORE_ignoreshade true def}if
-					AGMCORE_separateShading
-					currentdict
-					end exch
-					}if
-				dup 0 get/Separation eq
-					{
-					exch begin
-					ColorSpace 1 get dup/None ne exch/All ne and
-						{
-						ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and
-							{
-							ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq 
-								{
-								/ColorSpace
-									[
-									/Separation
-									ColorSpace 1 get
-									/DeviceGray
-										[
-										ColorSpace 3 get/exec cvx
-										4 AGMCORE_plate_ndx sub -1/roll cvx
-										4 1/roll cvx
-										3[/pop cvx]cvx/repeat cvx
-										1/exch cvx/sub cvx
-										]cvx									
-									]def
-								}{
-								AGMCORE_report_unsupported_color_space
-								AGMCORE_black_plate not
-									{
-									currentdict 0 false AGMCORE_separateShading
-									}if
-								}ifelse
-							}{
-							currentdict ColorSpace 1 get AGMCORE_IsCurrentColor
-							0 exch 
-							dup not currentoverprint and
-								{/AGMCORE_ignoreshade true def}if
-							AGMCORE_separateShading
-							}ifelse	
-						}if			
-					currentdict
-					end exch
-					}if
-				dup 0 get/DeviceN eq
-					{
-					exch begin
-					ColorSpace 1 get convert_to_process
-						{
-						ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq 
-							{
-							/ColorSpace
-								[
-								/DeviceN
-								ColorSpace 1 get
-								/DeviceGray
-									[
-									ColorSpace 3 get/exec cvx
-									4 AGMCORE_plate_ndx sub -1/roll cvx
-									4 1/roll cvx
-									3[/pop cvx]cvx/repeat cvx
-									1/exch cvx/sub cvx
-									]cvx									
-								]def
-							}{
-							AGMCORE_report_unsupported_color_space
-							AGMCORE_black_plate not
-								{
-								currentdict 0 false AGMCORE_separateShading
-								/ColorSpace[/DeviceGray]def
-								}if
-							}ifelse
-						}{
-						currentdict
-						false -1 ColorSpace 1 get
-							{
-							AGMCORE_IsCurrentColor
-								{
-								1 add
-								exch pop true exch exit
-								}if
-							1 add
-							}forall
-						exch 
-						dup not currentoverprint and
-							{/AGMCORE_ignoreshade true def}if
-						AGMCORE_separateShading
-						}ifelse
-					currentdict
-					end exch
-					}if
-				dup 0 get dup/DeviceCMYK eq exch dup/Separation eq exch/DeviceN eq or or not
-					{
-					exch begin
-					ColorSpace dup type/arraytype eq
-						{0 get}if
-					/DeviceGray ne
-						{
-						AGMCORE_report_unsupported_color_space
-						AGMCORE_black_plate not
-							{
-							ColorSpace 0 get/CIEBasedA eq
-								{
-								/ColorSpace[/Separation/_ciebaseda_/DeviceGray{}]def
-								}if
-							ColorSpace 0 get dup/CIEBasedABC eq exch dup/CIEBasedDEF eq exch/DeviceRGB eq or or
-								{
-								/ColorSpace[/DeviceN[/_red_/_green_/_blue_]/DeviceRGB{}]def
-								}if
-							ColorSpace 0 get/CIEBasedDEFG eq
-								{
-								/ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def
-								}if
-							currentdict 0 false AGMCORE_separateShading
-							}if
-						}if
-					currentdict
-					end exch
-					}if
-				pop
-				dup/AGMCORE_ignoreshade known
-					{
-					begin
-					/ColorSpace[/Separation(None)/DeviceGray{}]def
-					currentdict end
-					}if
-				}def
-			/shfill
-				{
-				AGMCORE_separateShadingDict 
-				dup/AGMCORE_ignoreshade known
-					{pop}
-					{AGMCORE_&sysshfill}ifelse
-				}def
-			/makepattern
-				{
-				exch
-				dup/PatternType get 2 eq
-					{
-					clonedict
-					begin
-					/Shading Shading AGMCORE_separateShadingDict def
-					Shading/AGMCORE_ignoreshade known
-					currentdict end exch
-					{pop<>}if
-					exch AGMCORE_&sysmakepattern
-					}{
-					exch AGMCORE_&usrmakepattern
-					}ifelse
-				}def
-		}if
-	}if
-	AGMCORE_in_rip_sep{
-		/setcustomcolor
-		{
-			exch aload pop
-			dup 7 1 roll inRip_spot_has_ink not	{
-				4{4 index mul 4 1 roll}
-				repeat
-				/DeviceCMYK setcolorspace
-				6 -2 roll pop pop
-			}{
-				//Adobe_AGM_Core begin
-					/AGMCORE_k xdf/AGMCORE_y xdf/AGMCORE_m xdf/AGMCORE_c xdf
-				end
-				[/Separation 4 -1 roll/DeviceCMYK
-				{dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul}
-				]
-				setcolorspace
-			}ifelse
-			setcolor
-		}ndf
-		/setseparationgray
-		{
-			[/Separation(All)/DeviceGray{}]setcolorspace_opt
-			1 exch sub setcolor
-		}ndf
-	}{
-		/setseparationgray
-		{
-			AGMCORE_&setgray
-		}ndf
-	}ifelse
-	/findcmykcustomcolor
-	{
-		5 makereadonlyarray
-	}ndf
-	/setcustomcolor
-	{
-		exch aload pop pop
-		4{4 index mul 4 1 roll}repeat
-		setcmykcolor pop
-	}ndf
-	/has_color
-		/colorimage where{
-			AGMCORE_producing_seps{
-				pop true
-			}{
-				systemdict eq
-			}ifelse
-		}{
-			false
-		}ifelse
-	def
-	/map_index
-	{
-		1 index mul exch getinterval{255 div}forall
-	}bdf
-	/map_indexed_devn
-	{
-		Lookup Names length 3 -1 roll cvi map_index
-	}bdf
-	/n_color_components
-	{
-		base_colorspace_type
-		dup/DeviceGray eq{
-			pop 1
-		}{
-			/DeviceCMYK eq{
-				4
-			}{
-				3
-			}ifelse
-		}ifelse
-	}bdf
-	level2{
-		/mo/moveto ldf
-		/li/lineto ldf
-		/cv/curveto ldf
-		/knockout_unitsq
-		{
-			1 setgray
-			0 0 1 1 rectfill
-		}def
-		level2/setcolorspace AGMCORE_key_known not and{
-			/AGMCORE_&&&setcolorspace/setcolorspace ldf
-			/AGMCORE_ReplaceMappedColor
-			{
-				dup type dup/arraytype eq exch/packedarraytype eq or
-				{
-					/AGMCORE_SpotAliasAry2 where{
-						begin
-						dup 0 get dup/Separation eq
-						{
-							pop
-							dup length array copy
-							dup dup 1 get
-							current_spot_alias
-							{
-								dup map_alias
-								{
-									false set_spot_alias
-									dup 1 exch setsepcolorspace
-									true set_spot_alias
-									begin
-									/sep_colorspace_dict currentdict AGMCORE_gput
-									pop pop	pop
-									[
-										/Separation Name 
-										CSA map_csa
-										MappedCSA 
-										/sep_colorspace_proc load
-									]
-									dup Name
-									end
-								}if
-							}if
-							map_reserved_ink_name 1 xpt
-						}{
-							/DeviceN eq 
-							{
-								dup length array copy
-								dup dup 1 get[
-									exch{
-										current_spot_alias{
-											dup map_alias{
-												/Name get exch pop
-											}if
-										}if
-										map_reserved_ink_name
-									}forall 
-								]1 xpt
-							}if
-						}ifelse
-						end
-					}if
-				}if
-			}def
-			/setcolorspace
-			{
-				dup type dup/arraytype eq exch/packedarraytype eq or
-				{
-					dup 0 get/Indexed eq
-					{
-						AGMCORE_distilling
-						{
-							/PhotoshopDuotoneList where
-							{
-								pop false
-							}{
-								true
-							}ifelse
-						}{
-							true
-						}ifelse
-						{
-							aload pop 3 -1 roll
-							AGMCORE_ReplaceMappedColor
-							3 1 roll 4 array astore
-						}if
-					}{
-						AGMCORE_ReplaceMappedColor
-					}ifelse
-				}if
-				DeviceN_PS2_inRip_seps{AGMCORE_&&&setcolorspace}if
-			}def
-		}if	
-	}{
-		/adj
-		{
-			currentstrokeadjust{
-				transform
-				0.25 sub round 0.25 add exch
-				0.25 sub round 0.25 add exch
-				itransform
-			}if
-		}def
-		/mo{
-			adj moveto
-		}def
-		/li{
-			adj lineto
-		}def
-		/cv{
-			6 2 roll adj
-			6 2 roll adj
-			6 2 roll adj curveto
-		}def
-		/knockout_unitsq
-		{
-			1 setgray
-			8 8 1[8 0 0 8 0 0]{}image
-		}def
-		/currentstrokeadjust{
-			/currentstrokeadjust AGMCORE_gget
-		}def
-		/setstrokeadjust{
-			/currentstrokeadjust exch AGMCORE_gput
-		}def
-		/setcolorspace
-		{
-			/currentcolorspace exch AGMCORE_gput
-		}def
-		/currentcolorspace
-		{
-			/currentcolorspace AGMCORE_gget
-		}def
-		/setcolor_devicecolor
-		{
-			base_colorspace_type
-			dup/DeviceGray eq{
-				pop setgray
-			}{
-				/DeviceCMYK eq{
-					setcmykcolor
-				}{
-					setrgbcolor
-				}ifelse
-			}ifelse
-		}def
-		/setcolor
-		{
-			currentcolorspace 0 get
-			dup/DeviceGray ne{
-				dup/DeviceCMYK ne{
-					dup/DeviceRGB ne{
-						dup/Separation eq{
-							pop
-							currentcolorspace 3 gx
-							currentcolorspace 2 get
-						}{
-							dup/Indexed eq{
-								pop
-								currentcolorspace 3 get dup type/stringtype eq{
-									currentcolorspace 1 get n_color_components
-									3 -1 roll map_index
-								}{
-									exec
-								}ifelse
-								currentcolorspace 1 get
-							}{
-								/AGMCORE_cur_err/AGMCORE_invalid_color_space def
-								AGMCORE_invalid_color_space
-							}ifelse
-						}ifelse
-					}if
-				}if
-			}if
-			setcolor_devicecolor
-		}def
-	}ifelse
-	/sop/setoverprint ldf
-	/lw/setlinewidth ldf
-	/lc/setlinecap ldf
-	/lj/setlinejoin ldf
-	/ml/setmiterlimit ldf
-	/dsh/setdash ldf
-	/sadj/setstrokeadjust ldf
-	/gry/setgray ldf
-	/rgb/setrgbcolor ldf
-	/cmyk[
-		/currentcolorspace[/DeviceCMYK]/AGMCORE_gput cvx
-		/setcmykcolor load dup type/operatortype ne{/exec cvx}if
-	]cvx bdf
-	level3 AGMCORE_host_sep not and{
-		/nzopmsc{
-			6 dict begin
-			/kk exch def
-			/yy exch def
-			/mm exch def
-			/cc exch def
-			/sum 0 def
-			cc 0 ne{/sum sum 2#1000 or def cc}if
-			mm 0 ne{/sum sum 2#0100 or def mm}if
-			yy 0 ne{/sum sum 2#0010 or def yy}if
-			kk 0 ne{/sum sum 2#0001 or def kk}if
-			AGMCORE_CMYKDeviceNColorspaces sum get setcolorspace
-			sum 0 eq{0}if
-			end
-			setcolor
-		}bdf
-	}{
-		/nzopmsc/cmyk ldf
-	}ifelse
-	/sep/setsepcolor ldf
-	/devn/setdevicencolor ldf
-	/idx/setindexedcolor ldf
-	/colr/setcolor ldf
-	/csacrd/set_csa_crd ldf
-	/sepcs/setsepcolorspace ldf
-	/devncs/setdevicencolorspace ldf
-	/idxcs/setindexedcolorspace ldf
-	/cp/closepath ldf
-	/clp/clp_npth ldf
-	/eclp/eoclp_npth ldf
-	/f/fill ldf
-	/ef/eofill ldf
-	/@/stroke ldf
-	/nclp/npth_clp ldf
-	/gset/graphic_setup ldf
-	/gcln/graphic_cleanup ldf
-	/ct/concat ldf
-	/cf/currentfile ldf
-	/fl/filter ldf
-	/rs/readstring ldf
-	/AGMCORE_def_ht currenthalftone def
-	/clonedict Adobe_AGM_Utils begin/clonedict load end def
-	/clonearray Adobe_AGM_Utils begin/clonearray load end def
-	currentdict{
-		dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{
-			bind
-		}if
-		def
-	}forall
-	/getrampcolor
-	{
-		/indx exch def
-		0 1 NumComp 1 sub
-		{
-			dup
-			Samples exch get
-			dup type/stringtype eq{indx get}if
-			exch
-			Scaling exch get aload pop
-			3 1 roll
-			mul add
-		}for
-		ColorSpaceFamily/Separation eq 
-		{sep}
-		{
-			ColorSpaceFamily/DeviceN eq
-			{devn}{setcolor}ifelse
-		}ifelse
-	}bdf
-	/sssetbackground{
-		aload pop 
-		ColorSpaceFamily/Separation eq 
-		{sep}
-		{
-			ColorSpaceFamily/DeviceN eq
-			{devn}{setcolor}ifelse
-		}ifelse	
-	}bdf
-	/RadialShade
-	{
-		40 dict begin
-		/ColorSpaceFamily xdf
-		/background xdf
-		/ext1 xdf
-		/ext0 xdf
-		/BBox xdf
-		/r2 xdf
-		/c2y xdf
-		/c2x xdf
-		/r1 xdf
-		/c1y xdf
-		/c1x xdf
-		/rampdict xdf
-		/setinkoverprint where{pop/setinkoverprint{pop}def}if
-		gsave
-		BBox length 0 gt
-		{
-			np
-			BBox 0 get BBox 1 get moveto
-			BBox 2 get BBox 0 get sub 0 rlineto
-			0 BBox 3 get BBox 1 get sub rlineto
-			BBox 2 get BBox 0 get sub neg 0 rlineto
-			closepath
-			clip
-			np
-		}if
-		c1x c2x eq
-		{
-			c1y c2y lt{/theta 90 def}{/theta 270 def}ifelse
-		}{
-			/slope c2y c1y sub c2x c1x sub div def
-			/theta slope 1 atan def
-			c2x c1x lt c2y c1y ge and{/theta theta 180 sub def}if
-			c2x c1x lt c2y c1y lt and{/theta theta 180 add def}if
-		}ifelse
-		gsave
-		clippath
-		c1x c1y translate
-		theta rotate
-		-90 rotate
-		{pathbbox}stopped
-		{0 0 0 0}if
-		/yMax xdf
-		/xMax xdf
-		/yMin xdf
-		/xMin xdf
-		grestore
-		xMax xMin eq yMax yMin eq or
-		{
-			grestore
-			end
-		}{
-			/max{2 copy gt{pop}{exch pop}ifelse}bdf
-			/min{2 copy lt{pop}{exch pop}ifelse}bdf
-			rampdict begin
-			40 dict begin
-			background length 0 gt{background sssetbackground gsave clippath fill grestore}if
-			gsave
-			c1x c1y translate
-			theta rotate
-			-90 rotate
-			/c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def
-			/c1y 0 def
-			/c1x 0 def
-			/c2x 0 def
-			ext0
-			{
-				0 getrampcolor
-				c2y r2 add r1 sub 0.0001 lt
-				{
-					c1x c1y r1 360 0 arcn
-					pathbbox
-					/aymax exch def
-					/axmax exch def
-					/aymin exch def
-					/axmin exch def
-					/bxMin xMin axmin min def
-					/byMin yMin aymin min def
-					/bxMax xMax axmax max def
-					/byMax yMax aymax max def
-					bxMin byMin moveto
-					bxMax byMin lineto
-					bxMax byMax lineto
-					bxMin byMax lineto
-					bxMin byMin lineto
-					eofill
-				}{
-					c2y r1 add r2 le
-					{
-						c1x c1y r1 0 360 arc
-						fill
-					}
-					{
-						c2x c2y r2 0 360 arc fill
-						r1 r2 eq
-						{
-							/p1x r1 neg def
-							/p1y c1y def
-							/p2x r1 def
-							/p2y c1y def
-							p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto
-							fill
-						}{
-							/AA r2 r1 sub c2y div def
-							AA -1 eq
-							{/theta 89.99 def}
-							{/theta AA 1 AA dup mul sub sqrt div 1 atan def}
-							ifelse
-							/SS1 90 theta add dup sin exch cos div def
-							/p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def
-							/p1y p1x SS1 div neg def
-							/SS2 90 theta sub dup sin exch cos div def
-							/p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def
-							/p2y p2x SS2 div neg def
-							r1 r2 gt
-							{
-								/L1maxX p1x yMin p1y sub SS1 div add def
-								/L2maxX p2x yMin p2y sub SS2 div add def
-							}{
-								/L1maxX 0 def
-								/L2maxX 0 def
-							}ifelse
-							p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto
-							L1maxX L1maxX p1x sub SS1 mul p1y add lineto
-							fill
-						}ifelse
-					}ifelse
-				}ifelse
-			}if
-		c1x c2x sub dup mul
-		c1y c2y sub dup mul
-		add 0.5 exp
-		0 dtransform
-		dup mul exch dup mul add 0.5 exp 72 div
-		0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
-		72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
-		1 index 1 index lt{exch}if pop
-		/hires xdf
-		hires mul
-		/numpix xdf
-		/numsteps NumSamples def
-		/rampIndxInc 1 def
-		/subsampling false def
-		numpix 0 ne
-		{
-			NumSamples numpix div 0.5 gt
-			{
-				/numsteps numpix 2 div round cvi dup 1 le{pop 2}if def
-				/rampIndxInc NumSamples 1 sub numsteps div def
-				/subsampling true def
-			}if
-		}if
-		/xInc c2x c1x sub numsteps div def
-		/yInc c2y c1y sub numsteps div def
-		/rInc r2 r1 sub numsteps div def
-		/cx c1x def
-		/cy c1y def
-		/radius r1 def
-		np
-		xInc 0 eq yInc 0 eq rInc 0 eq and and
-		{
-			0 getrampcolor
-			cx cy radius 0 360 arc
-			stroke
-			NumSamples 1 sub getrampcolor
-			cx cy radius 72 hires div add 0 360 arc
-			0 setlinewidth
-			stroke
-		}{
-			0
-			numsteps
-			{
-				dup
-				subsampling{round cvi}if
-				getrampcolor
-				cx cy radius 0 360 arc
-				/cx cx xInc add def
-				/cy cy yInc add def
-				/radius radius rInc add def
-				cx cy radius 360 0 arcn
-				eofill
-				rampIndxInc add
-			}repeat
-			pop
-		}ifelse
-		ext1
-		{
-			c2y r2 add r1 lt
-			{
-				c2x c2y r2 0 360 arc
-				fill
-			}{
-				c2y r1 add r2 sub 0.0001 le
-				{
-					c2x c2y r2 360 0 arcn
-					pathbbox
-					/aymax exch def
-					/axmax exch def
-					/aymin exch def
-					/axmin exch def
-					/bxMin xMin axmin min def
-					/byMin yMin aymin min def
-					/bxMax xMax axmax max def
-					/byMax yMax aymax max def
-					bxMin byMin moveto
-					bxMax byMin lineto
-					bxMax byMax lineto
-					bxMin byMax lineto
-					bxMin byMin lineto
-					eofill
-				}{
-					c2x c2y r2 0 360 arc fill
-					r1 r2 eq
-					{
-						/p1x r2 neg def
-						/p1y c2y def
-						/p2x r2 def
-						/p2y c2y def
-						p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto
-						fill
-					}{
-						/AA r2 r1 sub c2y div def
-						AA -1 eq
-						{/theta 89.99 def}
-						{/theta AA 1 AA dup mul sub sqrt div 1 atan def}
-						ifelse
-						/SS1 90 theta add dup sin exch cos div def
-						/p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def
-						/p1y c2y p1x SS1 div sub def
-						/SS2 90 theta sub dup sin exch cos div def
-						/p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def
-						/p2y c2y p2x SS2 div sub def
-						r1 r2 lt
-						{
-							/L1maxX p1x yMax p1y sub SS1 div add def
-							/L2maxX p2x yMax p2y sub SS2 div add def
-						}{
-							/L1maxX 0 def
-							/L2maxX 0 def
-						}ifelse
-						p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto
-						L1maxX L1maxX p1x sub SS1 mul p1y add lineto
-						fill
-					}ifelse
-				}ifelse
-			}ifelse
-		}if
-		grestore
-		grestore
-		end
-		end
-		end
-		}ifelse
-	}bdf
-	/GenStrips
-	{
-		40 dict begin
-		/ColorSpaceFamily xdf
-		/background xdf
-		/ext1 xdf
-		/ext0 xdf
-		/BBox xdf
-		/y2 xdf
-		/x2 xdf
-		/y1 xdf
-		/x1 xdf
-		/rampdict xdf
-		/setinkoverprint where{pop/setinkoverprint{pop}def}if
-		gsave
-		BBox length 0 gt
-		{
-			np
-			BBox 0 get BBox 1 get moveto
-			BBox 2 get BBox 0 get sub 0 rlineto
-			0 BBox 3 get BBox 1 get sub rlineto
-			BBox 2 get BBox 0 get sub neg 0 rlineto
-			closepath
-			clip
-			np
-		}if
-		x1 x2 eq
-		{
-			y1 y2 lt{/theta 90 def}{/theta 270 def}ifelse
-		}{
-			/slope y2 y1 sub x2 x1 sub div def
-			/theta slope 1 atan def
-			x2 x1 lt y2 y1 ge and{/theta theta 180 sub def}if
-			x2 x1 lt y2 y1 lt and{/theta theta 180 add def}if
-		}
-		ifelse
-		gsave
-		clippath
-		x1 y1 translate
-		theta rotate
-		{pathbbox}stopped
-		{0 0 0 0}if
-		/yMax exch def
-		/xMax exch def
-		/yMin exch def
-		/xMin exch def
-		grestore
-		xMax xMin eq yMax yMin eq or
-		{
-			grestore
-			end
-		}{
-			rampdict begin
-			20 dict begin
-			background length 0 gt{background sssetbackground gsave clippath fill grestore}if
-			gsave
-			x1 y1 translate
-			theta rotate
-			/xStart 0 def
-			/xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def
-			/ySpan yMax yMin sub def
-			/numsteps NumSamples def
-			/rampIndxInc 1 def
-			/subsampling false def
-			xStart 0 transform
-			xEnd 0 transform
-			3 -1 roll
-			sub dup mul
-			3 1 roll
-			sub dup mul
-			add 0.5 exp 72 div
-			0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
-			72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
-			1 index 1 index lt{exch}if pop
-			mul
-			/numpix xdf
-			numpix 0 ne
-			{
-				NumSamples numpix div 0.5 gt
-				{
-					/numsteps numpix 2 div round cvi dup 1 le{pop 2}if def
-					/rampIndxInc NumSamples 1 sub numsteps div def
-					/subsampling true def
-				}if
-			}if
-			ext0
-			{
-				0 getrampcolor
-				xMin xStart lt
-				{
-					xMin yMin xMin neg ySpan rectfill
-				}if
-			}if
-			/xInc xEnd xStart sub numsteps div def
-			/x xStart def
-			0
-			numsteps
-			{
-				dup
-				subsampling{round cvi}if
-				getrampcolor
-				x yMin xInc ySpan rectfill
-				/x x xInc add def
-				rampIndxInc add
-			}repeat
-			pop
-			ext1{
-				xMax xEnd gt
-				{
-					xEnd yMin xMax xEnd sub ySpan rectfill
-				}if
-			}if
-			grestore
-			grestore
-			end
-			end
-			end
-		}ifelse
-	}bdf
-}def
-/pt
-{
-	end
-}def
-/dt{
-}def
-/pgsv{
-	//Adobe_AGM_Core/AGMCORE_save save put
-}def
-/pgrs{
-	//Adobe_AGM_Core/AGMCORE_save get restore
-}def
-systemdict/findcolorrendering known{
-	/findcolorrendering systemdict/findcolorrendering get def
-}if
-systemdict/setcolorrendering known{
-	/setcolorrendering systemdict/setcolorrendering get def
-}if
-/test_cmyk_color_plate
-{
-	gsave
-	setcmykcolor currentgray 1 ne
-	grestore
-}def
-/inRip_spot_has_ink
-{
-	dup//Adobe_AGM_Core/AGMCORE_name xddf
-	convert_spot_to_process not
-}def
-/map255_to_range
-{
-	1 index sub
-	3 -1 roll 255 div mul add
-}def
-/set_csa_crd
-{
-	/sep_colorspace_dict null AGMCORE_gput
-	begin
-		CSA get_csa_by_name setcolorspace_opt
-		set_crd
-	end
-}
-def
-/map_csa
-{
-	currentdict/MappedCSA known{MappedCSA null ne}{false}ifelse
-	{pop}{get_csa_by_name/MappedCSA xdf}ifelse
-}def
-/setsepcolor
-{
-	/sep_colorspace_dict AGMCORE_gget begin
-		dup/sep_tint exch AGMCORE_gput
-		TintProc
-	end
-}def
-/setdevicencolor
-{
-	/devicen_colorspace_dict AGMCORE_gget begin
-		Names length copy
-		Names length 1 sub -1 0
-		{
-			/devicen_tints AGMCORE_gget 3 1 roll xpt
-		}for
-		TintProc
-	end
-}def
-/sep_colorspace_proc
-{
-	/AGMCORE_tmp exch store
-	/sep_colorspace_dict AGMCORE_gget begin
-	currentdict/Components known{
-		Components aload pop 
-		TintMethod/Lab eq{
-			2{AGMCORE_tmp mul NComponents 1 roll}repeat
-			LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll
-		}{
-			TintMethod/Subtractive eq{
-				NComponents{
-					AGMCORE_tmp mul NComponents 1 roll
-				}repeat
-			}{
-				NComponents{
-					1 sub AGMCORE_tmp mul 1 add NComponents 1 roll
-				}repeat
-			}ifelse
-		}ifelse
-	}{
-		ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get
-		aload pop
-	}ifelse
-	end
-}def
-/sep_colorspace_gray_proc
-{
-	/AGMCORE_tmp exch store
-	/sep_colorspace_dict AGMCORE_gget begin
-	GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get
-	end
-}def
-/sep_proc_name
-{
-	dup 0 get 
-	dup/DeviceRGB eq exch/DeviceCMYK eq or level2 not and has_color not and{
-		pop[/DeviceGray]
-		/sep_colorspace_gray_proc
-	}{
-		/sep_colorspace_proc
-	}ifelse
-}def
-/setsepcolorspace
-{
-	current_spot_alias{
-		dup begin
-			Name map_alias{
-				exch pop
-			}if
-		end
-	}if
-	dup/sep_colorspace_dict exch AGMCORE_gput
-	begin
-	CSA map_csa
-	/AGMCORE_sep_special Name dup()eq exch(All)eq or store
-	AGMCORE_avoid_L2_sep_space{
-		[/Indexed MappedCSA sep_proc_name 255 exch 
-			{255 div}/exec cvx 3 -1 roll[4 1 roll load/exec cvx]cvx 
-		]setcolorspace_opt
-		/TintProc{
-			255 mul round cvi setcolor
-		}bdf
-	}{
-		MappedCSA 0 get/DeviceCMYK eq 
-		currentdict/Components known and 
-		AGMCORE_sep_special not and{
-			/TintProc[
-				Components aload pop Name findcmykcustomcolor 
-				/exch cvx/setcustomcolor cvx
-			]cvx bdf
-		}{
- 			AGMCORE_host_sep Name(All)eq and{
- 				/TintProc{
-					1 exch sub setseparationgray 
-				}bdf
- 			}{
-				AGMCORE_in_rip_sep MappedCSA 0 get/DeviceCMYK eq and 
-				AGMCORE_host_sep or
-				Name()eq and{
-					/TintProc[
-						MappedCSA sep_proc_name exch 0 get/DeviceCMYK eq{
-							cvx/setcmykcolor cvx
-						}{
-							cvx/setgray cvx
-						}ifelse
-					]cvx bdf
-				}{
-					AGMCORE_producing_seps MappedCSA 0 get dup/DeviceCMYK eq exch/DeviceGray eq or and AGMCORE_sep_special not and{
-	 					/TintProc[
-							/dup cvx
-							MappedCSA sep_proc_name cvx exch
-							0 get/DeviceGray eq{
-								1/exch cvx/sub cvx 0 0 0 4 -1/roll cvx
-							}if
-							/Name cvx/findcmykcustomcolor cvx/exch cvx
-							AGMCORE_host_sep{
-								AGMCORE_is_cmyk_sep
-								/Name cvx 
-								/AGMCORE_IsSeparationAProcessColor load/exec cvx
-								/not cvx/and cvx 
-							}{
-								Name inRip_spot_has_ink not
-							}ifelse
-							[
-		 						/pop cvx 1
-							]cvx/if cvx
-							/setcustomcolor cvx
-						]cvx bdf
- 					}{
-						/TintProc{setcolor}bdf
-						[/Separation Name MappedCSA sep_proc_name load]setcolorspace_opt
-					}ifelse
-				}ifelse
-			}ifelse
-		}ifelse
-	}ifelse
-	set_crd
-	setsepcolor
-	end
-}def
-/additive_blend
-{
- 	3 dict begin
- 	/numarrays xdf
- 	/numcolors xdf
- 	0 1 numcolors 1 sub
- 		{
- 		/c1 xdf
- 		1
- 		0 1 numarrays 1 sub
- 			{
-			1 exch add/index cvx
- 			c1/get cvx/mul cvx
- 			}for
- 		numarrays 1 add 1/roll cvx 
- 		}for
- 	numarrays[/pop cvx]cvx/repeat cvx
- 	end
-}def
-/subtractive_blend
-{
-	3 dict begin
-	/numarrays xdf
-	/numcolors xdf
-	0 1 numcolors 1 sub
-		{
-		/c1 xdf
-		1 1
-		0 1 numarrays 1 sub
-			{
-			1 3 3 -1 roll add/index cvx 
-			c1/get cvx/sub cvx/mul cvx
-			}for
-		/sub cvx
-		numarrays 1 add 1/roll cvx
-		}for
-	numarrays[/pop cvx]cvx/repeat cvx
-	end
-}def
-/exec_tint_transform
-{
-	/TintProc[
-		/TintTransform cvx/setcolor cvx
-	]cvx bdf
-	MappedCSA setcolorspace_opt
-}bdf
-/devn_makecustomcolor
-{
-	2 dict begin
-	/names_index xdf
-	/Names xdf
-	1 1 1 1 Names names_index get findcmykcustomcolor
-	/devicen_tints AGMCORE_gget names_index get setcustomcolor
-	Names length{pop}repeat
-	end
-}bdf
-/setdevicencolorspace
-{
-	dup/AliasedColorants known{false}{true}ifelse 
-	current_spot_alias and{
-		7 dict begin
-		/names_index 0 def
-		dup/names_len exch/Names get length def
-		/new_names names_len array def
-		/new_LookupTables names_len array def
-		/alias_cnt 0 def
-		dup/Names get
-		{
-			dup map_alias{
-				exch pop
-				dup/ColorLookup known{
-					dup begin
-					new_LookupTables names_index ColorLookup put
-					end
-				}{
-					dup/Components known{
-						dup begin
-						new_LookupTables names_index Components put
-						end
-					}{
-						dup begin
-						new_LookupTables names_index[null null null null]put
-						end
-					}ifelse
-				}ifelse
-				new_names names_index 3 -1 roll/Name get put
-				/alias_cnt alias_cnt 1 add def 
-			}{
-				/name xdf				
-				new_names names_index name put
-				dup/LookupTables known{
-					dup begin
-					new_LookupTables names_index LookupTables names_index get put
-					end
-				}{
-					dup begin
-					new_LookupTables names_index[null null null null]put
-					end
-				}ifelse
-			}ifelse
-			/names_index names_index 1 add def 
-		}forall
-		alias_cnt 0 gt{
-			/AliasedColorants true def
-			/lut_entry_len new_LookupTables 0 get dup length 256 ge{0 get length}{length}ifelse def
-			0 1 names_len 1 sub{
-				/names_index xdf
-				new_LookupTables names_index get dup length 256 ge{0 get length}{length}ifelse lut_entry_len ne{
-					/AliasedColorants false def
-					exit
-				}{
-					new_LookupTables names_index get 0 get null eq{
-						dup/Names get names_index get/name xdf
-						name(Cyan)eq name(Magenta)eq name(Yellow)eq name(Black)eq
-						or or or not{
-							/AliasedColorants false def
-							exit
-						}if
-					}if
-				}ifelse
-			}for
-			lut_entry_len 1 eq{
-				/AliasedColorants false def
-			}if
-			AliasedColorants{
-				dup begin
-				/Names new_names def
-				/LookupTables new_LookupTables def
-				/AliasedColorants true def
-				/NComponents lut_entry_len def
-				/TintMethod NComponents 4 eq{/Subtractive}{/Additive}ifelse def
-				/MappedCSA TintMethod/Additive eq{/DeviceRGB}{/DeviceCMYK}ifelse def
-				currentdict/TTTablesIdx known not{
-					/TTTablesIdx -1 def
-				}if
-				end
-			}if
-		}if
-		end
-	}if
-	dup/devicen_colorspace_dict exch AGMCORE_gput
-	begin
-	currentdict/AliasedColorants known{
-		AliasedColorants
-	}{
-		false
-	}ifelse
-	dup not{
-		CSA map_csa
-	}if
-	/TintTransform load type/nulltype eq or{
-		/TintTransform[
-			0 1 Names length 1 sub
-				{
-				/TTTablesIdx TTTablesIdx 1 add def
-				dup LookupTables exch get dup 0 get null eq
-					{
-					1 index
-					Names exch get
-					dup(Cyan)eq
-						{
-						pop exch
-						LookupTables length exch sub
-						/index cvx
-						0 0 0
-						}
-						{
-						dup(Magenta)eq
-							{
-							pop exch
-							LookupTables length exch sub
-							/index cvx
-							0/exch cvx 0 0
-							}{
-							(Yellow)eq
-								{
-								exch
-								LookupTables length exch sub
-								/index cvx
-								0 0 3 -1/roll cvx 0
-								}{
-								exch
-								LookupTables length exch sub
-								/index cvx
-								0 0 0 4 -1/roll cvx
-								}ifelse
-							}ifelse
-						}ifelse
-					5 -1/roll cvx/astore cvx
-					}{
-					dup length 1 sub
-					LookupTables length 4 -1 roll sub 1 add
-					/index cvx/mul cvx/round cvx/cvi cvx/get cvx
-					}ifelse
-					Names length TTTablesIdx add 1 add 1/roll cvx
-				}for
-			Names length[/pop cvx]cvx/repeat cvx
-			NComponents Names length
- 			TintMethod/Subtractive eq
- 				{
- 				subtractive_blend
- 				}{
- 				additive_blend
- 				}ifelse
-		]cvx bdf
-	}if
-	AGMCORE_host_sep{
-		Names convert_to_process{
-			exec_tint_transform
-		}
-		{	
-			currentdict/AliasedColorants known{
-				AliasedColorants not
-			}{
-				false
-			}ifelse
-			5 dict begin
-			/AvoidAliasedColorants xdf
-			/painted? false def
-			/names_index 0 def
-			/names_len Names length def
-			AvoidAliasedColorants{
-				/currentspotalias current_spot_alias def
-				false set_spot_alias
-			}if
-			Names{
-				AGMCORE_is_cmyk_sep{
-					dup(Cyan)eq AGMCORE_cyan_plate and exch
-					dup(Magenta)eq AGMCORE_magenta_plate and exch
-					dup(Yellow)eq AGMCORE_yellow_plate and exch
-					(Black)eq AGMCORE_black_plate and or or or{
-						/devicen_colorspace_dict AGMCORE_gget/TintProc[
-							Names names_index/devn_makecustomcolor cvx
-						]cvx ddf
-						/painted? true def
-					}if
-					painted?{exit}if
-				}{
-					0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq{
-					/devicen_colorspace_dict AGMCORE_gget/TintProc[
-						Names names_index/devn_makecustomcolor cvx
-					]cvx ddf
-					/painted? true def
-					exit
-					}if
-				}ifelse
-				/names_index names_index 1 add def
-			}forall
-			AvoidAliasedColorants{
-				currentspotalias set_spot_alias
-			}if
-			painted?{
-				/devicen_colorspace_dict AGMCORE_gget/names_index names_index put
-			}{
-				/devicen_colorspace_dict AGMCORE_gget/TintProc[
-					names_len[/pop cvx]cvx/repeat cvx 1/setseparationgray cvx
- 					0 0 0 0/setcmykcolor cvx
-				]cvx ddf
-			}ifelse
-			end
-		}ifelse
-	}
-	{
-		AGMCORE_in_rip_sep{
-			Names convert_to_process not
-		}{
-			level3
-		}ifelse
-		{
-			[/DeviceN Names MappedCSA/TintTransform load]setcolorspace_opt
-			/TintProc level3 not AGMCORE_in_rip_sep and{
-				[
-					Names/length cvx[/pop cvx]cvx/repeat cvx
-				]cvx bdf
-			}{
-				{setcolor}bdf
-			}ifelse
-		}{
-			exec_tint_transform
-		}ifelse
-	}ifelse
-	set_crd
-	/AliasedColorants false def
-	end
-}def
-/setindexedcolorspace
-{
-	dup/indexed_colorspace_dict exch AGMCORE_gput
-	begin
-		currentdict/CSDBase known{
-			CSDBase/CSD get_res begin
-			currentdict/Names known{
-				currentdict devncs
-			}{
-				1 currentdict sepcs
-			}ifelse
-			AGMCORE_host_sep{
-				4 dict begin
-				/compCnt/Names where{pop Names length}{1}ifelse def
-				/NewLookup HiVal 1 add string def
-				0 1 HiVal{
-					/tableIndex xdf
-					Lookup dup type/stringtype eq{
-						compCnt tableIndex map_index
-					}{
-						exec
-					}ifelse
-					/Names where{
-						pop setdevicencolor
-					}{
-						setsepcolor
-					}ifelse
-					currentgray
-					tableIndex exch
-					255 mul cvi 
-					NewLookup 3 1 roll put
-				}for
-				[/Indexed currentcolorspace HiVal NewLookup]setcolorspace_opt
-				end
-			}{
-				level3
-				{
-					currentdict/Names known{
-						[/Indexed[/DeviceN Names MappedCSA/TintTransform load]HiVal Lookup]setcolorspace_opt
-					}{
-						[/Indexed[/Separation Name MappedCSA sep_proc_name load]HiVal Lookup]setcolorspace_opt
-					}ifelse
-				}{
-				[/Indexed MappedCSA HiVal
-					[
-					currentdict/Names known{
-						Lookup dup type/stringtype eq
-							{/exch cvx CSDBase/CSD get_res/Names get length dup/mul cvx exch/getinterval cvx{255 div}/forall cvx}
-							{/exec cvx}ifelse
-							/TintTransform load/exec cvx
-					}{
-						Lookup dup type/stringtype eq
-							{/exch cvx/get cvx 255/div cvx}
-							{/exec cvx}ifelse
-							CSDBase/CSD get_res/MappedCSA get sep_proc_name exch pop/load cvx/exec cvx
-					}ifelse
-					]cvx
-				]setcolorspace_opt
-				}ifelse
-			}ifelse
-			end
-			set_crd
-		}
-		{
-			CSA map_csa
-			AGMCORE_host_sep level2 not and{
-				0 0 0 0 setcmykcolor
-			}{
-				[/Indexed MappedCSA 
-				level2 not has_color not and{
-					dup 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or{
-						pop[/DeviceGray]
-					}if
-					HiVal GrayLookup
-				}{
-					HiVal 
-					currentdict/RangeArray known{
-						{
-							/indexed_colorspace_dict AGMCORE_gget begin
-							Lookup exch 
-							dup HiVal gt{
-								pop HiVal
-							}if
-							NComponents mul NComponents getinterval{}forall
-							NComponents 1 sub -1 0{
-								RangeArray exch 2 mul 2 getinterval aload pop map255_to_range
-								NComponents 1 roll
-							}for
-							end
-						}bind
-					}{
-						Lookup
-					}ifelse
-				}ifelse
-				]setcolorspace_opt
-				set_crd
-			}ifelse
-		}ifelse
-	end
-}def
-/setindexedcolor
-{
-	AGMCORE_host_sep{
-		/indexed_colorspace_dict AGMCORE_gget
-		begin
-		currentdict/CSDBase known{
-			CSDBase/CSD get_res begin
-			currentdict/Names known{
-				map_indexed_devn
-				devn
-			}
-			{
-				Lookup 1 3 -1 roll map_index
-				sep
-			}ifelse
-			end
-		}{
-			Lookup MappedCSA/DeviceCMYK eq{4}{1}ifelse 3 -1 roll
-			map_index
-			MappedCSA/DeviceCMYK eq{setcmykcolor}{setgray}ifelse
-		}ifelse
-		end
-	}{
-		level3 not AGMCORE_in_rip_sep and/indexed_colorspace_dict AGMCORE_gget/CSDBase known and{
-			/indexed_colorspace_dict AGMCORE_gget/CSDBase get/CSD get_res begin
-			map_indexed_devn
-			devn
-			end
-		}
-		{
-			setcolor
-		}ifelse
-	}ifelse
-}def
-/ignoreimagedata
-{
-	currentoverprint not{
-		gsave
-		dup clonedict begin
-		1 setgray
-		/Decode[0 1]def
-		/DataSourcedef
-		/MultipleDataSources false def
-		/BitsPerComponent 8 def
-		currentdict end
-		systemdict/image gx
-		grestore
-		}if
-	consumeimagedata
-}def
-/add_res
-{
-	dup/CSD eq{
-		pop 
-		//Adobe_AGM_Core begin
-		/AGMCORE_CSD_cache load 3 1 roll put
-		end
-	}{
-		defineresource pop
-	}ifelse
-}def
-/del_res
-{
-	{
-		aload pop exch
-		dup/CSD eq{
-			pop 
-			{//Adobe_AGM_Core/AGMCORE_CSD_cache get exch undef}forall
-		}{
-			exch
-			{1 index undefineresource}forall
-			pop
-		}ifelse
-	}forall
-}def
-/get_res
-{
-	dup/CSD eq{
-		pop
-		dup type dup/nametype eq exch/stringtype eq or{
-			AGMCORE_CSD_cache exch get
-		}if
-	}{
-		findresource
-	}ifelse
-}def
-/get_csa_by_name
-{
-	dup type dup/nametype eq exch/stringtype eq or{
-		/CSA get_res
-	}if
-}def
-/paintproc_buf_init
-{
-	/count get 0 0 put
-}def
-/paintproc_buf_next
-{
-	dup/count get dup 0 get
-	dup 3 1 roll
-	1 add 0 xpt
-	get				
-}def
-/cachepaintproc_compress
-{
-	5 dict begin
-	currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def
-	/ppdict 20 dict def
-	/string_size 16000 def
-	/readbuffer string_size string def
-	currentglobal true setglobal 
-	ppdict 1 array dup 0 1 put/count xpt
-	setglobal
-	/LZWFilter 
-	{
-		exch
-		dup length 0 eq{
-			pop
-		}{
-			ppdict dup length 1 sub 3 -1 roll put
-		}ifelse
-		{string_size}{0}ifelse string
-	}/LZWEncode filter def
-	{		
-		ReadFilter readbuffer readstring
-		exch LZWFilter exch writestring
-		not{exit}if
-	}loop
-	LZWFilter closefile
-	ppdict				
-	end
-}def
-/cachepaintproc
-{
-	2 dict begin
-	currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def
-	/ppdict 20 dict def
-	currentglobal true setglobal 
-	ppdict 1 array dup 0 1 put/count xpt
-	setglobal
-	{
-		ReadFilter 16000 string readstring exch
-		ppdict dup length 1 sub 3 -1 roll put
-		not{exit}if
-	}loop
-	ppdict dup dup length 1 sub()put					
-	end	
-}def
-/make_pattern
-{
-	exch clonedict exch
-	dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform
-	exch 3 index/XStep get 1 index exch 2 copy div cvi mul sub sub
-	exch 3 index/YStep get 1 index exch 2 copy div cvi mul sub sub
-	matrix translate exch matrix concatmatrix
-			 1 index begin
-		BBox 0 get XStep div cvi XStep mul/xshift exch neg def
-		BBox 1 get YStep div cvi YStep mul/yshift exch neg def
-		BBox 0 get xshift add
-		BBox 1 get yshift add
-		BBox 2 get xshift add
-		BBox 3 get yshift add
-		4 array astore
-		/BBox exch def
-		[xshift yshift/translate load null/exec load]dup
-		3/PaintProc load put cvx/PaintProc exch def
-		end
-	gsave 0 setgray
-	makepattern
-	grestore
-}def
-/set_pattern
-{
-	dup/PatternType get 1 eq{
-		dup/PaintType get 1 eq{
-			currentoverprint sop[/DeviceGray]setcolorspace 0 setgray
-		}if
-	}if
-	setpattern
-}def
-/setcolorspace_opt
-{
-	dup currentcolorspace eq{pop}{setcolorspace}ifelse
-}def
-/updatecolorrendering
-{
-	currentcolorrendering/RenderingIntent known{
-		currentcolorrendering/RenderingIntent get
-	}
-	{
-		Intent/AbsoluteColorimetric eq 
-		{
-			/absolute_colorimetric_crd AGMCORE_gget dup null eq
-		}
-		{
-			Intent/RelativeColorimetric eq
-			{
-				/relative_colorimetric_crd AGMCORE_gget dup null eq
-			}
-			{
-				Intent/Saturation eq
-				{
-					/saturation_crd AGMCORE_gget dup null eq
-				}
-				{
-					/perceptual_crd AGMCORE_gget dup null eq
-				}ifelse
-			}ifelse
-		}ifelse
-		{
-			pop null	
-		}
-		{
-			/RenderingIntent known{null}{Intent}ifelse
-		}ifelse
-	}ifelse
-	Intent ne{
-		Intent/ColorRendering{findresource}stopped
-		{
-			pop pop systemdict/findcolorrendering known
-			{
- 				Intent findcolorrendering
- 				{
- 					/ColorRendering findresource true exch
- 				}
- 				{
- 					/ColorRendering findresource
-					product(Xerox Phaser 5400)ne
-					exch
- 				}ifelse
-				dup Intent/AbsoluteColorimetric eq 
-				{
-					/absolute_colorimetric_crd exch AGMCORE_gput
-				}
-				{
-					Intent/RelativeColorimetric eq
-					{
-						/relative_colorimetric_crd exch AGMCORE_gput
-					}
-					{
-						Intent/Saturation eq
-						{
-							/saturation_crd exch AGMCORE_gput
-						}
-						{
-							Intent/Perceptual eq
-							{
-								/perceptual_crd exch AGMCORE_gput
-							}
-							{
-								pop
-							}ifelse
-						}ifelse
-					}ifelse
-				}ifelse
-				1 index{exch}{pop}ifelse
-			}
-			{false}ifelse
-		}
-		{true}ifelse
-		{
-			dup begin
-			currentdict/TransformPQR known{
-				currentdict/TransformPQR get aload pop
-				3{{}eq 3 1 roll}repeat or or
-			}
-			{true}ifelse
-			currentdict/MatrixPQR known{
-				currentdict/MatrixPQR get aload pop
-				1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll
-				0.0 eq 9 1 roll 1.0 eq 9 1 roll 0.0 eq 9 1 roll
-				0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq
-				and and and and and and and and
-			}
-			{true}ifelse
-			end
-			or
-			{
-				clonedict begin
-				/TransformPQR[
-					{4 -1 roll 3 get dup 3 1 roll sub 5 -1 roll 3 get 3 -1 roll sub div
-					3 -1 roll 3 get 3 -1 roll 3 get dup 4 1 roll sub mul add}bind
-					{4 -1 roll 4 get dup 3 1 roll sub 5 -1 roll 4 get 3 -1 roll sub div
-					3 -1 roll 4 get 3 -1 roll 4 get dup 4 1 roll sub mul add}bind
-					{4 -1 roll 5 get dup 3 1 roll sub 5 -1 roll 5 get 3 -1 roll sub div
-					3 -1 roll 5 get 3 -1 roll 5 get dup 4 1 roll sub mul add}bind
-				]def
-				/MatrixPQR[0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296]def
-				/RangePQR[-0.3227950745 2.3229645538 -1.5003771057 3.5003465881 -0.1369979095 2.136967392]def
-				currentdict end
-			}if
-			setcolorrendering_opt
-		}if		
-	}if
-}def
-/set_crd
-{
-	AGMCORE_host_sep not level2 and{
-		currentdict/ColorRendering known{
-			ColorRendering/ColorRendering{findresource}stopped not{setcolorrendering_opt}if
-		}{
-			currentdict/Intent known{
-				updatecolorrendering
-			}if
-		}ifelse
-		currentcolorspace dup type/arraytype eq
-			{0 get}if
-		/DeviceRGB eq
-			{
-			currentdict/UCR known
-				{/UCR}{/AGMCORE_currentucr}ifelse
-			load setundercolorremoval
-			currentdict/BG known 
-				{/BG}{/AGMCORE_currentbg}ifelse
-			load setblackgeneration
-			}if
-	}if
-}def
-/set_ucrbg
-{
-	dup null eq{pop/AGMCORE_currentbg load}{/Procedure get_res}ifelse setblackgeneration
-	dup null eq{pop/AGMCORE_currentucr load}{/Procedure get_res}ifelse setundercolorremoval
-}def
-/setcolorrendering_opt
-{
-	dup currentcolorrendering eq{
-		pop
-	}{
-		clonedict
-		begin
-			/Intent Intent def
-			currentdict
-		end
-		setcolorrendering
-	}ifelse
-}def
-/cpaint_gcomp
-{
-	convert_to_process//Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf
-	//Adobe_AGM_Core/AGMCORE_ConvertToProcess get not
-	{
-		(%end_cpaint_gcomp)flushinput
-	}if
-}def
-/cpaint_gsep
-{
-	//Adobe_AGM_Core/AGMCORE_ConvertToProcess get
-	{	
-		(%end_cpaint_gsep)flushinput
-	}if
-}def
-/cpaint_gend
-{np}def
-/T1_path
-{
-	currentfile token pop currentfile token pop mo
-	{
-		currentfile token pop dup type/stringtype eq
-			{pop exit}if 
-		0 exch rlineto 
-		currentfile token pop dup type/stringtype eq
-			{pop exit}if 
-		0 rlineto
-	}loop
-}def
-/T1_gsave
-	level3
-	{/clipsave}
-	{/gsave}ifelse
-	load def
-/T1_grestore
-	level3
-	{/cliprestore}
-	{/grestore}ifelse 
-	load def
-/set_spot_alias_ary
-{
-	dup inherit_aliases
-	//Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf
-}def
-/set_spot_normalization_ary
-{
-	dup inherit_aliases
-	dup length
-	/AGMCORE_SpotAliasAry where{pop AGMCORE_SpotAliasAry length add}if
-	array
-	//Adobe_AGM_Core/AGMCORE_SpotAliasAry2 xddf
-	/AGMCORE_SpotAliasAry where{
-		pop
-		AGMCORE_SpotAliasAry2 0 AGMCORE_SpotAliasAry putinterval
-		AGMCORE_SpotAliasAry length
-	}{0}ifelse
-	AGMCORE_SpotAliasAry2 3 1 roll exch putinterval
-	true set_spot_alias
-}def
-/inherit_aliases
-{
-	{dup/Name get map_alias{/CSD put}{pop}ifelse}forall
-}def
-/set_spot_alias
-{
-	/AGMCORE_SpotAliasAry2 where{
-		/AGMCORE_current_spot_alias 3 -1 roll put
-	}{
-		pop
-	}ifelse
-}def
-/current_spot_alias
-{
-	/AGMCORE_SpotAliasAry2 where{
-		/AGMCORE_current_spot_alias get
-	}{
-		false
-	}ifelse
-}def
-/map_alias
-{
-	/AGMCORE_SpotAliasAry2 where{
-		begin
-			/AGMCORE_name xdf
-			false	
-			AGMCORE_SpotAliasAry2{
-				dup/Name get AGMCORE_name eq{
-					/CSD get/CSD get_res
-					exch pop true
-					exit
-				}{
-					pop
-				}ifelse
-			}forall
-		end
-	}{
-		pop false
-	}ifelse
-}bdf
-/spot_alias
-{
-	true set_spot_alias
-	/AGMCORE_&setcustomcolor AGMCORE_key_known not{
-		//Adobe_AGM_Core/AGMCORE_&setcustomcolor/setcustomcolor load put
-	}if
-	/customcolor_tint 1 AGMCORE_gput
-	//Adobe_AGM_Core begin
-	/setcustomcolor
-	{
-		//Adobe_AGM_Core begin
-		dup/customcolor_tint exch AGMCORE_gput
-		1 index aload pop pop 1 eq exch 1 eq and exch 1 eq and exch 1 eq and not
-		current_spot_alias and{1 index 4 get map_alias}{false}ifelse
-		{
-			false set_spot_alias
-			/sep_colorspace_dict AGMCORE_gget null ne
-			3 1 roll 2 index{
-				exch pop/sep_tint AGMCORE_gget exch
-			}if
-			mark 3 1 roll
-			setsepcolorspace
-			counttomark 0 ne{
-				setsepcolor
-			}if
-			pop
-			not{/sep_tint 1.0 AGMCORE_gput}if
-			pop
-			true set_spot_alias
-		}{
-			AGMCORE_&setcustomcolor
-		}ifelse
-		end
-	}bdf
-	end
-}def
-/begin_feature
-{
-	Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put
-	count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put
-	{Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if
-}def
-/end_feature
-{
-	2 dict begin
-	/spd/setpagedevice load def
-	/setpagedevice{get_gstate spd set_gstate}def
-	stopped{$error/newerror false put}if
-	end
-	count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse
-	countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse
-	{Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if
-}def
-/set_negative
-{
-	//Adobe_AGM_Core begin
-	/AGMCORE_inverting exch def
-	level2{
-		currentpagedevice/NegativePrint known AGMCORE_distilling not and{
-			currentpagedevice/NegativePrint get//Adobe_AGM_Core/AGMCORE_inverting get ne{
-				true begin_feature true{
-						<>setpagedevice
-				}end_feature
-			}if
-			/AGMCORE_inverting false def
-		}if
-	}if
-	AGMCORE_inverting{
-		[{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer
- 		AGMCORE_distilling{
- 			erasepage
- 		}{
- 			gsave np clippath 1/setseparationgray where{pop setseparationgray}{setgray}ifelse
- 			/AGMIRS_&fill where{pop AGMIRS_&fill}{fill}ifelse grestore
- 		}ifelse
-	}if
-	end
-}def
-/lw_save_restore_override{
-	/md where{
-		pop
-		md begin
-		initializepage
-		/initializepage{}def
-		/pmSVsetup{}def
-		/endp{}def
-		/pse{}def
-		/psb{}def
-		/orig_showpage where
-			{pop}
-			{/orig_showpage/showpage load def}
-		ifelse
-		/showpage{orig_showpage gR}def
-		end
-	}if
-}def
-/pscript_showpage_override{
-	/NTPSOct95 where
-	{
-		begin
-		showpage
-		save
-		/showpage/restore load def
-		/restore{exch pop}def
-		end
-	}if
-}def
-/driver_media_override
-{
-	/md where{
-		pop
-		md/initializepage known{
-			md/initializepage{}put
-		}if
-		md/rC known{
-			md/rC{4{pop}repeat}put
-		}if
-	}if
-	/mysetup where{
-		/mysetup[1 0 0 1 0 0]put
-	}if
-	Adobe_AGM_Core/AGMCORE_Default_CTM matrix currentmatrix put
-	level2
-		{Adobe_AGM_Core/AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if
-}def
-/driver_check_media_override
-{
- 	/PrepsDict where
- 		{pop}
-		{
-		Adobe_AGM_Core/AGMCORE_Default_CTM get matrix currentmatrix ne
-		Adobe_AGM_Core/AGMCORE_Default_PageSize get type/arraytype eq
-			{
-			Adobe_AGM_Core/AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and
-			Adobe_AGM_Core/AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and
-			}if
-			{
-			Adobe_AGM_Core/AGMCORE_Default_CTM get setmatrix
-			}if
-		}ifelse
-}def
-AGMCORE_err_strings begin
-	/AGMCORE_bad_environ(Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. )def
-	/AGMCORE_color_space_onhost_seps(This job contains colors that will not separate with on-host methods. )def
-	/AGMCORE_invalid_color_space(This job contains an invalid color space. )def
-end
-/set_def_ht
-{AGMCORE_def_ht sethalftone}def
-/set_def_flat
-{AGMCORE_Default_flatness setflat}def
-end
-systemdict/setpacking known
-{setpacking}if
-%%EndResource
-%%BeginResource: procset Adobe_CoolType_Core 2.31 0
-%%Copyright: Copyright 1997-2006 Adobe Systems Incorporated. All Rights Reserved.
-%%Version: 2.31 0
-10 dict begin
-/Adobe_CoolType_Passthru currentdict def
-/Adobe_CoolType_Core_Defined userdict/Adobe_CoolType_Core known def
-Adobe_CoolType_Core_Defined
-	{/Adobe_CoolType_Core userdict/Adobe_CoolType_Core get def}
-if
-userdict/Adobe_CoolType_Core 70 dict dup begin put
-/Adobe_CoolType_Version 2.31 def
-/Level2?
-	systemdict/languagelevel known dup
-		{pop systemdict/languagelevel get 2 ge}
-	if def
-Level2? not
-	{
-	/currentglobal false def
-	/setglobal/pop load def
-	/gcheck{pop false}bind def
-	/currentpacking false def
-	/setpacking/pop load def
-	/SharedFontDirectory 0 dict def
-	}
-if
-currentpacking
-true setpacking
-currentglobal false setglobal
-userdict/Adobe_CoolType_Data 2 copy known not
-	{2 copy 10 dict put}
-if
-get
-	 begin
-	/@opStackCountByLevel 32 dict def
-	/@opStackLevel 0 def
-	/@dictStackCountByLevel 32 dict def
-	/@dictStackLevel 0 def
-	 end
-setglobal
-currentglobal true setglobal
-userdict/Adobe_CoolType_GVMFonts known not
-	{userdict/Adobe_CoolType_GVMFonts 10 dict put}
-if
-setglobal
-currentglobal false setglobal
-userdict/Adobe_CoolType_LVMFonts known not
-	{userdict/Adobe_CoolType_LVMFonts 10 dict put}
-if
-setglobal
-/ct_VMDictPut
-	{
-	dup gcheck{Adobe_CoolType_GVMFonts}{Adobe_CoolType_LVMFonts}ifelse
-	3 1 roll put
-	}bind def
-/ct_VMDictUndef
-	{
-	dup Adobe_CoolType_GVMFonts exch known
-		{Adobe_CoolType_GVMFonts exch undef}
-		{
-			dup Adobe_CoolType_LVMFonts exch known
-			{Adobe_CoolType_LVMFonts exch undef}
-			{pop}
-			ifelse
-		}ifelse
-	}bind def
-/ct_str1 1 string def
-/ct_xshow
-{
-	/_ct_na exch def
-	/_ct_i 0 def
-	currentpoint
-	/_ct_y exch def
-	/_ct_x exch def
-	{
-		pop pop
-		ct_str1 exch 0 exch put
-		ct_str1 show
-		{_ct_na _ct_i get}stopped 
-		{pop pop}
-		{
-			_ct_x _ct_y moveto
-			0
-			rmoveto
-		}
-		ifelse
-		/_ct_i _ct_i 1 add def
-		currentpoint
-		/_ct_y exch def
-		/_ct_x exch def
-	}
-	exch
-	@cshow
-}bind def
-/ct_yshow
-{
-	/_ct_na exch def
-	/_ct_i 0 def
-	currentpoint
-	/_ct_y exch def
-	/_ct_x exch def
-	{
-		pop pop
-		ct_str1 exch 0 exch put
-		ct_str1 show
-		{_ct_na _ct_i get}stopped 
-		{pop pop}
-		{
-			_ct_x _ct_y moveto
-			0 exch
-			rmoveto
-		}
-		ifelse
-		/_ct_i _ct_i 1 add def
-		currentpoint
-		/_ct_y exch def
-		/_ct_x exch def
-	}
-	exch
-	@cshow
-}bind def
-/ct_xyshow
-{
-	/_ct_na exch def
-	/_ct_i 0 def
-	currentpoint
-	/_ct_y exch def
-	/_ct_x exch def
-	{
-		pop pop
-		ct_str1 exch 0 exch put
-		ct_str1 show
-		{_ct_na _ct_i get}stopped 
-		{pop pop}
-		{
-			{_ct_na _ct_i 1 add get}stopped 
-			{pop pop pop}
-			{
-				_ct_x _ct_y moveto
-				rmoveto
-			}
-			ifelse
-		}
-		ifelse
-		/_ct_i _ct_i 2 add def
-		currentpoint
-		/_ct_y exch def
-		/_ct_x exch def
-	}
-	exch
-	@cshow
-}bind def
-/xsh{{@xshow}stopped{Adobe_CoolType_Data begin ct_xshow end}if}bind def
-/ysh{{@yshow}stopped{Adobe_CoolType_Data begin ct_yshow end}if}bind def
-/xysh{{@xyshow}stopped{Adobe_CoolType_Data begin ct_xyshow end}if}bind def
-currentglobal true setglobal
-/ct_T3Defs
-{
-/BuildChar
-{
-	1 index/Encoding get exch get
-	1 index/BuildGlyph get exec
-}bind def
-/BuildGlyph
-{
-	exch begin
-	GlyphProcs exch get exec
-	end
-}bind def
-}bind def
-setglobal
-/@_SaveStackLevels
-	{
-	Adobe_CoolType_Data
-		begin
-		/@vmState currentglobal def false setglobal
-		@opStackCountByLevel
-		@opStackLevel
-		2 copy known not
-			{
-			2 copy
-			3 dict dup/args
-			7 index
-			5 add array put
-			put get
-			}
-			{
-			get dup/args get dup length 3 index lt
-				{
-				dup length 5 add array exch
-				1 index exch 0 exch putinterval
-				1 index exch/args exch put
-				}
-				{pop}
-			ifelse
-			}
-		ifelse
-			begin
-			count 1 sub
-			1 index lt
-				{pop count}
-			if
-			dup/argCount exch def
-			dup 0 gt
-				{
-				args exch 0 exch getinterval 
-			astore pop
-				}
-				{pop}
-			ifelse
-			count
-			/restCount exch def
-			end
-		/@opStackLevel @opStackLevel 1 add def
-		countdictstack 1 sub
-		@dictStackCountByLevel exch @dictStackLevel exch put
-		/@dictStackLevel @dictStackLevel 1 add def
-		@vmState setglobal
-		end
-	}bind def
-/@_RestoreStackLevels
-	{
-	Adobe_CoolType_Data
-		begin
-		/@opStackLevel @opStackLevel 1 sub def
-		@opStackCountByLevel @opStackLevel get
-			begin
-			count restCount sub dup 0 gt
-				{{pop}repeat}
-				{pop}
-			ifelse
-			args 0 argCount getinterval{}forall
-			end
-		/@dictStackLevel @dictStackLevel 1 sub def
-		@dictStackCountByLevel @dictStackLevel get
-		end
-	countdictstack exch sub dup 0 gt
-		{{end}repeat}
-		{pop}
-	ifelse
-	}bind def
-/@_PopStackLevels
-	{
-	Adobe_CoolType_Data
-		begin
-		/@opStackLevel @opStackLevel 1 sub def
-		/@dictStackLevel @dictStackLevel 1 sub def
-		end
-	}bind def
-/@Raise
-	{
-	exch cvx exch errordict exch get exec
-	stop
-	}bind def
-/@ReRaise
-	{
-	cvx $error/errorname get errordict exch get exec
-	stop
-	}bind def
-/@Stopped
-	{
-	0 @#Stopped
-	}bind def
-/@#Stopped
-	{
-	@_SaveStackLevels
-	stopped
-		{@_RestoreStackLevels true}
-		{@_PopStackLevels false}
-	ifelse
-	}bind def
-/@Arg
-	{
-	Adobe_CoolType_Data
-		begin
-		@opStackCountByLevel @opStackLevel 1 sub get
-		begin
-		args exch
-		argCount 1 sub exch sub get
-		end
-		end
-	}bind def
-currentglobal true setglobal
-/CTHasResourceForAllBug
-	Level2?
-		{
-		1 dict dup
-				/@shouldNotDisappearDictValue true def
-				Adobe_CoolType_Data exch/@shouldNotDisappearDict exch put
-				begin
-				count @_SaveStackLevels
-					{(*){pop stop}128 string/Category resourceforall}
-				stopped pop
-				@_RestoreStackLevels
-				currentdict Adobe_CoolType_Data/@shouldNotDisappearDict get dup 3 1 roll ne dup 3 1 roll
-					{
-						 /@shouldNotDisappearDictValue known
-								{
-										 {
-												end
-												currentdict 1 index eq
-													{pop exit}
-												if
-										 }
-									 loop
-								}
-						 if
-					}
-					{
-						 pop
-						 end
-					}
-				ifelse
-		}
-		{false}
-	ifelse
-	def
-true setglobal
-/CTHasResourceStatusBug
-	Level2?
-		{
-		mark
-			{/steveamerige/Category resourcestatus}
-		stopped
-			{cleartomark true}
-			{cleartomark currentglobal not}
-		ifelse
-		}
-		{false}
-	ifelse
-	def
-setglobal
-/CTResourceStatus
-		{
-		mark 3 1 roll
-		/Category findresource
-			begin
-			({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec
-				{cleartomark false}
-				{{3 2 roll pop true}{cleartomark false}ifelse}
-			ifelse
-			end
-		}bind def
-/CTWorkAroundBugs
-	{
-	Level2?
-		{
-		/cid_PreLoad/ProcSet resourcestatus
-			{
-			pop pop
-			currentglobal
-			mark
-				{
-				(*)
-					{
-					dup/CMap CTHasResourceStatusBug
-						{CTResourceStatus}
-						{resourcestatus}
-					ifelse
-						{
-						pop dup 0 eq exch 1 eq or
-							{
-							dup/CMap findresource gcheck setglobal
-							/CMap undefineresource
-							}
-							{
-							pop CTHasResourceForAllBug
-								{exit}
-								{stop}
-							ifelse
-							}
-						ifelse
-						}
-						{pop}
-					ifelse
-					}
-				128 string/CMap resourceforall
-				}
-			stopped
-				{cleartomark}
-			stopped pop
-			setglobal
-			}
-		if
-		}
-	if
-	}bind def
-/ds
-	{
-	Adobe_CoolType_Core
-		begin
-		CTWorkAroundBugs
-		/mo/moveto load def
-		/nf/newencodedfont load def
-		/msf{makefont setfont}bind def
-		/uf{dup undefinefont ct_VMDictUndef}bind def
-		/ur/undefineresource load def
-		/chp/charpath load def
-		/awsh/awidthshow load def
-		/wsh/widthshow load def
-		/ash/ashow load def
-		/@xshow/xshow load def
-		/@yshow/yshow load def
-		/@xyshow/xyshow load def
-		/@cshow/cshow load def
-		/sh/show load def
-		/rp/repeat load def
-		/.n/.notdef def
-		end
-		currentglobal false setglobal
-	 userdict/Adobe_CoolType_Data 2 copy known not
-		 {2 copy 10 dict put}
-		if
-		get
-		begin
-		/AddWidths? false def
-		/CC 0 def
-		/charcode 2 string def
-		/@opStackCountByLevel 32 dict def
-		/@opStackLevel 0 def
-		/@dictStackCountByLevel 32 dict def
-		/@dictStackLevel 0 def
-		/InVMFontsByCMap 10 dict def
-		/InVMDeepCopiedFonts 10 dict def
-		end
-		setglobal
-	}bind def
-/dt
-	{
-	currentdict Adobe_CoolType_Core eq
-		{end}
-	if
-	}bind def
-/ps
-	{
-	Adobe_CoolType_Core begin
-	Adobe_CoolType_GVMFonts begin
-	Adobe_CoolType_LVMFonts begin
-	SharedFontDirectory begin
-	}bind def
-/pt
-	{
-	end
-	end
-	end
-	end
-	}bind def
-/unload
-	{
-	systemdict/languagelevel known
-		{
-		systemdict/languagelevel get 2 ge
-			{
-			userdict/Adobe_CoolType_Core 2 copy known
-				{undef}
-				{pop pop}
-			ifelse
-			}
-		if
-		}
-	if
-	}bind def
-/ndf
-	{
-	1 index where
-		{pop pop pop}
-		{dup xcheck{bind}if def}
-	ifelse
-	}def
-/findfont systemdict
-	begin
-	userdict
-		begin
-		/globaldict where{/globaldict get begin}if
-			dup where pop exch get
-		/globaldict where{pop end}if
-		end
-	end
-Adobe_CoolType_Core_Defined
-	{/systemfindfont exch def}
-	{
-	/findfont 1 index def
-	/systemfindfont exch def
-	}
-ifelse
-/undefinefont
-	{pop}ndf
-/copyfont
-	{
-	currentglobal 3 1 roll
-	1 index gcheck setglobal
-	dup null eq{0}{dup length}ifelse
-	2 index length add 1 add dict
-		begin
-		exch
-			{
-			1 index/FID eq
-				{pop pop}
-				{def}
-			ifelse
-			}
-		forall
-		dup null eq
-			{pop}
-			{{def}forall}
-		ifelse
-		currentdict
-		end
-	exch setglobal
-	}bind def
-/copyarray
-	{
-	currentglobal exch
-	dup gcheck setglobal
-	dup length array copy
-	exch setglobal
-	}bind def
-/newencodedfont
-	{
-	currentglobal
-		{
-		SharedFontDirectory 3 index known
-			{SharedFontDirectory 3 index get/FontReferenced known}
-			{false}
-		ifelse
-		}
-		{
-		FontDirectory 3 index known
-			{FontDirectory 3 index get/FontReferenced known}
-			{
-			SharedFontDirectory 3 index known
-				{SharedFontDirectory 3 index get/FontReferenced known}
-				{false}
-			ifelse
-			}
-		ifelse
-		}
-	ifelse
-	dup
-		{
-		3 index findfont/FontReferenced get
-		2 index dup type/nametype eq
-			{findfont}
-		if ne
-			{pop false}
-		if
-		}
-	if
-	dup
-		{
-		1 index dup type/nametype eq
-			{findfont}
-		 if
-		dup/CharStrings known
-			{
-			/CharStrings get length
-			4 index findfont/CharStrings get length
-			ne
-				{
-				pop false
-				}
-			if 
-			}
-			{pop}
-			ifelse
-		}
-	if
-		{
-		pop
-		1 index findfont
-		/Encoding get exch
-		0 1 255
-			{2 copy get 3 index 3 1 roll put}
-		for
-		pop pop pop
-		}
-		{
-		currentglobal
-	 4 1 roll
-		dup type/nametype eq
-		 {findfont}
-	 if
-	 dup gcheck setglobal
-		dup dup maxlength 2 add dict
-			begin
-			exch
-				{
-				1 index/FID ne
-				2 index/Encoding ne and
-					{def}
-					{pop pop}
-				ifelse
-				}
-			forall
-			/FontReferenced exch def
-			/Encoding exch dup length array copy def
-			/FontName 1 index dup type/stringtype eq{cvn}if def dup
-			currentdict
-			end
-		definefont ct_VMDictPut
-		setglobal
-		}
-	ifelse
-	}bind def
-/SetSubstituteStrategy
-	{
-	$SubstituteFont
-		begin
-		dup type/dicttype ne
-			{0 dict}
-		if
-		currentdict/$Strategies known
-			{
-			exch $Strategies exch 
-			2 copy known
-				{
-				get
-				2 copy maxlength exch maxlength add dict
-					begin
-					{def}forall
-					{def}forall
-					currentdict
-					dup/$Init known
-						{dup/$Init get exec}
-					if
-					end
-				/$Strategy exch def
-				}
-				{pop pop pop}
-			ifelse
-			}
-			{pop pop}
-		ifelse
-		end
-	}bind def
-/scff
-	{
-	$SubstituteFont
-		begin
-		dup type/stringtype eq
-			{dup length exch}
-			{null}
-		ifelse
-		/$sname exch def
-		/$slen exch def
-		/$inVMIndex
-			$sname null eq
-				{
-				1 index $str cvs
-				dup length $slen sub $slen getinterval cvn
-				}
-				{$sname}
-			ifelse def
-		end
-		{findfont}
-	@Stopped
-		{
-		dup length 8 add string exch
-		1 index 0(BadFont:)putinterval
-		1 index exch 8 exch dup length string cvs putinterval cvn
-			{findfont}
-		@Stopped
-			{pop/Courier findfont}
-		if
-		}
-	if
-	$SubstituteFont
-		begin
-		/$sname null def
-		/$slen 0 def
-		/$inVMIndex null def
-		end
-	}bind def
-/isWidthsOnlyFont
-	{
-	dup/WidthsOnly known
-		{pop pop true}
-		{
-		dup/FDepVector known
-			{/FDepVector get{isWidthsOnlyFont dup{exit}if}forall}
-			{
-			dup/FDArray known
-				{/FDArray get{isWidthsOnlyFont dup{exit}if}forall}
-				{pop}
-			ifelse
-			}
-		ifelse
-		}
-	ifelse
-	}bind def
-/ct_StyleDicts 4 dict dup begin
-		 /Adobe-Japan1 4 dict dup begin
-					 Level2?
-								{
-								/Serif
-								/HeiseiMin-W3-83pv-RKSJ-H/Font resourcestatus
-								{pop pop/HeiseiMin-W3}
-								{
-							/CIDFont/Category resourcestatus
-							{
-								pop pop
-								/HeiseiMin-W3/CIDFont resourcestatus
-								{pop pop/HeiseiMin-W3}
-								{/Ryumin-Light}
-								ifelse
-							}
-							{/Ryumin-Light}
-							ifelse
-								}
-								ifelse
-								def
-								/SansSerif
-								/HeiseiKakuGo-W5-83pv-RKSJ-H/Font resourcestatus
-								{pop pop/HeiseiKakuGo-W5}
-								{
-							/CIDFont/Category resourcestatus
-							{
-								pop pop
-								/HeiseiKakuGo-W5/CIDFont resourcestatus
-								{pop pop/HeiseiKakuGo-W5}
-								{/GothicBBB-Medium}
-								ifelse
-							}
-							{/GothicBBB-Medium}
-							ifelse
-								}
-								ifelse
-								def
-								/HeiseiMaruGo-W4-83pv-RKSJ-H/Font resourcestatus
-								{pop pop/HeiseiMaruGo-W4}
-								{
-							/CIDFont/Category resourcestatus
-							{
-								pop pop
-								/HeiseiMaruGo-W4/CIDFont resourcestatus
-								{pop pop/HeiseiMaruGo-W4}
-								{
-									/Jun101-Light-RKSJ-H/Font resourcestatus
-									{pop pop/Jun101-Light}
-									{SansSerif}
-									ifelse
-								}
-								ifelse
-							}
-							{
-								/Jun101-Light-RKSJ-H/Font resourcestatus
-								{pop pop/Jun101-Light}
-								{SansSerif}
-								ifelse
-							}
-							ifelse
-								}
-								ifelse
-								/RoundSansSerif exch def
-								/Default Serif def
-								}
-								{
-								/Serif/Ryumin-Light def
-								/SansSerif/GothicBBB-Medium def
-								{
-								(fonts/Jun101-Light-83pv-RKSJ-H)status
-								}stopped
-								{pop}{
-										 {pop pop pop pop/Jun101-Light}
-										 {SansSerif}
-										 ifelse
-										 /RoundSansSerif exch def
-								}ifelse
-								/Default Serif def
-								}
-					 ifelse
-		 end
-		 def
-		 /Adobe-Korea1 4 dict dup begin
-					/Serif/HYSMyeongJo-Medium def
-					/SansSerif/HYGoThic-Medium def
-					/RoundSansSerif SansSerif def
-					/Default Serif def
-		 end
-		 def
-		 /Adobe-GB1 4 dict dup begin
-					/Serif/STSong-Light def
-					/SansSerif/STHeiti-Regular def
-					/RoundSansSerif SansSerif def
-					/Default Serif def
-		 end
-		 def
-		 /Adobe-CNS1 4 dict dup begin
-					/Serif/MKai-Medium def
-					/SansSerif/MHei-Medium def
-					/RoundSansSerif SansSerif def
-					/Default Serif def
-		 end
-		 def
-end
-def
-Level2?{currentglobal true setglobal}if
-/ct_BoldRomanWidthProc 
-	{
-	stringwidth 1 index 0 ne{exch .03 add exch}if setcharwidth
-	0 0
-	}bind def
-/ct_Type0WidthProc 
-	{
-	 dup stringwidth 0 0 moveto 
-	 2 index true charpath pathbbox
-	 0 -1 
-	 7 index 2 div .88 
-	 setcachedevice2
-	 pop
-	0 0
-	}bind def
-/ct_Type0WMode1WidthProc 
-	{
-	 dup stringwidth 
-	 pop 2 div neg -0.88
-	2 copy
-	moveto 
-	0 -1
-	 5 -1 roll true charpath pathbbox
-	 setcachedevice
-	}bind def
-/cHexEncoding
-[/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12
-/c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25
-/c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38
-/c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B
-/c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E
-/c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71
-/c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84
-/c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97
-/c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA
-/cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD
-/cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0
-/cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3
-/cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6
-/cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def
-/ct_BoldBaseFont 
-	 11 dict begin
-		/FontType 3 def
-		/FontMatrix[1 0 0 1 0 0]def
-		/FontBBox[0 0 1 1]def
-		/Encoding cHexEncoding def 
-		/_setwidthProc/ct_BoldRomanWidthProc load def
-		/_bcstr1 1 string def
-		/BuildChar
-		{
-			exch begin
-				_basefont setfont
-				_bcstr1 dup 0 4 -1 roll put
-				dup 
-				_setwidthProc
-				3 copy 
-				moveto				
-				show
-				_basefonto setfont
-				moveto
-				show
-			end
-		}bind def
-		 currentdict
-	 end 
-def
-systemdict/composefont known
-{
-/ct_DefineIdentity-H
-{
-	/Identity-H/CMap resourcestatus
-	{
-		pop pop
-	}
-	{
-		/CIDInit/ProcSet findresource begin
-		 12 dict begin
-		 begincmap
-		 /CIDSystemInfo 3 dict dup begin
-			 /Registry(Adobe)def
-			 /Ordering(Identity)def
-			 /Supplement 0 def
-		 end def
-		 /CMapName/Identity-H def
-		 /CMapVersion 1.000 def
-		 /CMapType 1 def
-		 1 begincodespacerange
-		 <0000>
-		 endcodespacerange
-		 1 begincidrange
-		 <0000>0
-		 endcidrange
-		 endcmap
-		 CMapName currentdict/CMap defineresource pop
-		 end
-		 end
-	 }
-	 ifelse
-}
-def
-/ct_BoldBaseCIDFont 
-	 11 dict begin
-		/CIDFontType 1 def
-		/CIDFontName/ct_BoldBaseCIDFont def
-		/FontMatrix[1 0 0 1 0 0]def
-		/FontBBox[0 0 1 1]def
-		/_setwidthProc/ct_Type0WidthProc load def
-		/_bcstr2 2 string def
-		/BuildGlyph
-		{
-			exch begin		 
-				_basefont setfont
-				_bcstr2 1 2 index 256 mod put
-				_bcstr2 0 3 -1 roll 256 idiv put
-				_bcstr2 dup _setwidthProc		 
-				3 copy 
-				moveto
-				show
-				_basefonto setfont
-				moveto
-				show
-			end
-		}bind def
-		 currentdict
-	 end 
-def
-}if
-Level2?{setglobal}if
-/ct_CopyFont{
-	{
-		1 index/FID ne 2 index/UniqueID ne and
-		{def}{pop pop}ifelse
-	}forall
-}bind def
-/ct_Type0CopyFont 
-{
-	exch
-	dup length dict
-	begin
-	ct_CopyFont
-	[
-	exch
-	FDepVector 
-	{
-		 dup/FontType get 0 eq
-		{	
-		1 index ct_Type0CopyFont 
-		/_ctType0 exch definefont
-		}
-		{
-		/_ctBaseFont exch
-		2 index exec
-		}
-		 ifelse 
-		 exch
-	}
-	forall 
-	pop
-	]				
-	/FDepVector exch def
-	currentdict
-	end
-}bind def
-/ct_MakeBoldFont
-{
-	 dup/ct_SyntheticBold known
-	{
-		dup length 3 add dict begin 
-		ct_CopyFont 
-		/ct_StrokeWidth .03 0 FontMatrix idtransform pop def 
-		/ct_SyntheticBold true def
-		currentdict 
-		end 
-		definefont
-	}
-	{
-		dup dup length 3 add dict
-		begin
-			ct_CopyFont
-			/PaintType 2 def
-			/StrokeWidth .03 0 FontMatrix idtransform pop def
-			/dummybold currentdict
-		end
-		definefont
-		dup/FontType get dup 9 ge exch 11 le and 
-		{
-			ct_BoldBaseCIDFont
-			dup length 3 add dict copy begin
-			dup/CIDSystemInfo get/CIDSystemInfo exch def
-			ct_DefineIdentity-H
-			/_Type0Identity/Identity-H 3 -1 roll[exch]composefont
-			/_basefont exch def
-			/_Type0Identity/Identity-H 3 -1 roll[exch]composefont
-			/_basefonto exch def
-			currentdict
-			end
-			/CIDFont defineresource
-		}
-		{
-			ct_BoldBaseFont
-			dup length 3 add dict copy begin
-			/_basefont exch def
-			/_basefonto exch def
-			currentdict
-			end
-			definefont
-		}
-		ifelse
-	}
-	ifelse
-}bind def
-/ct_MakeBold{
-	1 index 
-	1 index
-	findfont
-	currentglobal 5 1 roll
-	dup gcheck setglobal
-		dup
-		 /FontType get 0 eq
-			{
-				dup/WMode known{dup/WMode get 1 eq}{false}ifelse
-				version length 4 ge
-				and
-					{version 0 4 getinterval cvi 2015 ge}
-					{true}
-				ifelse 
-					{/ct_Type0WidthProc}
-					{/ct_Type0WMode1WidthProc}
-				ifelse
-				ct_BoldBaseFont/_setwidthProc 3 -1 roll load put
-						{ct_MakeBoldFont}ct_Type0CopyFont definefont
-			}
-			{
-				dup/_fauxfont known not 1 index/SubstMaster known not and
-				{
-					 ct_BoldBaseFont/_setwidthProc /ct_BoldRomanWidthProc load put
-					 ct_MakeBoldFont 
-				}
-				{
-				2 index 2 index eq
-					{exch pop	}
-					{
-						dup length dict begin
-						ct_CopyFont
-						currentdict
-						end
-						definefont 
-					}
-				ifelse
-				}
-			ifelse
-			}
-		 ifelse
-		 pop pop pop
-		 setglobal
-}bind def
-/?str1 256 string def
-/?set
-	{
-	$SubstituteFont
-		begin
-		/$substituteFound false def
-		/$fontname 1 index def
-		/$doSmartSub false def
-		end
-	dup
-	 findfont
-	$SubstituteFont
-		begin
-		$substituteFound
-			{false}
-			{
-			dup/FontName known
-				{
-				dup/FontName get $fontname eq
-				1 index/DistillerFauxFont known not and
-				/currentdistillerparams where
-					{pop false 2 index isWidthsOnlyFont not and}
-				if
-				}
-				{false}
-			ifelse
-			}
-		ifelse
-		exch pop
-		/$doSmartSub true def
-		end
-		{
-		5 1 roll pop pop pop pop
-		findfont
-		}
-		{
-		1 index
-		findfont
-		dup/FontType get 3 eq
-		{
-			6 1 roll pop pop pop pop pop false
-		}
-		{pop true}
-		ifelse
-		{
-		$SubstituteFont
-		begin
-		pop pop
-		/$styleArray 1 index def
-		/$regOrdering 2 index def
-		pop pop
-		0 1 $styleArray length 1 sub
-		{
-			$styleArray exch get
-			ct_StyleDicts $regOrdering
-			2 copy known
-			{
-				get
-				exch 2 copy known not
-				{pop/Default}
-				if
-				get
-				dup type/nametype eq
-				{
-				?str1 cvs length dup 1 add exch
-				?str1 exch(-)putinterval
-				exch dup length exch ?str1 exch 3 index exch putinterval
-				add ?str1 exch 0 exch getinterval cvn
-				}
-				{
-				pop pop/Unknown
-				}
-				ifelse
-			}
-			{
-				pop pop pop pop/Unknown
-			}
-			ifelse
-		}
-		for
-		end
-		findfont 
-		}if
-		}
-	ifelse
-	currentglobal false setglobal 3 1 roll
-	null copyfont definefont pop
-	setglobal
-	}bind def
-setpacking
-userdict/$SubstituteFont 25 dict put
-1 dict
-	begin
-	/SubstituteFont
-		dup $error exch 2 copy known
-			{get}
-			{pop pop{pop/Courier}bind}
-		ifelse def
-	/currentdistillerparams where dup
-		{
-		pop pop
-		currentdistillerparams/CannotEmbedFontPolicy 2 copy known
-			{get/Error eq}
-			{pop pop false}
-		ifelse
-		}
-	if not
-		{
-		countdictstack array dictstack 0 get
-			begin
-			userdict
-				begin
-				$SubstituteFont
-					begin
-					/$str 128 string def
-					/$fontpat 128 string def
-					/$slen 0 def
-					/$sname null def
-					/$match false def
-					/$fontname null def
-					/$substituteFound false def
-					/$inVMIndex null def
-					/$doSmartSub true def
-					/$depth 0 def
-					/$fontname null def
-					/$italicangle 26.5 def
-					/$dstack null def
-					/$Strategies 10 dict dup
-						begin
-						/$Type3Underprint
-							{
-							currentglobal exch false setglobal
-							11 dict
-								begin
-								/UseFont exch
-									$WMode 0 ne
-										{
-										dup length dict copy
-										dup/WMode $WMode put
-										/UseFont exch definefont
-										}
-									if def
-								/FontName $fontname dup type/stringtype eq{cvn}if def
-								/FontType 3 def
-								/FontMatrix[.001 0 0 .001 0 0]def
-								/Encoding 256 array dup 0 1 255{/.notdef put dup}for pop def
-								/FontBBox[0 0 0 0]def
-								/CCInfo 7 dict dup
-									begin
-									/cc null def
-									/x 0 def
-									/y 0 def
-									end def
-								/BuildChar
-									{
-									exch
-										begin
-										CCInfo
-											begin
-											1 string dup 0 3 index put exch pop
-											/cc exch def
-											UseFont 1000 scalefont setfont
-											cc stringwidth/y exch def/x exch def
-											x y setcharwidth
-											$SubstituteFont/$Strategy get/$Underprint get exec
-											0 0 moveto cc show
-											x y moveto
-											end
-										end
-									}bind def
-								currentdict
-								end
-							exch setglobal
-							}bind def
-						/$GetaTint
-							2 dict dup
-								begin
-								/$BuildFont
-									{
-									dup/WMode known
-										{dup/WMode get}
-										{0}
-									ifelse
-									/$WMode exch def
-									$fontname exch
-									dup/FontName known
-										{
-										dup/FontName get
-										dup type/stringtype eq{cvn}if
-										}
-										{/unnamedfont}
-									ifelse
-									exch
-									Adobe_CoolType_Data/InVMDeepCopiedFonts get
-									1 index/FontName get known
-										{
-										pop
-										Adobe_CoolType_Data/InVMDeepCopiedFonts get
-										1 index get
-										null copyfont
-										}
-										{$deepcopyfont}
-									ifelse
-									exch 1 index exch/FontBasedOn exch put
-									dup/FontName $fontname dup type/stringtype eq{cvn}if put
-									definefont
-									Adobe_CoolType_Data/InVMDeepCopiedFonts get
-										begin
-										dup/FontBasedOn get 1 index def
-										end
-									}bind def
-								/$Underprint
-									{
-									gsave
-									x abs y abs gt
-										{/y 1000 def}
-										{/x -1000 def 500 120 translate}
-									ifelse
-									Level2?
-										{
-										[/Separation(All)/DeviceCMYK{0 0 0 1 pop}]
-										setcolorspace
-										}
-										{0 setgray}
-									ifelse
-									10 setlinewidth
-									x .8 mul
-									[7 3]
-										{
-										y mul 8 div 120 sub x 10 div exch moveto
-										0 y 4 div neg rlineto
-										dup 0 rlineto
-										0 y 4 div rlineto
-										closepath
-										gsave
-										Level2?
-											{.2 setcolor}
-											{.8 setgray}
-										ifelse
-										fill grestore
-										stroke
-										}
-									forall
-									pop
-									grestore
-									}bind def
-								end def
-						/$Oblique
-							1 dict dup
-								begin
-								/$BuildFont
-									{
-									currentglobal exch dup gcheck setglobal
-									null copyfont
-										begin
-										/FontBasedOn
-										currentdict/FontName known
-											{
-											FontName
-											dup type/stringtype eq{cvn}if
-											}
-											{/unnamedfont}
-										ifelse
-										def
-										/FontName $fontname dup type/stringtype eq{cvn}if def
-										/currentdistillerparams where
-											{pop}
-											{
-											/FontInfo currentdict/FontInfo known
-												{FontInfo null copyfont}
-												{2 dict}
-											ifelse
-											dup
-												begin
-												/ItalicAngle $italicangle def
-												/FontMatrix FontMatrix
-												[1 0 ItalicAngle dup sin exch cos div 1 0 0]
-												matrix concatmatrix readonly
-												end
-											4 2 roll def
-											def
-											}
-										ifelse
-										FontName currentdict
-										end
-									definefont
-									exch setglobal
-									}bind def
-								end def
-						/$None
-							1 dict dup
-								begin
-								/$BuildFont{}bind def
-								end def
-						end def
-					/$Oblique SetSubstituteStrategy
-					/$findfontByEnum
-						{
-						dup type/stringtype eq{cvn}if
-						dup/$fontname exch def
-						$sname null eq
-							{$str cvs dup length $slen sub $slen getinterval}
-							{pop $sname}
-						ifelse
-						$fontpat dup 0(fonts/*)putinterval exch 7 exch putinterval
-						/$match false def
-						$SubstituteFont/$dstack countdictstack array dictstack put
-						mark
-							{
-							$fontpat 0 $slen 7 add getinterval
-								{/$match exch def exit}
-							$str filenameforall
-							}
-						stopped
-							{
-							cleardictstack
-							currentdict
-							true
-							$SubstituteFont/$dstack get
-								{
-								exch
-									{
-									1 index eq
-										{pop false}
-										{true}
-									ifelse
-									}
-									{begin false}
-								ifelse
-								}
-							forall
-							pop
-							}
-						if
-						cleartomark
-						/$slen 0 def
-						$match false ne
-							{$match(fonts/)anchorsearch pop pop cvn}
-							{/Courier}
-						ifelse
-						}bind def
-					/$ROS 1 dict dup
-						begin
-						/Adobe 4 dict dup
-							begin
-							/Japan1 [/Ryumin-Light/HeiseiMin-W3
-										 /GothicBBB-Medium/HeiseiKakuGo-W5
-										 /HeiseiMaruGo-W4/Jun101-Light]def
-							/Korea1 [/HYSMyeongJo-Medium/HYGoThic-Medium]def
-							/GB1	 [/STSong-Light/STHeiti-Regular]def
-							/CNS1	[/MKai-Medium/MHei-Medium]def
-							end def
-						end def
-					/$cmapname null def
-					/$deepcopyfont
-						{
-						dup/FontType get 0 eq
-							{
-							1 dict dup/FontName/copied put copyfont
-								begin
-								/FDepVector FDepVector copyarray
-								0 1 2 index length 1 sub
-									{
-									2 copy get $deepcopyfont
-									dup/FontName/copied put
-									/copied exch definefont
-									3 copy put pop pop
-									}
-								for
-								def
-								currentdict
-								end
-							}
-							{$Strategies/$Type3Underprint get exec}
-						ifelse
-						}bind def
-					/$buildfontname
-						{
-						dup/CIDFont findresource/CIDSystemInfo get
-							begin
-							Registry length Ordering length Supplement 8 string cvs
-							3 copy length 2 add add add string
-							dup 5 1 roll dup 0 Registry putinterval
-							dup 4 index(-)putinterval
-							dup 4 index 1 add Ordering putinterval
-							4 2 roll add 1 add 2 copy(-)putinterval
-							end
-						1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch
-						anchorsearch
-							{pop pop 3 2 roll putinterval cvn/$cmapname exch def}
-							{pop pop pop pop pop}
-						ifelse
-						length
-						$str 1 index(-)putinterval 1 add
-						$str 1 index $cmapname $fontpat cvs putinterval
-						$cmapname length add
-						$str exch 0 exch getinterval cvn
-						}bind def
-					/$findfontByROS
-						{
-						/$fontname exch def
-						$ROS Registry 2 copy known
-							{
-							get Ordering 2 copy known
-								{get}
-								{pop pop[]}
-							ifelse
-							}
-							{pop pop[]}
-						ifelse
-						false exch
-							{
-							dup/CIDFont resourcestatus
-								{
-								pop pop
-								save
-								1 index/CIDFont findresource
-								dup/WidthsOnly known
-									{dup/WidthsOnly get}
-									{false}
-								ifelse
-								exch pop
-								exch restore
-									{pop}
-									{exch pop true exit}
-								ifelse
-								}
-								{pop}
-							ifelse
-							}
-						forall
-							{$str cvs $buildfontname}
-							{
-							false(*)
-								{
-								save exch
-								dup/CIDFont findresource
-								dup/WidthsOnly known
-									{dup/WidthsOnly get not}
-									{true}
-								ifelse
-								exch/CIDSystemInfo get
-								dup/Registry get Registry eq
-								exch/Ordering get Ordering eq and and
-									{exch restore exch pop true exit}
-									{pop restore}
-								ifelse
-								}
-							$str/CIDFont resourceforall
-								{$buildfontname}
-								{$fontname $findfontByEnum}
-							ifelse
-							}
-						ifelse
-						}bind def
-					end
-				end
-				currentdict/$error known currentdict/languagelevel known and dup
-					{pop $error/SubstituteFont known}
-				if
-				dup
-					{$error}
-					{Adobe_CoolType_Core}
-				ifelse
-				begin
-					{
-					/SubstituteFont
-					/CMap/Category resourcestatus
-						{
-						pop pop
-						{
-						$SubstituteFont
-							begin
-							/$substituteFound true def
-							dup length $slen gt
-							$sname null ne or
-							$slen 0 gt and
-								{
-								$sname null eq
-									{dup $str cvs dup length $slen sub $slen getinterval cvn}
-									{$sname}
-								ifelse
-								Adobe_CoolType_Data/InVMFontsByCMap get
-								1 index 2 copy known
-									{
-									get
-									false exch
-										{
-										pop
-										currentglobal
-											{
-											GlobalFontDirectory 1 index known
-												{exch pop true exit}
-												{pop}
-											ifelse
-											}
-											{
-											FontDirectory 1 index known
-												{exch pop true exit}
-												{
-												GlobalFontDirectory 1 index known
-													{exch pop true exit}
-													{pop}
-												ifelse
-												}
-											ifelse
-											}
-										ifelse
-										}
-									forall
-									}
-									{pop pop false}
-								ifelse
-									{
-									exch pop exch pop
-									}
-									{
-									dup/CMap resourcestatus
-										{
-										pop pop
-										dup/$cmapname exch def
-										/CMap findresource/CIDSystemInfo get{def}forall
-										$findfontByROS
-										}
-										{
-										128 string cvs
-										dup(-)search
-											{
-											3 1 roll search
-												{
-												3 1 roll pop
-													{dup cvi}
-												stopped
-													{pop pop pop pop pop $findfontByEnum}
-													{
-													4 2 roll pop pop
-													exch length
-													exch
-													2 index length
-													2 index
-													sub
-													exch 1 sub -1 0
-														{
-														$str cvs dup length
-														4 index
-														0
-														4 index
-														4 3 roll add
-														getinterval
-														exch 1 index exch 3 index exch
-														putinterval
-														dup/CMap resourcestatus
-															{
-															pop pop
-															4 1 roll pop pop pop
-															dup/$cmapname exch def
-															/CMap findresource/CIDSystemInfo get{def}forall
-															$findfontByROS
-															true exit
-															}
-															{pop}
-														ifelse
-														}
-													for
-													dup type/booleantype eq
-														{pop}
-														{pop pop pop $findfontByEnum}
-													ifelse
-													}
-												ifelse
-												}
-												{pop pop pop $findfontByEnum}
-											ifelse
-											}
-											{pop pop $findfontByEnum}
-										ifelse
-										}
-									ifelse
-									}
-								ifelse
-								}
-								{//SubstituteFont exec}
-							ifelse
-							/$slen 0 def
-							end
-						}
-						}
-						{
-						{
-						$SubstituteFont
-							begin
-							/$substituteFound true def
-							dup length $slen gt
-							$sname null ne or
-							$slen 0 gt and
-								{$findfontByEnum}
-								{//SubstituteFont exec}
-							ifelse
-							end
-						}
-						}
-					ifelse
-					bind readonly def
-					Adobe_CoolType_Core/scfindfont/systemfindfont load put
-					}
-					{
-					/scfindfont
-						{
-						$SubstituteFont
-							begin
-							dup systemfindfont
-							dup/FontName known
-								{dup/FontName get dup 3 index ne}
-								{/noname true}
-							ifelse
-							dup
-								{
-								/$origfontnamefound 2 index def
-								/$origfontname 4 index def/$substituteFound true def
-								}
-							if
-							exch pop
-								{
-								$slen 0 gt
-								$sname null ne
-								3 index length $slen gt or and
-									{
-									pop dup $findfontByEnum findfont
-									dup maxlength 1 add dict
-										begin
-											{1 index/FID eq{pop pop}{def}ifelse}
-										forall
-										currentdict
-										end
-									definefont
-									dup/FontName known{dup/FontName get}{null}ifelse
-									$origfontnamefound ne
-										{
-										$origfontname $str cvs print
-										( substitution revised, using )print
-										dup/FontName known
-											{dup/FontName get}{(unspecified font)}
-										ifelse
-										$str cvs print(.\n)print
-										}
-									if
-									}
-									{exch pop}
-								ifelse
-								}
-								{exch pop}
-							ifelse
-							end
-						}bind def
-					}
-				ifelse
-				end
-			end
-		Adobe_CoolType_Core_Defined not
-			{
-			Adobe_CoolType_Core/findfont
-				{
-				$SubstituteFont
-					begin
-					$depth 0 eq
-						{
-						/$fontname 1 index dup type/stringtype ne{$str cvs}if def
-						/$substituteFound false def
-						}
-					if
-					/$depth $depth 1 add def
-					end
-				scfindfont
-				$SubstituteFont
-					begin
-					/$depth $depth 1 sub def
-					$substituteFound $depth 0 eq and
-						{
-						$inVMIndex null ne
-							{dup $inVMIndex $AddInVMFont}
-						if
-						$doSmartSub
-							{
-							currentdict/$Strategy known
-								{$Strategy/$BuildFont get exec}
-							if
-							}
-						if
-						}
-					if
-					end
-				}bind put
-			}
-		if
-		}
-	if
-	end
-/$AddInVMFont
-	{
-	exch/FontName 2 copy known
-		{
-		get
-		1 dict dup begin exch 1 index gcheck def end exch
-		Adobe_CoolType_Data/InVMFontsByCMap get exch
-		$DictAdd
-		}
-		{pop pop pop}
-	ifelse
-	}bind def
-/$DictAdd
-	{
-	2 copy known not
-		{2 copy 4 index length dict put}
-	if
-	Level2? not
-		{
-		2 copy get dup maxlength exch length 4 index length add lt
-		2 copy get dup length 4 index length add exch maxlength 1 index lt
-			{
-			2 mul dict
-				begin
-				2 copy get{forall}def
-				2 copy currentdict put
-				end
-			}
-			{pop}
-		ifelse
-		}
-	if
-	get
-		begin
-			{def}
-		forall
-		end
-	}bind def
-end
-end
-%%EndResource
-currentglobal true setglobal
-%%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.23 0
-%%Copyright: Copyright 1987-2006 Adobe Systems Incorporated.
-%%Version: 1.23 0
-systemdict/languagelevel known dup
-	{currentglobal false setglobal}
-	{false}
-ifelse
-exch
-userdict/Adobe_CoolType_Utility 2 copy known
-	{2 copy get dup maxlength 27 add dict copy}
-	{27 dict}
-ifelse put
-Adobe_CoolType_Utility
-	begin
-	/@eexecStartData
-		 def
-	/@recognizeCIDFont null def
-	/ct_Level2? exch def
-	/ct_Clone? 1183615869 internaldict dup
-			/CCRun known not
-			exch/eCCRun known not
-			ct_Level2? and or def
-ct_Level2?
-	{globaldict begin currentglobal true setglobal}
-if
-	/ct_AddStdCIDMap
-		ct_Level2?
-			{{
-				mark
-				Adobe_CoolType_Utility/@recognizeCIDFont currentdict put
-					{
-					((Hex)57 StartData
-					 0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0
-					 7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60
-					 d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8
-					 cc36 74f4 1144 b13b 77)0()/SubFileDecode filter cvx exec
-					}
-				stopped
-					{
-					 cleartomark
-					 Adobe_CoolType_Utility/@recognizeCIDFont get
-					 countdictstack dup array dictstack
-					 exch 1 sub -1 0
-						 {
-						 2 copy get 3 index eq
-								{1 index length exch sub 1 sub{end}repeat exit}
-								{pop}
-						 ifelse
-						 }
-					 for
-					 pop pop
-					 Adobe_CoolType_Utility/@eexecStartData get eexec
-					}
-					{cleartomark}
-				ifelse
-			}}
-			{{
-				Adobe_CoolType_Utility/@eexecStartData get eexec
-			}}
-		ifelse bind def
-userdict/cid_extensions known
-dup{cid_extensions/cid_UpdateDB known and}if
-	{
-	 cid_extensions
-	 begin
-	/cid_GetCIDSystemInfo
-		{
-		 1 index type/stringtype eq
-			{exch cvn exch}
-		 if
-		 cid_extensions
-			 begin
-			 dup load 2 index known
-				{
-				 2 copy
-				 cid_GetStatusInfo
-				 dup null ne
-					{
-					 1 index load
-					 3 index get
-					 dup null eq
-						 {pop pop cid_UpdateDB}
-						 {
-						 exch
-						 1 index/Created get eq
-							 {exch pop exch pop}
-							 {pop cid_UpdateDB}
-						 ifelse
-						 }
-					 ifelse
-					}
-					{pop cid_UpdateDB}
-				 ifelse
-				}
-				{cid_UpdateDB}
-			 ifelse
-			 end
-		}bind def
-	 end
-	}
-if
-ct_Level2?
-	{end setglobal}
-if
-	/ct_UseNativeCapability? systemdict/composefont known def
-	/ct_MakeOCF 35 dict def
-	/ct_Vars 25 dict def
-	/ct_GlyphDirProcs 6 dict def
-	/ct_BuildCharDict 15 dict dup
-		begin
-		/charcode 2 string def
-		/dst_string 1500 string def
-		/nullstring()def
-		/usewidths? true def
-		end def
-	ct_Level2?{setglobal}{pop}ifelse
-	ct_GlyphDirProcs
-		begin
-		/GetGlyphDirectory
-			{
-			systemdict/languagelevel known
-				{pop/CIDFont findresource/GlyphDirectory get}
-				{
-				1 index/CIDFont findresource/GlyphDirectory
-				get dup type/dicttype eq
-					{
-					dup dup maxlength exch length sub 2 index lt
-						{
-						dup length 2 index add dict copy 2 index
-						/CIDFont findresource/GlyphDirectory 2 index put
-						}
-					if
-					}
-				if
-				exch pop exch pop
-				}
-			ifelse
-			+
-			}def
-		/+
-			{
-			systemdict/languagelevel known
-				{
-				currentglobal false setglobal
-				3 dict begin
-					/vm exch def
-				}
-				{1 dict begin}
-			ifelse
-			/$ exch def
-			systemdict/languagelevel known
-				{
-				vm setglobal
-				/gvm currentglobal def
-				$ gcheck setglobal
-				}
-			if
-			?{$ begin}if
-			}def
-		/?{$ type/dicttype eq}def
-		/|{
-			userdict/Adobe_CoolType_Data known
-				{
-			Adobe_CoolType_Data/AddWidths? known
-				{
-				 currentdict Adobe_CoolType_Data
-					begin
-					 begin
-						AddWidths?
-								{
-								Adobe_CoolType_Data/CC 3 index put
-								?{def}{$ 3 1 roll put}ifelse
-								CC charcode exch 1 index 0 2 index 256 idiv put
-								1 index exch 1 exch 256 mod put
-								stringwidth 2 array astore
-								currentfont/Widths get exch CC exch put
-								}
-								{?{def}{$ 3 1 roll put}ifelse}
-							ifelse
-					end
-				end
-				}
-				{?{def}{$ 3 1 roll put}ifelse}	ifelse
-				}
-				{?{def}{$ 3 1 roll put}ifelse}
-			ifelse
-			}def
-		/!
-			{
-			?{end}if
-			systemdict/languagelevel known
-				{gvm setglobal}
-			if
-			end
-			}def
-		/:{string currentfile exch readstring pop}executeonly def
-		end
-	ct_MakeOCF
-		begin
-		/ct_cHexEncoding
-		[/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12
-		/c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25
-		/c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38
-		/c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B
-		/c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E
-		/c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71
-		/c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84
-		/c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97
-		/c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA
-		/cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD
-		/cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0
-		/cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3
-		/cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6
-		/cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def
-		/ct_CID_STR_SIZE 8000 def
-		/ct_mkocfStr100 100 string def
-		/ct_defaultFontMtx[.001 0 0 .001 0 0]def
-		/ct_1000Mtx[1000 0 0 1000 0 0]def
-		/ct_raise{exch cvx exch errordict exch get exec stop}bind def
-		/ct_reraise
-			{cvx $error/errorname get(Error: )print dup(						 )cvs print
-					errordict exch get exec stop
-			}bind def
-		/ct_cvnsi
-			{
-			1 index add 1 sub 1 exch 0 4 1 roll
-				{
-				2 index exch get
-				exch 8 bitshift
-				add
-				}
-			for
-			exch pop
-			}bind def
-		/ct_GetInterval
-			{
-			Adobe_CoolType_Utility/ct_BuildCharDict get
-				begin
-				/dst_index 0 def
-				dup dst_string length gt
-					{dup string/dst_string exch def}
-				if
-				1 index ct_CID_STR_SIZE idiv
-				/arrayIndex exch def
-				2 index arrayIndex get
-				2 index
-				arrayIndex ct_CID_STR_SIZE mul
-				sub
-					{
-					dup 3 index add 2 index length le
-						{
-						2 index getinterval
-						dst_string dst_index 2 index putinterval
-						length dst_index add/dst_index exch def
-						exit
-						}
-						{
-						1 index length 1 index sub
-						dup 4 1 roll
-						getinterval
-						dst_string dst_index 2 index putinterval
-						pop dup dst_index add/dst_index exch def
-						sub
-						/arrayIndex arrayIndex 1 add def
-						2 index dup length arrayIndex gt
-							 {arrayIndex get}
-							 {
-							 pop
-							 exit
-							 }
-						ifelse
-						0
-						}
-					ifelse
-					}
-				loop
-				pop pop pop
-				dst_string 0 dst_index getinterval
-				end
-			}bind def
-		ct_Level2?
-			{
-			/ct_resourcestatus
-			currentglobal mark true setglobal
-				{/unknowninstancename/Category resourcestatus}
-			stopped
-				{cleartomark setglobal true}
-				{cleartomark currentglobal not exch setglobal}
-			ifelse
-				{
-					{
-					mark 3 1 roll/Category findresource
-						begin
-						ct_Vars/vm currentglobal put
-						({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec
-							{cleartomark false}
-							{{3 2 roll pop true}{cleartomark false}ifelse}
-						ifelse
-						ct_Vars/vm get setglobal
-						end
-					}
-				}
-				{{resourcestatus}}
-			ifelse bind def
-			/CIDFont/Category ct_resourcestatus
-				{pop pop}
-				{
-				currentglobal true setglobal
-				/Generic/Category findresource
-				dup length dict copy
-				dup/InstanceType/dicttype put
-				/CIDFont exch/Category defineresource pop
-				setglobal
-				}
-			ifelse
-			ct_UseNativeCapability?
-				{
-				/CIDInit/ProcSet findresource begin
-				12 dict begin
-				begincmap
-				/CIDSystemInfo 3 dict dup begin
-				 /Registry(Adobe)def
-				 /Ordering(Identity)def
-				 /Supplement 0 def
-				end def
-				/CMapName/Identity-H def
-				/CMapVersion 1.000 def
-				/CMapType 1 def
-				1 begincodespacerange
-				<0000>
-				endcodespacerange
-				1 begincidrange
-				<0000>0
-				endcidrange
-				endcmap
-				CMapName currentdict/CMap defineresource pop
-				end
-				end
-				}
-			if
-			}
-			{
-			/ct_Category 2 dict begin
-			/CIDFont 10 dict def
-			/ProcSet	2 dict def
-			currentdict
-			end
-			def
-			/defineresource
-				{
-				ct_Category 1 index 2 copy known
-					{
-					get
-					dup dup maxlength exch length eq
-						{
-						dup length 10 add dict copy
-						ct_Category 2 index 2 index put
-						}
-					if
-					3 index 3 index put
-					pop exch pop
-					}
-					{pop pop/defineresource/undefined ct_raise}
-				ifelse
-				}bind def
-			/findresource
-				{
-				ct_Category 1 index 2 copy known
-					{
-					get
-					2 index 2 copy known
-						{get 3 1 roll pop pop}
-						{pop pop/findresource/undefinedresource ct_raise}
-					ifelse
-					}
-					{pop pop/findresource/undefined ct_raise}
-				ifelse
-				}bind def
-			/resourcestatus
-				{
-				ct_Category 1 index 2 copy known
-					{
-					get
-					2 index known
-					exch pop exch pop
-						{
-						0 -1 true
-						}
-						{
-						false
-						}
-					ifelse
-					}
-					{pop pop/findresource/undefined ct_raise}
-				ifelse
-				}bind def
-			/ct_resourcestatus/resourcestatus load def
-			}
-		ifelse
-		/ct_CIDInit 2 dict
-			begin
-			/ct_cidfont_stream_init
-				{
-					{
-					dup(Binary)eq
-						{
-						pop
-						null
-						currentfile
-						ct_Level2?
-							{
-								{cid_BYTE_COUNT()/SubFileDecode filter}
-							stopped
-								{pop pop pop}
-							if
-							}
-						if
-						/readstring load
-						exit
-						}
-					if
-					dup(Hex)eq
-						{
-						pop
-						currentfile
-						ct_Level2?
-							{
-								{null exch/ASCIIHexDecode filter/readstring}
-							stopped
-								{pop exch pop(>)exch/readhexstring}
-							if
-							}
-							{(>)exch/readhexstring}
-						ifelse
-						load
-						exit
-						}
-					if
-					/StartData/typecheck ct_raise
-					}
-				loop
-				cid_BYTE_COUNT ct_CID_STR_SIZE le
-					{
-					2 copy cid_BYTE_COUNT string exch exec
-					pop
-					1 array dup
-					3 -1 roll
-					0 exch put
-					}
-					{
-					cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi
-					dup array exch 2 sub 0 exch 1 exch
-						{
-						2 copy
-						5 index
-						ct_CID_STR_SIZE
-						string
-						6 index exec
-						pop
-						put
-						pop
-						}
-					for
-					2 index
-					cid_BYTE_COUNT ct_CID_STR_SIZE mod string
-					3 index exec
-					pop
-					1 index exch
-					1 index length 1 sub
-					exch put
-					}
-				ifelse
-				cid_CIDFONT exch/GlyphData exch put
-				2 index null eq
-					{
-					pop pop pop
-					}
-					{
-					pop/readstring load
-					1 string exch
-						{
-						3 copy exec
-						pop
-						dup length 0 eq
-							{
-							pop pop pop pop pop
-							true exit
-							}
-						if
-						4 index
-						eq
-							{
-							pop pop pop pop
-							false exit
-							}
-						if
-						}
-					loop
-					pop
-					}
-				ifelse
-				}bind def
-			/StartData
-				{
-				mark
-					{
-					currentdict
-					dup/FDArray get 0 get/FontMatrix get
-					0 get 0.001 eq
-						{
-						dup/CDevProc known not
-							{
-							/CDevProc 1183615869 internaldict/stdCDevProc 2 copy known
-								{get}
-								{
-								pop pop
-								{pop pop pop pop pop 0 -1000 7 index 2 div 880}
-								}
-							ifelse
-							def
-							}
-						if
-						}
-						{
-						/CDevProc
-							{
-							 pop pop pop pop pop
-							 0
-							 1 cid_temp/cid_CIDFONT get
-							/FDArray get 0 get
-							/FontMatrix get 0 get div
-							 7 index 2 div
-							 1 index 0.88 mul
-							}def
-						}
-					ifelse
-					/cid_temp 15 dict def
-					cid_temp
-						begin
-						/cid_CIDFONT exch def
-						3 copy pop
-						dup/cid_BYTE_COUNT exch def 0 gt
-							{
-							ct_cidfont_stream_init
-							FDArray
-								{
-								/Private get
-								dup/SubrMapOffset known
-									{
-									begin
-									/Subrs SubrCount array def
-									Subrs
-									SubrMapOffset
-									SubrCount
-									SDBytes
-									ct_Level2?
-										{
-										currentdict dup/SubrMapOffset undef
-										dup/SubrCount undef
-										/SDBytes undef
-										}
-									if
-									end
-									/cid_SD_BYTES exch def
-									/cid_SUBR_COUNT exch def
-									/cid_SUBR_MAP_OFFSET exch def
-									/cid_SUBRS exch def
-									cid_SUBR_COUNT 0 gt
-										{
-										GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval
-										0 cid_SD_BYTES ct_cvnsi
-										0 1 cid_SUBR_COUNT 1 sub
-											{
-											exch 1 index
-											1 add
-											cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add
-											GlyphData exch cid_SD_BYTES ct_GetInterval
-											0 cid_SD_BYTES ct_cvnsi
-											cid_SUBRS 4 2 roll
-											GlyphData exch
-											4 index
-											1 index
-											sub
-											ct_GetInterval
-											dup length string copy put
-											}
-										for
-										pop
-										}
-									if
-									}
-									{pop}
-								ifelse
-								}
-							forall
-							}
-						if
-						cleartomark pop pop
-						end
-					CIDFontName currentdict/CIDFont defineresource pop
-					end end
-					}
-				stopped
-					{cleartomark/StartData ct_reraise}
-				if
-				}bind def
-			currentdict
-			end def
-		/ct_saveCIDInit
-			{
-			/CIDInit/ProcSet ct_resourcestatus
-				{true}
-				{/CIDInitC/ProcSet ct_resourcestatus}
-			ifelse
-				{
-				pop pop
-				/CIDInit/ProcSet findresource
-				ct_UseNativeCapability?
-					{pop null}
-					{/CIDInit ct_CIDInit/ProcSet defineresource pop}
-				ifelse
-				}
-				{/CIDInit ct_CIDInit/ProcSet defineresource pop null}
-			ifelse
-			ct_Vars exch/ct_oldCIDInit exch put
-			}bind def
-		/ct_restoreCIDInit
-			{
-			ct_Vars/ct_oldCIDInit get dup null ne
-				{/CIDInit exch/ProcSet defineresource pop}
-				{pop}
-			ifelse
-			}bind def
-		/ct_BuildCharSetUp
-			{
-			1 index
-				begin
-				CIDFont
-					begin
-					Adobe_CoolType_Utility/ct_BuildCharDict get
-						begin
-						/ct_dfCharCode exch def
-						/ct_dfDict exch def
-						CIDFirstByte ct_dfCharCode add
-						dup CIDCount ge
-							{pop 0}
-						if
-						/cid exch def
-							{
-							GlyphDirectory cid 2 copy known
-								{get}
-								{pop pop nullstring}
-							ifelse
-							dup length FDBytes sub 0 gt
-								{
-								dup
-								FDBytes 0 ne
-									{0 FDBytes ct_cvnsi}
-									{pop 0}
-								ifelse
-								/fdIndex exch def
-								dup length FDBytes sub FDBytes exch getinterval
-								/charstring exch def
-								exit
-								}
-								{
-								pop
-								cid 0 eq
-									{/charstring nullstring def exit}
-								if
-								/cid 0 def
-								}
-							ifelse
-							}
-						loop
-			}def
-		/ct_SetCacheDevice
-			{
-			0 0 moveto
-			dup stringwidth
-			3 -1 roll
-			true charpath
-			pathbbox
-			0 -1000
-			7 index 2 div 880
-			setcachedevice2
-			0 0 moveto
-			}def
-		/ct_CloneSetCacheProc
-			{
-			1 eq
-				{
-				stringwidth
-				pop -2 div -880
-				0 -1000 setcharwidth
-				moveto
-				}
-				{
-				usewidths?
-					{
-					currentfont/Widths get cid
-					2 copy known
-						{get exch pop aload pop}
-						{pop pop stringwidth}
-					ifelse
-					}
-					{stringwidth}
-				ifelse
-				setcharwidth
-				0 0 moveto
-				}
-			ifelse
-			}def
-		/ct_Type3ShowCharString
-			{
-			ct_FDDict fdIndex 2 copy known
-				{get}
-				{
-				currentglobal 3 1 roll
-				1 index gcheck setglobal
-				ct_Type1FontTemplate dup maxlength dict copy
-					begin
-					FDArray fdIndex get
-					dup/FontMatrix 2 copy known
-						{get}
-						{pop pop ct_defaultFontMtx}
-					ifelse
-					/FontMatrix exch dup length array copy def
-					/Private get
-					/Private exch def
-					/Widths rootfont/Widths get def
-					/CharStrings 1 dict dup/.notdef
-						dup length string copy put def
-					currentdict
-					end
-				/ct_Type1Font exch definefont
-				dup 5 1 roll put
-				setglobal
-				}
-			ifelse
-			dup/CharStrings get 1 index/Encoding get
-			ct_dfCharCode get charstring put
-			rootfont/WMode 2 copy known
-				{get}
-				{pop pop 0}
-			ifelse
-			exch
-			1000 scalefont setfont
-			ct_str1 0 ct_dfCharCode put
-			ct_str1 exch ct_dfSetCacheProc
-			ct_SyntheticBold
-				{
-				currentpoint
-				ct_str1 show
-				newpath
-				moveto
-				ct_str1 true charpath
-				ct_StrokeWidth setlinewidth
-				stroke
-				}
-				{ct_str1 show}
-			ifelse
-			}def
-		/ct_Type4ShowCharString
-			{
-			ct_dfDict ct_dfCharCode charstring
-			FDArray fdIndex get
-			dup/FontMatrix get dup ct_defaultFontMtx ct_matrixeq not
-				{ct_1000Mtx matrix concatmatrix concat}
-				{pop}
-			ifelse
-			/Private get
-			Adobe_CoolType_Utility/ct_Level2? get not
-				{
-				ct_dfDict/Private
-				3 -1 roll
-					{put}
-				1183615869 internaldict/superexec get exec
-				}
-			if
-			1183615869 internaldict
-			Adobe_CoolType_Utility/ct_Level2? get
-				{1 index}
-				{3 index/Private get mark 6 1 roll}
-			ifelse
-			dup/RunInt known
-				{/RunInt get}
-				{pop/CCRun}
-			ifelse
-			get exec
-			Adobe_CoolType_Utility/ct_Level2? get not
-				{cleartomark}
-			if
-			}bind def
-		/ct_BuildCharIncremental
-			{
-				{
-				Adobe_CoolType_Utility/ct_MakeOCF get begin
-				ct_BuildCharSetUp
-				ct_ShowCharString
-				}
-			stopped
-				{stop}
-			if
-			end
-			end
-			end
-			end
-			}bind def
-		/BaseFontNameStr(BF00)def
-		/ct_Type1FontTemplate 14 dict
-			begin
-			/FontType 1 def
-			/FontMatrix [0.001 0 0 0.001 0 0]def
-			/FontBBox [-250 -250 1250 1250]def
-			/Encoding ct_cHexEncoding def
-			/PaintType 0 def
-			currentdict
-			end def
-		/BaseFontTemplate 11 dict
-			begin
-			/FontMatrix [0.001 0 0 0.001 0 0]def
-			/FontBBox [-250 -250 1250 1250]def
-			/Encoding ct_cHexEncoding def
-			/BuildChar/ct_BuildCharIncremental load def
-			ct_Clone?
-				{
-				/FontType 3 def
-				/ct_ShowCharString/ct_Type3ShowCharString load def
-				/ct_dfSetCacheProc/ct_CloneSetCacheProc load def
-				/ct_SyntheticBold false def
-				/ct_StrokeWidth 1 def
-				}
-				{
-				/FontType 4 def
-				/Private 1 dict dup/lenIV 4 put def
-				/CharStrings 1 dict dup/.notdefput def
-				/PaintType 0 def
-				/ct_ShowCharString/ct_Type4ShowCharString load def
-				}
-			ifelse
-			/ct_str1 1 string def
-			currentdict
-			end def
-		/BaseFontDictSize BaseFontTemplate length 5 add def
-		/ct_matrixeq
-			{
-			true 0 1 5
-				{
-				dup 4 index exch get exch 3 index exch get eq and
-				dup not
-					{exit}
-				if
-				}
-			for
-			exch pop exch pop
-			}bind def
-		/ct_makeocf
-			{
-			15 dict
-				begin
-				exch/WMode exch def
-				exch/FontName exch def
-				/FontType 0 def
-				/FMapType 2 def
-			dup/FontMatrix known
-				{dup/FontMatrix get/FontMatrix exch def}
-				{/FontMatrix matrix def}
-			ifelse
-				/bfCount 1 index/CIDCount get 256 idiv 1 add
-					dup 256 gt{pop 256}if def
-				/Encoding
-					256 array 0 1 bfCount 1 sub{2 copy dup put pop}for
-					bfCount 1 255{2 copy bfCount put pop}for
-					def
-				/FDepVector bfCount dup 256 lt{1 add}if array def
-				BaseFontTemplate BaseFontDictSize dict copy
-					begin
-					/CIDFont exch def
-					CIDFont/FontBBox known
-						{CIDFont/FontBBox get/FontBBox exch def}
-					if
-					CIDFont/CDevProc known
-						{CIDFont/CDevProc get/CDevProc exch def}
-					if
-					currentdict
-					end
-				BaseFontNameStr 3(0)putinterval
-				0 1 bfCount dup 256 eq{1 sub}if
-					{
-					FDepVector exch
-					2 index BaseFontDictSize dict copy
-						begin
-						dup/CIDFirstByte exch 256 mul def
-						FontType 3 eq
-							{/ct_FDDict 2 dict def}
-						if
-						currentdict
-						end
-					1 index 16
-					BaseFontNameStr 2 2 getinterval cvrs pop
-					BaseFontNameStr exch definefont
-					put
-					}
-				for
-				ct_Clone?
-					{/Widths 1 index/CIDFont get/GlyphDirectory get length dict def}
-				if
-				FontName
-				currentdict
-				end
-			definefont
-			ct_Clone?
-				{
-				gsave
-				dup 1000 scalefont setfont
-				ct_BuildCharDict
-					begin
-					/usewidths? false def
-					currentfont/Widths get
-						begin
-						exch/CIDFont get/GlyphDirectory get
-							{
-							pop
-							dup charcode exch 1 index 0 2 index 256 idiv put
-							1 index exch 1 exch 256 mod put
-							stringwidth 2 array astore def
-							}
-						forall
-						end
-					/usewidths? true def
-					end
-				grestore
-				}
-				{exch pop}
-			ifelse
-			}bind def
-		currentglobal true setglobal
-		/ct_ComposeFont
-			{
-			ct_UseNativeCapability?
-				{				
-				2 index/CMap ct_resourcestatus
-					{pop pop exch pop}
-					{
-					/CIDInit/ProcSet findresource
-						begin
-						12 dict
-							begin
-							begincmap
-							/CMapName 3 index def
-							/CMapVersion 1.000 def
-							/CMapType 1 def
-							exch/WMode exch def
-							/CIDSystemInfo 3 dict dup
-								begin
-								/Registry(Adobe)def
-								/Ordering
-								CMapName ct_mkocfStr100 cvs
-								(Adobe-)search
-									{
-									pop pop
-									(-)search
-										{
-										dup length string copy
-										exch pop exch pop
-										}
-										{pop(Identity)}
-									ifelse
-									}
-									{pop (Identity)}
-								ifelse
-								def
-								/Supplement 0 def
-								end def
-							1 begincodespacerange
-							<0000>
-							endcodespacerange
-							1 begincidrange
-							<0000>0
-							endcidrange
-							endcmap
-							CMapName currentdict/CMap defineresource pop
-							end
-						end
-					}
-				ifelse
-				composefont
-				}
-				{
-				3 2 roll pop
-				0 get/CIDFont findresource
-				ct_makeocf
-				}
-			ifelse
-			}bind def
-			setglobal
-		/ct_MakeIdentity
-			{
-			ct_UseNativeCapability?
-				{
-				1 index/CMap ct_resourcestatus
-					{pop pop}
-					{
-					/CIDInit/ProcSet findresource begin
-					12 dict begin
-					begincmap
-					/CMapName 2 index def
-					/CMapVersion 1.000 def
-					/CMapType 1 def
-					/CIDSystemInfo 3 dict dup
-						begin
-						/Registry(Adobe)def
-						/Ordering
-						CMapName ct_mkocfStr100 cvs
-						(Adobe-)search
-							{
-							pop pop
-							(-)search
-								{dup length string copy exch pop exch pop}
-								{pop(Identity)}
-							ifelse
-							}
-							{pop(Identity)}
-						ifelse
-						def
-						/Supplement 0 def
-						end def
-					1 begincodespacerange
-					<0000>
-					endcodespacerange
-					1 begincidrange
-					<0000>0
-					endcidrange
-					endcmap
-					CMapName currentdict/CMap defineresource pop
-					end
-					end
-					}
-				ifelse
-				composefont
-				}
-				{
-				exch pop
-				0 get/CIDFont findresource
-				ct_makeocf
-				}
-			ifelse
-			}bind def
-		currentdict readonly pop
-		end
-	end
-%%EndResource
-setglobal
-%%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0
-%%Copyright: Copyright 1987-2004 Adobe Systems Incorporated.
-%%Version: 1.0 0
-userdict/ct_T42Dict 15 dict put
-ct_T42Dict begin
-/Is2015?
-{
- version
- cvi
- 2015
- ge
-}bind def
-/AllocGlyphStorage
-{
- Is2015?
- {	
-	pop
- }
- {
-	{string}forall
- }ifelse
-}bind def
-/Type42DictBegin
-{
-25 dict begin
- /FontName exch def
- /CharStrings 256 dict 
-begin
-	 /.notdef 0 def
-	 currentdict 
-end def
- /Encoding exch def
- /PaintType 0 def
- /FontType 42 def
- /FontMatrix[1 0 0 1 0 0]def
- 4 array astore cvx/FontBBox exch def
- /sfnts
-}bind def
-/Type42DictEnd 
-{
- currentdict dup/FontName get exch definefont end
-ct_T42Dict exch
-dup/FontName get exch put
-}bind def
-/RD{string currentfile exch readstring pop}executeonly def
-/PrepFor2015
-{
-Is2015?
-{		 
-	/GlyphDirectory 
-	 16
-	 dict def
-	 sfnts 0 get
-	 dup
-	 2 index
-	(glyx)
-	 putinterval
-	 2 index 
-	(locx)
-	 putinterval
-	 pop
-	 pop
-}
-{
-	 pop
-	 pop
-}ifelse			
-}bind def
-/AddT42Char
-{
-Is2015?
-{
-	/GlyphDirectory get 
-	begin
-	def
-	end
-	pop
-	pop
-}
-{
-	/sfnts get
-	4 index
-	get
-	3 index
- 2 index
-	putinterval
-	pop
-	pop
-	pop
-	pop
-}ifelse
-}bind def
-/T0AddT42Mtx2
-{
-/CIDFont findresource/Metrics2 get begin def end
-}bind def
-end
-%%EndResource
-currentglobal true setglobal
-%%BeginFile: MMFauxFont.prc
-%%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. 
-%%All Rights Reserved.
-userdict /ct_EuroDict 10 dict put
-ct_EuroDict begin
-/ct_CopyFont 
-{
-    { 1 index /FID ne {def} {pop pop} ifelse} forall
-} def
-/ct_GetGlyphOutline
-{
-   gsave
-   initmatrix newpath
-   exch findfont dup 
-   length 1 add dict 
-   begin 
-		ct_CopyFont 
-		/Encoding Encoding dup length array copy 
-		dup
-		4 -1 roll
-		0 exch put   
-		def
-		currentdict
-   end
-   /ct_EuroFont exch definefont
-   1000 scalefont setfont
-   0 0 moveto
-   [
-       <00> stringwidth 
-       <00> false charpath
-       pathbbox
-       [
-       {/m cvx} {/l cvx} {/c cvx} {/cp cvx} pathforall
-   grestore
-   counttomark 8 add
-}
-def
-/ct_MakeGlyphProc
-{
-   ] cvx
-   /ct_PSBuildGlyph cvx
-   ] cvx
-} def
-/ct_PSBuildGlyph 
-{ 
- 	gsave 
-	8 -1 roll pop 
-	7 1 roll 
-        6 -2 roll ct_FontMatrix transform 6 2 roll
-        4 -2 roll ct_FontMatrix transform 4 2 roll
-        ct_FontMatrix transform 
-	currentdict /PaintType 2 copy known {get 2 eq}{pop pop false} ifelse  
-	dup  9 1 roll 
-	{  
-		currentdict /StrokeWidth 2 copy known  
-		{   
-			get 2 div   
-			0 ct_FontMatrix dtransform pop
-			5 1 roll  
-			4 -1 roll 4 index sub   
-			4 1 roll   
-			3 -1 roll 4 index sub  
-			3 1 roll   
-			exch 4 index add exch  
-			4 index add  
-			5 -1 roll pop  
-		}  
-		{	 
-			pop pop 
-		}  
-		ifelse  
-	}       
-    if  
-	setcachedevice  
-        ct_FontMatrix concat
-        ct_PSPathOps begin 
-		exec 
-	end 
-	{  
-		currentdict /StrokeWidth 2 copy known  
-			{ get }  
-			{ pop pop 0 }  
-  	    ifelse  
-		setlinewidth stroke  
-	}  
-	{   
-	    fill  
-	}  
-	ifelse  
-    grestore
-} def 
-/ct_PSPathOps 4 dict dup begin 
-	/m {moveto} def 
-	/l {lineto} def 
-	/c {curveto} def 
-	/cp {closepath} def 
-end 
-def 
-/ct_matrix1000 [1000 0 0 1000 0 0] def
-/ct_AddGlyphProc  
-{
-   2 index findfont dup length 4 add dict 
-   begin 
-	ct_CopyFont 
-	/CharStrings CharStrings dup length 1 add dict copy
-      begin
-         3 1 roll def  
-         currentdict 
-      end 
-      def
-      /ct_FontMatrix ct_matrix1000 FontMatrix matrix concatmatrix def
-      /ct_PSBuildGlyph /ct_PSBuildGlyph load def
-      /ct_PSPathOps /ct_PSPathOps load def
-      currentdict
-   end
-   definefont pop
-}
-def
-systemdict /languagelevel known
-{
-	/ct_AddGlyphToPrinterFont {
-		2 copy
-		ct_GetGlyphOutline 3 add -1 roll restore 
-		ct_MakeGlyphProc 
-		ct_AddGlyphProc
-	} def
-}
-{
-	/ct_AddGlyphToPrinterFont {
-	    pop pop restore
-		Adobe_CTFauxDict /$$$FONTNAME get
-		/Euro
-		Adobe_CTFauxDict /$$$SUBSTITUTEBASE get
-		ct_EuroDict exch get
-		ct_AddGlyphProc
-	} def
-} ifelse
-/AdobeSansMM 
-{ 
-556 0 24 -19 541 703 
-	{ 
-	541 628 m 
-	510 669 442 703 354 703 c 
-	201 703 117 607 101 444 c 
-	50 444 l 
-	25 372 l 
-	97 372 l 
-	97 301 l 
-	49 301 l 
-	24 229 l 
-	103 229 l 
-	124 67 209 -19 350 -19 c 
-	435 -19 501 25 509 32 c 
-	509 131 l 
-	492 105 417 60 343 60 c 
-	267 60 204 127 197 229 c 
-	406 229 l 
-	430 301 l 
-	191 301 l 
-	191 372 l 
-	455 372 l 
-	479 444 l 
-	194 444 l 
-	201 531 245 624 348 624 c 
-	433 624 484 583 509 534 c 
-	cp 
-	556 0 m 
-	}
-ct_PSBuildGlyph
-} def
-/AdobeSerifMM 
-{ 
-500 0 10 -12 484 692 
-	{ 
-	347 298 m 
-	171 298 l 
-	170 310 170 322 170 335 c 
-	170 362 l 
-	362 362 l 
-	374 403 l 
-	172 403 l 
-	184 580 244 642 308 642 c 
-	380 642 434 574 457 457 c 
-	481 462 l 
-	474 691 l 
-	449 691 l 
-	433 670 429 657 410 657 c 
-	394 657 360 692 299 692 c 
-	204 692 94 604 73 403 c 
-	22 403 l 
-	10 362 l 
-	70 362 l 
-	69 352 69 341 69 330 c 
-	69 319 69 308 70 298 c 
-	22 298 l 
-	10 257 l 
-	73 257 l 
-	97 57 216 -12 295 -12 c 
-	364 -12 427 25 484 123 c 
-	458 142 l 
-	425 101 384 37 316 37 c 
-	256 37 189 84 173 257 c 
-	335 257 l 
-	cp 
-	500 0 m 
-	} 
-ct_PSBuildGlyph 
-} def 
-end		
-%%EndFile
-setglobal
-Adobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end
-%%BeginResource: procset Adobe_AGM_Image 1.0 0
-%%Version: 1.0 0
-%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved.
-systemdict/setpacking known
-{
-	currentpacking
-	true setpacking
-}if
-userdict/Adobe_AGM_Image 71 dict dup begin put
-/Adobe_AGM_Image_Id/Adobe_AGM_Image_1.0_0 def
-/nd{
-	null def
-}bind def
-/AGMIMG_&image nd
-/AGMIMG_&colorimage nd
-/AGMIMG_&imagemask nd
-/AGMIMG_mbuf()def
-/AGMIMG_ybuf()def
-/AGMIMG_kbuf()def
-/AGMIMG_c 0 def
-/AGMIMG_m 0 def
-/AGMIMG_y 0 def
-/AGMIMG_k 0 def
-/AGMIMG_tmp nd
-/AGMIMG_imagestring0 nd
-/AGMIMG_imagestring1 nd
-/AGMIMG_imagestring2 nd
-/AGMIMG_imagestring3 nd
-/AGMIMG_imagestring4 nd
-/AGMIMG_imagestring5 nd
-/AGMIMG_cnt nd
-/AGMIMG_fsave nd
-/AGMIMG_colorAry nd
-/AGMIMG_override nd
-/AGMIMG_name nd
-/AGMIMG_maskSource nd
-/AGMIMG_flushfilters nd
-/invert_image_samples nd
-/knockout_image_samples	nd
-/img nd
-/sepimg nd
-/devnimg nd
-/idximg nd
-/ds
-{
-	Adobe_AGM_Core begin
-	Adobe_AGM_Image begin
-	/AGMIMG_&image systemdict/image get def
-	/AGMIMG_&imagemask systemdict/imagemask get def
-	/colorimage where{
-		pop
-		/AGMIMG_&colorimage/colorimage ldf
-	}if
-	end
-	end
-}def
-/ps
-{
-	Adobe_AGM_Image begin
-	/AGMIMG_ccimage_exists{/customcolorimage where 
-		{
-			pop
-			/Adobe_AGM_OnHost_Seps where
-			{
-			pop false
-			}{
-			/Adobe_AGM_InRip_Seps where
-				{
-				pop false
-				}{
-					true
-				}ifelse
-			}ifelse
-			}{
-			false
-		}ifelse 
-	}bdf
-	level2{
-		/invert_image_samples
-		{
-			Adobe_AGM_Image/AGMIMG_tmp Decode length ddf
-			/Decode[Decode 1 get Decode 0 get]def
-		}def
-		/knockout_image_samples
-		{
-			Operator/imagemask ne{
-				/Decode[1 1]def
-			}if
-		}def
-	}{	
-		/invert_image_samples
-		{
-			{1 exch sub}currenttransfer addprocs settransfer
-		}def
-		/knockout_image_samples
-		{
-			{pop 1}currenttransfer addprocs settransfer
-		}def
-	}ifelse
-	/img/imageormask ldf
-	/sepimg/sep_imageormask ldf
-	/devnimg/devn_imageormask ldf
-	/idximg/indexed_imageormask ldf
-	/_ctype 7 def
-	currentdict{
-		dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{
-			bind
-		}if
-		def
-	}forall
-}def
-/pt
-{
-	end
-}def
-/dt
-{
-}def
-/AGMIMG_flushfilters
-{
-	dup type/arraytype ne
-		{1 array astore}if
-	dup 0 get currentfile ne
-		{dup 0 get flushfile}if
-		{
-		dup type/filetype eq
-			{
-			dup status 1 index currentfile ne and
-				{closefile}
-				{pop}
-			ifelse
-			}{pop}ifelse
-		}forall
-}def
-/AGMIMG_init_common
-{
-	currentdict/T known{/ImageType/T ldf currentdict/T undef}if
-	currentdict/W known{/Width/W ldf currentdict/W undef}if
-	currentdict/H known{/Height/H ldf currentdict/H undef}if
-	currentdict/M known{/ImageMatrix/M ldf currentdict/M undef}if
-	currentdict/BC known{/BitsPerComponent/BC ldf currentdict/BC undef}if
-	currentdict/D known{/Decode/D ldf currentdict/D undef}if
-	currentdict/DS known{/DataSource/DS ldf currentdict/DS undef}if
-	currentdict/O known{
-		/Operator/O load 1 eq{
-			/imagemask
-		}{
-			/O load 2 eq{
-				/image 
-			}{
-				/colorimage
-			}ifelse
-		}ifelse
-		def
-		currentdict/O undef
-	}if
-	currentdict/HSCI known{/HostSepColorImage/HSCI ldf currentdict/HSCI undef}if
-	currentdict/MD known{/MultipleDataSources/MD ldf currentdict/MD undef}if
-	currentdict/I known{/Interpolate/I ldf currentdict/I undef}if
-	currentdict/SI known{/SkipImageProc/SI ldf currentdict/SI undef}if
-	/DataSource load xcheck not{
-		DataSource type/arraytype eq{
-			DataSource 0 get type/filetype eq{
-				/_Filters DataSource def
-				currentdict/MultipleDataSources known not{
-					/DataSource DataSource dup length 1 sub get def 
-				}if
-			}if
-		}if
-		currentdict/MultipleDataSources known not{
-			/MultipleDataSources DataSource type/arraytype eq{
-				DataSource length 1 gt
-			}
-			{false}ifelse def
-		}if
-	}if
-	/NComponents Decode length 2 div def
-	currentdict/SkipImageProc known not{/SkipImageProc{false}def}if
-}bdf
-/imageormask_sys
-{
-	begin
-		AGMIMG_init_common
-		save mark
-		level2{
-			currentdict
-			Operator/imagemask eq{
-				AGMIMG_&imagemask
-			}{
-				use_mask{
-					process_mask AGMIMG_&image
-				}{
-					AGMIMG_&image
-				}ifelse
-			}ifelse
-		}{
-			Width Height
-			Operator/imagemask eq{
-				Decode 0 get 1 eq Decode 1 get 0 eq	and
-				ImageMatrix/DataSource load
-				AGMIMG_&imagemask
-			}{
-				BitsPerComponent ImageMatrix/DataSource load
-				AGMIMG_&image
-			}ifelse
-		}ifelse
-		currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
-		cleartomark restore
-	end
-}def
-/overprint_plate
-{
-	currentoverprint{
-		0 get dup type/nametype eq{
-			dup/DeviceGray eq{
-				pop AGMCORE_black_plate not
-			}{
-				/DeviceCMYK eq{
-					AGMCORE_is_cmyk_sep not
-				}if
-			}ifelse
-		}{
-			false exch
-			{
-				 AGMOHS_sepink eq or
-			}forall
-			not
-		}ifelse
-	}{
-		pop false
-	}ifelse
-}def
-/process_mask
-{
-	level3{
-		dup begin
-		/ImageType 1 def
-		end
-		4 dict begin
-			/DataDict exch def
-			/ImageType 3 def
-			/InterleaveType 3 def
-			/MaskDict 9 dict begin
-				/ImageType 1 def
-				/Width DataDict dup/MaskWidth known{/MaskWidth}{/Width}ifelse get def
-				/Height DataDict dup/MaskHeight known{/MaskHeight}{/Height}ifelse get def
-				/ImageMatrix[Width 0 0 Height neg 0 Height]def
-				/NComponents 1 def
-				/BitsPerComponent 1 def
-				/Decode DataDict dup/MaskD known{/MaskD}{[1 0]}ifelse get def
-				/DataSource Adobe_AGM_Core/AGMIMG_maskSource get def
-			currentdict end def
-		currentdict end
-	}if
-}def
-/use_mask
-{
-	dup/Mask known	{dup/Mask get}{false}ifelse
-}def
-/imageormask
-{
-	begin
-		AGMIMG_init_common
-		SkipImageProc{
-			currentdict consumeimagedata
-		}
-		{
-			save mark
-			level2 AGMCORE_host_sep not and{
-				currentdict
-				Operator/imagemask eq DeviceN_PS2 not and{
-					imagemask
-				}{
-					AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get/DeviceGray eq and{
-						[/Separation/Black/DeviceGray{}]setcolorspace
-						/Decode[Decode 1 get Decode 0 get]def
-					}if
-					use_mask{
-						process_mask image
-					}{
-						DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and 
-						{
-							Names convert_to_process not{
-								2 dict begin
-								/imageDict xdf
-								/names_index 0 def
-								gsave
-								imageDict write_image_file{
-									Names{
-										dup(None)ne{
-											[/Separation 3 -1 roll/DeviceGray{1 exch sub}]setcolorspace
-											Operator imageDict read_image_file
-											names_index 0 eq{true setoverprint}if
-											/names_index names_index 1 add def
-										}{
-											pop
-										}ifelse
-									}forall
-									close_image_file
-								}if
-								grestore
-								end
-							}{
-								Operator/imagemask eq{
-									imagemask
-								}{
-									image
-								}ifelse
-							}ifelse
-						}{
-							Operator/imagemask eq{
-								imagemask
-							}{
-								image
-							}ifelse
-						}ifelse
-					}ifelse
-				}ifelse
-			}{
-				Width Height
-				Operator/imagemask eq{
-					Decode 0 get 1 eq Decode 1 get 0 eq	and
-					ImageMatrix/DataSource load
-					/Adobe_AGM_OnHost_Seps where{
-						pop imagemask
-					}{
-						currentgray 1 ne{
-							currentdict imageormask_sys
-						}{
-							currentoverprint not{
-								1 AGMCORE_&setgray
-								currentdict imageormask_sys
-							}{
-								currentdict ignoreimagedata
-							}ifelse				 		
-						}ifelse
-					}ifelse
-				}{
-					BitsPerComponent ImageMatrix 
-					MultipleDataSources{
-						0 1 NComponents 1 sub{
-							DataSource exch get
-						}for
-					}{
-						/DataSource load
-					}ifelse
-					Operator/colorimage eq{
-						AGMCORE_host_sep{
-							MultipleDataSources level2 or NComponents 4 eq and{
-								AGMCORE_is_cmyk_sep{
-									MultipleDataSources{
-										/DataSource DataSource 0 get xcheck
-											{
-											[
-											DataSource 0 get/exec cvx
-											DataSource 1 get/exec cvx
-											DataSource 2 get/exec cvx
-											DataSource 3 get/exec cvx
-											/AGMCORE_get_ink_data cvx
-											]cvx
-											}{
-											DataSource aload pop AGMCORE_get_ink_data
-											}ifelse def
-									}{
-										/DataSource 
-										Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul 
-										/DataSource load
-										filter_cmyk 0()/SubFileDecode filter def
-									}ifelse
-									/Decode[Decode 0 get Decode 1 get]def
-									/MultipleDataSources false def
-									/NComponents 1 def
-									/Operator/image def
-									invert_image_samples
-						 			1 AGMCORE_&setgray
-									currentdict imageormask_sys
-								}{
-									currentoverprint not Operator/imagemask eq and{
- 			 							1 AGMCORE_&setgray
- 			 							currentdict imageormask_sys
- 			 						}{
- 			 							currentdict ignoreimagedata
- 			 						}ifelse
-								}ifelse
-							}{	
-								MultipleDataSources NComponents AGMIMG_&colorimage						
-							}ifelse
-						}{
-							true NComponents colorimage
-						}ifelse
-					}{
-						Operator/image eq{
-							AGMCORE_host_sep{
-								/DoImage true def
-								currentdict/HostSepColorImage known{HostSepColorImage not}{false}ifelse
-								{
-									AGMCORE_black_plate not Operator/imagemask ne and{
-										/DoImage false def
-										currentdict ignoreimagedata
-					 				}if
-								}if
-						 		1 AGMCORE_&setgray
-								DoImage
-									{currentdict imageormask_sys}if
-							}{
-								use_mask{
-									process_mask image
-								}{
-									image
-								}ifelse
-							}ifelse
-						}{
-							Operator/knockout eq{
-								pop pop pop pop pop
-								currentcolorspace overprint_plate not{
-									knockout_unitsq
-								}if
-							}if
-						}ifelse
-					}ifelse
-				}ifelse
-			}ifelse
-			cleartomark restore
-		}ifelse
-		currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
-	end
-}def
-/sep_imageormask
-{
- 	/sep_colorspace_dict AGMCORE_gget begin
-	CSA map_csa
-	begin
-	AGMIMG_init_common
-	SkipImageProc{
-		currentdict consumeimagedata
-	}{
-		save mark 
-		AGMCORE_avoid_L2_sep_space{
-			/Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def
-		}if
- 		AGMIMG_ccimage_exists 
-		MappedCSA 0 get/DeviceCMYK eq and
-		currentdict/Components known and 
-		Name()ne and 
-		Name(All)ne and 
-		Operator/image eq and
-		AGMCORE_producing_seps not and
-		level2 not and
-		{
-			Width Height BitsPerComponent ImageMatrix 
-			[
-			/DataSource load/exec cvx
-			{
-				0 1 2 index length 1 sub{
-					1 index exch
-					2 copy get 255 xor put
-				}for
-			}/exec cvx
-			]cvx bind
-			MappedCSA 0 get/DeviceCMYK eq{
-				Components aload pop
-			}{
-				0 0 0 Components aload pop 1 exch sub
-			}ifelse
-			Name findcmykcustomcolor
-			customcolorimage
-		}{
-			AGMCORE_producing_seps not{
-				level2{
- 					//Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne AGMCORE_avoid_L2_sep_space not and currentcolorspace 0 get/Separation ne and{
-						[/Separation Name MappedCSA sep_proc_name exch dup 0 get 15 string cvs(/Device)anchorsearch{pop pop 0 get}{pop}ifelse exch load]setcolorspace_opt
-						/sep_tint AGMCORE_gget setcolor
-					}if
-					currentdict imageormask
-				}{
-					currentdict
-					Operator/imagemask eq{
-						imageormask
-					}{
-						sep_imageormask_lev1
-					}ifelse
-				}ifelse
- 			}{
-				AGMCORE_host_sep{
-					Operator/knockout eq{
-						currentdict/ImageMatrix get concat
-						knockout_unitsq
-					}{
-						currentgray 1 ne{
- 							AGMCORE_is_cmyk_sep Name(All)ne and{
- 								level2{
- 									Name AGMCORE_IsSeparationAProcessColor 
- 									{
- 										Operator/imagemask eq{
- 											//Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{
- 												/sep_tint AGMCORE_gget 1 exch sub AGMCORE_&setcolor
- 											}if
- 										}{
-											invert_image_samples
- 										}ifelse
-	 								}{
-	 									//Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{
-	 										[/Separation Name[/DeviceGray]
-	 										{
-	 											sep_colorspace_proc AGMCORE_get_ink_data
-												1 exch sub
-	 										}bind
-											]AGMCORE_&setcolorspace
-											/sep_tint AGMCORE_gget AGMCORE_&setcolor
-										}if
- 									}ifelse
- 									currentdict imageormask_sys
-	 							}{
-	 								currentdict
-									Operator/imagemask eq{
-										imageormask_sys
-									}{
-										sep_image_lev1_sep
-									}ifelse
-	 							}ifelse
- 							}{
- 								Operator/imagemask ne{
-									invert_image_samples
- 								}if
-		 						currentdict imageormask_sys
- 							}ifelse
- 						}{
- 							currentoverprint not Name(All)eq or Operator/imagemask eq and{
-								currentdict imageormask_sys 
-								}{
-								currentoverprint not
-									{
- 									gsave 
- 									knockout_unitsq
- 									grestore
-									}if
-								currentdict consumeimagedata 
-		 					}ifelse
- 						}ifelse
-		 			}ifelse
- 				}{
-					//Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{
-						currentcolorspace 0 get/Separation ne{
-							[/Separation Name MappedCSA sep_proc_name exch 0 get exch load]setcolorspace_opt
-							/sep_tint AGMCORE_gget setcolor
-						}if
-					}if
-					currentoverprint 
-					MappedCSA 0 get/DeviceCMYK eq and 
-					Name AGMCORE_IsSeparationAProcessColor not and
-					//Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{Name inRip_spot_has_ink not and}{false}ifelse 
-					Name(All)ne and{
-						imageormask_l2_overprint
-					}{
-						currentdict imageormask
- 					}ifelse
-				}ifelse
-			}ifelse
-		}ifelse
-		cleartomark restore
-	}ifelse
-	currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
-	end
-	end
-}def
-/colorSpaceElemCnt
-{
-	mark currentcolor counttomark dup 2 add 1 roll cleartomark
-}bdf
-/devn_sep_datasource
-{
-	1 dict begin
-	/dataSource xdf
-	[
-		0 1 dataSource length 1 sub{
-			dup currentdict/dataSource get/exch cvx/get cvx/exec cvx
-			/exch cvx names_index/ne cvx[/pop cvx]cvx/if cvx
-		}for
-	]cvx bind
-	end
-}bdf		
-/devn_alt_datasource
-{
-	11 dict begin
-	/convProc xdf
-	/origcolorSpaceElemCnt xdf
-	/origMultipleDataSources xdf
-	/origBitsPerComponent xdf
-	/origDecode xdf
-	/origDataSource xdf
-	/dsCnt origMultipleDataSources{origDataSource length}{1}ifelse def
-	/DataSource origMultipleDataSources
-		{
-			[
-			BitsPerComponent 8 idiv origDecode length 2 idiv mul string
-			0 1 origDecode length 2 idiv 1 sub
-				{
-				dup 7 mul 1 add index exch dup BitsPerComponent 8 idiv mul exch
-				origDataSource exch get 0()/SubFileDecode filter
-				BitsPerComponent 8 idiv string/readstring cvx/pop cvx/putinterval cvx
-				}for 
-			]bind cvx
-		}{origDataSource}ifelse 0()/SubFileDecode filter def		
-	[
-		origcolorSpaceElemCnt string
-		0 2 origDecode length 2 sub
-			{
-			dup origDecode exch get dup 3 -1 roll 1 add origDecode exch get exch sub 2 BitsPerComponent exp 1 sub div
-			1 BitsPerComponent 8 idiv{DataSource/read cvx/not cvx{0}/if cvx/mul cvx}repeat/mul cvx/add cvx
-			}for
-		/convProc load/exec cvx
-		origcolorSpaceElemCnt 1 sub -1 0
-			{
-			/dup cvx 2/add cvx/index cvx
-			3 1/roll cvx/exch cvx 255/mul cvx/cvi cvx/put cvx
-			}for
-	]bind cvx 0()/SubFileDecode filter
-	end
-}bdf
-/devn_imageormask
-{
- 	/devicen_colorspace_dict AGMCORE_gget begin
-	CSA map_csa
-	2 dict begin
-	dup
-	/srcDataStrs[3 -1 roll begin
-		AGMIMG_init_common
-		currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse
-		{
-			Width Decode length 2 div mul cvi
-			{
-				dup 65535 gt{1 add 2 div cvi}{exit}ifelse
-			}loop
-			string
-		}repeat
-		end]def
-	/dstDataStr srcDataStrs 0 get length string def
-	begin
-	AGMIMG_init_common
-	SkipImageProc{
-		currentdict consumeimagedata
-	}{
-		save mark 
-		AGMCORE_producing_seps not{
-			level3 not{
-				Operator/imagemask ne{
-					/DataSource[[
-						DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse
-						colorSpaceElemCnt/devicen_colorspace_dict AGMCORE_gget/TintTransform get 
-						devn_alt_datasource 1/string cvx/readstring cvx/pop cvx]cvx colorSpaceElemCnt 1 sub{dup}repeat]def				
-					/MultipleDataSources true def
-					/Decode colorSpaceElemCnt[exch{0 1}repeat]def
-				}if
-			}if
-			currentdict imageormask
- 		}{
-			AGMCORE_host_sep{
-				Names convert_to_process{
-					CSA get_csa_by_name 0 get/DeviceCMYK eq{
-						/DataSource
-							Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul 
-							DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse
-							4/devicen_colorspace_dict AGMCORE_gget/TintTransform get 
-							devn_alt_datasource
-						filter_cmyk 0()/SubFileDecode filter def
-						/MultipleDataSources false def
-						/Decode[1 0]def
-						/DeviceGray setcolorspace
-			 			currentdict imageormask_sys
- 					}{
-						AGMCORE_report_unsupported_color_space
-						AGMCORE_black_plate{
-							/DataSource
-								DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse
-								CSA get_csa_by_name 0 get/DeviceRGB eq{3}{1}ifelse/devicen_colorspace_dict AGMCORE_gget/TintTransform get
-								devn_alt_datasource
-							/MultipleDataSources false def
-							/Decode colorSpaceElemCnt[exch{0 1}repeat]def
-				 			currentdict imageormask_sys
-				 		}{
-	 						gsave 
-	 						knockout_unitsq
-	 						grestore
-							currentdict consumeimagedata 
-						}ifelse
- 					}ifelse
-				}
-				{	
-					/devicen_colorspace_dict AGMCORE_gget/names_index known{
-	 					Operator/imagemask ne{
-	 						MultipleDataSources{
-		 						/DataSource[DataSource devn_sep_datasource/exec cvx]cvx def
-								/MultipleDataSources false def
-	 						}{
-								/DataSource/DataSource load dstDataStr srcDataStrs 0 get filter_devn def
-	 						}ifelse
-							invert_image_samples
-	 					}if
-			 			currentdict imageormask_sys
-	 				}{
-	 					currentoverprint not Operator/imagemask eq and{
-							currentdict imageormask_sys 
-							}{
-							currentoverprint not
-								{
-	 							gsave 
-	 							knockout_unitsq
-	 							grestore
-								}if
-							currentdict consumeimagedata 
-			 			}ifelse
-	 				}ifelse
-	 			}ifelse
- 			}{
-				currentdict imageormask
-			}ifelse
-		}ifelse
-		cleartomark restore
-	}ifelse
-	currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
-	end
-	end
-	end
-}def
-/imageormask_l2_overprint
-{
-	currentdict
-	currentcmykcolor add add add 0 eq{
-		currentdict consumeimagedata
-	}{
-		level3{			
-			currentcmykcolor 
-			/AGMIMG_k xdf 
-			/AGMIMG_y xdf 
-			/AGMIMG_m xdf 
-			/AGMIMG_c xdf
-			Operator/imagemask eq{
-				[/DeviceN[
-				AGMIMG_c 0 ne{/Cyan}if
-				AGMIMG_m 0 ne{/Magenta}if
-				AGMIMG_y 0 ne{/Yellow}if
-				AGMIMG_k 0 ne{/Black}if
-				]/DeviceCMYK{}]setcolorspace
-				AGMIMG_c 0 ne{AGMIMG_c}if
-				AGMIMG_m 0 ne{AGMIMG_m}if
-				AGMIMG_y 0 ne{AGMIMG_y}if
-				AGMIMG_k 0 ne{AGMIMG_k}if
-				setcolor			
-			}{	
-				/Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def
-				[/Indexed 				
-					[
-						/DeviceN[
-							AGMIMG_c 0 ne{/Cyan}if
-							AGMIMG_m 0 ne{/Magenta}if
-							AGMIMG_y 0 ne{/Yellow}if
-							AGMIMG_k 0 ne{/Black}if
-						]
-						/DeviceCMYK{
-							AGMIMG_k 0 eq{0}if
-							AGMIMG_y 0 eq{0 exch}if
-							AGMIMG_m 0 eq{0 3 1 roll}if
-							AGMIMG_c 0 eq{0 4 1 roll}if						
-						}
-					]
-					255
-					{
-						255 div 
-						mark exch
-						dup	dup dup
-						AGMIMG_k 0 ne{
-							/sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop		
-							counttomark 1 roll
-						}{
-							pop
-						}ifelse
-						AGMIMG_y 0 ne{
-							/sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop		
-							counttomark 1 roll
-						}{
-							pop
-						}ifelse
-						AGMIMG_m 0 ne{
-							/sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop		
-							counttomark 1 roll
-						}{
-							pop
-						}ifelse
-						AGMIMG_c 0 ne{
-							/sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop		
-							counttomark 1 roll
-						}{
-							pop
-						}ifelse
-						counttomark 1 add -1 roll pop
-					}
-				]setcolorspace
-			}ifelse
-			imageormask_sys
-		}{
-	write_image_file{
-		currentcmykcolor
-		0 ne{
-			[/Separation/Black/DeviceGray{}]setcolorspace
-			gsave
-			/Black
-			[{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 1 roll pop pop pop 1 exch sub}/exec cvx]
-			cvx modify_halftone_xfer
-			Operator currentdict read_image_file
-			grestore
-		}if
-		0 ne{
-			[/Separation/Yellow/DeviceGray{}]setcolorspace
-			gsave
-			/Yellow
-			[{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 2 roll pop pop pop 1 exch sub}/exec cvx]
-			cvx modify_halftone_xfer
-			Operator currentdict read_image_file
-			grestore
-		}if
-		0 ne{
-			[/Separation/Magenta/DeviceGray{}]setcolorspace
-			gsave
-			/Magenta
-			[{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 3 roll pop pop pop 1 exch sub}/exec cvx]
-			cvx modify_halftone_xfer
-			Operator currentdict read_image_file
-			grestore
-		}if
-		0 ne{
-			[/Separation/Cyan/DeviceGray{}]setcolorspace
-			gsave
-			/Cyan 
-			[{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{pop pop pop 1 exch sub}/exec cvx]
-			cvx modify_halftone_xfer
-			Operator currentdict read_image_file
-			grestore
-		}if
-				close_image_file
-			}{
-				imageormask
-			}ifelse
-		}ifelse
-	}ifelse
-}def
-/indexed_imageormask
-{
-	begin
-		AGMIMG_init_common
-		save mark 
- 		currentdict
- 		AGMCORE_host_sep{
-			Operator/knockout eq{
-				/indexed_colorspace_dict AGMCORE_gget dup/CSA known{
-					/CSA get get_csa_by_name
-				}{
-					/Names get
-				}ifelse
-				overprint_plate not{
-					knockout_unitsq
-				}if
-			}{
-				Indexed_DeviceN{
-					/devicen_colorspace_dict AGMCORE_gget dup/names_index known exch/Names get convert_to_process or{
-			 			indexed_image_lev2_sep
-					}{
-						currentoverprint not{
-							knockout_unitsq
-			 			}if
-			 			currentdict consumeimagedata
-					}ifelse
-				}{
-		 			AGMCORE_is_cmyk_sep{
-						Operator/imagemask eq{
-							imageormask_sys
-						}{
-							level2{
-								indexed_image_lev2_sep
-							}{
-								indexed_image_lev1_sep
-							}ifelse
-						}ifelse
-					}{
-						currentoverprint not{
-							knockout_unitsq
-			 			}if
-			 			currentdict consumeimagedata
-					}ifelse
-				}ifelse
-			}ifelse
- 		}{
-			level2{
-				Indexed_DeviceN{
-					/indexed_colorspace_dict AGMCORE_gget begin
-				}{
-					/indexed_colorspace_dict AGMCORE_gget dup null ne
-					{
-						begin
-						currentdict/CSDBase known{CSDBase/CSD get_res/MappedCSA get}{CSA}ifelse
-						get_csa_by_name 0 get/DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and
-						AGMCORE_in_rip_sep and{
-							[/Indexed[/DeviceN[/Cyan/Magenta/Yellow/Black]/DeviceCMYK{}]HiVal Lookup]
-							setcolorspace
-						}if
-						end
-					}
-					{pop}ifelse
-				}ifelse
-				imageormask
-				Indexed_DeviceN{
-					end
-				}if
-			}{
-				Operator/imagemask eq{
-					imageormask
-				}{
-					indexed_imageormask_lev1
-				}ifelse
-			}ifelse
- 		}ifelse
-		cleartomark restore
-	currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
-	end
-}def
-/indexed_image_lev2_sep
-{
-	/indexed_colorspace_dict AGMCORE_gget begin
-	begin
-		Indexed_DeviceN not{
-			currentcolorspace 
-			dup 1/DeviceGray put
-			dup 3
-			currentcolorspace 2 get 1 add string
-			0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub
-			{
-			dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put
-			}for 
-			put	setcolorspace
-		}if
-		currentdict 
-		Operator/imagemask eq{
-			AGMIMG_&imagemask
-		}{
-			use_mask{
-				process_mask AGMIMG_&image
-			}{
-				AGMIMG_&image
-			}ifelse
-		}ifelse
-	end end
-}def
- /OPIimage
- {
- 	dup type/dicttype ne{
- 		10 dict begin
- 			/DataSource xdf
- 			/ImageMatrix xdf
- 			/BitsPerComponent xdf
- 			/Height xdf
- 			/Width xdf
- 			/ImageType 1 def
- 			/Decode[0 1 def]
- 			currentdict
- 		end
- 	}if
- 	dup begin
- 		/NComponents 1 cdndf
- 		/MultipleDataSources false cdndf
- 		/SkipImageProc{false}cdndf
- 		/Decode[
- 				0 
- 				currentcolorspace 0 get/Indexed eq{
- 					2 BitsPerComponent exp 1 sub
- 				}{
- 					1
- 				}ifelse
- 		]cdndf
- 		/Operator/image cdndf
- 	end
- 	/sep_colorspace_dict AGMCORE_gget null eq{
- 		imageormask
- 	}{
- 		gsave
- 		dup begin invert_image_samples end
- 		sep_imageormask
- 		grestore
- 	}ifelse
- }def
-/cachemask_level2
-{
-	3 dict begin
-	/LZWEncode filter/WriteFilter xdf
-	/readBuffer 256 string def
-	/ReadFilter
-		currentfile
-		0(%EndMask)/SubFileDecode filter
-		/ASCII85Decode filter
-		/RunLengthDecode filter
-	def
-	{
-		ReadFilter readBuffer readstring exch
-		WriteFilter exch writestring
-		not{exit}if
-	}loop
-	WriteFilter closefile
-	end
-}def
-/spot_alias
-{
-	/mapto_sep_imageormask 
-	{
-		dup type/dicttype ne{
-			12 dict begin
-				/ImageType 1 def
-				/DataSource xdf
-				/ImageMatrix xdf
-				/BitsPerComponent xdf
-				/Height xdf
-				/Width xdf
-				/MultipleDataSources false def
-		}{
-			begin
-		}ifelse
-				/Decode[/customcolor_tint AGMCORE_gget 0]def
-				/Operator/image def
-				/SkipImageProc{false}def
-				currentdict 
-			end
-		sep_imageormask
-	}bdf
-	/customcolorimage
-	{
-		Adobe_AGM_Image/AGMIMG_colorAry xddf
-		/customcolor_tint AGMCORE_gget
-		<<
-			/Name AGMIMG_colorAry 4 get
-			/CSA[/DeviceCMYK]
-			/TintMethod/Subtractive
-			/TintProc null
-			/MappedCSA null
-			/NComponents 4 
-			/Components[AGMIMG_colorAry aload pop pop]
-		>>
-		setsepcolorspace
-		mapto_sep_imageormask
-	}ndf
-	Adobe_AGM_Image/AGMIMG_&customcolorimage/customcolorimage load put
-	/customcolorimage
-	{
-		Adobe_AGM_Image/AGMIMG_override false put
-		current_spot_alias{dup 4 get map_alias}{false}ifelse
-		{
-			false set_spot_alias
-			/customcolor_tint AGMCORE_gget exch setsepcolorspace
-			pop
-			mapto_sep_imageormask
-			true set_spot_alias
-		}{
-			//Adobe_AGM_Image/AGMIMG_&customcolorimage get exec
-		}ifelse			
-	}bdf
-}def
-/snap_to_device
-{
-	6 dict begin
-	matrix currentmatrix
-	dup 0 get 0 eq 1 index 3 get 0 eq and
-	1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop
-	{
-		1 1 dtransform 0 gt exch 0 gt/AGMIMG_xSign? exch def/AGMIMG_ySign? exch def
-		0 0 transform
-		AGMIMG_ySign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch
-		AGMIMG_xSign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch
-		itransform/AGMIMG_llY exch def/AGMIMG_llX exch def
-		1 1 transform
-		AGMIMG_ySign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch
-		AGMIMG_xSign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch
-		itransform/AGMIMG_urY exch def/AGMIMG_urX exch def			
-		[AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY]concat
-	}{
-	}ifelse
-	end
-}def
-level2 not{
-	/colorbuf
-	{
-		0 1 2 index length 1 sub{
-			dup 2 index exch get 
-			255 exch sub 
-			2 index 
-			3 1 roll 
-			put
-		}for
-	}def
-	/tint_image_to_color
-	{
-		begin
-			Width Height BitsPerComponent ImageMatrix 
-			/DataSource load
-		end
-		Adobe_AGM_Image begin
-			/AGMIMG_mbuf 0 string def
-			/AGMIMG_ybuf 0 string def
-			/AGMIMG_kbuf 0 string def
-			{
-				colorbuf dup length AGMIMG_mbuf length ne
-					{
-					dup length dup dup
-					/AGMIMG_mbuf exch string def
-					/AGMIMG_ybuf exch string def
-					/AGMIMG_kbuf exch string def
-					}if
-				dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop
-			}
-			addprocs
-			{AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf}true 4 colorimage	
-		end
-	}def			
-	/sep_imageormask_lev1
-	{
-		begin
-			MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{
-				{
-					255 mul round cvi GrayLookup exch get
-				}currenttransfer addprocs settransfer
-				currentdict imageormask
-			}{
-				/sep_colorspace_dict AGMCORE_gget/Components known{
-					MappedCSA 0 get/DeviceCMYK eq{
-						Components aload pop
-					}{
-						0 0 0 Components aload pop 1 exch sub
-					}ifelse
-					Adobe_AGM_Image/AGMIMG_k xddf 
-					Adobe_AGM_Image/AGMIMG_y xddf 
-					Adobe_AGM_Image/AGMIMG_m xddf 
-					Adobe_AGM_Image/AGMIMG_c xddf 
-					AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{
-						{AGMIMG_k mul 1 exch sub}currenttransfer addprocs settransfer
-						currentdict imageormask
-					}{
-						currentcolortransfer
-						{AGMIMG_k mul 1 exch sub}exch addprocs 4 1 roll
-						{AGMIMG_y mul 1 exch sub}exch addprocs 4 1 roll
-						{AGMIMG_m mul 1 exch sub}exch addprocs 4 1 roll
-						{AGMIMG_c mul 1 exch sub}exch addprocs 4 1 roll
-						setcolortransfer
-						currentdict tint_image_to_color
-					}ifelse
-				}{
-					MappedCSA 0 get/DeviceGray eq{
-						{255 mul round cvi ColorLookup exch get 0 get}currenttransfer addprocs settransfer
-						currentdict imageormask
-					}{
-						MappedCSA 0 get/DeviceCMYK eq{
-							currentcolortransfer
-							{255 mul round cvi ColorLookup exch get 3 get 1 exch sub}exch addprocs 4 1 roll
-							{255 mul round cvi ColorLookup exch get 2 get 1 exch sub}exch addprocs 4 1 roll
-							{255 mul round cvi ColorLookup exch get 1 get 1 exch sub}exch addprocs 4 1 roll
-							{255 mul round cvi ColorLookup exch get 0 get 1 exch sub}exch addprocs 4 1 roll
-							setcolortransfer 
-							currentdict tint_image_to_color
-						}{
-							currentcolortransfer
-							{pop 1}exch addprocs 4 1 roll
-							{255 mul round cvi ColorLookup exch get 2 get}exch addprocs 4 1 roll
-							{255 mul round cvi ColorLookup exch get 1 get}exch addprocs 4 1 roll
-							{255 mul round cvi ColorLookup exch get 0 get}exch addprocs 4 1 roll
-							setcolortransfer 
-							currentdict tint_image_to_color
-						}ifelse
-					}ifelse
-				}ifelse
-			}ifelse
-		end
-	}def
-	/sep_image_lev1_sep
-	{
-		begin
-			/sep_colorspace_dict AGMCORE_gget/Components known{
-				Components aload pop
-				Adobe_AGM_Image/AGMIMG_k xddf 
-				Adobe_AGM_Image/AGMIMG_y xddf 
-				Adobe_AGM_Image/AGMIMG_m xddf 
-				Adobe_AGM_Image/AGMIMG_c xddf 
-				{AGMIMG_c mul 1 exch sub}
-				{AGMIMG_m mul 1 exch sub}
-				{AGMIMG_y mul 1 exch sub}
-				{AGMIMG_k mul 1 exch sub}
-			}{
-				{255 mul round cvi ColorLookup exch get 0 get 1 exch sub}
-				{255 mul round cvi ColorLookup exch get 1 get 1 exch sub}
-				{255 mul round cvi ColorLookup exch get 2 get 1 exch sub}
-				{255 mul round cvi ColorLookup exch get 3 get 1 exch sub}
-			}ifelse
-			AGMCORE_get_ink_data currenttransfer addprocs settransfer
-			currentdict imageormask_sys
-		end
-	}def
-	/indexed_imageormask_lev1
-	{
-		/indexed_colorspace_dict AGMCORE_gget begin
-		begin
-			currentdict
-			MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{
-				{HiVal mul round cvi GrayLookup exch get HiVal div}currenttransfer addprocs settransfer
-				imageormask
-			}{
-				MappedCSA 0 get/DeviceGray eq{
-					{HiVal mul round cvi Lookup exch get HiVal div}currenttransfer addprocs settransfer
-					imageormask
-				}{
-					MappedCSA 0 get/DeviceCMYK eq{
-						currentcolortransfer
-						{4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
-						{4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
-						{4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
-						{4 mul HiVal mul round cvi		 Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
-						setcolortransfer 
-						tint_image_to_color
-					}{
-						currentcolortransfer
-						{pop 1}exch addprocs 4 1 roll
-						{3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div}exch addprocs 4 1 roll
-						{3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div}exch addprocs 4 1 roll
-						{3 mul HiVal mul round cvi 		Lookup exch get HiVal div}exch addprocs 4 1 roll
-						setcolortransfer 
-						tint_image_to_color
-					}ifelse
-				}ifelse
-			}ifelse
-		end end
-	}def
-	/indexed_image_lev1_sep
-	{
-		/indexed_colorspace_dict AGMCORE_gget begin
-		begin
-			{4 mul HiVal mul round cvi		 Lookup exch get HiVal div 1 exch sub}
-			{4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}
-			{4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}
-			{4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}
-			AGMCORE_get_ink_data currenttransfer addprocs settransfer
-			currentdict imageormask_sys
-		end end
-	}def
-}if
-end
-systemdict/setpacking known
-{setpacking}if
-%%EndResource
-currentdict Adobe_AGM_Utils eq {end} if
-%%EndProlog
-%%BeginSetup
-Adobe_AGM_Utils begin
-2 2010 Adobe_AGM_Core/ds gx
-Adobe_CoolType_Core/ds get exec
-Adobe_AGM_Image/ds gx
-currentdict Adobe_AGM_Utils eq {end} if
-%%EndSetup
-%%Page: (Page 1) 1
-%%EndPageComments
-%%BeginPageSetup
-%ADOBeginClientInjection: PageSetup Start "AI11EPS"
-%AI12_RMC_Transparency: Balance=75 RasterRes=300 GradRes=150 Text=0 Stroke=1 Clip=1 OP=0

-%ADOEndClientInjection: PageSetup Start "AI11EPS"
-Adobe_AGM_Utils begin
-Adobe_AGM_Core/ps gx
-Adobe_AGM_Utils/capture_cpd gx
-Adobe_CoolType_Core/ps get exec
-Adobe_AGM_Image/ps gx
-%ADOBeginClientInjection: PageSetup End "AI11EPS"
-/currentdistillerparams where
{pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse
{ userdict /AI11_PDFMark5 /cleartomark load put
userdict /AI11_ReadMetadata_PDFMark5 {flushfile cleartomark } bind put}
{ userdict /AI11_PDFMark5 /pdfmark load put
userdict /AI11_ReadMetadata_PDFMark5 {/PUT pdfmark} bind put } ifelse
[/NamespacePush AI11_PDFMark5
[/_objdef {ai_metadata_stream_123} /type /stream /OBJ AI11_PDFMark5
[{ai_metadata_stream_123}
currentfile 0 (%  &&end XMP packet marker&&)
/SubFileDecode filter AI11_ReadMetadata_PDFMark5

-
-   
-      
-         application/postscript
-         
-            
-               Ghost2
-            
-         
-      
-      
-         Adobe Illustrator CS3
-         2009-09-01T09:53:06-07:00
-         2009-09-01T09:53:06-07:00
-         2009-09-01T09:53:06-07:00
-         
-            
-               
-                  256
-                  256
-                  JPEG
-                  /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FWPav5103Q25a7b3OnWXLiNSeP1bSvi8sBk9Ie8qoMVTuzvbO9t
o7qznjubWUcop4XWSNx0qrKSD9GKq2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K
uxV2KuxV2KuxV2KuxV2KuxV2KtMqspVgCpFCDuCDiryHSfP82ifnFfflrqk/17Rr+NZNHknJklga
WH1GtJXapkjYcuHKpGwqa7KsV/MW01z8lvMNt5p8oEnyhqs3p6p5fYn6tHOat+7G/p+ooPAj7JFP
s0XFL3Dyf5s0jzZ5dtNd0mTnaXa14NTnG42eOQCtGU7H+mKE5xV2KuxV2KuxV2KuxV2KuxV2KuxV
2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVD3uo6fYRetfXUNpD/vyeRY1292IGKsVvvzk/KyxYrP5o09
ivX0ZhP/AMmefjiqS3H/ADkh+TkNQNdMzK3ErHaXZ6dwTEFI+RxWkM//ADk3+UKoWGpTuR0VbSep
+9QMVpCy/wDOVH5UooKyX0pJ6JbUI/4JlxWmMa9/zmBoaQOvl/Qrme4IpHJfvHCinxZImmLfLkPn
immG/kl5Y83+ffzQTz5q/M2dpcm8u9QZeCSzxikUENP5fh2GyqKeGKl7v+fun297+UfmFJh/cwpc
Rt4PDKjinzpTFDxz/nEXzZPDrmq+VpXJtbuH69aoTss0JVJOI8XRgT/q4pL6kxQ7FXYq7FXYq7FX
Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8n/ADD/AOcj/JPlSSSxsCdd1eOoa3tnAgjYbUkn
owqPBQx8aYrT5/8ANf8Azkf+aGvs8cF+NGtGrSDTh6T0PSs5LTV/1WGKaebXt/fX9w1zfXMt1cN9
qad2kc/NmJOKUPirsVVbe2uLmdILaJ555DSOKNS7sfAKtScVeg+V/wDnH/8ANLzAyMmkPptq/wDx
86ifqwA/4xtWY/QmKLe3eSP+cUfKulvHd+Z7t9aukIb6pGDBagjs1D6kn3geIxW3t9nZWdjaxWll
BHbWsChIbeFQkaKOgVVAAGKHi3/OVHnq00vyYvleGQHU9bZGljB+JLWFw7OfDm6Ko8Ry8MUh4t/z
jS86/nDo4jWqPHdrMfBPqshB/wCCCjFS+2MUOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K
uxV2Kqdzc29tbyXNzIsNvCpkmmkIVERRVmZjsABir5L/ADr/AOchtR8xXE+g+VZ3s/L6ExzXiVSa
77HfYpEey9W7+GKQHh2KXYq2ASaDcnoMVeseQP8AnG3z35ojivb5V0LSpPiWa7Umd1O4MduOLUPi
5X2xRb3fyv8A84yfljoyo97bS63dLuZL2QiPl7QxcEp7NyxRb0rSfL+g6NF6Okada6fFSnC1hjhF
PfgFxVH4q7FXk/5sf85BeW/JiTabpjJq3mQVX6shrDbt43Dr3H++1PLx44rT4/8AMHmDV/MGr3Or
6vctdX903OWV/wAFUdFVRsANgMWSL8meb9Y8oeYrXXtIKC8tSwCyrzjdHUq6MNjRlNNiD4Yq+2Py
t/NXQfzA0Y3dl/o2pW9BqGmuwMkTHowO3KNv2W+g74sWa4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FXzb/wA5U/mdNEyeRNLlKclSfW5ENCVb4orc08RR2/2PvikPmjFLsVdir62/Ib8h
bHQbK28zeZrdbjX51WaztJQGSzUiqkqdjMepJ+z0G++KCXueKHYqg7fWdKudQm063uo5b22HKeBG
5MgrT4qdNzkzikIiRGxa45oGRiCOIc0ZkGx8r/np/wA5C6peaheeV/Kc5tNNt2a3vtTiNJbhh8Lp
Ew+xGDUVG7eNOqkB8/kkmp3J6nFLWKuxVPfJXnHV/J/mO013Sn43Fs1JIiSEliP24np+yw/r1GKv
vjyt5k03zL5esNd01uVnqEQljr1U9HRv8pHBU+4xYppirsVdirsVdirsVdirsVdirsVdirsVdirs
VdirsVaZlVSzEBQKknYADFX53+cNfm8w+atW1uVizahdSzrXsjMeC/JUoBiySfFXYqzb8ltDt9b/
ADS8u6fcIJIDc+vJGejC1ja44mvUH0txipfeeLF59+Zfn7UNA1Cw07TikcswE9zM6hqRFygUA7b8
Wqc2Wh0cckTKTpu0+0ZYZxhHmdz7maa7cXFtomoXNsK3MFtNJCP8tIyV/EZg4ogzAPKw7TPIxhIj
mAXlf5Fosmp6vcyPynEUa/EaswkdmY/egzb9q7RiOjz3YG8pk89v0vXp42khkjVzGzqVDjqpIpUf
LNI9M/OXV9KvdJ1S70u+jMV5ZTPBcRns8bFW69ttsWSDxV2KuxV2Kvq3/nELXZrryrrWjSOWXTbu
OaEH9lLtD8I9ucLH6TigvfMUOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVQvo3lsriKMVd4n
VR0qSpA64q/N5lZWKsCGBoQdiCMWTWKuxV6L/wA49XUNt+cXlySU0VpLiIH/ACprSWNP+GcYqX3J
ixeZ/m/5L1LVDb6zpsTXM1tF6Fzbpu/phi6si/tULGoG+bXs3VRhcJbW6HtnQyyVkgLIFEeTLvJO
s3mseXLe4vreS3u0rDcLKpXmyAAuOW5DfrqMwtViEJkA2HZ6LNLJiBkKl1S7Qvy6tdC8zy6xpt20
VnMjI+nFKr8dDQScvshhUDj9OW5dacmPhkN+9o0/ZscOYzgaif4WX5hOyeLfnv8AkOnnBX8w+XlS
LzLEgE8DEKl4iCgBPRZQBRWOx6HsQpBfI19Y3theTWV7A9td27mOeCVSroy9QyncYpUMVdirsVfU
3/OHmmNF5f8AMWqFaLdXcFsrb7/Vo2cjw2+sYoL6DxQ7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX
Yq7FXYq+Efzs8lzeU/zE1Sy4FbK8kN9p7djBcMWoP9R+SfRiyDBMVdiqK0vUrvS9TtNSs39O7spo
7i3fwkiYOp+8Yq+//IfnTSvOXliz13TmHC4UC4grVoZ1H7yJvdT94oe+LFkGKuxVKNQ83+WdPvjY
3upQW92KFonahXkKjkei1Brvl0NNkkLAJDjZNZihLhlIAppBPBPEs0EiywuKpIhDKw8QRscqIINF
yBIEWF+BLzP84/yU0bz7p73lsqWfmeBP9FvgKCUKNoZ6faU9A3VflUFV8V6jp97pt/caffQtb3lp
I0NxA4oySIeLKfkRiyQ2Kr4YZZpkhhQySyMEjjUVZmY0AAHcnFX3v+U3kz/B/kHStEkAF4kfrX5B
rW4mPOQV78SeA9hixZfirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirz/85fyps/zB8uiC
Nkt9bseUml3bDbkacopCN+ElB8jQ+xVfEmtaLqmiapc6Vqts9pf2jmOeCQUKkfgQRuCNiNxiyQOK
uxVmX5Z/ml5i8gaubzTWE9jOQL/TZCRFMq1puK8HWvwsPxG2K0+yfy9/NLyl5708T6PchbyNQbvT
ZqLcQnvVf2lr+2tR9O2LFl2KsE/NLyXY6po9zq8MYj1SxiMpkUf3sUYqyv40UfCevbNhoNUYSET9
JdR2toY5MZmPriPmwL8pPMmo2PmS30sSM9hflkkgNSFcKWV1HY1G/tmy7RwRljMuodN2NqpxyiH8
MnvGc69g7FXxn/zlJZ2Vv+a0z2yqslzZ2813x7y0ZKn34IuKQ8ixS+k/+ccPyRuFubbzx5jgMax0
l0OxkFGLH7NzIp6AdYx4/F4VUEvpbFDsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir
DfzG/Kjyl59shFq0Biv4VItNTgotxH1IWpHxpU/Ybbwod8VfLXn3/nHb8wPKzyT2tsdc0oVK3dip
aRV/4tg3df8AY8l98U28vZWRirAqymjKdiCOxxStxVF6Vq2p6RqEGo6ZcyWd9bNzguIWKup+Y8eh
HfFX23+R/wCZs3n7yiby9iEWrWEv1W/4CiSNxDLKo7cwd17EHtTFiz29tUu7Oe1c0S4jeJj7OpU/
ryUZUQe5jOPECO9hXkf8rbfy7qB1K6uheXihlt+KcEjDChbckliNvbM/Va85Y8IFB1Wg7JjglxE8
UujO81zt2KfmH+ZflnyJpDX2rzhrl1b6lp6EevO4HRV7LX7TnYfhir4yuLfz1+aPnG91KzsJtR1K
+l5yLCp9KFKcY0MjURERAFBZsWT6D/Kn/nGTStBlg1jza0eqatGRJBYpU2kLDcFqgesw9xx9j1xR
b3UAAUGwGKHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXEgAkmgG5JxV5b53/AOcj
fy68sPLawXDa1qUextrCjxq1aUecn0x78eRHhitPE/M3/OVv5g6kzpo0FtoluQQpRfrM4r4ySjh9
0YxTTybXvMeueYL5r/Wb2W+u2FDLKamnsBQDFKW4qyPy1+XXnjzNLGmi6LdXSSUpcemUgAPdpn4x
jr/NitvsL8kPywm/L/yq9nezrPqt/L9ZvjGSYkbiFWNCaV4gbt3PtixeiYqtkZkjZlQyMBUItKn2
HIqPvOKsX1mH8x9TjMGlT2Hl6F9jeSq1/dqPFYf3MCN83kGKsV0//nHXyY+pNq/me6vfNOrSHlJP
qMx9MnsBHHx+EdlZiMVelabpemaXZpZabaQ2VnH/AHdvbxrFGvyVABiqKxV2KuxV2KuxV2KuxV2K
uxV2KuxV2KuxV2KuxV2KuxV2KuxVLfMfmLR/Lmi3Ws6xcC20+zTnLKdzuaKqgbszE0UDqcVfHH5q
/nz5n87zS2Vq76X5cqVTT42o8y+Ny6/br/J9ke53xTTy/FLsVfSH5Gf849+WNd8s2nmnzOXvRfF2
tNOjdo4ljRynKVkIdmLKTQMAB1rigl73o3kHyRooH6K0GxtGH+7I7eP1DTxkILn6TihPsVdirsVd
irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir5V/5y0853d15ksvKcLl
bDT4Vu7pAft3E1ePIf8AFcdOP+scUh4Bil2KuxV6D+W/52+c/IcZs7B473SGcu2m3QLRqx+0YmUh
oyfbavbFae06L/zl/wCV5lRdZ0O8s5DQM1q8dyg8T8Zgan0HFFMusf8AnJf8oLmgk1aW0Zugntbj
qfExpIB9+KKTq3/O38qLjj6fmeyXlWnqM0XTx9QLTFUfF+aX5aSpzXzXpAHT4763Q/czg4qjo/O/
kyTj6ev6c/OnDjdwGtelKPiqYW2raVdHja3sE5JpSKVHNetPhJxVFYq7FXYq7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+Lv+cnrKW3/ADcv5n5cby2tZ4qmo4iIQ/D4DlEfpxSHk+KX
Yq7FXYq7FXYq7FXYq7FXYqmun+avM+nU/R+sXtnxpx+r3MsVKUpTgw8MVZfo/wDzkD+belsvDX5L
qMdY7xI7gH5s6l/ubFFPRPLv/OYGrxssfmPQoLlOjT2DtCw9/TlMoY/7JcVp7D5O/Pf8tfNLJDa6
mLG+elLLUALeQk/sqxJjc+yucUPQMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVeMf85K
/lbd+a9Bg13R4TPrWjKwe3QVkntWPJlUd2jb4lHerd6YpD4+IINDsR1GKWsVdirsVdirsVdirsVd
irsVdirsVdirsVem/lt+fnnTyZLDayzNq+hKQr6dcuSUQf74lNWj+W6+2KKfXPkTz95c87aKuq6J
PzQUW5tnoJoJP5JE3p7Hoe2KGR4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXkn5m/845eU
/N80up6c/wChNclPKWeJOVvM3cyw1X4j/MpHvXFbfPXmn/nHv80vL7u36KOqWq1pc6afrAIH/FQA
mH/AYpt55d2d5ZzGC7gkt51+1FKjI4+asAcUqOKuxV2KuxV2KuxV2KuxV2KuxV2KuxVlX5bfmDq3
kXzPb6zYMXgqI9Qs60We3J+JD791PY4qX3ppGq2Or6VaapYSCWyvoUuLeQd0kUMvyO+4xYovFXYq
7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUo1Dzh5S00sNR1uwsyuzC4uoYqdt+bDFUHH+ZP5dyuI4
/NOkPI2yot/bEn5ASYqmHPy1r8HDlZatABXjWK5QA+3xjfFUhv8A8nPysviTP5X09SevowiDw/3z
6fhiqRXX/ONn5OzsWXRXgJrX0ru6pU+zSMBT2xW0ul/5xX/Kl1AWO+iIPVLmpP8AwStitoeb/nE7
8sJE4pPqkJ/nS4iJ/wCHhYfhim0JL/ziH+XhWkOq6uj16vLbOKfIW6frxW0Dcf8AOH3ldq/V9fvo
9vh9SOGSh96CPFbSe+/5w5nFTY+aUf8AlSezK0+brM1f+BxW2Mat/wA4nfmTaVaxuNP1FP2VjmeK
Q/MSoi/8PitvOfM35c+efK45a7otzZQ1p9YZOcFfD1oy8f8Aw2KbY3irsVdirsVfaf8AzjJqc97+
U1jHMxc2NxcWyE9Qgf1FFe9PUpixL1bFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWPefvPGkeSvLNz
r2qEtFDRILdPtzTPXhEte5puewqcVfGXnv8AOnz75xuJfrmoSWemsSI9Ls2aKAJ2D8TylPu5PtTF
lTBMVZ1+U35Uax+YWtva27/VNLtOL6lqBXkI1avFEXblI9DQfTipL6z8pfkf+WvlhYms9Iju7yKj
C+vgLiYsBTkOY4If9RRixZ4AAKDYDFXYqwvXfzn/ACu0O4e31HzFbLPGaSRQc7plNaUYW6y0PscV
Q+n/AJ7flLfgtb+Y4FUEKzzxz26gnpVpo4wK4qzLTtV0vU7YXWm3kF9bN9me2kSVDXfZkLDFUVir
sVdiq2WKKaJ4pUWSJwVeNwGVgdiCDsRir5H/AOcmvyu0XyrqdhrmhQraWGrNJHcWSbRx3EYDcox+
yrqfsjYEbdcUh4hil2KuxV90fkJ5cn0H8q9FtrlSl1dI17MhqCPrLmRAQehEZWo8cWL0HFXYq7FX
Yq7FXYq7FXYq7FXYq7FXYq7FXzF/zmHq1wdR8u6QGItkhmu3TszuwjUn3UIfvxSHznil2Kvsv/nF
rTrW2/KqG5iA9a+vLiW4buWRvSUH5LGMWJevYq7FXkf/ADk95j1nRPy1A0uV4DqV7HZXU8Z4ssLR
ySMoI3HMxBTTtUd8VDwH/nHq98h2vnuvnBIPSkgKabNeBTbR3PNSC/P4FPEHizbA+9MUl9rwGAwo
YCphIBjMdOPHtxptTFCyOzs453uI4I0nkFHmVFDsK1oWAqd98VVsVdirsVSPzR548peVrVrjXtVt
7FQOSxO4Mz/8Y4lrI/8AsVxV8ffnh+bzfmFrdutlC9toWmc1sY5NpJGkpzmkAJAJ4gKvYfM4pAeZ
4pdir2L8hfyVvfNurwa7rNu0XlazcSDmKfXJEO0SV/3XX7bf7Eb9FBL65g1BZtVlsrcAw2UYF04G
yyycWjjBHcR1Zh2DL44oR2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvBv+csfJNzqfluw8z2aGSTR
WaO9Vdz9WnK/HT/iuRR9DE4pD5PxS7FXvH/ONX5v6d5bmm8q6/OLfS76X1rC8kNEhuGAVkc/spJQ
fF0U9etcUF9YKysoZSCpFQRuCDihvFUj86+UNJ83+W7zQNUUm2u1+GRftxSKaxyof5kbf36HbFXx
359/IL8wPKdxK6WT6vpKkmPUbJDIOPjLEtZIyO9Rx9zim2J6J5285eXyE0jWb3T1Q7wQzSJHWv7U
VeB+kYpZZZ/85F/nDa8QNfMyL+xNbWr12puxi5/8NitI3/oZz83v+rlB/wBIkH/NOKKULn/nJT84
plCrrSQChDelaWtTX3aNqU9sVpINU/N/8z9UUpd+Zr/gftJDMbdT2oRD6YI9sU0xOaeaeVpp5Gll
c1eRyWYnxJO5xVTxVmHlT8pPzC80uh0nRZzbOf8Ae2dfQtwOtfUk4hv9jU4rb338v/8AnFbQNJ9P
UfOV0uq3UY5mwiJjs0IFfjY8Xlp/sR4g4otluofmYur6n/gv8s0ivNQiT07zWEUHTtMhHw8gV+GV
xT4EX4Se+xxQz7y/odpomlxWFszy8Szz3Mp5SzzSHlLNK21XkYkn7htiqY4q7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYqp3FvBc28tvcRrNbzI0c0TgMjowoysp2IINCMVfIv5yf8476t5ZnuNa8sQyX/l1
iZHtkq89oOpDDdnjHZuoH2vEqbeKYpdir0TyB+e3n3yXHHaWtyuoaTHQDTb2siKo7ROCHj+QPH2x
RT3Tyx/zln5Gv1RNes7rRpzTnIo+tQD/AGUYEv8AyTxWnpGjfmp+XOsgfo/zHYSOaERPMsMhr/xX
Lwf8MUMmhnhnjEkMiyxt9l0IZT8iMVSrWfJnlHWyTq+i2V+5/wB2XFvFI/0Oylh9BxVh2o/846/l
BfEsdCFtIf27ae4i8f2BJw7/AMuKpFd/84oflfPX0pdStakH91cRmlB0/exSYptAzf8AOIXkAkej
q2qoO4d7Z/1QJitq8X/OI/5ao6s9/q8oHVGntwp/4G3U/jito3/oX78i9E4yarGCFoa39+8Q27ni
8IxRa3/GP/ONXkwF7BtJ+sJ9hrCAXkxI8JkWT7y9MVYx5m/5y/0uIPF5a0OW5fcLc37rClR39KIy
Mw/2a4ppJtG8v/nf+cbpceY9Ql0TyjJRiiIYI5UJrSG3BDS+zykjwJ6Yq+hfJnkjy55O0ZNJ0K1F
vbg8pZD8Us0lKGSV/wBpvwHQUGKE9xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvMfPn/OP
P5febJJLxYG0fVZN2vLGiq7eMkJ/dt7kUJ8cVeFeaf8AnFf8xdKLyaQ1vrtsu49FhBPT3ilIX6Fc
4pt5hrflHzToTsus6Rd6fxNC1xDJGu+woxHE/QcUpRirsVV7S+vbN+dpcS27nq0Tsh26bqRiqcW/
5gefLYUtvMmqwigWkd7cJsOg2cYqmEf5u/mhGgRfNOpkKKAtcyMfpLEk4rS7/lcP5pf9TTqP/SQ/
9cVpQn/Nb8zZyC/mrVQV2Hp3k8f38GWuK0ld15t813a8brWr+4XwluZnHj+0xxWkXofkHzz5icPp
OiXt8Jfi+sLE/pGvczMAm/u2K29Q8rf84neeNQZJNfu7bRbc0Lxg/Wrge3GMiL/kpii3uHkf8gPy
68qNHcJZHVNSjoRfahxlKsO6R0Eaex4198UPSMVdirsVdirsVdirsVdirsVdirsVdirsVU7mcQW8
s5R5BEjOY41Lu3EVoijdmPYYYizTGUqBLDZPzZ0FNUi0w2d8l3LKkPCWJYuJkYAcg7hx1r9nM4dn
z4eK406w9r4hMQqXETXKvvZtmA7V2KuxV2KuxVplVlKsAVIoQdwQcVY/qn5deQtUJbUPLunXEh6y
vaxep4fbChvxxVjd9/zj1+T95Uv5eSJt6NBPcxUr/kpIF/DFUpm/5xd/KaQsUtbuHkKAJdOeO1Kj
ny/HFbQ3/QqX5W/z6j/0kJ/1TxW3f9Cpflb/AD6j/wBJCf8AVPFbRUH/ADi7+UsZXnaXc1BQh7qQ
V26nhw/DFbTix/5x/wDygsgPT8uxSMOrTy3E1TSlaSSMPuGKsn0ryP5M0mn6M0KwsyN+cNtEjV92
C8jiqd4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8Z/McAfmjpVB1+pk/wDI45vdF/i8
vj9zy/af+OQ/zfvezZonqHYq7FXYq7FXYq7FXYqoSX9nHeQ2TzKt3OrPDDX4mVKcjT2rkhAkX0Ym
YBEb3KvkWTsVdirsVdirsVdirsVdiryv/nILzf8AmB5Z8vafceT43Ek9wyXt5HAty0ShQUHB1kUB
zUVK/rxVmvkDU9e1TyZpGoa/b/VdYubdZLyDiYyGNaEod1LLRivauKp/irsVdiqC1fW9J0eCKfU7
lLWKeaK1hZ6/HNM3CONQKkljiqNxVK9Z8z6ForwR6jdCKe55fV7ZFeWaQL9opFEryMFruQtBiqvo
+taVrNmL3S7pLq2LFC8Z+y67MjqaMjL3VgCMVRuKpbrvmPRdCthcapdLbo1RGpqzuR2VFqxy3Fgn
kNRFtGfU48QuZpIbn8z9FtYUuLmw1KC1kICXMtqyRNXoQxIrXMiOgmTQMSfe4ku1McRZEwO/hNIX
RvzDl8y+ZbfT9DgaPT4VafULqdRyKAUCIoJC1YjcmuTy6PwsZlM+ro14O0vHyiOMekbklif5kf8A
k0dK/wCjP/k8czNF/i8vj9zre0/8ch/m/wC6Z/rf5k+UtHu2s7m6Mlym0scCmTgfBiPhr7Vrmuxa
LJMWBs7nP2ngxS4ZHdNNB8y6Lr1s1xpdyJ1QgSpQq6E9mVqEZTmwTxmpByNPqceYXA2mE08METzT
yLFDGOTyOQqqB3JOwysAk0G4yAFnkxxfzC0Cd5FsI7zUkiNJJbO1mmjUjtyC0zJ/JzH1VH3kOEO0
MZ+nil7oko/RPNmga2zx6fdB54/722cNHKtNjWNwrbZXl088f1DZuwavHl+k7jp1+SYXt9Z2NrJd
3kywW0I5SSuaKBlcYGRoblunOMBcjQCQL+Yfl701uJku7exk/u7+a1mS3avSknHv2zJ/Jz5Cie6x
bhjtHFVniEe8xNfOlafzxocXlqPzCpllspmZLdFjPqSOrMvEL2qYz1yI0szk4OrI67H4XiizE8tu
by7y556F1+Yba5rbm3gEUkUcapJJ6S0oqBUVm+Zp1zbZ9JWDghu8/pe0OLVHJk2FEdTXyes6N5v8
v6zdNa6dcNNOiGVlaGaMcAQpNZEQdWHfNPk084C5D7Q9Hh1ePIaid/cR94Qnmj8wPLXlu5trK+ll
n1S83tNLsoZLq7kUVqywxBm47Hc7ZQ5KTp+dXkT9IWOl3Et3ZaxqF1DZwaXd2dxb3Ie4cJGzJKi0
Qk/arTFWdO6IjO7BUUEsxNAANySTirBpPzo8jvdy2ulyXmuSW5pcPpFlcXscdOtZIkZD/sScVX2n
50flzeXthYWuqerqOoXK2cNgYpUuElbaksUio0YHct9GKu81/nL5C8rXc1prF1cxTwMEkC2d0yci
ocKJfTETEg/sscVRWifmp5K1fypP5rjvvquh20jQy3N2pho6AEgKakk8hQDc9sVQHk/87/y6826x
+h9I1Bv0g4YwQzxPD6oQEt6ZYUJCitOtO2KoXXv+cgPy00O4a2vbu6E6krw+pXSVKtxbiZY4w1D3
Bpiqf3f5j+VbPyvYeZrmadNK1KNZbR0tp5nKshkHJIUkKfCOrUHviqTeWPz1/LjzJeXttp9+8a6f
ave3VzdRtbwrBG6RsxeSn7Uq4ql9z/zkj+VVtcrFLfXIhckJefVJ/RYDqynjyZfcLirOovNegXHl
1/MVndre6QkTT/WLUGfkqCrBUQMxYUpxpWu2KvlT8yfzd1LzT+ZGgG4tLnTPL2kX1vPaWM0bieQC
ZS1w8YFWZgpCKK0Gw3JxS+jNL/N/yfqeo22n2q6gLi6kWKL1dPu4k5MaDk7xqqj3JxQxX80dJvD5
iuZrlTFZ6lFYx2msPD9ZgtltGuGnhljowHIypIKij9OqgYQqbfk1plxBBfXy2c9jp09vYWsEd0Wa
Se4s4nS4uwzhXZJOSIjMo5KlQKEYFek4q8b8uu3mz81Li5vx6ttp/qywQPuqpC4jiFPZnDH3zeZh
4OnAjzP6XmNMfzGtJlyhdD3bftevXtnbXtpNaXUYlt50McsZ6FWFDmljIxNjm9LOAkCDyLyD8pJ5
NL866pon2o5BJGxI+LnauQp+4tm67RHHijP8bvM9jnw9RPH03/2JUfzShef8x7CBJDC8qWqLKv2k
LSsAw9x1yWgNYCfex7WjeriLq+H73rOl+XNG0zThp9raxi3K8Zeahml8WlJHxk++abJmlOXETu9J
i08MceGI2/HN5X5TRdJ/OG402xHpWcslzCYh0CCNplX/AGLIKZt9R69KJHnt+p53SfutcYR+k391
on80dXvNX812PlG3kMdsZIFuAv7Us5BBanZEYEZHQYxDGcp57/Y2drZpZM0cAO21/H9T1XTtOs9O
sYbGzjEVtAoSNB4DufEnqTmnnMyNnmXoceOMIiMRQDzT84tOOm3Om+aNOP1a+WYQyypsWYKXjYjv
sjA16jbNr2bPjBxy3Doe2sfhmOaG0rpS/MjV7zWfy/0XVYUIt55Ve9Rd1EgUrQ/5PMMBX2w6LGIZ
pRPPojtTNLJpYTHIkX+Peyby3+YHlbzNZCwuWS3up09KbT5/hV6ihWNj8LA9h19sxc+jyYjxDcd7
n6XtHDqI8J2J/hP43TvyloTaFoFtpTSCU25lpIKgESSvIvXwD0zH1GXxJmXf+pytJp/BxiHdf328
x8l/+Ti1X/mIv/8Ak42bbVf4rH3RdBoP8en75fe9lzRvUPl/UfzHbyF/zkbr+peY7aWaxvI0tElC
8pIbZlieKSEGgKfB8QHv+0KYpes6rp/k780f8Oa95e1O1ubny7qlrfi4TeVYo5BJLbuhpJGZOAID
AbjFDCv+cl/OGpy6hon5daTcG2k11ozqMqkgmKeb0IYzT9lmDFx3oO2KQ9p8teXNI8t6Ja6NpMC2
9laIERQBViBQu5/adurHucUMR8+/lnBrPm7yv5r063jXVtJ1CBr+UUQy2amrciacmjIHHvSoxV35
/RxyflD5jDqGCwxMvIA0YTxkEV7jFXmP/OOf5b6B5m8jm/8AMfPVLOC9njsdJlYi0hfgnOb01I5y
PWnJug6YpL1Tyx+SvkPyx5sfzLolq9rctA8C2vqF4EMhBaRA/JlYgcftUoemKHn/APzl/FGfJuiS
lQZE1Eqr9wrQOWH08RikPTfyi/8AJX+Vv+2Zbf8AJsYofOf5C+WNE1j859cttRtVuLSwivLmC1b+
5MkV5Eic4/suq86hTtUA9sU9H1J5m8raH5l0S40bV7VLiyuEKcSByQ0+F4z+yy9QRih81/8AOPWt
ap5Q/NjU/IF3KXs7qa5tyhqFF1ZhmWVfD1I42Hv8PgMUlU/PX/1ofyz/ANuv/qMbFX1Nih2KuxV2
KvGrOGTyP+ZjzX/KPSdQMqR3Zrw9OYhxU/5DhQ335vJH8xp6j9UejzEI/lNWTL6J3v79/wAfN6vq
uuaZpemSaldzqtoi8lcEHnUVUJ/MW7UzT48Upy4QN3osueGOBnI7PN/yi0K9udWvvNV3EY47j1Ft
QRTk0r8pHX2X7Nfnm07RygRGMdHR9j6eUpyzyFcV18Uv/Mj/AMmjpX/Rn/yeOWaL/F5fH7mjtP8A
xyH+b/uns2aN6h41pX/k83/5iLn/AKhpM3mT/E/gPveXx/8AGj8T/uVPzwjaT+bNnqlz8NrPNaXA
kPQJGEif/geBOHSnj0xiOYtGuHha2MzyJif0Pac0T1Lzf88b6KPy/Y2XIetcXXqhe/CJGDfjIubT
sqFzJ7g6Lt7IBiEepl9ybeUksdM8q6D5e1aLlLqkUxWCVVZDyJnZHB78ZOlMp1BM8kpx/h/scrRx
jjwwxT/iB2PzpIfNn5NWEkEt55fdre4QFxYuS8b034ox+JT4VqPlmRp+05A1Pcd7h6zsSBBli2Pd
0Tj8odbvtU8rst67SyWU5gjlbcmPirKCT1K8qfKmU9o4hDJt1Dk9jaiWTD6tzE0xLyZt+cWqV2rc
X9P+RjZmar/FY+6LrdB/j0/fL73suaN6hgWreXvy5/NWzv4L+z+sS6Ne3OlyXI/dXME9u/GQI6kn
iT8QDbHwxV8/+e/y/wDMP5IeZNM80+XtSe50qWf04y9Ek2HNra4C/C6yID8QHboCBilMv+cl2vNG
/Njy75m9Jjbi2tZ7eoKkyWdw0jofcclr88VD6h0rVLHVdMtdTsJRNZ3sST28q9GSRQyn8cUKl5eW
llbPc3cqQW8dOcrkKoqaDc+JNBirBvz7/wDJQ+ZP+MEf/J+PFWNf84pf+Stf/to3H/EI8VL2TFXg
/wDzl9/yhGjf9tMf9Q8mKQ9K/KL/AMlf5W/7Zlt/ybGKHg//ADjb/wCTv80/8wd//wBR8GKej6mx
Q+Uvy5hHmn/nJ3UdZsBz06yur67eaMfCY1VreNgdx+8d1PvvilW/PoiL/nIPy1JJ8EYXTGLNsOIv
Hqa+G2KvqfFDsVdirsVeb3mvXHnXzFdeWLF4rbSbQMby4kRJZZfTYI3pLIGVfiOzUr39s2kcQwQG
Q7yPL9rpJ6g6rKcMaEI8zzJ91sg0/wDLPyZZJGo08XDRfZe5Zpanr9ljw+5cxp67LLrXuczH2Zgi
B6brv3ZHKkiWrx2gRJVQrbhgfTVgKJULQ8QfDMUHfdzSDWzzbWvy0826vri61c6raLdoUMQjjkCJ
6RqoUMWPXfc5tMWuxwhwCJp0mfsvNlyDIZjiFdO74s7iXzMNJkWWSzbVq/upFSUW9Kj7S8udaV6N
mvPh8XXh+12wGXg3MeP3Gvv/AEsEh/LPzbF5l/xEmq2v6RMrTH93Jwq4IZeIP2eJ49embE67GcfB
wnhdQOy8wzeLxjivuZfr3lO28yaLHZ60E+uIOSXVsCPTkPUx8+R4nup65hYdQcU7hy83ZajSRz4+
HJz7x+hL9N0/8w9JtI7CKfT9Ut4aJBcXJmhmCDYBwiuDQe9csnPBM3UonypqxY9TjHDcZgdTYP6V
C3/L+61HXF1zzXdR31xFQW1hApW2jCmoHxfE4r2I+dclLWCMODGKHf1YR7PM8niZjxEcgOQ/WjfO
nlG+8wXWkyW14LEafLJK861MoYheBjA2ryXuRlel1AxiVi7bdbpJZjGjw8JvzdPa/mK9q9kLrTfj
Ux/pICZZgDtzEIBQP/s6YiWC7qXu2+9ZR1JHDcP629/L9qaeWPLll5e0iLTbQllQl5ZW2aSRvtOf
up8sqz5jklxFv0umjhgIRYh5m/LbV38yf4j8tXsdpfM3qPFLUD1KUYqwDg8+6sKZm4NbHw/DyCw6
3VdmTOXxcUhGXmyDQtD8zfXI9Q8x6mtzPAGFtaWgMdupYFWdtkMjUNByFBmNly464YCvM83NwYct
8WWVkdBy/awXy/8AlV+YflvzN5k8yaNrtmsutalc3Y0W4SWSzlt5ZWkj9WReEkcy8+qKwHT4hmK5
qY3/AOX/AJw86axpVx57k0+30XRpvrcGj6Y0031i4XZHnmmWOiAfsqu4Jqd9lWS/mJ+Xeg+e9BbS
dWVkZG9SzvI6erBLSnJa7EEbMp6/ccVeZeT/AMu/z58gI+meXtV0fWNCLlobfUfrCenU/EVVByj5
deIkZa9q9VLNdN8h+atX1K11T8wNWgvxZSLPZ6BpsbRabHOm6yyGQmWdkP2Oew60xQu/NXyb5384
aRcaBpepWGn6LeIgu2mhlkumKOH4q4fgqEqP2a++KpR+Un5aefvIFv8Aok6vp1/oMtwbieJoJhcI
zKFb0XDhRXiNmU4q9VxV47+af5T/AJi/mEkFne6zpdnplnM01tBBb3HMkrxBlZ3epC1+yB1xVl/5
Z+WvOnlnR7bQ9bv7C/02wgWCxktoZYrgBTRRIWcowC7bKDir50/JbStb1H83/Mi6JqraRqNtDezw
z+ms0UnG9iUw3EbU5RPz3oQQQCDtino9u8xaP+fOvafNo31vQdGtrhTFdanZtdyTvGwIYRRyJSMk
dfiqOzYoT78sPyt0D8vtGex04tc3lyQ9/qEgAkmZa8RxFQiLU8V/Wd8VST85vyUsvzDhtbu3uxp2
uWKmOC5ZS8ckRPL05ACCOLVKsOlTscVQ/l78tfzMuYrex88ecDqWi2pUnT7KMRPchKFFubrjHMyV
HxL+13OKvVcVdirsVeJeaPJ0U/mWZvJ1xLd3plL3MEApHbOxJb/SeSou9fh6jN9g1NYx4ooff8Hl
dXoQcpOAkyveun+d+hU9X86tDFXF1cxL1qI70EDxI9R8FaTJ3D7E32hi7yPhL9qO0P8AOq9iu1tf
MVkqLULJcQhkdPd4m5V+inyyvL2WCLgW3B25IS4csa8/2PWYpY5YkliYPHIoZHU1BUioIPvmnIp6
MGxYXYEuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV8s/8AONv/AJO/zT/zB3//
AFHwYp6PqbFDsVdirsVdirsVY5+Yl1fWvkvVJ7JmW4WNQGX7QR5FWQinghO+ZWiiDliDycHtKco4
JGPOv7fsQH5V6nok/lW0tLF0S6t1P1y32EnqV+JyOpDdj9HbLO0McxkJPI8mrsnLjlhAjzHMebMs
wXZsH/Nix0i58vFZYUk1iV44tLCis7SFxVUp8RXiTUdPppmf2fOQnt9PXudV2vjhLFuLn/D32yny
/YSadoWn2ErcpbW2ihkNa/EiAGntUbZiZp8UzLvLn6fHwY4xPQAI/K252KuxV2KuxV2KuxV2KuxV
2KuxV2KuxV2KuxV2KuxV2KuxVK/MOoa5Y2Qk0bSTrF0xI+r/AFiO2C/CSGZ5O1dtgTirwH8rfy4/
N3yX58vfM115fgvItRinhuoI72BGUTypNyQsxGzxjY9sUvo+FpHhR5E9KRlBeMkNxJG61Gxpihfi
rsVdirsVdiq2WKKaJ4pUEkUilJEYVVlYUIIPUEYQa3CCARRedar+S+nvdm70XUJdMkryWOhkVT/k
MGR1H0nNnj7TlVTHE6TL2JAy4scjAq9r5B88R/u5POFwIehoru9PYvJtkZavCf8AJhshoNQNjmNe
79rIdC8l6ZpVx9eklm1HVKEHULxzLKAeoSuyj5b++Y2XVSmK2jHuDmYNFDGeKzKffLcp/mM5jsVd
irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf//Z
-               
-            
-         
-      
-      
-         uuid:388E95EB1797DE118B0A82103F86000E
-         uuid:398E95EB1797DE118B0A82103F86000E
-         
-            uuid:4fc5aa55-1472-406a-8a96-1789aef2484a
-            uuid:51E9FD129496DE11A6C9F766728B37C6
-         
-      
-      
-         
-            612.000000
-            792.000000
-            Points
-         
-         1
-         False
-         False
-         
-            
-               Cyan
-               Magenta
-               Yellow
-               Black
-            
-         
-         
-            
-               
-                  Default Swatch Group
-                  0
-               
-            
-         
-      
-   
-
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                           
-
%  &&end XMP packet marker&&
[{ai_metadata_stream_123}
<>
/PUT AI11_PDFMark5
[/Document
1 dict begin /Metadata {ai_metadata_stream_123} def
currentdict end /BDC AI11_PDFMark5

-%ADOEndClientInjection: PageSetup End "AI11EPS"
-%%EndPageSetup
-1 -1 scale 0 -1593.16 translate
-pgsv
-[1 0 0 1 0 0 ]ct
-gsave
-np
-gsave
-0 0 mo
-0 1593.16 li
-1590.16 1593.16 li
-1590.16 0 li
-cp
-clp
-[1 0 0 1 0 0 ]ct
-1590.16 1593.16 mo
-0 1593.16 li
-0 0 li
-1590.16 0 li
-1590.16 1593.16 li
-cp
-false sop
-/0 
-[/DeviceCMYK] /CSA add_res
-0 0 0 0 cmyk
-f
-1225.49 964.561 mo
-1225.49 964.561 1173.22 1161.73 749.34 1161.73 cv
-325.467 1161.73 319.751 999.611 320.257 986.181 cv
-325.467 848.107 548.003 900.062 548.003 900.062 cv
-548.003 900.062 461.106 904.39 461.106 982.322 cv
-461.106 1047.26 562.911 1097.86 768.421 1103.53 cv
-1186.65 1115.08 1225.49 964.561 1225.49 964.561 cv
-0 0 0 1 cmyk
-f
-899.849 30.6372 mo
-899.849 30.6372 1051.4 45.6304 1029.66 209.84 cv
-1029.66 209.84 1125.83 272.301 1118.8 358.891 cv
-1111.76 445.475 1046.83 547.829 839.806 582.155 cv
-839.806 582.155 960.07 549.232 964.46 482.276 cv
-969.16 410.838 845.779 380.534 845.779 313.432 cv
-845.779 246.327 998.64 236.836 986.359 123.952 cv
-978.229 49.3452 899.849 30.6372 899.849 30.6372 cv
-f
-778.652 371.993 mo
-788.296 367.012 770.466 354.073 771.49 331.269 cv
-772.66 305.493 783.359 289.628 768.242 290.028 cv
-756.407 290.341 738.892 312.574 741.77 335.21 cv
-744.647 357.844 766.3 378.374 778.652 371.993 cv
-.78 .255 .098 0 cmyk
-f
-762.626 441.996 mo
-750.522 449.959 781.625 458.158 789.093 482.047 cv
-797.531 509.049 788.17 528.586 810.06 523.764 cv
-827.199 519.998 844.001 491.899 830.897 469.322 cv
-817.8 446.743 778.138 431.805 762.626 441.996 cv
-f
-712.117 391.482 mo
-720.512 384.54 700.407 375.725 696.711 353.214 cv
-692.529 327.766 699.714 309.946 685.016 313.592 cv
-673.522 316.456 660.987 341.952 668.47 363.461 cv
-675.95 384.966 701.354 400.374 712.117 391.482 cv
-f
-1195.69 830.996 mo
-1135.07 726.16 950.72 697.124 818.578 692.97 cv
-703.634 689.359 557.435 681.428 557.435 640.162 cv
-557.435 584.014 720.84 616.451 718.735 547.197 cv
-716.848 485.163 564.268 483.169 585.494 329.762 cv
-595.34 258.597 683.087 219.965 760.067 202.939 cv
-837.049 185.916 934.95 152.538 936.81 110.321 cv
-938.68 68.1021 893.466 53.6753 893.466 53.6753 cv
-893.466 53.6753 920.091 69.5522 909.602 100.572 cv
-899.111 131.6 863.075 133.762 756.762 136.105 cv
-666.691 138.094 535.994 148.919 449.974 239.823 cv
-359.843 335.082 374.214 490.935 574.376 553.364 cv
-574.376 553.364 358.359 590.478 362.418 710.657 cv
-366.442 830.072 505.544 858.765 721.79 863.259 cv
-941.14 867.815 1024.24 889.637 1024.24 941.341 cv
-1024.24 983.261 957.75 1006.85 856.726 1010.45 cv
-750.587 1014.25 675.871 998.912 675.167 969.322 cv
-674.22 929.592 776.191 949.122 776.191 949.122 cv
-776.191 949.122 738.393 932.528 688.942 934.696 cv
-653.651 936.237 629.26 954.082 628.538 976.901 cv
-627.483 1010.45 657.534 1038.75 739.454 1052.31 cv
-865.914 1073.23 1029.81 1071.79 1136.03 1006.85 cv
-1215.27 958.412 1224.42 880.683 1195.69 830.996 cv
-0 0 0 1 cmyk
-f
-335.269 1387.99 mo
-335.269 1409.02 339.085 1414.48 357.016 1414.48 cv
-357.016 1421.03 li
-286.811 1421.03 li
-286.811 1414.48 li
-305.048 1414.48 309.225 1410.19 309.225 1392.27 cv
-309.225 1324.1 li
-309.225 1305.79 298.593 1294.1 282.255 1294.1 cv
-267.057 1294.1 256.043 1301.5 243.13 1320.2 cv
-243.13 1395.78 li
-243.13 1410.19 248.827 1414.48 265.538 1414.48 cv
-265.538 1421.03 li
-193.06 1421.03 li
-193.06 1414.48 li
-213.269 1414.09 217.081 1410.19 217.081 1387.99 cv
-217.081 1208.1 li
-217.081 1190.13 212.124 1187.39 193.06 1187.39 cv
-193.06 1180.84 li
-236.62 1176.15 li
-243.13 1176.15 li
-243.13 1306.96 li
-260.22 1286.65 272.76 1279.21 290.23 1279.21 cv
-312.676 1279.21 335.269 1294.5 335.269 1327.22 cv
-335.269 1387.99 li
-.78 .255 .098 0 cmyk
-f
-509.299 1352.4 mo
-509.299 1310.41 477.543 1279.21 435.312 1279.21 cv
-393.075 1279.21 361.319 1310.41 361.319 1352.4 cv
-361.319 1394 393.075 1425.2 435.312 1425.2 cv
-477.543 1425.2 509.299 1394 509.299 1352.4 cv
-480.966 1352.4 mo
-480.966 1385.84 467.267 1417.33 435.312 1417.33 cv
-404.108 1417.33 389.653 1387.78 389.653 1352.4 cv
-389.653 1312.74 406.774 1287.08 435.312 1287.08 cv
-466.508 1287.08 480.966 1317.8 480.966 1352.4 cv
-f
-601.692 1321.42 mo
-599.033 1298.48 584.221 1286.82 568.246 1286.82 cv
-554.886 1286.82 545.722 1294.21 545.722 1305.48 cv
-545.722 1340.47 616.733 1331.14 616.733 1382.47 cv
-616.733 1405.4 597.262 1424.94 574.051 1424.94 cv
-559.208 1424.94 546.271 1414.74 539.802 1414.74 cv
-534.854 1414.74 531.434 1419.03 531.051 1424.16 cv
-524.634 1424.16 li
-524.634 1377.02 li
-531.051 1377.02 li
-536.758 1405.8 557.688 1417.07 574.353 1417.07 cv
-587.717 1417.07 598.028 1406.96 598.028 1393.35 cv
-598.028 1354.86 526.468 1365.36 526.468 1318.7 cv
-526.468 1297.32 544.963 1278.94 567.51 1278.94 cv
-581.564 1278.94 585.74 1285.64 594.854 1285.64 cv
-598.274 1285.64 600.932 1283.67 602.849 1278.94 cv
-609.402 1278.94 li
-609.402 1321.42 li
-601.692 1321.42 li
-f
-831.443 1321.68 mo
-828.779 1298.74 813.965 1287.08 797.997 1287.08 cv
-784.632 1287.08 775.469 1294.47 775.469 1305.74 cv
-775.469 1340.74 846.479 1331.4 846.479 1382.72 cv
-846.479 1405.67 827.005 1425.2 803.798 1425.2 cv
-788.955 1425.2 776.017 1414.99 769.548 1414.99 cv
-764.61 1414.99 761.181 1419.3 760.796 1424.42 cv
-754.381 1424.42 li
-754.381 1377.29 li
-760.796 1377.29 li
-766.504 1406.05 787.437 1417.33 804.098 1417.33 cv
-817.464 1417.33 827.771 1407.22 827.771 1393.61 cv
-827.771 1355.12 756.214 1365.62 756.214 1318.96 cv
-756.214 1297.58 774.709 1279.21 797.256 1279.21 cv
-811.307 1279.21 815.486 1285.9 824.6 1285.9 cv
-828.019 1285.9 830.678 1283.93 832.593 1279.21 cv
-839.146 1279.21 li
-839.146 1321.68 li
-831.443 1321.68 li
-0 0 0 1 cmyk
-f
-987.529 1328.73 mo
-981.109 1328.73 li
-975.37 1303.83 958.12 1287.87 935.5 1287.87 cv
-908.673 1287.87 889.889 1311.22 889.889 1345.07 cv
-889.889 1382.82 913.269 1414.34 940.859 1414.34 cv
-957.35 1414.34 977.279 1405.39 991.35 1385.54 cv
-991.35 1395.66 li
-976.9 1415.9 956.2 1426.03 931.665 1426.03 cv
-891.42 1426.03 863.756 1397.61 863.756 1356.36 cv
-863.756 1313.94 894.865 1280 933.58 1280 cv
-953.899 1280 965.02 1287.87 971.92 1287.87 cv
-975.37 1287.87 978.81 1285.11 981.109 1280 cv
-987.529 1280 li
-987.529 1328.73 li
-f
-1061.99 1394.96 mo
-1061.99 1410.19 1066.57 1414.48 1084.49 1414.48 cv
-1084.49 1421.03 li
-1013.06 1421.03 li
-1013.06 1414.48 li
-1033.66 1414.48 1035.95 1409.02 1035.95 1387.93 cv
-1035.95 1312.58 li
-1035.95 1292.28 1030.99 1289.93 1008.11 1289.93 cv
-1008.11 1283.38 li
-1055.48 1279.16 li
-1061.99 1279.16 li
-1061.99 1309.07 li
-1087.16 1286.86 1098.99 1279.16 1108.14 1279.16 cv
-1115.77 1279.16 1126.07 1283.78 1132.94 1289.93 cv
-1122.64 1314.53 li
-1111.57 1308.28 1099.75 1302.43 1090.59 1302.43 cv
-1081.82 1302.43 1074.2 1307.11 1061.99 1319.22 cv
-1061.99 1394.96 li
-f
-1204.91 1224.65 mo
-1204.91 1233.96 1197.7 1241.71 1188.59 1241.71 cv
-1179.49 1241.71 1171.9 1233.96 1171.9 1224.65 cv
-1171.9 1215.36 1179.49 1207.99 1188.59 1207.99 cv
-1197.7 1207.99 1204.91 1215.36 1204.91 1224.65 cv
-1201.2 1395.35 mo
-1201.2 1409.02 1204.63 1414.48 1223.7 1414.48 cv
-1223.7 1421.03 li
-1149.59 1421.03 li
-1149.59 1414.48 li
-1170.19 1414.48 1175.15 1411.74 1175.15 1395.35 cv
-1175.15 1310.63 li
-1175.15 1291.5 1169.43 1289.93 1149.59 1289.93 cv
-1149.59 1283.38 li
-1194.69 1279.16 li
-1201.2 1279.16 li
-1201.2 1395.35 li
-cp
-f
-1248.42 1503.55 mo
-1248.42 1518.74 1243.08 1522.64 1224.77 1522.64 cv
-1224.77 1529.19 li
-1296.88 1529.19 li
-1296.88 1522.64 li
-1277.88 1522.64 1274.46 1516.4 1274.46 1499.65 cv
-1274.46 1408.93 li
-1289.66 1420.99 1300.68 1425.25 1315.11 1425.25 cv
-1353.47 1425.25 1382.19 1393.71 1382.19 1351.15 cv
-1382.19 1309.77 1356.15 1279.16 1321.18 1279.16 cv
-1304.09 1279.16 1291.56 1285.29 1274.46 1302.35 cv
-1274.46 1279.16 li
-1267.95 1279.16 li
-1224.77 1283.38 li
-1224.77 1289.93 li
-1244.99 1289.93 1248.42 1292.67 1248.42 1311.39 cv
-1248.42 1503.55 li
-1274.46 1312.5 mo
-1287 1297.66 1297.26 1291.81 1310.93 1291.81 cv
-1336 1291.81 1353.86 1318.75 1353.86 1355.84 cv
-1353.86 1390.19 1335.62 1416.35 1311.69 1416.35 cv
-1298.78 1416.35 1284.34 1409.71 1274.46 1399.17 cv
-1274.46 1312.5 li
-cp
-f
-1438.51 1280.51 mo
-1485.42 1280.51 li
-1485.42 1290.73 li
-1438.51 1290.73 li
-1438.51 1379.52 li
-1438.51 1398.6 1448.04 1408.33 1462.92 1408.33 cv
-1472.84 1408.33 1480.08 1404.45 1488.09 1395.1 cv
-1492.29 1400.16 li
-1480.47 1415.39 1466.74 1423.23 1451.48 1423.23 cv
-1428.56 1423.23 1412.47 1406.78 1412.47 1383.03 cv
-1412.47 1290.73 li
-1386.91 1290.73 li
-1386.91 1284.05 li
-1405.22 1274.67 1420.51 1257.92 1432 1234.15 cv
-1438.51 1234.15 li
-1438.51 1280.51 li
-f
-680.52 1282.48 mo
-727.433 1282.48 li
-727.433 1292.7 li
-680.52 1292.7 li
-680.52 1381.49 li
-680.52 1400.58 690.057 1410.31 704.931 1410.31 cv
-714.845 1410.31 722.099 1406.41 730.104 1397.07 cv
-734.3 1402.13 li
-722.479 1417.37 708.746 1425.2 693.486 1425.2 cv
-670.569 1425.2 654.478 1408.75 654.478 1385 cv
-654.478 1292.7 li
-628.921 1292.7 li
-628.921 1286.02 li
-647.231 1276.64 662.52 1259.88 674.009 1236.13 cv
-680.52 1236.13 li
-680.52 1282.48 li
-.78 .255 .098 0 cmyk
-f
-100.648 1478.17 mo
-173.436 1490.74 189.708 1499.82 189.708 1518.87 cv
-189.708 1539.22 166.153 1553.07 132.753 1553.07 cv
-89.5195 1553.07 56.5488 1536.62 56.5488 1514.54 cv
-56.5488 1498.95 72.3926 1485.97 100.648 1478.17 cv
-80.3198 1340 mo
-80.3198 1308.44 95.3789 1286.96 118.187 1286.96 cv
-140.557 1286.96 155.617 1308.44 155.617 1340 cv
-155.617 1375.94 140.128 1396.1 117.751 1396.1 cv
-95.3789 1396.1 80.3198 1373.75 80.3198 1340 cv
-84.877 1472.44 mo
-85.5947 1472.63 86.3125 1472.8 87.0479 1472.98 cv
-87.0479 1473.85 li
-48.3506 1490.74 37.5596 1505.88 37.5596 1522.77 cv
-37.5596 1550.91 68.1118 1569.83 112.204 1569.83 cv
-164.441 1569.83 205.591 1541.38 205.591 1505.45 cv
-205.591 1494.63 202.155 1487.27 193.137 1478.17 cv
-171.843 1456.21 92.208 1456.21 80.2046 1441.7 cv
-78.0649 1439.06 77.209 1438.18 77.209 1432.91 cv
-77.209 1423.23 102.915 1405.2 126.48 1403.88 cv
-158.177 1402.13 181.785 1373.08 182.949 1342.32 cv
-183.396 1330.54 181.738 1317.58 172.081 1302.17 cv
-190.22 1262.95 li
-184.269 1260.25 li
-184.269 1260.25 167.065 1277.66 157.806 1278.45 cv
-148.44 1279.24 144.662 1279.21 137.372 1278.76 cv
-130.08 1278.55 122.784 1278.11 117.207 1278.11 cv
-80.3198 1278.11 52.9868 1305.81 52.9868 1343.07 cv
-52.9868 1372 70.0708 1393.47 100.485 1401.8 cv
-100.485 1402.67 li
-70.7705 1413.02 54.0356 1426.58 54.0356 1444.52 cv
-54.0356 1457.19 65.6099 1467.41 84.877 1472.44 cv
-f
-1532.97 1260.71 mo
-1532.97 1250.49 li
-1539.63 1250.49 li
-1543.04 1250.49 1546.67 1251.25 1546.67 1255.34 cv
-1546.67 1260.41 1542.97 1260.71 1538.82 1260.71 cv
-1532.97 1260.71 li
-1532.97 1264.95 mo
-1538.6 1264.95 li
-1547.12 1279.24 li
-1552.6 1279.24 li
-1543.41 1264.72 li
-1548.15 1264.12 1551.79 1261.54 1551.79 1255.64 cv
-1551.79 1249.13 1548 1246.26 1540.37 1246.26 cv
-1528.08 1246.26 li
-1528.08 1279.24 li
-1532.97 1279.24 li
-1532.97 1264.95 li
-cp
-1538.9 1291.35 mo
-1554.15 1291.35 1567.19 1279.24 1567.19 1262.68 cv
-1567.19 1246.26 1554.15 1234.15 1538.9 1234.15 cv
-1523.49 1234.15 1510.45 1246.26 1510.45 1262.68 cv
-1510.45 1279.24 1523.49 1291.35 1538.9 1291.35 cv
-1516.08 1262.68 mo
-1516.08 1249.13 1526.08 1238.92 1538.9 1238.92 cv
-1551.56 1238.92 1561.56 1249.13 1561.56 1262.68 cv
-1561.56 1276.45 1551.56 1286.59 1538.9 1286.59 cv
-1526.08 1286.59 1516.08 1276.45 1516.08 1262.68 cv
-0 0 0 1 cmyk
-f
-%ADOBeginClientInjection: EndPageContent "AI11EPS"
-userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse

-%ADOEndClientInjection: EndPageContent "AI11EPS"
-grestore
-grestore
-pgrs
-%%PageTrailer
-%ADOBeginClientInjection: PageTrailer Start "AI11EPS"
-[/EMC AI11_PDFMark5
[/NamespacePop AI11_PDFMark5

-%ADOEndClientInjection: PageTrailer Start "AI11EPS"
-[
-[/CSA [/0 ]]
-] del_res
-Adobe_AGM_Image/pt gx
-Adobe_CoolType_Core/pt get exec
-Adobe_AGM_Core/pt gx
-currentdict Adobe_AGM_Utils eq {end} if
-%%Trailer
-Adobe_AGM_Image/dt get exec
-Adobe_CoolType_Core/dt get exec
-Adobe_AGM_Core/dt get exec
-%%EOF
-%AI9_PrintingDataEnd
-
-userdict /AI9_read_buffer 256 string put
-userdict begin
-/ai9_skip_data
-{
-	mark
-	{
-		currentfile AI9_read_buffer { readline } stopped
-		{
-		}
-		{
-			not
-			{
-				exit
-			} if
-			(%AI9_PrivateDataEnd) eq
-			{
-				exit
-			} if
-		} ifelse
-	} loop
-	cleartomark
-} def
-end
-userdict /ai9_skip_data get exec
-%AI9_PrivateDataBegin
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: Adobe Illustrator(R) 13.0
-%%AI8_CreatorVersion: 13.0.1
-%%For: (michaelv) ()
-%%Title: (Ghost2.eps)
-%%CreationDate: 9/1/2009 9:53 AM
-%AI9_DataStream
-%Gb!U'B3QiYdjY-ChUf_r!$b%'*6a:L'F'TNuKE5INZR=\e**
-%SPSB:>tOTLa2&9l9DgY3^Yc\;oXkXDJuIrq[[%;Y_?if*e+JGKe#F]of\\"##JWOA!(_-r!rY%B#N,$`8"QZ_
-%jH%JR^CMiHg$guMd`MG"4%fRCs3crENK7\TDcHVY:A[%]G(8';m^B.o#!n*e.0V_gfT=eDXer=SXuq*2)="^Y/N_$"*R=q0N'h<`&O.86Xa39ep3/IP$S0=Rsk8<3W.SY'MPX/b^;kee0[=p&$eE`1r!B7T=.lCWf>
-%iWocLlSdHuSJs?3]HD2lOr#u)$1n5tQfM^H:MR2$'GNTi.LA[P1C*$`^qA>\p4WBH,H/*[("em0U\W;R03_@S?h]Lkh:XA[88@c%
-%=[k\erhj!#1M7)2n+RcP1anOfVOZT0Vk)G.j56RP=SNP.h"Ej6#57YY]1[1D*o!rqW^>>0Yp5h'!02Iui(/Pu2s^FX5:J^Dh*>GhW?\
-%^Kh>6Q`@/go>@MM5FZS?rVJ^d#7>]7cEP*17`4JIr!ECO
-%a8a.'kVoe_IPZ.3ZA09Gj52R$DUa$>%5L(<(rsI?kIZXu20o"#m33BOQC4%Yk.fAi#=Zb]#(c3Ns),2)?"O1T8/2?AXW$"tXOX>Z
-%X%&77Ykoc1WDWn6kE/dJk&`,gK&gGg@m1t`1WOc2VpA1r6TPrBfArP?5YiO@\Eq^3g=:Qgdb>dBrOBCHP6\[sn]5]O/opa]L#$/dII[]i)1Y0i01<*Q$$)K[m&)BHW>0Yt$LlZA"i/C&5FZSISuV>$"PfOfT7ZSIn9?7I
-%rm,eh%1VmDrC4+OkVkbPk=FVb_l3PVm:Jtc0^[^\_6u6?D6oLh/04ekm)Smrrs+5lH(82SpKmm&)SHmDW(Rs.bQV)&^T4Jfh&%7+
-%!ZJLu*R/ciCjPM6s0"pmX[tW&4q=FiV-mN!&tHm*(Y_(HY?5VQdghhXCS@lUgK1-kCQVZHBbJDGLu?/_&T=kBeQT!cM_jAZmf2aF
-%5IsZnr]@hr^pa7Q,0+i?%=7uupV/ukrDuR4\Q;3E$$@X%ReW-DItDTH6N=Lir4g4n^%[$U"n_bCJL']lRW&5pLiHbP\H7gHh;Uku
-%g'V!W5L"NS1Y0R8/cQRF)qHCRqKO<,I@lM]a(HqH@lO?fXO)gM8$28Fn_!QmZ7c$]+_k;4@]etB^LUUmJ[RY2Yk?L,IBYVi)t/1n
-%*07M?iKsO$L'<^,Q^r]tefZ>5rsm3R']-T6*oDs+[14P8'IKSN4IOm6))mC@F%gBGqVt/BhAgnjSHC2I_HjX?Dt'p[hpqhS-gg[;
-%3F,4F7lLl%=YUi.7R,#+\R$$dD.2;'eh(6kZe4QTgACHH>-H]FHeVP)9oBT_Me251B#0/B-KqS\17T(t*@/)urD)pXg?U\Vk5R9N
-%]l"kSa_nKo$gBO`#;$RQo8j;;W>b_=VeX_FDg74"g^2:QheeU"#5qT/h+7897d%tW?9Y%T>H?G2DUFXI:XWp(^]^Bpdq7T
-%C$utn'o#9(=%(@,b1WHFKdfF&Ur]hi#OZDkLO%S>,r"`_7^_(<-lcGs)BsQU8]<0EEm@1%&tD/A>Rb_WFQ1An?$3M)g*7mOY!)IqX3P5I"Wb!pmF_.QS*IAJsot"/Ds3f
-%2@3k@5.On.N9J5sj6\1.8J]a3Nlj$SmaMTJ)9=9plG2/W$V1Hlr+L=ejDENGC3FC.clf','ZV$&1f7cTU/#h(OrA5GTQ=u,4'KhIH+Z=fr3N%!OZ&\%-?E@sOFS*q6FH5#N[:ZnZe$C+'PX^e.?4DHTq\?S9mYSa/&ihMI@*uS_`[2;FRLRYk\UHjH`+Y85)lLa_m&sKuqc$125::$r*2KQF#l(,gUXKS4srCQDo
-%c+fCQ][iCX"3,rQr!%H<:+!K9CG('<,-?ZqZR-YU5EloNq$hQ$1()q.HKaFKHD+hr'Z*pZ2R;>d4;ZYOpJu,gm+rp*rZ*nFd]2&J
-%q\):T[*`*i(Q)F1e-A]^)a(iFqXOMaki#BU<$SW=)YL$uDapWD1@Os\^JJjZGK70iDc!dl-Me2&/$qQQ[).'g=/\!=A]*Zc/$p6;
-%@(6(T])3W5`HIjnAVE!VnYgT1rF'-pC"W=$N'>ffpMGWhEkB^D),h\%Wn%U"=3cRYTNh[b2CH;gco=J_@+a06QT:^K*Gq]Xme2h:)=D?3sZ-9hb6al1*VkfsG[U1aR[ImA:)_mSkd40oa4BCYI)2
-%H`thXD"m12kA+b_)nkB(RghC][3W@h1S\s;/Qn5HD-62URf2\iQo)[g[#s<)`I]p1#\Yo0qA@3YRk?V,rIc)$Qq&RONe&Ng'Y^g5
-%4%S#MNq#?*k`E7knOd'""]ug"b>u"i_aH3uL)C^o2`KH8//aYLW&?"s`GB@\QXKF]c+ZOQ"[VkD")J@8NimoQR.R"7\suK6!Me?d
-%9X7lu\Uq)A>1Mhj+ka,LJAYL*&Yl`Y4(:$)gr=A6F-lf$!o&3+NN\pdjtU$q;D5U947a<6]ok%a:@&nfSTZDC'?f_]V*ltG\&%9C
-%oKjF6M!q:q%eG]77"]D`pDRQ[=&G!G2,(R7l[tabPqeu>kUZg(g.ph'2GM^>
-%MId'FT4SFTRhS>/eN1-c'S[1iY!5Cmp;m-bq4Pms5knf.&&qqVqrONJL<\DXpRWgh]Qhk=GMYNCc?I/DRDG*%6je9dB['F'_Q\r[
-%2+t2DpYTIf\Sj8JYt`F2p6O,+Vdk)p7jt.J(UkWs?Jqk#;-GI=bq!!9NpbKPN(cYo4Jrck`^'ug'Z<4F@`"hq%cSIDq*l,h326kS
-%q"SK^;/Z]2DhdH_Wh-ZUN)$M/VaZE(BgrVr4gV:Iq9N]KSa9AV`bAH-8TsrdP@V(V@'dX_
-%VehtE(QtGmYtOlVmd*_^OR*#N,_;@%FC&Kkg>,9,fu>6bAtWBA#.%ZRK)qV2GHd"77^>V2X/a9BoadX,=1_bR2J(Cpi9_2UGL51i
-%DS+@,*N]bZ5ChF0hOWVp^#YjbL%S2pG[pk]^DY;!:DuQ]Q%ZFb"Ck+gl)X$bFOZT'r'hVY%\%h3Q'`o=2S)`*c1Y3I?F]?'g\%S_
-%9KZEqOFFCM>s;?EmDoj#X8,3&Bo39KgFfrnYjFm>_hIGR$fl>)6cB=;f`b:;B_'6G6MkgB4)PlX&7b&F&2eDQi?FW\$n1*,FaF6,8LGHi:T#s>=Mj>(:@BoJZnJ@Sr$UXl:l`tVOTZK8)gfr3JG$Y*DAiFUB7BW"@=itW0p-nmROB0\o7Jjp3r>U$d
-%,&UZY[s-^%]s%CfMm_iq4*SGW58CJ>(WpA?,OVb3o#8QU(abMRs&r-.:*9+-m^!5GI_?Oqftm5j.X,pBPKIqo!`rX=:Qt>1<%2l@
-%on;0.b\lT:g,Su;/oGI!VE?9a&$,M5jc4X;EcpOo\,Y/1_(^VK^/j"2F\`N,O7_;?[_I,m.!H`.RpG(=J_PGuhd;Z#[as=1V(K)l
-%%O98iB1r&s$Q/A8$!K#g;F*Frk7D>pXc@a_Z-p79;/unH;7`P2ETYj$b5E:g%d*3
-%HeP'erN,pO5PJ@NqYcG$e0j;PjQYHLe33In?9WT_pl>2+GBs\8GQr=\<9aCB.s"?2^8&uDLSPaAabeST$c,G<=iQ`7]:VWrf3GN,Fd=YkI
-%V;J;:;1Tp,]C(*\7tQ1*%Sq*&bja1!*i69.;AM`e3^X&CZ<@_X@R&Ud1:D*TZ
-%U=&:-k&AhH+Uk!0QT!@I?e)RIG!V@+*V;2;.5jKbl1C6rL,lNaM?Y0:R6rOi2E,P
-%YGJ@O;'.ULj`7+d7O=;]61RnPl)n+GS)NIX=0`3X6)0aVfCPV7s&%*#
-%1WJHUYN-Q9LEQcgrm!"p8CmK5\#8"9*ORrWhfCU"L,$2dP]5.=&G)F:Y%1iChlk+mon>9@]A-ad(N\`;?i#pUo.4i.V_T,i=BnYj
-%]14Fi]oU'6*&[2DMSkgeijb(rRT7Kal=Os*/j=E"3pK1\2s8"rC9)`j84S*r0-@bZS@QqJm&qGh0JIHc=>!qOH1cF@2iLo]GXjW[
-%)]<_Hjn"(NXo$`)o*_U0<,psppm@"4L7ue]II,(``sRjL%3bOH?^SCiT-(kI_N:iW[VG3qm(Bjns)_I4$%7;Or,h/W?r0S"EX,Cn
-%I_aFOFhZS1bkaJV9do1&o@n=Jps`Btm+9sK>+XcZ_%?.\m!j11h<+I=D5_*nqm,Ca6N[/`^;d?@W;`tB/>P2MDKjD/T(Z6G%M!,u
-%r_JTbB,KbjS!=3Z%@#Jnc1Sn^^sf(Qb-H>WpO0'454FkU'lnao46G\l%F#DJ<>MaE)r+bL5Grgm@
-%BX!e*g:U^k3j5`21TOg9.I7[u[BAuEr?d\dg](8&g!6)PkIe>FO4;V*$D5K.>hl2s2_X*9^=KJcl,V!JJ#f6'>"[n;?GT%@qblZo
-%lYE%ER*Oe?):084GbVS^_.C;!&8-g1;=CRZ^pD#B=tKiRhom_J6UeHq2.hN\[7]:tL?:Ou<*'.+FY>$GO1Mf5gtST]`8k;1f(Na+PeiP@l<_YnjC`X8l#Mg'nG22M1MV>H@Fc;2LKS=s
-%T/m($OGl$JocI2F^CMB.VYn9@g!`)!WQ
-%TH:/ifkePV"Tk.WTLQl((^)JDWt4(`j7D=NImqJ+)_*d!V!4Ir''tW.tM>M!leS/m-,n
-%/:ag,Hn:[AY?l%_<0o]4h/rV<)e4Ki[u6l#"rJlau@/cl?T8gR8^@N]::*1-q\2iL\0TQ$T(=kD/&<\&<1r*j+;F0
-%I9*ko+!(6\&;FU08UaY-G5SerfgBc>k3=4,%s'*Fd@e6B-uF3k0]/.lE.#X^_nF5OY%Ar,L%KO%9_546U<29.(\bZ=Eu11W*9)"#
-%`mRqDYKe`fO+dHSe/'!SSf%@4?9%4EU]o]",DGQ,D6FZ-I4BBm&a]2&V%=%K\K`c>r9eWEcgF0ma5Pn&Jn_=^Zfgc*=[.!t7+CDh
-%a!2P'*CAX9qUnAf69Koa1P(Gtk>mV'7p;EQX\j1)bsnITJau^c9XmRbp"EQ8Mpbkrat/Wsq9.:b>h?)8,*iogCj)Fo$8,aso:q6!
-%\ONF"i&9ZLX]jV/qB:Z7im?`Ek']8g&>Zh^D9Bu*"J$"dX]0P(d@5Ve^jYXlmV(;#bSbq7a@8"(;%1W`AD^:V_'^"[sGRGH7BB4nOBMu[M??]PaB
-%N32D!dm!I-9lEP!3S([S!O;*9fI(+RO+#u4Y^J?[4&$6?LNg)>1%/MjEnElP:jgS#Y[^h,6O;DHI)h4*"KZ4KkD4mY^59*p@:#U>
-%-Dgh*4..LB&8*=W9PdKC/?Ff6cJ$!ZPt#iNl-ZFM)g>qlr)tF[mMB\94MB2cD1mH/a+8M<]JkEf$"+Hde7JdFKYh>c
-%BoOPK*(j^cn+XY_6ijB.@H=p`i!ME/cVME_:616@+F^6W(_Eqr+"fA,'ce![H_:4X8..EKSr$+-qBeiurTgdB,l[g@BQL^Nd:NZ/6I
-%MSNRL*=cfK0`iNULKpVKF\>F=^Z\,A,omJ)"SKhi@<"GM:B-I9i[,3kFI6->P]02jC^1Lc'\i-h1a>Co+UPWGNN(9pgWVkPRb;TV
-%e'k6D9AA6Wjn%.[d:_3JF@O*e>#A>+$[phU[pBb3hV(N#EVXu#HunB!MIVbFnp-*T2:"G+%:b;8fCNI1-/gOd'S#1@K4BaimL]rh
-%d=C99-9Sr^7%eAX(LZALK%/3?P&9?MG+)Y2A^X_*;@'AimP::5_n")\cleK!52F#aIGVHH7h`3Ql/g#+mUmj<-ln;G#hc_<:N,ZR`f\cNl]dM]l-$Nem6oU6N[O%YZpt4X*MgNn#+ZZd
-%S.l01(3`h7Z,mi[(l.hTj)+%hjC4@PK>QJu.2Yl-n/s>r-C"YaIaW'Q.<%G]FRtK4
-%OH(ZSDV%fJ`?cP<"s1NrEfL'@OjFXhJq-DER;:8P\3N:5FTUfG\2[Ne3LN"TjDGI47pZRAV!6fPXH"XQWZ]"MRYX-4q2l[$F&8OCmXGp:H5eS6(oA9oroL"l'KME]%?kF=%O_N5>&UKAq@Kn;P\)RM&9cTcS_(IV-VP)LX7ur2rX0p\RXFF;)VK/2#XkihVs*hYKr_7&rZ1MP9EjUNp
-%Fll)Z6pH!^,A*Y4*9CiC1R(fo7pdc#Q]D!pp)WfLqm\lG=lZcg]Qkq@XCKAdfp:QI*u_/C'2_"@H72AG@5m'UQ4J_<:,u[+/YD2kEr9sln6/$)`LXZ30>*T(&QZJ&8i^7'/RQA#\i>.!?[+.E$o=Gp^@5=?KVrp3luKi0
-%>!HBhE
-%@2a&q+X6T$KE*a"W\R3GHH8ZdAMH00D'W*VPkb`cZ7X$H9$>51[s1XT6[HpM]L$Ag7MkU6?XY+@DdjsJEuG`UVgte'nA'+pS;)sr
-%84[mAqRq,_kup=M6VOYo/8'Tm?7(7W!C[\lK"cFHM;@E^.5\[BYW8:-6`C.:Qon4CdDb;?'MfLU)(McF78M5n>Io@dngqA17NOl_fS
-%cNhKO6V@*cE[.Lb8+n20$Sei0qBLUO?ck:"6>Q7A"Aj&?QJX$JB;`S9k2QY*
-%*'5_`P'6iNK#FV.?L#/&lu8E/38Ted0lIC_G_hAKlnV/DaNS3Ni:OGMZ)O'D^&->A!H/1b\?8k,9-PhcP*u(kO`YF
-%gD;5`Zb[a.9Hal50Lk]S3@TpV._ZE@M;Gc&!jKDXaVX+R]jXf.in))-*kh*6'Un]6j5qSmq__V(4'o&I.++NW1BPKh<.]VDl6*m&
-%&s&^G-!kBtL5OoUcVlQ=e`.Lph4prK88_](i@,%Pr"(Z#G;Pir&6YN1QEE_La/OhubD`$IkLDNIUKGVLO_&@#A-bsB14G);BGm$5
-%afn9TErs6Pr#DQ"#VBGE:-0VAI_jpnEY3E+F?g[hG0uL(&$U/#^),=IN"cOkHC@03Ssa4)&Q#+01,&P>GAXH9q80.\ZoEdL-@bWMp-K6?3lHGZbtR97bD)heDs'(:I!;ZP(hbi==!e91PI#UIR]nqFHBIYjhcAL'.tLkRRi5]R(B\-?U0I<
-%Nj!roj/kan'_=]DXPY"Z4%L27jAW:XjtG\.5ZZs#pi/;7Yo3)K?tN8BYY:O$;'*!k,'/Inb8d9*05tj,>Eh'LX>>#shMAo/\4(\7
-%GT(hEs-9<@s7!qUMt-r0Be_b1d&:r;6Gi>Bk`G'[GL"0@?b[\ge*a.-8N88KZ_Gb(6-)$:BC*nA_=^ANRp+/:$0BQ0-5,`Eq,3n'
-%lO50e)$2;uLOsiT@:E2AHfc$+/D-&aO1I$_7Ha:m4^Y4tCdN/pW;?MgY3nE:D_mZFd&E^TJD9.UGRc3%EcQrXi*AL*fD]fj.#^Qr2\9B]O>SHW4q:*Sqpm$7tn71*OVc1Z`?pE)`ufZs!bQQ/#:t0:hP/
-%$7`Z7%4f&[;h@Nq4.gq?7SO<>?iWF5[:hXNO,=t@U--^H_f4-OTq9t=V(b?H^4bV",9
-%]8eY#>T/:5nP=Gf<*ehTp[FEX,eC(Xn-q\q6h[MTB$3:EFL\go4S_kBFCA_Y4El'4%e#
-%C=mFfX)2>_B6L4P)#CpfGOAl&c$E6tK2]?a05uVok;RW%?HgXOa>l]HXq2QB0etX#Y-5[$J#V91I+*q`*l'G:2VtQ`OTFIh$i@r(
-%fo/takN=-F@Cp4gpA%_]-2bMj1J)#I?PLnKD^I%%o;h.t#?.Ktf]O'j%o2U9]S?UuO&rjLW>$N'aqoSe\iXhqfVDfe^YYg9MQc]b1dNP[kD4\eRVWeGkMF%U[AgcTjjTAL\nC2Ji^I=?P,
-%T5$5\@Gc$*d5Nb?;:l[oF\]9ID`"8L?._*k(&8d'ZjZcN7bVO0I=d(RQt0e!eoZgdplN`(+nomCDs'@<]X@<(hL55O:kYXhKZE2b]EF
-%g:-kQbphH/)!_sPE0DLfWZpm3G*/eaVhDO6r?-j&&W[EFqG(`m,-W'AIp0a2MBrrR;a"r#UJR65SBR4[K,E_LEDbhaRh7,d6;Z3g
-%bJrt%1:PHfF--?Kkgg;/M;9>K4BAQfhu>W%nXTX@J$(o'\G#d_QiDaFS&6(Uc#GE:@m'!1C\hLgqE,rDg:[H(_Bg34&8@=Df>P2s
-%03/YTE:c5QJqK..p]&43QR[\prg0jhn4#u2%LaM;)qWbG^JuXNqF4Q\BR2NW)p@EL$?DojT3uZ^l,fu_\js$r4+Kqo/62_=^5*^H
-%U8de+W[!lt9j_G.0s)[VXEP)u%#J72LU^3YP,*78(b?XNkW&mi)L/P-+VjD.@3Rq*0bIFNP
-%&Xh.6n$lU>B!8Qh2JifW;n\A/B8p9_Z8=lb1i_p(s)6%]V1`Ke)R'5&Z7jQ22_nIN]a5
-%p*R`#7V@rg+?"^.Q9QEGult?aV^=\@/6l"[_7<]IDD*'Xe-c(2h19d)0G,4DM+4dl;!Lk2&55]XaE>Zn8
-%2R*&90B'E7K,B;AYD1(8o;K(<>,n:=[!:Fj]/P9NrnYMl?7^H[`JSTS.AV8I4>-U9^*csQ`\!uYfJbJp$SfH^9sC!+a^Rrj,2#<<
-%>,k[?A#YRa=H$dX;B\B9`3^BM""d!2b;!bfmIo@Ki9)A55L?$q+/9@J9T/D0ih#q48Ft\G3G.1e]CLqoNb-lP-&"aY9EaP6P2arI
-%0>jmaL^nN>&f2I*p-?V248<
-%mKo>e.*pFcfA5#Q?Y(8eK4T(a+nu#-03;8-E`M75=5M5Sl2g"mV>8Y@a!IG8F^r7ALqT3s]bi^Y=2*BPpDXj%Ti]^JeS-]`0k^TNLV`u`V\3g,16a[='*,(S+o)lJY$'Nh.qEIX$Z_"glYfZ+_'X".WEmkj2P^pB[hdo
-%W!VcB4RMe=/eH.[mcib<^o5u$lX!*MW97\j<_:UM*]9i\IP\#kQ\S,I^YMLi4"Iqt)ZAn[X`2WPS1GHG65+Z4H\A8EMpsR2odMip*KVhVKpr7
-%/TE;:%W1DsRcBaT7:h'S3Oc8lWoKf#Z*T1.7`c+!RZj4+rV.]tioB3Pd5Z5M?".c#GuVKa8H[_C1E+QVFc3ChBBUW=50$nVl8Al;
-%'On>.h(Bk%.9/dLlqZT.#T!.kKm;=pmM%iO#oi>Wrp<9SN)c$#7RVPN96GFs?e<8C`7T3JO^8Lj(7YIB/"Ylp
-%7B$S6D^fUIju@b=Z%YnH(ei290g:K%Y^:N6pFBJd$%(',L@?*1_%(g?019*+D/%i`[Sr;[bBSF`pNt3D^C=-+_(1Df'4*o8Tp2]#9I!cs>\:\9=(.)F`Eq]XGUD]bP$N/E&5W
-%%I#J8VWTR'!a)0Ut%`:*hk
-%iNopH9+jD[''P&GjP0t,dNfV+R;U[;3DbY-[/\3HgXI<1pelr;)RoUKo(pEW>k`?6MG6oCR5e4
-%L**:B=^`NNP.G@4NM;A;Vg]>jU'hLl
-%'U2>N_F%L'()-mpoZ`%**el=c36Eu/osJ(ES>%gbg8=Bj>m"
-%IaIFXg4U7`Nc\(Ujl96"*
-%LA-i:];KW-n,M%L*^/5n
-%>28"&E5[\fT*l1M0@dOM4(RAc'4#i"IbQ"jTdRJA0L2M'VSTK?)tUqan0G$m#h54X*X3AE8WcQ%?[/uK
-%Nldk+?[+Q)mlBfiLFs`.FPGbB.>mJGLZ)d+pa]rm39nAuE/W+(OIYgW_sejU7S-C!iF2LuLOOF#=;N$5R7=&b1Q;bQ@p:jT?$PSi
-%:%)qSJJB]1??dGkodbeks
-%N/23F/eh3U@+A\"Cm9;q3=.4b;X)6G+I+T4SeT+QIElSMgbTA4\!:.n0[>UPq;heMp-dc#Q#,p\T\(,](\\l;^9mDipFqdlk\!dt
-%jbr-BrJRsDGBl9^1]Q">4C2iOG-T[q\NKk:+.HWP:-XdXQb%YB[/Y2ga`ig&00ddPXm<[[al)<(09^j5/S-`Qn)`G>hj*QN
-%HT1i+ff/%Hdu/r(cD>,6ND=JbS,6I44<2,lAG,:\HMqLEqj9p*q=]hWCb/Xc9@%r4.:N+TQ!J[!2RtTPZ-JWp(h_I2-bIMXSc?'g!-[6ViS>>.8k]:mG=eF7doAVQE]OT_cJgcHUCD3f6dIeL[s#9H#7?ac++s\hQXN"rH$qYY8/cs
-%IU:?o%;fpiQ.+7Mku$#M\TFs+?\Q%eL&&@'S@6l"T!)De*A7?&4BRg>KbGbJQ`Iu(4mhC^j+ZAU)qf7MVL4J$)9le>BWNVq!*+)P
-%\/D?cZI,lOQ7F/;2MN*Gh0'RsBHn9+)_.Ek/2))JC%lfJk@V'Q?eWWe;Q[IB/*q0Um,W-WrVGf$CL?m[RapN-NNt`l;(k'ScL-n(
-%$JY=.?-;'c:hG.E2N>JJZTG_n5rlW.E5:qV/7XBEWEChD\3]N<\$$mE/)G^9L"H9LN[n.[nu2'kJg]rWK$6G2U^./GYJLYHD1/!+_:8Zj9qqEo]0!DKYVRq).bg`4`p%IVc/,V[Ssg&NeM_fD]>G=CNA:k%jYmP,QSe]B8GQ
-%ZNC$^A*r*$^bHAjEsJ>gK@:63/&-9j;mg%:dMR_4mIsooDt^M"e'VKGR6t*(e.D1"LIG/!r4[2&i1C)<]_4+!GCH-[9kmrT5::KC
-%BD'LhOA$QGa>kp#[)3Y'==!(/HQt7!O$C,>X#PZ>:cJWaH@TA`bgEBO/pPk4Hm@jpH;ga&8d7
-%+%j4CO,N>o9VL@!4D-P(D>c(2H^4-j*^,sBKXeXY*?OjUQR6gep_S^69ffihWIgqCV
-%>>">#cGKZYq-`CQ9I@Lt61;1`"VX"CHm&PVfZdB&LU88*3i8-cXZOjb!h3'c6ikFePQjLL5aGI0\(/C@@^!C0jMB-7=ul0h"eMcL
-%9o;(2VOe/$m#65R2$Yo(ORR2>C3B+MN1DKW5,@/`V]J#RAp81]p(Y1";*o#I0]B[4pR@83.5\)3.(qc%tWrNK?#9l)S*'/eC/Oc,5h,qutJptXBdCIXUIK1H6J
-%)ja5'#>_m^b:+\TE;fWU$$2OgqInA`]1UeVTed'1D*SQ)Ka6Rudh>4.H`"O]8R.Y(]*#N;')
-%cf/jH)cj=SY\CYk+(B9_dfq*W/mW^0Y\u+`I$3KUp">$VPb0=?nfV5-]6FB,OnQHF@mDQm>`t=s:6>@K/L(P9b[B*gR_/jB["lIV_-ZYXf=ghYXku^%UpMNY4pOtU@:ub4a$6:5.5^\Ru5ILb1sG-cWI&j-lr^*(YkiJ`Ec(E`qK@@4CZq_
-%d'+N6nNk=66V?W,0%bEY$R#`N'lSuNV]]`c1FXoS%s$GIeON^H2]^Gm?4Efb&G?P"UXk@8&F8KL
-%iBA1Y#oE.mnBdHfHc@G8mfGXsST>:Ygk]:$"5t@)^ra9$IX3"H`b*(=MD8m`/[JQ0W5'69M(gBRU_4K=UA,U#jrM:rX%WdX/VFE*jgJNE>
-%]2@+hmjIBX0qt(s1nD[8gY'N=_3_tO+uDIWQ\].2LS(r`>i*epOAZ*rZMfCR-KApJ?J)iR[\ruGe^NbolbW.T
-%o74cha9+a1l^KotRBX2@]PbD^/hdg-#;;RtK4E2Pi:-l*>J^l`[u!+A%L/KOiE82049-@-K:LUV/t,!!hAM+JF&ng[^O]#NXp+/3
-%SEO]p2`mt&ZIgE-5L_So:$!L9q/h68dq,O!(J$%ni=8DeEl"H7beoK&rcq$2'fW;2[O$9fR4DgL8C7Ik9c0bGY;f(b5:_h(`,/5u
-%B[h+!%\6o?SPEU\WV(V_3W1GZCWiQVl\1U2V,-aiF4Ib&[bA43!4oE5\Fa6bJ_og`FuW1&
-%amBnVh6gaJEiS'f(Vj^f?'$1B%_i^ATtaT?DXoWTB,7u7Ef'e(r?1N<)!E#3C\<5'(]=^h<(rff)FR]]dM>Q2a3Z,N:k+@AN8*iA;S^:%6%m4t="QFNL'eIDgYc?P,FBG(uTK>"Z=CPAZh,4(grrVp%sr2".sSCD(D9boAdXbLh-
-%1d@Gr,Y4\q`*^Kc".m8Ff/mQ=dC\gP'4,OVbo0b^Sc<-J4U23g1Mcr7L$-9V1u?:\W4bEo3`ak]]Ac^b@"!oNmHg+ke\TR8u*k'rXXlE/.XrSih&CUL9Lp[iFr
-%8FNZrql@2[Ep#a"feo?B3:[qbE^3"Qd."m2Yo\.77[LLS>XkV/f'rPhQ+M=pL$@LOV:,2)%'K(2J#oI:>@IaO^@7<.1gB:FI/Egj
-%Q$k1HW7pBD-nfe7rkG>C#QkYOpoc/#_A]Ljqs*^#ekk_i3JaLs#;P.jX?YL
-%Pf=h#ZKuAA]ITLc-JN$8ZLPPX`s2DYC4NrMrfBA'a*i`7I0tn%WFthXZ;dKh8mA@W#el2@]7,\)sI4]5/qC$!Vdqc\UF4aX&[,j#T+)^T7C$#&L6B<]`>:u$QRRR]h%8U307L;*?FpMW*-nj"@0BV'!
-%UtIK)\_S(TF&_']CWNjF"E3"VkH#hllDO$r9!@7=J9jm^HNe,5b6kqdFd@cC7Ihg$5ZgSCpS-tI7%$coDpRfQ*PDqbC8LkguOYI9.?V0VfT6pC%l<.]M>cjpY&d6WL@@b=ecoURcU
-%.QX>bV`_nJPoP\t,0=P^Kh.Mu_U#\fr2*!LA#KKMJ"Wip"Sj2<#^t&]c\=G)S1RtnWFg.g":LpVgqt.Wfe]uGEYZWn$h6k'S7Eep
-%bJh9W4s]>OICsB:,9<>$3Zr/$MkB6*p`(=-9R$g7,W2q>]tZDW,YIZ24+GT*8'E"4F2us=N(HhY#b&dkT:b0UQd<@DPcgD6kE-P^
-%2GRN2[%tK6+5IPGM9R^pR%HIu8I)qs^&;e;F=OVA`rZk1'<^8t(7QY8&DDrAUS6jkI:;RUfF?
-%Hs51:k7>Y'mU0duc[Mj<+3=D=jX?b.D)^_pO_/sbi8V/C?Ym]5m`g,9gH@Ba8%Gj;rPkal04R%Q9ZA$KQH*=0(@2.[e&3C(6Nr]3j1f2bKedNmY%*YD'P/dAXjR]][r,F`8%oVn([Xqknc".=e-iN+M8e0hM`!,-)@%]"u/GV@rm@B
-%?\o_Ee\BaS'g@ql.W=dr4%BOT9-7NKjGnD15'O:aAG43IG"C6>+8)F"mdg:#c&!(VrQ8ATn+f9HfX`'H20U/-'o^UKnI?!UaOS[]
-%kjSL>[#"'@@P_4I<'+Uc2K,J%SsN8Mg_ML,^P0sKcfgMInl@11QBZ$(.&GaWj:Aj66aeaS41N/e!mNP\h`PVBKR_QTU>',^RL%<&
-%jDsl83A\5DG.22i]$Qcd+k8CY_gk`_@]iH3[OCM'+1$X\Cp(nonf^,NF_>oAVPnX04g:UR1Cs1\7H=O\X-1cQEal)HQiq9R`@H2m
-%[:HE;mS!M@bSZa':RR?"A:P2!(krcrUs_:%X$r(+4Gi7PH,V[F!!RFtH^e0$GA:\)p[B.)W>JD]??b.Hp7qbj'EE7.kRYbFf7Ek2
-%h=tZlO/maK+>3F7rPu`=r2JsQ?I4je/AiPb6B>o=^XAp#P0YD7n\jt*\7P;VRW&.:Vd21Z,aSi(mc=0>?miLTUoe!toh$tKF5gN"
-%3BYHG6]tN@.>V7^\V399rkY4>pk/SC_I%T[O1RXOf-1(c)dr[kV;t5=nX3&$'Cb>iVU+LQ6.IqLR2:"VTI?=l"O3'qFKQad]$>h1
-%/=>UC[30P'N*rQI!3iMfGAF3@:/r%j!mbpc;@nP60#91p]V5]9:"6Qr4B,XMTnB$JptSW_#HZ?I0(3.d@!J@=gTm_M7P6AQ;gR1b9b&Es4j]'rjSd(-*rQCKDdKK:lr_:?%Ja
-%NNU&i0EXaF$A&?>^bR2WYW7XFQiUD.`j@j?'#Eq#JU7^
-%k^],#'bhW!RgD45;cOS?S=iDE=]XaE$6Vl:"c6VZJk\ccY]`lA"C-\W^f)77;'_.(7oI10eMoal68LohaYY8.!20Ho;daKRa.O)O
-%Q]`8j!)cdYJS?G=(1VS#6W(5(V0ZPXh]HP=1X9fi)Hs(9CtXZOJ#0100Bb$j(1YQqI#J\R"Mpq@I'"^$QO7_(eE"]
-%+Bf8>X?eG,X=>j=*nXn-d)i^hZ:*guij<8_Lql!P+)FJclo`PXStTTP39R!h]R#PW6I2
-%WW9)6aG>Kd76reV#oHO)&^*ECWXQM?.e'18+J-:41Y3'UTSa*C&>pX`O_)E_K8]dI&"BEbaS$V0&.P,0^aB1?(Ia^[-3;DC&IJFs
-%!Uup/%=n'aAS_Qq&s9V28[9mtI$+iPS@F\('KEZ(*e#J]eprQ9$-8"F1CaZ.kot!9-qcBB,n\ctU9DBh7AoaA7HbcTWN360J6R*,
-%^$DH:Au.3>!ALVW5QUpV5Er8o/0=WmOsMmed>.Qd#;HJl"N1@3WgoO-
-%Om5?-&-6@3"p!:*=TP6a&sH.@TmkrcS]JnJ&thcr;=SW=p'A8]5q<74*C-jd]Z*fOM'>jL;>ph^Q"gpZ;Xjcc$DoA):^)saY6$@s
-%#R-+:,p3[?CCm@*p'?OC#O+Om.c;(1K`k5FDk2O<7%eH0_`/T(Uh`CJ,&0B_!.mqp's\H[Sc[=l%m+'Y3047UYQuEZecA)Ap+m4Q
-%#3lRQ$7\PG'<(2L*K`c)/rHX>nfUap4975>D93-("k#4]9G5I&LFJWEU2BuS8-M`g2!)jMOKTp+$c#"/e`m4K%J(->ZR?StpCn`^
-%fNP(Z,RPS^#-7l!!B1B#]nGXt?k@;7@$S#'3)tKR;%=1`DaOY1T`Ps8FF_"lof!EqO>c;V*c)ji1l:^T-ipsN)H&!Ip,=H:"V+s3
-%lUbVS0TP(0*V"n(%745eR35_o>#1BETa3YR:L)
-%&T/(FGhc"Z5Z%U6#gP^=Z:'k`T[Bi,pM^6r5)5#eS"_J1.e6d,q!*"Bn44r<=1'J?Wn/_/!F@!&jt[
-%$.,,s/sV;HO[h]uloHDi8[!U*?2Le%sbN0:(J"p1%*js0"@=H"Y56bl_M#Y#^t
-%J\qtQ#(\=hQGAuY)hrZ(0
-%&Zc_:5\Cg`"DF+WWtfT[,nMtPj>(*Z(-t(qRlh8++r>)ACP*AE@/pB>co''*0,nNP#FU2HjrEI9:s/@=(_nVr'ZqE'aIW-/O>h?G
-%]](n@T^lJP;,;b=PrXQ;S.>m;Ji5%]Ts]IMj>AX=OGR@:k`gT;ao_h*DM&+RO)tapL^()XU3C$'EqfVOP@YN(+82I*nI%mAAU#&ijl9ICLAo##E2E37$&[g@762'CT_Y/#h^Jb
-%[Aq"uc(%4Q4='4EB=1_:nAu[bf3kRm\f2@o&1p9!7*lsU9^]l](Dh7Zjh$NkV_sBAg6mjE;:Vl'NrfHL(XCff2_upKHQ_&"n?4j9A',NH(M;e[1Q7,nN$aq-6E#$$JQ!V))G3o>'oIGX.6p6&O@6>V)AQY8irL*h
-%+?6S@"1("]ji8DoY?rS"$%T(3D'Wj"I\W+-;&94G*D@0Sdm[5eRdA*F1g:]$'jMplX;RZ<#):\RV]cSGB7RAX5`!*]dO#&"gQ4Zh
-%Y_']m;CEn)(1BJT?80o`"!qO`iXNSCL"HKnBG&X)Z^AoK5o:E"=!O_&a.#L3IkQTS9g@]8Kjb$r#9Ofgs[)3aL[b.-<-R80XpbX^P0IV?a%(
-%*Y]G&c@s/t'*Aoa0G[[-1cgasD$W1Z7)0J6ciV&sLoch;&o07#PQ3%bK[PT"-6)qUQ7\Qn)/Z$=]
-%2pT_m$@=%fGR1,,92:_sJAl4^4HDu;^gGtMb]YUL'G*;/RB?i=_X\?WQ\U,IY)SBXQ:c>U+3O@?1*TJ7GsS_]gKpfBi]82ka9tsT
-%1JhDTU7oOmdHa3@:.B;VbYf8@b;)UmMF7i(h:Y%%r6+FDDPOLCi*7>Y$r@\LJYlS#P5h.1W6!=CJ(KP:\:hps4:,n%e`
-%[^+?kDk8O`,?]NV:>1o:JBi8=NeUWs\9*D82"Q5-70?\tY*`&j1a@f/d>6J+k-])9)0?.lLMR7gWaWDuW`#l8Lj#f]OOet@)1ZN-
-%%IcdkWgeSTqkBZFl7TA8GfV(tPc*1kV/_g_CdV3CYY(`KSl45lKXh+$:ohsVDFsrJ_cLED*O:?kYYWH."'F=1f0qgJ]$@8@*Y2\uXA4h"Y@."N&Z&M#o
-%;%\=Z/"TNs!'H]+B>HiQ,KT+-kQo>r(.7*/.5BX]M67F0MeU-"e-8=s%ONO/GFW2BJcfSp*KP+QY6_?kKp,?kl3l[hYi0g['^;3fAo_pe:p/fV=/'2JK#@Z9]uDT+Kl$t@
-%Llsh@E9\^$!0;#C.R^B=1C+EGN*P>0VhK"Be1:[\9d<]Zj!KJK6SbJt>qm_kJ8d!4GuVX;"S9_$NmjtRG<:$p7Yon)8$DtK\\Jg?=duXPlVbpX5Eun>CLq%Cj9m@jNS8i3J4D*:KR-e?P(=6nfRu@%oMW+s\^eB#K
-%EJG'Y^EBjq7OFRs_'?-gmQt]D7;T'9F4=8\d<;ALE[t$'F4a1^-
-%U7(QbLIhj:;.D:J(F`MJdDJk]#H,]kOWfZ^>gTQmDLSqBRs5V:tXAiija/:l6EcD/IK8!>J4;i7ZO.g@P_
-%oPc^LI^#JQ&/%d8M)u3^+aY^`"2i`q0-*EN:.p-XSmj*8`3XG=3!83bPAq5s\&!Z6"V41R$`5#^Dn9M^l55d49@l/X0HeN'S7q(?
-%`shtuU/S1WkcP5SnE<@gd:>Ag[K>e.AfU=$I$#D'iFY\qlI#qk$.bh%@pk[d`H0Vr2V8Xc5Tm)GA"7;e*"!"uku8XdN?Am)IteV^
-%L8DsdaZ@iSO2nZ*WISDn&uL?(CK;&fC+ER7!G:g4W;Zk`P_d^9E/a$i*LfV/dO\TW%k:o&SS4EsdUOS2#F-@b@9f#U8@)X=M9DnE
-%&.m5AGjpbK+'TSqbl:k[[!,Ml\K(rc"$rm;Bl4/XQ7h8nd7Y:fMO8=o68T
-%.j&HFKb?Lh0kH@I_rN#(O=H\L*'IRpEKAihuaUA8:"/#mMd^;YGn/I+4<c<+WHl&73`g"'IKiI:6Hpa(m')5()-l517=E`SRlFhj"gTEq>0%6Ic:MI&q1>L8ZDlC,2A%t?![O*Bp6STu]Z]D_,KJYcr4ni/juA1j6cH=Ads+<&3SAuE_oT;m;R
-%@D`d8'nLJE:4hgUNHS48S'ObK^\
-%AI9_PrivateDataEnd
diff -Nru ghostscript-9.04~dfsg/doc/figures/Overview.eps ghostscript-9.05~dfsg~20120125/doc/figures/Overview.eps
--- ghostscript-9.04~dfsg/doc/figures/Overview.eps	2011-08-05 11:12:21.000000000 +0000
+++ ghostscript-9.05~dfsg~20120125/doc/figures/Overview.eps	1970-01-01 00:00:00.000000000 +0000
@@ -1,51545 +0,0 @@
-%!PS-Adobe-3.1 EPSF-3.0
-%ADO_DSC_Encoding: Windows Roman
-%%Title: GS_Color.pdf
-%%Creator: Adobe Acrobat 9.0.0
-%%For: michaelv
-%%CreationDate: 6/14/2010, 10:10:02 AM
-%%BoundingBox: 0 0 720 540
-%%HiResBoundingBox: 0 0 720 540
-%%CropBox: 0 0 720 540
-%%LanguageLevel: 2
-%%DocumentNeededResources: (atend)
-%%DocumentSuppliedResources: (atend)
-%%DocumentNeededFeatures: (atend)
-%%DocumentSuppliedFeatures: (atend)
-%%DocumentData: Clean7Bit
-%%Pages: (atend)
-%%DocumentProcessColors:  Cyan Magenta Yellow Black
-%%DocumentCustomColors: (atend)
-%%EndComments
-%%BeginDefaults
-%%ViewingOrientation: 1 0 0 1
-%%EndDefaults
-%%BeginProlog
-%%BeginResource: procset Adobe_AGM_Utils 1.0 0
-%%Version: 1.0 0
-%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved.
-systemdict/setpacking known
-{currentpacking	true setpacking}if
-userdict/Adobe_AGM_Utils 75 dict dup begin put
-/bdf
-{bind def}bind def
-/nd{null def}bdf
-/xdf
-{exch def}bdf
-/ldf 
-{load def}bdf
-/ddf
-{put}bdf	
-/xddf
-{3 -1 roll put}bdf	
-/xpt
-{exch put}bdf
-/ndf
-{
-	exch dup where{
-		pop pop pop
-	}{
-		xdf
-	}ifelse
-}def
-/cdndf
-{
-	exch dup currentdict exch known{
-		pop pop
-	}{
-		exch def
-	}ifelse
-}def
-/gx
-{get exec}bdf
-/ps_level
-	/languagelevel where{
-		pop systemdict/languagelevel gx
-	}{
-		1
-	}ifelse
-def
-/level2 
-	ps_level 2 ge
-def
-/level3 
-	ps_level 3 ge
-def
-/ps_version
-	{version cvr}stopped{-1}if
-def
-/set_gvm
-{currentglobal exch setglobal}bdf
-/reset_gvm
-{setglobal}bdf
-/makereadonlyarray
-{
-	/packedarray where{pop packedarray
-	}{
-		array astore readonly}ifelse
-}bdf
-/map_reserved_ink_name
-{
-	dup type/stringtype eq{
-		dup/Red eq{
-			pop(_Red_)
-		}{
-			dup/Green eq{
-				pop(_Green_)
-			}{
-				dup/Blue eq{
-					pop(_Blue_)
-				}{
-					dup()cvn eq{
-						pop(Process)
-					}if
-				}ifelse
-			}ifelse
-		}ifelse
-	}if
-}bdf
-/AGMUTIL_GSTATE 22 dict def
-/get_gstate
-{
-	AGMUTIL_GSTATE begin
-	/AGMUTIL_GSTATE_clr_spc currentcolorspace def
-	/AGMUTIL_GSTATE_clr_indx 0 def
-	/AGMUTIL_GSTATE_clr_comps 12 array def
-	mark currentcolor counttomark
-		{AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put
-		/AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def}repeat pop
-	/AGMUTIL_GSTATE_fnt rootfont def
-	/AGMUTIL_GSTATE_lw currentlinewidth def
-	/AGMUTIL_GSTATE_lc currentlinecap def
-	/AGMUTIL_GSTATE_lj currentlinejoin def
-	/AGMUTIL_GSTATE_ml currentmiterlimit def
-	currentdash/AGMUTIL_GSTATE_do xdf/AGMUTIL_GSTATE_da xdf
-	/AGMUTIL_GSTATE_sa currentstrokeadjust def
-	/AGMUTIL_GSTATE_clr_rnd currentcolorrendering def
-	/AGMUTIL_GSTATE_op currentoverprint def
-	/AGMUTIL_GSTATE_bg currentblackgeneration cvlit def
-	/AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def
-	currentcolortransfer cvlit/AGMUTIL_GSTATE_gy_xfer xdf cvlit/AGMUTIL_GSTATE_b_xfer xdf
-		cvlit/AGMUTIL_GSTATE_g_xfer xdf cvlit/AGMUTIL_GSTATE_r_xfer xdf
-	/AGMUTIL_GSTATE_ht currenthalftone def
-	/AGMUTIL_GSTATE_flt currentflat def
-	end
-}def
-/set_gstate
-{
-	AGMUTIL_GSTATE begin
-	AGMUTIL_GSTATE_clr_spc setcolorspace
-	AGMUTIL_GSTATE_clr_indx{AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get
-	/AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def}repeat setcolor
-	AGMUTIL_GSTATE_fnt setfont
-	AGMUTIL_GSTATE_lw setlinewidth
-	AGMUTIL_GSTATE_lc setlinecap
-	AGMUTIL_GSTATE_lj setlinejoin
-	AGMUTIL_GSTATE_ml setmiterlimit
-	AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash
-	AGMUTIL_GSTATE_sa setstrokeadjust
-	AGMUTIL_GSTATE_clr_rnd setcolorrendering
-	AGMUTIL_GSTATE_op setoverprint
-	AGMUTIL_GSTATE_bg cvx setblackgeneration
-	AGMUTIL_GSTATE_ucr cvx setundercolorremoval
-	AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx
-		AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer
-	AGMUTIL_GSTATE_ht/HalftoneType get dup 9 eq exch 100 eq or
-		{
-		currenthalftone/HalftoneType get AGMUTIL_GSTATE_ht/HalftoneType get ne
-			{
-			 mark AGMUTIL_GSTATE_ht{sethalftone}stopped cleartomark
-			}if
-		}{
-		AGMUTIL_GSTATE_ht sethalftone
-		}ifelse
-	AGMUTIL_GSTATE_flt setflat
-	end
-}def
-/get_gstate_and_matrix
-{
-	AGMUTIL_GSTATE begin
-	/AGMUTIL_GSTATE_ctm matrix currentmatrix def
-	end
-	get_gstate
-}def
-/set_gstate_and_matrix
-{
-	set_gstate
-	AGMUTIL_GSTATE begin
-	AGMUTIL_GSTATE_ctm setmatrix
-	end
-}def
-/AGMUTIL_str256 256 string def
-/AGMUTIL_src256 256 string def
-/AGMUTIL_dst64 64 string def
-/AGMUTIL_srcLen nd
-/AGMUTIL_ndx nd
-/AGMUTIL_cpd nd
-/capture_cpd{
-	//Adobe_AGM_Utils/AGMUTIL_cpd currentpagedevice ddf
-}def
-/thold_halftone
-{
-	level3
-		{sethalftone currenthalftone}
-		{
-			dup/HalftoneType get 3 eq
-			{
-				sethalftone currenthalftone
-			}{
-				begin
-				Width Height mul{
-					Thresholds read{pop}if
-				}repeat
-				end
-				currenthalftone
-			}ifelse
-		}ifelse
-}def 
-/rdcmntline
-{
-	currentfile AGMUTIL_str256 readline pop
-	(%)anchorsearch{pop}if
-}bdf
-/filter_cmyk
-{	
-	dup type/filetype ne{
-		exch()/SubFileDecode filter
-	}{
-		exch pop
-	}
-	ifelse
-	[
-	exch
-	{
-		AGMUTIL_src256 readstring pop
-		dup length/AGMUTIL_srcLen exch def
-		/AGMUTIL_ndx 0 def
-		AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{
-			1 index exch get
-			AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put
-			/AGMUTIL_ndx AGMUTIL_ndx 1 add def
-		}for
-		pop
-		AGMUTIL_dst64 0 AGMUTIL_ndx getinterval
-	}
-	bind
-	/exec cvx
-	]cvx
-}bdf
-/filter_indexed_devn
-{
-	cvi Names length mul names_index add Lookup exch get
-}bdf
-/filter_devn
-{	
-	4 dict begin
-	/srcStr xdf
-	/dstStr xdf
-	dup type/filetype ne{
-		0()/SubFileDecode filter
-	}if
-	[
-	exch
-		[
-			/devicen_colorspace_dict/AGMCORE_gget cvx/begin cvx
-			currentdict/srcStr get/readstring cvx/pop cvx
-			/dup cvx/length cvx 0/gt cvx[
-				Adobe_AGM_Utils/AGMUTIL_ndx 0/ddf cvx
-				names_index Names length currentdict/srcStr get length 1 sub{
-					1/index cvx/exch cvx/get cvx
-					currentdict/dstStr get/AGMUTIL_ndx/load cvx 3 -1/roll cvx/put cvx
-					Adobe_AGM_Utils/AGMUTIL_ndx/AGMUTIL_ndx/load cvx 1/add cvx/ddf cvx
-				}for
-				currentdict/dstStr get 0/AGMUTIL_ndx/load cvx/getinterval cvx
-			]cvx/if cvx
-			/end cvx
-		]cvx
-		bind
-		/exec cvx
-	]cvx
-	end
-}bdf
-/AGMUTIL_imagefile nd
-/read_image_file
-{
-	AGMUTIL_imagefile 0 setfileposition
-	10 dict begin
-	/imageDict xdf
-	/imbufLen Width BitsPerComponent mul 7 add 8 idiv def
-	/imbufIdx 0 def
-	/origDataSource imageDict/DataSource get def
-	/origMultipleDataSources imageDict/MultipleDataSources get def
-	/origDecode imageDict/Decode get def
-	/dstDataStr imageDict/Width get colorSpaceElemCnt mul string def
-	imageDict/MultipleDataSources known{MultipleDataSources}{false}ifelse
-	{
-		/imbufCnt imageDict/DataSource get length def
-		/imbufs imbufCnt array def
-		0 1 imbufCnt 1 sub{
-			/imbufIdx xdf
-			imbufs imbufIdx imbufLen string put
-			imageDict/DataSource get imbufIdx[AGMUTIL_imagefile imbufs imbufIdx get/readstring cvx/pop cvx]cvx put
-		}for
-		DeviceN_PS2{
-			imageDict begin
-		 	/DataSource[DataSource/devn_sep_datasource cvx]cvx def
-			/MultipleDataSources false def
-			/Decode[0 1]def
-			end
-		}if
-	}{
-		/imbuf imbufLen string def
-		Indexed_DeviceN level3 not and DeviceN_NoneName or{
-			/srcDataStrs[imageDict begin
-				currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse
-				{
-					Width Decode length 2 div mul cvi string
-				}repeat
-				end]def		
-			imageDict begin
-		 	/DataSource[AGMUTIL_imagefile Decode BitsPerComponent false 1/filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource/exec cvx]cvx def
-			/Decode[0 1]def
-			end
-		}{
-			imageDict/DataSource[1 string dup 0 AGMUTIL_imagefile Decode length 2 idiv string/readstring cvx/pop cvx names_index/get cvx/put cvx]cvx put
-			imageDict/Decode[0 1]put
-		}ifelse
-	}ifelse
-	imageDict exch
-	load exec
-	imageDict/DataSource origDataSource put
-	imageDict/MultipleDataSources origMultipleDataSources put
-	imageDict/Decode origDecode put	
-	end
-}bdf
-/write_image_file
-{
-	begin
-	{(AGMUTIL_imagefile)(w+)file}stopped{
-		false
-	}{
-		Adobe_AGM_Utils/AGMUTIL_imagefile xddf 
-		2 dict begin
-		/imbufLen Width BitsPerComponent mul 7 add 8 idiv def
-		MultipleDataSources{DataSource 0 get}{DataSource}ifelse type/filetype eq{
-			/imbuf imbufLen string def
-		}if
-		1 1 Height MultipleDataSources not{Decode length 2 idiv mul}if{
-			pop
-			MultipleDataSources{
-			 	0 1 DataSource length 1 sub{
-					DataSource type dup
-					/arraytype eq{
-						pop DataSource exch gx
-					}{
-						/filetype eq{
-							DataSource exch get imbuf readstring pop
-						}{
-							DataSource exch get
-						}ifelse
-					}ifelse
-					AGMUTIL_imagefile exch writestring
-				}for
-			}{
-				DataSource type dup
-				/arraytype eq{
-					pop DataSource exec
-				}{
-					/filetype eq{
-						DataSource imbuf readstring pop
-					}{
-						DataSource
-					}ifelse
-				}ifelse
-				AGMUTIL_imagefile exch writestring
-			}ifelse
-		}for
-		end
-		true
-	}ifelse
-	end
-}bdf
-/close_image_file
-{
-	AGMUTIL_imagefile closefile(AGMUTIL_imagefile)deletefile
-}def
-statusdict/product known userdict/AGMP_current_show known not and{
-	/pstr statusdict/product get def
-	pstr(HP LaserJet 2200)eq 	
-	pstr(HP LaserJet 4000 Series)eq or
-	pstr(HP LaserJet 4050 Series )eq or
-	pstr(HP LaserJet 8000 Series)eq or
-	pstr(HP LaserJet 8100 Series)eq or
-	pstr(HP LaserJet 8150 Series)eq or
-	pstr(HP LaserJet 5000 Series)eq or
-	pstr(HP LaserJet 5100 Series)eq or
-	pstr(HP Color LaserJet 4500)eq or
-	pstr(HP Color LaserJet 4600)eq or
-	pstr(HP LaserJet 5Si)eq or
-	pstr(HP LaserJet 1200 Series)eq or
-	pstr(HP LaserJet 1300 Series)eq or
-	pstr(HP LaserJet 4100 Series)eq or 
-	{
- 		userdict/AGMP_current_show/show load put
-		userdict/show{
-		 currentcolorspace 0 get
-		 /Pattern eq
-		 {false charpath f}
-		 {AGMP_current_show}ifelse
-		}put
-	}if
-	currentdict/pstr undef
-}if
-/consumeimagedata
-{
-	begin
-	AGMIMG_init_common
-	currentdict/MultipleDataSources known not
-		{/MultipleDataSources false def}if
-	MultipleDataSources
-		{
-		DataSource 0 get type
-		dup/filetype eq
-			{
-			1 dict begin
-			/flushbuffer Width cvi string def
-			1 1 Height cvi
-				{
-				pop
-				0 1 DataSource length 1 sub
-					{
-					DataSource exch get
-					flushbuffer readstring pop pop
-					}for
-				}for
-			end
-			}if
-		dup/arraytype eq exch/packedarraytype eq or DataSource 0 get xcheck and
-			{
-			Width Height mul cvi
-				{
-				0 1 DataSource length 1 sub
-					{dup DataSource exch gx length exch 0 ne{pop}if}for
-				dup 0 eq
-					{pop exit}if
-				sub dup 0 le
-					{exit}if
-				}loop
-			pop
-			}if		
-		}
-		{
-		/DataSource load type 
-		dup/filetype eq
-			{
-			1 dict begin
-			/flushbuffer Width Decode length 2 idiv mul cvi string def
-			1 1 Height{pop DataSource flushbuffer readstring pop pop}for
-			end
-			}if
-		dup/arraytype eq exch/packedarraytype eq or/DataSource load xcheck and
-			{
-				Height Width BitsPerComponent mul 8 BitsPerComponent sub add 8 idiv Decode length 2 idiv mul mul
-					{
-					DataSource length dup 0 eq
-						{pop exit}if
-					sub dup 0 le
-						{exit}if
-					}loop
-				pop
-			}if
-		}ifelse
-	end
-}bdf
-/addprocs
-{
-	 2{/exec load}repeat
-	 3 1 roll
-	 [5 1 roll]bind cvx
-}def
-/modify_halftone_xfer
-{
-	currenthalftone dup length dict copy begin
-	 currentdict 2 index known{
-	 	1 index load dup length dict copy begin
-		currentdict/TransferFunction known{
-			/TransferFunction load
-		}{
-			currenttransfer
-		}ifelse
-		 addprocs/TransferFunction xdf 
-		 currentdict end def
-		currentdict end sethalftone
-	}{
-		currentdict/TransferFunction known{
-			/TransferFunction load 
-		}{
-			currenttransfer
-		}ifelse
-		addprocs/TransferFunction xdf
-		currentdict end sethalftone		
-		pop
-	}ifelse
-}def
-/clonearray
-{
-	dup xcheck exch
-	dup length array exch
-	Adobe_AGM_Core/AGMCORE_tmp -1 ddf 
-	{
-	Adobe_AGM_Core/AGMCORE_tmp 2 copy get 1 add ddf 
-	dup type/dicttype eq
-		{
-			Adobe_AGM_Core/AGMCORE_tmp get
-			exch
-			clonedict
-			Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf 
-		}if
-	dup type/arraytype eq
-		{
-			Adobe_AGM_Core/AGMCORE_tmp get exch
-			clonearray
-			Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf 
-		}if
-	exch dup
-	Adobe_AGM_Core/AGMCORE_tmp get 4 -1 roll put
-	}forall
-	exch{cvx}if
-}bdf
-/clonedict
-{
-	dup length dict
-	begin
-	{
-		dup type/dicttype eq
-			{clonedict}if
-		dup type/arraytype eq
-			{clonearray}if
-		def
-	}forall
-	currentdict
-	end
-}bdf
-/DeviceN_PS2
-{
-	/currentcolorspace AGMCORE_gget 0 get/DeviceN eq level3 not and
-}bdf
-/Indexed_DeviceN
-{
-	/indexed_colorspace_dict AGMCORE_gget dup null ne{
-		dup/CSDBase known{
-			/CSDBase get/CSD get_res/Names known 
-		}{
-			pop false
-		}ifelse
-	}{
-		pop false
-	}ifelse
-}bdf
-/DeviceN_NoneName
-{	
-	/Names where{
-		pop
-		false Names
-		{
-			(None)eq or
-		}forall
-	}{
-		false
-	}ifelse
-}bdf
-/DeviceN_PS2_inRip_seps
-{
-	/AGMCORE_in_rip_sep where
-	{
-		pop dup type dup/arraytype eq exch/packedarraytype eq or
-		{
-			dup 0 get/DeviceN eq level3 not and AGMCORE_in_rip_sep and
-			{
-				/currentcolorspace exch AGMCORE_gput
-				false
-			}{
-				true
-			}ifelse
-		}{
-			true
-		}ifelse
-	}{
-		true
-	}ifelse
-}bdf
-/base_colorspace_type
-{
-	dup type/arraytype eq{0 get}if
-}bdf
-/currentdistillerparams where{pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse
-{
-	/pdfmark_5{cleartomark}bind def
-}{
-	/pdfmark_5{pdfmark}bind def
-}ifelse
-/ReadBypdfmark_5
-{
-	currentfile exch 0 exch/SubFileDecode filter
-	/currentdistillerparams where 
-	{pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse
-	{flushfile cleartomark}
-	{/PUT pdfmark}ifelse 	
-}bdf
-/ReadBypdfmark_5_string
-{
-	2 dict begin
-	/makerString exch def string/tmpString exch def
-	{
-		currentfile tmpString readline not{pop exit}if
-		makerString anchorsearch
-		{
-			pop pop cleartomark exit
-		}{
-			3 copy/PUT pdfmark_5 pop 2 copy(\n)/PUT pdfmark_5
-		}ifelse
-	}loop
-	end
-}bdf
-/xpdfm
-{
-	{
-		dup 0 get/Label eq
-		{
-			aload length[exch 1 add 1 roll/PAGELABEL
-		}{
-			aload pop
-			[{ThisPage}<<5 -2 roll>>/PUT
-		}ifelse
-		pdfmark_5
-	}forall
-}bdf
-/lmt{
-	dup 2 index le{exch}if pop dup 2 index ge{exch}if pop
-}bdf
-/int{
-	dup 2 index sub 3 index 5 index sub div 6 -2 roll sub mul exch pop add exch pop
-}bdf
-/ds{
-	Adobe_AGM_Utils begin
-}bdf
-/dt{
-	currentdict Adobe_AGM_Utils eq{
-		end
-	}if
-}bdf
-systemdict/setpacking known
-{setpacking}if
-%%EndResource
-%%BeginResource: procset Adobe_AGM_Core 2.0 0
-%%Version: 2.0 0
-%%Copyright: Copyright(C)1997-2007 Adobe Systems, Inc. All Rights Reserved.
-systemdict/setpacking known
-{
-	currentpacking
-	true setpacking
-}if
-userdict/Adobe_AGM_Core 209 dict dup begin put
-/Adobe_AGM_Core_Id/Adobe_AGM_Core_2.0_0 def
-/AGMCORE_str256 256 string def
-/AGMCORE_save nd
-/AGMCORE_graphicsave nd
-/AGMCORE_c 0 def
-/AGMCORE_m 0 def
-/AGMCORE_y 0 def
-/AGMCORE_k 0 def
-/AGMCORE_cmykbuf 4 array def
-/AGMCORE_screen[currentscreen]cvx def
-/AGMCORE_tmp 0 def
-/AGMCORE_&setgray nd
-/AGMCORE_&setcolor nd
-/AGMCORE_&setcolorspace nd
-/AGMCORE_&setcmykcolor nd
-/AGMCORE_cyan_plate nd
-/AGMCORE_magenta_plate nd
-/AGMCORE_yellow_plate nd
-/AGMCORE_black_plate nd
-/AGMCORE_plate_ndx nd
-/AGMCORE_get_ink_data nd
-/AGMCORE_is_cmyk_sep nd
-/AGMCORE_host_sep nd
-/AGMCORE_avoid_L2_sep_space nd
-/AGMCORE_distilling nd
-/AGMCORE_composite_job nd
-/AGMCORE_producing_seps nd
-/AGMCORE_ps_level -1 def
-/AGMCORE_ps_version -1 def
-/AGMCORE_environ_ok nd
-/AGMCORE_CSD_cache 0 dict def
-/AGMCORE_currentoverprint false def
-/AGMCORE_deltaX nd
-/AGMCORE_deltaY nd
-/AGMCORE_name nd
-/AGMCORE_sep_special nd
-/AGMCORE_err_strings 4 dict def
-/AGMCORE_cur_err nd
-/AGMCORE_current_spot_alias false def
-/AGMCORE_inverting false def
-/AGMCORE_feature_dictCount nd
-/AGMCORE_feature_opCount nd
-/AGMCORE_feature_ctm nd
-/AGMCORE_ConvertToProcess false def
-/AGMCORE_Default_CTM matrix def
-/AGMCORE_Default_PageSize nd
-/AGMCORE_Default_flatness nd
-/AGMCORE_currentbg nd
-/AGMCORE_currentucr nd
-/AGMCORE_pattern_paint_type 0 def
-/knockout_unitsq nd
-currentglobal true setglobal
-[/CSA/Gradient/Procedure]
-{
-	/Generic/Category findresource dup length dict copy/Category defineresource pop
-}forall
-setglobal
-/AGMCORE_key_known
-{
-	where{
-		/Adobe_AGM_Core_Id known
-	}{
-		false
-	}ifelse
-}ndf
-/flushinput
-{
-	save
-	2 dict begin
-	/CompareBuffer 3 -1 roll def
-	/readbuffer 256 string def
-	mark
-	{
-	currentfile readbuffer{readline}stopped
-		{cleartomark mark}
-		{
-		not
-			{pop exit}
-		if
-		CompareBuffer eq
-			{exit}
-		if
-		}ifelse
-	}loop
-	cleartomark
-	end
-	restore
-}bdf
-/getspotfunction
-{
-	AGMCORE_screen exch pop exch pop
-	dup type/dicttype eq{
-		dup/HalftoneType get 1 eq{
-			/SpotFunction get
-		}{
-			dup/HalftoneType get 2 eq{
-				/GraySpotFunction get
-			}{
-				pop
-				{
-					abs exch abs 2 copy add 1 gt{
-						1 sub dup mul exch 1 sub dup mul add 1 sub
-					}{
-						dup mul exch dup mul add 1 exch sub
-					}ifelse
-				}bind
-			}ifelse
-		}ifelse
-	}if
-}def
-/np
-{newpath}bdf
-/clp_npth
-{clip np}def
-/eoclp_npth
-{eoclip np}def
-/npth_clp
-{np clip}def
-/graphic_setup
-{
-	/AGMCORE_graphicsave save store
-	concat
-	0 setgray
-	0 setlinecap
-	0 setlinejoin
-	1 setlinewidth
-	[]0 setdash
-	10 setmiterlimit
-	np
-	false setoverprint
-	false setstrokeadjust
-	//Adobe_AGM_Core/spot_alias gx
-	/Adobe_AGM_Image where{
-		pop
-		Adobe_AGM_Image/spot_alias 2 copy known{
-			gx
-		}{
-			pop pop
-		}ifelse
-	}if
-	/sep_colorspace_dict null AGMCORE_gput
-	100 dict begin
-	/dictstackcount countdictstack def
-	/showpage{}def
-	mark
-}def
-/graphic_cleanup
-{
-	cleartomark
-	dictstackcount 1 countdictstack 1 sub{end}for
-	end
-	AGMCORE_graphicsave restore
-}def
-/compose_error_msg
-{
-	grestoreall initgraphics	
-	/Helvetica findfont 10 scalefont setfont
-	/AGMCORE_deltaY 100 def
-	/AGMCORE_deltaX 310 def
-	clippath pathbbox np pop pop 36 add exch 36 add exch moveto
-	0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto
-	0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath
-	0 AGMCORE_&setgray
-	gsave 1 AGMCORE_&setgray fill grestore 
-	1 setlinewidth gsave stroke grestore
-	currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto
-	/AGMCORE_deltaY 12 def
-	/AGMCORE_tmp 0 def
-	AGMCORE_err_strings exch get
-		{
-		dup 32 eq
-			{
-			pop
-			AGMCORE_str256 0 AGMCORE_tmp getinterval
-			stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt
-				{
-				currentpoint AGMCORE_deltaY sub exch pop
-				clippath pathbbox pop pop pop 44 add exch moveto
-				}if
-			AGMCORE_str256 0 AGMCORE_tmp getinterval show( )show
-			0 1 AGMCORE_str256 length 1 sub
-				{
-				AGMCORE_str256 exch 0 put
-				}for
-			/AGMCORE_tmp 0 def
-			}{
-				AGMCORE_str256 exch AGMCORE_tmp xpt
-				/AGMCORE_tmp AGMCORE_tmp 1 add def
-			}ifelse
-		}forall
-}bdf
-/AGMCORE_CMYKDeviceNColorspaces[
-	[/Separation/None/DeviceCMYK{0 0 0}]
-	[/Separation(Black)/DeviceCMYK{0 0 0 4 -1 roll}bind]
-	[/Separation(Yellow)/DeviceCMYK{0 0 3 -1 roll 0}bind]
-	[/DeviceN[(Yellow)(Black)]/DeviceCMYK{0 0 4 2 roll}bind]
-	[/Separation(Magenta)/DeviceCMYK{0 exch 0 0}bind]
-	[/DeviceN[(Magenta)(Black)]/DeviceCMYK{0 3 1 roll 0 exch}bind]
-	[/DeviceN[(Magenta)(Yellow)]/DeviceCMYK{0 3 1 roll 0}bind]
-	[/DeviceN[(Magenta)(Yellow)(Black)]/DeviceCMYK{0 4 1 roll}bind]
-	[/Separation(Cyan)/DeviceCMYK{0 0 0}]
-	[/DeviceN[(Cyan)(Black)]/DeviceCMYK{0 0 3 -1 roll}bind]
-	[/DeviceN[(Cyan)(Yellow)]/DeviceCMYK{0 exch 0}bind]
-	[/DeviceN[(Cyan)(Yellow)(Black)]/DeviceCMYK{0 3 1 roll}bind]
-	[/DeviceN[(Cyan)(Magenta)]/DeviceCMYK{0 0}]
-	[/DeviceN[(Cyan)(Magenta)(Black)]/DeviceCMYK{0 exch}bind]
-	[/DeviceN[(Cyan)(Magenta)(Yellow)]/DeviceCMYK{0}]
-	[/DeviceCMYK]
-]def
-/ds{
-	Adobe_AGM_Core begin
-	/currentdistillerparams where
-		{
-		pop currentdistillerparams/CoreDistVersion get 5000 lt
-			{<>setdistillerparams}if
-		}if	
-	/AGMCORE_ps_version xdf
-	/AGMCORE_ps_level xdf
-	errordict/AGM_handleerror known not{
-		errordict/AGM_handleerror errordict/handleerror get put
-		errordict/handleerror{
-			Adobe_AGM_Core begin
-			$error/newerror get AGMCORE_cur_err null ne and{
-				$error/newerror false put
-				AGMCORE_cur_err compose_error_msg
-			}if
-			$error/newerror true put
-			end
-			errordict/AGM_handleerror get exec
-			}bind put
-		}if
-	/AGMCORE_environ_ok 
-		ps_level AGMCORE_ps_level ge
-		ps_version AGMCORE_ps_version ge and 
-		AGMCORE_ps_level -1 eq or
-	def
-	AGMCORE_environ_ok not
-		{/AGMCORE_cur_err/AGMCORE_bad_environ def}if
-	/AGMCORE_&setgray systemdict/setgray get def
-	level2{
-		/AGMCORE_&setcolor systemdict/setcolor get def
-		/AGMCORE_&setcolorspace systemdict/setcolorspace get def
-	}if
-	/AGMCORE_currentbg currentblackgeneration def
-	/AGMCORE_currentucr currentundercolorremoval def
-	/AGMCORE_Default_flatness currentflat def
-	/AGMCORE_distilling
-		/product where{
-			pop systemdict/setdistillerparams known product(Adobe PostScript Parser)ne and
-		}{
-			false
-		}ifelse
-	def
-	/AGMCORE_GSTATE AGMCORE_key_known not{
-		/AGMCORE_GSTATE 21 dict def
-		/AGMCORE_tmpmatrix matrix def
-		/AGMCORE_gstack 32 array def
-		/AGMCORE_gstackptr 0 def
-		/AGMCORE_gstacksaveptr 0 def
-		/AGMCORE_gstackframekeys 14 def
-		/AGMCORE_&gsave/gsave ldf
-		/AGMCORE_&grestore/grestore ldf
-		/AGMCORE_&grestoreall/grestoreall ldf
-		/AGMCORE_&save/save ldf
-		/AGMCORE_&setoverprint/setoverprint ldf
-		/AGMCORE_gdictcopy{
-			begin
-			{def}forall
-			end
-		}def
-		/AGMCORE_gput{
-			AGMCORE_gstack AGMCORE_gstackptr get
-			3 1 roll
-			put
-		}def
-		/AGMCORE_gget{
-			AGMCORE_gstack AGMCORE_gstackptr get
-			exch
-			get
-		}def
-		/gsave{
-			AGMCORE_&gsave
-			AGMCORE_gstack AGMCORE_gstackptr get
-			AGMCORE_gstackptr 1 add
-			dup 32 ge{limitcheck}if
-			/AGMCORE_gstackptr exch store
-			AGMCORE_gstack AGMCORE_gstackptr get
-			AGMCORE_gdictcopy
-		}def
-		/grestore{
-			AGMCORE_&grestore
-			AGMCORE_gstackptr 1 sub
-			dup AGMCORE_gstacksaveptr lt{1 add}if
-			dup AGMCORE_gstack exch get dup/AGMCORE_currentoverprint known
-				{/AGMCORE_currentoverprint get setoverprint}{pop}ifelse
-			/AGMCORE_gstackptr exch store
-		}def
-		/grestoreall{
-			AGMCORE_&grestoreall
-			/AGMCORE_gstackptr AGMCORE_gstacksaveptr store 
-		}def
-		/save{
-			AGMCORE_&save
-			AGMCORE_gstack AGMCORE_gstackptr get
-			AGMCORE_gstackptr 1 add
-			dup 32 ge{limitcheck}if
-			/AGMCORE_gstackptr exch store
-			/AGMCORE_gstacksaveptr AGMCORE_gstackptr store
-			AGMCORE_gstack AGMCORE_gstackptr get
-			AGMCORE_gdictcopy
-		}def
-		/setoverprint{
-			dup/AGMCORE_currentoverprint exch AGMCORE_gput AGMCORE_&setoverprint
-		}def	
-		0 1 AGMCORE_gstack length 1 sub{
-				AGMCORE_gstack exch AGMCORE_gstackframekeys dict put
-		}for
-	}if
-	level3/AGMCORE_&sysshfill AGMCORE_key_known not and
-	{
-		/AGMCORE_&sysshfill systemdict/shfill get def
-		/AGMCORE_&sysmakepattern systemdict/makepattern get def
-		/AGMCORE_&usrmakepattern/makepattern load def
-	}if
-	/currentcmykcolor[0 0 0 0]AGMCORE_gput
-	/currentstrokeadjust false AGMCORE_gput
-	/currentcolorspace[/DeviceGray]AGMCORE_gput
-	/sep_tint 0 AGMCORE_gput
-	/devicen_tints[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]AGMCORE_gput
-	/sep_colorspace_dict null AGMCORE_gput
-	/devicen_colorspace_dict null AGMCORE_gput
-	/indexed_colorspace_dict null AGMCORE_gput
-	/currentcolor_intent()AGMCORE_gput
-	/customcolor_tint 1 AGMCORE_gput
-	/absolute_colorimetric_crd null AGMCORE_gput
-	/relative_colorimetric_crd null AGMCORE_gput
-	/saturation_crd null AGMCORE_gput
-	/perceptual_crd null AGMCORE_gput
-	currentcolortransfer cvlit/AGMCore_gray_xfer xdf cvlit/AGMCore_b_xfer xdf
-		 cvlit/AGMCore_g_xfer xdf cvlit/AGMCore_r_xfer xdf
-	<<
-	/MaxPatternItem currentsystemparams/MaxPatternCache get
-	>>
-	setuserparams
-	end
-}def
-/ps
-{
-	/setcmykcolor where{
-		pop
-		Adobe_AGM_Core/AGMCORE_&setcmykcolor/setcmykcolor load put
-	}if
-	Adobe_AGM_Core begin
-	/setcmykcolor
-	{
-		4 copy AGMCORE_cmykbuf astore/currentcmykcolor exch AGMCORE_gput
-		1 sub 4 1 roll
-		3{
-			3 index add neg dup 0 lt{
-				pop 0
-			}if
-			3 1 roll
-		}repeat
-		setrgbcolor pop
-	}ndf
-	/currentcmykcolor
-	{
-		/currentcmykcolor AGMCORE_gget aload pop
-	}ndf
-	/setoverprint
-	{pop}ndf
-	/currentoverprint
-	{false}ndf
-	/AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def
-	/AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def
-	/AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def
-	/AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def
-	/AGMCORE_plate_ndx 
-		AGMCORE_cyan_plate{
-			0
-		}{
-			AGMCORE_magenta_plate{
-				1
-			}{
-				AGMCORE_yellow_plate{
-					2
-				}{
-					AGMCORE_black_plate{
-						3
-					}{
-						4
-					}ifelse
-				}ifelse
-			}ifelse
-		}ifelse
-		def
-	/AGMCORE_have_reported_unsupported_color_space false def
-	/AGMCORE_report_unsupported_color_space
-	{
-		AGMCORE_have_reported_unsupported_color_space false eq
-		{
-			(Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.)==
-			Adobe_AGM_Core/AGMCORE_have_reported_unsupported_color_space true ddf
-		}if
-	}def
-	/AGMCORE_composite_job
-		AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def
-	/AGMCORE_in_rip_sep
-		/AGMCORE_in_rip_sep where{
-			pop AGMCORE_in_rip_sep
-		}{
-			AGMCORE_distilling 
-			{
-				false
-			}{
-				userdict/Adobe_AGM_OnHost_Seps known{
-					false
-				}{
-					level2{
-						currentpagedevice/Separations 2 copy known{
-							get
-						}{
-							pop pop false
-						}ifelse
-					}{
-						false
-					}ifelse
-				}ifelse
-			}ifelse
-		}ifelse
-	def
-	/AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def
-	/AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def
-	/AGM_preserve_spots 
-		/AGM_preserve_spots where{
-			pop AGM_preserve_spots
-		}{
-			AGMCORE_distilling AGMCORE_producing_seps or
-		}ifelse
-	def
-	/AGM_is_distiller_preserving_spotimages
-	{
-		currentdistillerparams/PreserveOverprintSettings known
-		{
-			currentdistillerparams/PreserveOverprintSettings get
-				{
-					currentdistillerparams/ColorConversionStrategy known
-					{
-						currentdistillerparams/ColorConversionStrategy get
-						/sRGB ne
-					}{
-						true
-					}ifelse
-				}{
-					false
-				}ifelse
-		}{
-			false
-		}ifelse
-	}def
-	/convert_spot_to_process where{pop}{
-		/convert_spot_to_process
-		{
-			//Adobe_AGM_Core begin
-			dup map_alias{
-				/Name get exch pop
-			}if
-			dup dup(None)eq exch(All)eq or
-				{
-				pop false
-				}{
-				AGMCORE_host_sep
-				{
-					gsave
-					1 0 0 0 setcmykcolor currentgray 1 exch sub
-					0 1 0 0 setcmykcolor currentgray 1 exch sub
-					0 0 1 0 setcmykcolor currentgray 1 exch sub
-					0 0 0 1 setcmykcolor currentgray 1 exch sub
-					add add add 0 eq
-					{
-						pop false
-					}{
-						false setoverprint
-						current_spot_alias false set_spot_alias
-						1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor
-						set_spot_alias
-						currentgray 1 ne
-					}ifelse
-					grestore
-				}{
-					AGMCORE_distilling
-					{
-						pop AGM_is_distiller_preserving_spotimages not
-					}{
-						//Adobe_AGM_Core/AGMCORE_name xddf
-						false
-						//Adobe_AGM_Core/AGMCORE_pattern_paint_type get 0 eq
-						AGMUTIL_cpd/OverrideSeparations known and
-						{
-							AGMUTIL_cpd/OverrideSeparations get
-							{
-								/HqnSpots/ProcSet resourcestatus
-								{
-									pop pop pop true
-								}if
-							}if
-						}if					
-						{
-							AGMCORE_name/HqnSpots/ProcSet findresource/TestSpot gx not
-						}{
-							gsave
-							[/Separation AGMCORE_name/DeviceGray{}]AGMCORE_&setcolorspace
-							false
-							AGMUTIL_cpd/SeparationColorNames 2 copy known
-							{
-								get
-								{AGMCORE_name eq or}forall
-								not
-							}{
-								pop pop pop true
-							}ifelse
-							grestore
-						}ifelse
-					}ifelse
-				}ifelse
-			}ifelse
-			end
-		}def
-	}ifelse
-	/convert_to_process where{pop}{
-		/convert_to_process
-		{
-			dup length 0 eq
-				{
-				pop false
-				}{
-				AGMCORE_host_sep
-				{
-				dup true exch
-					{
-					dup(Cyan)eq exch
-					dup(Magenta)eq 3 -1 roll or exch
-					dup(Yellow)eq 3 -1 roll or exch
-					dup(Black)eq 3 -1 roll or
-						{pop}
-						{convert_spot_to_process and}ifelse
-					}
-				forall
-					{
-					true exch
-						{
-						dup(Cyan)eq exch
-						dup(Magenta)eq 3 -1 roll or exch
-						dup(Yellow)eq 3 -1 roll or exch
-						(Black)eq or and
-						}forall
-						not
-					}{pop false}ifelse
-				}{
-				false exch
-					{
-					/PhotoshopDuotoneList where{pop false}{true}ifelse
-						{
-						dup(Cyan)eq exch
-						dup(Magenta)eq 3 -1 roll or exch
-						dup(Yellow)eq 3 -1 roll or exch
-						dup(Black)eq 3 -1 roll or
-						{pop}
-						{convert_spot_to_process or}ifelse
-						}
-						{
-						convert_spot_to_process or
-						}
-					ifelse
-					}
-				forall
-				}ifelse
-			}ifelse
-		}def
-	}ifelse	
-	/AGMCORE_avoid_L2_sep_space 
-		version cvr 2012 lt 
-		level2 and 
-		AGMCORE_producing_seps not and
-	def
-	/AGMCORE_is_cmyk_sep
-		AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or
-	def
-	/AGM_avoid_0_cmyk where{
-		pop AGM_avoid_0_cmyk
-	}{
-		AGM_preserve_spots 
-		userdict/Adobe_AGM_OnHost_Seps known 
-		userdict/Adobe_AGM_InRip_Seps known or
-		not and
-	}ifelse
-	{
-		/setcmykcolor[
-			{
-				4 copy add add add 0 eq currentoverprint and{
-					pop 0.0005
-				}if
-			}/exec cvx
-			/AGMCORE_&setcmykcolor load dup type/operatortype ne{
-				/exec cvx
-			}if
-		]cvx def
-	}if
-	/AGMCORE_IsSeparationAProcessColor
-		{
-		dup(Cyan)eq exch dup(Magenta)eq exch dup(Yellow)eq exch(Black)eq or or or
-		}def
-	AGMCORE_host_sep{
-		/setcolortransfer
-		{
-			AGMCORE_cyan_plate{
-				pop pop pop
-			}{
-			 	AGMCORE_magenta_plate{
-			 		4 3 roll pop pop pop
-			 	}{
-			 		AGMCORE_yellow_plate{
-			 			4 2 roll pop pop pop
-			 		}{
-			 			4 1 roll pop pop pop
-			 		}ifelse
-			 	}ifelse
-			}ifelse
-			settransfer 
-		}	
-		def
-		/AGMCORE_get_ink_data
-			AGMCORE_cyan_plate{
-				{pop pop pop}
-			}{
-			 	AGMCORE_magenta_plate{
-			 		{4 3 roll pop pop pop}
-			 	}{
-			 		AGMCORE_yellow_plate{
-			 			{4 2 roll pop pop pop}
-			 		}{
-			 			{4 1 roll pop pop pop}
-			 		}ifelse
-			 	}ifelse
-			}ifelse
-		def
-		/AGMCORE_RemoveProcessColorNames
-			{
-			1 dict begin
-			/filtername
-				{
-				dup/Cyan eq 1 index(Cyan)eq or
-					{pop(_cyan_)}if
-				dup/Magenta eq 1 index(Magenta)eq or
-					{pop(_magenta_)}if
-				dup/Yellow eq 1 index(Yellow)eq or
-					{pop(_yellow_)}if
-				dup/Black eq 1 index(Black)eq or
-					{pop(_black_)}if
-				}def
-			dup type/arraytype eq
-				{[exch{filtername}forall]}
-				{filtername}ifelse
-			end
-			}def
-		level3{
-			/AGMCORE_IsCurrentColor
-				{
-				dup AGMCORE_IsSeparationAProcessColor
-					{
-					AGMCORE_plate_ndx 0 eq
-						{dup(Cyan)eq exch/Cyan eq or}if
-					AGMCORE_plate_ndx 1 eq
-						{dup(Magenta)eq exch/Magenta eq or}if
-					AGMCORE_plate_ndx 2 eq
-						{dup(Yellow)eq exch/Yellow eq or}if
-					AGMCORE_plate_ndx 3 eq
-						{dup(Black)eq exch/Black eq or}if
-					AGMCORE_plate_ndx 4 eq
-						{pop false}if
-					}{
-					gsave
-					false setoverprint
-					current_spot_alias false set_spot_alias
-					1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor
-					set_spot_alias
-					currentgray 1 ne
-					grestore
-					}ifelse
-				}def
-			/AGMCORE_filter_functiondatasource
-				{	
-				5 dict begin
-				/data_in xdf
-				data_in type/stringtype eq
-					{
-					/ncomp xdf
-					/comp xdf
-					/string_out data_in length ncomp idiv string def
-					0 ncomp data_in length 1 sub
-						{
-						string_out exch dup ncomp idiv exch data_in exch ncomp getinterval comp get 255 exch sub put
-						}for
-					string_out
-					}{
-					string/string_in xdf
-					/string_out 1 string def
-					/component xdf
-					[
-					data_in string_in/readstring cvx
-						[component/get cvx 255/exch cvx/sub cvx string_out/exch cvx 0/exch cvx/put cvx string_out]cvx
-						[/pop cvx()]cvx/ifelse cvx
-					]cvx/ReusableStreamDecode filter
-				}ifelse
-				end
-				}def
-			/AGMCORE_separateShadingFunction
-				{
-				2 dict begin
-				/paint? xdf
-				/channel xdf
-				dup type/dicttype eq
-					{
-					begin
-					FunctionType 0 eq
-						{
-						/DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def
-						currentdict/Decode known
-							{/Decode Decode channel 2 mul 2 getinterval def}if
-						paint? not
-							{/Decode[1 1]def}if
-						}if
-					FunctionType 2 eq
-						{
-						paint?
-							{
-							/C0[C0 channel get 1 exch sub]def
-							/C1[C1 channel get 1 exch sub]def
-							}{
-							/C0[1]def
-							/C1[1]def
-							}ifelse			
-						}if
-					FunctionType 3 eq
-						{
-						/Functions[Functions{channel paint? AGMCORE_separateShadingFunction}forall]def			
-						}if
-					currentdict/Range known
-						{/Range[0 1]def}if
-					currentdict
-					end}{
-					channel get 0 paint? AGMCORE_separateShadingFunction
-					}ifelse
-				end
-				}def
-			/AGMCORE_separateShading
-				{
-				3 -1 roll begin
-				currentdict/Function known
-					{
-					currentdict/Background known
-						{[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if
-					Function 3 1 roll AGMCORE_separateShadingFunction/Function xdf
-					/ColorSpace[/DeviceGray]def
-					}{
-					ColorSpace dup type/arraytype eq{0 get}if/DeviceCMYK eq
-						{
-						/ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def
-						}{
-						ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put
-						}ifelse
-					ColorSpace 0 get/Separation eq
-						{
-							{
-								[1/exch cvx/sub cvx]cvx
-							}{
-								[/pop cvx 1]cvx
-							}ifelse
-							ColorSpace 3 3 -1 roll put
-							pop
-						}{
-							{
-								[exch ColorSpace 1 get length 1 sub exch sub/index cvx 1/exch cvx/sub cvx ColorSpace 1 get length 1 add 1/roll cvx ColorSpace 1 get length{/pop cvx}repeat]cvx
-							}{
-								pop[ColorSpace 1 get length{/pop cvx}repeat cvx 1]cvx
-							}ifelse
-							ColorSpace 3 3 -1 roll bind put
-						}ifelse
-					ColorSpace 2/DeviceGray put																		
-					}ifelse
-				end
-				}def
-			/AGMCORE_separateShadingDict
-				{
-				dup/ColorSpace get
-				dup type/arraytype ne
-					{[exch]}if
-				dup 0 get/DeviceCMYK eq
-					{
-					exch begin 
-					currentdict
-					AGMCORE_cyan_plate
-						{0 true}if
-					AGMCORE_magenta_plate
-						{1 true}if
-					AGMCORE_yellow_plate
-						{2 true}if
-					AGMCORE_black_plate
-						{3 true}if
-					AGMCORE_plate_ndx 4 eq
-						{0 false}if		
-					dup not currentoverprint and
-						{/AGMCORE_ignoreshade true def}if
-					AGMCORE_separateShading
-					currentdict
-					end exch
-					}if
-				dup 0 get/Separation eq
-					{
-					exch begin
-					ColorSpace 1 get dup/None ne exch/All ne and
-						{
-						ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and
-							{
-							ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq 
-								{
-								/ColorSpace
-									[
-									/Separation
-									ColorSpace 1 get
-									/DeviceGray
-										[
-										ColorSpace 3 get/exec cvx
-										4 AGMCORE_plate_ndx sub -1/roll cvx
-										4 1/roll cvx
-										3[/pop cvx]cvx/repeat cvx
-										1/exch cvx/sub cvx
-										]cvx									
-									]def
-								}{
-								AGMCORE_report_unsupported_color_space
-								AGMCORE_black_plate not
-									{
-									currentdict 0 false AGMCORE_separateShading
-									}if
-								}ifelse
-							}{
-							currentdict ColorSpace 1 get AGMCORE_IsCurrentColor
-							0 exch 
-							dup not currentoverprint and
-								{/AGMCORE_ignoreshade true def}if
-							AGMCORE_separateShading
-							}ifelse	
-						}if			
-					currentdict
-					end exch
-					}if
-				dup 0 get/DeviceN eq
-					{
-					exch begin
-					ColorSpace 1 get convert_to_process
-						{
-						ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq 
-							{
-							/ColorSpace
-								[
-								/DeviceN
-								ColorSpace 1 get
-								/DeviceGray
-									[
-									ColorSpace 3 get/exec cvx
-									4 AGMCORE_plate_ndx sub -1/roll cvx
-									4 1/roll cvx
-									3[/pop cvx]cvx/repeat cvx
-									1/exch cvx/sub cvx
-									]cvx									
-								]def
-							}{
-							AGMCORE_report_unsupported_color_space
-							AGMCORE_black_plate not
-								{
-								currentdict 0 false AGMCORE_separateShading
-								/ColorSpace[/DeviceGray]def
-								}if
-							}ifelse
-						}{
-						currentdict
-						false -1 ColorSpace 1 get
-							{
-							AGMCORE_IsCurrentColor
-								{
-								1 add
-								exch pop true exch exit
-								}if
-							1 add
-							}forall
-						exch 
-						dup not currentoverprint and
-							{/AGMCORE_ignoreshade true def}if
-						AGMCORE_separateShading
-						}ifelse
-					currentdict
-					end exch
-					}if
-				dup 0 get dup/DeviceCMYK eq exch dup/Separation eq exch/DeviceN eq or or not
-					{
-					exch begin
-					ColorSpace dup type/arraytype eq
-						{0 get}if
-					/DeviceGray ne
-						{
-						AGMCORE_report_unsupported_color_space
-						AGMCORE_black_plate not
-							{
-							ColorSpace 0 get/CIEBasedA eq
-								{
-								/ColorSpace[/Separation/_ciebaseda_/DeviceGray{}]def
-								}if
-							ColorSpace 0 get dup/CIEBasedABC eq exch dup/CIEBasedDEF eq exch/DeviceRGB eq or or
-								{
-								/ColorSpace[/DeviceN[/_red_/_green_/_blue_]/DeviceRGB{}]def
-								}if
-							ColorSpace 0 get/CIEBasedDEFG eq
-								{
-								/ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def
-								}if
-							currentdict 0 false AGMCORE_separateShading
-							}if
-						}if
-					currentdict
-					end exch
-					}if
-				pop
-				dup/AGMCORE_ignoreshade known
-					{
-					begin
-					/ColorSpace[/Separation(None)/DeviceGray{}]def
-					currentdict end
-					}if
-				}def
-			/shfill
-				{
-				AGMCORE_separateShadingDict 
-				dup/AGMCORE_ignoreshade known
-					{pop}
-					{AGMCORE_&sysshfill}ifelse
-				}def
-			/makepattern
-				{
-				exch
-				dup/PatternType get 2 eq
-					{
-					clonedict
-					begin
-					/Shading Shading AGMCORE_separateShadingDict def
-					Shading/AGMCORE_ignoreshade known
-					currentdict end exch
-					{pop<>}if
-					exch AGMCORE_&sysmakepattern
-					}{
-					exch AGMCORE_&usrmakepattern
-					}ifelse
-				}def
-		}if
-	}if
-	AGMCORE_in_rip_sep{
-		/setcustomcolor
-		{
-			exch aload pop
-			dup 7 1 roll inRip_spot_has_ink not	{
-				4{4 index mul 4 1 roll}
-				repeat
-				/DeviceCMYK setcolorspace
-				6 -2 roll pop pop
-			}{
-				//Adobe_AGM_Core begin
-					/AGMCORE_k xdf/AGMCORE_y xdf/AGMCORE_m xdf/AGMCORE_c xdf
-				end
-				[/Separation 4 -1 roll/DeviceCMYK
-				{dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul}
-				]
-				setcolorspace
-			}ifelse
-			setcolor
-		}ndf
-		/setseparationgray
-		{
-			[/Separation(All)/DeviceGray{}]setcolorspace_opt
-			1 exch sub setcolor
-		}ndf
-	}{
-		/setseparationgray
-		{
-			AGMCORE_&setgray
-		}ndf
-	}ifelse
-	/findcmykcustomcolor
-	{
-		5 makereadonlyarray
-	}ndf
-	/setcustomcolor
-	{
-		exch aload pop pop
-		4{4 index mul 4 1 roll}repeat
-		setcmykcolor pop
-	}ndf
-	/has_color
-		/colorimage where{
-			AGMCORE_producing_seps{
-				pop true
-			}{
-				systemdict eq
-			}ifelse
-		}{
-			false
-		}ifelse
-	def
-	/map_index
-	{
-		1 index mul exch getinterval{255 div}forall
-	}bdf
-	/map_indexed_devn
-	{
-		Lookup Names length 3 -1 roll cvi map_index
-	}bdf
-	/n_color_components
-	{
-		base_colorspace_type
-		dup/DeviceGray eq{
-			pop 1
-		}{
-			/DeviceCMYK eq{
-				4
-			}{
-				3
-			}ifelse
-		}ifelse
-	}bdf
-	level2{
-		/mo/moveto ldf
-		/li/lineto ldf
-		/cv/curveto ldf
-		/knockout_unitsq
-		{
-			1 setgray
-			0 0 1 1 rectfill
-		}def
-		level2/setcolorspace AGMCORE_key_known not and{
-			/AGMCORE_&&&setcolorspace/setcolorspace ldf
-			/AGMCORE_ReplaceMappedColor
-			{
-				dup type dup/arraytype eq exch/packedarraytype eq or
-				{
-					/AGMCORE_SpotAliasAry2 where{
-						begin
-						dup 0 get dup/Separation eq
-						{
-							pop
-							dup length array copy
-							dup dup 1 get
-							current_spot_alias
-							{
-								dup map_alias
-								{
-									false set_spot_alias
-									dup 1 exch setsepcolorspace
-									true set_spot_alias
-									begin
-									/sep_colorspace_dict currentdict AGMCORE_gput
-									pop pop	pop
-									[
-										/Separation Name 
-										CSA map_csa
-										MappedCSA 
-										/sep_colorspace_proc load
-									]
-									dup Name
-									end
-								}if
-							}if
-							map_reserved_ink_name 1 xpt
-						}{
-							/DeviceN eq 
-							{
-								dup length array copy
-								dup dup 1 get[
-									exch{
-										current_spot_alias{
-											dup map_alias{
-												/Name get exch pop
-											}if
-										}if
-										map_reserved_ink_name
-									}forall 
-								]1 xpt
-							}if
-						}ifelse
-						end
-					}if
-				}if
-			}def
-			/setcolorspace
-			{
-				dup type dup/arraytype eq exch/packedarraytype eq or
-				{
-					dup 0 get/Indexed eq
-					{
-						AGMCORE_distilling
-						{
-							/PhotoshopDuotoneList where
-							{
-								pop false
-							}{
-								true
-							}ifelse
-						}{
-							true
-						}ifelse
-						{
-							aload pop 3 -1 roll
-							AGMCORE_ReplaceMappedColor
-							3 1 roll 4 array astore
-						}if
-					}{
-						AGMCORE_ReplaceMappedColor
-					}ifelse
-				}if
-				DeviceN_PS2_inRip_seps{AGMCORE_&&&setcolorspace}if
-			}def
-		}if	
-	}{
-		/adj
-		{
-			currentstrokeadjust{
-				transform
-				0.25 sub round 0.25 add exch
-				0.25 sub round 0.25 add exch
-				itransform
-			}if
-		}def
-		/mo{
-			adj moveto
-		}def
-		/li{
-			adj lineto
-		}def
-		/cv{
-			6 2 roll adj
-			6 2 roll adj
-			6 2 roll adj curveto
-		}def
-		/knockout_unitsq
-		{
-			1 setgray
-			8 8 1[8 0 0 8 0 0]{}image
-		}def
-		/currentstrokeadjust{
-			/currentstrokeadjust AGMCORE_gget
-		}def
-		/setstrokeadjust{
-			/currentstrokeadjust exch AGMCORE_gput
-		}def
-		/setcolorspace
-		{
-			/currentcolorspace exch AGMCORE_gput
-		}def
-		/currentcolorspace
-		{
-			/currentcolorspace AGMCORE_gget
-		}def
-		/setcolor_devicecolor
-		{
-			base_colorspace_type
-			dup/DeviceGray eq{
-				pop setgray
-			}{
-				/DeviceCMYK eq{
-					setcmykcolor
-				}{
-					setrgbcolor
-				}ifelse
-			}ifelse
-		}def
-		/setcolor
-		{
-			currentcolorspace 0 get
-			dup/DeviceGray ne{
-				dup/DeviceCMYK ne{
-					dup/DeviceRGB ne{
-						dup/Separation eq{
-							pop
-							currentcolorspace 3 gx
-							currentcolorspace 2 get
-						}{
-							dup/Indexed eq{
-								pop
-								currentcolorspace 3 get dup type/stringtype eq{
-									currentcolorspace 1 get n_color_components
-									3 -1 roll map_index
-								}{
-									exec
-								}ifelse
-								currentcolorspace 1 get
-							}{
-								/AGMCORE_cur_err/AGMCORE_invalid_color_space def
-								AGMCORE_invalid_color_space
-							}ifelse
-						}ifelse
-					}if
-				}if
-			}if
-			setcolor_devicecolor
-		}def
-	}ifelse
-	/sop/setoverprint ldf
-	/lw/setlinewidth ldf
-	/lc/setlinecap ldf
-	/lj/setlinejoin ldf
-	/ml/setmiterlimit ldf
-	/dsh/setdash ldf
-	/sadj/setstrokeadjust ldf
-	/gry/setgray ldf
-	/rgb/setrgbcolor ldf
-	/cmyk[
-		/currentcolorspace[/DeviceCMYK]/AGMCORE_gput cvx
-		/setcmykcolor load dup type/operatortype ne{/exec cvx}if
-	]cvx bdf
-	level3 AGMCORE_host_sep not and{
-		/nzopmsc{
-			6 dict begin
-			/kk exch def
-			/yy exch def
-			/mm exch def
-			/cc exch def
-			/sum 0 def
-			cc 0 ne{/sum sum 2#1000 or def cc}if
-			mm 0 ne{/sum sum 2#0100 or def mm}if
-			yy 0 ne{/sum sum 2#0010 or def yy}if
-			kk 0 ne{/sum sum 2#0001 or def kk}if
-			AGMCORE_CMYKDeviceNColorspaces sum get setcolorspace
-			sum 0 eq{0}if
-			end
-			setcolor
-		}bdf
-	}{
-		/nzopmsc/cmyk ldf
-	}ifelse
-	/sep/setsepcolor ldf
-	/devn/setdevicencolor ldf
-	/idx/setindexedcolor ldf
-	/colr/setcolor ldf
-	/csacrd/set_csa_crd ldf
-	/sepcs/setsepcolorspace ldf
-	/devncs/setdevicencolorspace ldf
-	/idxcs/setindexedcolorspace ldf
-	/cp/closepath ldf
-	/clp/clp_npth ldf
-	/eclp/eoclp_npth ldf
-	/f/fill ldf
-	/ef/eofill ldf
-	/@/stroke ldf
-	/nclp/npth_clp ldf
-	/gset/graphic_setup ldf
-	/gcln/graphic_cleanup ldf
-	/ct/concat ldf
-	/cf/currentfile ldf
-	/fl/filter ldf
-	/rs/readstring ldf
-	/AGMCORE_def_ht currenthalftone def
-	/clonedict Adobe_AGM_Utils begin/clonedict load end def
-	/clonearray Adobe_AGM_Utils begin/clonearray load end def
-	currentdict{
-		dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{
-			bind
-		}if
-		def
-	}forall
-	/getrampcolor
-	{
-		/indx exch def
-		0 1 NumComp 1 sub
-		{
-			dup
-			Samples exch get
-			dup type/stringtype eq{indx get}if
-			exch
-			Scaling exch get aload pop
-			3 1 roll
-			mul add
-		}for
-		ColorSpaceFamily/Separation eq 
-		{sep}
-		{
-			ColorSpaceFamily/DeviceN eq
-			{devn}{setcolor}ifelse
-		}ifelse
-	}bdf
-	/sssetbackground{
-		aload pop 
-		ColorSpaceFamily/Separation eq 
-		{sep}
-		{
-			ColorSpaceFamily/DeviceN eq
-			{devn}{setcolor}ifelse
-		}ifelse	
-	}bdf
-	/RadialShade
-	{
-		40 dict begin
-		/ColorSpaceFamily xdf
-		/background xdf
-		/ext1 xdf
-		/ext0 xdf
-		/BBox xdf
-		/r2 xdf
-		/c2y xdf
-		/c2x xdf
-		/r1 xdf
-		/c1y xdf
-		/c1x xdf
-		/rampdict xdf
-		/setinkoverprint where{pop/setinkoverprint{pop}def}if
-		gsave
-		BBox length 0 gt
-		{
-			np
-			BBox 0 get BBox 1 get moveto
-			BBox 2 get BBox 0 get sub 0 rlineto
-			0 BBox 3 get BBox 1 get sub rlineto
-			BBox 2 get BBox 0 get sub neg 0 rlineto
-			closepath
-			clip
-			np
-		}if
-		c1x c2x eq
-		{
-			c1y c2y lt{/theta 90 def}{/theta 270 def}ifelse
-		}{
-			/slope c2y c1y sub c2x c1x sub div def
-			/theta slope 1 atan def
-			c2x c1x lt c2y c1y ge and{/theta theta 180 sub def}if
-			c2x c1x lt c2y c1y lt and{/theta theta 180 add def}if
-		}ifelse
-		gsave
-		clippath
-		c1x c1y translate
-		theta rotate
-		-90 rotate
-		{pathbbox}stopped
-		{0 0 0 0}if
-		/yMax xdf
-		/xMax xdf
-		/yMin xdf
-		/xMin xdf
-		grestore
-		xMax xMin eq yMax yMin eq or
-		{
-			grestore
-			end
-		}{
-			/max{2 copy gt{pop}{exch pop}ifelse}bdf
-			/min{2 copy lt{pop}{exch pop}ifelse}bdf
-			rampdict begin
-			40 dict begin
-			background length 0 gt{background sssetbackground gsave clippath fill grestore}if
-			gsave
-			c1x c1y translate
-			theta rotate
-			-90 rotate
-			/c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def
-			/c1y 0 def
-			/c1x 0 def
-			/c2x 0 def
-			ext0
-			{
-				0 getrampcolor
-				c2y r2 add r1 sub 0.0001 lt
-				{
-					c1x c1y r1 360 0 arcn
-					pathbbox
-					/aymax exch def
-					/axmax exch def
-					/aymin exch def
-					/axmin exch def
-					/bxMin xMin axmin min def
-					/byMin yMin aymin min def
-					/bxMax xMax axmax max def
-					/byMax yMax aymax max def
-					bxMin byMin moveto
-					bxMax byMin lineto
-					bxMax byMax lineto
-					bxMin byMax lineto
-					bxMin byMin lineto
-					eofill
-				}{
-					c2y r1 add r2 le
-					{
-						c1x c1y r1 0 360 arc
-						fill
-					}
-					{
-						c2x c2y r2 0 360 arc fill
-						r1 r2 eq
-						{
-							/p1x r1 neg def
-							/p1y c1y def
-							/p2x r1 def
-							/p2y c1y def
-							p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto
-							fill
-						}{
-							/AA r2 r1 sub c2y div def
-							AA -1 eq
-							{/theta 89.99 def}
-							{/theta AA 1 AA dup mul sub sqrt div 1 atan def}
-							ifelse
-							/SS1 90 theta add dup sin exch cos div def
-							/p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def
-							/p1y p1x SS1 div neg def
-							/SS2 90 theta sub dup sin exch cos div def
-							/p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def
-							/p2y p2x SS2 div neg def
-							r1 r2 gt
-							{
-								/L1maxX p1x yMin p1y sub SS1 div add def
-								/L2maxX p2x yMin p2y sub SS2 div add def
-							}{
-								/L1maxX 0 def
-								/L2maxX 0 def
-							}ifelse
-							p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto
-							L1maxX L1maxX p1x sub SS1 mul p1y add lineto
-							fill
-						}ifelse
-					}ifelse
-				}ifelse
-			}if
-		c1x c2x sub dup mul
-		c1y c2y sub dup mul
-		add 0.5 exp
-		0 dtransform
-		dup mul exch dup mul add 0.5 exp 72 div
-		0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
-		72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
-		1 index 1 index lt{exch}if pop
-		/hires xdf
-		hires mul
-		/numpix xdf
-		/numsteps NumSamples def
-		/rampIndxInc 1 def
-		/subsampling false def
-		numpix 0 ne
-		{
-			NumSamples numpix div 0.5 gt
-			{
-				/numsteps numpix 2 div round cvi dup 1 le{pop 2}if def
-				/rampIndxInc NumSamples 1 sub numsteps div def
-				/subsampling true def
-			}if
-		}if
-		/xInc c2x c1x sub numsteps div def
-		/yInc c2y c1y sub numsteps div def
-		/rInc r2 r1 sub numsteps div def
-		/cx c1x def
-		/cy c1y def
-		/radius r1 def
-		np
-		xInc 0 eq yInc 0 eq rInc 0 eq and and
-		{
-			0 getrampcolor
-			cx cy radius 0 360 arc
-			stroke
-			NumSamples 1 sub getrampcolor
-			cx cy radius 72 hires div add 0 360 arc
-			0 setlinewidth
-			stroke
-		}{
-			0
-			numsteps
-			{
-				dup
-				subsampling{round cvi}if
-				getrampcolor
-				cx cy radius 0 360 arc
-				/cx cx xInc add def
-				/cy cy yInc add def
-				/radius radius rInc add def
-				cx cy radius 360 0 arcn
-				eofill
-				rampIndxInc add
-			}repeat
-			pop
-		}ifelse
-		ext1
-		{
-			c2y r2 add r1 lt
-			{
-				c2x c2y r2 0 360 arc
-				fill
-			}{
-				c2y r1 add r2 sub 0.0001 le
-				{
-					c2x c2y r2 360 0 arcn
-					pathbbox
-					/aymax exch def
-					/axmax exch def
-					/aymin exch def
-					/axmin exch def
-					/bxMin xMin axmin min def
-					/byMin yMin aymin min def
-					/bxMax xMax axmax max def
-					/byMax yMax aymax max def
-					bxMin byMin moveto
-					bxMax byMin lineto
-					bxMax byMax lineto
-					bxMin byMax lineto
-					bxMin byMin lineto
-					eofill
-				}{
-					c2x c2y r2 0 360 arc fill
-					r1 r2 eq
-					{
-						/p1x r2 neg def
-						/p1y c2y def
-						/p2x r2 def
-						/p2y c2y def
-						p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto
-						fill
-					}{
-						/AA r2 r1 sub c2y div def
-						AA -1 eq
-						{/theta 89.99 def}
-						{/theta AA 1 AA dup mul sub sqrt div 1 atan def}
-						ifelse
-						/SS1 90 theta add dup sin exch cos div def
-						/p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def
-						/p1y c2y p1x SS1 div sub def
-						/SS2 90 theta sub dup sin exch cos div def
-						/p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def
-						/p2y c2y p2x SS2 div sub def
-						r1 r2 lt
-						{
-							/L1maxX p1x yMax p1y sub SS1 div add def
-							/L2maxX p2x yMax p2y sub SS2 div add def
-						}{
-							/L1maxX 0 def
-							/L2maxX 0 def
-						}ifelse
-						p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto
-						L1maxX L1maxX p1x sub SS1 mul p1y add lineto
-						fill
-					}ifelse
-				}ifelse
-			}ifelse
-		}if
-		grestore
-		grestore
-		end
-		end
-		end
-		}ifelse
-	}bdf
-	/GenStrips
-	{
-		40 dict begin
-		/ColorSpaceFamily xdf
-		/background xdf
-		/ext1 xdf
-		/ext0 xdf
-		/BBox xdf
-		/y2 xdf
-		/x2 xdf
-		/y1 xdf
-		/x1 xdf
-		/rampdict xdf
-		/setinkoverprint where{pop/setinkoverprint{pop}def}if
-		gsave
-		BBox length 0 gt
-		{
-			np
-			BBox 0 get BBox 1 get moveto
-			BBox 2 get BBox 0 get sub 0 rlineto
-			0 BBox 3 get BBox 1 get sub rlineto
-			BBox 2 get BBox 0 get sub neg 0 rlineto
-			closepath
-			clip
-			np
-		}if
-		x1 x2 eq
-		{
-			y1 y2 lt{/theta 90 def}{/theta 270 def}ifelse
-		}{
-			/slope y2 y1 sub x2 x1 sub div def
-			/theta slope 1 atan def
-			x2 x1 lt y2 y1 ge and{/theta theta 180 sub def}if
-			x2 x1 lt y2 y1 lt and{/theta theta 180 add def}if
-		}
-		ifelse
-		gsave
-		clippath
-		x1 y1 translate
-		theta rotate
-		{pathbbox}stopped
-		{0 0 0 0}if
-		/yMax exch def
-		/xMax exch def
-		/yMin exch def
-		/xMin exch def
-		grestore
-		xMax xMin eq yMax yMin eq or
-		{
-			grestore
-			end
-		}{
-			rampdict begin
-			20 dict begin
-			background length 0 gt{background sssetbackground gsave clippath fill grestore}if
-			gsave
-			x1 y1 translate
-			theta rotate
-			/xStart 0 def
-			/xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def
-			/ySpan yMax yMin sub def
-			/numsteps NumSamples def
-			/rampIndxInc 1 def
-			/subsampling false def
-			xStart 0 transform
-			xEnd 0 transform
-			3 -1 roll
-			sub dup mul
-			3 1 roll
-			sub dup mul
-			add 0.5 exp 72 div
-			0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
-			72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
-			1 index 1 index lt{exch}if pop
-			mul
-			/numpix xdf
-			numpix 0 ne
-			{
-				NumSamples numpix div 0.5 gt
-				{
-					/numsteps numpix 2 div round cvi dup 1 le{pop 2}if def
-					/rampIndxInc NumSamples 1 sub numsteps div def
-					/subsampling true def
-				}if
-			}if
-			ext0
-			{
-				0 getrampcolor
-				xMin xStart lt
-				{
-					xMin yMin xMin neg ySpan rectfill
-				}if
-			}if
-			/xInc xEnd xStart sub numsteps div def
-			/x xStart def
-			0
-			numsteps
-			{
-				dup
-				subsampling{round cvi}if
-				getrampcolor
-				x yMin xInc ySpan rectfill
-				/x x xInc add def
-				rampIndxInc add
-			}repeat
-			pop
-			ext1{
-				xMax xEnd gt
-				{
-					xEnd yMin xMax xEnd sub ySpan rectfill
-				}if
-			}if
-			grestore
-			grestore
-			end
-			end
-			end
-		}ifelse
-	}bdf
-}def
-/pt
-{
-	end
-}def
-/dt{
-}def
-/pgsv{
-	//Adobe_AGM_Core/AGMCORE_save save put
-}def
-/pgrs{
-	//Adobe_AGM_Core/AGMCORE_save get restore
-}def
-systemdict/findcolorrendering known{
-	/findcolorrendering systemdict/findcolorrendering get def
-}if
-systemdict/setcolorrendering known{
-	/setcolorrendering systemdict/setcolorrendering get def
-}if
-/test_cmyk_color_plate
-{
-	gsave
-	setcmykcolor currentgray 1 ne
-	grestore
-}def
-/inRip_spot_has_ink
-{
-	dup//Adobe_AGM_Core/AGMCORE_name xddf
-	convert_spot_to_process not
-}def
-/map255_to_range
-{
-	1 index sub
-	3 -1 roll 255 div mul add
-}def
-/set_csa_crd
-{
-	/sep_colorspace_dict null AGMCORE_gput
-	begin
-		CSA get_csa_by_name setcolorspace_opt
-		set_crd
-	end
-}
-def
-/map_csa
-{
-	currentdict/MappedCSA known{MappedCSA null ne}{false}ifelse
-	{pop}{get_csa_by_name/MappedCSA xdf}ifelse
-}def
-/setsepcolor
-{
-	/sep_colorspace_dict AGMCORE_gget begin
-		dup/sep_tint exch AGMCORE_gput
-		TintProc
-	end
-}def
-/setdevicencolor
-{
-	/devicen_colorspace_dict AGMCORE_gget begin
-		Names length copy
-		Names length 1 sub -1 0
-		{
-			/devicen_tints AGMCORE_gget 3 1 roll xpt
-		}for
-		TintProc
-	end
-}def
-/sep_colorspace_proc
-{
-	/AGMCORE_tmp exch store
-	/sep_colorspace_dict AGMCORE_gget begin
-	currentdict/Components known{
-		Components aload pop 
-		TintMethod/Lab eq{
-			2{AGMCORE_tmp mul NComponents 1 roll}repeat
-			LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll
-		}{
-			TintMethod/Subtractive eq{
-				NComponents{
-					AGMCORE_tmp mul NComponents 1 roll
-				}repeat
-			}{
-				NComponents{
-					1 sub AGMCORE_tmp mul 1 add NComponents 1 roll
-				}repeat
-			}ifelse
-		}ifelse
-	}{
-		ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get
-		aload pop
-	}ifelse
-	end
-}def
-/sep_colorspace_gray_proc
-{
-	/AGMCORE_tmp exch store
-	/sep_colorspace_dict AGMCORE_gget begin
-	GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get
-	end
-}def
-/sep_proc_name
-{
-	dup 0 get 
-	dup/DeviceRGB eq exch/DeviceCMYK eq or level2 not and has_color not and{
-		pop[/DeviceGray]
-		/sep_colorspace_gray_proc
-	}{
-		/sep_colorspace_proc
-	}ifelse
-}def
-/setsepcolorspace
-{
-	current_spot_alias{
-		dup begin
-			Name map_alias{
-				exch pop
-			}if
-		end
-	}if
-	dup/sep_colorspace_dict exch AGMCORE_gput
-	begin
-	CSA map_csa
-	/AGMCORE_sep_special Name dup()eq exch(All)eq or store
-	AGMCORE_avoid_L2_sep_space{
-		[/Indexed MappedCSA sep_proc_name 255 exch 
-			{255 div}/exec cvx 3 -1 roll[4 1 roll load/exec cvx]cvx 
-		]setcolorspace_opt
-		/TintProc{
-			255 mul round cvi setcolor
-		}bdf
-	}{
-		MappedCSA 0 get/DeviceCMYK eq 
-		currentdict/Components known and 
-		AGMCORE_sep_special not and{
-			/TintProc[
-				Components aload pop Name findcmykcustomcolor 
-				/exch cvx/setcustomcolor cvx
-			]cvx bdf
-		}{
- 			AGMCORE_host_sep Name(All)eq and{
- 				/TintProc{
-					1 exch sub setseparationgray 
-				}bdf
- 			}{
-				AGMCORE_in_rip_sep MappedCSA 0 get/DeviceCMYK eq and 
-				AGMCORE_host_sep or
-				Name()eq and{
-					/TintProc[
-						MappedCSA sep_proc_name exch 0 get/DeviceCMYK eq{
-							cvx/setcmykcolor cvx
-						}{
-							cvx/setgray cvx
-						}ifelse
-					]cvx bdf
-				}{
-					AGMCORE_producing_seps MappedCSA 0 get dup/DeviceCMYK eq exch/DeviceGray eq or and AGMCORE_sep_special not and{
-	 					/TintProc[
-							/dup cvx
-							MappedCSA sep_proc_name cvx exch
-							0 get/DeviceGray eq{
-								1/exch cvx/sub cvx 0 0 0 4 -1/roll cvx
-							}if
-							/Name cvx/findcmykcustomcolor cvx/exch cvx
-							AGMCORE_host_sep{
-								AGMCORE_is_cmyk_sep
-								/Name cvx 
-								/AGMCORE_IsSeparationAProcessColor load/exec cvx
-								/not cvx/and cvx 
-							}{
-								Name inRip_spot_has_ink not
-							}ifelse
-							[
-		 						/pop cvx 1
-							]cvx/if cvx
-							/setcustomcolor cvx
-						]cvx bdf
- 					}{
-						/TintProc{setcolor}bdf
-						[/Separation Name MappedCSA sep_proc_name load]setcolorspace_opt
-					}ifelse
-				}ifelse
-			}ifelse
-		}ifelse
-	}ifelse
-	set_crd
-	setsepcolor
-	end
-}def
-/additive_blend
-{
- 	3 dict begin
- 	/numarrays xdf
- 	/numcolors xdf
- 	0 1 numcolors 1 sub
- 		{
- 		/c1 xdf
- 		1
- 		0 1 numarrays 1 sub
- 			{
-			1 exch add/index cvx
- 			c1/get cvx/mul cvx
- 			}for
- 		numarrays 1 add 1/roll cvx 
- 		}for
- 	numarrays[/pop cvx]cvx/repeat cvx
- 	end
-}def
-/subtractive_blend
-{
-	3 dict begin
-	/numarrays xdf
-	/numcolors xdf
-	0 1 numcolors 1 sub
-		{
-		/c1 xdf
-		1 1
-		0 1 numarrays 1 sub
-			{
-			1 3 3 -1 roll add/index cvx 
-			c1/get cvx/sub cvx/mul cvx
-			}for
-		/sub cvx
-		numarrays 1 add 1/roll cvx
-		}for
-	numarrays[/pop cvx]cvx/repeat cvx
-	end
-}def
-/exec_tint_transform
-{
-	/TintProc[
-		/TintTransform cvx/setcolor cvx
-	]cvx bdf
-	MappedCSA setcolorspace_opt
-}bdf
-/devn_makecustomcolor
-{
-	2 dict begin
-	/names_index xdf
-	/Names xdf
-	1 1 1 1 Names names_index get findcmykcustomcolor
-	/devicen_tints AGMCORE_gget names_index get setcustomcolor
-	Names length{pop}repeat
-	end
-}bdf
-/setdevicencolorspace
-{
-	dup/AliasedColorants known{false}{true}ifelse 
-	current_spot_alias and{
-		7 dict begin
-		/names_index 0 def
-		dup/names_len exch/Names get length def
-		/new_names names_len array def
-		/new_LookupTables names_len array def
-		/alias_cnt 0 def
-		dup/Names get
-		{
-			dup map_alias{
-				exch pop
-				dup/ColorLookup known{
-					dup begin
-					new_LookupTables names_index ColorLookup put
-					end
-				}{
-					dup/Components known{
-						dup begin
-						new_LookupTables names_index Components put
-						end
-					}{
-						dup begin
-						new_LookupTables names_index[null null null null]put
-						end
-					}ifelse
-				}ifelse
-				new_names names_index 3 -1 roll/Name get put
-				/alias_cnt alias_cnt 1 add def 
-			}{
-				/name xdf				
-				new_names names_index name put
-				dup/LookupTables known{
-					dup begin
-					new_LookupTables names_index LookupTables names_index get put
-					end
-				}{
-					dup begin
-					new_LookupTables names_index[null null null null]put
-					end
-				}ifelse
-			}ifelse
-			/names_index names_index 1 add def 
-		}forall
-		alias_cnt 0 gt{
-			/AliasedColorants true def
-			/lut_entry_len new_LookupTables 0 get dup length 256 ge{0 get length}{length}ifelse def
-			0 1 names_len 1 sub{
-				/names_index xdf
-				new_LookupTables names_index get dup length 256 ge{0 get length}{length}ifelse lut_entry_len ne{
-					/AliasedColorants false def
-					exit
-				}{
-					new_LookupTables names_index get 0 get null eq{
-						dup/Names get names_index get/name xdf
-						name(Cyan)eq name(Magenta)eq name(Yellow)eq name(Black)eq
-						or or or not{
-							/AliasedColorants false def
-							exit
-						}if
-					}if
-				}ifelse
-			}for
-			lut_entry_len 1 eq{
-				/AliasedColorants false def
-			}if
-			AliasedColorants{
-				dup begin
-				/Names new_names def
-				/LookupTables new_LookupTables def
-				/AliasedColorants true def
-				/NComponents lut_entry_len def
-				/TintMethod NComponents 4 eq{/Subtractive}{/Additive}ifelse def
-				/MappedCSA TintMethod/Additive eq{/DeviceRGB}{/DeviceCMYK}ifelse def
-				currentdict/TTTablesIdx known not{
-					/TTTablesIdx -1 def
-				}if
-				end
-			}if
-		}if
-		end
-	}if
-	dup/devicen_colorspace_dict exch AGMCORE_gput
-	begin
-	currentdict/AliasedColorants known{
-		AliasedColorants
-	}{
-		false
-	}ifelse
-	dup not{
-		CSA map_csa
-	}if
-	/TintTransform load type/nulltype eq or{
-		/TintTransform[
-			0 1 Names length 1 sub
-				{
-				/TTTablesIdx TTTablesIdx 1 add def
-				dup LookupTables exch get dup 0 get null eq
-					{
-					1 index
-					Names exch get
-					dup(Cyan)eq
-						{
-						pop exch
-						LookupTables length exch sub
-						/index cvx
-						0 0 0
-						}
-						{
-						dup(Magenta)eq
-							{
-							pop exch
-							LookupTables length exch sub
-							/index cvx
-							0/exch cvx 0 0
-							}{
-							(Yellow)eq
-								{
-								exch
-								LookupTables length exch sub
-								/index cvx
-								0 0 3 -1/roll cvx 0
-								}{
-								exch
-								LookupTables length exch sub
-								/index cvx
-								0 0 0 4 -1/roll cvx
-								}ifelse
-							}ifelse
-						}ifelse
-					5 -1/roll cvx/astore cvx
-					}{
-					dup length 1 sub
-					LookupTables length 4 -1 roll sub 1 add
-					/index cvx/mul cvx/round cvx/cvi cvx/get cvx
-					}ifelse
-					Names length TTTablesIdx add 1 add 1/roll cvx
-				}for
-			Names length[/pop cvx]cvx/repeat cvx
-			NComponents Names length
- 			TintMethod/Subtractive eq
- 				{
- 				subtractive_blend
- 				}{
- 				additive_blend
- 				}ifelse
-		]cvx bdf
-	}if
-	AGMCORE_host_sep{
-		Names convert_to_process{
-			exec_tint_transform
-		}
-		{	
-			currentdict/AliasedColorants known{
-				AliasedColorants not
-			}{
-				false
-			}ifelse
-			5 dict begin
-			/AvoidAliasedColorants xdf
-			/painted? false def
-			/names_index 0 def
-			/names_len Names length def
-			AvoidAliasedColorants{
-				/currentspotalias current_spot_alias def
-				false set_spot_alias
-			}if
-			Names{
-				AGMCORE_is_cmyk_sep{
-					dup(Cyan)eq AGMCORE_cyan_plate and exch
-					dup(Magenta)eq AGMCORE_magenta_plate and exch
-					dup(Yellow)eq AGMCORE_yellow_plate and exch
-					(Black)eq AGMCORE_black_plate and or or or{
-						/devicen_colorspace_dict AGMCORE_gget/TintProc[
-							Names names_index/devn_makecustomcolor cvx
-						]cvx ddf
-						/painted? true def
-					}if
-					painted?{exit}if
-				}{
-					0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq{
-					/devicen_colorspace_dict AGMCORE_gget/TintProc[
-						Names names_index/devn_makecustomcolor cvx
-					]cvx ddf
-					/painted? true def
-					exit
-					}if
-				}ifelse
-				/names_index names_index 1 add def
-			}forall
-			AvoidAliasedColorants{
-				currentspotalias set_spot_alias
-			}if
-			painted?{
-				/devicen_colorspace_dict AGMCORE_gget/names_index names_index put
-			}{
-				/devicen_colorspace_dict AGMCORE_gget/TintProc[
-					names_len[/pop cvx]cvx/repeat cvx 1/setseparationgray cvx
- 					0 0 0 0/setcmykcolor cvx
-				]cvx ddf
-			}ifelse
-			end
-		}ifelse
-	}
-	{
-		AGMCORE_in_rip_sep{
-			Names convert_to_process not
-		}{
-			level3
-		}ifelse
-		{
-			[/DeviceN Names MappedCSA/TintTransform load]setcolorspace_opt
-			/TintProc level3 not AGMCORE_in_rip_sep and{
-				[
-					Names/length cvx[/pop cvx]cvx/repeat cvx
-				]cvx bdf
-			}{
-				{setcolor}bdf
-			}ifelse
-		}{
-			exec_tint_transform
-		}ifelse
-	}ifelse
-	set_crd
-	/AliasedColorants false def
-	end
-}def
-/setindexedcolorspace
-{
-	dup/indexed_colorspace_dict exch AGMCORE_gput
-	begin
-		currentdict/CSDBase known{
-			CSDBase/CSD get_res begin
-			currentdict/Names known{
-				currentdict devncs
-			}{
-				1 currentdict sepcs
-			}ifelse
-			AGMCORE_host_sep{
-				4 dict begin
-				/compCnt/Names where{pop Names length}{1}ifelse def
-				/NewLookup HiVal 1 add string def
-				0 1 HiVal{
-					/tableIndex xdf
-					Lookup dup type/stringtype eq{
-						compCnt tableIndex map_index
-					}{
-						exec
-					}ifelse
-					/Names where{
-						pop setdevicencolor
-					}{
-						setsepcolor
-					}ifelse
-					currentgray
-					tableIndex exch
-					255 mul cvi 
-					NewLookup 3 1 roll put
-				}for
-				[/Indexed currentcolorspace HiVal NewLookup]setcolorspace_opt
-				end
-			}{
-				level3
-				{
-					currentdict/Names known{
-						[/Indexed[/DeviceN Names MappedCSA/TintTransform load]HiVal Lookup]setcolorspace_opt
-					}{
-						[/Indexed[/Separation Name MappedCSA sep_proc_name load]HiVal Lookup]setcolorspace_opt
-					}ifelse
-				}{
-				[/Indexed MappedCSA HiVal
-					[
-					currentdict/Names known{
-						Lookup dup type/stringtype eq
-							{/exch cvx CSDBase/CSD get_res/Names get length dup/mul cvx exch/getinterval cvx{255 div}/forall cvx}
-							{/exec cvx}ifelse
-							/TintTransform load/exec cvx
-					}{
-						Lookup dup type/stringtype eq
-							{/exch cvx/get cvx 255/div cvx}
-							{/exec cvx}ifelse
-							CSDBase/CSD get_res/MappedCSA get sep_proc_name exch pop/load cvx/exec cvx
-					}ifelse
-					]cvx
-				]setcolorspace_opt
-				}ifelse
-			}ifelse
-			end
-			set_crd
-		}
-		{
-			CSA map_csa
-			AGMCORE_host_sep level2 not and{
-				0 0 0 0 setcmykcolor
-			}{
-				[/Indexed MappedCSA 
-				level2 not has_color not and{
-					dup 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or{
-						pop[/DeviceGray]
-					}if
-					HiVal GrayLookup
-				}{
-					HiVal 
-					currentdict/RangeArray known{
-						{
-							/indexed_colorspace_dict AGMCORE_gget begin
-							Lookup exch 
-							dup HiVal gt{
-								pop HiVal
-							}if
-							NComponents mul NComponents getinterval{}forall
-							NComponents 1 sub -1 0{
-								RangeArray exch 2 mul 2 getinterval aload pop map255_to_range
-								NComponents 1 roll
-							}for
-							end
-						}bind
-					}{
-						Lookup
-					}ifelse
-				}ifelse
-				]setcolorspace_opt
-				set_crd
-			}ifelse
-		}ifelse
-	end
-}def
-/setindexedcolor
-{
-	AGMCORE_host_sep{
-		/indexed_colorspace_dict AGMCORE_gget
-		begin
-		currentdict/CSDBase known{
-			CSDBase/CSD get_res begin
-			currentdict/Names known{
-				map_indexed_devn
-				devn
-			}
-			{
-				Lookup 1 3 -1 roll map_index
-				sep
-			}ifelse
-			end
-		}{
-			Lookup MappedCSA/DeviceCMYK eq{4}{1}ifelse 3 -1 roll
-			map_index
-			MappedCSA/DeviceCMYK eq{setcmykcolor}{setgray}ifelse
-		}ifelse
-		end
-	}{
-		level3 not AGMCORE_in_rip_sep and/indexed_colorspace_dict AGMCORE_gget/CSDBase known and{
-			/indexed_colorspace_dict AGMCORE_gget/CSDBase get/CSD get_res begin
-			map_indexed_devn
-			devn
-			end
-		}
-		{
-			setcolor
-		}ifelse
-	}ifelse
-}def
-/ignoreimagedata
-{
-	currentoverprint not{
-		gsave
-		dup clonedict begin
-		1 setgray
-		/Decode[0 1]def
-		/DataSourcedef
-		/MultipleDataSources false def
-		/BitsPerComponent 8 def
-		currentdict end
-		systemdict/image gx
-		grestore
-		}if
-	consumeimagedata
-}def
-/add_res
-{
-	dup/CSD eq{
-		pop 
-		//Adobe_AGM_Core begin
-		/AGMCORE_CSD_cache load 3 1 roll put
-		end
-	}{
-		defineresource pop
-	}ifelse
-}def
-/del_res
-{
-	{
-		aload pop exch
-		dup/CSD eq{
-			pop 
-			{//Adobe_AGM_Core/AGMCORE_CSD_cache get exch undef}forall
-		}{
-			exch
-			{1 index undefineresource}forall
-			pop
-		}ifelse
-	}forall
-}def
-/get_res
-{
-	dup/CSD eq{
-		pop
-		dup type dup/nametype eq exch/stringtype eq or{
-			AGMCORE_CSD_cache exch get
-		}if
-	}{
-		findresource
-	}ifelse
-}def
-/get_csa_by_name
-{
-	dup type dup/nametype eq exch/stringtype eq or{
-		/CSA get_res
-	}if
-}def
-/paintproc_buf_init
-{
-	/count get 0 0 put
-}def
-/paintproc_buf_next
-{
-	dup/count get dup 0 get
-	dup 3 1 roll
-	1 add 0 xpt
-	get				
-}def
-/cachepaintproc_compress
-{
-	5 dict begin
-	currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def
-	/ppdict 20 dict def
-	/string_size 16000 def
-	/readbuffer string_size string def
-	currentglobal true setglobal 
-	ppdict 1 array dup 0 1 put/count xpt
-	setglobal
-	/LZWFilter 
-	{
-		exch
-		dup length 0 eq{
-			pop
-		}{
-			ppdict dup length 1 sub 3 -1 roll put
-		}ifelse
-		{string_size}{0}ifelse string
-	}/LZWEncode filter def
-	{		
-		ReadFilter readbuffer readstring
-		exch LZWFilter exch writestring
-		not{exit}if
-	}loop
-	LZWFilter closefile
-	ppdict				
-	end
-}def
-/cachepaintproc
-{
-	2 dict begin
-	currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def
-	/ppdict 20 dict def
-	currentglobal true setglobal 
-	ppdict 1 array dup 0 1 put/count xpt
-	setglobal
-	{
-		ReadFilter 16000 string readstring exch
-		ppdict dup length 1 sub 3 -1 roll put
-		not{exit}if
-	}loop
-	ppdict dup dup length 1 sub()put					
-	end	
-}def
-/make_pattern
-{
-	exch clonedict exch
-	dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform
-	exch 3 index/XStep get 1 index exch 2 copy div cvi mul sub sub
-	exch 3 index/YStep get 1 index exch 2 copy div cvi mul sub sub
-	matrix translate exch matrix concatmatrix
-			 1 index begin
-		BBox 0 get XStep div cvi XStep mul/xshift exch neg def
-		BBox 1 get YStep div cvi YStep mul/yshift exch neg def
-		BBox 0 get xshift add
-		BBox 1 get yshift add
-		BBox 2 get xshift add
-		BBox 3 get yshift add
-		4 array astore
-		/BBox exch def
-		[xshift yshift/translate load null/exec load]dup
-		3/PaintProc load put cvx/PaintProc exch def
-		end
-	gsave 0 setgray
-	makepattern
-	grestore
-}def
-/set_pattern
-{
-	dup/PatternType get 1 eq{
-		dup/PaintType get 1 eq{
-			currentoverprint sop[/DeviceGray]setcolorspace 0 setgray
-		}if
-	}if
-	setpattern
-}def
-/setcolorspace_opt
-{
-	dup currentcolorspace eq{pop}{setcolorspace}ifelse
-}def
-/updatecolorrendering
-{
-	currentcolorrendering/RenderingIntent known{
-		currentcolorrendering/RenderingIntent get
-	}
-	{
-		Intent/AbsoluteColorimetric eq 
-		{
-			/absolute_colorimetric_crd AGMCORE_gget dup null eq
-		}
-		{
-			Intent/RelativeColorimetric eq
-			{
-				/relative_colorimetric_crd AGMCORE_gget dup null eq
-			}
-			{
-				Intent/Saturation eq
-				{
-					/saturation_crd AGMCORE_gget dup null eq
-				}
-				{
-					/perceptual_crd AGMCORE_gget dup null eq
-				}ifelse
-			}ifelse
-		}ifelse
-		{
-			pop null	
-		}
-		{
-			/RenderingIntent known{null}{Intent}ifelse
-		}ifelse
-	}ifelse
-	Intent ne{
-		Intent/ColorRendering{findresource}stopped
-		{
-			pop pop systemdict/findcolorrendering known
-			{
- 				Intent findcolorrendering
- 				{
- 					/ColorRendering findresource true exch
- 				}
- 				{
- 					/ColorRendering findresource
-					product(Xerox Phaser 5400)ne
-					exch
- 				}ifelse
-				dup Intent/AbsoluteColorimetric eq 
-				{
-					/absolute_colorimetric_crd exch AGMCORE_gput
-				}
-				{
-					Intent/RelativeColorimetric eq
-					{
-						/relative_colorimetric_crd exch AGMCORE_gput
-					}
-					{
-						Intent/Saturation eq
-						{
-							/saturation_crd exch AGMCORE_gput
-						}
-						{
-							Intent/Perceptual eq
-							{
-								/perceptual_crd exch AGMCORE_gput
-							}
-							{
-								pop
-							}ifelse
-						}ifelse
-					}ifelse
-				}ifelse
-				1 index{exch}{pop}ifelse
-			}
-			{false}ifelse
-		}
-		{true}ifelse
-		{
-			dup begin
-			currentdict/TransformPQR known{
-				currentdict/TransformPQR get aload pop
-				3{{}eq 3 1 roll}repeat or or
-			}
-			{true}ifelse
-			currentdict/MatrixPQR known{
-				currentdict/MatrixPQR get aload pop
-				1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll
-				0.0 eq 9 1 roll 1.0 eq 9 1 roll 0.0 eq 9 1 roll
-				0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq
-				and and and and and and and and
-			}
-			{true}ifelse
-			end
-			or
-			{
-				clonedict begin
-				/TransformPQR[
-					{4 -1 roll 3 get dup 3 1 roll sub 5 -1 roll 3 get 3 -1 roll sub div
-					3 -1 roll 3 get 3 -1 roll 3 get dup 4 1 roll sub mul add}bind
-					{4 -1 roll 4 get dup 3 1 roll sub 5 -1 roll 4 get 3 -1 roll sub div
-					3 -1 roll 4 get 3 -1 roll 4 get dup 4 1 roll sub mul add}bind
-					{4 -1 roll 5 get dup 3 1 roll sub 5 -1 roll 5 get 3 -1 roll sub div
-					3 -1 roll 5 get 3 -1 roll 5 get dup 4 1 roll sub mul add}bind
-				]def
-				/MatrixPQR[0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296]def
-				/RangePQR[-0.3227950745 2.3229645538 -1.5003771057 3.5003465881 -0.1369979095 2.136967392]def
-				currentdict end
-			}if
-			setcolorrendering_opt
-		}if		
-	}if
-}def
-/set_crd
-{
-	AGMCORE_host_sep not level2 and{
-		currentdict/ColorRendering known{
-			ColorRendering/ColorRendering{findresource}stopped not{setcolorrendering_opt}if
-		}{
-			currentdict/Intent known{
-				updatecolorrendering
-			}if
-		}ifelse
-		currentcolorspace dup type/arraytype eq
-			{0 get}if
-		/DeviceRGB eq
-			{
-			currentdict/UCR known
-				{/UCR}{/AGMCORE_currentucr}ifelse
-			load setundercolorremoval
-			currentdict/BG known 
-				{/BG}{/AGMCORE_currentbg}ifelse
-			load setblackgeneration
-			}if
-	}if
-}def
-/set_ucrbg
-{
-	dup null eq{pop/AGMCORE_currentbg load}{/Procedure get_res}ifelse setblackgeneration
-	dup null eq{pop/AGMCORE_currentucr load}{/Procedure get_res}ifelse setundercolorremoval
-}def
-/setcolorrendering_opt
-{
-	dup currentcolorrendering eq{
-		pop
-	}{
-		product(HP Color LaserJet 2605)anchorsearch{
-			pop pop pop
-		}{
-			pop
-			clonedict
-			begin
-				/Intent Intent def
-				currentdict
-			end
-			setcolorrendering
-		}ifelse
-	}ifelse
-}def
-/cpaint_gcomp
-{
-	convert_to_process//Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf
-	//Adobe_AGM_Core/AGMCORE_ConvertToProcess get not
-	{
-		(%end_cpaint_gcomp)flushinput
-	}if
-}def
-/cpaint_gsep
-{
-	//Adobe_AGM_Core/AGMCORE_ConvertToProcess get
-	{	
-		(%end_cpaint_gsep)flushinput
-	}if
-}def
-/cpaint_gend
-{np}def
-/T1_path
-{
-	currentfile token pop currentfile token pop mo
-	{
-		currentfile token pop dup type/stringtype eq
-			{pop exit}if 
-		0 exch rlineto 
-		currentfile token pop dup type/stringtype eq
-			{pop exit}if 
-		0 rlineto
-	}loop
-}def
-/T1_gsave
-	level3
-	{/clipsave}
-	{/gsave}ifelse
-	load def
-/T1_grestore
-	level3
-	{/cliprestore}
-	{/grestore}ifelse 
-	load def
-/set_spot_alias_ary
-{
-	dup inherit_aliases
-	//Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf
-}def
-/set_spot_normalization_ary
-{
-	dup inherit_aliases
-	dup length
-	/AGMCORE_SpotAliasAry where{pop AGMCORE_SpotAliasAry length add}if
-	array
-	//Adobe_AGM_Core/AGMCORE_SpotAliasAry2 xddf
-	/AGMCORE_SpotAliasAry where{
-		pop
-		AGMCORE_SpotAliasAry2 0 AGMCORE_SpotAliasAry putinterval
-		AGMCORE_SpotAliasAry length
-	}{0}ifelse
-	AGMCORE_SpotAliasAry2 3 1 roll exch putinterval
-	true set_spot_alias
-}def
-/inherit_aliases
-{
-	{dup/Name get map_alias{/CSD put}{pop}ifelse}forall
-}def
-/set_spot_alias
-{
-	/AGMCORE_SpotAliasAry2 where{
-		/AGMCORE_current_spot_alias 3 -1 roll put
-	}{
-		pop
-	}ifelse
-}def
-/current_spot_alias
-{
-	/AGMCORE_SpotAliasAry2 where{
-		/AGMCORE_current_spot_alias get
-	}{
-		false
-	}ifelse
-}def
-/map_alias
-{
-	/AGMCORE_SpotAliasAry2 where{
-		begin
-			/AGMCORE_name xdf
-			false	
-			AGMCORE_SpotAliasAry2{
-				dup/Name get AGMCORE_name eq{
-					/CSD get/CSD get_res
-					exch pop true
-					exit
-				}{
-					pop
-				}ifelse
-			}forall
-		end
-	}{
-		pop false
-	}ifelse
-}bdf
-/spot_alias
-{
-	true set_spot_alias
-	/AGMCORE_&setcustomcolor AGMCORE_key_known not{
-		//Adobe_AGM_Core/AGMCORE_&setcustomcolor/setcustomcolor load put
-	}if
-	/customcolor_tint 1 AGMCORE_gput
-	//Adobe_AGM_Core begin
-	/setcustomcolor
-	{
-		//Adobe_AGM_Core begin
-		dup/customcolor_tint exch AGMCORE_gput
-		1 index aload pop pop 1 eq exch 1 eq and exch 1 eq and exch 1 eq and not
-		current_spot_alias and{1 index 4 get map_alias}{false}ifelse
-		{
-			false set_spot_alias
-			/sep_colorspace_dict AGMCORE_gget null ne
-			3 1 roll 2 index{
-				exch pop/sep_tint AGMCORE_gget exch
-			}if
-			mark 3 1 roll
-			setsepcolorspace
-			counttomark 0 ne{
-				setsepcolor
-			}if
-			pop
-			not{/sep_tint 1.0 AGMCORE_gput}if
-			pop
-			true set_spot_alias
-		}{
-			AGMCORE_&setcustomcolor
-		}ifelse
-		end
-	}bdf
-	end
-}def
-/begin_feature
-{
-	Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put
-	count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put
-	{Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if
-}def
-/end_feature
-{
-	2 dict begin
-	/spd/setpagedevice load def
-	/setpagedevice{get_gstate spd set_gstate}def
-	stopped{$error/newerror false put}if
-	end
-	count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse
-	countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse
-	{Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if
-}def
-/set_negative
-{
-	//Adobe_AGM_Core begin
-	/AGMCORE_inverting exch def
-	level2{
-		currentpagedevice/NegativePrint known AGMCORE_distilling not and{
-			currentpagedevice/NegativePrint get//Adobe_AGM_Core/AGMCORE_inverting get ne{
-				true begin_feature true{
-						<>setpagedevice
-				}end_feature
-			}if
-			/AGMCORE_inverting false def
-		}if
-	}if
-	AGMCORE_inverting{
-		[{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer
- 		AGMCORE_distilling{
- 			erasepage
- 		}{
- 			gsave np clippath 1/setseparationgray where{pop setseparationgray}{setgray}ifelse
- 			/AGMIRS_&fill where{pop AGMIRS_&fill}{fill}ifelse grestore
- 		}ifelse
-	}if
-	end
-}def
-/lw_save_restore_override{
-	/md where{
-		pop
-		md begin
-		initializepage
-		/initializepage{}def
-		/pmSVsetup{}def
-		/endp{}def
-		/pse{}def
-		/psb{}def
-		/orig_showpage where
-			{pop}
-			{/orig_showpage/showpage load def}
-		ifelse
-		/showpage{orig_showpage gR}def
-		end
-	}if
-}def
-/pscript_showpage_override{
-	/NTPSOct95 where
-	{
-		begin
-		showpage
-		save
-		/showpage/restore load def
-		/restore{exch pop}def
-		end
-	}if
-}def
-/driver_media_override
-{
-	/md where{
-		pop
-		md/initializepage known{
-			md/initializepage{}put
-		}if
-		md/rC known{
-			md/rC{4{pop}repeat}put
-		}if
-	}if
-	/mysetup where{
-		/mysetup[1 0 0 1 0 0]put
-	}if
-	Adobe_AGM_Core/AGMCORE_Default_CTM matrix currentmatrix put
-	level2
-		{Adobe_AGM_Core/AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if
-}def
-/capture_mysetup
-{
-	/Pscript_Win_Data where{
-		pop
-		Pscript_Win_Data/mysetup known{
-			Adobe_AGM_Core/save_mysetup Pscript_Win_Data/mysetup get put
-		}if
-	}if
-}def
-/restore_mysetup
-{
-	/Pscript_Win_Data where{
-		pop
-		Pscript_Win_Data/mysetup known{
-			Adobe_AGM_Core/save_mysetup known{
-				Pscript_Win_Data/mysetup Adobe_AGM_Core/save_mysetup get put
-				Adobe_AGM_Core/save_mysetup undef
-			}if
-		}if
-	}if
-}def
-/driver_check_media_override
-{
- 	/PrepsDict where
- 		{pop}
-		{
-		Adobe_AGM_Core/AGMCORE_Default_CTM get matrix currentmatrix ne
-		Adobe_AGM_Core/AGMCORE_Default_PageSize get type/arraytype eq
-			{
-			Adobe_AGM_Core/AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and
-			Adobe_AGM_Core/AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and
-			}if
-			{
-			Adobe_AGM_Core/AGMCORE_Default_CTM get setmatrix
-			}if
-		}ifelse
-}def
-AGMCORE_err_strings begin
-	/AGMCORE_bad_environ(Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. )def
-	/AGMCORE_color_space_onhost_seps(This job contains colors that will not separate with on-host methods. )def
-	/AGMCORE_invalid_color_space(This job contains an invalid color space. )def
-end
-/set_def_ht
-{AGMCORE_def_ht sethalftone}def
-/set_def_flat
-{AGMCORE_Default_flatness setflat}def
-end
-systemdict/setpacking known
-{setpacking}if
-%%EndResource
-%%BeginResource: procset Adobe_CoolType_Core 2.31 0
-%%Copyright: Copyright 1997-2006 Adobe Systems Incorporated. All Rights Reserved.
-%%Version: 2.31 0
-10 dict begin
-/Adobe_CoolType_Passthru currentdict def
-/Adobe_CoolType_Core_Defined userdict/Adobe_CoolType_Core known def
-Adobe_CoolType_Core_Defined
-	{/Adobe_CoolType_Core userdict/Adobe_CoolType_Core get def}
-if
-userdict/Adobe_CoolType_Core 70 dict dup begin put
-/Adobe_CoolType_Version 2.31 def
-/Level2?
-	systemdict/languagelevel known dup
-		{pop systemdict/languagelevel get 2 ge}
-	if def
-Level2? not
-	{
-	/currentglobal false def
-	/setglobal/pop load def
-	/gcheck{pop false}bind def
-	/currentpacking false def
-	/setpacking/pop load def
-	/SharedFontDirectory 0 dict def
-	}
-if
-currentpacking
-true setpacking
-currentglobal false setglobal
-userdict/Adobe_CoolType_Data 2 copy known not
-	{2 copy 10 dict put}
-if
-get
-	 begin
-	/@opStackCountByLevel 32 dict def
-	/@opStackLevel 0 def
-	/@dictStackCountByLevel 32 dict def
-	/@dictStackLevel 0 def
-	 end
-setglobal
-currentglobal true setglobal
-userdict/Adobe_CoolType_GVMFonts known not
-	{userdict/Adobe_CoolType_GVMFonts 10 dict put}
-if
-setglobal
-currentglobal false setglobal
-userdict/Adobe_CoolType_LVMFonts known not
-	{userdict/Adobe_CoolType_LVMFonts 10 dict put}
-if
-setglobal
-/ct_VMDictPut
-	{
-	dup gcheck{Adobe_CoolType_GVMFonts}{Adobe_CoolType_LVMFonts}ifelse
-	3 1 roll put
-	}bind def
-/ct_VMDictUndef
-	{
-	dup Adobe_CoolType_GVMFonts exch known
-		{Adobe_CoolType_GVMFonts exch undef}
-		{
-			dup Adobe_CoolType_LVMFonts exch known
-			{Adobe_CoolType_LVMFonts exch undef}
-			{pop}
-			ifelse
-		}ifelse
-	}bind def
-/ct_str1 1 string def
-/ct_xshow
-{
-	/_ct_na exch def
-	/_ct_i 0 def
-	currentpoint
-	/_ct_y exch def
-	/_ct_x exch def
-	{
-		pop pop
-		ct_str1 exch 0 exch put
-		ct_str1 show
-		{_ct_na _ct_i get}stopped 
-		{pop pop}
-		{
-			_ct_x _ct_y moveto
-			0
-			rmoveto
-		}
-		ifelse
-		/_ct_i _ct_i 1 add def
-		currentpoint
-		/_ct_y exch def
-		/_ct_x exch def
-	}
-	exch
-	@cshow
-}bind def
-/ct_yshow
-{
-	/_ct_na exch def
-	/_ct_i 0 def
-	currentpoint
-	/_ct_y exch def
-	/_ct_x exch def
-	{
-		pop pop
-		ct_str1 exch 0 exch put
-		ct_str1 show
-		{_ct_na _ct_i get}stopped 
-		{pop pop}
-		{
-			_ct_x _ct_y moveto
-			0 exch
-			rmoveto
-		}
-		ifelse
-		/_ct_i _ct_i 1 add def
-		currentpoint
-		/_ct_y exch def
-		/_ct_x exch def
-	}
-	exch
-	@cshow
-}bind def
-/ct_xyshow
-{
-	/_ct_na exch def
-	/_ct_i 0 def
-	currentpoint
-	/_ct_y exch def
-	/_ct_x exch def
-	{
-		pop pop
-		ct_str1 exch 0 exch put
-		ct_str1 show
-		{_ct_na _ct_i get}stopped 
-		{pop pop}
-		{
-			{_ct_na _ct_i 1 add get}stopped 
-			{pop pop pop}
-			{
-				_ct_x _ct_y moveto
-				rmoveto
-			}
-			ifelse
-		}
-		ifelse
-		/_ct_i _ct_i 2 add def
-		currentpoint
-		/_ct_y exch def
-		/_ct_x exch def
-	}
-	exch
-	@cshow
-}bind def
-/xsh{{@xshow}stopped{Adobe_CoolType_Data begin ct_xshow end}if}bind def
-/ysh{{@yshow}stopped{Adobe_CoolType_Data begin ct_yshow end}if}bind def
-/xysh{{@xyshow}stopped{Adobe_CoolType_Data begin ct_xyshow end}if}bind def
-currentglobal true setglobal
-/ct_T3Defs
-{
-/BuildChar
-{
-	1 index/Encoding get exch get
-	1 index/BuildGlyph get exec
-}bind def
-/BuildGlyph
-{
-	exch begin
-	GlyphProcs exch get exec
-	end
-}bind def
-}bind def
-setglobal
-/@_SaveStackLevels
-	{
-	Adobe_CoolType_Data
-		begin
-		/@vmState currentglobal def false setglobal
-		@opStackCountByLevel
-		@opStackLevel
-		2 copy known not
-			{
-			2 copy
-			3 dict dup/args
-			7 index
-			5 add array put
-			put get
-			}
-			{
-			get dup/args get dup length 3 index lt
-				{
-				dup length 5 add array exch
-				1 index exch 0 exch putinterval
-				1 index exch/args exch put
-				}
-				{pop}
-			ifelse
-			}
-		ifelse
-			begin
-			count 1 sub
-			1 index lt
-				{pop count}
-			if
-			dup/argCount exch def
-			dup 0 gt
-				{
-				args exch 0 exch getinterval 
-			astore pop
-				}
-				{pop}
-			ifelse
-			count
-			/restCount exch def
-			end
-		/@opStackLevel @opStackLevel 1 add def
-		countdictstack 1 sub
-		@dictStackCountByLevel exch @dictStackLevel exch put
-		/@dictStackLevel @dictStackLevel 1 add def
-		@vmState setglobal
-		end
-	}bind def
-/@_RestoreStackLevels
-	{
-	Adobe_CoolType_Data
-		begin
-		/@opStackLevel @opStackLevel 1 sub def
-		@opStackCountByLevel @opStackLevel get
-			begin
-			count restCount sub dup 0 gt
-				{{pop}repeat}
-				{pop}
-			ifelse
-			args 0 argCount getinterval{}forall
-			end
-		/@dictStackLevel @dictStackLevel 1 sub def
-		@dictStackCountByLevel @dictStackLevel get
-		end
-	countdictstack exch sub dup 0 gt
-		{{end}repeat}
-		{pop}
-	ifelse
-	}bind def
-/@_PopStackLevels
-	{
-	Adobe_CoolType_Data
-		begin
-		/@opStackLevel @opStackLevel 1 sub def
-		/@dictStackLevel @dictStackLevel 1 sub def
-		end
-	}bind def
-/@Raise
-	{
-	exch cvx exch errordict exch get exec
-	stop
-	}bind def
-/@ReRaise
-	{
-	cvx $error/errorname get errordict exch get exec
-	stop
-	}bind def
-/@Stopped
-	{
-	0 @#Stopped
-	}bind def
-/@#Stopped
-	{
-	@_SaveStackLevels
-	stopped
-		{@_RestoreStackLevels true}
-		{@_PopStackLevels false}
-	ifelse
-	}bind def
-/@Arg
-	{
-	Adobe_CoolType_Data
-		begin
-		@opStackCountByLevel @opStackLevel 1 sub get
-		begin
-		args exch
-		argCount 1 sub exch sub get
-		end
-		end
-	}bind def
-currentglobal true setglobal
-/CTHasResourceForAllBug
-	Level2?
-		{
-		1 dict dup
-				/@shouldNotDisappearDictValue true def
-				Adobe_CoolType_Data exch/@shouldNotDisappearDict exch put
-				begin
-				count @_SaveStackLevels
-					{(*){pop stop}128 string/Category resourceforall}
-				stopped pop
-				@_RestoreStackLevels
-				currentdict Adobe_CoolType_Data/@shouldNotDisappearDict get dup 3 1 roll ne dup 3 1 roll
-					{
-						 /@shouldNotDisappearDictValue known
-								{
-										 {
-												end
-												currentdict 1 index eq
-													{pop exit}
-												if
-										 }
-									 loop
-								}
-						 if
-					}
-					{
-						 pop
-						 end
-					}
-				ifelse
-		}
-		{false}
-	ifelse
-	def
-true setglobal
-/CTHasResourceStatusBug
-	Level2?
-		{
-		mark
-			{/steveamerige/Category resourcestatus}
-		stopped
-			{cleartomark true}
-			{cleartomark currentglobal not}
-		ifelse
-		}
-		{false}
-	ifelse
-	def
-setglobal
-/CTResourceStatus
-		{
-		mark 3 1 roll
-		/Category findresource
-			begin
-			({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec
-				{cleartomark false}
-				{{3 2 roll pop true}{cleartomark false}ifelse}
-			ifelse
-			end
-		}bind def
-/CTWorkAroundBugs
-	{
-	Level2?
-		{
-		/cid_PreLoad/ProcSet resourcestatus
-			{
-			pop pop
-			currentglobal
-			mark
-				{
-				(*)
-					{
-					dup/CMap CTHasResourceStatusBug
-						{CTResourceStatus}
-						{resourcestatus}
-					ifelse
-						{
-						pop dup 0 eq exch 1 eq or
-							{
-							dup/CMap findresource gcheck setglobal
-							/CMap undefineresource
-							}
-							{
-							pop CTHasResourceForAllBug
-								{exit}
-								{stop}
-							ifelse
-							}
-						ifelse
-						}
-						{pop}
-					ifelse
-					}
-				128 string/CMap resourceforall
-				}
-			stopped
-				{cleartomark}
-			stopped pop
-			setglobal
-			}
-		if
-		}
-	if
-	}bind def
-/ds
-	{
-	Adobe_CoolType_Core
-		begin
-		CTWorkAroundBugs
-		/mo/moveto load def
-		/nf/newencodedfont load def
-		/msf{makefont setfont}bind def
-		/uf{dup undefinefont ct_VMDictUndef}bind def
-		/ur/undefineresource load def
-		/chp/charpath load def
-		/awsh/awidthshow load def
-		/wsh/widthshow load def
-		/ash/ashow load def
-		/@xshow/xshow load def
-		/@yshow/yshow load def
-		/@xyshow/xyshow load def
-		/@cshow/cshow load def
-		/sh/show load def
-		/rp/repeat load def
-		/.n/.notdef def
-		end
-		currentglobal false setglobal
-	 userdict/Adobe_CoolType_Data 2 copy known not
-		 {2 copy 10 dict put}
-		if
-		get
-		begin
-		/AddWidths? false def
-		/CC 0 def
-		/charcode 2 string def
-		/@opStackCountByLevel 32 dict def
-		/@opStackLevel 0 def
-		/@dictStackCountByLevel 32 dict def
-		/@dictStackLevel 0 def
-		/InVMFontsByCMap 10 dict def
-		/InVMDeepCopiedFonts 10 dict def
-		end
-		setglobal
-	}bind def
-/dt
-	{
-	currentdict Adobe_CoolType_Core eq
-		{end}
-	if
-	}bind def
-/ps
-	{
-	Adobe_CoolType_Core begin
-	Adobe_CoolType_GVMFonts begin
-	Adobe_CoolType_LVMFonts begin
-	SharedFontDirectory begin
-	}bind def
-/pt
-	{
-	end
-	end
-	end
-	end
-	}bind def
-/unload
-	{
-	systemdict/languagelevel known
-		{
-		systemdict/languagelevel get 2 ge
-			{
-			userdict/Adobe_CoolType_Core 2 copy known
-				{undef}
-				{pop pop}
-			ifelse
-			}
-		if
-		}
-	if
-	}bind def
-/ndf
-	{
-	1 index where
-		{pop pop pop}
-		{dup xcheck{bind}if def}
-	ifelse
-	}def
-/findfont systemdict
-	begin
-	userdict
-		begin
-		/globaldict where{/globaldict get begin}if
-			dup where pop exch get
-		/globaldict where{pop end}if
-		end
-	end
-Adobe_CoolType_Core_Defined
-	{/systemfindfont exch def}
-	{
-	/findfont 1 index def
-	/systemfindfont exch def
-	}
-ifelse
-/undefinefont
-	{pop}ndf
-/copyfont
-	{
-	currentglobal 3 1 roll
-	1 index gcheck setglobal
-	dup null eq{0}{dup length}ifelse
-	2 index length add 1 add dict
-		begin
-		exch
-			{
-			1 index/FID eq
-				{pop pop}
-				{def}
-			ifelse
-			}
-		forall
-		dup null eq
-			{pop}
-			{{def}forall}
-		ifelse
-		currentdict
-		end
-	exch setglobal
-	}bind def
-/copyarray
-	{
-	currentglobal exch
-	dup gcheck setglobal
-	dup length array copy
-	exch setglobal
-	}bind def
-/newencodedfont
-	{
-	currentglobal
-		{
-		SharedFontDirectory 3 index known
-			{SharedFontDirectory 3 index get/FontReferenced known}
-			{false}
-		ifelse
-		}
-		{
-		FontDirectory 3 index known
-			{FontDirectory 3 index get/FontReferenced known}
-			{
-			SharedFontDirectory 3 index known
-				{SharedFontDirectory 3 index get/FontReferenced known}
-				{false}
-			ifelse
-			}
-		ifelse
-		}
-	ifelse
-	dup
-		{
-		3 index findfont/FontReferenced get
-		2 index dup type/nametype eq
-			{findfont}
-		if ne
-			{pop false}
-		if
-		}
-	if
-	dup
-		{
-		1 index dup type/nametype eq
-			{findfont}
-		 if
-		dup/CharStrings known
-			{
-			/CharStrings get length
-			4 index findfont/CharStrings get length
-			ne
-				{
-				pop false
-				}
-			if 
-			}
-			{pop}
-			ifelse
-		}
-	if
-		{
-		pop
-		1 index findfont
-		/Encoding get exch
-		0 1 255
-			{2 copy get 3 index 3 1 roll put}
-		for
-		pop pop pop
-		}
-		{
-		currentglobal
-	 4 1 roll
-		dup type/nametype eq
-		 {findfont}
-	 if
-	 dup gcheck setglobal
-		dup dup maxlength 2 add dict
-			begin
-			exch
-				{
-				1 index/FID ne
-				2 index/Encoding ne and
-					{def}
-					{pop pop}
-				ifelse
-				}
-			forall
-			/FontReferenced exch def
-			/Encoding exch dup length array copy def
-			/FontName 1 index dup type/stringtype eq{cvn}if def dup
-			currentdict
-			end
-		definefont ct_VMDictPut
-		setglobal
-		}
-	ifelse
-	}bind def
-/SetSubstituteStrategy
-	{
-	$SubstituteFont
-		begin
-		dup type/dicttype ne
-			{0 dict}
-		if
-		currentdict/$Strategies known
-			{
-			exch $Strategies exch 
-			2 copy known
-				{
-				get
-				2 copy maxlength exch maxlength add dict
-					begin
-					{def}forall
-					{def}forall
-					currentdict
-					dup/$Init known
-						{dup/$Init get exec}
-					if
-					end
-				/$Strategy exch def
-				}
-				{pop pop pop}
-			ifelse
-			}
-			{pop pop}
-		ifelse
-		end
-	}bind def
-/scff
-	{
-	$SubstituteFont
-		begin
-		dup type/stringtype eq
-			{dup length exch}
-			{null}
-		ifelse
-		/$sname exch def
-		/$slen exch def
-		/$inVMIndex
-			$sname null eq
-				{
-				1 index $str cvs
-				dup length $slen sub $slen getinterval cvn
-				}
-				{$sname}
-			ifelse def
-		end
-		{findfont}
-	@Stopped
-		{
-		dup length 8 add string exch
-		1 index 0(BadFont:)putinterval
-		1 index exch 8 exch dup length string cvs putinterval cvn
-			{findfont}
-		@Stopped
-			{pop/Courier findfont}
-		if
-		}
-	if
-	$SubstituteFont
-		begin
-		/$sname null def
-		/$slen 0 def
-		/$inVMIndex null def
-		end
-	}bind def
-/isWidthsOnlyFont
-	{
-	dup/WidthsOnly known
-		{pop pop true}
-		{
-		dup/FDepVector known
-			{/FDepVector get{isWidthsOnlyFont dup{exit}if}forall}
-			{
-			dup/FDArray known
-				{/FDArray get{isWidthsOnlyFont dup{exit}if}forall}
-				{pop}
-			ifelse
-			}
-		ifelse
-		}
-	ifelse
-	}bind def
-/ct_StyleDicts 4 dict dup begin
-		 /Adobe-Japan1 4 dict dup begin
-					 Level2?
-								{
-								/Serif
-								/HeiseiMin-W3-83pv-RKSJ-H/Font resourcestatus
-								{pop pop/HeiseiMin-W3}
-								{
-							/CIDFont/Category resourcestatus
-							{
-								pop pop
-								/HeiseiMin-W3/CIDFont resourcestatus
-								{pop pop/HeiseiMin-W3}
-								{/Ryumin-Light}
-								ifelse
-							}
-							{/Ryumin-Light}
-							ifelse
-								}
-								ifelse
-								def
-								/SansSerif
-								/HeiseiKakuGo-W5-83pv-RKSJ-H/Font resourcestatus
-								{pop pop/HeiseiKakuGo-W5}
-								{
-							/CIDFont/Category resourcestatus
-							{
-								pop pop
-								/HeiseiKakuGo-W5/CIDFont resourcestatus
-								{pop pop/HeiseiKakuGo-W5}
-								{/GothicBBB-Medium}
-								ifelse
-							}
-							{/GothicBBB-Medium}
-							ifelse
-								}
-								ifelse
-								def
-								/HeiseiMaruGo-W4-83pv-RKSJ-H/Font resourcestatus
-								{pop pop/HeiseiMaruGo-W4}
-								{
-							/CIDFont/Category resourcestatus
-							{
-								pop pop
-								/HeiseiMaruGo-W4/CIDFont resourcestatus
-								{pop pop/HeiseiMaruGo-W4}
-								{
-									/Jun101-Light-RKSJ-H/Font resourcestatus
-									{pop pop/Jun101-Light}
-									{SansSerif}
-									ifelse
-								}
-								ifelse
-							}
-							{
-								/Jun101-Light-RKSJ-H/Font resourcestatus
-								{pop pop/Jun101-Light}
-								{SansSerif}
-								ifelse
-							}
-							ifelse
-								}
-								ifelse
-								/RoundSansSerif exch def
-								/Default Serif def
-								}
-								{
-								/Serif/Ryumin-Light def
-								/SansSerif/GothicBBB-Medium def
-								{
-								(fonts/Jun101-Light-83pv-RKSJ-H)status
-								}stopped
-								{pop}{
-										 {pop pop pop pop/Jun101-Light}
-										 {SansSerif}
-										 ifelse
-										 /RoundSansSerif exch def
-								}ifelse
-								/Default Serif def
-								}
-					 ifelse
-		 end
-		 def
-		 /Adobe-Korea1 4 dict dup begin
-					/Serif/HYSMyeongJo-Medium def
-					/SansSerif/HYGoThic-Medium def
-					/RoundSansSerif SansSerif def
-					/Default Serif def
-		 end
-		 def
-		 /Adobe-GB1 4 dict dup begin
-					/Serif/STSong-Light def
-					/SansSerif/STHeiti-Regular def
-					/RoundSansSerif SansSerif def
-					/Default Serif def
-		 end
-		 def
-		 /Adobe-CNS1 4 dict dup begin
-					/Serif/MKai-Medium def
-					/SansSerif/MHei-Medium def
-					/RoundSansSerif SansSerif def
-					/Default Serif def
-		 end
-		 def
-end
-def
-Level2?{currentglobal true setglobal}if
-/ct_BoldRomanWidthProc 
-	{
-	stringwidth 1 index 0 ne{exch .03 add exch}if setcharwidth
-	0 0
-	}bind def
-/ct_Type0WidthProc 
-	{
-	 dup stringwidth 0 0 moveto 
-	 2 index true charpath pathbbox
-	 0 -1 
-	 7 index 2 div .88 
-	 setcachedevice2
-	 pop
-	0 0
-	}bind def
-/ct_Type0WMode1WidthProc 
-	{
-	 dup stringwidth 
-	 pop 2 div neg -0.88
-	2 copy
-	moveto 
-	0 -1
-	 5 -1 roll true charpath pathbbox
-	 setcachedevice
-	}bind def
-/cHexEncoding
-[/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12
-/c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25
-/c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38
-/c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B
-/c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E
-/c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71
-/c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84
-/c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97
-/c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA
-/cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD
-/cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0
-/cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3
-/cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6
-/cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def
-/ct_BoldBaseFont 
-	 11 dict begin
-		/FontType 3 def
-		/FontMatrix[1 0 0 1 0 0]def
-		/FontBBox[0 0 1 1]def
-		/Encoding cHexEncoding def 
-		/_setwidthProc/ct_BoldRomanWidthProc load def
-		/_bcstr1 1 string def
-		/BuildChar
-		{
-			exch begin
-				_basefont setfont
-				_bcstr1 dup 0 4 -1 roll put
-				dup 
-				_setwidthProc
-				3 copy 
-				moveto				
-				show
-				_basefonto setfont
-				moveto
-				show
-			end
-		}bind def
-		 currentdict
-	 end 
-def
-systemdict/composefont known
-{
-/ct_DefineIdentity-H
-{
-	/Identity-H/CMap resourcestatus
-	{
-		pop pop
-	}
-	{
-		/CIDInit/ProcSet findresource begin
-		 12 dict begin
-		 begincmap
-		 /CIDSystemInfo 3 dict dup begin
-			 /Registry(Adobe)def
-			 /Ordering(Identity)def
-			 /Supplement 0 def
-		 end def
-		 /CMapName/Identity-H def
-		 /CMapVersion 1.000 def
-		 /CMapType 1 def
-		 1 begincodespacerange
-		 <0000>
-		 endcodespacerange
-		 1 begincidrange
-		 <0000>0
-		 endcidrange
-		 endcmap
-		 CMapName currentdict/CMap defineresource pop
-		 end
-		 end
-	 }
-	 ifelse
-}
-def
-/ct_BoldBaseCIDFont 
-	 11 dict begin
-		/CIDFontType 1 def
-		/CIDFontName/ct_BoldBaseCIDFont def
-		/FontMatrix[1 0 0 1 0 0]def
-		/FontBBox[0 0 1 1]def
-		/_setwidthProc/ct_Type0WidthProc load def
-		/_bcstr2 2 string def
-		/BuildGlyph
-		{
-			exch begin		 
-				_basefont setfont
-				_bcstr2 1 2 index 256 mod put
-				_bcstr2 0 3 -1 roll 256 idiv put
-				_bcstr2 dup _setwidthProc		 
-				3 copy 
-				moveto
-				show
-				_basefonto setfont
-				moveto
-				show
-			end
-		}bind def
-		 currentdict
-	 end 
-def
-}if
-Level2?{setglobal}if
-/ct_CopyFont{
-	{
-		1 index/FID ne 2 index/UniqueID ne and
-		{def}{pop pop}ifelse
-	}forall
-}bind def
-/ct_Type0CopyFont 
-{
-	exch
-	dup length dict
-	begin
-	ct_CopyFont
-	[
-	exch
-	FDepVector 
-	{
-		 dup/FontType get 0 eq
-		{	
-		1 index ct_Type0CopyFont 
-		/_ctType0 exch definefont
-		}
-		{
-		/_ctBaseFont exch
-		2 index exec
-		}
-		 ifelse 
-		 exch
-	}
-	forall 
-	pop
-	]				
-	/FDepVector exch def
-	currentdict
-	end
-}bind def
-/ct_MakeBoldFont
-{
-	 dup/ct_SyntheticBold known
-	{
-		dup length 3 add dict begin 
-		ct_CopyFont 
-		/ct_StrokeWidth .03 0 FontMatrix idtransform pop def 
-		/ct_SyntheticBold true def
-		currentdict 
-		end 
-		definefont
-	}
-	{
-		dup dup length 3 add dict
-		begin
-			ct_CopyFont
-			/PaintType 2 def
-			/StrokeWidth .03 0 FontMatrix idtransform pop def
-			/dummybold currentdict
-		end
-		definefont
-		dup/FontType get dup 9 ge exch 11 le and 
-		{
-			ct_BoldBaseCIDFont
-			dup length 3 add dict copy begin
-			dup/CIDSystemInfo get/CIDSystemInfo exch def
-			ct_DefineIdentity-H
-			/_Type0Identity/Identity-H 3 -1 roll[exch]composefont
-			/_basefont exch def
-			/_Type0Identity/Identity-H 3 -1 roll[exch]composefont
-			/_basefonto exch def
-			currentdict
-			end
-			/CIDFont defineresource
-		}
-		{
-			ct_BoldBaseFont
-			dup length 3 add dict copy begin
-			/_basefont exch def
-			/_basefonto exch def
-			currentdict
-			end
-			definefont
-		}
-		ifelse
-	}
-	ifelse
-}bind def
-/ct_MakeBold{
-	1 index 
-	1 index
-	findfont
-	currentglobal 5 1 roll
-	dup gcheck setglobal
-		dup
-		 /FontType get 0 eq
-			{
-				dup/WMode known{dup/WMode get 1 eq}{false}ifelse
-				version length 4 ge
-				and
-					{version 0 4 getinterval cvi 2015 ge}
-					{true}
-				ifelse 
-					{/ct_Type0WidthProc}
-					{/ct_Type0WMode1WidthProc}
-				ifelse
-				ct_BoldBaseFont/_setwidthProc 3 -1 roll load put
-						{ct_MakeBoldFont}ct_Type0CopyFont definefont
-			}
-			{
-				dup/_fauxfont known not 1 index/SubstMaster known not and
-				{
-					 ct_BoldBaseFont/_setwidthProc /ct_BoldRomanWidthProc load put
-					 ct_MakeBoldFont 
-				}
-				{
-				2 index 2 index eq
-					{exch pop	}
-					{
-						dup length dict begin
-						ct_CopyFont
-						currentdict
-						end
-						definefont 
-					}
-				ifelse
-				}
-			ifelse
-			}
-		 ifelse
-		 pop pop pop
-		 setglobal
-}bind def
-/?str1 256 string def
-/?set
-	{
-	$SubstituteFont
-		begin
-		/$substituteFound false def
-		/$fontname 1 index def
-		/$doSmartSub false def
-		end
-	dup
-	 findfont
-	$SubstituteFont
-		begin
-		$substituteFound
-			{false}
-			{
-			dup/FontName known
-				{
-				dup/FontName get $fontname eq
-				1 index/DistillerFauxFont known not and
-				/currentdistillerparams where
-					{pop false 2 index isWidthsOnlyFont not and}
-				if
-				}
-				{false}
-			ifelse
-			}
-		ifelse
-		exch pop
-		/$doSmartSub true def
-		end
-		{
-		5 1 roll pop pop pop pop
-		findfont
-		}
-		{
-		1 index
-		findfont
-		dup/FontType get 3 eq
-		{
-			6 1 roll pop pop pop pop pop false
-		}
-		{pop true}
-		ifelse
-		{
-		$SubstituteFont
-		begin
-		pop pop
-		/$styleArray 1 index def
-		/$regOrdering 2 index def
-		pop pop
-		0 1 $styleArray length 1 sub
-		{
-			$styleArray exch get
-			ct_StyleDicts $regOrdering
-			2 copy known
-			{
-				get
-				exch 2 copy known not
-				{pop/Default}
-				if
-				get
-				dup type/nametype eq
-				{
-				?str1 cvs length dup 1 add exch
-				?str1 exch(-)putinterval
-				exch dup length exch ?str1 exch 3 index exch putinterval
-				add ?str1 exch 0 exch getinterval cvn
-				}
-				{
-				pop pop/Unknown
-				}
-				ifelse
-			}
-			{
-				pop pop pop pop/Unknown
-			}
-			ifelse
-		}
-		for
-		end
-		findfont 
-		}if
-		}
-	ifelse
-	currentglobal false setglobal 3 1 roll
-	null copyfont definefont pop
-	setglobal
-	}bind def
-setpacking
-userdict/$SubstituteFont 25 dict put
-1 dict
-	begin
-	/SubstituteFont
-		dup $error exch 2 copy known
-			{get}
-			{pop pop{pop/Courier}bind}
-		ifelse def
-	/currentdistillerparams where dup
-		{
-		pop pop
-		currentdistillerparams/CannotEmbedFontPolicy 2 copy known
-			{get/Error eq}
-			{pop pop false}
-		ifelse
-		}
-	if not
-		{
-		countdictstack array dictstack 0 get
-			begin
-			userdict
-				begin
-				$SubstituteFont
-					begin
-					/$str 128 string def
-					/$fontpat 128 string def
-					/$slen 0 def
-					/$sname null def
-					/$match false def
-					/$fontname null def
-					/$substituteFound false def
-					/$inVMIndex null def
-					/$doSmartSub true def
-					/$depth 0 def
-					/$fontname null def
-					/$italicangle 26.5 def
-					/$dstack null def
-					/$Strategies 10 dict dup
-						begin
-						/$Type3Underprint
-							{
-							currentglobal exch false setglobal
-							11 dict
-								begin
-								/UseFont exch
-									$WMode 0 ne
-										{
-										dup length dict copy
-										dup/WMode $WMode put
-										/UseFont exch definefont
-										}
-									if def
-								/FontName $fontname dup type/stringtype eq{cvn}if def
-								/FontType 3 def
-								/FontMatrix[.001 0 0 .001 0 0]def
-								/Encoding 256 array dup 0 1 255{/.notdef put dup}for pop def
-								/FontBBox[0 0 0 0]def
-								/CCInfo 7 dict dup
-									begin
-									/cc null def
-									/x 0 def
-									/y 0 def
-									end def
-								/BuildChar
-									{
-									exch
-										begin
-										CCInfo
-											begin
-											1 string dup 0 3 index put exch pop
-											/cc exch def
-											UseFont 1000 scalefont setfont
-											cc stringwidth/y exch def/x exch def
-											x y setcharwidth
-											$SubstituteFont/$Strategy get/$Underprint get exec
-											0 0 moveto cc show
-											x y moveto
-											end
-										end
-									}bind def
-								currentdict
-								end
-							exch setglobal
-							}bind def
-						/$GetaTint
-							2 dict dup
-								begin
-								/$BuildFont
-									{
-									dup/WMode known
-										{dup/WMode get}
-										{0}
-									ifelse
-									/$WMode exch def
-									$fontname exch
-									dup/FontName known
-										{
-										dup/FontName get
-										dup type/stringtype eq{cvn}if
-										}
-										{/unnamedfont}
-									ifelse
-									exch
-									Adobe_CoolType_Data/InVMDeepCopiedFonts get
-									1 index/FontName get known
-										{
-										pop
-										Adobe_CoolType_Data/InVMDeepCopiedFonts get
-										1 index get
-										null copyfont
-										}
-										{$deepcopyfont}
-									ifelse
-									exch 1 index exch/FontBasedOn exch put
-									dup/FontName $fontname dup type/stringtype eq{cvn}if put
-									definefont
-									Adobe_CoolType_Data/InVMDeepCopiedFonts get
-										begin
-										dup/FontBasedOn get 1 index def
-										end
-									}bind def
-								/$Underprint
-									{
-									gsave
-									x abs y abs gt
-										{/y 1000 def}
-										{/x -1000 def 500 120 translate}
-									ifelse
-									Level2?
-										{
-										[/Separation(All)/DeviceCMYK{0 0 0 1 pop}]
-										setcolorspace
-										}
-										{0 setgray}
-									ifelse
-									10 setlinewidth
-									x .8 mul
-									[7 3]
-										{
-										y mul 8 div 120 sub x 10 div exch moveto
-										0 y 4 div neg rlineto
-										dup 0 rlineto
-										0 y 4 div rlineto
-										closepath
-										gsave
-										Level2?
-											{.2 setcolor}
-											{.8 setgray}
-										ifelse
-										fill grestore
-										stroke
-										}
-									forall
-									pop
-									grestore
-									}bind def
-								end def
-						/$Oblique
-							1 dict dup
-								begin
-								/$BuildFont
-									{
-									currentglobal exch dup gcheck setglobal
-									null copyfont
-										begin
-										/FontBasedOn
-										currentdict/FontName known
-											{
-											FontName
-											dup type/stringtype eq{cvn}if
-											}
-											{/unnamedfont}
-										ifelse
-										def
-										/FontName $fontname dup type/stringtype eq{cvn}if def
-										/currentdistillerparams where
-											{pop}
-											{
-											/FontInfo currentdict/FontInfo known
-												{FontInfo null copyfont}
-												{2 dict}
-											ifelse
-											dup
-												begin
-												/ItalicAngle $italicangle def
-												/FontMatrix FontMatrix
-												[1 0 ItalicAngle dup sin exch cos div 1 0 0]
-												matrix concatmatrix readonly
-												end
-											4 2 roll def
-											def
-											}
-										ifelse
-										FontName currentdict
-										end
-									definefont
-									exch setglobal
-									}bind def
-								end def
-						/$None
-							1 dict dup
-								begin
-								/$BuildFont{}bind def
-								end def
-						end def
-					/$Oblique SetSubstituteStrategy
-					/$findfontByEnum
-						{
-						dup type/stringtype eq{cvn}if
-						dup/$fontname exch def
-						$sname null eq
-							{$str cvs dup length $slen sub $slen getinterval}
-							{pop $sname}
-						ifelse
-						$fontpat dup 0(fonts/*)putinterval exch 7 exch putinterval
-						/$match false def
-						$SubstituteFont/$dstack countdictstack array dictstack put
-						mark
-							{
-							$fontpat 0 $slen 7 add getinterval
-								{/$match exch def exit}
-							$str filenameforall
-							}
-						stopped
-							{
-							cleardictstack
-							currentdict
-							true
-							$SubstituteFont/$dstack get
-								{
-								exch
-									{
-									1 index eq
-										{pop false}
-										{true}
-									ifelse
-									}
-									{begin false}
-								ifelse
-								}
-							forall
-							pop
-							}
-						if
-						cleartomark
-						/$slen 0 def
-						$match false ne
-							{$match(fonts/)anchorsearch pop pop cvn}
-							{/Courier}
-						ifelse
-						}bind def
-					/$ROS 1 dict dup
-						begin
-						/Adobe 4 dict dup
-							begin
-							/Japan1 [/Ryumin-Light/HeiseiMin-W3
-										 /GothicBBB-Medium/HeiseiKakuGo-W5
-										 /HeiseiMaruGo-W4/Jun101-Light]def
-							/Korea1 [/HYSMyeongJo-Medium/HYGoThic-Medium]def
-							/GB1	 [/STSong-Light/STHeiti-Regular]def
-							/CNS1	[/MKai-Medium/MHei-Medium]def
-							end def
-						end def
-					/$cmapname null def
-					/$deepcopyfont
-						{
-						dup/FontType get 0 eq
-							{
-							1 dict dup/FontName/copied put copyfont
-								begin
-								/FDepVector FDepVector copyarray
-								0 1 2 index length 1 sub
-									{
-									2 copy get $deepcopyfont
-									dup/FontName/copied put
-									/copied exch definefont
-									3 copy put pop pop
-									}
-								for
-								def
-								currentdict
-								end
-							}
-							{$Strategies/$Type3Underprint get exec}
-						ifelse
-						}bind def
-					/$buildfontname
-						{
-						dup/CIDFont findresource/CIDSystemInfo get
-							begin
-							Registry length Ordering length Supplement 8 string cvs
-							3 copy length 2 add add add string
-							dup 5 1 roll dup 0 Registry putinterval
-							dup 4 index(-)putinterval
-							dup 4 index 1 add Ordering putinterval
-							4 2 roll add 1 add 2 copy(-)putinterval
-							end
-						1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch
-						anchorsearch
-							{pop pop 3 2 roll putinterval cvn/$cmapname exch def}
-							{pop pop pop pop pop}
-						ifelse
-						length
-						$str 1 index(-)putinterval 1 add
-						$str 1 index $cmapname $fontpat cvs putinterval
-						$cmapname length add
-						$str exch 0 exch getinterval cvn
-						}bind def
-					/$findfontByROS
-						{
-						/$fontname exch def
-						$ROS Registry 2 copy known
-							{
-							get Ordering 2 copy known
-								{get}
-								{pop pop[]}
-							ifelse
-							}
-							{pop pop[]}
-						ifelse
-						false exch
-							{
-							dup/CIDFont resourcestatus
-								{
-								pop pop
-								save
-								1 index/CIDFont findresource
-								dup/WidthsOnly known
-									{dup/WidthsOnly get}
-									{false}
-								ifelse
-								exch pop
-								exch restore
-									{pop}
-									{exch pop true exit}
-								ifelse
-								}
-								{pop}
-							ifelse
-							}
-						forall
-							{$str cvs $buildfontname}
-							{
-							false(*)
-								{
-								save exch
-								dup/CIDFont findresource
-								dup/WidthsOnly known
-									{dup/WidthsOnly get not}
-									{true}
-								ifelse
-								exch/CIDSystemInfo get
-								dup/Registry get Registry eq
-								exch/Ordering get Ordering eq and and
-									{exch restore exch pop true exit}
-									{pop restore}
-								ifelse
-								}
-							$str/CIDFont resourceforall
-								{$buildfontname}
-								{$fontname $findfontByEnum}
-							ifelse
-							}
-						ifelse
-						}bind def
-					end
-				end
-				currentdict/$error known currentdict/languagelevel known and dup
-					{pop $error/SubstituteFont known}
-				if
-				dup
-					{$error}
-					{Adobe_CoolType_Core}
-				ifelse
-				begin
-					{
-					/SubstituteFont
-					/CMap/Category resourcestatus
-						{
-						pop pop
-						{
-						$SubstituteFont
-							begin
-							/$substituteFound true def
-							dup length $slen gt
-							$sname null ne or
-							$slen 0 gt and
-								{
-								$sname null eq
-									{dup $str cvs dup length $slen sub $slen getinterval cvn}
-									{$sname}
-								ifelse
-								Adobe_CoolType_Data/InVMFontsByCMap get
-								1 index 2 copy known
-									{
-									get
-									false exch
-										{
-										pop
-										currentglobal
-											{
-											GlobalFontDirectory 1 index known
-												{exch pop true exit}
-												{pop}
-											ifelse
-											}
-											{
-											FontDirectory 1 index known
-												{exch pop true exit}
-												{
-												GlobalFontDirectory 1 index known
-													{exch pop true exit}
-													{pop}
-												ifelse
-												}
-											ifelse
-											}
-										ifelse
-										}
-									forall
-									}
-									{pop pop false}
-								ifelse
-									{
-									exch pop exch pop
-									}
-									{
-									dup/CMap resourcestatus
-										{
-										pop pop
-										dup/$cmapname exch def
-										/CMap findresource/CIDSystemInfo get{def}forall
-										$findfontByROS
-										}
-										{
-										128 string cvs
-										dup(-)search
-											{
-											3 1 roll search
-												{
-												3 1 roll pop
-													{dup cvi}
-												stopped
-													{pop pop pop pop pop $findfontByEnum}
-													{
-													4 2 roll pop pop
-													exch length
-													exch
-													2 index length
-													2 index
-													sub
-													exch 1 sub -1 0
-														{
-														$str cvs dup length
-														4 index
-														0
-														4 index
-														4 3 roll add
-														getinterval
-														exch 1 index exch 3 index exch
-														putinterval
-														dup/CMap resourcestatus
-															{
-															pop pop
-															4 1 roll pop pop pop
-															dup/$cmapname exch def
-															/CMap findresource/CIDSystemInfo get{def}forall
-															$findfontByROS
-															true exit
-															}
-															{pop}
-														ifelse
-														}
-													for
-													dup type/booleantype eq
-														{pop}
-														{pop pop pop $findfontByEnum}
-													ifelse
-													}
-												ifelse
-												}
-												{pop pop pop $findfontByEnum}
-											ifelse
-											}
-											{pop pop $findfontByEnum}
-										ifelse
-										}
-									ifelse
-									}
-								ifelse
-								}
-								{//SubstituteFont exec}
-							ifelse
-							/$slen 0 def
-							end
-						}
-						}
-						{
-						{
-						$SubstituteFont
-							begin
-							/$substituteFound true def
-							dup length $slen gt
-							$sname null ne or
-							$slen 0 gt and
-								{$findfontByEnum}
-								{//SubstituteFont exec}
-							ifelse
-							end
-						}
-						}
-					ifelse
-					bind readonly def
-					Adobe_CoolType_Core/scfindfont/systemfindfont load put
-					}
-					{
-					/scfindfont
-						{
-						$SubstituteFont
-							begin
-							dup systemfindfont
-							dup/FontName known
-								{dup/FontName get dup 3 index ne}
-								{/noname true}
-							ifelse
-							dup
-								{
-								/$origfontnamefound 2 index def
-								/$origfontname 4 index def/$substituteFound true def
-								}
-							if
-							exch pop
-								{
-								$slen 0 gt
-								$sname null ne
-								3 index length $slen gt or and
-									{
-									pop dup $findfontByEnum findfont
-									dup maxlength 1 add dict
-										begin
-											{1 index/FID eq{pop pop}{def}ifelse}
-										forall
-										currentdict
-										end
-									definefont
-									dup/FontName known{dup/FontName get}{null}ifelse
-									$origfontnamefound ne
-										{
-										$origfontname $str cvs print
-										( substitution revised, using )print
-										dup/FontName known
-											{dup/FontName get}{(unspecified font)}
-										ifelse
-										$str cvs print(.\n)print
-										}
-									if
-									}
-									{exch pop}
-								ifelse
-								}
-								{exch pop}
-							ifelse
-							end
-						}bind def
-					}
-				ifelse
-				end
-			end
-		Adobe_CoolType_Core_Defined not
-			{
-			Adobe_CoolType_Core/findfont
-				{
-				$SubstituteFont
-					begin
-					$depth 0 eq
-						{
-						/$fontname 1 index dup type/stringtype ne{$str cvs}if def
-						/$substituteFound false def
-						}
-					if
-					/$depth $depth 1 add def
-					end
-				scfindfont
-				$SubstituteFont
-					begin
-					/$depth $depth 1 sub def
-					$substituteFound $depth 0 eq and
-						{
-						$inVMIndex null ne
-							{dup $inVMIndex $AddInVMFont}
-						if
-						$doSmartSub
-							{
-							currentdict/$Strategy known
-								{$Strategy/$BuildFont get exec}
-							if
-							}
-						if
-						}
-					if
-					end
-				}bind put
-			}
-		if
-		}
-	if
-	end
-/$AddInVMFont
-	{
-	exch/FontName 2 copy known
-		{
-		get
-		1 dict dup begin exch 1 index gcheck def end exch
-		Adobe_CoolType_Data/InVMFontsByCMap get exch
-		$DictAdd
-		}
-		{pop pop pop}
-	ifelse
-	}bind def
-/$DictAdd
-	{
-	2 copy known not
-		{2 copy 4 index length dict put}
-	if
-	Level2? not
-		{
-		2 copy get dup maxlength exch length 4 index length add lt
-		2 copy get dup length 4 index length add exch maxlength 1 index lt
-			{
-			2 mul dict
-				begin
-				2 copy get{forall}def
-				2 copy currentdict put
-				end
-			}
-			{pop}
-		ifelse
-		}
-	if
-	get
-		begin
-			{def}
-		forall
-		end
-	}bind def
-end
-end
-%%EndResource
-currentglobal true setglobal
-%%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.23 0
-%%Copyright: Copyright 1987-2006 Adobe Systems Incorporated.
-%%Version: 1.23 0
-systemdict/languagelevel known dup
-	{currentglobal false setglobal}
-	{false}
-ifelse
-exch
-userdict/Adobe_CoolType_Utility 2 copy known
-	{2 copy get dup maxlength 27 add dict copy}
-	{27 dict}
-ifelse put
-Adobe_CoolType_Utility
-	begin
-	/@eexecStartData
-		 def
-	/@recognizeCIDFont null def
-	/ct_Level2? exch def
-	/ct_Clone? 1183615869 internaldict dup
-			/CCRun known not
-			exch/eCCRun known not
-			ct_Level2? and or def
-ct_Level2?
-	{globaldict begin currentglobal true setglobal}
-if
-	/ct_AddStdCIDMap
-		ct_Level2?
-			{{
-				mark
-				Adobe_CoolType_Utility/@recognizeCIDFont currentdict put
-					{
-					((Hex)57 StartData
-					 0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0
-					 7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60
-					 d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8
-					 cc36 74f4 1144 b13b 77)0()/SubFileDecode filter cvx exec
-					}
-				stopped
-					{
-					 cleartomark
-					 Adobe_CoolType_Utility/@recognizeCIDFont get
-					 countdictstack dup array dictstack
-					 exch 1 sub -1 0
-						 {
-						 2 copy get 3 index eq
-								{1 index length exch sub 1 sub{end}repeat exit}
-								{pop}
-						 ifelse
-						 }
-					 for
-					 pop pop
-					 Adobe_CoolType_Utility/@eexecStartData get eexec
-					}
-					{cleartomark}
-				ifelse
-			}}
-			{{
-				Adobe_CoolType_Utility/@eexecStartData get eexec
-			}}
-		ifelse bind def
-userdict/cid_extensions known
-dup{cid_extensions/cid_UpdateDB known and}if
-	{
-	 cid_extensions
-	 begin
-	/cid_GetCIDSystemInfo
-		{
-		 1 index type/stringtype eq
-			{exch cvn exch}
-		 if
-		 cid_extensions
-			 begin
-			 dup load 2 index known
-				{
-				 2 copy
-				 cid_GetStatusInfo
-				 dup null ne
-					{
-					 1 index load
-					 3 index get
-					 dup null eq
-						 {pop pop cid_UpdateDB}
-						 {
-						 exch
-						 1 index/Created get eq
-							 {exch pop exch pop}
-							 {pop cid_UpdateDB}
-						 ifelse
-						 }
-					 ifelse
-					}
-					{pop cid_UpdateDB}
-				 ifelse
-				}
-				{cid_UpdateDB}
-			 ifelse
-			 end
-		}bind def
-	 end
-	}
-if
-ct_Level2?
-	{end setglobal}
-if
-	/ct_UseNativeCapability? systemdict/composefont known def
-	/ct_MakeOCF 35 dict def
-	/ct_Vars 25 dict def
-	/ct_GlyphDirProcs 6 dict def
-	/ct_BuildCharDict 15 dict dup
-		begin
-		/charcode 2 string def
-		/dst_string 1500 string def
-		/nullstring()def
-		/usewidths? true def
-		end def
-	ct_Level2?{setglobal}{pop}ifelse
-	ct_GlyphDirProcs
-		begin
-		/GetGlyphDirectory
-			{
-			systemdict/languagelevel known
-				{pop/CIDFont findresource/GlyphDirectory get}
-				{
-				1 index/CIDFont findresource/GlyphDirectory
-				get dup type/dicttype eq
-					{
-					dup dup maxlength exch length sub 2 index lt
-						{
-						dup length 2 index add dict copy 2 index
-						/CIDFont findresource/GlyphDirectory 2 index put
-						}
-					if
-					}
-				if
-				exch pop exch pop
-				}
-			ifelse
-			+
-			}def
-		/+
-			{
-			systemdict/languagelevel known
-				{
-				currentglobal false setglobal
-				3 dict begin
-					/vm exch def
-				}
-				{1 dict begin}
-			ifelse
-			/$ exch def
-			systemdict/languagelevel known
-				{
-				vm setglobal
-				/gvm currentglobal def
-				$ gcheck setglobal
-				}
-			if
-			?{$ begin}if
-			}def
-		/?{$ type/dicttype eq}def
-		/|{
-			userdict/Adobe_CoolType_Data known
-				{
-			Adobe_CoolType_Data/AddWidths? known
-				{
-				 currentdict Adobe_CoolType_Data
-					begin
-					 begin
-						AddWidths?
-								{
-								Adobe_CoolType_Data/CC 3 index put
-								?{def}{$ 3 1 roll put}ifelse
-								CC charcode exch 1 index 0 2 index 256 idiv put
-								1 index exch 1 exch 256 mod put
-								stringwidth 2 array astore
-								currentfont/Widths get exch CC exch put
-								}
-								{?{def}{$ 3 1 roll put}ifelse}
-							ifelse
-					end
-				end
-				}
-				{?{def}{$ 3 1 roll put}ifelse}	ifelse
-				}
-				{?{def}{$ 3 1 roll put}ifelse}
-			ifelse
-			}def
-		/!
-			{
-			?{end}if
-			systemdict/languagelevel known
-				{gvm setglobal}
-			if
-			end
-			}def
-		/:{string currentfile exch readstring pop}executeonly def
-		end
-	ct_MakeOCF
-		begin
-		/ct_cHexEncoding
-		[/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12
-		/c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25
-		/c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38
-		/c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B
-		/c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E
-		/c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71
-		/c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84
-		/c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97
-		/c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA
-		/cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD
-		/cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0
-		/cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3
-		/cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6
-		/cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def
-		/ct_CID_STR_SIZE 8000 def
-		/ct_mkocfStr100 100 string def
-		/ct_defaultFontMtx[.001 0 0 .001 0 0]def
-		/ct_1000Mtx[1000 0 0 1000 0 0]def
-		/ct_raise{exch cvx exch errordict exch get exec stop}bind def
-		/ct_reraise
-			{cvx $error/errorname get(Error: )print dup(						 )cvs print
-					errordict exch get exec stop
-			}bind def
-		/ct_cvnsi
-			{
-			1 index add 1 sub 1 exch 0 4 1 roll
-				{
-				2 index exch get
-				exch 8 bitshift
-				add
-				}
-			for
-			exch pop
-			}bind def
-		/ct_GetInterval
-			{
-			Adobe_CoolType_Utility/ct_BuildCharDict get
-				begin
-				/dst_index 0 def
-				dup dst_string length gt
-					{dup string/dst_string exch def}
-				if
-				1 index ct_CID_STR_SIZE idiv
-				/arrayIndex exch def
-				2 index arrayIndex get
-				2 index
-				arrayIndex ct_CID_STR_SIZE mul
-				sub
-					{
-					dup 3 index add 2 index length le
-						{
-						2 index getinterval
-						dst_string dst_index 2 index putinterval
-						length dst_index add/dst_index exch def
-						exit
-						}
-						{
-						1 index length 1 index sub
-						dup 4 1 roll
-						getinterval
-						dst_string dst_index 2 index putinterval
-						pop dup dst_index add/dst_index exch def
-						sub
-						/arrayIndex arrayIndex 1 add def
-						2 index dup length arrayIndex gt
-							 {arrayIndex get}
-							 {
-							 pop
-							 exit
-							 }
-						ifelse
-						0
-						}
-					ifelse
-					}
-				loop
-				pop pop pop
-				dst_string 0 dst_index getinterval
-				end
-			}bind def
-		ct_Level2?
-			{
-			/ct_resourcestatus
-			currentglobal mark true setglobal
-				{/unknowninstancename/Category resourcestatus}
-			stopped
-				{cleartomark setglobal true}
-				{cleartomark currentglobal not exch setglobal}
-			ifelse
-				{
-					{
-					mark 3 1 roll/Category findresource
-						begin
-						ct_Vars/vm currentglobal put
-						({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec
-							{cleartomark false}
-							{{3 2 roll pop true}{cleartomark false}ifelse}
-						ifelse
-						ct_Vars/vm get setglobal
-						end
-					}
-				}
-				{{resourcestatus}}
-			ifelse bind def
-			/CIDFont/Category ct_resourcestatus
-				{pop pop}
-				{
-				currentglobal true setglobal
-				/Generic/Category findresource
-				dup length dict copy
-				dup/InstanceType/dicttype put
-				/CIDFont exch/Category defineresource pop
-				setglobal
-				}
-			ifelse
-			ct_UseNativeCapability?
-				{
-				/CIDInit/ProcSet findresource begin
-				12 dict begin
-				begincmap
-				/CIDSystemInfo 3 dict dup begin
-				 /Registry(Adobe)def
-				 /Ordering(Identity)def
-				 /Supplement 0 def
-				end def
-				/CMapName/Identity-H def
-				/CMapVersion 1.000 def
-				/CMapType 1 def
-				1 begincodespacerange
-				<0000>
-				endcodespacerange
-				1 begincidrange
-				<0000>0
-				endcidrange
-				endcmap
-				CMapName currentdict/CMap defineresource pop
-				end
-				end
-				}
-			if
-			}
-			{
-			/ct_Category 2 dict begin
-			/CIDFont 10 dict def
-			/ProcSet	2 dict def
-			currentdict
-			end
-			def
-			/defineresource
-				{
-				ct_Category 1 index 2 copy known
-					{
-					get
-					dup dup maxlength exch length eq
-						{
-						dup length 10 add dict copy
-						ct_Category 2 index 2 index put
-						}
-					if
-					3 index 3 index put
-					pop exch pop
-					}
-					{pop pop/defineresource/undefined ct_raise}
-				ifelse
-				}bind def
-			/findresource
-				{
-				ct_Category 1 index 2 copy known
-					{
-					get
-					2 index 2 copy known
-						{get 3 1 roll pop pop}
-						{pop pop/findresource/undefinedresource ct_raise}
-					ifelse
-					}
-					{pop pop/findresource/undefined ct_raise}
-				ifelse
-				}bind def
-			/resourcestatus
-				{
-				ct_Category 1 index 2 copy known
-					{
-					get
-					2 index known
-					exch pop exch pop
-						{
-						0 -1 true
-						}
-						{
-						false
-						}
-					ifelse
-					}
-					{pop pop/findresource/undefined ct_raise}
-				ifelse
-				}bind def
-			/ct_resourcestatus/resourcestatus load def
-			}
-		ifelse
-		/ct_CIDInit 2 dict
-			begin
-			/ct_cidfont_stream_init
-				{
-					{
-					dup(Binary)eq
-						{
-						pop
-						null
-						currentfile
-						ct_Level2?
-							{
-								{cid_BYTE_COUNT()/SubFileDecode filter}
-							stopped
-								{pop pop pop}
-							if
-							}
-						if
-						/readstring load
-						exit
-						}
-					if
-					dup(Hex)eq
-						{
-						pop
-						currentfile
-						ct_Level2?
-							{
-								{null exch/ASCIIHexDecode filter/readstring}
-							stopped
-								{pop exch pop(>)exch/readhexstring}
-							if
-							}
-							{(>)exch/readhexstring}
-						ifelse
-						load
-						exit
-						}
-					if
-					/StartData/typecheck ct_raise
-					}
-				loop
-				cid_BYTE_COUNT ct_CID_STR_SIZE le
-					{
-					2 copy cid_BYTE_COUNT string exch exec
-					pop
-					1 array dup
-					3 -1 roll
-					0 exch put
-					}
-					{
-					cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi
-					dup array exch 2 sub 0 exch 1 exch
-						{
-						2 copy
-						5 index
-						ct_CID_STR_SIZE
-						string
-						6 index exec
-						pop
-						put
-						pop
-						}
-					for
-					2 index
-					cid_BYTE_COUNT ct_CID_STR_SIZE mod string
-					3 index exec
-					pop
-					1 index exch
-					1 index length 1 sub
-					exch put
-					}
-				ifelse
-				cid_CIDFONT exch/GlyphData exch put
-				2 index null eq
-					{
-					pop pop pop
-					}
-					{
-					pop/readstring load
-					1 string exch
-						{
-						3 copy exec
-						pop
-						dup length 0 eq
-							{
-							pop pop pop pop pop
-							true exit
-							}
-						if
-						4 index
-						eq
-							{
-							pop pop pop pop
-							false exit
-							}
-						if
-						}
-					loop
-					pop
-					}
-				ifelse
-				}bind def
-			/StartData
-				{
-				mark
-					{
-					currentdict
-					dup/FDArray get 0 get/FontMatrix get
-					0 get 0.001 eq
-						{
-						dup/CDevProc known not
-							{
-							/CDevProc 1183615869 internaldict/stdCDevProc 2 copy known
-								{get}
-								{
-								pop pop
-								{pop pop pop pop pop 0 -1000 7 index 2 div 880}
-								}
-							ifelse
-							def
-							}
-						if
-						}
-						{
-						/CDevProc
-							{
-							 pop pop pop pop pop
-							 0
-							 1 cid_temp/cid_CIDFONT get
-							/FDArray get 0 get
-							/FontMatrix get 0 get div
-							 7 index 2 div
-							 1 index 0.88 mul
-							}def
-						}
-					ifelse
-					/cid_temp 15 dict def
-					cid_temp
-						begin
-						/cid_CIDFONT exch def
-						3 copy pop
-						dup/cid_BYTE_COUNT exch def 0 gt
-							{
-							ct_cidfont_stream_init
-							FDArray
-								{
-								/Private get
-								dup/SubrMapOffset known
-									{
-									begin
-									/Subrs SubrCount array def
-									Subrs
-									SubrMapOffset
-									SubrCount
-									SDBytes
-									ct_Level2?
-										{
-										currentdict dup/SubrMapOffset undef
-										dup/SubrCount undef
-										/SDBytes undef
-										}
-									if
-									end
-									/cid_SD_BYTES exch def
-									/cid_SUBR_COUNT exch def
-									/cid_SUBR_MAP_OFFSET exch def
-									/cid_SUBRS exch def
-									cid_SUBR_COUNT 0 gt
-										{
-										GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval
-										0 cid_SD_BYTES ct_cvnsi
-										0 1 cid_SUBR_COUNT 1 sub
-											{
-											exch 1 index
-											1 add
-											cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add
-											GlyphData exch cid_SD_BYTES ct_GetInterval
-											0 cid_SD_BYTES ct_cvnsi
-											cid_SUBRS 4 2 roll
-											GlyphData exch
-											4 index
-											1 index
-											sub
-											ct_GetInterval
-											dup length string copy put
-											}
-										for
-										pop
-										}
-									if
-									}
-									{pop}
-								ifelse
-								}
-							forall
-							}
-						if
-						cleartomark pop pop
-						end
-					CIDFontName currentdict/CIDFont defineresource pop
-					end end
-					}
-				stopped
-					{cleartomark/StartData ct_reraise}
-				if
-				}bind def
-			currentdict
-			end def
-		/ct_saveCIDInit
-			{
-			/CIDInit/ProcSet ct_resourcestatus
-				{true}
-				{/CIDInitC/ProcSet ct_resourcestatus}
-			ifelse
-				{
-				pop pop
-				/CIDInit/ProcSet findresource
-				ct_UseNativeCapability?
-					{pop null}
-					{/CIDInit ct_CIDInit/ProcSet defineresource pop}
-				ifelse
-				}
-				{/CIDInit ct_CIDInit/ProcSet defineresource pop null}
-			ifelse
-			ct_Vars exch/ct_oldCIDInit exch put
-			}bind def
-		/ct_restoreCIDInit
-			{
-			ct_Vars/ct_oldCIDInit get dup null ne
-				{/CIDInit exch/ProcSet defineresource pop}
-				{pop}
-			ifelse
-			}bind def
-		/ct_BuildCharSetUp
-			{
-			1 index
-				begin
-				CIDFont
-					begin
-					Adobe_CoolType_Utility/ct_BuildCharDict get
-						begin
-						/ct_dfCharCode exch def
-						/ct_dfDict exch def
-						CIDFirstByte ct_dfCharCode add
-						dup CIDCount ge
-							{pop 0}
-						if
-						/cid exch def
-							{
-							GlyphDirectory cid 2 copy known
-								{get}
-								{pop pop nullstring}
-							ifelse
-							dup length FDBytes sub 0 gt
-								{
-								dup
-								FDBytes 0 ne
-									{0 FDBytes ct_cvnsi}
-									{pop 0}
-								ifelse
-								/fdIndex exch def
-								dup length FDBytes sub FDBytes exch getinterval
-								/charstring exch def
-								exit
-								}
-								{
-								pop
-								cid 0 eq
-									{/charstring nullstring def exit}
-								if
-								/cid 0 def
-								}
-							ifelse
-							}
-						loop
-			}def
-		/ct_SetCacheDevice
-			{
-			0 0 moveto
-			dup stringwidth
-			3 -1 roll
-			true charpath
-			pathbbox
-			0 -1000
-			7 index 2 div 880
-			setcachedevice2
-			0 0 moveto
-			}def
-		/ct_CloneSetCacheProc
-			{
-			1 eq
-				{
-				stringwidth
-				pop -2 div -880
-				0 -1000 setcharwidth
-				moveto
-				}
-				{
-				usewidths?
-					{
-					currentfont/Widths get cid
-					2 copy known
-						{get exch pop aload pop}
-						{pop pop stringwidth}
-					ifelse
-					}
-					{stringwidth}
-				ifelse
-				setcharwidth
-				0 0 moveto
-				}
-			ifelse
-			}def
-		/ct_Type3ShowCharString
-			{
-			ct_FDDict fdIndex 2 copy known
-				{get}
-				{
-				currentglobal 3 1 roll
-				1 index gcheck setglobal
-				ct_Type1FontTemplate dup maxlength dict copy
-					begin
-					FDArray fdIndex get
-					dup/FontMatrix 2 copy known
-						{get}
-						{pop pop ct_defaultFontMtx}
-					ifelse
-					/FontMatrix exch dup length array copy def
-					/Private get
-					/Private exch def
-					/Widths rootfont/Widths get def
-					/CharStrings 1 dict dup/.notdef
-						dup length string copy put def
-					currentdict
-					end
-				/ct_Type1Font exch definefont
-				dup 5 1 roll put
-				setglobal
-				}
-			ifelse
-			dup/CharStrings get 1 index/Encoding get
-			ct_dfCharCode get charstring put
-			rootfont/WMode 2 copy known
-				{get}
-				{pop pop 0}
-			ifelse
-			exch
-			1000 scalefont setfont
-			ct_str1 0 ct_dfCharCode put
-			ct_str1 exch ct_dfSetCacheProc
-			ct_SyntheticBold
-				{
-				currentpoint
-				ct_str1 show
-				newpath
-				moveto
-				ct_str1 true charpath
-				ct_StrokeWidth setlinewidth
-				stroke
-				}
-				{ct_str1 show}
-			ifelse
-			}def
-		/ct_Type4ShowCharString
-			{
-			ct_dfDict ct_dfCharCode charstring
-			FDArray fdIndex get
-			dup/FontMatrix get dup ct_defaultFontMtx ct_matrixeq not
-				{ct_1000Mtx matrix concatmatrix concat}
-				{pop}
-			ifelse
-			/Private get
-			Adobe_CoolType_Utility/ct_Level2? get not
-				{
-				ct_dfDict/Private
-				3 -1 roll
-					{put}
-				1183615869 internaldict/superexec get exec
-				}
-			if
-			1183615869 internaldict
-			Adobe_CoolType_Utility/ct_Level2? get
-				{1 index}
-				{3 index/Private get mark 6 1 roll}
-			ifelse
-			dup/RunInt known
-				{/RunInt get}
-				{pop/CCRun}
-			ifelse
-			get exec
-			Adobe_CoolType_Utility/ct_Level2? get not
-				{cleartomark}
-			if
-			}bind def
-		/ct_BuildCharIncremental
-			{
-				{
-				Adobe_CoolType_Utility/ct_MakeOCF get begin
-				ct_BuildCharSetUp
-				ct_ShowCharString
-				}
-			stopped
-				{stop}
-			if
-			end
-			end
-			end
-			end
-			}bind def
-		/BaseFontNameStr(BF00)def
-		/ct_Type1FontTemplate 14 dict
-			begin
-			/FontType 1 def
-			/FontMatrix [0.001 0 0 0.001 0 0]def
-			/FontBBox [-250 -250 1250 1250]def
-			/Encoding ct_cHexEncoding def
-			/PaintType 0 def
-			currentdict
-			end def
-		/BaseFontTemplate 11 dict
-			begin
-			/FontMatrix [0.001 0 0 0.001 0 0]def
-			/FontBBox [-250 -250 1250 1250]def
-			/Encoding ct_cHexEncoding def
-			/BuildChar/ct_BuildCharIncremental load def
-			ct_Clone?
-				{
-				/FontType 3 def
-				/ct_ShowCharString/ct_Type3ShowCharString load def
-				/ct_dfSetCacheProc/ct_CloneSetCacheProc load def
-				/ct_SyntheticBold false def
-				/ct_StrokeWidth 1 def
-				}
-				{
-				/FontType 4 def
-				/Private 1 dict dup/lenIV 4 put def
-				/CharStrings 1 dict dup/.notdefput def
-				/PaintType 0 def
-				/ct_ShowCharString/ct_Type4ShowCharString load def
-				}
-			ifelse
-			/ct_str1 1 string def
-			currentdict
-			end def
-		/BaseFontDictSize BaseFontTemplate length 5 add def
-		/ct_matrixeq
-			{
-			true 0 1 5
-				{
-				dup 4 index exch get exch 3 index exch get eq and
-				dup not
-					{exit}
-				if
-				}
-			for
-			exch pop exch pop
-			}bind def
-		/ct_makeocf
-			{
-			15 dict
-				begin
-				exch/WMode exch def
-				exch/FontName exch def
-				/FontType 0 def
-				/FMapType 2 def
-			dup/FontMatrix known
-				{dup/FontMatrix get/FontMatrix exch def}
-				{/FontMatrix matrix def}
-			ifelse
-				/bfCount 1 index/CIDCount get 256 idiv 1 add
-					dup 256 gt{pop 256}if def
-				/Encoding
-					256 array 0 1 bfCount 1 sub{2 copy dup put pop}for
-					bfCount 1 255{2 copy bfCount put pop}for
-					def
-				/FDepVector bfCount dup 256 lt{1 add}if array def
-				BaseFontTemplate BaseFontDictSize dict copy
-					begin
-					/CIDFont exch def
-					CIDFont/FontBBox known
-						{CIDFont/FontBBox get/FontBBox exch def}
-					if
-					CIDFont/CDevProc known
-						{CIDFont/CDevProc get/CDevProc exch def}
-					if
-					currentdict
-					end
-				BaseFontNameStr 3(0)putinterval
-				0 1 bfCount dup 256 eq{1 sub}if
-					{
-					FDepVector exch
-					2 index BaseFontDictSize dict copy
-						begin
-						dup/CIDFirstByte exch 256 mul def
-						FontType 3 eq
-							{/ct_FDDict 2 dict def}
-						if
-						currentdict
-						end
-					1 index 16
-					BaseFontNameStr 2 2 getinterval cvrs pop
-					BaseFontNameStr exch definefont
-					put
-					}
-				for
-				ct_Clone?
-					{/Widths 1 index/CIDFont get/GlyphDirectory get length dict def}
-				if
-				FontName
-				currentdict
-				end
-			definefont
-			ct_Clone?
-				{
-				gsave
-				dup 1000 scalefont setfont
-				ct_BuildCharDict
-					begin
-					/usewidths? false def
-					currentfont/Widths get
-						begin
-						exch/CIDFont get/GlyphDirectory get
-							{
-							pop
-							dup charcode exch 1 index 0 2 index 256 idiv put
-							1 index exch 1 exch 256 mod put
-							stringwidth 2 array astore def
-							}
-						forall
-						end
-					/usewidths? true def
-					end
-				grestore
-				}
-				{exch pop}
-			ifelse
-			}bind def
-		currentglobal true setglobal
-		/ct_ComposeFont
-			{
-			ct_UseNativeCapability?
-				{				
-				2 index/CMap ct_resourcestatus
-					{pop pop exch pop}
-					{
-					/CIDInit/ProcSet findresource
-						begin
-						12 dict
-							begin
-							begincmap
-							/CMapName 3 index def
-							/CMapVersion 1.000 def
-							/CMapType 1 def
-							exch/WMode exch def
-							/CIDSystemInfo 3 dict dup
-								begin
-								/Registry(Adobe)def
-								/Ordering
-								CMapName ct_mkocfStr100 cvs
-								(Adobe-)search
-									{
-									pop pop
-									(-)search
-										{
-										dup length string copy
-										exch pop exch pop
-										}
-										{pop(Identity)}
-									ifelse
-									}
-									{pop (Identity)}
-								ifelse
-								def
-								/Supplement 0 def
-								end def
-							1 begincodespacerange
-							<0000>
-							endcodespacerange
-							1 begincidrange
-							<0000>0
-							endcidrange
-							endcmap
-							CMapName currentdict/CMap defineresource pop
-							end
-						end
-					}
-				ifelse
-				composefont
-				}
-				{
-				3 2 roll pop
-				0 get/CIDFont findresource
-				ct_makeocf
-				}
-			ifelse
-			}bind def
-			setglobal
-		/ct_MakeIdentity
-			{
-			ct_UseNativeCapability?
-				{
-				1 index/CMap ct_resourcestatus
-					{pop pop}
-					{
-					/CIDInit/ProcSet findresource begin
-					12 dict begin
-					begincmap
-					/CMapName 2 index def
-					/CMapVersion 1.000 def
-					/CMapType 1 def
-					/CIDSystemInfo 3 dict dup
-						begin
-						/Registry(Adobe)def
-						/Ordering
-						CMapName ct_mkocfStr100 cvs
-						(Adobe-)search
-							{
-							pop pop
-							(-)search
-								{dup length string copy exch pop exch pop}
-								{pop(Identity)}
-							ifelse
-							}
-							{pop(Identity)}
-						ifelse
-						def
-						/Supplement 0 def
-						end def
-					1 begincodespacerange
-					<0000>
-					endcodespacerange
-					1 begincidrange
-					<0000>0
-					endcidrange
-					endcmap
-					CMapName currentdict/CMap defineresource pop
-					end
-					end
-					}
-				ifelse
-				composefont
-				}
-				{
-				exch pop
-				0 get/CIDFont findresource
-				ct_makeocf
-				}
-			ifelse
-			}bind def
-		currentdict readonly pop
-		end
-	end
-%%EndResource
-setglobal
-%%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0
-%%Copyright: Copyright 1987-2004 Adobe Systems Incorporated.
-%%Version: 1.0 0
-userdict/ct_T42Dict 15 dict put
-ct_T42Dict begin
-/Is2015?
-{
- version
- cvi
- 2015
- ge
-}bind def
-/AllocGlyphStorage
-{
- Is2015?
- {	
-	pop
- }
- {
-	{string}forall
- }ifelse
-}bind def
-/Type42DictBegin
-{
-25 dict begin
- /FontName exch def
- /CharStrings 256 dict 
-begin
-	 /.notdef 0 def
-	 currentdict 
-end def
- /Encoding exch def
- /PaintType 0 def
- /FontType 42 def
- /FontMatrix[1 0 0 1 0 0]def
- 4 array astore cvx/FontBBox exch def
- /sfnts
-}bind def
-/Type42DictEnd 
-{
- currentdict dup/FontName get exch definefont end
-ct_T42Dict exch
-dup/FontName get exch put
-}bind def
-/RD{string currentfile exch readstring pop}executeonly def
-/PrepFor2015
-{
-Is2015?
-{		 
-	/GlyphDirectory 
-	 16
-	 dict def
-	 sfnts 0 get
-	 dup
-	 2 index
-	(glyx)
-	 putinterval
-	 2 index 
-	(locx)
-	 putinterval
-	 pop
-	 pop
-}
-{
-	 pop
-	 pop
-}ifelse			
-}bind def
-/AddT42Char
-{
-Is2015?
-{
-	/GlyphDirectory get 
-	begin
-	def
-	end
-	pop
-	pop
-}
-{
-	/sfnts get
-	4 index
-	get
-	3 index
- 2 index
-	putinterval
-	pop
-	pop
-	pop
-	pop
-}ifelse
-}bind def
-/T0AddT42Mtx2
-{
-/CIDFont findresource/Metrics2 get begin def end
-}bind def
-end
-%%EndResource
-currentglobal true setglobal
-%%BeginFile: MMFauxFont.prc
-%%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. 
-%%All Rights Reserved.
-userdict /ct_EuroDict 10 dict put
-ct_EuroDict begin
-/ct_CopyFont 
-{
-    { 1 index /FID ne {def} {pop pop} ifelse} forall
-} def
-/ct_GetGlyphOutline
-{
-   gsave
-   initmatrix newpath
-   exch findfont dup 
-   length 1 add dict 
-   begin 
-		ct_CopyFont 
-		/Encoding Encoding dup length array copy 
-		dup
-		4 -1 roll
-		0 exch put   
-		def
-		currentdict
-   end
-   /ct_EuroFont exch definefont
-   1000 scalefont setfont
-   0 0 moveto
-   [
-       <00> stringwidth 
-       <00> false charpath
-       pathbbox
-       [
-       {/m cvx} {/l cvx} {/c cvx} {/cp cvx} pathforall
-   grestore
-   counttomark 8 add
-}
-def
-/ct_MakeGlyphProc
-{
-   ] cvx
-   /ct_PSBuildGlyph cvx
-   ] cvx
-} def
-/ct_PSBuildGlyph 
-{ 
- 	gsave 
-	8 -1 roll pop 
-	7 1 roll 
-        6 -2 roll ct_FontMatrix transform 6 2 roll
-        4 -2 roll ct_FontMatrix transform 4 2 roll
-        ct_FontMatrix transform 
-	currentdict /PaintType 2 copy known {get 2 eq}{pop pop false} ifelse  
-	dup  9 1 roll 
-	{  
-		currentdict /StrokeWidth 2 copy known  
-		{   
-			get 2 div   
-			0 ct_FontMatrix dtransform pop
-			5 1 roll  
-			4 -1 roll 4 index sub   
-			4 1 roll   
-			3 -1 roll 4 index sub  
-			3 1 roll   
-			exch 4 index add exch  
-			4 index add  
-			5 -1 roll pop  
-		}  
-		{	 
-			pop pop 
-		}  
-		ifelse  
-	}       
-    if  
-	setcachedevice  
-        ct_FontMatrix concat
-        ct_PSPathOps begin 
-		exec 
-	end 
-	{  
-		currentdict /StrokeWidth 2 copy known  
-			{ get }  
-			{ pop pop 0 }  
-  	    ifelse  
-		setlinewidth stroke  
-	}  
-	{   
-	    fill  
-	}  
-	ifelse  
-    grestore
-} def 
-/ct_PSPathOps 4 dict dup begin 
-	/m {moveto} def 
-	/l {lineto} def 
-	/c {curveto} def 
-	/cp {closepath} def 
-end 
-def 
-/ct_matrix1000 [1000 0 0 1000 0 0] def
-/ct_AddGlyphProc  
-{
-   2 index findfont dup length 4 add dict 
-   begin 
-	ct_CopyFont 
-	/CharStrings CharStrings dup length 1 add dict copy
-      begin
-         3 1 roll def  
-         currentdict 
-      end 
-      def
-      /ct_FontMatrix ct_matrix1000 FontMatrix matrix concatmatrix def
-      /ct_PSBuildGlyph /ct_PSBuildGlyph load def
-      /ct_PSPathOps /ct_PSPathOps load def
-      currentdict
-   end
-   definefont pop
-}
-def
-systemdict /languagelevel known
-{
-	/ct_AddGlyphToPrinterFont {
-		2 copy
-		ct_GetGlyphOutline 3 add -1 roll restore 
-		ct_MakeGlyphProc 
-		ct_AddGlyphProc
-	} def
-}
-{
-	/ct_AddGlyphToPrinterFont {
-	    pop pop restore
-		Adobe_CTFauxDict /$$$FONTNAME get
-		/Euro
-		Adobe_CTFauxDict /$$$SUBSTITUTEBASE get
-		ct_EuroDict exch get
-		ct_AddGlyphProc
-	} def
-} ifelse
-/AdobeSansMM 
-{ 
-556 0 24 -19 541 703 
-	{ 
-	541 628 m 
-	510 669 442 703 354 703 c 
-	201 703 117 607 101 444 c 
-	50 444 l 
-	25 372 l 
-	97 372 l 
-	97 301 l 
-	49 301 l 
-	24 229 l 
-	103 229 l 
-	124 67 209 -19 350 -19 c 
-	435 -19 501 25 509 32 c 
-	509 131 l 
-	492 105 417 60 343 60 c 
-	267 60 204 127 197 229 c 
-	406 229 l 
-	430 301 l 
-	191 301 l 
-	191 372 l 
-	455 372 l 
-	479 444 l 
-	194 444 l 
-	201 531 245 624 348 624 c 
-	433 624 484 583 509 534 c 
-	cp 
-	556 0 m 
-	}
-ct_PSBuildGlyph
-} def
-/AdobeSerifMM 
-{ 
-500 0 10 -12 484 692 
-	{ 
-	347 298 m 
-	171 298 l 
-	170 310 170 322 170 335 c 
-	170 362 l 
-	362 362 l 
-	374 403 l 
-	172 403 l 
-	184 580 244 642 308 642 c 
-	380 642 434 574 457 457 c 
-	481 462 l 
-	474 691 l 
-	449 691 l 
-	433 670 429 657 410 657 c 
-	394 657 360 692 299 692 c 
-	204 692 94 604 73 403 c 
-	22 403 l 
-	10 362 l 
-	70 362 l 
-	69 352 69 341 69 330 c 
-	69 319 69 308 70 298 c 
-	22 298 l 
-	10 257 l 
-	73 257 l 
-	97 57 216 -12 295 -12 c 
-	364 -12 427 25 484 123 c 
-	458 142 l 
-	425 101 384 37 316 37 c 
-	256 37 189 84 173 257 c 
-	335 257 l 
-	cp 
-	500 0 m 
-	} 
-ct_PSBuildGlyph 
-} def 
-end		
-%%EndFile
-setglobal
-Adobe_CoolType_Core begin /$None SetSubstituteStrategy end
-%%BeginResource: procset Adobe_AGM_Image 1.0 0
-%%Version: 1.0 0
-%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved.
-systemdict/setpacking known
-{
-	currentpacking
-	true setpacking
-}if
-userdict/Adobe_AGM_Image 71 dict dup begin put
-/Adobe_AGM_Image_Id/Adobe_AGM_Image_1.0_0 def
-/nd{
-	null def
-}bind def
-/AGMIMG_&image nd
-/AGMIMG_&colorimage nd
-/AGMIMG_&imagemask nd
-/AGMIMG_mbuf()def
-/AGMIMG_ybuf()def
-/AGMIMG_kbuf()def
-/AGMIMG_c 0 def
-/AGMIMG_m 0 def
-/AGMIMG_y 0 def
-/AGMIMG_k 0 def
-/AGMIMG_tmp nd
-/AGMIMG_imagestring0 nd
-/AGMIMG_imagestring1 nd
-/AGMIMG_imagestring2 nd
-/AGMIMG_imagestring3 nd
-/AGMIMG_imagestring4 nd
-/AGMIMG_imagestring5 nd
-/AGMIMG_cnt nd
-/AGMIMG_fsave nd
-/AGMIMG_colorAry nd
-/AGMIMG_override nd
-/AGMIMG_name nd
-/AGMIMG_maskSource nd
-/AGMIMG_flushfilters nd
-/invert_image_samples nd
-/knockout_image_samples	nd
-/img nd
-/sepimg nd
-/devnimg nd
-/idximg nd
-/ds
-{
-	Adobe_AGM_Core begin
-	Adobe_AGM_Image begin
-	/AGMIMG_&image systemdict/image get def
-	/AGMIMG_&imagemask systemdict/imagemask get def
-	/colorimage where{
-		pop
-		/AGMIMG_&colorimage/colorimage ldf
-	}if
-	end
-	end
-}def
-/ps
-{
-	Adobe_AGM_Image begin
-	/AGMIMG_ccimage_exists{/customcolorimage where 
-		{
-			pop
-			/Adobe_AGM_OnHost_Seps where
-			{
-			pop false
-			}{
-			/Adobe_AGM_InRip_Seps where
-				{
-				pop false
-				}{
-					true
-				}ifelse
-			}ifelse
-			}{
-			false
-		}ifelse 
-	}bdf
-	level2{
-		/invert_image_samples
-		{
-			Adobe_AGM_Image/AGMIMG_tmp Decode length ddf
-			/Decode[Decode 1 get Decode 0 get]def
-		}def
-		/knockout_image_samples
-		{
-			Operator/imagemask ne{
-				/Decode[1 1]def
-			}if
-		}def
-	}{	
-		/invert_image_samples
-		{
-			{1 exch sub}currenttransfer addprocs settransfer
-		}def
-		/knockout_image_samples
-		{
-			{pop 1}currenttransfer addprocs settransfer
-		}def
-	}ifelse
-	/img/imageormask ldf
-	/sepimg/sep_imageormask ldf
-	/devnimg/devn_imageormask ldf
-	/idximg/indexed_imageormask ldf
-	/_ctype 7 def
-	currentdict{
-		dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{
-			bind
-		}if
-		def
-	}forall
-}def
-/pt
-{
-	end
-}def
-/dt
-{
-}def
-/AGMIMG_flushfilters
-{
-	dup type/arraytype ne
-		{1 array astore}if
-	dup 0 get currentfile ne
-		{dup 0 get flushfile}if
-		{
-		dup type/filetype eq
-			{
-			dup status 1 index currentfile ne and
-				{closefile}
-				{pop}
-			ifelse
-			}{pop}ifelse
-		}forall
-}def
-/AGMIMG_init_common
-{
-	currentdict/T known{/ImageType/T ldf currentdict/T undef}if
-	currentdict/W known{/Width/W ldf currentdict/W undef}if
-	currentdict/H known{/Height/H ldf currentdict/H undef}if
-	currentdict/M known{/ImageMatrix/M ldf currentdict/M undef}if
-	currentdict/BC known{/BitsPerComponent/BC ldf currentdict/BC undef}if
-	currentdict/D known{/Decode/D ldf currentdict/D undef}if
-	currentdict/DS known{/DataSource/DS ldf currentdict/DS undef}if
-	currentdict/O known{
-		/Operator/O load 1 eq{
-			/imagemask
-		}{
-			/O load 2 eq{
-				/image 
-			}{
-				/colorimage
-			}ifelse
-		}ifelse
-		def
-		currentdict/O undef
-	}if
-	currentdict/HSCI known{/HostSepColorImage/HSCI ldf currentdict/HSCI undef}if
-	currentdict/MD known{/MultipleDataSources/MD ldf currentdict/MD undef}if
-	currentdict/I known{/Interpolate/I ldf currentdict/I undef}if
-	currentdict/SI known{/SkipImageProc/SI ldf currentdict/SI undef}if
-	/DataSource load xcheck not{
-		DataSource type/arraytype eq{
-			DataSource 0 get type/filetype eq{
-				/_Filters DataSource def
-				currentdict/MultipleDataSources known not{
-					/DataSource DataSource dup length 1 sub get def 
-				}if
-			}if
-		}if
-		currentdict/MultipleDataSources known not{
-			/MultipleDataSources DataSource type/arraytype eq{
-				DataSource length 1 gt
-			}
-			{false}ifelse def
-		}if
-	}if
-	/NComponents Decode length 2 div def
-	currentdict/SkipImageProc known not{/SkipImageProc{false}def}if
-}bdf
-/imageormask_sys
-{
-	begin
-		AGMIMG_init_common
-		save mark
-		level2{
-			currentdict
-			Operator/imagemask eq{
-				AGMIMG_&imagemask
-			}{
-				use_mask{
-					process_mask AGMIMG_&image
-				}{
-					AGMIMG_&image
-				}ifelse
-			}ifelse
-		}{
-			Width Height
-			Operator/imagemask eq{
-				Decode 0 get 1 eq Decode 1 get 0 eq	and
-				ImageMatrix/DataSource load
-				AGMIMG_&imagemask
-			}{
-				BitsPerComponent ImageMatrix/DataSource load
-				AGMIMG_&image
-			}ifelse
-		}ifelse
-		currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
-		cleartomark restore
-	end
-}def
-/overprint_plate
-{
-	currentoverprint{
-		0 get dup type/nametype eq{
-			dup/DeviceGray eq{
-				pop AGMCORE_black_plate not
-			}{
-				/DeviceCMYK eq{
-					AGMCORE_is_cmyk_sep not
-				}if
-			}ifelse
-		}{
-			false exch
-			{
-				 AGMOHS_sepink eq or
-			}forall
-			not
-		}ifelse
-	}{
-		pop false
-	}ifelse
-}def
-/process_mask
-{
-	level3{
-		dup begin
-		/ImageType 1 def
-		end
-		4 dict begin
-			/DataDict exch def
-			/ImageType 3 def
-			/InterleaveType 3 def
-			/MaskDict 9 dict begin
-				/ImageType 1 def
-				/Width DataDict dup/MaskWidth known{/MaskWidth}{/Width}ifelse get def
-				/Height DataDict dup/MaskHeight known{/MaskHeight}{/Height}ifelse get def
-				/ImageMatrix[Width 0 0 Height neg 0 Height]def
-				/NComponents 1 def
-				/BitsPerComponent 1 def
-				/Decode DataDict dup/MaskD known{/MaskD}{[1 0]}ifelse get def
-				/DataSource Adobe_AGM_Core/AGMIMG_maskSource get def
-			currentdict end def
-		currentdict end
-	}if
-}def
-/use_mask
-{
-	dup/Mask known	{dup/Mask get}{false}ifelse
-}def
-/imageormask
-{
-	begin
-		AGMIMG_init_common
-		SkipImageProc{
-			currentdict consumeimagedata
-		}
-		{
-			save mark
-			level2 AGMCORE_host_sep not and{
-				currentdict
-				Operator/imagemask eq DeviceN_PS2 not and{
-					imagemask
-				}{
-					AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get/DeviceGray eq and{
-						[/Separation/Black/DeviceGray{}]setcolorspace
-						/Decode[Decode 1 get Decode 0 get]def
-					}if
-					use_mask{
-						process_mask image
-					}{
-						DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and 
-						{
-							Names convert_to_process not{
-								2 dict begin
-								/imageDict xdf
-								/names_index 0 def
-								gsave
-								imageDict write_image_file{
-									Names{
-										dup(None)ne{
-											[/Separation 3 -1 roll/DeviceGray{1 exch sub}]setcolorspace
-											Operator imageDict read_image_file
-											names_index 0 eq{true setoverprint}if
-											/names_index names_index 1 add def
-										}{
-											pop
-										}ifelse
-									}forall
-									close_image_file
-								}if
-								grestore
-								end
-							}{
-								Operator/imagemask eq{
-									imagemask
-								}{
-									image
-								}ifelse
-							}ifelse
-						}{
-							Operator/imagemask eq{
-								imagemask
-							}{
-								image
-							}ifelse
-						}ifelse
-					}ifelse
-				}ifelse
-			}{
-				Width Height
-				Operator/imagemask eq{
-					Decode 0 get 1 eq Decode 1 get 0 eq	and
-					ImageMatrix/DataSource load
-					/Adobe_AGM_OnHost_Seps where{
-						pop imagemask
-					}{
-						currentgray 1 ne{
-							currentdict imageormask_sys
-						}{
-							currentoverprint not{
-								1 AGMCORE_&setgray
-								currentdict imageormask_sys
-							}{
-								currentdict ignoreimagedata
-							}ifelse				 		
-						}ifelse
-					}ifelse
-				}{
-					BitsPerComponent ImageMatrix 
-					MultipleDataSources{
-						0 1 NComponents 1 sub{
-							DataSource exch get
-						}for
-					}{
-						/DataSource load
-					}ifelse
-					Operator/colorimage eq{
-						AGMCORE_host_sep{
-							MultipleDataSources level2 or NComponents 4 eq and{
-								AGMCORE_is_cmyk_sep{
-									MultipleDataSources{
-										/DataSource DataSource 0 get xcheck
-											{
-											[
-											DataSource 0 get/exec cvx
-											DataSource 1 get/exec cvx
-											DataSource 2 get/exec cvx
-											DataSource 3 get/exec cvx
-											/AGMCORE_get_ink_data cvx
-											]cvx
-											}{
-											DataSource aload pop AGMCORE_get_ink_data
-											}ifelse def
-									}{
-										/DataSource 
-										Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul 
-										/DataSource load
-										filter_cmyk 0()/SubFileDecode filter def
-									}ifelse
-									/Decode[Decode 0 get Decode 1 get]def
-									/MultipleDataSources false def
-									/NComponents 1 def
-									/Operator/image def
-									invert_image_samples
-						 			1 AGMCORE_&setgray
-									currentdict imageormask_sys
-								}{
-									currentoverprint not Operator/imagemask eq and{
- 			 							1 AGMCORE_&setgray
- 			 							currentdict imageormask_sys
- 			 						}{
- 			 							currentdict ignoreimagedata
- 			 						}ifelse
-								}ifelse
-							}{	
-								MultipleDataSources NComponents AGMIMG_&colorimage						
-							}ifelse
-						}{
-							true NComponents colorimage
-						}ifelse
-					}{
-						Operator/image eq{
-							AGMCORE_host_sep{
-								/DoImage true def
-								currentdict/HostSepColorImage known{HostSepColorImage not}{false}ifelse
-								{
-									AGMCORE_black_plate not Operator/imagemask ne and{
-										/DoImage false def
-										currentdict ignoreimagedata
-					 				}if
-								}if
-						 		1 AGMCORE_&setgray
-								DoImage
-									{currentdict imageormask_sys}if
-							}{
-								use_mask{
-									process_mask image
-								}{
-									image
-								}ifelse
-							}ifelse
-						}{
-							Operator/knockout eq{
-								pop pop pop pop pop
-								currentcolorspace overprint_plate not{
-									knockout_unitsq
-								}if
-							}if
-						}ifelse
-					}ifelse
-				}ifelse
-			}ifelse
-			cleartomark restore
-		}ifelse
-		currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
-	end
-}def
-/sep_imageormask
-{
- 	/sep_colorspace_dict AGMCORE_gget begin
-	CSA map_csa
-	begin
-	AGMIMG_init_common
-	SkipImageProc{
-		currentdict consumeimagedata
-	}{
-		save mark 
-		AGMCORE_avoid_L2_sep_space{
-			/Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def
-		}if
- 		AGMIMG_ccimage_exists 
-		MappedCSA 0 get/DeviceCMYK eq and
-		currentdict/Components known and 
-		Name()ne and 
-		Name(All)ne and 
-		Operator/image eq and
-		AGMCORE_producing_seps not and
-		level2 not and
-		{
-			Width Height BitsPerComponent ImageMatrix 
-			[
-			/DataSource load/exec cvx
-			{
-				0 1 2 index length 1 sub{
-					1 index exch
-					2 copy get 255 xor put
-				}for
-			}/exec cvx
-			]cvx bind
-			MappedCSA 0 get/DeviceCMYK eq{
-				Components aload pop
-			}{
-				0 0 0 Components aload pop 1 exch sub
-			}ifelse
-			Name findcmykcustomcolor
-			customcolorimage
-		}{
-			AGMCORE_producing_seps not{
-				level2{
- 					//Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne AGMCORE_avoid_L2_sep_space not and currentcolorspace 0 get/Separation ne and{
-						[/Separation Name MappedCSA sep_proc_name exch dup 0 get 15 string cvs(/Device)anchorsearch{pop pop 0 get}{pop}ifelse exch load]setcolorspace_opt
-						/sep_tint AGMCORE_gget setcolor
-					}if
-					currentdict imageormask
-				}{
-					currentdict
-					Operator/imagemask eq{
-						imageormask
-					}{
-						sep_imageormask_lev1
-					}ifelse
-				}ifelse
- 			}{
-				AGMCORE_host_sep{
-					Operator/knockout eq{
-						currentdict/ImageMatrix get concat
-						knockout_unitsq
-					}{
-						currentgray 1 ne{
- 							AGMCORE_is_cmyk_sep Name(All)ne and{
- 								level2{
- 									Name AGMCORE_IsSeparationAProcessColor 
- 									{
- 										Operator/imagemask eq{
- 											//Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{
- 												/sep_tint AGMCORE_gget 1 exch sub AGMCORE_&setcolor
- 											}if
- 										}{
-											invert_image_samples
- 										}ifelse
-	 								}{
-	 									//Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{
-	 										[/Separation Name[/DeviceGray]
-	 										{
-	 											sep_colorspace_proc AGMCORE_get_ink_data
-												1 exch sub
-	 										}bind
-											]AGMCORE_&setcolorspace
-											/sep_tint AGMCORE_gget AGMCORE_&setcolor
-										}if
- 									}ifelse
- 									currentdict imageormask_sys
-	 							}{
-	 								currentdict
-									Operator/imagemask eq{
-										imageormask_sys
-									}{
-										sep_image_lev1_sep
-									}ifelse
-	 							}ifelse
- 							}{
- 								Operator/imagemask ne{
-									invert_image_samples
- 								}if
-		 						currentdict imageormask_sys
- 							}ifelse
- 						}{
- 							currentoverprint not Name(All)eq or Operator/imagemask eq and{
-								currentdict imageormask_sys 
-								}{
-								currentoverprint not
-									{
- 									gsave 
- 									knockout_unitsq
- 									grestore
-									}if
-								currentdict consumeimagedata 
-		 					}ifelse
- 						}ifelse
-		 			}ifelse
- 				}{
-					//Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{
-						currentcolorspace 0 get/Separation ne{
-							[/Separation Name MappedCSA sep_proc_name exch 0 get exch load]setcolorspace_opt
-							/sep_tint AGMCORE_gget setcolor
-						}if
-					}if
-					currentoverprint 
-					MappedCSA 0 get/DeviceCMYK eq and 
-					Name AGMCORE_IsSeparationAProcessColor not and
-					//Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{Name inRip_spot_has_ink not and}{false}ifelse 
-					Name(All)ne and{
-						imageormask_l2_overprint
-					}{
-						currentdict imageormask
- 					}ifelse
-				}ifelse
-			}ifelse
-		}ifelse
-		cleartomark restore
-	}ifelse
-	currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
-	end
-	end
-}def
-/colorSpaceElemCnt
-{
-	mark currentcolor counttomark dup 2 add 1 roll cleartomark
-}bdf
-/devn_sep_datasource
-{
-	1 dict begin
-	/dataSource xdf
-	[
-		0 1 dataSource length 1 sub{
-			dup currentdict/dataSource get/exch cvx/get cvx/exec cvx
-			/exch cvx names_index/ne cvx[/pop cvx]cvx/if cvx
-		}for
-	]cvx bind
-	end
-}bdf		
-/devn_alt_datasource
-{
-	11 dict begin
-	/convProc xdf
-	/origcolorSpaceElemCnt xdf
-	/origMultipleDataSources xdf
-	/origBitsPerComponent xdf
-	/origDecode xdf
-	/origDataSource xdf
-	/dsCnt origMultipleDataSources{origDataSource length}{1}ifelse def
-	/DataSource origMultipleDataSources
-		{
-			[
-			BitsPerComponent 8 idiv origDecode length 2 idiv mul string
-			0 1 origDecode length 2 idiv 1 sub
-				{
-				dup 7 mul 1 add index exch dup BitsPerComponent 8 idiv mul exch
-				origDataSource exch get 0()/SubFileDecode filter
-				BitsPerComponent 8 idiv string/readstring cvx/pop cvx/putinterval cvx
-				}for 
-			]bind cvx
-		}{origDataSource}ifelse 0()/SubFileDecode filter def		
-	[
-		origcolorSpaceElemCnt string
-		0 2 origDecode length 2 sub
-			{
-			dup origDecode exch get dup 3 -1 roll 1 add origDecode exch get exch sub 2 BitsPerComponent exp 1 sub div
-			1 BitsPerComponent 8 idiv{DataSource/read cvx/not cvx{0}/if cvx/mul cvx}repeat/mul cvx/add cvx
-			}for
-		/convProc load/exec cvx
-		origcolorSpaceElemCnt 1 sub -1 0
-			{
-			/dup cvx 2/add cvx/index cvx
-			3 1/roll cvx/exch cvx 255/mul cvx/cvi cvx/put cvx
-			}for
-	]bind cvx 0()/SubFileDecode filter
-	end
-}bdf
-/devn_imageormask
-{
- 	/devicen_colorspace_dict AGMCORE_gget begin
-	CSA map_csa
-	2 dict begin
-	dup
-	/srcDataStrs[3 -1 roll begin
-		AGMIMG_init_common
-		currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse
-		{
-			Width Decode length 2 div mul cvi
-			{
-				dup 65535 gt{1 add 2 div cvi}{exit}ifelse
-			}loop
-			string
-		}repeat
-		end]def
-	/dstDataStr srcDataStrs 0 get length string def
-	begin
-	AGMIMG_init_common
-	SkipImageProc{
-		currentdict consumeimagedata
-	}{
-		save mark 
-		AGMCORE_producing_seps not{
-			level3 not{
-				Operator/imagemask ne{
-					/DataSource[[
-						DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse
-						colorSpaceElemCnt/devicen_colorspace_dict AGMCORE_gget/TintTransform get 
-						devn_alt_datasource 1/string cvx/readstring cvx/pop cvx]cvx colorSpaceElemCnt 1 sub{dup}repeat]def				
-					/MultipleDataSources true def
-					/Decode colorSpaceElemCnt[exch{0 1}repeat]def
-				}if
-			}if
-			currentdict imageormask
- 		}{
-			AGMCORE_host_sep{
-				Names convert_to_process{
-					CSA get_csa_by_name 0 get/DeviceCMYK eq{
-						/DataSource
-							Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul 
-							DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse
-							4/devicen_colorspace_dict AGMCORE_gget/TintTransform get 
-							devn_alt_datasource
-						filter_cmyk 0()/SubFileDecode filter def
-						/MultipleDataSources false def
-						/Decode[1 0]def
-						/DeviceGray setcolorspace
-			 			currentdict imageormask_sys
- 					}{
-						AGMCORE_report_unsupported_color_space
-						AGMCORE_black_plate{
-							/DataSource
-								DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse
-								CSA get_csa_by_name 0 get/DeviceRGB eq{3}{1}ifelse/devicen_colorspace_dict AGMCORE_gget/TintTransform get
-								devn_alt_datasource
-							/MultipleDataSources false def
-							/Decode colorSpaceElemCnt[exch{0 1}repeat]def
-				 			currentdict imageormask_sys
-				 		}{
-	 						gsave 
-	 						knockout_unitsq
-	 						grestore
-							currentdict consumeimagedata 
-						}ifelse
- 					}ifelse
-				}
-				{	
-					/devicen_colorspace_dict AGMCORE_gget/names_index known{
-	 					Operator/imagemask ne{
-	 						MultipleDataSources{
-		 						/DataSource[DataSource devn_sep_datasource/exec cvx]cvx def
-								/MultipleDataSources false def
-	 						}{
-								/DataSource/DataSource load dstDataStr srcDataStrs 0 get filter_devn def
-	 						}ifelse
-							invert_image_samples
-	 					}if
-			 			currentdict imageormask_sys
-	 				}{
-	 					currentoverprint not Operator/imagemask eq and{
-							currentdict imageormask_sys 
-							}{
-							currentoverprint not
-								{
-	 							gsave 
-	 							knockout_unitsq
-	 							grestore
-								}if
-							currentdict consumeimagedata 
-			 			}ifelse
-	 				}ifelse
-	 			}ifelse
- 			}{
-				currentdict imageormask
-			}ifelse
-		}ifelse
-		cleartomark restore
-	}ifelse
-	currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
-	end
-	end
-	end
-}def
-/imageormask_l2_overprint
-{
-	currentdict
-	currentcmykcolor add add add 0 eq{
-		currentdict consumeimagedata
-	}{
-		level3{			
-			currentcmykcolor 
-			/AGMIMG_k xdf 
-			/AGMIMG_y xdf 
-			/AGMIMG_m xdf 
-			/AGMIMG_c xdf
-			Operator/imagemask eq{
-				[/DeviceN[
-				AGMIMG_c 0 ne{/Cyan}if
-				AGMIMG_m 0 ne{/Magenta}if
-				AGMIMG_y 0 ne{/Yellow}if
-				AGMIMG_k 0 ne{/Black}if
-				]/DeviceCMYK{}]setcolorspace
-				AGMIMG_c 0 ne{AGMIMG_c}if
-				AGMIMG_m 0 ne{AGMIMG_m}if
-				AGMIMG_y 0 ne{AGMIMG_y}if
-				AGMIMG_k 0 ne{AGMIMG_k}if
-				setcolor			
-			}{	
-				/Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def
-				[/Indexed 				
-					[
-						/DeviceN[
-							AGMIMG_c 0 ne{/Cyan}if
-							AGMIMG_m 0 ne{/Magenta}if
-							AGMIMG_y 0 ne{/Yellow}if
-							AGMIMG_k 0 ne{/Black}if
-						]
-						/DeviceCMYK{
-							AGMIMG_k 0 eq{0}if
-							AGMIMG_y 0 eq{0 exch}if
-							AGMIMG_m 0 eq{0 3 1 roll}if
-							AGMIMG_c 0 eq{0 4 1 roll}if						
-						}
-					]
-					255
-					{
-						255 div 
-						mark exch
-						dup	dup dup
-						AGMIMG_k 0 ne{
-							/sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop		
-							counttomark 1 roll
-						}{
-							pop
-						}ifelse
-						AGMIMG_y 0 ne{
-							/sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop		
-							counttomark 1 roll
-						}{
-							pop
-						}ifelse
-						AGMIMG_m 0 ne{
-							/sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop		
-							counttomark 1 roll
-						}{
-							pop
-						}ifelse
-						AGMIMG_c 0 ne{
-							/sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop		
-							counttomark 1 roll
-						}{
-							pop
-						}ifelse
-						counttomark 1 add -1 roll pop
-					}
-				]setcolorspace
-			}ifelse
-			imageormask_sys
-		}{
-	write_image_file{
-		currentcmykcolor
-		0 ne{
-			[/Separation/Black/DeviceGray{}]setcolorspace
-			gsave
-			/Black
-			[{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 1 roll pop pop pop 1 exch sub}/exec cvx]
-			cvx modify_halftone_xfer
-			Operator currentdict read_image_file
-			grestore
-		}if
-		0 ne{
-			[/Separation/Yellow/DeviceGray{}]setcolorspace
-			gsave
-			/Yellow
-			[{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 2 roll pop pop pop 1 exch sub}/exec cvx]
-			cvx modify_halftone_xfer
-			Operator currentdict read_image_file
-			grestore
-		}if
-		0 ne{
-			[/Separation/Magenta/DeviceGray{}]setcolorspace
-			gsave
-			/Magenta
-			[{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 3 roll pop pop pop 1 exch sub}/exec cvx]
-			cvx modify_halftone_xfer
-			Operator currentdict read_image_file
-			grestore
-		}if
-		0 ne{
-			[/Separation/Cyan/DeviceGray{}]setcolorspace
-			gsave
-			/Cyan 
-			[{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{pop pop pop 1 exch sub}/exec cvx]
-			cvx modify_halftone_xfer
-			Operator currentdict read_image_file
-			grestore
-		}if
-				close_image_file
-			}{
-				imageormask
-			}ifelse
-		}ifelse
-	}ifelse
-}def
-/indexed_imageormask
-{
-	begin
-		AGMIMG_init_common
-		save mark 
- 		currentdict
- 		AGMCORE_host_sep{
-			Operator/knockout eq{
-				/indexed_colorspace_dict AGMCORE_gget dup/CSA known{
-					/CSA get get_csa_by_name
-				}{
-					/Names get
-				}ifelse
-				overprint_plate not{
-					knockout_unitsq
-				}if
-			}{
-				Indexed_DeviceN{
-					/devicen_colorspace_dict AGMCORE_gget dup/names_index known exch/Names get convert_to_process or{
-			 			indexed_image_lev2_sep
-					}{
-						currentoverprint not{
-							knockout_unitsq
-			 			}if
-			 			currentdict consumeimagedata
-					}ifelse
-				}{
-		 			AGMCORE_is_cmyk_sep{
-						Operator/imagemask eq{
-							imageormask_sys
-						}{
-							level2{
-								indexed_image_lev2_sep
-							}{
-								indexed_image_lev1_sep
-							}ifelse
-						}ifelse
-					}{
-						currentoverprint not{
-							knockout_unitsq
-			 			}if
-			 			currentdict consumeimagedata
-					}ifelse
-				}ifelse
-			}ifelse
- 		}{
-			level2{
-				Indexed_DeviceN{
-					/indexed_colorspace_dict AGMCORE_gget begin
-				}{
-					/indexed_colorspace_dict AGMCORE_gget dup null ne
-					{
-						begin
-						currentdict/CSDBase known{CSDBase/CSD get_res/MappedCSA get}{CSA}ifelse
-						get_csa_by_name 0 get/DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and
-						AGMCORE_in_rip_sep and{
-							[/Indexed[/DeviceN[/Cyan/Magenta/Yellow/Black]/DeviceCMYK{}]HiVal Lookup]
-							setcolorspace
-						}if
-						end
-					}
-					{pop}ifelse
-				}ifelse
-				imageormask
-				Indexed_DeviceN{
-					end
-				}if
-			}{
-				Operator/imagemask eq{
-					imageormask
-				}{
-					indexed_imageormask_lev1
-				}ifelse
-			}ifelse
- 		}ifelse
-		cleartomark restore
-	currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
-	end
-}def
-/indexed_image_lev2_sep
-{
-	/indexed_colorspace_dict AGMCORE_gget begin
-	begin
-		Indexed_DeviceN not{
-			currentcolorspace 
-			dup 1/DeviceGray put
-			dup 3
-			currentcolorspace 2 get 1 add string
-			0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub
-			{
-			dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put
-			}for 
-			put	setcolorspace
-		}if
-		currentdict 
-		Operator/imagemask eq{
-			AGMIMG_&imagemask
-		}{
-			use_mask{
-				process_mask AGMIMG_&image
-			}{
-				AGMIMG_&image
-			}ifelse
-		}ifelse
-	end end
-}def
- /OPIimage
- {
- 	dup type/dicttype ne{
- 		10 dict begin
- 			/DataSource xdf
- 			/ImageMatrix xdf
- 			/BitsPerComponent xdf
- 			/Height xdf
- 			/Width xdf
- 			/ImageType 1 def
- 			/Decode[0 1 def]
- 			currentdict
- 		end
- 	}if
- 	dup begin
- 		/NComponents 1 cdndf
- 		/MultipleDataSources false cdndf
- 		/SkipImageProc{false}cdndf
- 		/Decode[
- 				0 
- 				currentcolorspace 0 get/Indexed eq{
- 					2 BitsPerComponent exp 1 sub
- 				}{
- 					1
- 				}ifelse
- 		]cdndf
- 		/Operator/image cdndf
- 	end
- 	/sep_colorspace_dict AGMCORE_gget null eq{
- 		imageormask
- 	}{
- 		gsave
- 		dup begin invert_image_samples end
- 		sep_imageormask
- 		grestore
- 	}ifelse
- }def
-/cachemask_level2
-{
-	3 dict begin
-	/LZWEncode filter/WriteFilter xdf
-	/readBuffer 256 string def
-	/ReadFilter
-		currentfile
-		0(%EndMask)/SubFileDecode filter
-		/ASCII85Decode filter
-		/RunLengthDecode filter
-	def
-	{
-		ReadFilter readBuffer readstring exch
-		WriteFilter exch writestring
-		not{exit}if
-	}loop
-	WriteFilter closefile
-	end
-}def
-/spot_alias
-{
-	/mapto_sep_imageormask 
-	{
-		dup type/dicttype ne{
-			12 dict begin
-				/ImageType 1 def
-				/DataSource xdf
-				/ImageMatrix xdf
-				/BitsPerComponent xdf
-				/Height xdf
-				/Width xdf
-				/MultipleDataSources false def
-		}{
-			begin
-		}ifelse
-				/Decode[/customcolor_tint AGMCORE_gget 0]def
-				/Operator/image def
-				/SkipImageProc{false}def
-				currentdict 
-			end
-		sep_imageormask
-	}bdf
-	/customcolorimage
-	{
-		Adobe_AGM_Image/AGMIMG_colorAry xddf
-		/customcolor_tint AGMCORE_gget
-		<<
-			/Name AGMIMG_colorAry 4 get
-			/CSA[/DeviceCMYK]
-			/TintMethod/Subtractive
-			/TintProc null
-			/MappedCSA null
-			/NComponents 4 
-			/Components[AGMIMG_colorAry aload pop pop]
-		>>
-		setsepcolorspace
-		mapto_sep_imageormask
-	}ndf
-	Adobe_AGM_Image/AGMIMG_&customcolorimage/customcolorimage load put
-	/customcolorimage
-	{
-		Adobe_AGM_Image/AGMIMG_override false put
-		current_spot_alias{dup 4 get map_alias}{false}ifelse
-		{
-			false set_spot_alias
-			/customcolor_tint AGMCORE_gget exch setsepcolorspace
-			pop
-			mapto_sep_imageormask
-			true set_spot_alias
-		}{
-			//Adobe_AGM_Image/AGMIMG_&customcolorimage get exec
-		}ifelse			
-	}bdf
-}def
-/snap_to_device
-{
-	6 dict begin
-	matrix currentmatrix
-	dup 0 get 0 eq 1 index 3 get 0 eq and
-	1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop
-	{
-		1 1 dtransform 0 gt exch 0 gt/AGMIMG_xSign? exch def/AGMIMG_ySign? exch def
-		0 0 transform
-		AGMIMG_ySign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch
-		AGMIMG_xSign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch
-		itransform/AGMIMG_llY exch def/AGMIMG_llX exch def
-		1 1 transform
-		AGMIMG_ySign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch
-		AGMIMG_xSign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch
-		itransform/AGMIMG_urY exch def/AGMIMG_urX exch def			
-		[AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY]concat
-	}{
-	}ifelse
-	end
-}def
-level2 not{
-	/colorbuf
-	{
-		0 1 2 index length 1 sub{
-			dup 2 index exch get 
-			255 exch sub 
-			2 index 
-			3 1 roll 
-			put
-		}for
-	}def
-	/tint_image_to_color
-	{
-		begin
-			Width Height BitsPerComponent ImageMatrix 
-			/DataSource load
-		end
-		Adobe_AGM_Image begin
-			/AGMIMG_mbuf 0 string def
-			/AGMIMG_ybuf 0 string def
-			/AGMIMG_kbuf 0 string def
-			{
-				colorbuf dup length AGMIMG_mbuf length ne
-					{
-					dup length dup dup
-					/AGMIMG_mbuf exch string def
-					/AGMIMG_ybuf exch string def
-					/AGMIMG_kbuf exch string def
-					}if
-				dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop
-			}
-			addprocs
-			{AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf}true 4 colorimage	
-		end
-	}def			
-	/sep_imageormask_lev1
-	{
-		begin
-			MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{
-				{
-					255 mul round cvi GrayLookup exch get
-				}currenttransfer addprocs settransfer
-				currentdict imageormask
-			}{
-				/sep_colorspace_dict AGMCORE_gget/Components known{
-					MappedCSA 0 get/DeviceCMYK eq{
-						Components aload pop
-					}{
-						0 0 0 Components aload pop 1 exch sub
-					}ifelse
-					Adobe_AGM_Image/AGMIMG_k xddf 
-					Adobe_AGM_Image/AGMIMG_y xddf 
-					Adobe_AGM_Image/AGMIMG_m xddf 
-					Adobe_AGM_Image/AGMIMG_c xddf 
-					AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{
-						{AGMIMG_k mul 1 exch sub}currenttransfer addprocs settransfer
-						currentdict imageormask
-					}{
-						currentcolortransfer
-						{AGMIMG_k mul 1 exch sub}exch addprocs 4 1 roll
-						{AGMIMG_y mul 1 exch sub}exch addprocs 4 1 roll
-						{AGMIMG_m mul 1 exch sub}exch addprocs 4 1 roll
-						{AGMIMG_c mul 1 exch sub}exch addprocs 4 1 roll
-						setcolortransfer
-						currentdict tint_image_to_color
-					}ifelse
-				}{
-					MappedCSA 0 get/DeviceGray eq{
-						{255 mul round cvi ColorLookup exch get 0 get}currenttransfer addprocs settransfer
-						currentdict imageormask
-					}{
-						MappedCSA 0 get/DeviceCMYK eq{
-							currentcolortransfer
-							{255 mul round cvi ColorLookup exch get 3 get 1 exch sub}exch addprocs 4 1 roll
-							{255 mul round cvi ColorLookup exch get 2 get 1 exch sub}exch addprocs 4 1 roll
-							{255 mul round cvi ColorLookup exch get 1 get 1 exch sub}exch addprocs 4 1 roll
-							{255 mul round cvi ColorLookup exch get 0 get 1 exch sub}exch addprocs 4 1 roll
-							setcolortransfer 
-							currentdict tint_image_to_color
-						}{
-							currentcolortransfer
-							{pop 1}exch addprocs 4 1 roll
-							{255 mul round cvi ColorLookup exch get 2 get}exch addprocs 4 1 roll
-							{255 mul round cvi ColorLookup exch get 1 get}exch addprocs 4 1 roll
-							{255 mul round cvi ColorLookup exch get 0 get}exch addprocs 4 1 roll
-							setcolortransfer 
-							currentdict tint_image_to_color
-						}ifelse
-					}ifelse
-				}ifelse
-			}ifelse
-		end
-	}def
-	/sep_image_lev1_sep
-	{
-		begin
-			/sep_colorspace_dict AGMCORE_gget/Components known{
-				Components aload pop
-				Adobe_AGM_Image/AGMIMG_k xddf 
-				Adobe_AGM_Image/AGMIMG_y xddf 
-				Adobe_AGM_Image/AGMIMG_m xddf 
-				Adobe_AGM_Image/AGMIMG_c xddf 
-				{AGMIMG_c mul 1 exch sub}
-				{AGMIMG_m mul 1 exch sub}
-				{AGMIMG_y mul 1 exch sub}
-				{AGMIMG_k mul 1 exch sub}
-			}{
-				{255 mul round cvi ColorLookup exch get 0 get 1 exch sub}
-				{255 mul round cvi ColorLookup exch get 1 get 1 exch sub}
-				{255 mul round cvi ColorLookup exch get 2 get 1 exch sub}
-				{255 mul round cvi ColorLookup exch get 3 get 1 exch sub}
-			}ifelse
-			AGMCORE_get_ink_data currenttransfer addprocs settransfer
-			currentdict imageormask_sys
-		end
-	}def
-	/indexed_imageormask_lev1
-	{
-		/indexed_colorspace_dict AGMCORE_gget begin
-		begin
-			currentdict
-			MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{
-				{HiVal mul round cvi GrayLookup exch get HiVal div}currenttransfer addprocs settransfer
-				imageormask
-			}{
-				MappedCSA 0 get/DeviceGray eq{
-					{HiVal mul round cvi Lookup exch get HiVal div}currenttransfer addprocs settransfer
-					imageormask
-				}{
-					MappedCSA 0 get/DeviceCMYK eq{
-						currentcolortransfer
-						{4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
-						{4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
-						{4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
-						{4 mul HiVal mul round cvi		 Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
-						setcolortransfer 
-						tint_image_to_color
-					}{
-						currentcolortransfer
-						{pop 1}exch addprocs 4 1 roll
-						{3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div}exch addprocs 4 1 roll
-						{3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div}exch addprocs 4 1 roll
-						{3 mul HiVal mul round cvi 		Lookup exch get HiVal div}exch addprocs 4 1 roll
-						setcolortransfer 
-						tint_image_to_color
-					}ifelse
-				}ifelse
-			}ifelse
-		end end
-	}def
-	/indexed_image_lev1_sep
-	{
-		/indexed_colorspace_dict AGMCORE_gget begin
-		begin
-			{4 mul HiVal mul round cvi		 Lookup exch get HiVal div 1 exch sub}
-			{4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}
-			{4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}
-			{4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}
-			AGMCORE_get_ink_data currenttransfer addprocs settransfer
-			currentdict imageormask_sys
-		end end
-	}def
-}if
-end
-systemdict/setpacking known
-{setpacking}if
-%%EndResource
-currentdict Adobe_AGM_Utils eq {end} if
-%%EndProlog
-%%BeginSetup
-Adobe_AGM_Utils begin
-2 2010 Adobe_AGM_Core/ds gx
-Adobe_CoolType_Core/ds get exec
-Adobe_AGM_Image/ds gx
-[/NamespacePush pdfmark_5
-[/_objdef {Doc_Metadata} /type /stream /OBJ pdfmark_5
-[{Doc_Metadata} 1072 (% &end XMP packet& %) ReadBypdfmark_5_string
-
-
- 
-  
-   
-    
-     Slide 1
-    
-   
-   
-    
-     michaelv
-    
-   
-  
- 
-
-                                                                                                                                
-                                                                                                                                
-                                                                                                                                
-                                                                                                                                
-                                                                                                                                
-                                                                                                                                
-                                                                                                                                
-                                                                                                                                
-                                                                                                                                
-                                                                                                                                
-                                                                                                                                
-                                                                                                                                
-                                                                                                                                
-                                                                                                                                
-                                                                                                                                
-                                                                                                                                
-
-
-
-% &end XMP packet& %
-
-[{Doc_Metadata} 2 dict begin /Type /Metadata def /Subtype /XML def currentdict end /PUT pdfmark_5
-[/Document 1 dict begin /Metadata {Doc_Metadata} def currentdict end /BDC pdfmark_5
-[/NamespacePop pdfmark_5
-currentdict Adobe_AGM_Utils eq {end} if
-%%EndSetup
-%%Page: 1 1
-%%EndPageComments
-%%BeginPageSetup
-Adobe_AGM_Utils begin
-Adobe_AGM_Core/ps gx
-Adobe_AGM_Core/capture_mysetup gx
-Adobe_AGM_Utils/capture_cpd gx
-Adobe_CoolType_Core/ps get exec
-Adobe_AGM_Image/ps gx
-Adobe_AGM_Core/ps gx
-gsave
-/0 
-[/DeviceCMYK] /CSA add_res
-grestore
-Adobe_AGM_Core/pt gx
-%%EndPageSetup
-1 -1 scale 0 -540 translate
-pgsv
-[1 0 0 1 0 0 ]ct
-gsave
-np
-gsave
-0 0 mo
-0 540 li
-720 540 li
-720 0 li
-cp
-clp
-[1 0 0 1 0 0 ]ct
-.12 lw
-0 lc
-1 lj
-10 ml
-[] 0 dsh
-true sadj
-45.625 .5 mo
-45.75 .625 li
-false sop
-.75021 .679683 .670222 .90164 cmyk
-@
-465.5 539.5 mo
-465.625 539.625 li
-@
-0 lj
-8 ml
-244.375 362.5 mo
-305.75 362.5 li
-305.75 402 li
-244.375 402 li
-cp
-@
-1 lw
-1 lj
-336 235.507 mo
-415.625 235.625 li
-@
-336.996 238.509 mo
-331 235.5 li
-337.005 232.509 li
-cp
-f
-415.625 235.5 mo
-415.746 372.75 li
-@
-418.745 371.747 mo
-415.75 377.75 li
-412.745 371.753 li
-cp
-f
-450.121 372.75 mo
-450.004 227 li
-@
-447.005 228.002 mo
-450 221.999 li
-453.005 227.997 li
-cp
-f
-453.121 371.748 mo
-450.126 377.75 li
-447.121 371.753 li
-cp
-f
-.12 lw
-0 lj
-198.875 24 mo
-326 24 li
-326 259.875 li
-198.875 259.875 li
-cp
-@
-221.5 192 mo
-312 192 li
-312 216 li
-221.5 216 li
-cp
-@
-gsave
-46.126 431.751 mo
-74.632 431.751 li
-74.632 462.883 li
-46.126 462.883 li
-cp
-clp
-46.125 431.503 mo
-74.6302 431.503 li
-74.6302 462.882 li
-46.125 462.882 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 46.125 108.497 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-%ADOBeginSubsetFont: ArialMT Initial
-ct_T42Dict begin
--0.664 -0.324 2 1.004
- 256 array 0 1 255 {1 index exch /.notdef put} for  /ArialMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f3210325d73000000cc000000606376
-7420a11cd7eb0000012c000006546670676dcc79599a000007800000066e
-676c796607022dca000094e0000822cc68656164d6144b3e00000df00000
-003668686561123315fe00000e2800000024686d7478f65efffb00000e4c
-000034d46c6f6361361cd72000004320000034d86d617870124c05df0000
-77f8000000206e616d659617a74000007818000011057072657025d64dbf
-0000892000000bbe67646972000000000000000000000000000303880190
-00050008059a05330000011b059a0533000003d1006602120805020b0604
-020202020204e0002affc00078430000000900000000544d432000400020
-fffc05d3fe510133073e01b2400001ffffff0000042605bb000000200004
-05ba001905ba001a05a70019042600180000ffe70000ffe80000ffe7fe69
-ffe805ba0019fe69ffe802ea000000b8000000b80000000000a800ad0169
-00ad00bf00c201f0001800af00b900b400c800170044009c007c00940087
-0006005a00c80089005200520005004400940119ffb4002f00a1000300a1
-00cd00170057007e00ba00160118ffe9007f008503d300870085000d0022
-00410050006f008d014cff75005c00df04830037004c006e00700180ff58
-ff8eff92ffa400a500b903c8fffd000b001a0063006300cdffee05d8ffdc
-002d005c0095009900df019209b500400057008000b9039d0072009a035d
-0401ff67fffa00030021007700cd0004004d00cd01c0022b004c006500e7
-0118017c034305d8ffa3ffb0ffc40003001c005d0068009a00ba01350147
-0221055cff4dffcd0016002d00780080009900b200b600b600b800bd00da
-010c05f0ffa4fff00019002c0049007f00b400ce01c003fefd81fe3f0000
-00050018002900390049006f00be00c700d0012301c1026f050c05320540
-057affd4001400310055005700a700b400e601f7027e027e027f03c60446
-ff42000e0085009100bf00c200c500e1011a012f014f01560229026f029e
-03720008002c00310031006400690089009800c700de012b01b6020c02cf
-03a304ab04fb061dfee0ff0e00060026009b009d00c1010d011801200173
-018201d601e30243025f029b02e2039404a904d20761001c005e006d008d
-00ab00f7011201380151015b0168017c01870191019901cd01d001e80241
-0254026b02ef0368037103bd044204420453047304830586058b06e8fe58
-fec4fed1fef7ff32ff860051007c008100910095009e00b400b900cf00d9
-00d900df00e20105010b010e010e012001210155017b017b017e018d01a2
-01a801a901b401d001d001e201e901f201f501fb020002000206021b0221
-022202220223027202770294029c02cf02cf02d002ec02f903170322032b
-0335033c0359036f037103870390039003b503e1041a04cf04ff05320532
-0596059f05a805ab05c205f0060c0782080008ccfca3fd2afddefe00fe88
-fe96feb2feb4ffe100150019001a001c001f003c005100610061006a0078
-009600a500af00d3010c0118011a012a013e014c0151015f016a01710178
-01820184019a01a501a801a901ae01bc01cd01d701ef0200020d021c0221
-0222022e02350242024f024f025e026502710290029202b402d602fa0307
-030b030f0315032a0347035d036503740379039603b003cc03dd03e203f6
-03fc03fc03ff040a041f04220426042b0447045f0475049e04e704e7055c
-05cb05e5060a066d068606b806f10736073e07500751075d078f07b607d4
-086000b600c300b500b700000000000000000000000001e00381034503b5
-008e0233041902ce02ce002d005f0064034d023f000002a80188027d01b4
-02240578063b023b014e00f00426029402c6029f02f6023b034d014b0153
-006a0231000000000000061404aa0000003c04c300ed04bc026502ce03b5
-0078060c017e02ef060c00b201000239000001c50330042b03cb00da03df
-010704a100db040a011701ed02a70350010b01bd043e05580021039c00ae
-0371017d00b5024500000afb088c012b014e01aa00870054013201f803ff
-0003024e00b4003703e30083006b02d800ed00770088009701640467008e
-0033017c00e700a6029e0329056e062a061501c90269048a021301b40002
-04a9000002390124010305140084015d039a06ef02d9007500cf040a00de
-03ac04bc02cf02ae034d04f005520168006d007d00860071ff8100790558
-04d2016700030156002504e00094007c033204210094007f0072005c002f
-00b6001800ba00b80041034d00720018001f004c016a01550099009a009a
-009800b200040078006900140057006e00ce00b4065402b80067050e0165
-00e7000004cbfe52005affa60099ff67006eff92002dffd40087ff7c00b8
-00a800e5008f00a80185fe7b0070001e00d900de014c054602cf0546ff2d
-028a02d90253029600b700000000000000000000000000000125011800ea
-00ea00ae0000003e05bb008a04d70053003fff8cffd50015002800220099
-0062004a00e4006d00ee00e5004803c00033fe4e02b1ff460370007905df
-0051ffa7ff1f010a0068ff6c004f00bc00a507050061072b00ed04b001d2
-00b6007b00650252ff740365fe690094008f005c00400086007500890089
-4043555441403f3e3d3c3b3a3938373534333231302f2e2d2c2b2a292827
-262524232221201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09
-0807060504030201002c4523466020b02660b004262348482d2c45234623
-6120b02661b004262348482d2c45234660b0206120b04660b00426234848
-2d2c4523462361b0206020b02661b02061b004262348482d2c45234660b0
-406120b06660b004262348482d2c4523462361b0406020b02661b04061b0
-04262348482d2c0110203c003c2d2c20452320b0cd442320b8015a515823
-20b08d44235920b0ed51582320b04d44235920b09051582320b00d442359
-21212d2c20204518684420b001602045b04676688a4560442d2c01b10b0a
-432343650a2d2c00b10a0b4323430b2d2c00b0172370b101173e01b01723
-70b10217453ab10200080d2d2c45b01a234445b01923442d2c2045b00325
-456164b050515845441b2121592d2cb00143632362b0002342b00f2b2d2c
-2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b1
-2cc08a8cb8100062602b0c642364615c58b00361592d2c45b0112bb01723
-44b0177ae4182d2c45b0112bb01723442d2cb01243588745b0112bb01723
-44b0177ae41b038a45186920b01723448a8a8720b0a05158b0112bb01723
-44b0177ae41b21b0177ae45959182d2c2d2cb0022546608a46b040618c48
-2d2c4b53205c58b002855958b00185592d2c20b0032545b019234445b01a
-23444565234520b00325606a20b009234223688a6a606120b01a8ab00052
-7921b21a1a40b9ffe0001a45208a54582321b03f1b235961441cb114008a
-5279b31940201945208a54582321b03f1b235961442d2cb110114323430b
-2d2cb10e0f4323430b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2c
-b10e0f432343650b2d2cb11011432343650b2d2c4b525845441b2121592d
-2c0120b003252349b04060b0206320b000525823b002253823b002256538
-008a63381b212121212159012d2c4bb06451584569b00943608a103a1b21
-2121592d2c01b005251023208af500b0016023edec2d2c01b00525102320
-8af500b0016123edec2d2c01b0062510f500edec2d2c20b001600110203c
-003c2d2c20b001610110203c003c2d2cb02b2bb02a2a2d2c00b00743b006
-430b2d2c3eb02a2a2d2c352d2c76b8022323701020b802234520b0005058
-b00161593a2f182d2c21210c6423648bb84000622d2c21b08051580c6423
-648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb815
-55621bb200802f2b59b002602d2c0c6423648bb84000626023212d2cb400
-0100000015b00826b00826b00826b008260f10161345683ab001162d2cb4
-000100000015b00826b00826b00826b008260f1016134568653ab001162d
-2c4b53234b515a5820458a60441b2121592d2c4b545820458a60441b2121
-592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb01343
-58031b02592d2cb0134358021b03592d2c4b54b012435c5a58381b212159
-2d2cb012435c580cb00425b00425060c6423646164b807085158b00425b0
-0425012046b01060482046b0106048590a21211b2121592d2cb012435c58
-0cb00425b00425060c6423646164b807085158b00425b00425012046b8ff
-f060482046b8fff06048590a21211b2121592d2c4b53234b515a58b03a2b
-1b2121592d2c4b53234b515a58b03b2b1b2121592d2c4b53234b515ab012
-435c5a58381b2121592d2c0c8a034b54b00426024b545a8a8a0ab012435c
-5a58381b2121592d2c4b5258b00425b0042549b00425b00425496120b000
-5458212043b0005558b00325b00325b8ffc038b8ffc038591bb040545820
-43b0005458b00225b8ffc038591b2043b0005458b00325b00325b8ffc038
-b8ffc0381bb00325b8ffc03859595959212121212d2c462346608a8a4623
-20468a608a61b8ff8062232010238ab902c202c28a70456020b0005058b0
-0161b8ffba8b1bb0468c59b0106068013a2d2cb1020042b123018851b140
-0188535a58b910000020885458b202010243604259b12401885158b92000
-0040885458b2020202436042b12401885458b2022002436042004b014b52
-58b2020802436042591bb940000080885458b202040243604259b9400000
-8063b80100885458b202080243604259b94000010063b80200885458b202
-100243604259b94000020063b80400885458b20240024360425959595959
-2d2cb0024354584b53234b515a58381b2121591b21212121592d00000001
-00000005028fa58dc35f5f0f3cf5081b080000000000a2e3272a00000000
-c14fd713faaffd671000080c00000009000100010000000000010000073e
-fe4e00431000faaffa7a1000000100000000000000000000000000000d35
-06000100000000000239000002390000023900b002d7005e047300150473
-0049071d0077055600580187005a02aa007c02aa007c031d004004ac0072
-023900aa02aa0041023900ba0239000004730055047300df0473003c0473
-00560473001a047300550473004d047300610473005304730055023900b9
-023900aa04ac007004ac007204ac00700473005a081f006f0556fffd0556
-009605c7006605c7009e055600a204e300a80639006d05c700a4023900bf
-04000037055600960473009606aa009805c7009c063900630556009e0639
-005805c700a10556005c04e3003005c700a105560009078d001905560009
-0556000604e300290239008b023900000239002703c100360473ffe102aa
-00590473004a0473008604000050047300460473004b0239001304730042
-0473008701c7008801c7ffa20400008801c7008306aa0087047300870473
-0044047300870473004802aa00850400003f02390024047300830400001a
-05c700060400000f040000210400002802ac0039021400bc02ac002f04ac
-00570556fffd0556fffd05c70068055600a205c7009c0639006305c700a1
-0473004a0473004a0473004a0473004a0473004a0473004a040000500473
-004b0473004b0473004b0473004b023900bd023900230239ffe502390009
-047300870473004404730044047300440473004404730044047300830473
-0083047300830473008304730049033300800473006b0473001b04730051
-02cd006d044c000104e3009905e5000305e50003080000e102aa00de02aa
-003d0464004e080000010639005305b4009a0464004e0464004d0464004d
-0473fffd049c00a003f4003805b4007a069600a1046400000231000002f6
-002f02ec002d0625007f071d004404e3008104e3009e02aa00e804ac0072
-046400540473002e0464003304e5001a047300860473008c080000ef0556
-fffd0556fffd0639006308000081078d00520473fffc0800000002aa0053
-02aa004701c7008001c7006c0464004e03f4002f04000021055600060156
-fe390473ffe402aa005c02aa005c040000170400001704730049023900b9
-01c7006c02aa0047080000250556fffd055600a20556fffd055600a20556
-00a20239008d0239ffe00239000402390015063900630639006306390063
-05c700a105c700a105c700a1023900c602aa001902aa000602aa001d02aa
-002e02aa00e502aa00a202aa006b02aa003a02aa004b02aa002804730000
-01c700030556005c0400003f04e3002904000028021400bc05c7fffd0473
-004905560006040000210556009e0473008704ac007204ac00a102aa006b
-02aa001902aa002106ac006b06ac006b06ac0021047300000639006d0473
-0042023900b10556005c0400003f05c700660400005005c7006604000050
-04730046046bffe102aa00ee0556fffd0473004a0556fffd0473004a05c7
-009e04eb004705c7fffd055600a20473004b055600a20473004b04730096
-01c7004204730096025500880473009a02ac008305c7009c0473008705c7
-009c04730087063900630473004405c700a102aa008505c700a102aa003c
-0556005c0400003f04e300300239002404e300300300002305c700a10473
-008305c700a10473008304e300290400002804e3002904000028046800a4
-063900600662005504a00048047400480391006204f000440329002e0530
-0048046bffe1040000b002eb005208c000330800004f040000990800004f
-040000990800004f040000980400009807d5016a05c0009e04ab007204d5
-009d04ac007104d5022204d5010505abffe9050001c905ab027e05abffe9
-05ab027e05abffe905ab027e05abffe905abffe905abffe905abffe905ab
-ffe905ab01c005ab027e05ab01c005ab01c005abffe905abffe905abffe9
-05ab027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab
-01c005ab01c005abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905abffe905abffe905ab02d605ab006605abffea05d5ffff04d50092
-0800000007eb013007eb012007eb013007eb012004d500b204d5008004d5
-002a082b0198086b01b807550010060000f40600006f0440003a05400037
-04c0003f04150040040000250600005505e100bf038d008904d5ffd90180
-008002d50086071500610296000f04d5009202d6008302d6008304d500b2
-02d600700556fffd0473004a05c700660400005005c70066040000500556
-00a20473004b055600a20473004b055600a20473004b0639006d04730042
-0639006d047300420639006d0473004205c700a40473008705c7001f0473
-00060239ffce0239ffce0239ffe40239ffe40239fff60239fff50239004b
-01c700190400003701c7ffa20556009604000088040000860473009601c7
-fffa05c7009c0473008705c900a50473008b063900630473004406390063
-0473004405c700a102aa006b0556005c0400003f04e300300239000c05c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-078d001905c70006055600060400002101c700890556fffd0473004a0800
-0001071d00440639005304e30081023900b9078d001905c70006078d0019
-05c70006078d001905c70006055600060400002101c7008a02aaffe10473
-001b04cd005a06ac006b06ac002206ac002206ac004a02aa00e202aa006b
-02aa00de02aaffea0557ffff0646ffa706b4ffa80312ffa80632ffa706d8
-ffa70605ffa701c7ff780556fffd055600960558fffe055600a204e30029
-05c700a4023900bf055600960558000b06aa009805c7009c0533006d0639
-006305c700a40556009e04f2009404e30030055600060556000906af007f
-05fb0061023900040556000604a00048039100620473008b01c7006b0460
-0088049a008c04000019038700480473008b0473005c01c7008904000086
-04000018049c00a00400001a0395005c04730044048d008303db00560460
-00880433001105b4007a063f005701c7ffc9046000880473004804600088
-063f0057055700a206eb0032045500a105c000640556005c023900bf0239
-0004040000370875000d081500a406d5003104a900a10515000a05c000a0
-0556fffd054000a705560096045500a1056b0000055600a20763000704d5
-004e05c000a105c000a104a900a10540001206aa009805c700a406390063
-05c000a00556009e05c7006604e300300515000a061500520556000905eb
-009f05550057075500a1078000a106550000071500a8054000a505c00055
-081500a405c7001a0473004a0495005b0440008802eb008804ab00000473
-004b055afffb03ab003204780087047800870380008604ab00180580008c
-046b00880473004404550088047300870400005003aa0026040000210695
-004b0400000f0495008a042b0045066b008d0695008d0500002805c0008b
-042b008404150030060000890455001f0473004b0473000002eb00890415
-004b0400003f01c700880239000901c7ffa2074000130680008304730000
-0380008604000021046b008803e900a1034a008808000041089500a00585
-002d000001010000001e0000003100000031000001010000007e0000007e
-0000008c0000008c000001010000001000000101000001210310007d0000
-008c023300d20000030b0000ff04023900b9048100690456003203310019
-0411002d04d1009601f9009b030f005f04ca009b04b8008c01f9009b0413
-002803b0005003b4003c04ca009b04cf005001f9009b02d2003c0498005a
-043c00190488006e045f007303b1001903d4000a0466009604130028058e
-00640524002803f2009b03f2009b03f2009b01e3005a0356005a0686009b
-01f9ffac041300280413002803b4ff5703b4ff570448002d058e0064058e
-0064058e0064058e00640481006904810069048100690456003203310019
-0411002d04d10096024b0000034a000004b8008c024b00000413002803b0
-005003b4003c04cf005002d2003c0498005a0488006e045f007303d4000a
-0466009604130028058e00640524002801f9009b0456003203b00050045f
-0073049b003c0000ffdc0000ff250000ffdc0000fe51028d00ab028d00a0
-02da0043034d007901a8ffba000000460000004600000046000000460000
-00480000004600000046000000460435017c0435012e043500b704350081
-0435012c043500be043500af043500810435009a043500db04350085028d
-00c1043500b3060001000600010002420036060001000435009e04350098
-043500cb0600010006000100060001000600010006000100000000460600
-010006000100060001000600010006000100060001000600010006000100
-051bffba06000100060001000600010005b5003a05b5003a01f4ffba01f4
-ffba060001000600010006000100060001000481003604350036043dffba
-043dffba03e9004a03e9004a067f0014077600140327ffba041effba067f
-0014077600140327ffba041effba051b003204b500240300fff706000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010000000030
-0000004600000046000000400000004606000100060001000000ffdc0000
-fe510000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ff160000ff160000ffdc0000ff160000ffdc0000ff200000ffdc0473
-004a08000000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010006000100028d
-007f028d005d0600010004ee0015034d007901a8000e01d6ffdc01a80056
-01d60010037500320375003201a8002d01d60013051b003204b5002401f4
-ffba01f4ffba01a8009301d6001305b5003a05b5003a01f4ffba01f4ffba
-024200000300fff705b5003a05b5003a01f4ffba01f4ffba05b5003a05b5
-003a01f4ffba01f4ffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba02b3
-005f02b3005f02b3005f02b3005f03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba08c9003e08c9003e06c5ffba06c5ffba08c9003e08c9003e06c5ffba
-06c5ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7
-ffba04a7ffba045a002a039a00360435ffba0327ffba045a002a039a0036
-0435ffba0327ffba064f0027064f00270224ffba021affba04a7004604a7
-00460224ffba021affba04cf002d04cf002d0327ffba0327ffba040d0047
-040d004701a8ffba01a8ffba02b4002302b400230327ffba0327ffba0435
-00450435004501f4ffba01f4ffba024200360300fff7039affba0327ffba
-0375003203750032051b003204b50024051b003204b5002401f4ffba01f4
-ffba045a004004ce0049045a002604ce0039045a005304ce004a045a0053
-04ce004a0600010006000100000000460000004606000100060001000600
-010000000046000000460600010006000100000000480000004606000100
-060001000600010000000046000000460000004600000046000000400000
-003006000100000000460000004606000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d00ca028d00c7028d
-00c606000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000100ffba0800ffba1000ffba06dc0063053f004406d5
-00a1055b00830000fddc0000fc2f0000fca60000fe540000fcd70000fd73
-0000fe290000fe0d0000fd110000fc670000fd9d0000fbf50000fc720000
-fed50000fed50000ff02041b00a006ac006b06ac00190000feb60000fd73
-0000fe080000fca60000fe530000fd110000fbc80000faf40000faaf0000
-fc720000fbaa0000fb6a0000fcf10000fc7d0000fbdd0000fcc10000fb98
-0000fdea0000fe840000fdc20000fcf10000fd5f0000fe760000febc0000
-fceb0000fd6c0000fd580000fc900000fd150000fc2c0000fc130000fc12
-0000fb960000fb9601c700880556fffd0473004a0556fffd0473004a0556
-fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473004a
-0556fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473
-004a0556fffd0473004a0556fffd0473004a055600a20473004b055600a2
-0473004b055600a20473004b055600a20473004b055600a20473004b0556
-00a20473004b055600a20473004b055600a20473004b0239006301c7001f
-023900ba01c7007c06390063047300440639006304730044063900630473
-004406390063047300440639006304730044063900630473004406390063
-0473004406dc0063053f004406dc0063053f004406dc0063053f004406dc
-0063053f004406dc0063053f004405c700a10473008305c700a104730083
-06d500a1055b008306d500a1055b008306d500a1055b008306d500a1055b
-008306d500a1055b00830556000604000021055600060400002105560006
-040000210556fffd0473004a0239ffe201c7ffb0063900630473004405c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-05c700a1047300830000fefe0000fefe0000fefe0000fefe0455fffd02eb
-000c07630007055afffb04a900a10380008604a900a10380008605c700a4
-046b00880473fffd040000140473fffd04000014055600090400000f0555
-0057042b0045055500a10473008706050063047300550639006004730044
-05b5003a01f4ffba0224ffba021affba04a7004601f4009e01f4001001f4
-001b01f4001001f4006b01f4fff90227ffce0000000f0000fff502aa00a4
-02aa00a40000000e00000056000000560000ffcf01a8000f01d6ffbf01a8
-fff501d6ffcd01a8001d01d6fff501a8009301d600130375003203750032
-0375003203750032051b003204b5002405b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba
-01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4
-ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a
-01f4ffba01f4ffba0481003604350036043dffba043dffba048100360435
-0036043dffba043dffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba0481
-003604350036043dffba043dffba02b3003202b3003202b3005f02b3005f
-02b3005f02b3005f02b3003202b3003202b3005f02b3005f02b3005f02b3
-005f02b3005f02b3005f02b3003802b3003802b3004902b3004903e9004a
-03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9
-004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba0692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba08c9003e08c9003e06c5ffba06c5ffba04a7ffba04a7ffba045a
-002a039a00360435ffba0327ffba064f0027064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba064f0027064f00270224
-ffba021affba064f0027064f00270224ffba021affba064f0027064f0027
-0224ffba021affba04a7004604a7004604a7004604a70046093e0032093e
-00320740ffba0740ffba067f0014077600140327ffba041effba04cf002d
-04cf002d0327ffba0327ffba04cf002d04cf002d0327ffba0327ffba04cf
-002d04cf002d0327ffba0327ffba067f0014077600140327ffba041effba
-067f0014077600140327ffba041effba067f0014077600140327ffba041e
-ffba067f0014077600140327ffba041effba067f0014077600140327ffba
-041effba040d0047040d004701a8ffba01a8ffba040d0047040d004701a8
-ffba01a8ffba040d0047040d004701a8ffba01a8ffba040d0047040d0047
-01a8ffba01a8ffba043500450435004501f4ffba01f4ffba043500450435
-00450435004504350045043500450435004501f4ffba01f4ffba04350045
-043500450481003604350036043dffba043dffba024200360300fff7031a
-001a031a001a031a001a0375003203750032037500320375003203750032
-037500320375003203750032037500320375003203750032037500320375
-0032037500320375003203750032051bffba04b5ffba051b003204b50024
-01f4ffba01f4ffba0375003203750032051b003204b5002401f4ffba01f4
-ffba051b003204b50024067f0045067f0045067f0045067f004501a80028
-0000fe290000fea20000ff300000ff1d0000ff120000ff920000fe7e08fc
-003208ad00320000ffb50000ffb60000feed0000ff640000fe7e0000ff9f
-018d000002f6fffd0000fe820000ff1004cd00320000ff580000ff580000
-ff640692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba045a002a039a00360435ffba0327ffba034d007902b400230242
-003601f4ffba0290ffba01f4002f01f4003b01f4001201f400b101f4006d
-067f00140776001401f9009b0000fed902bc000003f2009b045afff504ce
-fff5045a005304ce004a045a005304ce004a045a005304ce004a045a0053
-04ce004a045a005304ce004a045a005304ce004a04350071043500ad045a
-000f04ce000f0473001406110014054000a7047300860540000a0473000a
-05c7005105c700660400005005c7fffd067a00140540004a047300460474
-00480556006e04d5005304e3ffc40639006d04fe000f070c008701c70083
-0239001f055600960400008801c7001504000018072000a405c7ffb80473
-008b0639006006f200630557004406090014047300860556009e0556006b
-0400004f04f20094030b00440239002404e300140239002404e3003005fb
-006105c700a1062e00140400002104e300290400002804e3002904e30031
-045c0044045c003f0473003c0473005503ab003203e50024047300870214
-00bc034e00bc04ac0072023900b00aaa009e09c7009e08640046087f0096
-06aa0096039c008309c7009c078e009c062b0087047300550556fffd0473
-004a0000fefe0556fffd0473004a08000001071d00440639006d0473001a
-0639006d0473004205560096040000880639006304730044063900630473
-004404e30029045c004c01c7ffa20aaa009e09c7009e086400460639006d
-04730042084600a404f2009e05c7009c047300870556fffd0473004a0556
-fffd0473004a055600a20473004b055600a20473004b0239ff8a0239ff64
-023900040239fff60639006304730044063900630473004405c700a102aa
-ffcc05c700a102aa006805c700a10473007605c700a1047300830556005c
-0400003f04e3003002390024045c0051037e001305c700a40473008705a6
-00a404d6005e0486005e04e30029040000280556fffd0473004a055600a2
-0473004b06390063047300440000fefd0639006304730044063900630473
-004406390063047300440556000604000021047300570473004804730086
-04730086040000130400005004730046047300460473005505e9005503ab
-004903ab0032050d0032040f00440239ffb9047300420473004204780050
-0402001904ef00190473008b047300870473008701c7001901c7008901c7
-0089029e0000026e001401c700830493008306aa008406aa008406aa0087
-0473ffa60473008b046c00870473004406530044063f00570466004402aa
-ffe402aaffe402aaffe402aa008502aa008502aa008502aaffe40455008a
-0455008a0400003f01c7ffa20214ffb901c7ff7202cb00000239000f0239
-002404730019048c0044046000880400001a05c700060400001804280019
-0400002804540028045c004c045c00790400002404000050040000240400
-00500639006304400088040f004904780050046b0088032e000004000008
-033b008804730048040000240400005007b7004607400046080b004605b3
-0024036f002405c00024061c0013054a0083050f008303e2001e04380063
-03110064031100640146ffce01eb006401eb000001eb000002ea006403d9
-0000029100000187005a02d7005e01c7008001c7006c01c7008a02aa00fb
-02aa00fb02ca003202ca003204ac007004ac007004ac006504ac006502aa
-012102aa00de02aa005902aa012102aa001d02aa005902aa00de023900b6
-023900b602aa00fb02aa00fb02aa00a602aa00a602aa00a602aa001d02aa
-ffe202aafffb029400000142006402b8003202a0000002ca003203100096
-0310009603100096031000960310009602aa006202aa006202aa002802aa
-001d02aa0047045700960457009604570096045700960457004304570043
-045700430457004304570043031000430457002f0457002f0457002f0457
-002f0457002f0310002f0457002504570025045700250457002504570025
-0310002f0457001a0457001a0457001a0457001a0457001a0310001a0457
-004204570042045700420457004204570042031000420457009604570096
-045700960457009604570042045700420457004204570042045700420310
-00420457002f0457002f0457002f0457002f0457002f0310002f0457002f
-0457002f0457002f0457002f0457002f0310002f04570026045700260457
-002604570026045700260310002604570042045700420457004204570042
-045700420310004204570096045700960457009604570096045700420457
-004204570042045700420457004203100042045700260457002604570026
-045700260457002603100026045700230457002304570023045700230457
-0023031000230457002f0457002f0457002f0457002f0457002f0310002f
-0457004b0457004b0457004b0457004b0457004b0310004b045700960457
-009604570096045700960457004204570042045700420457004204570042
-031000420457001a0457001a0457001a0457001a0457001a0310001a0457
-002404570024045700240457002404570024031000240457002f0457002f
-0457002f0457002f0457002f0310002f0457004e0457004e0457004e0457
-004e0457004e0310004e045700960457009604570096045700960000fec1
-0000fec60000fdac0000fed80000ff920000fee90000ff4c0000fea00000
-fec40000ffce0000ff660000fea00000fed80000fed80000ff970000ff98
-0000ff990000fff40000ff420000ff420000ff440000ff5f0000fe870000
-ffec0000ffa60000ff510000ff510000ff510000fec90000ff1c00000000
-0000fee90000ff4c0000ff930000ff2a0000ff560000ffce0000fe870000
-febb0000fec40000fec40000fed80000fed80000feb30000fec90000fdad
-0000fdac0000feb30000fec90000fdad0000fe160000fee60000ffa60000
-fe870000ff440000feba0000ff230000ff9a0000fdac0000fe8800000000
-0000feb00000ff980000fe930000ffa60000fe870000fdac0000ff660000
-ff440000feb00000feb00000feb00000ff030000ff520000fd1f0000ff53
-0000ff530000ff530000feb50000feb50000ffc30000feae0000fedc0000
-fec70000fec80000fedc0000fe1e0000ff420000ff510000feb70000feb0
-02aa00de02aa005902aa00fa049a008c04600088062e001407aa0000062e
-0014047b004c063f005704cf0044063900630473004405c7006604000050
-04e300a8033b008804ff0000043c0032060d000a049d0042072000a406aa
-0084056500630473008b056400a40400000a0556006b0556006b04e00005
-04c5001905e5005f046e004403b600140347002804cf00440495005b0400
-005001c7ffa2063900600389004d03890050055600a205c000a10473004b
-047800870ab4006d04fe00100639001404e70014079900bf05b500880558
-000b0400001a072e00bf0590008806a10078057b007a086d00bf06f00088
-04d5006603ab001f065f0039058200480639006004730044066d0009050c
-001a066d0009050c001a0b010063091c004406aa005c04e600440987006d
-06d000500000fe370ab4006d04fe001005c7006604000050040700140000
-fea60000febc0000feaa0000fead0000fc2b0000fc4c05c000a104780087
-05400004042b00140556009e04730087055d00a40464008804d5004e03ab
-003204a900040380000005ef002904490028070900a4052f0088091800a0
-06f6008806060066042b005005c700660400005004e3003003aa00260767
-00310587002605550057042b004506e4000a0554000a06e4000a0554000a
-023900bf07630007055afffb055700a1046800860540001204ab001805c7
-00a4046b008805c700a4046b008805550057042b004506aa00980580008c
-02aa002e0556fffd0473004a0556fffd0473004a08000001071d00440556
-00a20473004b060500630473005507630007055afffb04d5004e03ab0032
-04d5004e045c004c05c000a10478008705c000a104780087063900630473
-0044063900600473004405c0004a0415002b0515000a040000210515000a
-040000210515000a0400002105550057042b0045071500a805c0008b0540
-004a0473004607bf004a0703004607a6006606860053054d006604130053
-07c3001207470018084600a4070700880639006d0478005005f900300553
-00260000ff430000fec90000ff770000ffb00000ff470000ff560000ff74
-0000fed70000feac000000000000ff520000ff56000000000000feac0000
-fd9a000000000000ff6a0000ff7c0000ff690000ff560000feac0000ff7f
-0000ff560000fdef0000ff430000ff690000ff7c000000000000fdae0000
-ff8c000001020000fefe0000fefe0000fedf0000fedf0000ff580000ff20
-0000fefe0556fffd0473004a055600960473008605560096047300860556
-00960473008605c700660400005005c7009e0473004605c7009e04730046
-05c7009e0473004605c7009e0473004605c7009e04730046055600a20473
-004b055600a20473004b055600a20473004b055600a20473004b055600a2
-0473004b04e300a8023900130639006d0473004205c700a40473008705c7
-00a40473008705c700a40473008705c700930473006805c700a404730087
-0239ffdf01c7ff9202390020023900060556009604000088055600960400
-008805560096040000880473009601c7007e0473009601c7ffb904730096
-01c7ffa50473009601c7ffa306aa009806aa008706aa009806aa008706aa
-009806aa008705c7009c0473008705c7009c0473008705c7009c04730087
-05c7009c0473008706390063047300440639006304730044063900630473
-004406390063047300440556009e047300870556009e0473008705c700a1
-02aa008505c700a102aa008505c700a102aa005e05c700a102aa00260556
-005c0400003f0556005c0400003f0556005c0400003f0556005c0400003f
-0556005c0400003f04e300300239002404e300300239002404e300300239
-ffff04e300300239000e05c700a10473008305c700a10473008305c700a1
-0473008305c700a10473008305c700a104730083055600090400001a0556
-00090400001a078d001905c70006078d001905c70006055600090400000f
-055600090400000f055600060400002104e300290400002804e300290400
-002804e3002904000028047300870239000305c70006040000210473004a
-01c7008904a0004804a0004804a0004804a0004804a0004804a0004804a0
-004804a000480556fffd0556fffd06820013068200130682001306820013
-068200560682005603910062039100620391006203910062039100620391
-0062061e0000061e0000076c0000076c0000076c0000076c00000473008b
-0473008b0473008b0473008b0473008b0473008b0473008b0473008b068f
-0000068f0000081f0000081f0000081f0000081f0000081ffff3081ffff3
-01c7008101c7008101c7ff9b01c7ff9b01c7ffeb01c7ffeb01c7ffa201c7
-ffa20301000003010000049100000491000004910000049100000491fff3
-0491fff3047300440473004404730044047300440473004404730044069d
-0000069d0000082d0000082d000007c9000007c900000460008804600088
-0460008804600088046000880460008804600088046000880682000007ae
-00000812000007ae0006063f0057063f0057063f0057063f0057063f0057
-063f0057063f0057063f0057065f0000065f000007ef000007ef0000078b
-0000078b0000078bffff078bffff04a0004804a000480391006203910062
-0473008b0473008b01c7ffe601c700680473004404730044046000880460
-0088063f0057063f005704a0004804a0004804a0004804a0004804a00048
-04a0004804a0004804a000480556fffd0556fffd06820013068200130682
-00130682001306820056068200560473008b0473008b0473008b0473008b
-0473008b0473008b0473008b0473008b068f0000068f0000081f0000081f
-0000081f0000081f0000081ffff3081ffff3063f0057063f0057063f0057
-063f0057063f0057063f0057063f0057063f0057065f0000065f000007ef
-000007ef0000078b0000078b0000078bffff078bffff04a0004804a00048
-04a0004804a0004804a0004804a0004804a000480556fffd0556fffd0556
-fffd0556fffd0556fffd02aa00e502aa00fd02aa00e502aa000602aa0006
-0473008b0473008b0473008b0473008b0473008b068200000682000006f3
-000006f3000005c700a402aa001302aa001302aa000601c7ffbb01c7ffab
-01c7ffca01c7ffca01c7ff9301c7ff930239001a0239fff5036500000365
-000002aa001302aa001302aa000604600088046000880460008804600088
-048d0083048d00830460008804600088055600060556000606e600000718
-0000061e000002aaffea02aaffea02aa0059063f0057063f0057063f0057
-063f0057063f005707650000069d000007270000065f000005fb006102aa
-00de02aa00e50473000d05c7006605c7006606aa008705c70024095000a1
-078d00190556001f04e30030080000290400003004c100660000ff530000
-ff530000ff530000ff5301c7001901c7ffa2042b00050556001105740046
-02cbffa3057a008702f0ffc8057f000a057f000a02aa008402aa008402aa
-00c902aa00c902aa00a002aa005902aaffaf02aa003a02aa0006023900b9
-02aa00a902aa00a902aa00a902aa00a9032e001e032e001e02aa003a0000
-ff730000ffa50000fed80000ff230000ff720000ff720000fee70000ffa5
-0000ff530000ff530000ff530556009e0473008703f8001905fb0019071d
-00440440001904000050046900870469001903eb008703ab003201c70088
-0361004104000088033600100580008c04780087047300440400001304de
-004404de004404de000d078d005003a800440473004404730044042b0084
-0455001f0455001f03aa00260460008804c6004405de004404c600440400
-001a05c700060400002803ab0032036b003f04db001f02eb00880400001a
-04550088042b008405b4007a04ab001803a00000054f0000035100320351
-ffd103980032034800320348003203f80032036e0032015600690284002d
-0366003202d000320415003203710032036f003204180032030f00320359
-0032039c003203760031036f003204fb000002fa003202fa003203040032
-04cc0032030500640305003202f9003202f90032028c0032028c00320304
-00320142006402b6006404950064030f00640305003202d5003203050032
-030500320306006401c20032030f00640342003204950064029200000320
-00000315006402920000030600320385003202bf00000142006401eb0064
-030f0064029200000315006402920000030900320385003202bf000005ed
-00460a660046061300460689ffba0541ffba01e9003c045a00110000ff0d
-0000ff350000fece0000feb70000fec90000ffcf0000ff4f0000ff9e0000
-feca02b3005f02b3005f03e9004a03e9004a039affba0327ffba039affba
-0327ffba05ad0069053d002d05fd009604dc005004e0003c05f6009b053f
-00280650002804ac00720000fe3b0000fe660000fe660473fffc02aa0053
-02d5ffce01a8ffba01a8ffba01a8ffba01a8ffba0658001509c500470400
-000008000000040000000800000002ab0000020000000155000004730000
-02390000019a000000ab00000000000005e5000305c7006606aa00980580
-008c0744008307180046071800480556fffd05c70066040000140473000a
-04e300300400004f0400002804a5001d000001020000ff420000febf0000
-ff3a0000ff53048d000a05c7005105c7006605c70051045500a102eb0088
-0000ff430000ff040000ffac02d200960000ff37021affba0250001e0000
-ff3a0000ff5b0000ff5f0000ff7e0000ff940000ff4a0000fe9c05b5003a
-05b5003a01f4ff9601f4ff9605b5003a05b5003a01f4ffba01f4ffba05b5
-003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba
-05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba0481003604350036043dffba
-043dffba0481003604350036043dffba043dffba02b3003202b3003202b3
-005f02b3005f03e9004a03e9004a0692003e0692003e043fffba043fffba
-045a002a039a00360435ffba0327ffba045a002a039a00360435ffba0327
-ffba045a002a039a00360435ffba0327ffba064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba067f0014077600140327
-ffba041effba067f0014077600140327ffba041effba067f001407760014
-0327ffba041effba02b4002302b400230327ffba0327ffba02b4002302b4
-00230327ffba0327ffba043500450435004501f4ffba01f4ffba04350045
-0435004501f4ffba01f4ffba043500450435004501f4ffba01f4ffba040d
-0047040d004701a8ffba01a8ffba03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0473ff93047300460239ffbf06aa
-ffd50473ffb70473ff9102aaffa402aaffa40400ffff0239ffb904000028
-04730089030b0064047400480649002401c7001901c700190473001e0460
-001e048c000a04730086047300460239001305b400420400008801c7fffc
-06aa00870473008b0473008702aafffb0400003f0318ffa20400001a0400
-000f040000280473004a04730048047300460473004b03ab004903ab0032
-0534005501c700880400001301c7ffa204730083045c004c0304006402d5
-003202c9003302fc0032028c003201d5003201d500000304003203110064
-01420019014200640142006401420019022a000001420064014200090233
-00640493006404930064030fffc9030f0064030e00640305003203000032
-02b800320142ffca01c20032030f001d031a00320306006402d400640292
-000002de003202de003202de003202f4003202ea00320000febc0000febc
-0000ff730000fea9023900b902fa003202f900320305003202a0000002f9
-00320639006d0556fffd0473000f05c7006602aa004104a0004804a00048
-04a0004804a0004804a0004804a0004804a0004804a0004801c7ff9b01c7
-ffab01c7ff9b01c7ffab01c7ff9b01c7ffbb01c7ff9b01c7ffbb04600088
-0460008804600088046000880460008804600088046000880460008801c7
-ffab01c7ffab01c7ffbb01c7ffbb04600088046000880460008804600088
-045a005304ce004a03a000130556001105c700290558000b055600a20473
-004b0400003301c7ffa205e600630473004805c7000002aa000f05560006
-0400002104000013040000500400001301c700830455fffd02eb00010556
-00090400000f055600090400000f04d5005303ab00490540001204ab0018
-0000fec60000fed40000fec60000fed40000fe5f0000fe5f0000ff720000
-ff730000fee7078b000a03eb004c040000130473000a01c700150473fff4
-0556001105c700a1047300190239ff8b05c700a404730087055600960400
-008804e30029040000280400003b049e00a403670088053000480000ff53
-0000ffbc0000fefe0000fefe0000fea40000fea401c70088000000000000
-002a0000002a0000002a0000002a000000d60000017e00000320000005a6
-0000074e000009380000097e000009fe00000aa400000b8400000bec0000
-0c6400000caa00000ce600000d5600000f1200000fee00001218000013f2
-000015520000170c000018e20000198e00001c2200001e5600001eb20000
-1f7000001ff200002062000020e8000021da000023da000025840000271c
-000028560000299e00002a6200002b1800002ca800002dae00002e920000
-2f7a000031b00000323a000035640000370e000038420000394800003b3c
-00003da800004052000041000000422400004398000045d6000048e20000
-4a8800004bc800004c3200004c9c00004d0000004d8800004dbc00004e38
-0000510a000052e80000549c000056500000580e0000596200005b520000
-5cf600005dea00005f020000619a00006296000064c60000668c0000684e
-00006a1200006ba800006cae000070560000717a00007318000075360000
-79a000007bc400007e1c00008004000081020000814e00008250000082f0
-0000833c00008370000083ac000083ee000084540000849a000084ce0000
-85040000853a0000858a000085cc0000861e00008656000086a8000086de
-0000871e000087600000879e000087e800008828000088560000888e0000
-88de00008914000089540000898e000089d200008a1c00008a5800008a88
-00008acc00008b0400008b9400008c1a00008e2800008fbc0000916c0000
-91b80000924c00009470000096c4000098b4000099a000009a2200009a8c
-00009baa00009d0600009f4e0000a0b00000a13e0000a1e80000a2ac0000
-a3f40000a59e0000a68c0000a7520000a7b60000a8240000a94e0000aa72
-0000ab020000ace40000af3e0000b2900000b3860000b42c0000b47c0000
-b5320000b6520000b7f00000b88a0000b94e0000ba0e0000ba760000bab2
-0000bb0a0000bb580000bd700000bfb60000bfee0000c0200000c14a0000
-c2760000c3240000c3c80000c46a0000c53c0000c5900000c5c60000c61e
-0000c7700000c7e20000c83c0000c9b40000cb200000cc000000cc320000
-ccce0000cdf20000d0680000d0a20000d0e60000d1220000d1840000d1c6
-0000d20c0000d2580000d28a0000d2de0000d31c0000d34c0000d38a0000
-d3d00000d4120000d4500000d4d20000d5400000d6260000d6620000d6e2
-0000d7160000d7b80000d8400000d8ac0000d90e0000d97a0000da660000
-db580000db8c0000dbc00000dbf00000dc340000dcac0000de260000e040
-0000e0720000e0ac0000e1a60000e3340000e36a0000e4ce0000e54a0000
-e62a0000e7200000e8b00000ea1a0000ec080000ed040000ed4a0000ed7e
-0000edc00000edfa0000ee4e0000ee960000eee00000ef100000ef400000
-f1280000f1660000f18e0000f1be0000f1f20000f2180000f23e0000f286
-0000f43c0000f5b60000f5dc0000f6020000f6460000f6760000f6a60000
-f6fc0000f7da0000f8ec0000f9300000f9660000f9c00000f9fe0000fa32
-0000fa620000fa9e0000fade0000fb1c0000fb580000fb9a0000fbd00000
-fc0c0000fc4c0000fc720000fc960000fce60000fe420000fe980000fecc
-0000ff1a0000ff660000ffa80000ffe0000100160001005e000101000001
-029c00010464000105e6000107d80001092a00010aae00010b9000010d2a
-00010d9400010dbc00010e5a000110dc0001111c0001115c0001119c0001
-11da000112380001129600011304000113240001140e000114ae000114e4
-000115320001157c000115c6000115e2000115fe0001161e0001163e0001
-165e0001167e000116a4000116ca000116f000011716000117460001176e
-00011796000117c2000117ee000118220001184c00011878000118ae0001
-18d8000119040001193a000119640001198e000119c2000119f200011a26
-00011a6a00011a9a00011ace00011b1000011b4400011b7600011bb80001
-1bec00011c1c00011c5e00011ca200011ce800011d4400011d6000011d7c
-00011d9800011db400011dd000011f3e000121ea0001245a000124760001
-2490000124ac000124c8000124e4000125000001255c0001259600012600
-000126ca0001276a00012840000128c000012948000129b800012a4e0001
-2aac00012af200012b5000012bb200012c6a00012d2800012d5400012db0
-00012df400012f60000130540001307e0001309a000130c6000130fe0001
-314a0001318a000131be000131ee0001321e0001324e00013292000132c2
-000132f2000133320001336200013392000133c200013402000134320001
-346200013492000134b8000136bc000136ec0001371c0001386c00013a22
-00013a5200013a8000013ab000013ade00013b0e00013b3c00013b600001
-3b8400013bb400013d2400013d5c00013d8c00013f1e00013f4c00013f7a
-00013fa800013fd00001412e000142c6000142fe0001433e0001437a0001
-43aa000143d8000143f4000144240001445400014544000146ac000146dc
-000147160001475600014786000147b6000147f80001481e000148440001
-4884000148c4000148f40001493400014a1e00014a9e00014b8200014bb2
-00014be200014c1200014c4200014c7e00014cb000014ce200014d120001
-4d4200014d8800014dba00014dea00014e2000014e9200014ec600015094
-000151960001532600015556000157a6000159380001599c00015a260001
-5a3600015ac400015cc200015dee00015f5a0001604a000161ce000163e8
-000166140001670600016716000167260001683e0001684e0001685e0001
-686e0001687e0001688e000169ac000169bc000169cc00016a4000016a50
-00016b2000016b3000016c4200016c5200016c6200016c7200016dd00001
-6fae00016ff0000170260001705c0001708c000170bc0001711000017138
-000172c20001740a0001755e000176c60001784a000178ae00017a400001
-7b5c00017b6c00017b7c00017d0200017d1200017e7800017fd200018106
-00018264000183d200018598000185d800018610000186460001866c0001
-869c000186c200018838000188680001899e000189ae000189be00018a00
-00018a1000018ba400018d5000018eda00018f0200018f320001908e0001
-909e000191d6000191e600019280000193e0000193f000019656000197e0
-000199480001997800019aee00019c2000019c3000019c4000019c500001
-9d2a00019d3a00019d4a00019d5a00019e5200019fcc00019fdc0001a104
-0001a2380001a38a0001a51e0001a63c0001a7c80001a8da0001a9100001
-ab460001abe60001abf60001ad8c0001af2e0001afb20001b1340001b144
-0001b3ac0001b52c0001b6ac0001b6dc0001b87c0001ba020001bbc60001
-bcf20001bd020001be320001be420001be520001bf120001bf220001c108
-0001c1180001c24e0001c35c0001c5080001c6be0001c8000001c9700001
-cab80001cb0a0001ccec0001ce680001cea60001d04c0001d0700001d1b0
-0001d1c00001d1d00001d2080001d2180001d3a40001d50c0001d6800001
-d6a40001d6d40001d8420001d8f40001d9b20001d9e00001db960001dc8e
-0001dd1c0001de420001def00001dfc40001e00e0001e0860001e1460001
-e16e0001e1b20001e2080001e2e40001e32e0001e3620001e38a0001e3b2
-0001e3e60001e42a0001e46e0001e4ac0001e5ea0001e6a20001e7c20001
-e8380001e9060001e9580001e9ea0001ea9a0001eb8e0001ebe20001ec78
-0001ed360001ee200001eed20001eff20001f0440001f0ee0001f2240001
-f2fc0001f3e20001f4e80001f5ce0001f6b00001f7a40001f8420001f948
-0001fa420001faba0001fb320001fba80001fbde0001fc3a0001fd020001
-fd8e0001fdc60001fe0c0001fe3c0001fea60001ff660001ff9a0001ffca
-0001fffe0002002e0002005e0002008e0002022e00020266000202a60002
-02de00020316000203b2000204ac000204dc00020580000205ae000205ee
-0002063e0002066e000206ba00020852000209b800020b1800020b5e0002
-0bb200020bea00020d5c00020d9200020e2400020e6200020e9000020ece
-00020ffe0002102600021162000211f20002129c0002131e000213da0002
-14f20002160000021634000216ba0002181600021898000218e2000219ec
-00021a3400021b3800021bb400021c0c00021c9000021d7a00021e900002
-1f8c0002203600022126000221f8000222e2000223ca0002247a000224fc
-0002275a00022784000227ae0002286600022890000229d200022ad80002
-2bc200022bec00022c1600022c4000022c6a00022c9400022e1400022e3e
-00022e6800022e9200022ebc00022ee600022f1000022f3a00022f640002
-2f9800022fc200022fec0002301600023190000231a0000232ba000232ca
-000232f40002331e00023348000233720002351c00023738000238660002
-3876000239f200023a0200023b4800023d1400023e1a00023f9a0002413a
-0002435e000244b80002469a000247de0002490c000249fa00024a240002
-4a4e00024a7800024aa200024acc00024af600024b2000024b4a00024b74
-00024b9e00024bc800024bf200024c1c00024c4600024c7000024eac0002
-50280002516c000253540002549c000254c6000254f00002552000025550
-000255a0000255f000025630000256a2000256f600025754000257aa0002
-57e00002582200025868000258b2000258e20002591a0002594a00025a82
-00025dc800025df200025e1c00025e4600025e7000025e9a00025ec40002
-5eee00025f1800025f4200025f6c00025f9600025fc000025fea00026014
-0002603e0002606800026092000260bc000260e6000261100002613a0002
-61640002618e000261b8000261e20002620c0002623600026260000262fe
-000263140002633e0002661e0002662e000267480002686a000269a80002
-6aea00026c9000026ca000026de200026f3200027122000272f60002740e
-0002741e000274a00002752e0002762e0002763e000276de000276ee0002
-78040002795600027a8600027a9600027b6400027b7400027cea00027cfa
-00027e0e00027e1e00027f52000280e8000281a4000281b4000282b20002
-840c00028498000284a8000285d20002875e0002881a0002882a000288c6
-000288d6000289a4000289b400028a8c00028a9c00028ba400028bb40002
-8d7a00028d8a00028ee200028ef20002915c0002916c0002936600029376
-000294e0000294f0000295e0000295f00002978800029798000298b60002
-98c600029a0600029a1600029a2600029a3600029bae00029bbe00029bce
-00029bde00029d3000029e7e00029f4c0002a0300002a1b00002a3320002
-a4320002a5460002a68a0002a69a0002a7880002a8620002a9fe0002aa0e
-0002ab2c0002ac320002ae300002ae400002ae500002ae600002afaa0002
-afba0002b0720002b0820002b1900002b1a00002b28c0002b29c0002b3ba
-0002b3ca0002b4680002b4780002b4880002b5760002b6ea0002b8160002
-b9100002b9200002b9300002b9400002bade0002bc980002bd660002bd76
-0002bfd60002c21c0002c4a20002c7060002c98a0002cbfc0002cdcc0002
-cf820002cfac0002cfd60002cfe60002cff60002d0200002d04a0002d074
-0002d0840002d0940002d0be0002d0e80002d0f80002d1080002d1320002
-d15c0002d1860002d1960002d1a60002d1b60002d1c60002d1d60002d1e6
-0002d2100002d2200002d2300002d25a0002d2840002d2ae0002d2d80002
-d3020002d32c0002d3560002d3800002d3aa0002d3d40002d3fe0002d428
-0002d4520002d47c0002d4a60002d4d00002d4fa0002d5240002d54e0002
-d5780002d5a20002d5cc0002d5f60002d6200002d64a0002d6740002d69e
-0002d6c80002d6f20002d71c0002d7460002d7700002d79a0002d7c40002
-d7ee0002d8180002d8420002d86c0002d8960002d8c00002d8ea0002d914
-0002d93e0002d9680002d9920002d9bc0002d9e60002da100002da3a0002
-da640002da8e0002dab80002dae20002db0c0002dbac0002dbf00002dc66
-0002dc900002dcba0002dce40002dd0e0002dd380002dd620002dd8c0002
-ddb60002dde00002de0a0002de340002de5e0002de880002deb20002dedc
-0002df060002df300002df5a0002df840002dfae0002dfd80002e0020002
-e02c0002e0560002e08a0002e0be0002e0f20002e2840002e4200002e5bc
-0002e7480002e78e0002e7d40002e8420002e89e0002e8f00002e9600002
-ea380002eb040002ebdc0002eca80002ed480002ee620002ef160002ef98
-0002eff20002f0320002f1500002f29a0002f4320002f48e0002f4ec0002
-f5480002f5a40002f6580002f70e0002f7ba0002f8660002f9120002f9ca
-0002fa820002fb3a0002fb4c0002fb5e0002fb700002fb820002fb940002
-fc020002fc700002fd280002fd3a0002fd4c0002fd5e0002fd6e0002fd80
-0002fd920002fda40002fdb60002fdc80002fdda0002fe880002ff340002
-ffe20003008e00030126000301600003018a000301b4000302080003025a
-000302d6000303200003039c000303f000030474000304c60003053c0003
-0594000305fa00030650000306aa0003072800030774000307d200030836
-00030884000308d20003092a000309720003099c000309ca000309f00003
-0a2400030a5400030a8400030ad600030b4400030b9a00030c0e00030c62
-00030cd600030d1c00030d8400030dca00030e2600030e5600030e900003
-0eb600030ee600030f0c00030f3200030f6400030f9400030fe60003104c
-000310a2000311080003115c000311ca0003120c0003126c000312ae0003
-12fa0003133400031370000313aa000313e60003141a0003144c0003147c
-000314ac000314d6000314fc00031526000315540003157e000315ca0003
-160e0003164400031680000316b4000316e200031720000317500003178a
-000317b4000317e2000318080003182e0003185a000318b6000318e60003
-1916000319460003197e000319b2000319e000031a1000031a4000031a70
-00031aa000031ad400031b2a00031b5e00031bbe00031bf200031c4a0003
-1c7e00031cda00031d7800031e4600031f660003202e000320be00032154
-000323400003253c000326b400032830000329da00032b8c00032c740003
-2daa00032ea200032fb4000330d20003320800033372000334e000033676
-000337f2000339020003391200033a3e00033b7a00033cbc00033e400003
-3f1a00033f9000034046000340ec0003425c000342940003430e000343d0
-0003448a000344f2000345f80003472e000347fa00034958000349d20003
-4a4c00034b1800034bd200034c8600034ce200034d3c00034d8400034df4
-00034e7000034eba00034ef400034f3a00034f7e00034fd0000350220003
-50a40003512600035168000351a8000351de000352140003524200035270
-000352a4000352d80003531a0003535c00035398000353d40003540e0003
-54480003547a000354ac000354de000355100003554a00035584000355c6
-000356080003564a0003568c000356da000357280003576a000357ac0003
-57ec0003582c00035866000358a0000358ec0003593800035976000359b6
-000359fc00035a4200035a7e00035ad400035b1000035b4c00035b8c0003
-5bcc00035c0800035c4400035c8400035cc400035d0800035d4c00035da0
-00035e2e00035e7000035eb200035f1a00035f8200035fb400035fe60003
-601e00036056000360ec00036182000361cc00036216000362520003628e
-000362e40003633a00036384000363ce000364260003647e000364be0003
-64fe000365360003656e000365b800036602000366400003667e000366c0
-0003670200036756000367aa000367f0000368360003687c000368c20003
-69180003696e000369c400036a1a00036a6600036ab200036afe00036b4a
-00036bbe00036c3200036ca600036d1a00036d5800036d9600036dd40003
-6e1200036e5000036e8e00036ed200036f1600036f6200036fae0003700e
-0003705a00037098000370e6000371f60003724600037296000372ce0003
-73060003735c000373b2000374260003748a000374cc0003750e00037564
-000375b2000375fe0003764a0003768a000376ca000377120003775a0003
-77c6000378200003785800037890000378d000037910000379e000037adc
-00037b9c00037c8a00037ce000037d3600037d8800037ddc00037e400003
-7ea400037efa00037f5000037fc60003803c0003807e000380c000038102
-0003814400038186000381c80003821e00038274000382c60003831a0003
-83a200038424000384c400038566000385a4000385e2000386200003865c
-0003869a000386d80003871600038752000388360003892200038a380003
-8b5400038c1e00038ce800038de200038edc00038fda000390d8000391f6
-000393140003943a000395600003966200039764000397f6000398880003
-98c6000399040003995e000399b8000399f000039a2800039b3800039b48
-00039b9000039bd800039c3000039c8800039cba00039cec00039d2e0003
-9d7000039daa00039de400039e2800039e6c00039ee400039f5e00039fee
-0003a0320003a0720003a0f40003a1760003a2ce0003a2de0003a32c0003
-a37a0003a3b60003a3f20003a4380003a47e0003a4cc0003a51a0003a56a
-0003a5ba0003a6160003a6720003a7e80003a9500003a9880003a9c20003
-aa0e0003aa5a0003aaac0003aafe0003ab500003aba60003abe20003ac1e
-0003ac740003acc80003ae000003aea00003aeee0003af2e0003af680003
-b0fe0003b3820003b4460003b5dc0003b73a0003b8080003b9ae0003bc02
-0003be3a0003be800003beb20003bf5c0003c0800003c0a40003c13e0003
-c24a0003c35a0003c46a0003c5780003c6fe0003c7300003c7d20003c7fa
-0003c85c0003c8be0003c9200003c9820003c9c00003c9fe0003ca380003
-ca720003ca9e0003caea0003cb240003cb5e0003ccba0003ce0e0003ce1e
-0003cedc0003d0120003d0700003d1880003d3160003d3bc0003d5020003
-d5400003d57e0003d5bc0003d6100003d6380003d6920003d6f60003d73e
-0003d7a00003d8000003d8720003d8ee0003d96a0003d9ec0003da780003
-db040003db8e0003dc0e0003dc480003dc840003dde80003deb20003dee2
-0003df120003e04a0003e19a0003e1aa0003e2980003e36c0003e4640003
-e55a0003e6dc0003e8360003e8460003e95e0003ea0a0003eb4c0003eca2
-0003ecfe0003ee5c0003eeea0003f0900003f2020003f3160003f34e0003
-f3b20003f5620003f6cc0003f72e0003f8960003f99c0003fa520003fafe
-0003fc260003fd140003fdf40003ff34000400600004017a000402ea0004
-046400040474000405540004064a000406fa000407f6000408a2000409ac
-00040a9800040bc200040ce600040dea00040f1800041056000411c20004
-12f80004148c000416340004172c000418400004197200041a6400041a9c
-00041af200041ba000041bb000041c1200041c6e00041cd400041d200004
-1d6000041d9800041dc400041df200041e2c00041f6200041f960004201a
-000420d00004210000042184000421b4000421ec00042384000425100004
-255a00042594000425ea000426360004265c00042682000426c400042706
-0004274800042778000427b0000427e60004281c0004285e0004288e0004
-28be000429b400042ab800042aec00042b2400042b6a00042b9e00042bce
-00042c0600042c3a00042c6e00042c9e00042cce00042d0400042d3a0004
-2d6a00042d9a00042dce00042e0200042e3200042e6200042e9c00042ed0
-00042f0200042f3400042f6800042f9c00042fcc00042ffc0004302a0004
-305800043166000432d2000434060004353a0004356a000435a40004363e
-000437a800043904000439c800043adc00043b0c00043b4000043c380004
-3de800043e4000043eb800043ff400044032000440a4000440d400044104
-0004413e000441c6000441f600044226000443b6000445000004460c0004
-471a000448460004499c00044af800044c5800044d9200044f0400045064
-000450740004522a00045352000453ec0004557400045584000456800004
-58060004595e00045a1000045ae000045bec00045c9600045cce00045cde
-00045d8e00045e3400045eb000046000000460f4000461ea000462f60004
-63ce000464a80004653c0004664e000467de000468fc000469f200046a9c
-00046b4600046c1000046cb800046d8e00046e0a00046e6600046fc80004
-70fc000472980004735a0004745a00047532000476700004771c000477e6
-000478d6000479fc00047ad800047bde00047d1600047e0600047ea40004
-7f960004810600048250000484bc0004858e000486420004871000048804
-000489420004895200048a8600048b9800048ba800048cb400048de40004
-8e3800048fac000490d4000491e80004939a000495ae00049842000499fc
-00049b2800049d0800049eca0004a05c0004a1280004a2c40004a33a0004
-a3e80004a4c40004a5500004a5f20004a6940004a7780004a8b00004ab0c
-0004ac540004ac640004ac740004acd60004ad340004ad960004ae340004
-aecc0004afd00004b0be0004b0ce0004b0de0004b1780004b2120004b24e
-0004b2ca0004b33e0004b3940004b3c80004b44e0004b4da0004b5520004
-b5b00004b64a0004b6dc0004b75c0004b7de0004b8720004b8a60004b908
-0004b9ba0004bb800004bbb80004bd940004bea80004beb80004beee0004
-bf320004bf760004bfba0004bff00004c0220004c0640004c1000004c156
-0004c1fc0004c2740004c2fa0004c36a0004c3cc0004c4520004c4b20004
-c51c0004c5900004c6000004c65e0004c7040004c79c0004c8080004c898
-0004c8f60004c9640004ca0c0004cab80004cb4e0004cbb80004cc3a0004
-cc9e0004cd4a0004ce020004ceae0004cf3c0004cf980004d0040004d05a
-0004d0dc0004d15a0004d1e00004d26c0004d2c60004d3320004d3a20004
-d4120004d4820004d5060004d5960004d5fc0004d6760004d6f20004d76a
-0004d8100004d8ac0004d93c0004d99a0004da380004dab40004db460004
-dbe80004dc920004dd2a0004dd860004dddc0004de440004deea0004df92
-0004e05c0004e1020004e1640004e1bc0004e21c0004e2aa0004e3300004
-e3be0004e41e0004e4820004e4ec0004e5540004e5bc0004e63a0004e6c2
-0004e7560004e7c20004e82a0004e88e0004e9360004e9f00004ea9e0004
-eb2c0004eb8a0004ebf60004ec660004ed0c0004edb60004ee780004ef1a
-0004ef7e0004f00e0004f0800004f1100004f18e0004f20a0004f2760004
-f3040004f3600004f3be0004f4440004f4c00004f5280004f58c0004f5e0
-0004f64e0004f6b60004f7340004f7aa0004f8240004f8a40004f9000004
-f9660004f9ca0004fa6a0004fb0c0004fbc20004fc720004fcce0004fd46
-0004fda40004fe2e0004fec60004ff560004ffbc0005001a000500a80005
-011a000501ae00050246000502b6000503260005039e000503fc0005045c
-000504d60005053000050590000505ea00050646000506ae0005073c0005
-0772000507aa0005083600050860000508a20005093600050a2400050ab4
-00050aea00050b3a00050bac00050c5800050cea00050d4200050d9c0005
-0df400050e4e00050ed200050f5800050ffc000510a4000510e200051152
-000511e60005127e00051314000513be000513f000051440000514940005
-14da0005157e000516080005168e000516ee000517320005178000051820
-000518b000051950000519f600051a9c00051b6000051b9200051bbc0005
-1c4200051cf200051d2400051d4c00051e1a00051e7800051f1200051f60
-00051fc60005206e000520dc00052142000521ce00052240000522b60005
-236a000523c40005243400052470000524c200052548000525a80005264c
-0005272c00052854000529e400052a4000052a9600052dbc00052e560005
-2eb200052efa00053068000531ba000532000005330e000533a6000534b4
-000535be0005366000053748000537da000538760005396800053a680005
-3ae400053b6a00053bb200053d2400053e8000053f6400053fb400053fe8
-000540d6000541fe00054398000544c8000545de000547120005482e0005
-489c0005493000054a7000054b2600054c9000054dc000054ef20005501e
-000550ca0005519000055262000553bc0005553c0005566c000557880005
-594200055a9400055b8000055c5c00055d1e00055e8800055fd800055fe8
-00055ff800056008000560c000056176000561b2000561e8000562200005
-6256000563e2000565f6000566e0000567f80005697000056ade00056bc8
-00056cfa00056e4200056fc800057166000572ba000574a80005766e0005
-78a400057af200057bda00057cb600057dfe00057f800005806800058182
-000581c40005820e0005842a000586420005878e0005890400058b620005
-8d6400058de800058e1800058e6400058f2c00058ffc0005919000059218
-00059280000592c0000592fe000594b0000596e000059816000599f80005
-9ad400059bee00059d9a00059fa60005a0a80005a1940005a3860005a58e
-0005a6fa0005a87e0005a9de0005ab4c0005abda0005ac6a0005ad840005
-ae900005b0520005b1be0005b3ae0005b5780005b60c0005b6a80005b73e
-0005b7c60005b8ac0005b9840005bb1e0005bcb00005bcd60005bcfc0005
-bd0c0005bd3c0005bd6c0005bee60005c0880005c1320005c2140005c2d4
-0005c37e0005c4180005c4fa0005c5b80005c6940005c84a0005c9840005
-ca100005ca400005ca700005caa40005cad80005cae80005caf80005cb28
-0005cb580005cb8c0005cbc00005cbf40005cc280005cc5c0005cc900005
-ce0a0005ce1a0005ce4a0005ce7a0005ceb20005cee60005cf1a0005cf4e
-0005cf820005cfb60005cfea0005d0220005d0580005d0880005d0c80005
-d1000005d1480005d18e0005d1c20005d1f60005d2300005d2680005d308
-0005d3180005d46a0005d6320005d7d80005d9820005dace0005dbe40005
-dcf20005de080005df020005dfea0005e10c0005e2080005e2e00005e3d0
-0005e48c0005e53e0005e6080005e67a0005e7200005e7b00005e8140005
-e9220005e9880005ea360005eb2c0005eb940005ebfc0005ecac0005ee86
-0005ef8a0005f00a0005f0480005f0f40005f1820005f26a0005f3020005
-f3680005f4660005f5280005f5e20005f6200005f6b00005f7b20005f846
-0005f88a0005f9a80005fad20005fcb40005fe760005ffac000600da0006
-01da000602020006022a0006026000060292000602be000602e60006030e
-0006033c0006039a000604080006044000060478000604a8000604ce0006
-0502000605380006055e00060584000605b2000605e00006060c00060682
-000606aa0006070c00060732000607580006077e000607a4000607d40006
-0804000608340006086e0006089e000608d400060904000609360006095c
-00060982000609b6000609ec00060a1c00060a4c00060a7200060a980006
-0abe00060aec00060b2000060ba600060bea00060c2400060c5800060c9c
-00060cd600060d1000060d3600060d6000060dac00060dee00060e140006
-0e4200060e6800060e8e00060ece00060f0000060f3000060f6000060f86
-00060fac00060fdc0006100c00061032000610580006107e000610a40006
-10ca000610f000061118000611a0000611ca0006123e00061266000612dc
-000613040006136600061398000613ca000613fa00061432000614640006
-1492000614cc000614f40006155400061596000615c6000615f200061622
-000616520006167a000616a2000616ca0006172c00061754000617b20006
-17f60006183a0006186a000618a0000618c6000618ee000619140006193c
-000619620006198a000619b2000619dc00061a0200061a2800061a4e0006
-1a8000061aa800061b2e00061b5800061bc200061bf200061c2200061c48
-00061c6e00061cc600061cf600061d3200061d5c00061d8c00061dbc0006
-1df000061e2400061e5400061e9400061ece00061f1600061f3c00061f62
-00061f8800061fae00061fd4000620140006205400062090000620c00006
-20f0000621200006215000062188000621c000062200000622400006227a
-000622b4000622f00006232e00062378000623c2000624080006244e0006
-2490000624d20006250200062532000625660006259a000625d40006260e
-0006265a000626a6000626fe00062756000627ae0006280c0006283c0006
-286c000628a2000628d80006290e0006294a0006297e000629b200062a06
-00062a5a00062aae00062b0200062b5600062baa00062c0200062c5a0006
-2c8800062cb600062ce800062d1a00062d6000062da600062dd800062e0a
-00062e5c00062eb400062ef800062f3c00062f8000062fc4000630180006
-306c0006309c000630cc000631020006313800063176000631bc00063210
-0006325a000632ac000632fe0006335e000633be000633ee000634200006
-345a00063494000634e60006353a00063584000635cc0006360e00063678
-000636c6000637120006374400063776000637aa000637de000638140006
-384a00063888000638be000638f00006392c00063982000639d800063a36
-00063a9400063aea00063b4000063b7400063ba400063be800063c1e0006
-3c4e00063c9200063cd000063d0800063d4000063d7600063db200063de2
-00063e1e00063e5e00063ea400063eee00063f3a00063f8600063fdc0006
-403200064080000640ce0006411c0006416c000641c8000642240006427c
-000642d4000643280006437c000643be0006440000064448000644900006
-44d8000645260006456a000645ae000646140006467a000646e000064746
-000647ac000648120006487c000648e60006492e00064976000649be0006
-4a0600064a5200064a9e00064af200064b3e00064b8200064bd000064c38
-00064ca000064d1000064d8000064de800064e5000064e9000064ece0006
-4f1800064f4200064f8800064fc00006500e0006503e0006506e000650aa
-000650de000651040006515800065196000651ea000652d0000653f80006
-543a00065460000654b6000654e60006552800065570000655be00065608
-000656580006567e000657660006584a0006599c000659ca000659f80006
-5a8c00065b1200065b4000065bca00065bfa00065c2a00065c7800065cc6
-00065daa00065e8600065fca00065ffa0006602a000660c0000661480006
-6178000661a8000661d80006626800066298000662c80006631a00066362
-000663b80006644e000664e60006655a000665ac000665d60006662c0006
-6660000666aa000666e20006673200066770000667bc000667e20006685e
-000668b0000669c200066bcc00066d8000066f0200067074000673160006
-75e6000677a6000678ec00067b4600067c8800067e9e00067ef000067f40
-00067f9600067fec0006804e000680d600068324000684b6000686c20006
-87de0006899200068b1400068bd400068cb600068d1e00068d8000068df6
-00068e5e00068f0a00068f7a0006900a0006911e000691e20006922e0006
-92c40006937000069414000694be000695080006954a000695c000069628
-000696b800069766000697d0000698340006989a00069954000699ea0006
-9a4800069a7200069a9c00069aac00069abc00069b7e00069c8200069e8c
-00069fe200069ff20006a0a20006a1860006a1e60006a1f60006a2520006
-a2b00006a3d00006a4be0006a4ce0006a4de0006a4ee0006a4fe0006a5e4
-0006a6e40006a8bc0006aa780006ab7e0006abf80006ac720006ad240006
-ad340006ae420006ae520006ae620006af240006b0580006b1440006b154
-0006b1640006b1740006b2da0006b4460006b5720006b5820006b5920006
-b5a20006b5b20006b6940006b6a40006b8060006b9100006ba0e0006bb46
-0006bc180006bc960006bd140006be340006beb00006befc0006bf880006
-c09c0006c0f00006c2320006c2f20006c3be0006c4b40006c5be0006c670
-0006c7d60006c83c0006c9000006cb020006cc900006ce0e0006cf3e0006
-d1f00006d3320006d4600006d5d80006d7500006d8d00006da5e0006dc10
-0006dc7e0006dde20006df1a0006e01e0006e1540006e2860006e3560006
-e4260006e5820006e65c0006e6fc0006e8000006e92a0006ea280006eba8
-0006ed120006ee500006efc80006f1140006f1f60006f25e0006f3000006
-f3a00006f49e0006f6060006f7400006f8d40006fa1e0006fb020006fb60
-0006fc660006fcfc0006fdbe0006fe640006fea400070050000701220007
-01e800070310000704b0000705bc00070614000707ac0007083a0007084c
-0007087c000708ac000708e40007091c000709520007098e000709c40007
-0a0000070b6e00070bb800070c5200070cea00070d6400070de800070e4e
-00070efa00070f46000710660007111c000711f20007122a000712680007
-12dc000713d6000714f4000715f6000716380007167a000716e8000716f8
-000717080007171800071728000717380007174800071758000717680007
-17780007178800071798000717980007191c0007192c000719ec00071ab2
-00071be800071dde00071fe0000721dc00072412000726120007267e0007
-27900007292200072a7a00072b2c00072b7000072c0e00072d3e00072d8e
-00072e2400072f6000072f70000731260007325a000732aa000733000007
-33c20007340600073448000734ce0007352c0007361e000736ac000736e2
-0007375c000737d4000738240007393000073a2600073ad000073afa0007
-3b2400073b4e00073b7800073bb800073bf800073c3000073c6800073cb2
-00073cfc00073d3c00073d7c00073dc600073e1000073e5000073e900007
-3eea00073f4400073f7e00073fb800073ffc0007404000074084000740c8
-0007411c00074170000741bc00074208000742460007428a000742da0007
-432a00074384000743e20007440c00074436000744d00007456a000745ae
-000745f2000747080007471800074760000747a8000747fa0007484c0007
-48b60007490a00074956000749b400074a3e00074aa200074ae600074b30
-00074b9800074be200074c2200074c6a00074ca600074ce200074d1e0007
-4d5800074d9a00074ddc00074e1c00074e5c00074ea600074ef000074f46
-00074f9e00074fec0007503a0007507c000750ca0007510c000751560007
-5198000751dc0007523800075294000752e00007532c00075376000753c0
-000753fe0007543c000754ba0007553800075572000755ac000756460007
-56e0000757b400075888000758e400075940000759b400075a2800075b86
-00075b9600075c8000075c9000075cc600075cfc00075d3600075d700007
-5dac00075de800075e2e00075e7400075fda00076190000762dc0007649a
-00076610000767b8000768e8000769ee00076c0c00076d5000076ee60007
-706e000770ec0007723000077438000774cc00077560000776b4000777de
-0007795800077a9800077c0400077cf200077ebc00078050000780d20007
-8204000782ee0007845600078538000786ee000787e00007894200078a7e
-00078b7200078d3600078ebe00079062000791c600079362000795200007
-96a600079742000798b6000799a800079a9000079c1000079d6200079e82
-0007a01a0007a1f00007a37e0007a4280007a4de0007a6900007a7340007
-a7c20007a80e0007a85a0007a8d20007a9b00007aa2a0007aacc0007ab20
-0007ac840007adb00007aec20007afc40007b08c0007b2000007b3400007
-b5660007b6100007b73a0007b83e0007b9de0007baca0007bbc40007bcc2
-0007bda80007bec20007c07c0007c22a0007c3980007c4100007c4840007
-c5a20007c6260007c7280007c8b40007ca2c0007cb620007cc6c0007cde2
-0007cf5a0007d14c0007d33a0007d5000007d5740007d6240007d6da0007
-d78a0007d8480007d9420007da460007db400007dc4c0007dcd40007dd62
-0007ddea0007de7e0007df5a0007e0500007e1340007e22a0007e2be0007
-e37a0007e40e0007e4cc0007e5bc0007e6c40007e7c20007e8d60007e9f8
-0007eb0c0007ec4c0007ed860007eea80007efbc0007f1000007f2540007
-f4680007f61a0007f6ce0007f7ea0007f8c00007f9de0007fabc0007fc50
-0007fd0a0007fda60007fe980007ff800008006c000800ea000801e40008
-03220008044e00080482000804c6000804d600080576000806180008070e
-000807fa000808d4000809ac00080b0a00080c6a00080d0800080d9e0008
-0ddc00080e1c00080e5a00080e9a00080ef400080f4c00080fa60008100a
-0008109600081292000812e20008140e0008149400081514000815ee0008
-16c2000817c6000819b200081aca00081b3a00081bca00081c8c00081d5e
-00081dca00081e4800081f9c00081fe2000820280008210c000821480008
-21a6000821e4000822160008225a0008229c000822cc000100000d3500f2
-003c009d000700020010002f005600000468041d0005000200>
-<0000003a02be0000000300000000006a00000000000300000001000a006a
-0000000300000002000e00740000000300000003005e0082000000030000
-0004000a00e00000000300000005001800ea0000000300000006000e0102
-000000030000000700ba01100000000300000008003001ca000000030000
-0009008a01fa000000030000000d02aa028400010000000000000035052e
-000100000000000100050563000100000000000200070568000100000000
-0003002f056f00010000000000040005059e0001000000000005000c05a3
-0001000000000006000705af0001000000000007005d05b6000100000000
-00080018061300010000000000090045062b000100000000000d01550670
-0003000104030002000c07c50003000104050002001007d1000300010406
-0002000c07e10003000104070002001007ed0003000104080002001007fd
-0003000104090000006a080d0003000104090001000a0877000300010409
-0002000e08810003000104090003005e088f0003000104090004000a08ed
-0003000104090005001808f70003000104090006000e090f000300010409
-000700ba091d0003000104090008003009d70003000104090009008a0a07
-000300010409000d02aa0a9100030001040a0002000c0d3b00030001040b
-000200100d4700030001040c0002000c0d5700030001040e0002000c0d63
-0003000104100002000e0d6f000300010413000200120d7d000300010414
-0002000c0d8f000300010415000200100d9b0003000104160002000c0dab
-0003000104190002000e0db700030001041b000200100dc500030001041d
-0002000c0dd500030001041f0002000c0de10003000104240002000e0ded
-00030001042a0002000e0dfb00030001042d0002000e0e0900030001080a
-0002000c0e170003000108160002000c0e23000300010c0a0002000c0e2f
-000300010c0c0002000c0e3b00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0052006500670075006c00610072004d006f006e006f
-0074007900700065003a0041007200690061006c00200052006500670075
-006c00610072003a00560065007200730069006f006e00200035002e0030
-003100200028004d006900630072006f0073006f00660074002900410072
-00690061006c00560065007200730069006f006e00200035002e00300031
-0041007200690061006c004d00540041007200690061006c002000690073
-00200061002000740072006100640065006d00610072006b0020006f0066
-00200054006800650020004d006f006e006f007400790070006500200043
-006f00720070006f0072006100740069006f006e00200069006e00200074
-0068006500200055006e0069007400650064002000530074006100740065
-007300200061006e0064002f006f00720020006f00740068006500720020
-0063006f0075006e00740072006900650073002e0054006800650020004d
-006f006e006f007400790070006500200043006f00720070006f00720061
-00740069006f006e004d006f006e006f0074007900700065002000540079
-00700065002000440072006100770069006e00670020004f006600660069
-006300650020002d00200052006f00620069006e0020004e006900630068
-006f006c00610073002c0020005000610074007200690063006900610020
-005300610075006e0064006500720073002000310039003800320059006f
-00750020006d006100790020007500730065002000740068006900730020
-0066006f006e007400200074006f00200064006900730070006c00610079
-00200061006e00640020007000720069006e007400200063006f006e0074
-0065006e00740020006100730020007000650072006d0069007400740065
-006400200062007900200074006800650020006c006900630065006e0073
-00650020007400650072006d007300200066006f00720020007400680065
-002000700072006f006400750063007400200069006e0020007700680069
-006300680020007400680069007300200066006f006e0074002000690073
-00200069006e0063006c0075006400650064002e00200059006f00750020
-006d006100790020006f006e006c0079002000280069002900200065006d
-0062006500640020007400680069007300200066006f006e007400200069
-006e00200063006f006e00740065006e0074002000610073002000700065
-0072006d0069007400740065006400200062007900200074006800650020
-0065006d00620065006400640069006e0067002000720065007300740072
-0069006300740069006f006e007300200069006e0063006c007500640065
-006400200069006e0020007400680069007300200066006f006e0074003b
-00200061006e006400200028006900690029002000740065006d0070006f
-0072006100720069006c007900200064006f0077006e006c006f00610064
-0020007400680069007300200066006f006e007400200074006f00200061
-0020007000720069006e0074006500720020006f00720020006f00740068
-006500720020006f00750074007000750074002000640065007600690063
-006500200074006f002000680065006c00700020007000720069006e0074
-00200063006f006e00740065006e0074002ea9203230303620546865204d
-6f6e6f7479706520436f72706f726174696f6e2e20416c6c205269676874
-732052657365727665642e417269616c526567756c61724d6f6e6f747970
-653a417269616c20526567756c61723a56657273696f6e20352e30312028
-4d6963726f736f667429417269616c56657273696f6e20352e3031417269
-616c4d54417269616c20697320612074726164656d61726b206f66205468
-65204d6f6e6f7479706520436f72706f726174696f6e20696e2074686520
-556e697465642053746174657320616e642f6f72206f7468657220636f75
-6e74726965732e546865204d6f6e6f7479706520436f72706f726174696f
-6e4d6f6e6f7479706520547970652044726177696e67204f666669636520
-2d20526f62696e204e6963686f6c61732c20506174726963696120536175
-6e646572732031393832596f75206d617920757365207468697320666f6e
-7420746f20646973706c617920616e64207072696e7420636f6e74656e74
-206173207065726d697474656420627920746865206c6963656e73652074
-65726d7320666f72207468652070726f6475637420696e20776869636820
-7468697320666f6e7420697320696e636c756465642e20596f75206d6179
-206f6e6c792028692920656d626564207468697320666f6e7420696e2063
-6f6e74656e74206173207065726d69747465642062792074686520656d62
-656464696e67207265737472696374696f6e7320696e636c756465642069
-6e207468697320666f6e743b20616e6420286969292074656d706f726172
-696c7920646f776e6c6f6164207468697320666f6e7420746f2061207072
-696e746572206f72206f74686572206f7574707574206465766963652074
-6f2068656c70207072696e7420636f6e74656e742e004e006f0072006d00
-61006c006f00620079010d0065006a006e00e9006e006f0072006d006100
-6c005300740061006e0064006100720064039a03b103bd03bf03bd03b903
-ba03ac00a90020003200300030003600200054006800650020004d006f00
-6e006f007400790070006500200043006f00720070006f00720061007400
-69006f006e002e00200041006c006c002000520069006700680074007300
-2000520065007300650072007600650064002e0041007200690061006c00
-52006500670075006c00610072004d006f006e006f007400790070006500
-3a0041007200690061006c00200052006500670075006c00610072003a00
-560065007200730069006f006e00200035002e0030003100200028004d00
-6900630072006f0073006f0066007400290041007200690061006c005600
-65007200730069006f006e00200035002e00300031004100720069006100
-6c004d00540041007200690061006c002000690073002000610020007400
-72006100640065006d00610072006b0020006f0066002000540068006500
-20004d006f006e006f007400790070006500200043006f00720070006f00
-72006100740069006f006e00200069006e00200074006800650020005500
-6e0069007400650064002000530074006100740065007300200061006e00
-64002f006f00720020006f007400680065007200200063006f0075006e00
-740072006900650073002e0054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-4d006f006e006f0074007900700065002000540079007000650020004400
-72006100770069006e00670020004f006600660069006300650020002d00
-200052006f00620069006e0020004e006900630068006f006c0061007300
-2c0020005000610074007200690063006900610020005300610075006e00
-64006500720073002000310039003800320059006f00750020006d006100
-7900200075007300650020007400680069007300200066006f006e007400
-200074006f00200064006900730070006c0061007900200061006e006400
-20007000720069006e007400200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-200074006800650020006c006900630065006e0073006500200074006500
-72006d007300200066006f00720020007400680065002000700072006f00
-6400750063007400200069006e0020007700680069006300680020007400
-680069007300200066006f006e007400200069007300200069006e006300
-6c0075006400650064002e00200059006f00750020006d00610079002000
-6f006e006c0079002000280069002900200065006d006200650064002000
-7400680069007300200066006f006e007400200069006e00200063006f00
-6e00740065006e00740020006100730020007000650072006d0069007400
-7400650064002000620079002000740068006500200065006d0062006500
-6400640069006e0067002000720065007300740072006900630074006900
-6f006e007300200069006e0063006c007500640065006400200069006e00
-20007400680069007300200066006f006e0074003b00200061006e006400
-200028006900690029002000740065006d0070006f007200610072006900
-6c007900200064006f0077006e006c006f00610064002000740068006900
-7300200066006f006e007400200074006f00200061002000700072006900
-6e0074006500720020006f00720020006f00740068006500720020006f00
-750074007000750074002000640065007600690063006500200074006f00
-2000680065006c00700020007000720069006e007400200063006f006e00
-740065006e0074002e004e006f0072006d0061006c004e006f0072006d00
-610061006c0069004e006f0072006d0061006c004e006f0072006d00e100
-6c004e006f0072006d0061006c0065005300740061006e00640061006100
-720064004e006f0072006d0061006c004e006f0072006d0061006c006e00
-79004e006f0072006d0061006c041e0431044b0447043d044b0439004e00
-6f0072006d00e1006c006e0065004e006f0072006d0061006c004e006f00
-72006d0061006c004e0061007600610064006e006f0074006801b001a103
-00006e00670041007200720075006e00740061004e006f0072006d006100
-6c004e006f0072006d0061006c004e006f0072006d0061006c004e006f00
-72006d0061006c000000b900540328b326181fd0bc032900e00329000203
-29b22b1d1fb90327031db23b1f40b80323b31215320f412d03200001002f
-0320000100200320006f032000af032000bf03200004005f031e00010010
-031e007f031e0080031e00af031e00bf031e00d0031e00060000031e0010
-031e0020031e006f031e009f031e00e0031e0006031d031cb2201f104127
-0319007f03190002000f031700ef031700ff03170003001f0317002f0317
-004f0317005f0317008f0317009f03170006000f0317005f0317006f0317
-007f031700bf031700f00317000600400317b2923340b80317b28b3340b8
-0317b36a6c3240b80317b2613340b80317b35c5d3240b80317b357593240
-b80317b34d513240b80317b344493240b80317b23a3340b80317b3313432
-40b80317b32e423240b80317b3272c3240b80317b312253280b80317b30a
-0d32c04116031600d00316000200700316000102c4000f0101001f00a003
-1500b0031500020306000f0101001f00400312b32426329fbf0304000103
-0203010064001fffc00301b20d1132410a02ff02ef0012001f02ee02ed00
-64001fffc002edb30e11329f414a02e200af02e200bf02e2000302e202e2
-02e102e1007f02e00001001002e0003f02e0009f02e000bf02e000cf02e0
-00ef02e0000602e002e002df02df02de02de000f02dd002f02dd003f02dd
-005f02dd009f02dd00bf02dd00ef02dd000702dd02dd001002dc00010000
-02dc0001001002dc003f02dc000202dc02dc001002db000102db02db000f
-02da000102da02daffc002d3b2373932b9ffc002d3b22b2f32b9ffc002d3
-b21f2532b9ffc002d3b2171b32b9ffc002d3b2121632b802d2b2f9291fb9
-0326031cb23b1f40bb0322003e00330322b225311fb80318b23c691fb802
-e3b3202b1fa0413002d400b002d40002000002d4001002d4002002d40050
-02d4006002d4007002d40006006002d6007002d6008002d6009002d600a0
-02d600b002d60006000002d6001002d6002002ca002002cc002002d60030
-02d6004002d6005002d6000802d0b2202b1fb802cfb226421f411602ce02
-c70017001f02cd02c80017001f02cc02c60017001f02cb02c50017001f02
-c902c5001e001f02ca02c6b21e1f00410b02c6000002c7001002c6001002
-c7002f02c5000502c1b324121fff411102bf0001001f02bf002f02bf003f
-02bf004f02bf005f02bf008f02bf000602bf0222b2641f12410b02bb00ca
-0800001f02b200e90800001f02a600a20800406a1f402643493240204349
-3240263a3d3240203a3d329f209f26024026969932402096993240268e92
-3240208e92324026848c324020848c3240267a813240207a813240266c76
-3240206c76324026646a324020646a3240265a5f3240205a5f3240264f54
-3240204f5432b8029eb724271f374f6b0120410f02770030027700400277
-00500277000402770277027700f90400001f029bb22a2a1fb8029a402b29
-2a1f80ba0180bc0180520180a201806501807e01808101803c01805e0180
-2b01801c01801e0180400180bb0138000100800140b40180400180bb0138
-00010080013940180180ca0180ad01807301802601802501802401802001
-3740b80221b2493340b80221b2453340b80221b341423240b80221b33d3e
-320f410f0221003f0221007f0221000300bf022100cf022100ff02210003
-00400221b320223240b80221b3191e3240b80222b32a3f3240b80221b32e
-3a326f414802c3007f02c3008f02c300df02c30004002f02c3006002c300
-cf02c30003000f02c3003f02c3005f02c300c002c300ef02c300ff02c300
-0600df02220001008f02220001000f0222002f0222003f0222005f022200
-7f022200ef0222000600bf022100ef02210002006f0221007f022100af02
-210003002f0221003f0221004f0221000302c302c3022202220221022140
-1d101c102b1048038f1c010f1e014f1eff1e023700161600000012110811
-b8010db6f70df8f70d00094109028e028f001d001f0290028f001d001f02
-8fb2f91d1fb80198b226bb1f41150197001e0401001f013900260125001f
-013800730401001f0135001c0801001f0134001c02ab001f0132b21c561f
-b8010fb2262c1fba010e001e0401b61ff91ce41fe91cb80201b61fe81cbb
-1fd720b80401b21fd51cb802abb61fd41c891fc92fb80801b21fbc26b801
-01b21fba20b80201b61fb91c381fadcab80401b21f8126b8019ab21f7e26
-b8019ab61f7d1c471f6b1cb80401b21f6526b8019ab21f5e73b80401400f
-1f52265a1f481c891f441c621f4073b80801b61f3f1c5e1f3c26b8019ab2
-1f351cb80401b61f301cbb1f2b1cb80401b61f2a1c561f291cb80101b21f
-231eb80401b21f5537b80168402c07960758074f07360732072c0721071f
-071d071b071408120810080e080c080a080808060804080208000814b8ff
-e0402b000001001406100000010006040000010004100000010010020000
-01000200000001000002010802004a00b013034b024b5342014bb0c06300
-4b6220b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807
-ff52b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ff
-b101018e851bb0124358b900010111858d1bb900010128858d5959001816
-763f183f123e113946443e113946443e113946443e113946443e11394660
-443e11394660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b2b
-182b1db0964b5358b0aa1d59b0324b5358b0ff1d594bb09353205c58b901
-f201f04544b901f101f045445958b9033e01f2455258b901f2033e445959
-4bb8015653205c58b9002001f14544b9002601f145445958b9081e002045
-5258b90020081e4459594bb8019a53205c58b9002501f24544b9002401f2
-45445958b909090025455258b9002509094459594bb8040153205c58b173
-244544b1242445445958b917200073455258b9007317204459594bb80401
-53205c58b1ca254544b1252545445958b9168000ca455258b900ca168044
-59594bb03e53205c58b11c1c4544b11e1c45445958b9011a001c455258b9
-001c011a4459594bb05653205c58b11c1c4544b12f1c45445958b9018900
-1c455258b9001c01894459594bb8030153205c58b11c1c4544b11c1c4544
-5958b90de0001c455258b9001c0de04459592b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65
-422b2b01b33b59635c456523456023456560234560b08b766818b0806220
-20b163594565234520b003266062636820b003266165b059236544b06323
-4420b13b5c4565234520b003266062636820b003266165b05c236544b03b
-2344b1005c455458b15c406544b23b403b4523614459b347503437456523
-456023456560234560b089766818b080622020b134504565234520b00326
-6062636820b003266165b050236544b034234420b147374565234520b003
-266062636820b003266165b037236544b0472344b10037455458b1374065
-44b24740474523614459004b5342014b5058b108004259435c58b1080042
-59b3020b0a124358601b2159421610703eb0124358b93b21187e1bba0400
-01a8000b2b59b00c2342b00d2342b0124358b92d412d411bba0400040000
-0b2b59b00e2342b00f2342b0124358b9187e3b211bba01a80400000b2b59
-b0102342b0112342002b7475737500184569444569444569447373737374
-757374752b2b2b2b74752b2b2b2b2b737373737373737373737373737373
-737373737373737373732b2b2b45b0406144737400004bb02a534bb03f51
-5a58b1070745b040604459004bb03a534bb03f515a58b10b0b45b8ffc060
-4459004bb02e534bb03a515a58b1030345b040604459004bb02e534bb03c
-515a58b1090945b8ffc06044592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b752b2b2b2b2b2b2b435c58b9008002bbb301401e017400735903b01e4b
-5402b0124b545ab012435c5a58ba009f02220001007359002b7473012b01
-732b2b2b2b2b2b2b2b737373732b2b2b2b2b002b2b2b2b2b2b0045694473
-456944734569447374754569447345694445694445694473744569444569
-44732b2b2b2b2b732b002b732b74752b2b2b2b2b2b2b2b2b2b2b2b2b2b73
-7475732b7374757374752b2b2b742b2b000000>
-[15785 15901 16277 16325 16277 16273 15933 16169 16277 15721 16361 15561 15973
-16029 16305 15693 16345 16249 15893 15629 16365 15481 16245 16249 16357 16337
-15821 15749 16345 15937 16257 16033 19077 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-3 4064 66 <0001ffe1fe69048afeeb0003001a400c013f00021a050019044341182b4e
-10e410e6002f4ded3130033521151f04a9fe69828200>ArialMT AddT42Char 
-3 4240 68 <0002004affe8041c043e00280037022d402c090d092a190d1a2a290d2a2a
-390d3615371b3a2a492a5d0d5d2a6a0d692a60308a0d86299a169b1aa90d
-1528b8ffe8b40b0b065527b8ffe840190b0b0655a619aa28b619bb28c419
-cf28d215dd28084416011eb8fff440110c0c065512120c0c0655050c0c0c
-065535b8ffe040550c0c06551f171f182b2c2a343904392c4904482c5608
-592b6608692b760c870cc90cf90df92b1137340e0104102f243417322114
-185f296f2902291c2f0e3f0e8f0e9f0eff0e059f0eaf0eef0e030e0c0f0f
-02550eb8ffeab4101002550eb8fff44015101006550e0c0d0d06550e060f
-0f06550e0e1c0317b802aab61895141c1c0700b8fff4401a0c0c06550045
-270a321c030b2961106100060d0d025500252124b8ffecb41010025524b8
-ffec400b0d0d025524040c0c025524b8ffe4b40b0b025524b8fff4b40b0b
-065524b8ffdc400b1010065524060f0f065524b8fffcb40c0c065524b802
-5b400e27400026102620263026af260539b8ffc0b40e0e025526b8ffd6b6
-0e0e0255263139b8ffc0400d1e23343039c03902a039013917b8fff44041
-10100655172518222f24bf06cf06021f063f0602060e0f0f0255060c0d0d
-025506180c0c0255060c0b0b0255060c0b0b0655060e0d0d065506100c0c
-065506313810f62b2b2b2b2b2b2b5d71edf4ed2b105d712bf62b2b5dedf4
-2b2b2b2b2b2b2b2b3cfd2be5e5003fed3fe42b3fedfde41112392f2b2b2b
-2b2b5d71ed711112391112393901111217393130005d2b2b2b2b01715d2b
-2b0071250606232226353436363736373637363534272623220607273e02
-333216161716151514161723260306070e02151416333236373635033c64
-b96aafbc477348356bda67013345887f791db0186ed08988aa5010091722
-bc1c1762c46f5c326d6968a2261d835546ab854e814e140e0d1a24250a6e
-2d3d597118718b4b40614a2e78f0fb853d3801dd281c10284d2f48605b4f
-3d77>ArialMT AddT42Char 
-3 4962 69 <00020086ffe8041f05ba0010001d0180409b01050c0f240535054505053f
-1fb01f021f1f221c331c421c701f901f063a133c163c1a4c164c1a5d085d
-0d580f5d165e1a6a086c0d680f6e166e1ac01fd90cda17da19e213ec17ec
-19e31de01fff1f1920052f0f2f1430053f0f40054c0f50056605da1df504
-fa100c10150e040602001b1c0607010a151c0e0b1824d00b01100b400b60
-0b800b041f400d0d02550b0c0f0f02550b180d0d02550bb8fff6b40c0c02
-550bb8fff0b40b0b06550bb8fff4b40f0f06550bb8ffe0b40c0c06550bb8
-fff4402f0d0d06550b7401113300040c0c025500040d0d06550033032502
-02c001019001a001b001f001041f013f014f010301b8fffeb41010025501
-b8fffc401d0e0e0255010c0d0d025501100c0c025501120b0b0255010c0b
-0b065501b8fff8b41010065501b8fffc40160f0f065501180c0c06550114
-0d0d065501191e4737182b4e10f42b2b2b2b2b2b2b2b2b2b5d71723c4d10
-fdf42b2be410fd2b2b2b2b2b2b2b2b5d71ed003fed3f3fed3f1139111239
-3130005d015d7172007121231133113633321e0215100023222703141716
-333236353426232206012da7b472b162af7140fef2bdbc6b0234559176ac
-a57576ac05bafdf58f4f8fca73feeffed69d0196bf558bcdcbd0c6cd>ArialMT AddT42Char 
-3 5440 70 <00010050ffe803ed043e001a015ab1020243545840340e7f0f010f0b0140
-0050007000030004121c0b07181c040b010e1507080e0e0255070c0d0d02
-55070c0c0c025507100b0b0255072f2b2b2b2bcdd4c6003fed3fed10c45d
-3210c45d3231301b4047090c011f1c4313431753135317601360179b029b
-039a0da410a41a0c080d190a6a0269036a05750c700d800da60cb509b60a
-b50c0c160c860ce302030e225f0f6f0f7f0f030f01b802aa407930004000
-5000600070009000a000e000f00009000f0f0b000004121c0b07181c040b
-1c0f010f240e080d0d06550e221b000100240b2b1f010100010101400b0b
-065501401010065501480c0c0655011a0d0d065501491c1524cf07011f07
-3f0702070e0b0b0655070a1010065507120c0c065507311b34c4182b10f6
-2b2b2b5d71ed10f62b2b2b2b5d724b53234b515a58b90001ffc03859ed72
-f42bed72003fed3fed12392f11392f105de4105de43130005d71015d7159
-011706062322001134123633321617072626232206151416333236033cb1
-1defaedafef772e989addc1faf197f5a88aaa4846a8e018517b7cf011d01
-0aac010281afa11b6b6cc3d3d6c28200>ArialMT AddT42Char 
-3 5876 71 <00020046ffe803df05ba0011001d015540a40a02040d250d340d440d0535
-14351c5702540a5214531c6702640565096314601cc01fd405d513dd19e5
-13e514ef17eb19e51de01fff1f161f1f2b1a3c163c1a4b1a701f901f072e
-02240d2e163a02350d4b02450d4614491c570a560d670de506e716fa01f4
-0e100115030e0b100f001b1c0b0711000a151c030b1833010025110f2510
-10d011011011401160118011041f400b0b02551f400d0d02551112101002
-5511b8fff440110f0f025511060e0e025511180d0d025511b8fff2400b0b
-0b0655110e1010065511b8ffeeb40c0c065511b8fff840420d0d06551174
-1224bf07cf07df07ff07041f073f074f0703071e0b0b025507180c0c0255
-071e0d0d0255070c0b0b0655070c0d0d0655071a0c0c065507191e345018
-2b4e10f42b2b2b2b2b2b5d714dedfd2b2b2b2b2b2b2b2b2b2b5d713c10ed
-10fd3ce4003fed3f3c3fed3f3c11391112393130005d01715d0071213506
-232226263534123633321617113311011416333236353426232206033865
-c47fd5756ad48360962fb3fd20ac7576a5a87b78a1869e8cfba39f01038a
-5141020efa460212cccac1c6daccc400>ArialMT AddT42Char 
-3 6312 72 <0002004bffe8041e043e0015001d015340171f001c150255035d055d0955
-0b65036b056f09650b0815b8ffe4b40d0d065511b8ffe440520d0d06551d
-1c0d0d06552712d905fa14f61a0431123a19311c41124d1a411c51125c19
-521c61126d1a611c78067815f602f618100016010f0d1717501660167016
-03161c0f9010a010021010041b1c0a0700ba02aa0001ffc0b41010025501
-b8ffc04010101006551001010195131c040b17400db8ffdcb40d0d02550d
-b8ffeeb40d0d06550db8ffeab40c0c06550db8ffc04009272a34b00d010d
-1a1fb8ffc0b32526341fb8ffc040411e2334301f011f163310240740242a
-341f073f074f070307200b0b025507180c0c0255071c0d0d0255070e0b0b
-0655071c0c0c065507160d0d065507191e3437182b4e10f42b2b2b2b2b2b
-5d2b4dfde44e10712b2bf6712b2b2b2b4ded003fedfd5d2b2be43fed1239
-2f5d3cfd713c011112393912393130015d005d2b2b2b0171720117060623
-22001110003332001114072116163332360121262726232206035eba2cee
-b9e9feef0114dcd5010e01fce80ab285638cfdda02510c3856897ca90156
-17a3b4011f0103010c0128fedefef91020afba680195864368a6>ArialMT AddT42Char 
-3 6758 73 <000100130000028005d30017010d401e1409010f192f193019401970199b
-0c9c0da90d081a0d280db019c0190419b8ffc040281a1f341d080d030c0f
-1c0a0115022b1413040306000a9f140114ff134004172504000302920101
-00b8ffc0b331383400b8ffc0402b1c1f3490000119400f0f025519400d0e
-025500141010025500280f0f025500220e0e0255002c0d0d025500b8fff2
-400b0c0c025500140b0b065500b8ffeab41010065500b8ffe6b40f0f0655
-00b8fffab70c0c065500a31819bc01ba002100f6010a00182b2bf62b2b2b
-2b2b2b2b2b2b2b2b5d2b2b3c10f43c103ced10eded5d003f3f3c3c3cfd3c
-3fed391139313043794014101106090706080602061009121b0011060f1b
-012b012b2a8181012b715d00723311233533353437363633321707262322
-06151533152311b29f9f131a83764c5c1b38325244cfcf039a8c716b3446
-57129d0a4660628cfc66>ArialMT AddT42Char 
-3 7098 74 <00020042fe5103ea043e001e002a016f40600b0b05142c0b25144c0b4514
-06091d191d2c0b26142c23390b36144a0b46145607580b680bfa0af5150e
-2e232c273e233e274c27902ca02c07362136293f2c460b46214529542154
-29690763216329602c802cda27e821ee23ef271117160615b802b1b4281c
-130701b802aa401020003000600070008000c000d0000700b8027d403205
-1c1c0f0a45221c0c0a16153325330a251818d01701101740176017801704
-2c400b0c02552c400d0d025517121010025517b8fff440110f0f02551706
-0e0e025517160d0d025517b8ffea400b0b0b065517121010065517b8ffee
-b40c0c065517b8fffc404a0d0d065517740f012500221f24bf0fcf0fdf0f
-ff0f041f0f3f0f4f0f030f200b0b02550f1a0c0c02550f220d0d02550f1c
-0b0b06550f0c0d0d06550f1a0c0c06550f192b2c74213450182b2b4ef42b
-2b2b2b2b2b5d714dedf4ed10fd2b2b2b2b2b2b2b2b2b2b5d713c10fde4f6
-3c003fede43fedfd5de43fede43f3c3130015d71005d7117171617163332
-363736270623220235341236333217353311140606232226131416333236
-35342623220666af0b3243747d88180e0176b0dbf06ed18dbc7aa665dba0
-beea99a67d7ca8ad7a78a8581a512532645a37b08b013cdd9801018c9880
-fc6af8cf78ab032ad1c0bfccc3c6c300>ArialMT AddT42Char 
-3 7594 75 <00010087000003e805ba00140161b90016ffc0b315173403b8ffe0400e0d
-0d0655250435034503ba0d0403b8ffe0403a1719341708110c1114030501
-000f1c0507140b0a0c250940333634ff0901c0090116400b0b0255164010
-10025509281010025509140e0e025509b8ffec40110d0d025509040c0c02
-55091a0b0b025509b8fff6400b0b0b065509141010065509b8fff8400b0d
-0d0655090a0f0f065509b8fff6b60c0c0655094e16b8ffc04017343634b0
-16f016027016a016b016ff1604160214250100b8ffc04010333634f00001
-00002000d000e0000400b8fffab41010025500b8fffa40170e0e02550004
-0c0c025500080b0b025500040b0b065500b8fffa40160f0f065500020c0c
-065500020d0d0655004e154750182b10f62b2b2b2b2b2b2b2b5d712b3cfd
-3c105d712bf42b2b2b2b2b2b2b2b2b2b2b2b5d712bed003f3c3fed3f1139
-113901123931304379400e060e07250e060c1b010d080f1b01002b012b2b
-81002b5d2b012b33113311363332161615112311342623220606151187b4
-7ec076ae4bb4756b508d3c05bafdf2925da49cfd5f02a1877b538e7dfdbb
->ArialMT AddT42Char 
-3 8014 76 <000200880000013c05ba0003000700cd405e09360b0b02554f099009a009
-b009c009df09f0090700091f09700980099f09b009c009df09e009ff090a
-1f09010001070402030906037e0100060506040a0607250500049f04a004
-b004c004e00406c004f0040200042004d004e0040404b8fff8b410100255
-04b8fffa40170e0e025504040c0c0255040a0b0b025504140b0b065504b8
-ffeab41010065504b8fffeb40d0d065504b8fffc400a0c0c0655044e0847
-50182b10f62b2b2b2b2b2b2b2b5d71723cfd3c003f3f3c3fed0111123939
-111239393130015d72712b133533150311331188b4b4b404ebcfcffb1504
-26fbda00>ArialMT AddT42Char 
-3 8538 78 <00010088000003f805ba000b0261401b060c0d0d0655070656065a09030f
-0df305f60603090c1010025506b8fff4b40c0c02550ab8fff4b40c0c0255
-09b8fff4b40c0c025503b8ffe840100d0d06555503770a02120620132134
-08b8fff0b312273409b8fff0b41227341205b8fff0b312213409b8fff040
-84122734060404050406370947040525062d0a580a7703750ada03e30607
-a60601230626072508390638093f0d4f0d59045906580759097d04790599
-09c606d204d606e406e907f706f90815120a0a0503030402060607090908
-0a0a050908082507061407070603040425050a1405050a0a090603040801
-02000405060708080b0b000a04b8010f400905040c0c0655052208b8010f
-402120073f070207100c0c0655071a900d010d0b2500022501019000013f
-004f000200b8fffe40310e0e025500100d0d025500100c0c0255000a0b0b
-025500120b0b065500120c0c065500080d0d065500190c0de1214766182b
-2b4ef42b2b2b2b2b2b2b5d713c4d10ed10ed4e1071f62b5d4dedf42bed00
-3f3c103c103c3f3c3f3c11173987052e2b047d10c487052e182b0e7d10c4
-0710083c083c0310083c083cb10602435458400d4b09011f098403020918
-0d1134002b5d7159313001435c58400a092c1d3909081d1d3c06b8ffdeb2
-1d3906b8ffd4b2203906b8ffd4b121392b2b2b2b2b595d00715d0171002b
-2b435c58b90006ffc0b2213903b8ffc0b2163903b8ffdeb2103906b8ffde
-b2103903b8ffdeb20c3903b8ffdeb10b392b2b2b2b2b2b59012b2b2b435c
-584012dd040108141639090814143c090814143c06b8fff6b2183906b8ff
-ecb11b392b2b2b2b2b015d59005d2b2b2b2b2b015d712b33113311013301
-012301071188b401aae9fe6a01bfdefea17f05bafcbc01b0fe76fd64021f
-7afe5b00>ArialMT AddT42Char 
-3 9202 79 <000100830000013705ba000300e3b605360b0b025505b8ffc0b337383405
-b8ffc0b334353405b8ffc0b330313405b8ffc0b322253405b8ffc0402515
-17340f051f059f05df05044f05df05f005031f0570058005ff0504010000
-0a0203250100b8ffc0b337383400b8ffc040153335349f0001c000f00002
-00002000d000e0000400b8fff8b41010025500b8fffa401d0e0e02550004
-0c0c0255000a0b0b025500140b0b065500081010065500b8fffeb40d0d06
-5500b8ffffb40c0c065500b8fffc400a0c0c0655004e044750182b10f62b
-2b2b2b2b2b2b2b2b5d71722b2b3cfd3c003f3f3130015d71722b2b2b2b2b
-2b3311331183b405bafa4600>ArialMT AddT42Char 
-3 10014 81 <00010087000003e6043e0016017d40130503061302a810b810e303e713f0
-03f6130604b8fff0403c0b0d347910019810d018e018ff18042008140e14
-16121c05070106160d0a0d0e0c0e2418401010025518400b0b02550b2810
-1002550b140e0e02550bb8ffec40110d0d02550b040c0c02550b220b0b02
-550bb8fff4400b0b0b06550b14101006550bb8fff9400b0d0d06550b0a0f
-0f06550bb8fff640120c0c06550b40333634ff0b01ff0b010b4e18b8ffc0
-401a343634b018f018027018a018b018c01804180302331516250100b8ff
-f6b41111025500b8fffab41010025500b8fffa40170e0e025500040c0c02
-55000a0b0b025500040b0b065500b8fffa40110f0f065500020c0c065500
-040d0d065500b8ffc04012333634f0000100002000d000e00004004e1710
-f65d712b2b2b2b2b2b2b2b2b2b3cfd3cf43c105d712bf65d712b2b2b2b2b
-2b2b2b2b2b2b2b2bed3c103c003f3c3f3fed113901123931304379401606
-11090a080a070a0306102611060e1b010f0a121b01002b012b2b2a81015d
-71002b5d71331133153633321616171615112311342626232206151187a2
-75dd60a150100ab42a6b4873a7042697af45704d327dfd7302866e6d4192
-ccfdbc00>ArialMT AddT42Char 
-3 10468 82 <00020044ffe80427043e000d0019016bb615180d0d065513b8ffe8b40d0d
-06550fb8ffe840730d0d065519180d0d065512070a190c47064808560659
-08670669080834103a123a16351845104b124b1645185c055c0952105d12
-5d1652186d056d0964106d126d1664187701150906050d5b035405540a5b
-0c6c036505650a6c0c0a171c0407111c0b0b14241b400d0d02551b400b0b
-025507b8ffea40110f0f025507180d0d025507100b0b025507b8fff0b40b
-0b065507b8fff0b40d0d065507b8fff0b40f0f065507b8fff0b40c0c0655
-07b8ffc04013242534300701000710072007030731df1b011bb8ffc04049
-1e2334301b011b0e24000c0e0f025500120d0d0255000c0c0c0255001c0b
-0b0255000e0b0b0655000e0d0d0655000c1010065500160c0c0655004024
-25341f003f000200311a3437182b10f65d2b2b2b2b2b2b2b2b2bed10712b
-5df65d5d2b2b2b2b2b2b2b2b2b2bed003fed3fed313001715d0071435c58
-4009530553096205620904015d59002b2b2b2b1310373633320015140606
-23220013141633323635342623220644a489c5db01167beb8bdffeedb9b2
-8786b2b38587b2021301278e76fee1fdcdeb82011e010dcccbccd1c5cbca
->ArialMT AddT42Char 
-3 10918 83 <00020087fe690421043e0012001e0162408e0c102d103d104b10043f20b0
-20021f20290c231d3215321d421d70209020083a173a1b4a174a1b59085b
-0c5c175c1b6a086b0c69106d176b1bc020d314dd18dd1ad31ee414e41ee0
-20ff201623042b102b1535043a1046044a105a10e50beb1dfe100b110e03
-161c1c06070106161c0e0b000e1924d00a01100a400a600a800a0420400b
-0b025520400d0d02550ab8ffe6400b0f0f02550a180d0d02550ab8fffab4
-0c0c02550ab8ffeeb40b0b06550ab8fff4b40f0f06550ab8ffe840230c0c
-06550a74011333023312250000c001019001a001b001f001041f013f014f
-010301b8fffc401d0e0e025501100d0d025501100c0c025501100b0b0255
-010c0b0b065501b8fff6b41010065501b8fffc40160f0f0655010c0c0c06
-5501120d0d065501191f473718012b4e10f42b2b2b2b2b2b2b2b2b5d7172
-3c4d10fdf4e410fd2b2b2b2b2b2b2b2b5d71ed003f3fed3f3fed11391239
-3130005d015d717200711311331536363332161615140206232226271103
-141633323635342623220687a43a926888d06a75df7b5a8f2e11a67678ab
-a77473b1fe6905bd8a51518cff98a3fefb8b4c3afdfb03a4cdc4cbd5cbca
-d700>ArialMT AddT42Char 
-3 11776 85 <00010085000002c6043e001100c9403b2f13011004012304340443045304
-66047404060911080908090d1311090d000308010b1c06070106000a0928
-900801082220130113022211250100b8ffc04010333634f0000100002000
-d000e0000400b8fff8b41010025500b8fff840110e0e025500040c0c0255
-00060b0b025500b8fffcb41010065500b8fff440160f0f065500060c0c06
-5500080d0d0655004e1247c4182b10f62b2b2b2b2b2b2b2b5d712b3cfde4
-105df472e4003f3f3fed11393911393901111239390010c9870e7dc43130
-005d72015d33113315363633321707262322060706151185a23e693f5b5e
-3e42423b5e141e0426a171483aa727473f6072fdd400>ArialMT AddT42Char 
-3 12038 86 <0001003fffe803b1043e00300317407b042214223a094a09442456226522
-7c098e098424a613ab2cc2030d09171a1817304b2cd617051b0255020210
-32010a185c085c095c0a5c0b5c0c5c0d6a086a096a0a6a0b6a0c6a0db426
-b4270f27262427242936245a0a590b64266428742374248024930a9c0c92
-28972c9530a40aa90ca327a428b326c5261628b8fff4b40d0d065522b8ff
-f4b40d0d065523b8fff4b40d0d065524b8fff4b40d0d065528b8fff4b40c
-0c065522b8fff4b40c0c065523b8fff4b40c0c065524b8fff4b40c0c0655
-1db8ffde40121e395a0827250c0a041a202615040b2e1d1ab802aa402219
-2c0b0b02551f193f194f195f19af19cf19060f191f196f19df19041f198f
-190219bd02550015000002aa0001ffc040140b0b025510014001021001d0
-0102000110010201b8ffc0b314163401b8ffc040100e113401012e5c1d6c
-1d021d1c150704b8fff4b40b0b025504b8ffe6b41010065504b8ffe64013
-0f0f0655041c2e0b1f1a011a24194013183432b8ffc0402f0f0f02551918
-0f0f025519180d0d025519160c0c025519201010065519200f0f06551910
-0c0c065519160d0d065519b8025bb207242ab8ffc0b51c39d02a012ab8ff
-e6b40c0c02552ab8ffe8b40f0f02552ab8ffe8b40c0c06552ab8ffeab60d
-0d06552a1a32b8ffc04021272a346032c032023f32803202321001010124
-00180d0d025500100d0d06550020b8fff4b40d0d025520b8fff4b4101006
-5520b8fff440190f0f065520240f100b0b02550f160c0c02550f200d0d02
-550fb8fffa40200f0f02550f0e0c0c06550f0c0d0d06550f22df00013f00
-4f00020019313437182b4e10f45d714df42b2b2b2b2b2bed2b2b2b102b2b
-ed724e105d712bf62b2b2b2b712b4dedf42b2b2b2b2b2b2b2b2bed72003f
-ed2b2b2b3fed7112392f2b2b5d71722be410fd5d71722be4111239111239
-0111121739313043794040272d1e2305142c261110121013100306220d20
-1b000928071b01052d071b011e14201b00210e231b0022230d0c08290a1b
-012827090a062b041b001f101d1b01002b2b103c103c2b103c103c2b012b
-2b2b2b2a2b818181002b2b2b2b2b2b2b2b2b5d71015d72715d1337161633
-323635342726272e02353436373636333216161707262623220615141716
-1716171e02151406062322263fb20f897b7c78352593c6994f41382a9153
-7dbd5a11b00c73697c6a16162f1b84bf975669c67dcfd9013d1c6b726544
-3d2318253249814e4779281f2b487b6718525c5237231c1d130a2433417c
-5c5a9f57ac00>ArialMT AddT42Char 
-3 12974 87 <00010024fff2022a0599001700d8b9000affc0b323263409b8ffc0404123
-263480190100010c0d0a0103001610092b0f0a06161c030b0f1022002201
-0d12250c01ff070845094560077007800790070400072007a007b007c007
-d0070607b8ffeeb41010025507b8fff4b40f0f025507b8fff2b40e0e0255
-07b8fff8b40d0d025507b8fff8b40c0c025507b8fffab41010065507b8ff
-f0400b0f0f065507060c0c065507b8ffe8b40d0d065507ba026a00180136
-b166182b10f62b2b2b2b2b2b2b2b2b5d71f4e410ed3cfd3c10e4f43c003f
-ed3f3cfd3c1139123911333310c93130015d2b2b25170623222626351123
-353311371133152311141616333202101a4c3c626c2c8484b3b5b5132b28
-1ea19f103e65a202638c01076cfe8d8cfd934d2c1a00>ArialMT AddT42Char 
-3 13266 88 <00010083ffe803e004260018014fb9001affc0400915173402201316340f
-b8fff040331214342b1301240813160c0113160b06000a111c030b003316
-251817403336341a401010025517281010025517120e0e025517b8ffec40
-0b0d0d025517040c0c025517b8fff4400b0b0b065517141010065517b8ff
-f8400b0d0d0655170c0f0f065517b8fff6400d0c0c0655ff1701c0170117
-4e1ab8ffc04015343634b01af01a02701aa01ab01aff1a041a0c2509b8ff
-c04010333634f0090100092009d009e0090409b8fff8b41010025509b8ff
-f840110e0e025509040c0c0255090a0b0b065509b8fff640160f0f065509
-020c0c065509020d0d0655094e194750182b10f62b2b2b2b2b2b2b5d712b
-ed105d712bf65d712b2b2b2b2b2b2b2b2b2b2b3cfde4003fed3f3f3c3939
-0111123931304379401a04100e0d0f0d0206070806080508030610040c1b
-000d08111b00002b012b2a2a81005d012b2b2b2135062322262627263511
-3311141716163332363635113311033f7cd55ea34f100bb40b116e51518e
-3bb49cb4486d4f35730292fdb38d314751538f880239fbda>ArialMT AddT42Char 
-3 13680 89 <0001001a000003e80426000a01eab1020243545840170508000a08060106
-0a0005090805010205240f0f0255052f2bddcd10ddcd113333003f3f3f12
-3931301bb7350501002211390ab8ffde400d11390916121c340816121c34
-02b8ffeab3121c3401b8ffeab3121c340ab8ffd840091e213400281e2134
-0ab8ffe8400922253400162225340ab8ffda407e282e340020282e340f0c
-29002809260a3900350a4800470a56015602590858096601660269086909
-78007701770279087809770a870187028603890788088a099d009809910a
-ac00a20abd00b707b10ac900c50ada00d50aec00e30afb00f40a2c0a0005
-0a1800160a2800260a370a4f00400a09054012163405400b0d34b1060243
-5458400905010008060106000ab8fff4400f0d0d06550a000c0d0d065500
-050908b8fff440120d0d0655080501020c0d0d06550205050c0b1112392f
-dd2bcd10dd2bcd10cd2bcd2b002f3f3f11123931301b40370a0708082509
-0a1409090a0003020225010014010100050a0a000a09080802020106070a
-09030001052f0c010c22084040400980090209b8011bb5400580050205b8
-011b400920024001220bead2182b10f6ed1a19fd5dfd5d1a18ede45d1112
-3939123939003f3c103c103c3f3c113987052e2b877dc4872e182b877dc4
-593130002b2b01715d2b2b2b2b2b2b2b2b2b2b2b2b005d59210133131617
-363713330101aefe6cbee4251f182becb9fe6e0426fd84676f54760288fb
-da00>ArialMT AddT42Char 
-3 14222 90 <00010006000005b704260012041db10202435458b90012fff440110d0d02
-5507060d0d025500060d0d02550ab8ffd4b40c0d025504b8ffe8400b0c0d
-025511200c0d02550ab8ffc0b40e10025504b8ffc0402f0e10025511400e
-100255040a110301000c06070601060f0a000a0d0c060c0c02550c110102
-040a04110a0c0c025511b8fff8b40d0d0255112f2b2bcdcd10d6cd10d42b
-cd003f3f3f3f3f111217393130002b2b2b2b2b2b012b2b2b1b40160f1401
-2a04290a024a115b118e110311200d0d06550ab8ffe0b40d0d065504b8ff
-e0b40d0d065511b8fff040091f2134101c1d273409b8fff040b71f243404
-060c0913061b09191205040004060b090b0e08121000130314071c081b0b
-1d0e240025072a082b0e340035073a083b0e4403470640074d084b0b430f
-47114a125b0f52126b076408671279067a077408b906ba0fb612f506fb09
-280b112800280d270e280f27122f1438003712770886089803970ca701a8
-02a80ba60cb500b606ba0ec804d606d909e804e80fe712f406fa091c0b06
-0d0d06550c060d0d065510060d0d06550e060d0d06550f060d0d065512b1
-0602435458401b0a0e0f0412001108070825070f250e122500000e07030d
-010c250db8ffd640370b0b06550d0225012a0b0b0655010d011413060a0b
-11260a2b115404520a5c116c117c118a110a110a040300010f0a000a0c06
-07060106003f3f3f3f3f111217395d01111239392f2bf42f2bf411121739
-10e410e410e41112391112391112391b40140305050206070705090a0a08
-0b0c0c0a1011110fb8ff4bb305001220b8ff4940660a0f0e20c311070820
-071112122b0507140505070e0a0c0c250d0e140d0d0e08110f0f2b0a0814
-0a0a080005020225010014010100000201071204080f110c0e0d0a110a04
-03120d0c0c0808070702020106120f0f0e0e000a14f6100d01600d700d80
-0d030db801a7400a204f0a016f0a7f0a020ab8025540094f11016f117f11
-0211b80255400b1005016005700580050305b801a7b501f613f666182b4e
-10f4194df45d5d18fd5d71fd5d711a19fd5d5d18e6003f3c103c103c3f3c
-103c103c103c103c1217390111123939123939113939123939874d2e2b87
-7dc4872e182b877dc4872e182b877dc4872e182b877dc42b2b2b870e10c4
-070e103c070e103c870e10c4870e10c44bb01f5358b40d200c2002bcffe0
-0001ffe0000effd0b400300f2012b8ffe0013838383838383838594bb034
-5358b90008ffd0b10730013838594bb021534bb033515a58b90008ffe0b1
-0720013838594bb012534bb01e515a58b9000effd0b60f200d200c2008b8
-ffd0b2073012b8ffe0b2003802baffe00001ffe001383838383838383838
-38594bb012534bb017515a58b90011ffe0b30a2004200038383859593130
-01435c58b9000effd4b61239002c123900b8ffd4b113392b2b2b592b2b2b
-2b2b5d71722b2b2b002b2b2b715d015d5921013313173637133313173713
-330123032703014bfebbbaa93f0433a9b99f353db6affeb4bba929d70426
-fd9be411ca026efd98cbcd0266fbda027cb5fccf>ArialMT AddT42Char 
-4 0 92 <00010021fe5103ee0426001a01f7b10202435458401d0a140f030b031c19
-0f12060b061340120f200b400c200f180f0f02550f192f2b1add1a18cd1a
-1910dd1a18cd003f3f3fed12173931301bb30f1c010fb8ffde406d1c3928
-14560faf0a03400d400f020f202830341020283034070c0912160d181227
-0b270c270d360c360d350e99110b28122813481659125913591569126913
-69157906760d79117a147a15850d8a118c128c138914980aa80bbc10bb11
-ba14ea0ae714f50dfd10f914ff1c1e12b106024354584016130b1c1b040f
-440f840f030f190b031c190f12060b06003f3f3fed1112395d0111123939
-1b40370f0f0c101112120a00031914131325120a1412120a0f0c0f110c25
-0b0a140b0b0a1312120c0c0b06031c190f001c101c022f1cbf1c021cb802
-3fb50f1340124014b80254400b3f124012025f12bf120212b80142b60f01
-2200451b0ab8025440120f200b4040200c300c4f0c03500cff0c020cb801
-42b32f0f010fb8023fb41b207c66182b1a1910fd71f45d711a18ed1a1910
-ed1810f4e41910e45d71ed1a1810ed1910e45d7100183fed3f3c103c103c
-87052e2b087d10c487052e182b0e7d10c400111239870e103c3c08c44bb0
-0e534bb018515a58bb000cffe8000bffe80138385959313001435c58b900
-14ffdeb637390a2237390eb8ffe8b51539112215392b2b2b2b595d712b2b
-00715d2b015d591327163332363736373637013313161736371333010607
-060623227f143b2c3c48171126050bfe6dc2dd2b221f2be3b4fe6c412430
-7c5634fe67a91028241b6b0f1d0428fd9975817c76026bfbc8af42595300
->ArialMT AddT42Char 
-2 0 0 <00020100000005000500000300070000211121112521112101000400fc20
-03c0fc400500fb002004c000>ArialMT AddT42Char 
-ArialMT /CharStrings get begin
-/underscore 66 def
-/a 68 def
-/b 69 def
-/c 70 def
-/d 71 def
-/e 72 def
-/f 73 def
-/g 74 def
-/h 75 def
-/i 76 def
-/k 78 def
-/l 79 def
-/n 81 def
-/o 82 def
-/p 83 def
-/r 85 def
-/s 86 def
-/t 87 def
-/u 88 def
-/v 89 def
-/w 90 def
-/y 92 def
-end
-ArialMT /Encoding get
-dup 95 /underscore put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 107 /k put
-dup 108 /l put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 121 /y put
-pop
-end
-%ADOEndSubsetFont
-/KUDFNS+ArialMT /ArialMT findfont ct_VMDictPut
-/KUDFNS+ArialMT*1 
-[95{/.notdef}rp /underscore /.notdef /a /b /c /d /e 
-/f /g /h /i /.notdef /k /l /.notdef 
-/n /o /p /.notdef /r /s /t /u 
-/v /w /.notdef /y 134{/.notdef}rp]
-KUDFNS+ArialMT nf
-KUDFNS+ArialMT*1 [9 0 0 -9 0 0 ]msf
-347.005 248.76 mo
-(gsicc_init_buffer)
-[5.04001 4.56299 2.043 4.56299 4.56302 5.04001 2.043 5.03998 1.91702 2.51999 5.04001 5.03998 
-4.923 2.51999 2.52002 5.03998 0 ]xsh
-355.528 259.56 mo
-(gsicc_get_link)
-[5.04001 4.56299 2.043 4.56299 4.56302 5.04001 5.03998 5.04001 2.51999 4.923 2.043 2.043 
-4.923 0 ]xsh
-338.608 270.36 mo
-(gsicc_release_link)
-[5.04001 4.56299 2.043 4.56302 4.56299 5.03998 2.99695 5.04001 2.043 4.92297 5.04001 4.56302 
-4.92297 5.04001 2.043 1.91699 5.04001 0 ]xsh
-317.269 290.763 mo
-(gsicc_set_icc_directory)
-[5.04001 4.56299 2.043 4.56302 4.56299 5.03998 4.56302 5.04001 2.40298 5.04001 2.043 4.43698 
-4.56302 4.923 5.03998 2.04303 2.99692 4.923 4.56299 2.51999 4.923 2.99695 0 ]xsh
-343.189 301.563 mo
-(gsicc_set_profile)
-[5.04001 4.56299 2.043 4.56299 4.56302 5.04001 4.56299 5.03998 2.40302 5.04001 5.03998 2.99695 
-4.923 2.51999 2.043 2.043 0 ]xsh
-312.706 312.363 mo
-(gsicc_init_device_profile)
-[5.04001 4.56299 2.043 4.56302 4.56299 5.03998 2.04303 5.03998 1.91699 2.52002 5.03998 5.04001 
-4.923 4.43701 2.043 4.56299 5.04001 4.923 5.03998 2.99695 5.03998 2.40302 2.043 2.043 
-0 ]xsh
-319.663 323.163 mo
-(gsicc_set_gscs_profile)
-[5.04001 4.56299 2.043 4.56299 4.56302 5.04001 4.56299 5.03998 2.40302 5.04001 5.03998 4.43701 
-4.56299 4.43701 5.04001 5.03998 2.99695 4.923 2.51999 2.043 1.91702 0 ]xsh
-319.186 333.963 mo
-(gsicc_get_gscs_profile)
-[5.04001 4.56299 2.043 4.56299 4.56302 5.04001 5.03998 5.04001 2.51999 4.923 5.04001 4.43698 
-4.56302 4.43698 5.04001 5.03998 2.99695 4.923 2.51999 2.04303 2.04297 0 ]xsh
-338.743 344.763 mo
-(gsicc_profile_new)
-[5.04001 4.56299 2.043 4.56299 4.56302 5.04001 5.03998 2.99695 5.03998 2.52002 1.91699 2.043 
-5.04001 4.92297 5.04001 5.04001 0 ]xsh
-282.583 355.563 mo
-(gsicc_get_profile_handle_buffer)
-[5.04001 4.56299 2.043 4.56302 4.56299 5.03998 5.04001 5.04001 2.51999 4.923 5.04001 2.99692 
-5.04001 2.40298 2.043 2.043 4.923 5.04001 5.03998 4.923 5.04001 5.03998 1.91702 5.04001 
-5.03998 4.923 5.03998 2.51999 2.52002 5.03998 0 ]xsh
-/KUDFNS+ArialMT*1 uf
-/KUDFNS+ArialMT uf
-/ArialMT uf
-390.25 382.875 mo
-474.75 382.875 li
-474.75 527.625 li
-390.25 527.625 li
-cp
-@
-%ADOBeginSubsetFont: ArialMT Initial
-ct_T42Dict begin
--0.664 -0.324 2 1.004
- 256 array 0 1 255 {1 index exch /.notdef put} for  /ArialMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f3210325d73000000cc000000606376
-7420a11cd7eb0000012c000006546670676dcc79599a000007800000066e
-676c796607022dca000094e0000822cc68656164d6144b3e00000df00000
-003668686561123315fe00000e2800000024686d7478f65efffb00000e4c
-000034d46c6f6361361cd72000004320000034d86d617870124c05df0000
-77f8000000206e616d659617a74000007818000011057072657025d64dbf
-0000892000000bbe67646972000000000000000000000000000303880190
-00050008059a05330000011b059a0533000003d1006602120805020b0604
-020202020204e0002affc00078430000000900000000544d432000400020
-fffc05d3fe510133073e01b2400001ffffff0000042605bb000000200004
-05ba001905ba001a05a70019042600180000ffe70000ffe80000ffe7fe69
-ffe805ba0019fe69ffe802ea000000b8000000b80000000000a800ad0169
-00ad00bf00c201f0001800af00b900b400c800170044009c007c00940087
-0006005a00c80089005200520005004400940119ffb4002f00a1000300a1
-00cd00170057007e00ba00160118ffe9007f008503d300870085000d0022
-00410050006f008d014cff75005c00df04830037004c006e00700180ff58
-ff8eff92ffa400a500b903c8fffd000b001a0063006300cdffee05d8ffdc
-002d005c0095009900df019209b500400057008000b9039d0072009a035d
-0401ff67fffa00030021007700cd0004004d00cd01c0022b004c006500e7
-0118017c034305d8ffa3ffb0ffc40003001c005d0068009a00ba01350147
-0221055cff4dffcd0016002d00780080009900b200b600b600b800bd00da
-010c05f0ffa4fff00019002c0049007f00b400ce01c003fefd81fe3f0000
-00050018002900390049006f00be00c700d0012301c1026f050c05320540
-057affd4001400310055005700a700b400e601f7027e027e027f03c60446
-ff42000e0085009100bf00c200c500e1011a012f014f01560229026f029e
-03720008002c00310031006400690089009800c700de012b01b6020c02cf
-03a304ab04fb061dfee0ff0e00060026009b009d00c1010d011801200173
-018201d601e30243025f029b02e2039404a904d20761001c005e006d008d
-00ab00f7011201380151015b0168017c01870191019901cd01d001e80241
-0254026b02ef0368037103bd044204420453047304830586058b06e8fe58
-fec4fed1fef7ff32ff860051007c008100910095009e00b400b900cf00d9
-00d900df00e20105010b010e010e012001210155017b017b017e018d01a2
-01a801a901b401d001d001e201e901f201f501fb020002000206021b0221
-022202220223027202770294029c02cf02cf02d002ec02f903170322032b
-0335033c0359036f037103870390039003b503e1041a04cf04ff05320532
-0596059f05a805ab05c205f0060c0782080008ccfca3fd2afddefe00fe88
-fe96feb2feb4ffe100150019001a001c001f003c005100610061006a0078
-009600a500af00d3010c0118011a012a013e014c0151015f016a01710178
-01820184019a01a501a801a901ae01bc01cd01d701ef0200020d021c0221
-0222022e02350242024f024f025e026502710290029202b402d602fa0307
-030b030f0315032a0347035d036503740379039603b003cc03dd03e203f6
-03fc03fc03ff040a041f04220426042b0447045f0475049e04e704e7055c
-05cb05e5060a066d068606b806f10736073e07500751075d078f07b607d4
-086000b600c300b500b700000000000000000000000001e00381034503b5
-008e0233041902ce02ce002d005f0064034d023f000002a80188027d01b4
-02240578063b023b014e00f00426029402c6029f02f6023b034d014b0153
-006a0231000000000000061404aa0000003c04c300ed04bc026502ce03b5
-0078060c017e02ef060c00b201000239000001c50330042b03cb00da03df
-010704a100db040a011701ed02a70350010b01bd043e05580021039c00ae
-0371017d00b5024500000afb088c012b014e01aa00870054013201f803ff
-0003024e00b4003703e30083006b02d800ed00770088009701640467008e
-0033017c00e700a6029e0329056e062a061501c90269048a021301b40002
-04a9000002390124010305140084015d039a06ef02d9007500cf040a00de
-03ac04bc02cf02ae034d04f005520168006d007d00860071ff8100790558
-04d2016700030156002504e00094007c033204210094007f0072005c002f
-00b6001800ba00b80041034d00720018001f004c016a01550099009a009a
-009800b200040078006900140057006e00ce00b4065402b80067050e0165
-00e7000004cbfe52005affa60099ff67006eff92002dffd40087ff7c00b8
-00a800e5008f00a80185fe7b0070001e00d900de014c054602cf0546ff2d
-028a02d90253029600b700000000000000000000000000000125011800ea
-00ea00ae0000003e05bb008a04d70053003fff8cffd50015002800220099
-0062004a00e4006d00ee00e5004803c00033fe4e02b1ff460370007905df
-0051ffa7ff1f010a0068ff6c004f00bc00a507050061072b00ed04b001d2
-00b6007b00650252ff740365fe690094008f005c00400086007500890089
-4043555441403f3e3d3c3b3a3938373534333231302f2e2d2c2b2a292827
-262524232221201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09
-0807060504030201002c4523466020b02660b004262348482d2c45234623
-6120b02661b004262348482d2c45234660b0206120b04660b00426234848
-2d2c4523462361b0206020b02661b02061b004262348482d2c45234660b0
-406120b06660b004262348482d2c4523462361b0406020b02661b04061b0
-04262348482d2c0110203c003c2d2c20452320b0cd442320b8015a515823
-20b08d44235920b0ed51582320b04d44235920b09051582320b00d442359
-21212d2c20204518684420b001602045b04676688a4560442d2c01b10b0a
-432343650a2d2c00b10a0b4323430b2d2c00b0172370b101173e01b01723
-70b10217453ab10200080d2d2c45b01a234445b01923442d2c2045b00325
-456164b050515845441b2121592d2cb00143632362b0002342b00f2b2d2c
-2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b1
-2cc08a8cb8100062602b0c642364615c58b00361592d2c45b0112bb01723
-44b0177ae4182d2c45b0112bb01723442d2cb01243588745b0112bb01723
-44b0177ae41b038a45186920b01723448a8a8720b0a05158b0112bb01723
-44b0177ae41b21b0177ae45959182d2c2d2cb0022546608a46b040618c48
-2d2c4b53205c58b002855958b00185592d2c20b0032545b019234445b01a
-23444565234520b00325606a20b009234223688a6a606120b01a8ab00052
-7921b21a1a40b9ffe0001a45208a54582321b03f1b235961441cb114008a
-5279b31940201945208a54582321b03f1b235961442d2cb110114323430b
-2d2cb10e0f4323430b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2c
-b10e0f432343650b2d2cb11011432343650b2d2c4b525845441b2121592d
-2c0120b003252349b04060b0206320b000525823b002253823b002256538
-008a63381b212121212159012d2c4bb06451584569b00943608a103a1b21
-2121592d2c01b005251023208af500b0016023edec2d2c01b00525102320
-8af500b0016123edec2d2c01b0062510f500edec2d2c20b001600110203c
-003c2d2c20b001610110203c003c2d2cb02b2bb02a2a2d2c00b00743b006
-430b2d2c3eb02a2a2d2c352d2c76b8022323701020b802234520b0005058
-b00161593a2f182d2c21210c6423648bb84000622d2c21b08051580c6423
-648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb815
-55621bb200802f2b59b002602d2c0c6423648bb84000626023212d2cb400
-0100000015b00826b00826b00826b008260f10161345683ab001162d2cb4
-000100000015b00826b00826b00826b008260f1016134568653ab001162d
-2c4b53234b515a5820458a60441b2121592d2c4b545820458a60441b2121
-592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb01343
-58031b02592d2cb0134358021b03592d2c4b54b012435c5a58381b212159
-2d2cb012435c580cb00425b00425060c6423646164b807085158b00425b0
-0425012046b01060482046b0106048590a21211b2121592d2cb012435c58
-0cb00425b00425060c6423646164b807085158b00425b00425012046b8ff
-f060482046b8fff06048590a21211b2121592d2c4b53234b515a58b03a2b
-1b2121592d2c4b53234b515a58b03b2b1b2121592d2c4b53234b515ab012
-435c5a58381b2121592d2c0c8a034b54b00426024b545a8a8a0ab012435c
-5a58381b2121592d2c4b5258b00425b0042549b00425b00425496120b000
-5458212043b0005558b00325b00325b8ffc038b8ffc038591bb040545820
-43b0005458b00225b8ffc038591b2043b0005458b00325b00325b8ffc038
-b8ffc0381bb00325b8ffc03859595959212121212d2c462346608a8a4623
-20468a608a61b8ff8062232010238ab902c202c28a70456020b0005058b0
-0161b8ffba8b1bb0468c59b0106068013a2d2cb1020042b123018851b140
-0188535a58b910000020885458b202010243604259b12401885158b92000
-0040885458b2020202436042b12401885458b2022002436042004b014b52
-58b2020802436042591bb940000080885458b202040243604259b9400000
-8063b80100885458b202080243604259b94000010063b80200885458b202
-100243604259b94000020063b80400885458b20240024360425959595959
-2d2cb0024354584b53234b515a58381b2121591b21212121592d00000001
-00000005028fa58dc35f5f0f3cf5081b080000000000a2e3272a00000000
-c14fd713faaffd671000080c00000009000100010000000000010000073e
-fe4e00431000faaffa7a1000000100000000000000000000000000000d35
-06000100000000000239000002390000023900b002d7005e047300150473
-0049071d0077055600580187005a02aa007c02aa007c031d004004ac0072
-023900aa02aa0041023900ba0239000004730055047300df0473003c0473
-00560473001a047300550473004d047300610473005304730055023900b9
-023900aa04ac007004ac007204ac00700473005a081f006f0556fffd0556
-009605c7006605c7009e055600a204e300a80639006d05c700a4023900bf
-04000037055600960473009606aa009805c7009c063900630556009e0639
-005805c700a10556005c04e3003005c700a105560009078d001905560009
-0556000604e300290239008b023900000239002703c100360473ffe102aa
-00590473004a0473008604000050047300460473004b0239001304730042
-0473008701c7008801c7ffa20400008801c7008306aa0087047300870473
-0044047300870473004802aa00850400003f02390024047300830400001a
-05c700060400000f040000210400002802ac0039021400bc02ac002f04ac
-00570556fffd0556fffd05c70068055600a205c7009c0639006305c700a1
-0473004a0473004a0473004a0473004a0473004a0473004a040000500473
-004b0473004b0473004b0473004b023900bd023900230239ffe502390009
-047300870473004404730044047300440473004404730044047300830473
-0083047300830473008304730049033300800473006b0473001b04730051
-02cd006d044c000104e3009905e5000305e50003080000e102aa00de02aa
-003d0464004e080000010639005305b4009a0464004e0464004d0464004d
-0473fffd049c00a003f4003805b4007a069600a1046400000231000002f6
-002f02ec002d0625007f071d004404e3008104e3009e02aa00e804ac0072
-046400540473002e0464003304e5001a047300860473008c080000ef0556
-fffd0556fffd0639006308000081078d00520473fffc0800000002aa0053
-02aa004701c7008001c7006c0464004e03f4002f04000021055600060156
-fe390473ffe402aa005c02aa005c040000170400001704730049023900b9
-01c7006c02aa0047080000250556fffd055600a20556fffd055600a20556
-00a20239008d0239ffe00239000402390015063900630639006306390063
-05c700a105c700a105c700a1023900c602aa001902aa000602aa001d02aa
-002e02aa00e502aa00a202aa006b02aa003a02aa004b02aa002804730000
-01c700030556005c0400003f04e3002904000028021400bc05c7fffd0473
-004905560006040000210556009e0473008704ac007204ac00a102aa006b
-02aa001902aa002106ac006b06ac006b06ac0021047300000639006d0473
-0042023900b10556005c0400003f05c700660400005005c7006604000050
-04730046046bffe102aa00ee0556fffd0473004a0556fffd0473004a05c7
-009e04eb004705c7fffd055600a20473004b055600a20473004b04730096
-01c7004204730096025500880473009a02ac008305c7009c0473008705c7
-009c04730087063900630473004405c700a102aa008505c700a102aa003c
-0556005c0400003f04e300300239002404e300300300002305c700a10473
-008305c700a10473008304e300290400002804e3002904000028046800a4
-063900600662005504a00048047400480391006204f000440329002e0530
-0048046bffe1040000b002eb005208c000330800004f040000990800004f
-040000990800004f040000980400009807d5016a05c0009e04ab007204d5
-009d04ac007104d5022204d5010505abffe9050001c905ab027e05abffe9
-05ab027e05abffe905ab027e05abffe905abffe905abffe905abffe905ab
-ffe905ab01c005ab027e05ab01c005ab01c005abffe905abffe905abffe9
-05ab027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab
-01c005ab01c005abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905abffe905abffe905ab02d605ab006605abffea05d5ffff04d50092
-0800000007eb013007eb012007eb013007eb012004d500b204d5008004d5
-002a082b0198086b01b807550010060000f40600006f0440003a05400037
-04c0003f04150040040000250600005505e100bf038d008904d5ffd90180
-008002d50086071500610296000f04d5009202d6008302d6008304d500b2
-02d600700556fffd0473004a05c700660400005005c70066040000500556
-00a20473004b055600a20473004b055600a20473004b0639006d04730042
-0639006d047300420639006d0473004205c700a40473008705c7001f0473
-00060239ffce0239ffce0239ffe40239ffe40239fff60239fff50239004b
-01c700190400003701c7ffa20556009604000088040000860473009601c7
-fffa05c7009c0473008705c900a50473008b063900630473004406390063
-0473004405c700a102aa006b0556005c0400003f04e300300239000c05c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-078d001905c70006055600060400002101c700890556fffd0473004a0800
-0001071d00440639005304e30081023900b9078d001905c70006078d0019
-05c70006078d001905c70006055600060400002101c7008a02aaffe10473
-001b04cd005a06ac006b06ac002206ac002206ac004a02aa00e202aa006b
-02aa00de02aaffea0557ffff0646ffa706b4ffa80312ffa80632ffa706d8
-ffa70605ffa701c7ff780556fffd055600960558fffe055600a204e30029
-05c700a4023900bf055600960558000b06aa009805c7009c0533006d0639
-006305c700a40556009e04f2009404e30030055600060556000906af007f
-05fb0061023900040556000604a00048039100620473008b01c7006b0460
-0088049a008c04000019038700480473008b0473005c01c7008904000086
-04000018049c00a00400001a0395005c04730044048d008303db00560460
-00880433001105b4007a063f005701c7ffc9046000880473004804600088
-063f0057055700a206eb0032045500a105c000640556005c023900bf0239
-0004040000370875000d081500a406d5003104a900a10515000a05c000a0
-0556fffd054000a705560096045500a1056b0000055600a20763000704d5
-004e05c000a105c000a104a900a10540001206aa009805c700a406390063
-05c000a00556009e05c7006604e300300515000a061500520556000905eb
-009f05550057075500a1078000a106550000071500a8054000a505c00055
-081500a405c7001a0473004a0495005b0440008802eb008804ab00000473
-004b055afffb03ab003204780087047800870380008604ab00180580008c
-046b00880473004404550088047300870400005003aa0026040000210695
-004b0400000f0495008a042b0045066b008d0695008d0500002805c0008b
-042b008404150030060000890455001f0473004b0473000002eb00890415
-004b0400003f01c700880239000901c7ffa2074000130680008304730000
-0380008604000021046b008803e900a1034a008808000041089500a00585
-002d000001010000001e0000003100000031000001010000007e0000007e
-0000008c0000008c000001010000001000000101000001210310007d0000
-008c023300d20000030b0000ff04023900b9048100690456003203310019
-0411002d04d1009601f9009b030f005f04ca009b04b8008c01f9009b0413
-002803b0005003b4003c04ca009b04cf005001f9009b02d2003c0498005a
-043c00190488006e045f007303b1001903d4000a0466009604130028058e
-00640524002803f2009b03f2009b03f2009b01e3005a0356005a0686009b
-01f9ffac041300280413002803b4ff5703b4ff570448002d058e0064058e
-0064058e0064058e00640481006904810069048100690456003203310019
-0411002d04d10096024b0000034a000004b8008c024b00000413002803b0
-005003b4003c04cf005002d2003c0498005a0488006e045f007303d4000a
-0466009604130028058e00640524002801f9009b0456003203b00050045f
-0073049b003c0000ffdc0000ff250000ffdc0000fe51028d00ab028d00a0
-02da0043034d007901a8ffba000000460000004600000046000000460000
-00480000004600000046000000460435017c0435012e043500b704350081
-0435012c043500be043500af043500810435009a043500db04350085028d
-00c1043500b3060001000600010002420036060001000435009e04350098
-043500cb0600010006000100060001000600010006000100000000460600
-010006000100060001000600010006000100060001000600010006000100
-051bffba06000100060001000600010005b5003a05b5003a01f4ffba01f4
-ffba060001000600010006000100060001000481003604350036043dffba
-043dffba03e9004a03e9004a067f0014077600140327ffba041effba067f
-0014077600140327ffba041effba051b003204b500240300fff706000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010000000030
-0000004600000046000000400000004606000100060001000000ffdc0000
-fe510000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ff160000ff160000ffdc0000ff160000ffdc0000ff200000ffdc0473
-004a08000000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010006000100028d
-007f028d005d0600010004ee0015034d007901a8000e01d6ffdc01a80056
-01d60010037500320375003201a8002d01d60013051b003204b5002401f4
-ffba01f4ffba01a8009301d6001305b5003a05b5003a01f4ffba01f4ffba
-024200000300fff705b5003a05b5003a01f4ffba01f4ffba05b5003a05b5
-003a01f4ffba01f4ffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba02b3
-005f02b3005f02b3005f02b3005f03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba08c9003e08c9003e06c5ffba06c5ffba08c9003e08c9003e06c5ffba
-06c5ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7
-ffba04a7ffba045a002a039a00360435ffba0327ffba045a002a039a0036
-0435ffba0327ffba064f0027064f00270224ffba021affba04a7004604a7
-00460224ffba021affba04cf002d04cf002d0327ffba0327ffba040d0047
-040d004701a8ffba01a8ffba02b4002302b400230327ffba0327ffba0435
-00450435004501f4ffba01f4ffba024200360300fff7039affba0327ffba
-0375003203750032051b003204b50024051b003204b5002401f4ffba01f4
-ffba045a004004ce0049045a002604ce0039045a005304ce004a045a0053
-04ce004a0600010006000100000000460000004606000100060001000600
-010000000046000000460600010006000100000000480000004606000100
-060001000600010000000046000000460000004600000046000000400000
-003006000100000000460000004606000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d00ca028d00c7028d
-00c606000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000100ffba0800ffba1000ffba06dc0063053f004406d5
-00a1055b00830000fddc0000fc2f0000fca60000fe540000fcd70000fd73
-0000fe290000fe0d0000fd110000fc670000fd9d0000fbf50000fc720000
-fed50000fed50000ff02041b00a006ac006b06ac00190000feb60000fd73
-0000fe080000fca60000fe530000fd110000fbc80000faf40000faaf0000
-fc720000fbaa0000fb6a0000fcf10000fc7d0000fbdd0000fcc10000fb98
-0000fdea0000fe840000fdc20000fcf10000fd5f0000fe760000febc0000
-fceb0000fd6c0000fd580000fc900000fd150000fc2c0000fc130000fc12
-0000fb960000fb9601c700880556fffd0473004a0556fffd0473004a0556
-fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473004a
-0556fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473
-004a0556fffd0473004a0556fffd0473004a055600a20473004b055600a2
-0473004b055600a20473004b055600a20473004b055600a20473004b0556
-00a20473004b055600a20473004b055600a20473004b0239006301c7001f
-023900ba01c7007c06390063047300440639006304730044063900630473
-004406390063047300440639006304730044063900630473004406390063
-0473004406dc0063053f004406dc0063053f004406dc0063053f004406dc
-0063053f004406dc0063053f004405c700a10473008305c700a104730083
-06d500a1055b008306d500a1055b008306d500a1055b008306d500a1055b
-008306d500a1055b00830556000604000021055600060400002105560006
-040000210556fffd0473004a0239ffe201c7ffb0063900630473004405c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-05c700a1047300830000fefe0000fefe0000fefe0000fefe0455fffd02eb
-000c07630007055afffb04a900a10380008604a900a10380008605c700a4
-046b00880473fffd040000140473fffd04000014055600090400000f0555
-0057042b0045055500a10473008706050063047300550639006004730044
-05b5003a01f4ffba0224ffba021affba04a7004601f4009e01f4001001f4
-001b01f4001001f4006b01f4fff90227ffce0000000f0000fff502aa00a4
-02aa00a40000000e00000056000000560000ffcf01a8000f01d6ffbf01a8
-fff501d6ffcd01a8001d01d6fff501a8009301d600130375003203750032
-0375003203750032051b003204b5002405b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba
-01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4
-ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a
-01f4ffba01f4ffba0481003604350036043dffba043dffba048100360435
-0036043dffba043dffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba0481
-003604350036043dffba043dffba02b3003202b3003202b3005f02b3005f
-02b3005f02b3005f02b3003202b3003202b3005f02b3005f02b3005f02b3
-005f02b3005f02b3005f02b3003802b3003802b3004902b3004903e9004a
-03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9
-004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba0692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba08c9003e08c9003e06c5ffba06c5ffba04a7ffba04a7ffba045a
-002a039a00360435ffba0327ffba064f0027064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba064f0027064f00270224
-ffba021affba064f0027064f00270224ffba021affba064f0027064f0027
-0224ffba021affba04a7004604a7004604a7004604a70046093e0032093e
-00320740ffba0740ffba067f0014077600140327ffba041effba04cf002d
-04cf002d0327ffba0327ffba04cf002d04cf002d0327ffba0327ffba04cf
-002d04cf002d0327ffba0327ffba067f0014077600140327ffba041effba
-067f0014077600140327ffba041effba067f0014077600140327ffba041e
-ffba067f0014077600140327ffba041effba067f0014077600140327ffba
-041effba040d0047040d004701a8ffba01a8ffba040d0047040d004701a8
-ffba01a8ffba040d0047040d004701a8ffba01a8ffba040d0047040d0047
-01a8ffba01a8ffba043500450435004501f4ffba01f4ffba043500450435
-00450435004504350045043500450435004501f4ffba01f4ffba04350045
-043500450481003604350036043dffba043dffba024200360300fff7031a
-001a031a001a031a001a0375003203750032037500320375003203750032
-037500320375003203750032037500320375003203750032037500320375
-0032037500320375003203750032051bffba04b5ffba051b003204b50024
-01f4ffba01f4ffba0375003203750032051b003204b5002401f4ffba01f4
-ffba051b003204b50024067f0045067f0045067f0045067f004501a80028
-0000fe290000fea20000ff300000ff1d0000ff120000ff920000fe7e08fc
-003208ad00320000ffb50000ffb60000feed0000ff640000fe7e0000ff9f
-018d000002f6fffd0000fe820000ff1004cd00320000ff580000ff580000
-ff640692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba045a002a039a00360435ffba0327ffba034d007902b400230242
-003601f4ffba0290ffba01f4002f01f4003b01f4001201f400b101f4006d
-067f00140776001401f9009b0000fed902bc000003f2009b045afff504ce
-fff5045a005304ce004a045a005304ce004a045a005304ce004a045a0053
-04ce004a045a005304ce004a045a005304ce004a04350071043500ad045a
-000f04ce000f0473001406110014054000a7047300860540000a0473000a
-05c7005105c700660400005005c7fffd067a00140540004a047300460474
-00480556006e04d5005304e3ffc40639006d04fe000f070c008701c70083
-0239001f055600960400008801c7001504000018072000a405c7ffb80473
-008b0639006006f200630557004406090014047300860556009e0556006b
-0400004f04f20094030b00440239002404e300140239002404e3003005fb
-006105c700a1062e00140400002104e300290400002804e3002904e30031
-045c0044045c003f0473003c0473005503ab003203e50024047300870214
-00bc034e00bc04ac0072023900b00aaa009e09c7009e08640046087f0096
-06aa0096039c008309c7009c078e009c062b0087047300550556fffd0473
-004a0000fefe0556fffd0473004a08000001071d00440639006d0473001a
-0639006d0473004205560096040000880639006304730044063900630473
-004404e30029045c004c01c7ffa20aaa009e09c7009e086400460639006d
-04730042084600a404f2009e05c7009c047300870556fffd0473004a0556
-fffd0473004a055600a20473004b055600a20473004b0239ff8a0239ff64
-023900040239fff60639006304730044063900630473004405c700a102aa
-ffcc05c700a102aa006805c700a10473007605c700a1047300830556005c
-0400003f04e3003002390024045c0051037e001305c700a40473008705a6
-00a404d6005e0486005e04e30029040000280556fffd0473004a055600a2
-0473004b06390063047300440000fefd0639006304730044063900630473
-004406390063047300440556000604000021047300570473004804730086
-04730086040000130400005004730046047300460473005505e9005503ab
-004903ab0032050d0032040f00440239ffb9047300420473004204780050
-0402001904ef00190473008b047300870473008701c7001901c7008901c7
-0089029e0000026e001401c700830493008306aa008406aa008406aa0087
-0473ffa60473008b046c00870473004406530044063f00570466004402aa
-ffe402aaffe402aaffe402aa008502aa008502aa008502aaffe40455008a
-0455008a0400003f01c7ffa20214ffb901c7ff7202cb00000239000f0239
-002404730019048c0044046000880400001a05c700060400001804280019
-0400002804540028045c004c045c00790400002404000050040000240400
-00500639006304400088040f004904780050046b0088032e000004000008
-033b008804730048040000240400005007b7004607400046080b004605b3
-0024036f002405c00024061c0013054a0083050f008303e2001e04380063
-03110064031100640146ffce01eb006401eb000001eb000002ea006403d9
-0000029100000187005a02d7005e01c7008001c7006c01c7008a02aa00fb
-02aa00fb02ca003202ca003204ac007004ac007004ac006504ac006502aa
-012102aa00de02aa005902aa012102aa001d02aa005902aa00de023900b6
-023900b602aa00fb02aa00fb02aa00a602aa00a602aa00a602aa001d02aa
-ffe202aafffb029400000142006402b8003202a0000002ca003203100096
-0310009603100096031000960310009602aa006202aa006202aa002802aa
-001d02aa0047045700960457009604570096045700960457004304570043
-045700430457004304570043031000430457002f0457002f0457002f0457
-002f0457002f0310002f0457002504570025045700250457002504570025
-0310002f0457001a0457001a0457001a0457001a0457001a0310001a0457
-004204570042045700420457004204570042031000420457009604570096
-045700960457009604570042045700420457004204570042045700420310
-00420457002f0457002f0457002f0457002f0457002f0310002f0457002f
-0457002f0457002f0457002f0457002f0310002f04570026045700260457
-002604570026045700260310002604570042045700420457004204570042
-045700420310004204570096045700960457009604570096045700420457
-004204570042045700420457004203100042045700260457002604570026
-045700260457002603100026045700230457002304570023045700230457
-0023031000230457002f0457002f0457002f0457002f0457002f0310002f
-0457004b0457004b0457004b0457004b0457004b0310004b045700960457
-009604570096045700960457004204570042045700420457004204570042
-031000420457001a0457001a0457001a0457001a0457001a0310001a0457
-002404570024045700240457002404570024031000240457002f0457002f
-0457002f0457002f0457002f0310002f0457004e0457004e0457004e0457
-004e0457004e0310004e045700960457009604570096045700960000fec1
-0000fec60000fdac0000fed80000ff920000fee90000ff4c0000fea00000
-fec40000ffce0000ff660000fea00000fed80000fed80000ff970000ff98
-0000ff990000fff40000ff420000ff420000ff440000ff5f0000fe870000
-ffec0000ffa60000ff510000ff510000ff510000fec90000ff1c00000000
-0000fee90000ff4c0000ff930000ff2a0000ff560000ffce0000fe870000
-febb0000fec40000fec40000fed80000fed80000feb30000fec90000fdad
-0000fdac0000feb30000fec90000fdad0000fe160000fee60000ffa60000
-fe870000ff440000feba0000ff230000ff9a0000fdac0000fe8800000000
-0000feb00000ff980000fe930000ffa60000fe870000fdac0000ff660000
-ff440000feb00000feb00000feb00000ff030000ff520000fd1f0000ff53
-0000ff530000ff530000feb50000feb50000ffc30000feae0000fedc0000
-fec70000fec80000fedc0000fe1e0000ff420000ff510000feb70000feb0
-02aa00de02aa005902aa00fa049a008c04600088062e001407aa0000062e
-0014047b004c063f005704cf0044063900630473004405c7006604000050
-04e300a8033b008804ff0000043c0032060d000a049d0042072000a406aa
-0084056500630473008b056400a40400000a0556006b0556006b04e00005
-04c5001905e5005f046e004403b600140347002804cf00440495005b0400
-005001c7ffa2063900600389004d03890050055600a205c000a10473004b
-047800870ab4006d04fe00100639001404e70014079900bf05b500880558
-000b0400001a072e00bf0590008806a10078057b007a086d00bf06f00088
-04d5006603ab001f065f0039058200480639006004730044066d0009050c
-001a066d0009050c001a0b010063091c004406aa005c04e600440987006d
-06d000500000fe370ab4006d04fe001005c7006604000050040700140000
-fea60000febc0000feaa0000fead0000fc2b0000fc4c05c000a104780087
-05400004042b00140556009e04730087055d00a40464008804d5004e03ab
-003204a900040380000005ef002904490028070900a4052f0088091800a0
-06f6008806060066042b005005c700660400005004e3003003aa00260767
-00310587002605550057042b004506e4000a0554000a06e4000a0554000a
-023900bf07630007055afffb055700a1046800860540001204ab001805c7
-00a4046b008805c700a4046b008805550057042b004506aa00980580008c
-02aa002e0556fffd0473004a0556fffd0473004a08000001071d00440556
-00a20473004b060500630473005507630007055afffb04d5004e03ab0032
-04d5004e045c004c05c000a10478008705c000a104780087063900630473
-0044063900600473004405c0004a0415002b0515000a040000210515000a
-040000210515000a0400002105550057042b0045071500a805c0008b0540
-004a0473004607bf004a0703004607a6006606860053054d006604130053
-07c3001207470018084600a4070700880639006d0478005005f900300553
-00260000ff430000fec90000ff770000ffb00000ff470000ff560000ff74
-0000fed70000feac000000000000ff520000ff56000000000000feac0000
-fd9a000000000000ff6a0000ff7c0000ff690000ff560000feac0000ff7f
-0000ff560000fdef0000ff430000ff690000ff7c000000000000fdae0000
-ff8c000001020000fefe0000fefe0000fedf0000fedf0000ff580000ff20
-0000fefe0556fffd0473004a055600960473008605560096047300860556
-00960473008605c700660400005005c7009e0473004605c7009e04730046
-05c7009e0473004605c7009e0473004605c7009e04730046055600a20473
-004b055600a20473004b055600a20473004b055600a20473004b055600a2
-0473004b04e300a8023900130639006d0473004205c700a40473008705c7
-00a40473008705c700a40473008705c700930473006805c700a404730087
-0239ffdf01c7ff9202390020023900060556009604000088055600960400
-008805560096040000880473009601c7007e0473009601c7ffb904730096
-01c7ffa50473009601c7ffa306aa009806aa008706aa009806aa008706aa
-009806aa008705c7009c0473008705c7009c0473008705c7009c04730087
-05c7009c0473008706390063047300440639006304730044063900630473
-004406390063047300440556009e047300870556009e0473008705c700a1
-02aa008505c700a102aa008505c700a102aa005e05c700a102aa00260556
-005c0400003f0556005c0400003f0556005c0400003f0556005c0400003f
-0556005c0400003f04e300300239002404e300300239002404e300300239
-ffff04e300300239000e05c700a10473008305c700a10473008305c700a1
-0473008305c700a10473008305c700a104730083055600090400001a0556
-00090400001a078d001905c70006078d001905c70006055600090400000f
-055600090400000f055600060400002104e300290400002804e300290400
-002804e3002904000028047300870239000305c70006040000210473004a
-01c7008904a0004804a0004804a0004804a0004804a0004804a0004804a0
-004804a000480556fffd0556fffd06820013068200130682001306820013
-068200560682005603910062039100620391006203910062039100620391
-0062061e0000061e0000076c0000076c0000076c0000076c00000473008b
-0473008b0473008b0473008b0473008b0473008b0473008b0473008b068f
-0000068f0000081f0000081f0000081f0000081f0000081ffff3081ffff3
-01c7008101c7008101c7ff9b01c7ff9b01c7ffeb01c7ffeb01c7ffa201c7
-ffa20301000003010000049100000491000004910000049100000491fff3
-0491fff3047300440473004404730044047300440473004404730044069d
-0000069d0000082d0000082d000007c9000007c900000460008804600088
-0460008804600088046000880460008804600088046000880682000007ae
-00000812000007ae0006063f0057063f0057063f0057063f0057063f0057
-063f0057063f0057063f0057065f0000065f000007ef000007ef0000078b
-0000078b0000078bffff078bffff04a0004804a000480391006203910062
-0473008b0473008b01c7ffe601c700680473004404730044046000880460
-0088063f0057063f005704a0004804a0004804a0004804a0004804a00048
-04a0004804a0004804a000480556fffd0556fffd06820013068200130682
-00130682001306820056068200560473008b0473008b0473008b0473008b
-0473008b0473008b0473008b0473008b068f0000068f0000081f0000081f
-0000081f0000081f0000081ffff3081ffff3063f0057063f0057063f0057
-063f0057063f0057063f0057063f0057063f0057065f0000065f000007ef
-000007ef0000078b0000078b0000078bffff078bffff04a0004804a00048
-04a0004804a0004804a0004804a0004804a000480556fffd0556fffd0556
-fffd0556fffd0556fffd02aa00e502aa00fd02aa00e502aa000602aa0006
-0473008b0473008b0473008b0473008b0473008b068200000682000006f3
-000006f3000005c700a402aa001302aa001302aa000601c7ffbb01c7ffab
-01c7ffca01c7ffca01c7ff9301c7ff930239001a0239fff5036500000365
-000002aa001302aa001302aa000604600088046000880460008804600088
-048d0083048d00830460008804600088055600060556000606e600000718
-0000061e000002aaffea02aaffea02aa0059063f0057063f0057063f0057
-063f0057063f005707650000069d000007270000065f000005fb006102aa
-00de02aa00e50473000d05c7006605c7006606aa008705c70024095000a1
-078d00190556001f04e30030080000290400003004c100660000ff530000
-ff530000ff530000ff5301c7001901c7ffa2042b00050556001105740046
-02cbffa3057a008702f0ffc8057f000a057f000a02aa008402aa008402aa
-00c902aa00c902aa00a002aa005902aaffaf02aa003a02aa0006023900b9
-02aa00a902aa00a902aa00a902aa00a9032e001e032e001e02aa003a0000
-ff730000ffa50000fed80000ff230000ff720000ff720000fee70000ffa5
-0000ff530000ff530000ff530556009e0473008703f8001905fb0019071d
-00440440001904000050046900870469001903eb008703ab003201c70088
-0361004104000088033600100580008c04780087047300440400001304de
-004404de004404de000d078d005003a800440473004404730044042b0084
-0455001f0455001f03aa00260460008804c6004405de004404c600440400
-001a05c700060400002803ab0032036b003f04db001f02eb00880400001a
-04550088042b008405b4007a04ab001803a00000054f0000035100320351
-ffd103980032034800320348003203f80032036e0032015600690284002d
-0366003202d000320415003203710032036f003204180032030f00320359
-0032039c003203760031036f003204fb000002fa003202fa003203040032
-04cc0032030500640305003202f9003202f90032028c0032028c00320304
-00320142006402b6006404950064030f00640305003202d5003203050032
-030500320306006401c20032030f00640342003204950064029200000320
-00000315006402920000030600320385003202bf00000142006401eb0064
-030f0064029200000315006402920000030900320385003202bf000005ed
-00460a660046061300460689ffba0541ffba01e9003c045a00110000ff0d
-0000ff350000fece0000feb70000fec90000ffcf0000ff4f0000ff9e0000
-feca02b3005f02b3005f03e9004a03e9004a039affba0327ffba039affba
-0327ffba05ad0069053d002d05fd009604dc005004e0003c05f6009b053f
-00280650002804ac00720000fe3b0000fe660000fe660473fffc02aa0053
-02d5ffce01a8ffba01a8ffba01a8ffba01a8ffba0658001509c500470400
-000008000000040000000800000002ab0000020000000155000004730000
-02390000019a000000ab00000000000005e5000305c7006606aa00980580
-008c0744008307180046071800480556fffd05c70066040000140473000a
-04e300300400004f0400002804a5001d000001020000ff420000febf0000
-ff3a0000ff53048d000a05c7005105c7006605c70051045500a102eb0088
-0000ff430000ff040000ffac02d200960000ff37021affba0250001e0000
-ff3a0000ff5b0000ff5f0000ff7e0000ff940000ff4a0000fe9c05b5003a
-05b5003a01f4ff9601f4ff9605b5003a05b5003a01f4ffba01f4ffba05b5
-003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba
-05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba0481003604350036043dffba
-043dffba0481003604350036043dffba043dffba02b3003202b3003202b3
-005f02b3005f03e9004a03e9004a0692003e0692003e043fffba043fffba
-045a002a039a00360435ffba0327ffba045a002a039a00360435ffba0327
-ffba045a002a039a00360435ffba0327ffba064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba067f0014077600140327
-ffba041effba067f0014077600140327ffba041effba067f001407760014
-0327ffba041effba02b4002302b400230327ffba0327ffba02b4002302b4
-00230327ffba0327ffba043500450435004501f4ffba01f4ffba04350045
-0435004501f4ffba01f4ffba043500450435004501f4ffba01f4ffba040d
-0047040d004701a8ffba01a8ffba03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0473ff93047300460239ffbf06aa
-ffd50473ffb70473ff9102aaffa402aaffa40400ffff0239ffb904000028
-04730089030b0064047400480649002401c7001901c700190473001e0460
-001e048c000a04730086047300460239001305b400420400008801c7fffc
-06aa00870473008b0473008702aafffb0400003f0318ffa20400001a0400
-000f040000280473004a04730048047300460473004b03ab004903ab0032
-0534005501c700880400001301c7ffa204730083045c004c0304006402d5
-003202c9003302fc0032028c003201d5003201d500000304003203110064
-01420019014200640142006401420019022a000001420064014200090233
-00640493006404930064030fffc9030f0064030e00640305003203000032
-02b800320142ffca01c20032030f001d031a00320306006402d400640292
-000002de003202de003202de003202f4003202ea00320000febc0000febc
-0000ff730000fea9023900b902fa003202f900320305003202a0000002f9
-00320639006d0556fffd0473000f05c7006602aa004104a0004804a00048
-04a0004804a0004804a0004804a0004804a0004804a0004801c7ff9b01c7
-ffab01c7ff9b01c7ffab01c7ff9b01c7ffbb01c7ff9b01c7ffbb04600088
-0460008804600088046000880460008804600088046000880460008801c7
-ffab01c7ffab01c7ffbb01c7ffbb04600088046000880460008804600088
-045a005304ce004a03a000130556001105c700290558000b055600a20473
-004b0400003301c7ffa205e600630473004805c7000002aa000f05560006
-0400002104000013040000500400001301c700830455fffd02eb00010556
-00090400000f055600090400000f04d5005303ab00490540001204ab0018
-0000fec60000fed40000fec60000fed40000fe5f0000fe5f0000ff720000
-ff730000fee7078b000a03eb004c040000130473000a01c700150473fff4
-0556001105c700a1047300190239ff8b05c700a404730087055600960400
-008804e30029040000280400003b049e00a403670088053000480000ff53
-0000ffbc0000fefe0000fefe0000fea40000fea401c70088000000000000
-002a0000002a0000002a0000002a000000d60000017e00000320000005a6
-0000074e000009380000097e000009fe00000aa400000b8400000bec0000
-0c6400000caa00000ce600000d5600000f1200000fee00001218000013f2
-000015520000170c000018e20000198e00001c2200001e5600001eb20000
-1f7000001ff200002062000020e8000021da000023da000025840000271c
-000028560000299e00002a6200002b1800002ca800002dae00002e920000
-2f7a000031b00000323a000035640000370e000038420000394800003b3c
-00003da800004052000041000000422400004398000045d6000048e20000
-4a8800004bc800004c3200004c9c00004d0000004d8800004dbc00004e38
-0000510a000052e80000549c000056500000580e0000596200005b520000
-5cf600005dea00005f020000619a00006296000064c60000668c0000684e
-00006a1200006ba800006cae000070560000717a00007318000075360000
-79a000007bc400007e1c00008004000081020000814e00008250000082f0
-0000833c00008370000083ac000083ee000084540000849a000084ce0000
-85040000853a0000858a000085cc0000861e00008656000086a8000086de
-0000871e000087600000879e000087e800008828000088560000888e0000
-88de00008914000089540000898e000089d200008a1c00008a5800008a88
-00008acc00008b0400008b9400008c1a00008e2800008fbc0000916c0000
-91b80000924c00009470000096c4000098b4000099a000009a2200009a8c
-00009baa00009d0600009f4e0000a0b00000a13e0000a1e80000a2ac0000
-a3f40000a59e0000a68c0000a7520000a7b60000a8240000a94e0000aa72
-0000ab020000ace40000af3e0000b2900000b3860000b42c0000b47c0000
-b5320000b6520000b7f00000b88a0000b94e0000ba0e0000ba760000bab2
-0000bb0a0000bb580000bd700000bfb60000bfee0000c0200000c14a0000
-c2760000c3240000c3c80000c46a0000c53c0000c5900000c5c60000c61e
-0000c7700000c7e20000c83c0000c9b40000cb200000cc000000cc320000
-ccce0000cdf20000d0680000d0a20000d0e60000d1220000d1840000d1c6
-0000d20c0000d2580000d28a0000d2de0000d31c0000d34c0000d38a0000
-d3d00000d4120000d4500000d4d20000d5400000d6260000d6620000d6e2
-0000d7160000d7b80000d8400000d8ac0000d90e0000d97a0000da660000
-db580000db8c0000dbc00000dbf00000dc340000dcac0000de260000e040
-0000e0720000e0ac0000e1a60000e3340000e36a0000e4ce0000e54a0000
-e62a0000e7200000e8b00000ea1a0000ec080000ed040000ed4a0000ed7e
-0000edc00000edfa0000ee4e0000ee960000eee00000ef100000ef400000
-f1280000f1660000f18e0000f1be0000f1f20000f2180000f23e0000f286
-0000f43c0000f5b60000f5dc0000f6020000f6460000f6760000f6a60000
-f6fc0000f7da0000f8ec0000f9300000f9660000f9c00000f9fe0000fa32
-0000fa620000fa9e0000fade0000fb1c0000fb580000fb9a0000fbd00000
-fc0c0000fc4c0000fc720000fc960000fce60000fe420000fe980000fecc
-0000ff1a0000ff660000ffa80000ffe0000100160001005e000101000001
-029c00010464000105e6000107d80001092a00010aae00010b9000010d2a
-00010d9400010dbc00010e5a000110dc0001111c0001115c0001119c0001
-11da000112380001129600011304000113240001140e000114ae000114e4
-000115320001157c000115c6000115e2000115fe0001161e0001163e0001
-165e0001167e000116a4000116ca000116f000011716000117460001176e
-00011796000117c2000117ee000118220001184c00011878000118ae0001
-18d8000119040001193a000119640001198e000119c2000119f200011a26
-00011a6a00011a9a00011ace00011b1000011b4400011b7600011bb80001
-1bec00011c1c00011c5e00011ca200011ce800011d4400011d6000011d7c
-00011d9800011db400011dd000011f3e000121ea0001245a000124760001
-2490000124ac000124c8000124e4000125000001255c0001259600012600
-000126ca0001276a00012840000128c000012948000129b800012a4e0001
-2aac00012af200012b5000012bb200012c6a00012d2800012d5400012db0
-00012df400012f60000130540001307e0001309a000130c6000130fe0001
-314a0001318a000131be000131ee0001321e0001324e00013292000132c2
-000132f2000133320001336200013392000133c200013402000134320001
-346200013492000134b8000136bc000136ec0001371c0001386c00013a22
-00013a5200013a8000013ab000013ade00013b0e00013b3c00013b600001
-3b8400013bb400013d2400013d5c00013d8c00013f1e00013f4c00013f7a
-00013fa800013fd00001412e000142c6000142fe0001433e0001437a0001
-43aa000143d8000143f4000144240001445400014544000146ac000146dc
-000147160001475600014786000147b6000147f80001481e000148440001
-4884000148c4000148f40001493400014a1e00014a9e00014b8200014bb2
-00014be200014c1200014c4200014c7e00014cb000014ce200014d120001
-4d4200014d8800014dba00014dea00014e2000014e9200014ec600015094
-000151960001532600015556000157a6000159380001599c00015a260001
-5a3600015ac400015cc200015dee00015f5a0001604a000161ce000163e8
-000166140001670600016716000167260001683e0001684e0001685e0001
-686e0001687e0001688e000169ac000169bc000169cc00016a4000016a50
-00016b2000016b3000016c4200016c5200016c6200016c7200016dd00001
-6fae00016ff0000170260001705c0001708c000170bc0001711000017138
-000172c20001740a0001755e000176c60001784a000178ae00017a400001
-7b5c00017b6c00017b7c00017d0200017d1200017e7800017fd200018106
-00018264000183d200018598000185d800018610000186460001866c0001
-869c000186c200018838000188680001899e000189ae000189be00018a00
-00018a1000018ba400018d5000018eda00018f0200018f320001908e0001
-909e000191d6000191e600019280000193e0000193f000019656000197e0
-000199480001997800019aee00019c2000019c3000019c4000019c500001
-9d2a00019d3a00019d4a00019d5a00019e5200019fcc00019fdc0001a104
-0001a2380001a38a0001a51e0001a63c0001a7c80001a8da0001a9100001
-ab460001abe60001abf60001ad8c0001af2e0001afb20001b1340001b144
-0001b3ac0001b52c0001b6ac0001b6dc0001b87c0001ba020001bbc60001
-bcf20001bd020001be320001be420001be520001bf120001bf220001c108
-0001c1180001c24e0001c35c0001c5080001c6be0001c8000001c9700001
-cab80001cb0a0001ccec0001ce680001cea60001d04c0001d0700001d1b0
-0001d1c00001d1d00001d2080001d2180001d3a40001d50c0001d6800001
-d6a40001d6d40001d8420001d8f40001d9b20001d9e00001db960001dc8e
-0001dd1c0001de420001def00001dfc40001e00e0001e0860001e1460001
-e16e0001e1b20001e2080001e2e40001e32e0001e3620001e38a0001e3b2
-0001e3e60001e42a0001e46e0001e4ac0001e5ea0001e6a20001e7c20001
-e8380001e9060001e9580001e9ea0001ea9a0001eb8e0001ebe20001ec78
-0001ed360001ee200001eed20001eff20001f0440001f0ee0001f2240001
-f2fc0001f3e20001f4e80001f5ce0001f6b00001f7a40001f8420001f948
-0001fa420001faba0001fb320001fba80001fbde0001fc3a0001fd020001
-fd8e0001fdc60001fe0c0001fe3c0001fea60001ff660001ff9a0001ffca
-0001fffe0002002e0002005e0002008e0002022e00020266000202a60002
-02de00020316000203b2000204ac000204dc00020580000205ae000205ee
-0002063e0002066e000206ba00020852000209b800020b1800020b5e0002
-0bb200020bea00020d5c00020d9200020e2400020e6200020e9000020ece
-00020ffe0002102600021162000211f20002129c0002131e000213da0002
-14f20002160000021634000216ba0002181600021898000218e2000219ec
-00021a3400021b3800021bb400021c0c00021c9000021d7a00021e900002
-1f8c0002203600022126000221f8000222e2000223ca0002247a000224fc
-0002275a00022784000227ae0002286600022890000229d200022ad80002
-2bc200022bec00022c1600022c4000022c6a00022c9400022e1400022e3e
-00022e6800022e9200022ebc00022ee600022f1000022f3a00022f640002
-2f9800022fc200022fec0002301600023190000231a0000232ba000232ca
-000232f40002331e00023348000233720002351c00023738000238660002
-3876000239f200023a0200023b4800023d1400023e1a00023f9a0002413a
-0002435e000244b80002469a000247de0002490c000249fa00024a240002
-4a4e00024a7800024aa200024acc00024af600024b2000024b4a00024b74
-00024b9e00024bc800024bf200024c1c00024c4600024c7000024eac0002
-50280002516c000253540002549c000254c6000254f00002552000025550
-000255a0000255f000025630000256a2000256f600025754000257aa0002
-57e00002582200025868000258b2000258e20002591a0002594a00025a82
-00025dc800025df200025e1c00025e4600025e7000025e9a00025ec40002
-5eee00025f1800025f4200025f6c00025f9600025fc000025fea00026014
-0002603e0002606800026092000260bc000260e6000261100002613a0002
-61640002618e000261b8000261e20002620c0002623600026260000262fe
-000263140002633e0002661e0002662e000267480002686a000269a80002
-6aea00026c9000026ca000026de200026f3200027122000272f60002740e
-0002741e000274a00002752e0002762e0002763e000276de000276ee0002
-78040002795600027a8600027a9600027b6400027b7400027cea00027cfa
-00027e0e00027e1e00027f52000280e8000281a4000281b4000282b20002
-840c00028498000284a8000285d20002875e0002881a0002882a000288c6
-000288d6000289a4000289b400028a8c00028a9c00028ba400028bb40002
-8d7a00028d8a00028ee200028ef20002915c0002916c0002936600029376
-000294e0000294f0000295e0000295f00002978800029798000298b60002
-98c600029a0600029a1600029a2600029a3600029bae00029bbe00029bce
-00029bde00029d3000029e7e00029f4c0002a0300002a1b00002a3320002
-a4320002a5460002a68a0002a69a0002a7880002a8620002a9fe0002aa0e
-0002ab2c0002ac320002ae300002ae400002ae500002ae600002afaa0002
-afba0002b0720002b0820002b1900002b1a00002b28c0002b29c0002b3ba
-0002b3ca0002b4680002b4780002b4880002b5760002b6ea0002b8160002
-b9100002b9200002b9300002b9400002bade0002bc980002bd660002bd76
-0002bfd60002c21c0002c4a20002c7060002c98a0002cbfc0002cdcc0002
-cf820002cfac0002cfd60002cfe60002cff60002d0200002d04a0002d074
-0002d0840002d0940002d0be0002d0e80002d0f80002d1080002d1320002
-d15c0002d1860002d1960002d1a60002d1b60002d1c60002d1d60002d1e6
-0002d2100002d2200002d2300002d25a0002d2840002d2ae0002d2d80002
-d3020002d32c0002d3560002d3800002d3aa0002d3d40002d3fe0002d428
-0002d4520002d47c0002d4a60002d4d00002d4fa0002d5240002d54e0002
-d5780002d5a20002d5cc0002d5f60002d6200002d64a0002d6740002d69e
-0002d6c80002d6f20002d71c0002d7460002d7700002d79a0002d7c40002
-d7ee0002d8180002d8420002d86c0002d8960002d8c00002d8ea0002d914
-0002d93e0002d9680002d9920002d9bc0002d9e60002da100002da3a0002
-da640002da8e0002dab80002dae20002db0c0002dbac0002dbf00002dc66
-0002dc900002dcba0002dce40002dd0e0002dd380002dd620002dd8c0002
-ddb60002dde00002de0a0002de340002de5e0002de880002deb20002dedc
-0002df060002df300002df5a0002df840002dfae0002dfd80002e0020002
-e02c0002e0560002e08a0002e0be0002e0f20002e2840002e4200002e5bc
-0002e7480002e78e0002e7d40002e8420002e89e0002e8f00002e9600002
-ea380002eb040002ebdc0002eca80002ed480002ee620002ef160002ef98
-0002eff20002f0320002f1500002f29a0002f4320002f48e0002f4ec0002
-f5480002f5a40002f6580002f70e0002f7ba0002f8660002f9120002f9ca
-0002fa820002fb3a0002fb4c0002fb5e0002fb700002fb820002fb940002
-fc020002fc700002fd280002fd3a0002fd4c0002fd5e0002fd6e0002fd80
-0002fd920002fda40002fdb60002fdc80002fdda0002fe880002ff340002
-ffe20003008e00030126000301600003018a000301b4000302080003025a
-000302d6000303200003039c000303f000030474000304c60003053c0003
-0594000305fa00030650000306aa0003072800030774000307d200030836
-00030884000308d20003092a000309720003099c000309ca000309f00003
-0a2400030a5400030a8400030ad600030b4400030b9a00030c0e00030c62
-00030cd600030d1c00030d8400030dca00030e2600030e5600030e900003
-0eb600030ee600030f0c00030f3200030f6400030f9400030fe60003104c
-000310a2000311080003115c000311ca0003120c0003126c000312ae0003
-12fa0003133400031370000313aa000313e60003141a0003144c0003147c
-000314ac000314d6000314fc00031526000315540003157e000315ca0003
-160e0003164400031680000316b4000316e200031720000317500003178a
-000317b4000317e2000318080003182e0003185a000318b6000318e60003
-1916000319460003197e000319b2000319e000031a1000031a4000031a70
-00031aa000031ad400031b2a00031b5e00031bbe00031bf200031c4a0003
-1c7e00031cda00031d7800031e4600031f660003202e000320be00032154
-000323400003253c000326b400032830000329da00032b8c00032c740003
-2daa00032ea200032fb4000330d20003320800033372000334e000033676
-000337f2000339020003391200033a3e00033b7a00033cbc00033e400003
-3f1a00033f9000034046000340ec0003425c000342940003430e000343d0
-0003448a000344f2000345f80003472e000347fa00034958000349d20003
-4a4c00034b1800034bd200034c8600034ce200034d3c00034d8400034df4
-00034e7000034eba00034ef400034f3a00034f7e00034fd0000350220003
-50a40003512600035168000351a8000351de000352140003524200035270
-000352a4000352d80003531a0003535c00035398000353d40003540e0003
-54480003547a000354ac000354de000355100003554a00035584000355c6
-000356080003564a0003568c000356da000357280003576a000357ac0003
-57ec0003582c00035866000358a0000358ec0003593800035976000359b6
-000359fc00035a4200035a7e00035ad400035b1000035b4c00035b8c0003
-5bcc00035c0800035c4400035c8400035cc400035d0800035d4c00035da0
-00035e2e00035e7000035eb200035f1a00035f8200035fb400035fe60003
-601e00036056000360ec00036182000361cc00036216000362520003628e
-000362e40003633a00036384000363ce000364260003647e000364be0003
-64fe000365360003656e000365b800036602000366400003667e000366c0
-0003670200036756000367aa000367f0000368360003687c000368c20003
-69180003696e000369c400036a1a00036a6600036ab200036afe00036b4a
-00036bbe00036c3200036ca600036d1a00036d5800036d9600036dd40003
-6e1200036e5000036e8e00036ed200036f1600036f6200036fae0003700e
-0003705a00037098000370e6000371f60003724600037296000372ce0003
-73060003735c000373b2000374260003748a000374cc0003750e00037564
-000375b2000375fe0003764a0003768a000376ca000377120003775a0003
-77c6000378200003785800037890000378d000037910000379e000037adc
-00037b9c00037c8a00037ce000037d3600037d8800037ddc00037e400003
-7ea400037efa00037f5000037fc60003803c0003807e000380c000038102
-0003814400038186000381c80003821e00038274000382c60003831a0003
-83a200038424000384c400038566000385a4000385e2000386200003865c
-0003869a000386d80003871600038752000388360003892200038a380003
-8b5400038c1e00038ce800038de200038edc00038fda000390d8000391f6
-000393140003943a000395600003966200039764000397f6000398880003
-98c6000399040003995e000399b8000399f000039a2800039b3800039b48
-00039b9000039bd800039c3000039c8800039cba00039cec00039d2e0003
-9d7000039daa00039de400039e2800039e6c00039ee400039f5e00039fee
-0003a0320003a0720003a0f40003a1760003a2ce0003a2de0003a32c0003
-a37a0003a3b60003a3f20003a4380003a47e0003a4cc0003a51a0003a56a
-0003a5ba0003a6160003a6720003a7e80003a9500003a9880003a9c20003
-aa0e0003aa5a0003aaac0003aafe0003ab500003aba60003abe20003ac1e
-0003ac740003acc80003ae000003aea00003aeee0003af2e0003af680003
-b0fe0003b3820003b4460003b5dc0003b73a0003b8080003b9ae0003bc02
-0003be3a0003be800003beb20003bf5c0003c0800003c0a40003c13e0003
-c24a0003c35a0003c46a0003c5780003c6fe0003c7300003c7d20003c7fa
-0003c85c0003c8be0003c9200003c9820003c9c00003c9fe0003ca380003
-ca720003ca9e0003caea0003cb240003cb5e0003ccba0003ce0e0003ce1e
-0003cedc0003d0120003d0700003d1880003d3160003d3bc0003d5020003
-d5400003d57e0003d5bc0003d6100003d6380003d6920003d6f60003d73e
-0003d7a00003d8000003d8720003d8ee0003d96a0003d9ec0003da780003
-db040003db8e0003dc0e0003dc480003dc840003dde80003deb20003dee2
-0003df120003e04a0003e19a0003e1aa0003e2980003e36c0003e4640003
-e55a0003e6dc0003e8360003e8460003e95e0003ea0a0003eb4c0003eca2
-0003ecfe0003ee5c0003eeea0003f0900003f2020003f3160003f34e0003
-f3b20003f5620003f6cc0003f72e0003f8960003f99c0003fa520003fafe
-0003fc260003fd140003fdf40003ff34000400600004017a000402ea0004
-046400040474000405540004064a000406fa000407f6000408a2000409ac
-00040a9800040bc200040ce600040dea00040f1800041056000411c20004
-12f80004148c000416340004172c000418400004197200041a6400041a9c
-00041af200041ba000041bb000041c1200041c6e00041cd400041d200004
-1d6000041d9800041dc400041df200041e2c00041f6200041f960004201a
-000420d00004210000042184000421b4000421ec00042384000425100004
-255a00042594000425ea000426360004265c00042682000426c400042706
-0004274800042778000427b0000427e60004281c0004285e0004288e0004
-28be000429b400042ab800042aec00042b2400042b6a00042b9e00042bce
-00042c0600042c3a00042c6e00042c9e00042cce00042d0400042d3a0004
-2d6a00042d9a00042dce00042e0200042e3200042e6200042e9c00042ed0
-00042f0200042f3400042f6800042f9c00042fcc00042ffc0004302a0004
-305800043166000432d2000434060004353a0004356a000435a40004363e
-000437a800043904000439c800043adc00043b0c00043b4000043c380004
-3de800043e4000043eb800043ff400044032000440a4000440d400044104
-0004413e000441c6000441f600044226000443b6000445000004460c0004
-471a000448460004499c00044af800044c5800044d9200044f0400045064
-000450740004522a00045352000453ec0004557400045584000456800004
-58060004595e00045a1000045ae000045bec00045c9600045cce00045cde
-00045d8e00045e3400045eb000046000000460f4000461ea000462f60004
-63ce000464a80004653c0004664e000467de000468fc000469f200046a9c
-00046b4600046c1000046cb800046d8e00046e0a00046e6600046fc80004
-70fc000472980004735a0004745a00047532000476700004771c000477e6
-000478d6000479fc00047ad800047bde00047d1600047e0600047ea40004
-7f960004810600048250000484bc0004858e000486420004871000048804
-000489420004895200048a8600048b9800048ba800048cb400048de40004
-8e3800048fac000490d4000491e80004939a000495ae00049842000499fc
-00049b2800049d0800049eca0004a05c0004a1280004a2c40004a33a0004
-a3e80004a4c40004a5500004a5f20004a6940004a7780004a8b00004ab0c
-0004ac540004ac640004ac740004acd60004ad340004ad960004ae340004
-aecc0004afd00004b0be0004b0ce0004b0de0004b1780004b2120004b24e
-0004b2ca0004b33e0004b3940004b3c80004b44e0004b4da0004b5520004
-b5b00004b64a0004b6dc0004b75c0004b7de0004b8720004b8a60004b908
-0004b9ba0004bb800004bbb80004bd940004bea80004beb80004beee0004
-bf320004bf760004bfba0004bff00004c0220004c0640004c1000004c156
-0004c1fc0004c2740004c2fa0004c36a0004c3cc0004c4520004c4b20004
-c51c0004c5900004c6000004c65e0004c7040004c79c0004c8080004c898
-0004c8f60004c9640004ca0c0004cab80004cb4e0004cbb80004cc3a0004
-cc9e0004cd4a0004ce020004ceae0004cf3c0004cf980004d0040004d05a
-0004d0dc0004d15a0004d1e00004d26c0004d2c60004d3320004d3a20004
-d4120004d4820004d5060004d5960004d5fc0004d6760004d6f20004d76a
-0004d8100004d8ac0004d93c0004d99a0004da380004dab40004db460004
-dbe80004dc920004dd2a0004dd860004dddc0004de440004deea0004df92
-0004e05c0004e1020004e1640004e1bc0004e21c0004e2aa0004e3300004
-e3be0004e41e0004e4820004e4ec0004e5540004e5bc0004e63a0004e6c2
-0004e7560004e7c20004e82a0004e88e0004e9360004e9f00004ea9e0004
-eb2c0004eb8a0004ebf60004ec660004ed0c0004edb60004ee780004ef1a
-0004ef7e0004f00e0004f0800004f1100004f18e0004f20a0004f2760004
-f3040004f3600004f3be0004f4440004f4c00004f5280004f58c0004f5e0
-0004f64e0004f6b60004f7340004f7aa0004f8240004f8a40004f9000004
-f9660004f9ca0004fa6a0004fb0c0004fbc20004fc720004fcce0004fd46
-0004fda40004fe2e0004fec60004ff560004ffbc0005001a000500a80005
-011a000501ae00050246000502b6000503260005039e000503fc0005045c
-000504d60005053000050590000505ea00050646000506ae0005073c0005
-0772000507aa0005083600050860000508a20005093600050a2400050ab4
-00050aea00050b3a00050bac00050c5800050cea00050d4200050d9c0005
-0df400050e4e00050ed200050f5800050ffc000510a4000510e200051152
-000511e60005127e00051314000513be000513f000051440000514940005
-14da0005157e000516080005168e000516ee000517320005178000051820
-000518b000051950000519f600051a9c00051b6000051b9200051bbc0005
-1c4200051cf200051d2400051d4c00051e1a00051e7800051f1200051f60
-00051fc60005206e000520dc00052142000521ce00052240000522b60005
-236a000523c40005243400052470000524c200052548000525a80005264c
-0005272c00052854000529e400052a4000052a9600052dbc00052e560005
-2eb200052efa00053068000531ba000532000005330e000533a6000534b4
-000535be0005366000053748000537da000538760005396800053a680005
-3ae400053b6a00053bb200053d2400053e8000053f6400053fb400053fe8
-000540d6000541fe00054398000544c8000545de000547120005482e0005
-489c0005493000054a7000054b2600054c9000054dc000054ef20005501e
-000550ca0005519000055262000553bc0005553c0005566c000557880005
-594200055a9400055b8000055c5c00055d1e00055e8800055fd800055fe8
-00055ff800056008000560c000056176000561b2000561e8000562200005
-6256000563e2000565f6000566e0000567f80005697000056ade00056bc8
-00056cfa00056e4200056fc800057166000572ba000574a80005766e0005
-78a400057af200057bda00057cb600057dfe00057f800005806800058182
-000581c40005820e0005842a000586420005878e0005890400058b620005
-8d6400058de800058e1800058e6400058f2c00058ffc0005919000059218
-00059280000592c0000592fe000594b0000596e000059816000599f80005
-9ad400059bee00059d9a00059fa60005a0a80005a1940005a3860005a58e
-0005a6fa0005a87e0005a9de0005ab4c0005abda0005ac6a0005ad840005
-ae900005b0520005b1be0005b3ae0005b5780005b60c0005b6a80005b73e
-0005b7c60005b8ac0005b9840005bb1e0005bcb00005bcd60005bcfc0005
-bd0c0005bd3c0005bd6c0005bee60005c0880005c1320005c2140005c2d4
-0005c37e0005c4180005c4fa0005c5b80005c6940005c84a0005c9840005
-ca100005ca400005ca700005caa40005cad80005cae80005caf80005cb28
-0005cb580005cb8c0005cbc00005cbf40005cc280005cc5c0005cc900005
-ce0a0005ce1a0005ce4a0005ce7a0005ceb20005cee60005cf1a0005cf4e
-0005cf820005cfb60005cfea0005d0220005d0580005d0880005d0c80005
-d1000005d1480005d18e0005d1c20005d1f60005d2300005d2680005d308
-0005d3180005d46a0005d6320005d7d80005d9820005dace0005dbe40005
-dcf20005de080005df020005dfea0005e10c0005e2080005e2e00005e3d0
-0005e48c0005e53e0005e6080005e67a0005e7200005e7b00005e8140005
-e9220005e9880005ea360005eb2c0005eb940005ebfc0005ecac0005ee86
-0005ef8a0005f00a0005f0480005f0f40005f1820005f26a0005f3020005
-f3680005f4660005f5280005f5e20005f6200005f6b00005f7b20005f846
-0005f88a0005f9a80005fad20005fcb40005fe760005ffac000600da0006
-01da000602020006022a0006026000060292000602be000602e60006030e
-0006033c0006039a000604080006044000060478000604a8000604ce0006
-0502000605380006055e00060584000605b2000605e00006060c00060682
-000606aa0006070c00060732000607580006077e000607a4000607d40006
-0804000608340006086e0006089e000608d400060904000609360006095c
-00060982000609b6000609ec00060a1c00060a4c00060a7200060a980006
-0abe00060aec00060b2000060ba600060bea00060c2400060c5800060c9c
-00060cd600060d1000060d3600060d6000060dac00060dee00060e140006
-0e4200060e6800060e8e00060ece00060f0000060f3000060f6000060f86
-00060fac00060fdc0006100c00061032000610580006107e000610a40006
-10ca000610f000061118000611a0000611ca0006123e00061266000612dc
-000613040006136600061398000613ca000613fa00061432000614640006
-1492000614cc000614f40006155400061596000615c6000615f200061622
-000616520006167a000616a2000616ca0006172c00061754000617b20006
-17f60006183a0006186a000618a0000618c6000618ee000619140006193c
-000619620006198a000619b2000619dc00061a0200061a2800061a4e0006
-1a8000061aa800061b2e00061b5800061bc200061bf200061c2200061c48
-00061c6e00061cc600061cf600061d3200061d5c00061d8c00061dbc0006
-1df000061e2400061e5400061e9400061ece00061f1600061f3c00061f62
-00061f8800061fae00061fd4000620140006205400062090000620c00006
-20f0000621200006215000062188000621c000062200000622400006227a
-000622b4000622f00006232e00062378000623c2000624080006244e0006
-2490000624d20006250200062532000625660006259a000625d40006260e
-0006265a000626a6000626fe00062756000627ae0006280c0006283c0006
-286c000628a2000628d80006290e0006294a0006297e000629b200062a06
-00062a5a00062aae00062b0200062b5600062baa00062c0200062c5a0006
-2c8800062cb600062ce800062d1a00062d6000062da600062dd800062e0a
-00062e5c00062eb400062ef800062f3c00062f8000062fc4000630180006
-306c0006309c000630cc000631020006313800063176000631bc00063210
-0006325a000632ac000632fe0006335e000633be000633ee000634200006
-345a00063494000634e60006353a00063584000635cc0006360e00063678
-000636c6000637120006374400063776000637aa000637de000638140006
-384a00063888000638be000638f00006392c00063982000639d800063a36
-00063a9400063aea00063b4000063b7400063ba400063be800063c1e0006
-3c4e00063c9200063cd000063d0800063d4000063d7600063db200063de2
-00063e1e00063e5e00063ea400063eee00063f3a00063f8600063fdc0006
-403200064080000640ce0006411c0006416c000641c8000642240006427c
-000642d4000643280006437c000643be0006440000064448000644900006
-44d8000645260006456a000645ae000646140006467a000646e000064746
-000647ac000648120006487c000648e60006492e00064976000649be0006
-4a0600064a5200064a9e00064af200064b3e00064b8200064bd000064c38
-00064ca000064d1000064d8000064de800064e5000064e9000064ece0006
-4f1800064f4200064f8800064fc00006500e0006503e0006506e000650aa
-000650de000651040006515800065196000651ea000652d0000653f80006
-543a00065460000654b6000654e60006552800065570000655be00065608
-000656580006567e000657660006584a0006599c000659ca000659f80006
-5a8c00065b1200065b4000065bca00065bfa00065c2a00065c7800065cc6
-00065daa00065e8600065fca00065ffa0006602a000660c0000661480006
-6178000661a8000661d80006626800066298000662c80006631a00066362
-000663b80006644e000664e60006655a000665ac000665d60006662c0006
-6660000666aa000666e20006673200066770000667bc000667e20006685e
-000668b0000669c200066bcc00066d8000066f0200067074000673160006
-75e6000677a6000678ec00067b4600067c8800067e9e00067ef000067f40
-00067f9600067fec0006804e000680d600068324000684b6000686c20006
-87de0006899200068b1400068bd400068cb600068d1e00068d8000068df6
-00068e5e00068f0a00068f7a0006900a0006911e000691e20006922e0006
-92c40006937000069414000694be000695080006954a000695c000069628
-000696b800069766000697d0000698340006989a00069954000699ea0006
-9a4800069a7200069a9c00069aac00069abc00069b7e00069c8200069e8c
-00069fe200069ff20006a0a20006a1860006a1e60006a1f60006a2520006
-a2b00006a3d00006a4be0006a4ce0006a4de0006a4ee0006a4fe0006a5e4
-0006a6e40006a8bc0006aa780006ab7e0006abf80006ac720006ad240006
-ad340006ae420006ae520006ae620006af240006b0580006b1440006b154
-0006b1640006b1740006b2da0006b4460006b5720006b5820006b5920006
-b5a20006b5b20006b6940006b6a40006b8060006b9100006ba0e0006bb46
-0006bc180006bc960006bd140006be340006beb00006befc0006bf880006
-c09c0006c0f00006c2320006c2f20006c3be0006c4b40006c5be0006c670
-0006c7d60006c83c0006c9000006cb020006cc900006ce0e0006cf3e0006
-d1f00006d3320006d4600006d5d80006d7500006d8d00006da5e0006dc10
-0006dc7e0006dde20006df1a0006e01e0006e1540006e2860006e3560006
-e4260006e5820006e65c0006e6fc0006e8000006e92a0006ea280006eba8
-0006ed120006ee500006efc80006f1140006f1f60006f25e0006f3000006
-f3a00006f49e0006f6060006f7400006f8d40006fa1e0006fb020006fb60
-0006fc660006fcfc0006fdbe0006fe640006fea400070050000701220007
-01e800070310000704b0000705bc00070614000707ac0007083a0007084c
-0007087c000708ac000708e40007091c000709520007098e000709c40007
-0a0000070b6e00070bb800070c5200070cea00070d6400070de800070e4e
-00070efa00070f46000710660007111c000711f20007122a000712680007
-12dc000713d6000714f4000715f6000716380007167a000716e8000716f8
-000717080007171800071728000717380007174800071758000717680007
-17780007178800071798000717980007191c0007192c000719ec00071ab2
-00071be800071dde00071fe0000721dc00072412000726120007267e0007
-27900007292200072a7a00072b2c00072b7000072c0e00072d3e00072d8e
-00072e2400072f6000072f70000731260007325a000732aa000733000007
-33c20007340600073448000734ce0007352c0007361e000736ac000736e2
-0007375c000737d4000738240007393000073a2600073ad000073afa0007
-3b2400073b4e00073b7800073bb800073bf800073c3000073c6800073cb2
-00073cfc00073d3c00073d7c00073dc600073e1000073e5000073e900007
-3eea00073f4400073f7e00073fb800073ffc0007404000074084000740c8
-0007411c00074170000741bc00074208000742460007428a000742da0007
-432a00074384000743e20007440c00074436000744d00007456a000745ae
-000745f2000747080007471800074760000747a8000747fa0007484c0007
-48b60007490a00074956000749b400074a3e00074aa200074ae600074b30
-00074b9800074be200074c2200074c6a00074ca600074ce200074d1e0007
-4d5800074d9a00074ddc00074e1c00074e5c00074ea600074ef000074f46
-00074f9e00074fec0007503a0007507c000750ca0007510c000751560007
-5198000751dc0007523800075294000752e00007532c00075376000753c0
-000753fe0007543c000754ba0007553800075572000755ac000756460007
-56e0000757b400075888000758e400075940000759b400075a2800075b86
-00075b9600075c8000075c9000075cc600075cfc00075d3600075d700007
-5dac00075de800075e2e00075e7400075fda00076190000762dc0007649a
-00076610000767b8000768e8000769ee00076c0c00076d5000076ee60007
-706e000770ec0007723000077438000774cc00077560000776b4000777de
-0007795800077a9800077c0400077cf200077ebc00078050000780d20007
-8204000782ee0007845600078538000786ee000787e00007894200078a7e
-00078b7200078d3600078ebe00079062000791c600079362000795200007
-96a600079742000798b6000799a800079a9000079c1000079d6200079e82
-0007a01a0007a1f00007a37e0007a4280007a4de0007a6900007a7340007
-a7c20007a80e0007a85a0007a8d20007a9b00007aa2a0007aacc0007ab20
-0007ac840007adb00007aec20007afc40007b08c0007b2000007b3400007
-b5660007b6100007b73a0007b83e0007b9de0007baca0007bbc40007bcc2
-0007bda80007bec20007c07c0007c22a0007c3980007c4100007c4840007
-c5a20007c6260007c7280007c8b40007ca2c0007cb620007cc6c0007cde2
-0007cf5a0007d14c0007d33a0007d5000007d5740007d6240007d6da0007
-d78a0007d8480007d9420007da460007db400007dc4c0007dcd40007dd62
-0007ddea0007de7e0007df5a0007e0500007e1340007e22a0007e2be0007
-e37a0007e40e0007e4cc0007e5bc0007e6c40007e7c20007e8d60007e9f8
-0007eb0c0007ec4c0007ed860007eea80007efbc0007f1000007f2540007
-f4680007f61a0007f6ce0007f7ea0007f8c00007f9de0007fabc0007fc50
-0007fd0a0007fda60007fe980007ff800008006c000800ea000801e40008
-03220008044e00080482000804c6000804d600080576000806180008070e
-000807fa000808d4000809ac00080b0a00080c6a00080d0800080d9e0008
-0ddc00080e1c00080e5a00080e9a00080ef400080f4c00080fa60008100a
-0008109600081292000812e20008140e0008149400081514000815ee0008
-16c2000817c6000819b200081aca00081b3a00081bca00081c8c00081d5e
-00081dca00081e4800081f9c00081fe2000820280008210c000821480008
-21a6000821e4000822160008225a0008229c000822cc000100000d3500f2
-003c009d000700020010002f005600000468041d0005000200>
-<0000003a02be0000000300000000006a00000000000300000001000a006a
-0000000300000002000e00740000000300000003005e0082000000030000
-0004000a00e00000000300000005001800ea0000000300000006000e0102
-000000030000000700ba01100000000300000008003001ca000000030000
-0009008a01fa000000030000000d02aa028400010000000000000035052e
-000100000000000100050563000100000000000200070568000100000000
-0003002f056f00010000000000040005059e0001000000000005000c05a3
-0001000000000006000705af0001000000000007005d05b6000100000000
-00080018061300010000000000090045062b000100000000000d01550670
-0003000104030002000c07c50003000104050002001007d1000300010406
-0002000c07e10003000104070002001007ed0003000104080002001007fd
-0003000104090000006a080d0003000104090001000a0877000300010409
-0002000e08810003000104090003005e088f0003000104090004000a08ed
-0003000104090005001808f70003000104090006000e090f000300010409
-000700ba091d0003000104090008003009d70003000104090009008a0a07
-000300010409000d02aa0a9100030001040a0002000c0d3b00030001040b
-000200100d4700030001040c0002000c0d5700030001040e0002000c0d63
-0003000104100002000e0d6f000300010413000200120d7d000300010414
-0002000c0d8f000300010415000200100d9b0003000104160002000c0dab
-0003000104190002000e0db700030001041b000200100dc500030001041d
-0002000c0dd500030001041f0002000c0de10003000104240002000e0ded
-00030001042a0002000e0dfb00030001042d0002000e0e0900030001080a
-0002000c0e170003000108160002000c0e23000300010c0a0002000c0e2f
-000300010c0c0002000c0e3b00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0052006500670075006c00610072004d006f006e006f
-0074007900700065003a0041007200690061006c00200052006500670075
-006c00610072003a00560065007200730069006f006e00200035002e0030
-003100200028004d006900630072006f0073006f00660074002900410072
-00690061006c00560065007200730069006f006e00200035002e00300031
-0041007200690061006c004d00540041007200690061006c002000690073
-00200061002000740072006100640065006d00610072006b0020006f0066
-00200054006800650020004d006f006e006f007400790070006500200043
-006f00720070006f0072006100740069006f006e00200069006e00200074
-0068006500200055006e0069007400650064002000530074006100740065
-007300200061006e0064002f006f00720020006f00740068006500720020
-0063006f0075006e00740072006900650073002e0054006800650020004d
-006f006e006f007400790070006500200043006f00720070006f00720061
-00740069006f006e004d006f006e006f0074007900700065002000540079
-00700065002000440072006100770069006e00670020004f006600660069
-006300650020002d00200052006f00620069006e0020004e006900630068
-006f006c00610073002c0020005000610074007200690063006900610020
-005300610075006e0064006500720073002000310039003800320059006f
-00750020006d006100790020007500730065002000740068006900730020
-0066006f006e007400200074006f00200064006900730070006c00610079
-00200061006e00640020007000720069006e007400200063006f006e0074
-0065006e00740020006100730020007000650072006d0069007400740065
-006400200062007900200074006800650020006c006900630065006e0073
-00650020007400650072006d007300200066006f00720020007400680065
-002000700072006f006400750063007400200069006e0020007700680069
-006300680020007400680069007300200066006f006e0074002000690073
-00200069006e0063006c0075006400650064002e00200059006f00750020
-006d006100790020006f006e006c0079002000280069002900200065006d
-0062006500640020007400680069007300200066006f006e007400200069
-006e00200063006f006e00740065006e0074002000610073002000700065
-0072006d0069007400740065006400200062007900200074006800650020
-0065006d00620065006400640069006e0067002000720065007300740072
-0069006300740069006f006e007300200069006e0063006c007500640065
-006400200069006e0020007400680069007300200066006f006e0074003b
-00200061006e006400200028006900690029002000740065006d0070006f
-0072006100720069006c007900200064006f0077006e006c006f00610064
-0020007400680069007300200066006f006e007400200074006f00200061
-0020007000720069006e0074006500720020006f00720020006f00740068
-006500720020006f00750074007000750074002000640065007600690063
-006500200074006f002000680065006c00700020007000720069006e0074
-00200063006f006e00740065006e0074002ea9203230303620546865204d
-6f6e6f7479706520436f72706f726174696f6e2e20416c6c205269676874
-732052657365727665642e417269616c526567756c61724d6f6e6f747970
-653a417269616c20526567756c61723a56657273696f6e20352e30312028
-4d6963726f736f667429417269616c56657273696f6e20352e3031417269
-616c4d54417269616c20697320612074726164656d61726b206f66205468
-65204d6f6e6f7479706520436f72706f726174696f6e20696e2074686520
-556e697465642053746174657320616e642f6f72206f7468657220636f75
-6e74726965732e546865204d6f6e6f7479706520436f72706f726174696f
-6e4d6f6e6f7479706520547970652044726177696e67204f666669636520
-2d20526f62696e204e6963686f6c61732c20506174726963696120536175
-6e646572732031393832596f75206d617920757365207468697320666f6e
-7420746f20646973706c617920616e64207072696e7420636f6e74656e74
-206173207065726d697474656420627920746865206c6963656e73652074
-65726d7320666f72207468652070726f6475637420696e20776869636820
-7468697320666f6e7420697320696e636c756465642e20596f75206d6179
-206f6e6c792028692920656d626564207468697320666f6e7420696e2063
-6f6e74656e74206173207065726d69747465642062792074686520656d62
-656464696e67207265737472696374696f6e7320696e636c756465642069
-6e207468697320666f6e743b20616e6420286969292074656d706f726172
-696c7920646f776e6c6f6164207468697320666f6e7420746f2061207072
-696e746572206f72206f74686572206f7574707574206465766963652074
-6f2068656c70207072696e7420636f6e74656e742e004e006f0072006d00
-61006c006f00620079010d0065006a006e00e9006e006f0072006d006100
-6c005300740061006e0064006100720064039a03b103bd03bf03bd03b903
-ba03ac00a90020003200300030003600200054006800650020004d006f00
-6e006f007400790070006500200043006f00720070006f00720061007400
-69006f006e002e00200041006c006c002000520069006700680074007300
-2000520065007300650072007600650064002e0041007200690061006c00
-52006500670075006c00610072004d006f006e006f007400790070006500
-3a0041007200690061006c00200052006500670075006c00610072003a00
-560065007200730069006f006e00200035002e0030003100200028004d00
-6900630072006f0073006f0066007400290041007200690061006c005600
-65007200730069006f006e00200035002e00300031004100720069006100
-6c004d00540041007200690061006c002000690073002000610020007400
-72006100640065006d00610072006b0020006f0066002000540068006500
-20004d006f006e006f007400790070006500200043006f00720070006f00
-72006100740069006f006e00200069006e00200074006800650020005500
-6e0069007400650064002000530074006100740065007300200061006e00
-64002f006f00720020006f007400680065007200200063006f0075006e00
-740072006900650073002e0054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-4d006f006e006f0074007900700065002000540079007000650020004400
-72006100770069006e00670020004f006600660069006300650020002d00
-200052006f00620069006e0020004e006900630068006f006c0061007300
-2c0020005000610074007200690063006900610020005300610075006e00
-64006500720073002000310039003800320059006f00750020006d006100
-7900200075007300650020007400680069007300200066006f006e007400
-200074006f00200064006900730070006c0061007900200061006e006400
-20007000720069006e007400200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-200074006800650020006c006900630065006e0073006500200074006500
-72006d007300200066006f00720020007400680065002000700072006f00
-6400750063007400200069006e0020007700680069006300680020007400
-680069007300200066006f006e007400200069007300200069006e006300
-6c0075006400650064002e00200059006f00750020006d00610079002000
-6f006e006c0079002000280069002900200065006d006200650064002000
-7400680069007300200066006f006e007400200069006e00200063006f00
-6e00740065006e00740020006100730020007000650072006d0069007400
-7400650064002000620079002000740068006500200065006d0062006500
-6400640069006e0067002000720065007300740072006900630074006900
-6f006e007300200069006e0063006c007500640065006400200069006e00
-20007400680069007300200066006f006e0074003b00200061006e006400
-200028006900690029002000740065006d0070006f007200610072006900
-6c007900200064006f0077006e006c006f00610064002000740068006900
-7300200066006f006e007400200074006f00200061002000700072006900
-6e0074006500720020006f00720020006f00740068006500720020006f00
-750074007000750074002000640065007600690063006500200074006f00
-2000680065006c00700020007000720069006e007400200063006f006e00
-740065006e0074002e004e006f0072006d0061006c004e006f0072006d00
-610061006c0069004e006f0072006d0061006c004e006f0072006d00e100
-6c004e006f0072006d0061006c0065005300740061006e00640061006100
-720064004e006f0072006d0061006c004e006f0072006d0061006c006e00
-79004e006f0072006d0061006c041e0431044b0447043d044b0439004e00
-6f0072006d00e1006c006e0065004e006f0072006d0061006c004e006f00
-72006d0061006c004e0061007600610064006e006f0074006801b001a103
-00006e00670041007200720075006e00740061004e006f0072006d006100
-6c004e006f0072006d0061006c004e006f0072006d0061006c004e006f00
-72006d0061006c000000b900540328b326181fd0bc032900e00329000203
-29b22b1d1fb90327031db23b1f40b80323b31215320f412d03200001002f
-0320000100200320006f032000af032000bf03200004005f031e00010010
-031e007f031e0080031e00af031e00bf031e00d0031e00060000031e0010
-031e0020031e006f031e009f031e00e0031e0006031d031cb2201f104127
-0319007f03190002000f031700ef031700ff03170003001f0317002f0317
-004f0317005f0317008f0317009f03170006000f0317005f0317006f0317
-007f031700bf031700f00317000600400317b2923340b80317b28b3340b8
-0317b36a6c3240b80317b2613340b80317b35c5d3240b80317b357593240
-b80317b34d513240b80317b344493240b80317b23a3340b80317b3313432
-40b80317b32e423240b80317b3272c3240b80317b312253280b80317b30a
-0d32c04116031600d00316000200700316000102c4000f0101001f00a003
-1500b0031500020306000f0101001f00400312b32426329fbf0304000103
-0203010064001fffc00301b20d1132410a02ff02ef0012001f02ee02ed00
-64001fffc002edb30e11329f414a02e200af02e200bf02e2000302e202e2
-02e102e1007f02e00001001002e0003f02e0009f02e000bf02e000cf02e0
-00ef02e0000602e002e002df02df02de02de000f02dd002f02dd003f02dd
-005f02dd009f02dd00bf02dd00ef02dd000702dd02dd001002dc00010000
-02dc0001001002dc003f02dc000202dc02dc001002db000102db02db000f
-02da000102da02daffc002d3b2373932b9ffc002d3b22b2f32b9ffc002d3
-b21f2532b9ffc002d3b2171b32b9ffc002d3b2121632b802d2b2f9291fb9
-0326031cb23b1f40bb0322003e00330322b225311fb80318b23c691fb802
-e3b3202b1fa0413002d400b002d40002000002d4001002d4002002d40050
-02d4006002d4007002d40006006002d6007002d6008002d6009002d600a0
-02d600b002d60006000002d6001002d6002002ca002002cc002002d60030
-02d6004002d6005002d6000802d0b2202b1fb802cfb226421f411602ce02
-c70017001f02cd02c80017001f02cc02c60017001f02cb02c50017001f02
-c902c5001e001f02ca02c6b21e1f00410b02c6000002c7001002c6001002
-c7002f02c5000502c1b324121fff411102bf0001001f02bf002f02bf003f
-02bf004f02bf005f02bf008f02bf000602bf0222b2641f12410b02bb00ca
-0800001f02b200e90800001f02a600a20800406a1f402643493240204349
-3240263a3d3240203a3d329f209f26024026969932402096993240268e92
-3240208e92324026848c324020848c3240267a813240207a813240266c76
-3240206c76324026646a324020646a3240265a5f3240205a5f3240264f54
-3240204f5432b8029eb724271f374f6b0120410f02770030027700400277
-00500277000402770277027700f90400001f029bb22a2a1fb8029a402b29
-2a1f80ba0180bc0180520180a201806501807e01808101803c01805e0180
-2b01801c01801e0180400180bb0138000100800140b40180400180bb0138
-00010080013940180180ca0180ad01807301802601802501802401802001
-3740b80221b2493340b80221b2453340b80221b341423240b80221b33d3e
-320f410f0221003f0221007f0221000300bf022100cf022100ff02210003
-00400221b320223240b80221b3191e3240b80222b32a3f3240b80221b32e
-3a326f414802c3007f02c3008f02c300df02c30004002f02c3006002c300
-cf02c30003000f02c3003f02c3005f02c300c002c300ef02c300ff02c300
-0600df02220001008f02220001000f0222002f0222003f0222005f022200
-7f022200ef0222000600bf022100ef02210002006f0221007f022100af02
-210003002f0221003f0221004f0221000302c302c3022202220221022140
-1d101c102b1048038f1c010f1e014f1eff1e023700161600000012110811
-b8010db6f70df8f70d00094109028e028f001d001f0290028f001d001f02
-8fb2f91d1fb80198b226bb1f41150197001e0401001f013900260125001f
-013800730401001f0135001c0801001f0134001c02ab001f0132b21c561f
-b8010fb2262c1fba010e001e0401b61ff91ce41fe91cb80201b61fe81cbb
-1fd720b80401b21fd51cb802abb61fd41c891fc92fb80801b21fbc26b801
-01b21fba20b80201b61fb91c381fadcab80401b21f8126b8019ab21f7e26
-b8019ab61f7d1c471f6b1cb80401b21f6526b8019ab21f5e73b80401400f
-1f52265a1f481c891f441c621f4073b80801b61f3f1c5e1f3c26b8019ab2
-1f351cb80401b61f301cbb1f2b1cb80401b61f2a1c561f291cb80101b21f
-231eb80401b21f5537b80168402c07960758074f07360732072c0721071f
-071d071b071408120810080e080c080a080808060804080208000814b8ff
-e0402b000001001406100000010006040000010004100000010010020000
-01000200000001000002010802004a00b013034b024b5342014bb0c06300
-4b6220b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807
-ff52b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ff
-b101018e851bb0124358b900010111858d1bb900010128858d5959001816
-763f183f123e113946443e113946443e113946443e113946443e11394660
-443e11394660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b2b
-182b1db0964b5358b0aa1d59b0324b5358b0ff1d594bb09353205c58b901
-f201f04544b901f101f045445958b9033e01f2455258b901f2033e445959
-4bb8015653205c58b9002001f14544b9002601f145445958b9081e002045
-5258b90020081e4459594bb8019a53205c58b9002501f24544b9002401f2
-45445958b909090025455258b9002509094459594bb8040153205c58b173
-244544b1242445445958b917200073455258b9007317204459594bb80401
-53205c58b1ca254544b1252545445958b9168000ca455258b900ca168044
-59594bb03e53205c58b11c1c4544b11e1c45445958b9011a001c455258b9
-001c011a4459594bb05653205c58b11c1c4544b12f1c45445958b9018900
-1c455258b9001c01894459594bb8030153205c58b11c1c4544b11c1c4544
-5958b90de0001c455258b9001c0de04459592b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65
-422b2b01b33b59635c456523456023456560234560b08b766818b0806220
-20b163594565234520b003266062636820b003266165b059236544b06323
-4420b13b5c4565234520b003266062636820b003266165b05c236544b03b
-2344b1005c455458b15c406544b23b403b4523614459b347503437456523
-456023456560234560b089766818b080622020b134504565234520b00326
-6062636820b003266165b050236544b034234420b147374565234520b003
-266062636820b003266165b037236544b0472344b10037455458b1374065
-44b24740474523614459004b5342014b5058b108004259435c58b1080042
-59b3020b0a124358601b2159421610703eb0124358b93b21187e1bba0400
-01a8000b2b59b00c2342b00d2342b0124358b92d412d411bba0400040000
-0b2b59b00e2342b00f2342b0124358b9187e3b211bba01a80400000b2b59
-b0102342b0112342002b7475737500184569444569444569447373737374
-757374752b2b2b2b74752b2b2b2b2b737373737373737373737373737373
-737373737373737373732b2b2b45b0406144737400004bb02a534bb03f51
-5a58b1070745b040604459004bb03a534bb03f515a58b10b0b45b8ffc060
-4459004bb02e534bb03a515a58b1030345b040604459004bb02e534bb03c
-515a58b1090945b8ffc06044592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b752b2b2b2b2b2b2b435c58b9008002bbb301401e017400735903b01e4b
-5402b0124b545ab012435c5a58ba009f02220001007359002b7473012b01
-732b2b2b2b2b2b2b2b737373732b2b2b2b2b002b2b2b2b2b2b0045694473
-456944734569447374754569447345694445694445694473744569444569
-44732b2b2b2b2b732b002b732b74752b2b2b2b2b2b2b2b2b2b2b2b2b2b73
-7475732b7374757374752b2b2b742b2b000000>
-[15785 15901 16277 16325 16277 16273 15933 16169 16277 15721 16361 15561 15973
-16029 16305 15693 16345 16249 15893 15629 16365 15481 16245 16249 16357 16337
-15821 15749 16345 15937 16257 16033 19077 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-
-2 0 3 <> ArialMT AddT42Char 
-2 10012 38 <00010066ffe7057605d3001d00d3b563026a1d0201b8ffe8b40b0b065500
-b8ffe8405f0b0b06552000320d63007000741d8000841d90009a05ab03a5
-0db903b40dc70dd000e41df31d110e121d111d1d032a0628112a1c201f47
-0d56145715561968056b1d7b128b129a03990e9a1ca801a402a811d50e13
-0014001a1014101a0402b8ffdeb2283901b8ffc0402d2839100f0001041b
-131e0c031b1e040910260f4a0026200101011a1f1726200801080c0b0b06
-5508191e635c182b4e10f42b5d4ded4e10f65d4dedf4ed003fed3fed1117
-393130012b2b5d5d71005d2b2b0172011706042322240235341224333204
-17072626232206021514121633323604b4c23dfec3e5edfed79baf0143c2
-dc012c3bbf33c293a9e35c6de686a3e2020231effbc1016ed2e50155b1e0
-cb2da092a2feef91bbfee98abc00>ArialMT AddT42Char 
-2 10654 40 <000100a2000004e805ba000b0095401506051e080807070003041e020102
-0a091e0b000807b8ffc0401d1012340754034a200a200d020a1a0d040920
-0120000100201010025500b8fff6b40f0f025500b8fff6b40d0d025500b8
-fffab40c0c025500b8fffab40c0c065500b8fff0400a0d0d0655005d0c3b
-5b182b4e10f42b2b2b2b2b2b5d3c4dfd3c4e10f65d4df4e42b003f3cfd3c
-3f3cfd3c12392f3c10fd3c3130331121152111211521112115a20424fc9e
-032bfcd5038405baadfe3facfe0dad00>ArialMT AddT42Char 
-2 11694 44 <000100bf0000018105ba000300ccb5010200080205b8ffc0b3383d3405b8
-ffc0b333343405b8ffc0b32d303405b8ffc0b328293405b8ffc0b3232534
-05b8ffc0b31d1e3405b8ffc0b3181a3405b8ffc0402a0d103420059005af
-050303200100008f00a000b000042f0040005000df00f000051220008f00
-90000305b8ffc0400b0d0d025500181010025500b8ffecb40f0f025500b8
-ffeeb40d0d025500b8fff640100c0c025500200b0b065500a204d659182b
-10f62b2b2b2b2b2b5d435c58b2800001015d5971723cfd5d2b2b2b2b2b2b
-2b2b3c003f3f313033113311bfc205bafa46>ArialMT AddT42Char 
-3 4240 68 <0002004affe8041c043e00280037022d402c090d092a190d1a2a290d2a2a
-390d3615371b3a2a492a5d0d5d2a6a0d692a60308a0d86299a169b1aa90d
-1528b8ffe8b40b0b065527b8ffe840190b0b0655a619aa28b619bb28c419
-cf28d215dd28084416011eb8fff440110c0c065512120c0c0655050c0c0c
-065535b8ffe040550c0c06551f171f182b2c2a343904392c4904482c5608
-592b6608692b760c870cc90cf90df92b1137340e0104102f243417322114
-185f296f2902291c2f0e3f0e8f0e9f0eff0e059f0eaf0eef0e030e0c0f0f
-02550eb8ffeab4101002550eb8fff44015101006550e0c0d0d06550e060f
-0f06550e0e1c0317b802aab61895141c1c0700b8fff4401a0c0c06550045
-270a321c030b2961106100060d0d025500252124b8ffecb41010025524b8
-ffec400b0d0d025524040c0c025524b8ffe4b40b0b025524b8fff4b40b0b
-065524b8ffdc400b1010065524060f0f065524b8fffcb40c0c065524b802
-5b400e27400026102620263026af260539b8ffc0b40e0e025526b8ffd6b6
-0e0e0255263139b8ffc0400d1e23343039c03902a039013917b8fff44041
-10100655172518222f24bf06cf06021f063f0602060e0f0f0255060c0d0d
-025506180c0c0255060c0b0b0255060c0b0b0655060e0d0d065506100c0c
-065506313810f62b2b2b2b2b2b2b5d71edf4ed2b105d712bf62b2b5dedf4
-2b2b2b2b2b2b2b2b3cfd2be5e5003fed3fe42b3fedfde41112392f2b2b2b
-2b2b5d71ed711112391112393901111217393130005d2b2b2b2b01715d2b
-2b0071250606232226353436363736373637363534272623220607273e02
-333216161716151514161723260306070e02151416333236373635033c64
-b96aafbc477348356bda67013345887f791db0186ed08988aa5010091722
-bc1c1762c46f5c326d6968a2261d835546ab854e814e140e0d1a24250a6e
-2d3d597118718b4b40614a2e78f0fb853d3801dd281c10284d2f48605b4f
-3d77>ArialMT AddT42Char 
-3 5440 70 <00010050ffe803ed043e001a015ab1020243545840340e7f0f010f0b0140
-0050007000030004121c0b07181c040b010e1507080e0e0255070c0d0d02
-55070c0c0c025507100b0b0255072f2b2b2b2bcdd4c6003fed3fed10c45d
-3210c45d3231301b4047090c011f1c4313431753135317601360179b029b
-039a0da410a41a0c080d190a6a0269036a05750c700d800da60cb509b60a
-b50c0c160c860ce302030e225f0f6f0f7f0f030f01b802aa407930004000
-5000600070009000a000e000f00009000f0f0b000004121c0b07181c040b
-1c0f010f240e080d0d06550e221b000100240b2b1f010100010101400b0b
-065501401010065501480c0c0655011a0d0d065501491c1524cf07011f07
-3f0702070e0b0b0655070a1010065507120c0c065507311b34c4182b10f6
-2b2b2b5d71ed10f62b2b2b2b5d724b53234b515a58b90001ffc03859ed72
-f42bed72003fed3fed12392f11392f105de4105de43130005d71015d7159
-011706062322001134123633321617072626232206151416333236033cb1
-1defaedafef772e989addc1faf197f5a88aaa4846a8e018517b7cf011d01
-0aac010281afa11b6b6cc3d3d6c28200>ArialMT AddT42Char 
-3 5876 71 <00020046ffe803df05ba0011001d015540a40a02040d250d340d440d0535
-14351c5702540a5214531c6702640565096314601cc01fd405d513dd19e5
-13e514ef17eb19e51de01fff1f161f1f2b1a3c163c1a4b1a701f901f072e
-02240d2e163a02350d4b02450d4614491c570a560d670de506e716fa01f4
-0e100115030e0b100f001b1c0b0711000a151c030b1833010025110f2510
-10d011011011401160118011041f400b0b02551f400d0d02551112101002
-5511b8fff440110f0f025511060e0e025511180d0d025511b8fff2400b0b
-0b0655110e1010065511b8ffeeb40c0c065511b8fff840420d0d06551174
-1224bf07cf07df07ff07041f073f074f0703071e0b0b025507180c0c0255
-071e0d0d0255070c0b0b0655070c0d0d0655071a0c0c065507191e345018
-2b4e10f42b2b2b2b2b2b5d714dedfd2b2b2b2b2b2b2b2b2b2b5d713c10ed
-10fd3ce4003fed3f3c3fed3f3c11391112393130005d01715d0071213506
-232226263534123633321617113311011416333236353426232206033865
-c47fd5756ad48360962fb3fd20ac7576a5a87b78a1869e8cfba39f01038a
-5141020efa460212cccac1c6daccc400>ArialMT AddT42Char 
-3 6312 72 <0002004bffe8041e043e0015001d015340171f001c150255035d055d0955
-0b65036b056f09650b0815b8ffe4b40d0d065511b8ffe440520d0d06551d
-1c0d0d06552712d905fa14f61a0431123a19311c41124d1a411c51125c19
-521c61126d1a611c78067815f602f618100016010f0d1717501660167016
-03161c0f9010a010021010041b1c0a0700ba02aa0001ffc0b41010025501
-b8ffc04010101006551001010195131c040b17400db8ffdcb40d0d02550d
-b8ffeeb40d0d06550db8ffeab40c0c06550db8ffc04009272a34b00d010d
-1a1fb8ffc0b32526341fb8ffc040411e2334301f011f163310240740242a
-341f073f074f070307200b0b025507180c0c0255071c0d0d0255070e0b0b
-0655071c0c0c065507160d0d065507191e3437182b4e10f42b2b2b2b2b2b
-5d2b4dfde44e10712b2bf6712b2b2b2b4ded003fedfd5d2b2be43fed1239
-2f5d3cfd713c011112393912393130015d005d2b2b2b0171720117060623
-22001110003332001114072116163332360121262726232206035eba2cee
-b9e9feef0114dcd5010e01fce80ab285638cfdda02510c3856897ca90156
-17a3b4011f0103010c0128fedefef91020afba680195864368a6>ArialMT AddT42Char 
-3 7594 75 <00010087000003e805ba00140161b90016ffc0b315173403b8ffe0400e0d
-0d0655250435034503ba0d0403b8ffe0403a1719341708110c1114030501
-000f1c0507140b0a0c250940333634ff0901c0090116400b0b0255164010
-10025509281010025509140e0e025509b8ffec40110d0d025509040c0c02
-55091a0b0b025509b8fff6400b0b0b065509141010065509b8fff8400b0d
-0d0655090a0f0f065509b8fff6b60c0c0655094e16b8ffc04017343634b0
-16f016027016a016b016ff1604160214250100b8ffc04010333634f00001
-00002000d000e0000400b8fffab41010025500b8fffa40170e0e02550004
-0c0c025500080b0b025500040b0b065500b8fffa40160f0f065500020c0c
-065500020d0d0655004e154750182b10f62b2b2b2b2b2b2b2b5d712b3cfd
-3c105d712bf42b2b2b2b2b2b2b2b2b2b2b2b5d712bed003f3c3fed3f1139
-113901123931304379400e060e07250e060c1b010d080f1b01002b012b2b
-81002b5d2b012b33113311363332161615112311342623220606151187b4
-7ec076ae4bb4756b508d3c05bafdf2925da49cfd5f02a1877b538e7dfdbb
->ArialMT AddT42Char 
-3 8014 76 <000200880000013c05ba0003000700cd405e09360b0b02554f099009a009
-b009c009df09f0090700091f09700980099f09b009c009df09e009ff090a
-1f09010001070402030906037e0100060506040a0607250500049f04a004
-b004c004e00406c004f0040200042004d004e0040404b8fff8b410100255
-04b8fffa40170e0e025504040c0c0255040a0b0b025504140b0b065504b8
-ffeab41010065504b8fffeb40d0d065504b8fffc400a0c0c0655044e0847
-50182b10f62b2b2b2b2b2b2b2b5d71723cfd3c003f3f3c3fed0111123939
-111239393130015d72712b133533150311331188b4b4b404ebcfcffb1504
-26fbda00>ArialMT AddT42Char 
-3 9202 79 <000100830000013705ba000300e3b605360b0b025505b8ffc0b337383405
-b8ffc0b334353405b8ffc0b330313405b8ffc0b322253405b8ffc0402515
-17340f051f059f05df05044f05df05f005031f0570058005ff0504010000
-0a0203250100b8ffc0b337383400b8ffc040153335349f0001c000f00002
-00002000d000e0000400b8fff8b41010025500b8fffa401d0e0e02550004
-0c0c0255000a0b0b025500140b0b065500081010065500b8fffeb40d0d06
-5500b8ffffb40c0c065500b8fffc400a0c0c0655004e044750182b10f62b
-2b2b2b2b2b2b2b2b5d71722b2b3cfd3c003f3f3130015d71722b2b2b2b2b
-2b3311331183b405bafa4600>ArialMT AddT42Char 
-3 9454 80 <0001008700000626043e002301c7b9000dfff4b40d0d065508b8fff4b40d
-0d065509b8ffd8404d0b0d342504e404e409e117e52005d505f620021708
-202309181b20090303231e1c06151c0b0b06070106231a19100ad0250190
-25a025022517171a0e2590110111041010025511180f0f025511b8ffec40
-0b0e0e025511140c0c025511b8ffe840170b0b025511020b0b0655110c10
-10065511060f0f065511b8fffab40c0c065511b8fff8b40d0d065511b801
-5d400c1825901b011b180f0f02551bb8ffec400b0e0e02551b140c0c0255
-1bb8ffee40110b0b02551b040b0b06551b0a101006551bb8fffe400b0d0d
-06551b0c0f0f06551bb8fffcb40c0c06551bb8015d4016000233232501d0
-00019000a000021f003f004f000300b8fffe401d0e0e025500100d0d0255
-00100c0c0255000c0b0b025500160b0b065500b8fffcb41010065500b8ff
-f440140f0f0655000a0c0c0655000e0d0d065500192425b80178b3214750
-182b2b4ef42b2b2b2b2b2b2b2b2b5d71723c4dfde410f42b2b2b2b2b2b2b
-2b2b5dedf42b2b2b2b2b2b2b2b2b2b5dfd4e456544e67172003f3c3c3c3f
-3f3c4d10ed10ed11173901111239123931304379400e0c141326140c111b
-01120d151b01002b012b2b81015d005d2b2b2b3311331536363332161736
-3332161511231134262623220615112311342623220606151187a132a66a
-76971f7eca9eaab3235c3e7094b458644c813a0426954e5f6258baafb6fd
-27029d6c5f3a95a4fd9702b27878509a91fdd900>ArialMT AddT42Char 
-3 10014 81 <00010087000003e6043e0016017d40130503061302a810b810e303e713f0
-03f6130604b8fff0403c0b0d347910019810d018e018ff18042008140e14
-16121c05070106160d0a0d0e0c0e2418401010025518400b0b02550b2810
-1002550b140e0e02550bb8ffec40110d0d02550b040c0c02550b220b0b02
-550bb8fff4400b0b0b06550b14101006550bb8fff9400b0d0d06550b0a0f
-0f06550bb8fff640120c0c06550b40333634ff0b01ff0b010b4e18b8ffc0
-401a343634b018f018027018a018b018c01804180302331516250100b8ff
-f6b41111025500b8fffab41010025500b8fffa40170e0e025500040c0c02
-55000a0b0b025500040b0b065500b8fffa40110f0f065500020c0c065500
-040d0d065500b8ffc04012333634f0000100002000d000e00004004e1710
-f65d712b2b2b2b2b2b2b2b2b2b3cfd3cf43c105d712bf65d712b2b2b2b2b
-2b2b2b2b2b2b2b2bed3c103c003f3c3f3fed113901123931304379401606
-11090a080a070a0306102611060e1b010f0a121b01002b012b2b2a81015d
-71002b5d71331133153633321616171615112311342626232206151187a2
-75dd60a150100ab42a6b4873a7042697af45704d327dfd7302866e6d4192
-ccfdbc00>ArialMT AddT42Char 
-3 10468 82 <00020044ffe80427043e000d0019016bb615180d0d065513b8ffe8b40d0d
-06550fb8ffe840730d0d065519180d0d065512070a190c47064808560659
-08670669080834103a123a16351845104b124b1645185c055c0952105d12
-5d1652186d056d0964106d126d1664187701150906050d5b035405540a5b
-0c6c036505650a6c0c0a171c0407111c0b0b14241b400d0d02551b400b0b
-025507b8ffea40110f0f025507180d0d025507100b0b025507b8fff0b40b
-0b065507b8fff0b40d0d065507b8fff0b40f0f065507b8fff0b40c0c0655
-07b8ffc04013242534300701000710072007030731df1b011bb8ffc04049
-1e2334301b011b0e24000c0e0f025500120d0d0255000c0c0c0255001c0b
-0b0255000e0b0b0655000e0d0d0655000c1010065500160c0c0655004024
-25341f003f000200311a3437182b10f65d2b2b2b2b2b2b2b2b2bed10712b
-5df65d5d2b2b2b2b2b2b2b2b2b2bed003fed3fed313001715d0071435c58
-4009530553096205620904015d59002b2b2b2b1310373633320015140606
-23220013141633323635342623220644a489c5db01167beb8bdffeedb9b2
-8786b2b38587b2021301278e76fee1fdcdeb82011e010dcccbccd1c5cbca
->ArialMT AddT42Char 
-3 11776 85 <00010085000002c6043e001100c9403b2f13011004012304340443045304
-66047404060911080908090d1311090d000308010b1c06070106000a0928
-900801082220130113022211250100b8ffc04010333634f0000100002000
-d000e0000400b8fff8b41010025500b8fff840110e0e025500040c0c0255
-00060b0b025500b8fffcb41010065500b8fff440160f0f065500060c0c06
-5500080d0d0655004e1247c4182b10f62b2b2b2b2b2b2b2b5d712b3cfde4
-105df472e4003f3f3fed11393911393901111239390010c9870e7dc43130
-005d72015d33113315363633321707262322060706151185a23e693f5b5e
-3e42423b5e141e0426a171483aa727473f6072fdd400>ArialMT AddT42Char 
-3 12038 86 <0001003fffe803b1043e00300317407b042214223a094a09442456226522
-7c098e098424a613ab2cc2030d09171a1817304b2cd617051b0255020210
-32010a185c085c095c0a5c0b5c0c5c0d6a086a096a0a6a0b6a0c6a0db426
-b4270f27262427242936245a0a590b64266428742374248024930a9c0c92
-28972c9530a40aa90ca327a428b326c5261628b8fff4b40d0d065522b8ff
-f4b40d0d065523b8fff4b40d0d065524b8fff4b40d0d065528b8fff4b40c
-0c065522b8fff4b40c0c065523b8fff4b40c0c065524b8fff4b40c0c0655
-1db8ffde40121e395a0827250c0a041a202615040b2e1d1ab802aa402219
-2c0b0b02551f193f194f195f19af19cf19060f191f196f19df19041f198f
-190219bd02550015000002aa0001ffc040140b0b025510014001021001d0
-0102000110010201b8ffc0b314163401b8ffc040100e113401012e5c1d6c
-1d021d1c150704b8fff4b40b0b025504b8ffe6b41010065504b8ffe64013
-0f0f0655041c2e0b1f1a011a24194013183432b8ffc0402f0f0f02551918
-0f0f025519180d0d025519160c0c025519201010065519200f0f06551910
-0c0c065519160d0d065519b8025bb207242ab8ffc0b51c39d02a012ab8ff
-e6b40c0c02552ab8ffe8b40f0f02552ab8ffe8b40c0c06552ab8ffeab60d
-0d06552a1a32b8ffc04021272a346032c032023f32803202321001010124
-00180d0d025500100d0d06550020b8fff4b40d0d025520b8fff4b4101006
-5520b8fff440190f0f065520240f100b0b02550f160c0c02550f200d0d02
-550fb8fffa40200f0f02550f0e0c0c06550f0c0d0d06550f22df00013f00
-4f00020019313437182b4e10f45d714df42b2b2b2b2b2bed2b2b2b102b2b
-ed724e105d712bf62b2b2b2b712b4dedf42b2b2b2b2b2b2b2b2bed72003f
-ed2b2b2b3fed7112392f2b2b5d71722be410fd5d71722be4111239111239
-0111121739313043794040272d1e2305142c261110121013100306220d20
-1b000928071b01052d071b011e14201b00210e231b0022230d0c08290a1b
-012827090a062b041b001f101d1b01002b2b103c103c2b103c103c2b012b
-2b2b2b2a2b818181002b2b2b2b2b2b2b2b2b5d71015d72715d1337161633
-323635342726272e02353436373636333216161707262623220615141716
-1716171e02151406062322263fb20f897b7c78352593c6994f41382a9153
-7dbd5a11b00c73697c6a16162f1b84bf975669c67dcfd9013d1c6b726544
-3d2318253249814e4779281f2b487b6718525c5237231c1d130a2433417c
-5c5a9f57ac00>ArialMT AddT42Char 
-3 12974 87 <00010024fff2022a0599001700d8b9000affc0b323263409b8ffc0404123
-263480190100010c0d0a0103001610092b0f0a06161c030b0f1022002201
-0d12250c01ff070845094560077007800790070400072007a007b007c007
-d0070607b8ffeeb41010025507b8fff4b40f0f025507b8fff2b40e0e0255
-07b8fff8b40d0d025507b8fff8b40c0c025507b8fffab41010065507b8ff
-f0400b0f0f065507060c0c065507b8ffe8b40d0d065507ba026a00180136
-b166182b10f62b2b2b2b2b2b2b2b2b5d71f4e410ed3cfd3c10e4f43c003f
-ed3f3cfd3c1139123911333310c93130015d2b2b25170623222626351123
-353311371133152311141616333202101a4c3c626c2c8484b3b5b5132b28
-1ea19f103e65a202638c01076cfe8d8cfd934d2c1a00>ArialMT AddT42Char 
-3 13266 88 <00010083ffe803e004260018014fb9001affc0400915173402201316340f
-b8fff040331214342b1301240813160c0113160b06000a111c030b003316
-251817403336341a401010025517281010025517120e0e025517b8ffec40
-0b0d0d025517040c0c025517b8fff4400b0b0b065517141010065517b8ff
-f8400b0d0d0655170c0f0f065517b8fff6400d0c0c0655ff1701c0170117
-4e1ab8ffc04015343634b01af01a02701aa01ab01aff1a041a0c2509b8ff
-c04010333634f0090100092009d009e0090409b8fff8b41010025509b8ff
-f840110e0e025509040c0c0255090a0b0b065509b8fff640160f0f065509
-020c0c065509020d0d0655094e194750182b10f62b2b2b2b2b2b2b5d712b
-ed105d712bf65d712b2b2b2b2b2b2b2b2b2b2b3cfde4003fed3f3f3c3939
-0111123931304379401a04100e0d0f0d0206070806080508030610040c1b
-000d08111b00002b012b2a2a81005d012b2b2b2135062322262627263511
-3311141716163332363635113311033f7cd55ea34f100bb40b116e51518e
-3bb49cb4486d4f35730292fdb38d314751538f880239fbda>ArialMT AddT42Char 
-3 13680 89 <0001001a000003e80426000a01eab1020243545840170508000a08060106
-0a0005090805010205240f0f0255052f2bddcd10ddcd113333003f3f3f12
-3931301bb7350501002211390ab8ffde400d11390916121c340816121c34
-02b8ffeab3121c3401b8ffeab3121c340ab8ffd840091e213400281e2134
-0ab8ffe8400922253400162225340ab8ffda407e282e340020282e340f0c
-29002809260a3900350a4800470a56015602590858096601660269086909
-78007701770279087809770a870187028603890788088a099d009809910a
-ac00a20abd00b707b10ac900c50ada00d50aec00e30afb00f40a2c0a0005
-0a1800160a2800260a370a4f00400a09054012163405400b0d34b1060243
-5458400905010008060106000ab8fff4400f0d0d06550a000c0d0d065500
-050908b8fff440120d0d0655080501020c0d0d06550205050c0b1112392f
-dd2bcd10dd2bcd10cd2bcd2b002f3f3f11123931301b40370a0708082509
-0a1409090a0003020225010014010100050a0a000a09080802020106070a
-09030001052f0c010c22084040400980090209b8011bb5400580050205b8
-011b400920024001220bead2182b10f6ed1a19fd5dfd5d1a18ede45d1112
-3939123939003f3c103c103c3f3c113987052e2b877dc4872e182b877dc4
-593130002b2b01715d2b2b2b2b2b2b2b2b2b2b2b2b005d59210133131617
-363713330101aefe6cbee4251f182becb9fe6e0426fd84676f54760288fb
-da00>ArialMT AddT42Char 
-3 14222 90 <00010006000005b704260012041db10202435458b90012fff440110d0d02
-5507060d0d025500060d0d02550ab8ffd4b40c0d025504b8ffe8400b0c0d
-025511200c0d02550ab8ffc0b40e10025504b8ffc0402f0e10025511400e
-100255040a110301000c06070601060f0a000a0d0c060c0c02550c110102
-040a04110a0c0c025511b8fff8b40d0d0255112f2b2bcdcd10d6cd10d42b
-cd003f3f3f3f3f111217393130002b2b2b2b2b2b012b2b2b1b40160f1401
-2a04290a024a115b118e110311200d0d06550ab8ffe0b40d0d065504b8ff
-e0b40d0d065511b8fff040091f2134101c1d273409b8fff040b71f243404
-060c0913061b09191205040004060b090b0e08121000130314071c081b0b
-1d0e240025072a082b0e340035073a083b0e4403470640074d084b0b430f
-47114a125b0f52126b076408671279067a077408b906ba0fb612f506fb09
-280b112800280d270e280f27122f1438003712770886089803970ca701a8
-02a80ba60cb500b606ba0ec804d606d909e804e80fe712f406fa091c0b06
-0d0d06550c060d0d065510060d0d06550e060d0d06550f060d0d065512b1
-0602435458401b0a0e0f0412001108070825070f250e122500000e07030d
-010c250db8ffd640370b0b06550d0225012a0b0b0655010d011413060a0b
-11260a2b115404520a5c116c117c118a110a110a040300010f0a000a0c06
-07060106003f3f3f3f3f111217395d01111239392f2bf42f2bf411121739
-10e410e410e41112391112391112391b40140305050206070705090a0a08
-0b0c0c0a1011110fb8ff4bb305001220b8ff4940660a0f0e20c311070820
-071112122b0507140505070e0a0c0c250d0e140d0d0e08110f0f2b0a0814
-0a0a080005020225010014010100000201071204080f110c0e0d0a110a04
-03120d0c0c0808070702020106120f0f0e0e000a14f6100d01600d700d80
-0d030db801a7400a204f0a016f0a7f0a020ab8025540094f11016f117f11
-0211b80255400b1005016005700580050305b801a7b501f613f666182b4e
-10f4194df45d5d18fd5d71fd5d711a19fd5d5d18e6003f3c103c103c3f3c
-103c103c103c103c1217390111123939123939113939123939874d2e2b87
-7dc4872e182b877dc4872e182b877dc4872e182b877dc42b2b2b870e10c4
-070e103c070e103c870e10c4870e10c44bb01f5358b40d200c2002bcffe0
-0001ffe0000effd0b400300f2012b8ffe0013838383838383838594bb034
-5358b90008ffd0b10730013838594bb021534bb033515a58b90008ffe0b1
-0720013838594bb012534bb01e515a58b9000effd0b60f200d200c2008b8
-ffd0b2073012b8ffe0b2003802baffe00001ffe001383838383838383838
-38594bb012534bb017515a58b90011ffe0b30a2004200038383859593130
-01435c58b9000effd4b61239002c123900b8ffd4b113392b2b2b592b2b2b
-2b2b5d71722b2b2b002b2b2b715d015d5921013313173637133313173713
-330123032703014bfebbbaa93f0433a9b99f353db6affeb4bba929d70426
-fd9be411ca026efd98cbcd0266fbda027cb5fccf>ArialMT AddT42Char 
-2 0 0 <00020100000005000500000300070000211121112521112101000400fc20
-03c0fc400500fb002004c000>ArialMT AddT42Char 
-ArialMT /CharStrings get begin
-/space 3 def
-/C 38 def
-/E 40 def
-/I 44 def
-/a 68 def
-/c 70 def
-/d 71 def
-/e 72 def
-/h 75 def
-/i 76 def
-/l 79 def
-/m 80 def
-/n 81 def
-/o 82 def
-/r 85 def
-/s 86 def
-/t 87 def
-/u 88 def
-/v 89 def
-/w 90 def
-end
-ArialMT /Encoding get
-dup 32 /space put
-dup 67 /C put
-dup 69 /E put
-dup 73 /I put
-dup 97 /a put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 104 /h put
-dup 105 /i put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-pop
-end
-%ADOEndSubsetFont
-/KUDFNT+ArialMT /ArialMT findfont ct_VMDictPut
-/KUDFNT+ArialMT*1 
-[32{/.notdef}rp /space 34{/.notdef}rp /C /.notdef /E 3{/.notdef}rp /I 
-23{/.notdef}rp /a /.notdef /c /d /e 2{/.notdef}rp /h 
-/i 2{/.notdef}rp /l /m /n /o 2{/.notdef}rp /r 
-/s /t /u /v /w 136{/.notdef}rp]
-KUDFNT+ArialMT nf
-KUDFNT+ArialMT*1 [9 0 0 -9 0 0 ]msf
-395.375 473.01 mo
-(Each thread could)
-[6.00305 5.04001 4.56302 5.03998 2.27701 2.51999 5.04001 2.99692 5.04001 5.04001 5.03998 2.27701 
-4.56302 5.03998 5.04001 2.043 0 ]xsh
-397.751 483.756 mo
-(have access to a)
-[5.04001 5.03998 4.43701 5.04001 2.27698 5.04001 4.56299 4.56302 5.03998 4.56302 4.56299 2.16 
-2.51999 5.04001 2.51999 0 ]xsh
-392.252 494.259 mo
-(common ICC cache)
-[4.56299 5.04001 7.55994 7.55994 5.03998 5.04001 2.043 2.51999 6.48001 6.48001 2.51999 4.56299 
-5.04001 4.56299 5.04001 0 ]xsh
-398.498 504.762 mo
-(or create its own)
-[5.04001 2.99692 2.27701 4.56299 2.99695 5.03998 5.04001 2.51999 5.04001 2.40298 2.04303 2.51999 
-4.56299 2.27701 5.03998 6.36301 0 ]xsh
-/KUDFNT+ArialMT*1 uf
-/KUDFNT+ArialMT uf
-/ArialMT uf
-%ADOBeginSubsetFont: Arial-BoldMT Initial
-ct_T42Dict begin
--0.625 -0.375 2 1.008
- 256 array 0 1 255 {1 index exch /.notdef put} for  /Arial-BoldMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f32115d5e9f000000cc000000606376
-7420fb3ea3da0000012c0000075a6670676d08e8ba2800000888000005d7
-676c79664fc39cd400009edc0007c44c68656164d65e5fe200000e600000
-003668686561127e15fe00000e9800000024686d7478d62bc37500000ebc
-000034d46c6f636132ab8c4800004390000034d86d61787014dc04760000
-7868000000206e616d65ae0c9081000078880000147d70726570f14ae516
-00008d08000011d267646972000000000000000000000000000303d402bc
-00050008059a05330000011b059a0533000003d1006602120805020b0704
-020202020204e0002affc00078430000000900000000544d432000200020
-fffc05d3fe510133073e01b2400001ffffff0000042605ba000000200004
-05ba001c05ba001c05a7001c0426001c0000ffe40000ffe40000ffe4fe69
-ffe405ba001cfe69ffe402ea0000011d0000011d000000000000000000b2
-00ac00d70128012000b301fa001700f8011901310049000400f7000300af
-00fd00950014005400960112002400160055004901040119012b008c019b
-ff76ffe9003d009200a2ffb70182ffaa0016008f00c600f8001c00de0401
-0037004e00550055006500e903e50059ff9a00080087000b003b00520116
-006100d600d600f500000093009400be017cfff80004001400820092003c
-00410041ffc1fffc002a008c049005d809b5009100bb0106ff63ff69001e
-0022008a022bffd6ffdf0026005900a300ac0104012b01c004480021006b
-00850098011903c6006b009500a400fe010c025d034305bf000000490056
-006e0077008a00aa00ca0112015005d805f0ff7bffe70006001300280061
-006900e90135014d02a5040cff3effda005b00b900c801190119011901c0
-045b04a7055bfe3fff9dffc2001500b7010a01bc01c10532058efd81ffa1
-ffae000c00260031003d004e00560062008300c100c900f100f2027fff7f
-00480053007700c5011d01200126012801d60219027e027e03d3002e0041
-005d006b0075009f00b000b200ba00bb00bd00d600db00e000e50114011b
-014a0162019101f2020c026402cf039b03b403d4040104a9001600230025
-002a007400a500b600cc00cd00cf0105012001300150016a016f0197019d
-01e002b002ec02f70408048304fb04fd0526fee0fefbff4efff50018001a
-004c007a007f009100a300b300b400ce00d500f200f300f6011001380168
-01a101b001e001ec02090222024f0270029602a502ad034e039103c10435
-0442046b04cd04da0586058b076107fefca6fe93feadfed1ffb7ffd10003
-000e00180026004600690081008f00a500bf00d300d500d900dd00e20119
-012b0138013b015a015e016801730188019401ad01c501d101ea01f20200
-020002000222023b0244024f026f0272027e02820293029402a502cf02cf
-02d002da02dd02eb02f5030503220336037103a103b003b803d003e60410
-0426042e0431044f045a04ff053205320547055305a805ab05c205f0063c
-0664067006e80782078408ccfd2afddefe00fe68feb0feb3ffaa00080059
-007a0091009e00a200af00b400bb00ca00cc00ce00d900e000f40114011a
-01210127012b01390146014b014d0157015c01650182018701920198019b
-01a201ae01c501c501d102070222022b024102530261026502840287028d
-02b402b402ba02c902d602d802ed02f503170323032b03310349035a035b
-036e03710374037e03840391039103aa03cf03d303e703e803ed04080417
-041e0475047a049904a704b404d1054c056d056d05a205bf05c005d105fc
-05fc0602061a061c062f066a06a806e2070607360750078907d407f30870
-011c012a011a01200000000000000000000000000219000b001e02aa0214
-047f01ed0000001d0104000f0091002b01880153011201f3003f03fe0168
-010e047f01ed036e03150219041300000000064004b00000027401bb0035
-01c5007f06020301000004e000b201dc02e004c3023d00d50160011904a7
-036e05ca022100ab0426009002bc02bb014200b4023c0256029c030001e5
-01a800e5006b00780094016b017300ab01ed013a017d0137017f00d40216
-03530184003cffa202040109014901f0006e031500810464005e00000000
-0000000000000000000000000000000000000000000000000000013900dc
-00e9fe9e040d047c012b00b80096005900ac00df01a900fa0105ffec0017
-0003005500610004008c00a3008500280120005d00d6007f012601190104
-016c06cf00b4010600000737063e047a00f000f900e905ba042604420000
-ffe7fe69049e04e3ff37ff2d01200105012000a800740068004700f200e5
-00d900bd00a800680047005c0048000a0028003200410050005a0064007d
-00870091ffb0ff9cff83ff79ff6f00cb012000fa012c01fa01a000d500b8
-005c003c00c800c8008f00d9018b00b30047000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000fe6400c000ea01180125013203b003ed0576
-059005aa05b405be05cd063100780084009b00cc00e200f4010a01200163
-00d100ea00f7010801420019002c00340041003800480058006c025903bd
-0043011a007000d30028003700420050005a0064007300780082008c009c
-00a500bd00ce00f00110015c00be00d801020117012c016300ea01080041
-004b0055005f007300a60109018301b300410064001e002a00eb00fa010e
-01380274002c00400082009600b600c000cc00dc00e600f000ff010a0120
-012c013b01440156016300f70057006401100136005001b10000ffb60039
-004e004403cc00e5002401100042012201a400f0006000e0000e001d0039
-05e30102002cfe4eff38026903bd011600ff000e00a00054001b003d0171
-0041000f005000fd0015014f0035fe52002c00d3010304b001d200b600c0
-00990265ff870377fe6c00cb00a9005c0040047607440000404154403f3e
-3d3c3b3a3938373534333231302f2e2d2c2b2a292827262524232221201f
-1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201
-002c4523466020b02660b004262348482d2c452346236120b02661b00426
-2348482d2c45234660b0206120b04660b004262348482d2c4523462361b0
-206020b02661b02061b004262348482d2c45234660b0406120b06660b004
-262348482d2c4523462361b0406020b02661b04061b004262348482d2c01
-10203c003c2d2c20452320b0cd442320b8015a51582320b08d44235920b0
-ed51582320b04d44235920b09051582320b00d44235921212d2c20204518
-684420b001602045b04676688a4560442d2c01b10b0a432343650a2d2c00
-b10a0b4323430b2d2c00b0172370b101173e01b0172370b10217453ab102
-00080d2d2c45b01a234445b01923442d2c2045b00325456164b050515845
-441b2121592d2cb00143632362b0002342b00f2b2d2c2045b0004360442d
-2c01b00643b00743650a2d2c2069b04061b0008b20b12cc08a8cb8100062
-602b0c642364615c58b00361592d2c45b0112bb0172344b0177ae4182d2c
-45b0112bb01723442d2cb01243588745b0112bb0172344b0177ae41b038a
-45186920b01723448a8a8720b0c05158b0112bb0172344b0177ae41b21b0
-177ae45959182d2c2d2cb0022546608a46b040618c482d2c4b53205c58b0
-02855958b00185592d2c20b0032545b019234445b01a23444565234520b0
-0325606a20b009234223688a6a606120b01a8ab000527921b21a1a40b9ff
-e0001a45208a54582321b03f1b235961441cb114008a5279b31940201945
-208a54582321b03f1b235961442d2cb110114323430b2d2cb10e0f432343
-0b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2cb10e0f432343650b
-2d2cb11011432343650b2d2c4b525845441b2121592d2c0120b003252349
-b04060b0206320b000525823b002253823b002256538008a63381b212121
-212159012d2c4bb06451584569b00943608a103a1b212121592d2c01b005
-251023208af500b0016023edec2d2c01b005251023208af500b0016123ed
-ec2d2c01b0062510f500edec2d2c20b001600110203c003c2d2c20b00161
-0110203c003c2d2cb02b2bb02a2a2d2c00b00743b006430b2d2c3eb02a2a
-2d2c352d2c76b8023623701020b802364520b0005058b00161593a2f182d
-2c21210c6423648bb84000622d2c21b08051580c6423648bb82000621bb2
-00402f2b59b002602d2c21b0c051580c6423648bb81555621bb200802f2b
-59b002602d2c0c6423648bb84000626023212d2cb4000100000015b00826
-b00826b00826b008260f10161345683ab001162d2cb4000100000015b008
-26b00826b00826b008260f1016134568653ab001162d2c4b53234b515a58
-20458a60441b2121592d2c4b545820458a60441b2121592d2c4b53234b51
-5a58381b2121592d2c4b5458381b2121592d2cb0134358031b02592d2cb0
-134358021b03592d2c4b54b012435c5a58381b2121592d2cb012435c580c
-b00425b00425060c6423646164b0035158b00425b00425012046b0106048
-2046b0106048590a21211b2121592d2cb012435c580cb00425b00425060c
-6423646164b807085158b00425b00425012046b8fff060482046b8fff060
-48590a21211b2121592d2c4b53234b515a58b03a2b1b2121592d2c4b5323
-4b515a58b03b2b1b2121592d2c4b53234b515ab012435c5a58381b212159
-2d2c0c8a034b54b00426024b545a8a8a0ab012435c5a58381b2121592d2c
-462346608a8a462320468a608a61b8ff8062232010238ab902a702a78a70
-456020b0005058b00161b8ffba8b1bb0468c59b0106068013a2d2cb10200
-42b123018851b1400188535a58b910000020885458b202010243604259b1
-2401885158b920000040885458b202020243604259b12401885458b20220
-02436042004b014b5258b2020802436042591bb940000080885458b20204
-0243604259b94000008063b80100885458b202080243604259b940000100
-63b80200885458b2021002436042595959592d00000100000005028f9f18
-7df95f0f3cf50819080000000000a2e33c1d00000000c14fd725fafafcfd
-1000081500010009000100010000000000010000073efe4e00431000fafa
-fa7a1000000100000000000000000000000000000d350600010000000000
-023900000239000002aa00b803cb00700473001204730046071d005905c7
-005a01e7005c02aa006b02aa0043031d001c04ac00550239007502aa0073
-023900930239fffd04730056047300a2047300330473004d047300260473
-005b0473005704730057047300530473004102aa00c902aa00aa04ac005f
-04ac005504ac005f04e3006a07cd003d05c7000005c7009605c7006105c7
-00940556009504e300970639006205c700960239008c0473002305c70099
-04e3009d06aa009105c7009806390059055600950639005905c700960556
-004a04e3002c05c700930556ffff078d0007055600000556fffd04e30016
-02aa00920239fffd02aa002604ac00730473ffed02aa002a0473004904e3
-00870473005504e300540473004102aa001804e3005404e3009202390093
-0239ffa20473008902390093071d007e04e3009104e3005204e3008b04e3
-005b031d00870473003002aa001f04e3008d0473000b063900090473000c
-0473000e04000022031d003c023d00b0031d002d04ac004305c7000005c7
-000005c700610556009505c700980639005905c700930473004904730049
-047300490473004904730049047300490473005504730041047300410473
-004104730041023900920239ffe90239ffcd0239ffd004e3009104e30052
-04e3005204e3005204e3005204e3005204e3008d04e3008d04e3008d04e3
-008d0473004403330056047300540473000d0473003b02cd00420473fffe
-04e3008b05e5fff705e5fff7080000d802aa00bb02aa0005046400310800
-ffaa0639003f05b40098046400320464003c0464003c04730001049c006f
-03f4002c05b4007a069600a1046400000231000002f6002502ec001a0625
-0037071d005804e3005704e3006502aa00c304ac0055046400540473ffec
-0464001f04e5001a047300600473006a080000c905c7000005c700000639
-005908000048078d00580473fffc08000000040000840400006902390098
-023900720464003103f4002f0473000e0556fff70156fea90473ffe002aa
-004b02aa004b04e3001f04e3001f04730044023900930239007504000071
-0800000105c700000556009505c7000005560095055600950239006a0239
-ffae0239ffbf0239ffc106390059063900590639005905c7009305c70093
-05c700930239009302aa000302aafff302aa001302aa001a02aa00cd02aa
-009102aa002602aa006002aa003902aa000304e3000a0239000a0556004a
-0473003004e3001604000022023d00b005c7fffd04e300530556fff70473
-000e0556009504e3008b04ac005504ac006d02aa005b02aa001902aa0028
-06ac005c06ac005c06ac0028047300000639006204e300540239008c0556
-004a0473003005c700610473005505c700610473005504e30054046bffed
-02aa00c805c700000473004905c700000473004905c7009405c0005105c7
-fffd0556009504730041055600950473004104e3009d0239007904e3009d
-0315009504e3009a03d5009005c7009804e3009105c7009804e300910639
-005904e3005205c70096031d008705c70096031d00500556004a04730030
-04e3002c02aa001f04e3002c03d5001e05c7009304e3008d05c7009304e3
-008d04e300160400002204e300160400002204cf009a0639005606910056
-04eb004e04da004e03cc004e0579004e0392003005b9004e046bffed04d5
-00b8032b004f08c000290800004f040000990800004f040000990800004f
-040000980400009807d5016a05c7008f04ab005504d5009d04ac005504d5
-022204d5010505abffe9050001c905ab027e05abffe905ab027e05abffe9
-05ab027e05abffe905abffe905abffe905abffe905abffe905ab01c005ab
-027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab01c0
-05ab01c005abffe905abffe905abffe905ab027e05ab01c005ab01c005ab
-ffe905abffe905abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905ab02d605ab006605abffea05d5ffff04d500920800000007eb0130
-07eb012007eb013007eb012004d500b204d5008004d5002a082b0198086b
-01b807550010060000f40600006f0440003a0540003704c0003f04150040
-04000025060000550647008c0473009005abffc701eb008d03d500860715
-002303e9001804d5009202d6005c02d6005c04d500b202d6004d05c70000
-0473004905c700610473005505c700610473005505560095047300410556
-00950473004105560095047300410639006204e300540639006204e30054
-0639006204e3005405c7009604e3009205c7000504e300190239ffba0239
-ffbb0239ffda0239ffda0239ffe10239ffe2023900480239004704730023
-0239ffa205c70099047300890473008d04e3009d0239ffed05c7009804e3
-009105c9009c04e3008e0639005904e300520639005904e3005205c70096
-031d002a0556004a0473003004e3002c02aa000705c7009304e3008d05c7
-009304e3008d05c7009304e3008d05c7009304e3008d078d000706390009
-0556fffd0473000e0239008d05c70000047300490800ffaa071d00580639
-003f04e3005702aa00c9078d000706390009078d000706390009078d0007
-063900090556fffd0473000e0239009502aaffd70473000d04cd005a06ac
-005c06ac002906ac003006ac002f02aa00bc02aa002602aa00bb03b8fff4
-05c7ffe806d3ffbb073fffbb03caffbb0699ffa6076bffc806b4ff9c0239
-ff2905c7000005c7009605c000000556009504e3001605c700960239008c
-05c700990556000006aa009105c70098052600660639005905c7009a0556
-009504cd005a04e3002c0556fffd0556000006790056066a00620239ffcc
-0556ffff04eb004e039c004e04e3008e0239008204a8006c04e200900473
-000f03af004e04e3008e0453004e023900930476008e0473000f04e50090
-0473000b0390004e04e3005204f300760429004e04a80076049b00110607
-007606c2004e0239ffcd04a8007604e3004e04a8007606c2004e055a0097
-0715002f048900a405b100580556004a0239008c0235ffca0473002308c0
-001a0880009d0700003704e2009a04fa000005c0009905c7000005c0009b
-05c70096048900a405b3fffa05560095073b00170503002c05c0009905c0
-009904e2009a059d002006aa009105c700960639005905c0009905560095
-05c7006104e3002c04fa000006d400590556000005d8009a059f007d080a
-009a0827009a06f5001a07d5009d05c0009b05b100570840009605c00004
-0473004904f1005c04eb0096035500880514fff90473004105acffff03fa
-001804eb008c04eb008c040100880515001905eb009b04d5008804e30052
-04d5008804e3008b0473005503eb00150473000e070000540473000c04eb
-008904a5007206ab008c06c0008d05d5002806d5009504eb0099046b0038
-06d5009104abfffb0473004504e3000003550088046b0051047300300239
-00930240ffd00239ffa207c000180740008c04e300000401008804730012
-04d5008803e50096039300880800004108eb00a306200030000001010000
-001e0000003100000031000001010000007f0000007e0000008c0000008c
-000001010000001000000101000001210393007d0000008c026500c80000
-03020000ff0102aa00c904a90059049b004103a7000a0466003204ea0082
-022f0087034e005a04ed00870503007d022f0087042c002803ed004b03f8
-004104e30087050a0037022f00870316004b04e800500459000a04c00064
-04b2006403ff000a0418000a04950082042c002805b8005a0563002d045e
-0087045e0087045e00870236005004090050068b0087022fffac042c0028
-042c002803f8ff1603f8ff160479003205b8005a05b8005a05b8005a05b8
-005a04a9005904a9005904a90059049b004103a2000a0466003204ea0082
-02950000038100000503007d02950000042c002803ed004b03f80041050a
-00370316004b04e8005004c0006404b200640418000a04950082042c0028
-05b8005a0563002d022f0087049b004103ed004b04b2006404db00410000
-ffdc0000ff250000ffdc0000fe51028d00ab028d00a002da004303c0007e
-0196ffba0000004600000046000000460000004600000048000000460000
-004600000046047e0188047e0150047e0104047e009e047e012d047e00ea
-047e00d5047e009c047e00bc047e00ee04350085028d00c1043500b30600
-01000600010002be005806000100047e00a5047e00bd047e00de06000100
-060001000600010006000100060001000000004606000100060001000600
-0100060001000600010006000100060001000600010004e6ffba06000100
-06000100060001000532003905320039022cffba022cffba060001000600
-01000600010006000100049e0034047800300430ffba0430ffba0376000a
-0376000a060e00290708002902e2ffba0456ffba060e00290708002902e2
-ffba0456ffba05280097046f000a03520003060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100000000300000004600000046
-000000400000004606000100060001000000ffdc0000fe510000ff160000
-ff160000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ffdc0000ff160000ffdc0000ff200000ffdc0473002d080000000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d007f028d00670600
-010005a0002e03c0007e01e800000207ffc301bc005e01e0fffa039c0006
-039c000601bc005e01e0001a05280097049e0011022cffba022cffba01bc
-008801e0001a0532003905320039022cffba022cffba02be003603520003
-0532003905320039022cffba022cffba0532003c0532003c022cffba022c
-ffba049e0034047800300430ffba0430ffba049e0034047800300430ffba
-0430ffba049e0034047800300430ffba0430ffba02be006902be006902be
-006902be00690376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba073200400732004004deffba04deffba088000400880
-0040062cffba062cffba0880004008800040062cffba062cffba0430ffba
-0430ffba0430ffba0430ffba0430ffba0430ffba0430ffba0430ffba0454
-003403c000460454ffba02e2ffba0454003403c000460454ffba02e2ffba
-0610002f0610002f0270ffba0298ffba04e6002704e600270270ffba0298
-ffba045400290454002902e2ffba02e2ffba039c0023039c002301e0ffba
-01e0ffba02e2002102e200210352ffba0352ffba0454003e0454003e022c
-ffba022cffba02be00580352000303c0ffba039cffba039c0006039c0006
-05280097046f000a05280097049e0011022cffba022cffba0454000004c4
-000003e400220454001a03e400220454001a03e400220454001a06000100
-060001000000004600000046060001000600010006000100000000460000
-004606000100060001000000004800000046060001000600010006000100
-000000460000004600000046000000460000004000000030060001000000
-004600000046060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100028d00ca028d00c7028d00c6060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010002be0069
-0100ffba0800ffba1000ffbb06d3005905b0005206a3009305cb008d0000
-fd880000fbc10000fc5f0000fe310000fcad0000fd550000fe260000fdf1
-0000fd180000fc690000fd950000fbe00000fc700000fed40000fecd0000
-fea0041b007806ac005c06ac00190000fe450000fd550000fda60000fc5f
-0000fe250000fd180000fbe00000fafa0000fb360000fc700000fb870000
-fb9b0000fcce0000fc540000fbc30000fc940000fbf50000fdb00000fe59
-0000fd7e0000fc820000fd340000fe500000fe460000fcd10000fd3e0000
-fd020000fc3a0000fce90000fc260000fc070000fc2f0000fb9e0000fb76
-0239009305c700000473004905c700000473004905c700000473004905c7
-00000473004905c700000473004905c700000473004905c7000004730049
-05c700000473004905c700000473004905c700000473004905c700000473
-004905c70000047300490556009504730041055600950473004105560095
-047300410556009504730041055600950473004105560095047300410556
-00950473004105560095047300410239006a0239005d0239008c02390093
-0639005904e300520639005904e300520639005904e300520639005904e3
-00520639005904e300520639005904e300520639005904e3005206d30059
-05b0005206d3005905b0005206d3005905b0005206d3005905b0005206d3
-005905b0005205c7009304e3008d05c7009304e3008d06a3009305cb008d
-06a3009305cb008d06a3009305cb008d06a3009305cb008d06a3009305cb
-008d0556fffd0473000e0556fffd0473000e0556fffd0473000e05c70000
-047300490239ffca0239ffca0639005904e3005205c7009304e3008d05c7
-009304e3008d05c7009304e3008d05c7009304e3008d05c7009304e3008d
-0000fef90000fef90000fef40000feef0489fffd03550007073b001705ac
-ffff04e2009a0401008804e2009a0401008805c7009604d5008804730001
-047300120473000104730012055600000473000c059f007d04a50072059f
-009c04e3009205cf00590473004c0639005604e3005205320039022cffba
-0270ffba0298ffba04e60027022c0065022c0016022c0016022c0011022c
-0043022cffd20000fef00000000f0000fff502aa009002aa009000000000
-0000005e0000005e0000ffcb01bc000f01e0ffbf01bcfff501e0ffcd01bc
-001d01e0000901bc008801e0001a039c0006039c0006039c0006039c0006
-05280097046f000a0532003905320039022cffba022cffba053200390532
-0039022cffba022cffba0532003905320039022cffba022cffba05320039
-05320039022cffba022cffba0532003905320039022cffba022cffba0532
-003905320039022cffba022cffba0532003905320039022cffba022cffba
-049e0034047800300430ffba0430ffba049e0034047800300430ffba0430
-ffba049e0034047800300430ffba0430ffba049e0034047800300430ffba
-0430ffba049e0034047800300430ffba0430ffba049e0034047800300430
-ffba0430ffba02be004f02be004f02be006902be006902be006902be0069
-02be004f02be004f02be006602be006602be006902be006902be006902be
-006902be002f02be002f02be002202be00220376000a0376000a0376000a
-0376000a0376000a0376000a0376000a0376000a0376000a0376000a0376
-000a0376000a0376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba073200400732004004deffba04deffba073200400732
-004004deffba04deffba0880004008800040062cffba062cffba08800040
-08800040062cffba062cffba0430ffba0430ffba0454003403c000460454
-ffba02e2ffba0610002f0610002f0610002f0270ffba0298ffba0610002f
-0610002f0270ffba0298ffba0610002f0610002f0270ffba0298ffba0610
-002f0610002f0270ffba0298ffba0610002f0610002f0270ffba0298ffba
-04e6002704e6002704e6002704e60027093e0032093e00320740ffba0740
-ffba060e00290708002902e2ffba0456ffba045400290454002902e2ffba
-02e2ffba045400290454002902e2ffba02e2ffba045400290454002902e2
-ffba02e2ffba060e00290708002902e2ffba0456ffba060e002907080029
-02e2ffba0456ffba060e00290708002902e2ffba0456ffba060e00290708
-002902e2ffba0456ffba060e00290708002902e2ffba0456ffba039c0023
-039c002301e0ffba01e0ffba039c0023039c002301e0ffb101e0ffb1039c
-0023039c002301e0ffba01e0ffba039c0023039c002301e0ffba01e0ffba
-0454003e0454003e022cffba022cffba0454003e0454003e0454003e0454
-003e0454003e0454003e022cffba022cffba0454003e0454003e049e0034
-047800300430ffba0430ffba02be005803520003031a001a031a001a031a
-001a039c0006039c0006039c0006039c0006039c0006039c0006039c0006
-039c0006039c0006039c0006039c0006039c0006039c0006039c0006039c
-0006039c000605280042046fffd905280097046f000a022cffba022cffba
-039c0006039c000605280097046f000a022cffba022cffba05280097046f
-000a067f0044067f0045067f0044067f004501a800280000fe290000fe8c
-0000ff250000ff230000fefa0000ff7a0000fe5908fc003208ad00320000
-ffb50000ffb60000fef00000ff590000fe590000ff8c01b4000002f70000
-0000fe850000ff0704cd00320000ff580000ff580000ff59073200400732
-004004deffba04deffba0880004008800040062cffba062cffba04540034
-03c000460454ffba02e2ffba03c0007e02e2002102be0058022cffba0290
-ffba01f4002f01f4003b01f4001201f400b101f4006d060e002907080029
-022f00870000fec803500000045e008703e4fff50454fff503e400220454
-001a03e400220454001a03e400220454001a03e400220454001a03e40022
-0454001a03e400220454001a047e0072047e00bd03e4000f0454000f04e3
-001b06b1001e05c0009b04e3008705c0000a04e3000a05c7006905c70061
-0473005505c7fffd06b3001e05c0005c04e3005404da004e055600660503
-006f04e3ffac063900620518000207720092023900930239000705c70099
-047300890239001b0473000f07ef009605c7ffad04e3008e063900560718
-005905f300550641001e04e3008b05560095055600640473006304cd005a
-02e1001e02aa001f04e3001802aa001f04e3002d066a006205c700930629
-00000473000e04e300160400002204e3003a04e300590436002a04360039
-047300330473005b03fa001e04a2001f04e3008b023d00b003fb00b004ad
-005602aa00b80aaa009409c7009408e300540956009d071c009d04720093
-0a3a009808000098071c00910473004c05c70000047300490000fefe05c7
-0000047300490800ffaa071d00580639006204e300240639006204e30054
-05c70099047300890639005904e300520639005904e3005204e3003a0436
-00220239ffa20aaa009409c7009408e300540639006204e3005408430096
-0552009505c7009804e3009105c700000473004905c70000047300490556
-00950473004105560095047300410239ff370239ff2d0239fff40239ffe6
-0639005904e300520639005904e3005205c70096031dffcd05c70096031d
-008005c7009304e3006705c7009304e3008d0556004a0473003004e3002c
-02aa001f049e002e0429004905c7009604e30092059f009c050c0052050c
-005204e300160400002205c7000004730049055600950473004106390059
-04e300520000fefd0639005904e300520639005904e300520639005904e3
-00520556fffd0473000e0473004504e3005404e3008204e3008704730034
-0473001404e3005404e300540473004c0641004c03fa004f03fa00180587
-0018048a005202aaffc404e3005404e3005404b000520473000f04ce000f
-04e3008a04e3009204e300920239001b023900930239009302a8000002d9
-00140239009304d40093071d0085071d0085071d007e04e3ffa604e30091
-04eb008c04e3005206ab005206c2004e05ff0052031dffe6031dffe6031d
-ffe6031d0087031d0087031d0087031dffe604ab008a04ab008a04730030
-02aaffc402aaffc402aaff9b0451001e02aa001902aa001f04e3001b04f8
-004904a8009104730012063900090473000f0491000f0400002205700022
-0436002204360022047300420473005504730042047300550639005904eb
-0096048a004f04b0005204d5008803ab001e04730014039e008804e3005b
-0473004204730055083f00540789005409af00540682001f0446001f0698
-001f06f4001806350093058a00930445001e0482008802f1003202f10032
-018effe202040032020400000204000003000032042f000002e2000001e7
-005c03cb007002390098023900750239009402aa00f302aa00f303000032
-0300003204ac005f04ac005f04ac002a04ac002a02aa012102aa00bb02aa
-002a02aa012102aa001302aa002a02aa00bb02aa00ca02aa00ca02aa00f3
-02aa00f302aa00a602aa00a602aa00a602aa001302aaffe102aafffb02ed
-0000012100320302003202ee000003000032031000960310009603100096
-031000960310009602aa006202aa006202aa000302aa001d040000690457
-009604570096045700960457009604570043045700430457004304570043
-04570043031000430457002f0457002f0457002f0457002f0457002f0310
-002f04570025045700250457002504570025045700250310002f0457001a
-0457001a0457001a0457001a0457001a0310001a04570042045700420457
-004204570042045700420310004204570096045700960457009604570096
-0457004204570042045700420457004204570042031000420457002f0457
-002f0457002f0457002f0457002f0310002f0457002f0457002f0457002f
-0457002f0457002f0310002f045700260457002604570026045700260457
-002603100026045700420457004204570042045700420457004203100042
-045700960457009604570096045700960457004204570042045700420457
-004204570042031000420457002604570026045700260457002604570026
-031000260457002304570023045700230457002304570023031000230457
-002f0457002f0457002f0457002f0457002f0310002f0457004b0457004b
-0457004b0457004b0457004b0310004b0457009604570096045700960457
-00960457004204570042045700420457004204570042031000420457001a
-0457001a0457001a0457001a0457001a0310001a04570024045700240457
-00240457002404570024031000240457002f0457002f0457002f0457002f
-0457002f0310002f0457004e0457004e0457004e0457004e0457004e0310
-004e045700960457009604570096045700960000feaf0000febf0000fdb5
-0000fec80000ff780000feb10000ff3d0000fe6f0000feae0000ffce0000
-ff660000fe6f0000fec80000fec80000ff680000ff680000ff6800000000
-0000ff1f0000ff1f0000ff440000ff5f0000fe870000ffec0000ff9c0000
-ff510000ff510000ff510000febf0000ff15000000000000feb10000ff3d
-0000ff6b0000fef20000ff470000ffce0000fe870000febb0000feae0000
-feae0000fec80000fec80000fea60000febf0000fdb70000fdb90000fea6
-0000febf0000fdb50000fe1f0000fee20000ff9c0000fe870000ff440000
-feba0000ff230000ff9a0000fdb90000fe3b000000000000fea70000ff68
-0000fe170000ff740000fe870000fdb90000ff660000ff440000fea70000
-fea70000fea70000ff030000ff520000fd1f0000ff530000ff530000ff53
-0000feb10000feb00000ffa10000fe8c0000feb80000feaf0000fea20000
-feba0000fdf40000ff190000ff2d0000fe8c0000fe8802aa00bb02aa002a
-02aa00c804e2009004a8007606290000080200000629000005ff005206c2
-004e056900140639005904e3005205c700610473005504e30097039e0088
-06030000043c001d066f000a04e2000a07ef0096071d0085059f007d04e3
-008a059f009c04d7000a05560064055600640524001404d4000a05e10055
-04a0004b040e0014038400280569001404f1005c047300550239ffa20639
-005603d4005103d400510556009505c000990473004104eb008c0a3d0059
-063a001406f4001a059f001b07ce008c065e0093055600000473000b0768
-008c066700930679005606070076089e008c07d800930503004603fa0043
-06790056060700760639005604e300520685ffff052c000b0685ffff052c
-000b0b3a005909bd005206840055051a004b0a3d0059073500550000fe37
-0a3d0059063a001405c700610473005504ac000f0000fea60000feb10000
-feaa0000fead0000fc2b0000fc4c05c0009904eb008c05c0001104eb001b
-0556009504e3008b059f009c04c900880503002c03fa001804e200110401
-000d0617001a04fc00280709009605b6008809020099075f008805c70061
-049f005505c700610473005504e3002d03eb001506d2002c05830015059f
-007d04a5007206da000a056d000a06da000a056d000a0239008c073b0017
-05acffff059d009a04c80088059d00200515001905c7009604d5008805c7
-009604d50088059f007d04a5007206aa009105eb009b02aa001a05c70000
-0473004905c70000047300490800ffaa071d0058055600950473004105cf
-00590473004c073b001705acffff0503002c03fa00180503002c04360022
-05c0009904eb008c05c0009904eb008c0639005904e300520639005604e3
-005205b10057046b003804fa00000473000e04fa00000473000e04fa0000
-0473000e059f007d04a5007207d5009d06d5009505c0005e04e30054083e
-005e077a005407ad004606c4004305430046044a0043081a002007a50019
-08430096076600880639006204b000520620002d059b00150000ff430000
-fec90000ff770000ffb00000ff470000ff560000ff740000fed70000feac
-000000000000ff520000ff56000000000000feac0000fd9a000000000000
-ff6a0000ff7c0000ff690000ff560000feac0000ff7f0000ff560000fdef
-0000ff430000ff690000ff7c000000000000fdae0000ff8c000001020000
-feef0000feef0000fefd0000fef90000ff530000fef80000fef905c70000
-0473004905c7009604e3008705c7009604e3008705c7009604e3008705c7
-00610473005505c7009404e3005405c7009404e3005405c7009404e30054
-05c7009404e3005405c7009404e300540556009504730041055600950473
-004105560095047300410556009504730041055600950473004104e30097
-02aa00180639006204e3005405c7009604e3009205c7009604e3009205c7
-009604e3009205c7004e04e3003b05c7009604e300920239ffd20239ffd2
-0239001b0239ffce05c700990473008905c700990473008905c700990473
-008904e3009d0239009304e3009d0239ffeb04e3009d0239ffdd04e3009d
-0239ffcb06aa0091071d007e06aa0091071d007e06aa0091071d007e05c7
-009804e3009105c7009804e3009105c7009804e3009105c7009804e30091
-0639005904e300520639005904e300520639005904e300520639005904e3
-00520556009504e3008b0556009504e3008b05c70096031d008705c70096
-031d008705c70096031d008705c70096031d00590556004a047300300556
-004a047300300556004a047300300556004a047300300556004a04730030
-04e3002c02aa001f04e3002c02aa001f04e3002c02aa001f04e3002c02aa
-001f05c7009304e3008d05c7009304e3008d05c7009304e3008d05c70093
-04e3008d05c7009304e3008d0556ffff0473000b0556ffff0473000b078d
-000706390009078d000706390009055600000473000c055600000473000c
-0556fffd0473000e04e300160400002204e300160400002204e300160400
-002204e3009202aaffde063900090473000e047300490239008d04eb004e
-04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e05c7
-000005c7000006f3fff206f3000006f3fff206f3000006f3004306f30043
-03cc004e03cc004e03cc004e03cc004e03cc004e03cc004e061efff2061e
-000007aefff207ae000007aefff207ae000004e3008e04e3008e04e3008e
-04e3008e04e3008e04e3008e04e3008e04e3008e068ffff2068f0000081f
-fff2081f0000081ffff2081f0000081f0014081f00140239009002390090
-0239ffb60239ffc40239ffde0239ffec0239ffb30239ffc00301fff20301
-00000491fff2049100000491fff204910000049100140491001404e30052
-04e3005204e3005204e3005204e3005204e30052069dfff2069d00000855
-fff20855000007c9fff207c9000004a8007604a8007604a8007604a80076
-04a8007604a8007604a8007604a800760682000007fe00000862000007ae
-fff306c2004e06c2004e06c2004e06c2004e06c2004e06c2004e06c2004e
-06c2004e06cefff206ce00000886fff20886000007fafff207fa000007fa
-fff307fafff304eb004e04eb004e03cc004e03cc004e04e3008e04e3008e
-0239ffe70239008d04e3005204e3005204a8007604a8007606c2004e06c2
-004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e
-04eb004e05c7000005c7000006f3fff206f3000006f3fff206f3000006f3
-004306f3004304e3008c04e3008c04e3008c04e3008c04e3008c04e3008c
-04e3008c04e3008c068ffff2068f0000081ffff2081f0000081ffff2081f
-0000081ffff3081ffff306c2004e06c2004e06c2004e06c2004e06c2004e
-06c2004e06c2004e06c2004e06cefff206ce00000886fff20886000007fa
-fff207fa000007fafff307fafff304eb004e04eb004e04eb004e04eb004e
-04eb004e04eb004e04eb004e05c7000005c7000005c7ffd105c7ffdd05c7
-000002aa00dc02aa00ca02aa00dc02aafff302aafff304e3008c04e3008c
-04e3008c04e3008e04e3008c06e6000006e60000075700000757000005c7
-009602aafff202aafff202aafff30239ffe50239ffdb0239ffce0239ffce
-0239ffc20239ffbb0239ffe80239ffde03c9000003c9000002aa000002aa
-000002aafff304a8007604a8007604a8007604a8007604f3007604f30076
-04a8007604a800760556fffd0556fffd06e6ffd8074affdd061e000003b8
-fff403b8fff402aa002a06c2004e06c2004e06c2004e06c2004e06c2004e
-0765ffd1069dffdd0796ffd106ceffdd066a006202aa00bb02aa00dc0473
-000a05c7006105c70061071d007e05c7002109cd0096078d000705c70020
-04e3002d08b000140400003004c100660000ff530000ff530000ff530000
-ff530239001b0239ffa2047300000556001206b3005403fe005706ab0091
-040c001f05d6ffe605d6ffe602aa008402aa008402aa00c902aa00c902aa
-009102aa002a02aaffc502aaffc302aafff302aa00c902aa00a902aa00a9
-02aa00a902aa00a9032e001e032e001e02aa003a0000ff730000ff9d0000
-fec80000ff230000ff720000ff720000fee70000ff9d0000ff530000ff53
-0000ff530556009504e3008b04b5000006350000071d006104eb000f0473
-0055049900910499001b0401008c03fa001802390093040f00490476008e
-039e000e05eb009b04eb008c04e300520473003404f1005204f1005204f1
-0021078d00540492004b04e3005304e3005304e9008c04abfffb04abfffb
-03eb001504a8007604e300510624005104e000510473000b063900090400
-002203df002203f2004b04ec0014035500880473001204d5008804e9008c
-060700760515001903e300000591000003a2003203a2000003a300320355
-00320355003204030032037c00320172005502de003203b00032031e0032
-04220032037700320378003204260032037a0032035b003203ac00320377
-0032037b00320514000003050032030500320321003204b6003203210032
-03210032030200320302003202cf003202cf0032032000320121003202ca
-00320484003402f2003203480032030a0032034900320349003203200032
-01bc000a02f20032034200320484003202e90000034c000a031b003202e9
-00000343003203da003203080000012100320204003202f2003202e90000
-031b003202e900000342003203da00320308000005ed00460a9800460613
-00460689ffba0541ffba01e9001e045400100000ff0d0000ff350000fece
-0000feb70000fec90000ffc70000ff4f0000ff9e0000fef002be006902be
-00690376000a0376000a03c0ffba039cffba03c0ffba039cffba05c80039
-05920032061600820519004b05240041060f008705580028068f002d04ac
-00550000fe3b0000fe660000fe680473fffc0400008403d5ffba01e0ffba
-01e0ffb101e0ffba01e0ffba06d0002e0984002304000000080000000400
-00000800000002ab000002000000015500000473000002390000019a0000
-00ab00000000000005e5fff705c7006106aa009105eb009b0760008d07a1
-005407a1005b05c7000005c700610473001404e3001104e3002c04730039
-0400002205290042000001010000ff420000fead0000ff3a0000ff5304f3
-000a05c7006905c7006105c70069048900a4035500880000ff430000ff01
-0000ffac0316007d0000ff370298ffba033d001e0000ff3a0000ff480000
-ff490000ff7e0000ff4f0000ff4a0000fe9e0532003905320039022cffb6
-022cffb60532003c0532003c022cffba022cffba0532003905320039022c
-ffba022cffba0532003905320039022cffba022cffba0532003905320039
-022cffba022cffba0532003905320039022cffba022cffba053200390532
-0039022cffba022cffba049e0034047800300430ffba0430ffba049e0034
-047800300430ffba0430ffba02be004f02be004f02be006902be00690376
-000a0376000a073200400732004004deffba04deffba0454003403c00046
-0454ffba02e2ffba0454003403c000460454ffba02e2ffba0454003403c0
-00460454ffba02e2ffba0610002f0610002f0270ffba0298ffba0610002f
-0610002f0270ffba0298ffba060e00290708002902e2ffba0456ffba060e
-00290708002902e2ffba0456ffba060e00290708002902e2ffba0456ffba
-02e2002102e200210352ffba0352ffba02e2002102e200210352ffba0352
-ffba0454003e0454003e022cffba022cffba0454003e0454003e022cffba
-022cffba0454003e0454003e022cffba022cffba039c0023039c002301e0
-ffba01e0ffba0376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba04e3ffc104e3005402aafff3071dffc104e3ffd504e3
-ffc5031dffc1031dffc10473ffff02aaffda0400002104e3008302f00032
-04dc004e06fb001f0239001b0239001b04e3001404a8001404f8001404e3
-008704e3005402aa0018062500540473008902390070071d007e04e30091
-04e3008b031d00660473003003baffc40473000b0473000c040000220473
-004904e3005404e300540473004103fa004f03fa0018053e005102390093
-0473003402aaffc404e3008d0436002203210032030a0032030a00060348
-003202cf003201f0000a01f000000320003202f100320174000a01210032
-012100320174000a02760000018e00320150003202490032048400340484
-0032035f0000035f003202fa003203480032040300320302003202390000
-01bc000a0340000a035e003202ea003202ea003202e9000002e4003202e4
-003203be0032030a003202e800320000fe920000fe920000ff730000fe9f
-02aa00c903050032030200320348003202ee0000030200320639006205c7
-00000556001e05c7006102aa004104eb004e04eb004e04eb004e04eb004e
-04eb004e04eb004e04eb004e04eb004e0239ffb60239ffb60239ffc40239
-ffc40239ffb60239ffb60239ffc40239ffc404a8007604a8007604a80076
-04a8007604a8007604a8007604a8007604a800760239ffc90239ffc90239
-ffc90239ffc904a8007604a8007604a8007604a8007603e400220454001a
-03df003005c7fffd05c70016055600000556009504730041047300230239
-ffa20633005904e3005b05c70000031d001b0556fffd0473000e04730034
-047300550473003402390093048900110355001b055600000473000c0556
-00000473000c0503006f03fa004f059d0020051500190000fec60000fed4
-0000fec60000fed40000fe5f0000fe5f0000ff720000ff730000fee70800
-00000401005d0473003404e300110239001b04e300060556fffd05c70096
-0473004902aaffcd05c7009604e3009205c700990473008904e300160400
-00220473002804540096037c008805b9004e0000ff530000ffbc0000fefe
-0000fefe0000fea40000fea402390093000000000000006c0000006c0000
-006c0000006c0000011a000001ba00000388000006300000079600000948
-000009a800000a3200000abc00000bf000000c6c00000cdc00000d2a0000
-0d6800000dbe00000ec200000f44000010ea000012420000135c000014ce
-00001602000016be0000185c000019a2000019fc00001a8800001b120000
-1b9400001c2200001d1000001ea40000201e00002186000022c0000023aa
-00002468000025040000264a0000271e000027a60000284400002a0e0000
-2a6a00002cbe00002ebc00002fc4000030940000322e00003392000035f2
-0000368800003768000038a200003ae400003c6000003d5600003ee80000
-3f5c00003fb000004018000040ca000040fe00004162000043700000446c
-000045a800004698000048a4000049a400004b8000004c8000004d220000
-4dfa00004f2600004f920000514600005230000053200000541c0000551e
-000056020000594800005a6800005b5000005ca400005f0a000060e00000
-625e000063ec000065140000657a000066b20000677a000067bc000067fc
-000068380000687e000068c6000069160000695a00006994000069c40000
-69f400006a3600006a7800006aaa00006aee00006b3a00006b8400006bb4
-00006bfa00006c3600006c7600006cb200006cea00006d3a00006d760000
-6db200006de200006e2400006e7400006ebe00006ef600006f3800006f6c
-00006fe40000706a000072160000738200007578000075c20000765c0000
-77aa0000799a00007b4e00007c6800007cca00007d2200007e0200007f34
-000080ac000081d40000829a0000837000008430000085d4000086900000
-877200008850000088b60000894a00008a0e00008b4a00008be200008d22
-00008fc40000914a00009250000092f00000934a0000942a000095d80000
-9744000097ee000098e2000099c800009a3c00009a7400009aba00009af8
-00009c7400009e8a00009ec400009efa00009fc20000a0960000a1060000
-a1240000a1c60000a2a00000a2dc0000a3160000a37c0000a5140000a5b2
-0000a6440000a7a00000a8ca0000a9b40000a9f20000aa020000aa200000
-ac2a0000ac6c0000acba0000acf60000ad360000ad840000adc20000ae00
-0000ae3a0000ae7c0000aeb40000aee40000af1e0000af620000af920000
-afda0000b03c0000b0a80000b1560000b18a0000b1fa0000b2400000b2f6
-0000b3900000b4240000b48c0000b4e80000b5bc0000b6880000b6b80000
-b6e80000b74c0000b7a20000b82a0000b9540000bacc0000bb020000bb32
-0000bc3a0000bd0e0000bd4a0000bee00000bf5e0000c06c0000c1a00000
-c34c0000c4da0000c7220000c7d80000c81c0000c85c0000c88e0000c8d2
-0000c90e0000c9520000c98c0000c9be0000c9f00000cb200000cb560000
-cb800000cbcc0000cc0e0000cc340000cc5a0000cc900000cdce0000cde6
-0000ce0c0000ce320000ce700000cea00000ced00000cf0e0000cfcc0000
-d07e0000d0b20000d0e80000d1240000d1620000d1b00000d1e20000d214
-0000d2500000d28c0000d2c80000d3040000d3360000d3660000d3960000
-d3bc0000d3e00000d41e0000d5920000d5d60000d60e0000d6460000d67c
-0000d6cc0000d70e0000d7540000d7a60000d7f20000d9040000da100000
-daf80000dbe80000dcee0000ddd80000de480000df720000dfc20000dff2
-0000e0ec0000e3200000e3600000e3a00000e3e00000e41e0000e47c0000
-e4da0000e5480000e5680000e6080000e6a20000e6d80000e73c0000e786
-0000e7d00000e7ec0000e8080000e8280000e8480000e8680000e8880000
-e8ae0000e8d40000e8fa0000e9200000e9500000e9780000e9a00000e9cc
-0000e9f80000ea2c0000ea560000ea820000eab80000eae20000eb0e0000
-eb440000eb6e0000eb980000ebcc0000ebfc0000ec300000ec740000eca4
-0000ecd80000ed1a0000ed4e0000ed800000edc20000edf60000ee260000
-ee680000eeac0000eef20000ef4e0000ef6a0000ef860000efa20000efbe
-0000efda0000f1480000f3f20000f6620000f67e0000f6980000f6b40000
-f6d00000f6ec0000f7080000f7640000f79e0000f8080000f8d20000f972
-0000fa480000fac80000fb500000fbc00000fc560000fcb40000fcfa0000
-fd580000fdba0000fdfa0000fe560000feba0000ff2c0000ff6a000100fc
-0001020c00010236000102520001027e000102b600010302000103320001
-036200010396000103c6000103f6000104260001045600010486000104b6
-000104e6000105160001054600010576000105a6000105d6000106060001
-07900001093e0001096e0001099e00010a8a00010ba200010bd200010c00
-00010c3000010c5e00010c8e00010cbc00010ce000010d0400010d3e0001
-0e1e00010e6e00010ed40001101a0001104c000110720001109a000110d8
-000111ae000112a6000112d6000113060001133600011366000113960001
-13c4000113f400011424000114e6000115fa0001162a0001165a0001168a
-000116ba000116ea0001171a000117400001176600011796000117c60001
-17f600011826000118c600011918000119e600011a1600011a4600011a76
-00011aa600011ad800011b0800011b3800011b6800011b9800011bcc0001
-1c0000011c3000011c6000011cbe00011ce800011e6e00011f560001210a
-0001235e0001259600012734000127940001281a0001282a000128ec0001
-2a9000012b6400012c3a00012cc600012dea00012efe00013070000130a6
-000130b6000130c6000131a0000131b0000131c0000131d0000131e00001
-31f0000132f60001330600013316000133c0000133d00001342200013432
-000135260001353600013546000135560001362800013742000137760001
-37aa000137da0001380a0001383a000138680001389c0001398600013a7c
-00013b5c00013c2600013ce600013d3800013e6a00013f7e000140420001
-40520001415e0001416e0001423800014316000143de000144fc000145c8
-000146c6000146f80001472c0001475c0001478c000147bc000147f00001
-48d20001490200014a2600014a3600014a4600014a7a00014a8a00014b90
-00014c7c00014d4a00014d7a00014daa00014e2a00014e3a00014ef00001
-4f0000014f5800014ff600015006000151e80001530c0001543200015462
-0001558c0001560400015614000156240001563400015688000156980001
-56a8000156b8000157b0000158ae000158be0001592a000159b800015a40
-00015ade00015b9c00015c8400015d3e00015e6800015f8e000160cc0001
-60dc00016202000162f00001634e0001641e0001642e0001661400016766
-0001684a0001687a0001699000016a1a00016bd400016c5a00016c6a0001
-6cd400016ce400016cf400016d5e00016d6e00016ec200016ed200016f5c
-00016fe80001707800017128000171e4000172e4000173a2000174a80001
-75b4000176e200017716000178520001788000017996000179a6000179b6
-000179e8000179f800017b0400017be800017ce600017d2000017d500001
-7df000017e4e00017ebe00017efa00018090000181140001819e000182e6
-000183a00001848a000184da000185620001862a00018668000186ba0001
-8716000188000001885400018892000188ca00018908000189560001899e
-000189e400018a4000018b9600018c3800018d4e00018dac00018e480001
-8e8600018f4000018fb6000190b4000190ee0001917800019234000192d6
-0001935c0001942800019466000194ee000195bc0001969a000197620001
-98700001992600019a3200019ae400019b6c00019c6c00019d5400019dac
-00019e0400019e5800019ea600019f3e0001a04a0001a08e0001a0cc0001
-a1140001a14a0001a1b40001a2940001a2cc0001a2fa0001a3320001a360
-0001a3920001a3c40001a43e0001a4940001a5f20001a6920001a7b00001
-a8600001a8ac0001aa020001aab20001aadc0001ab580001aba00001acd8
-0001add60001ae440001afc60001b1840001b2ea0001b3f80001b4220001
-b5b20001b6f00001b71c0001b7500001b77c0001b7ac0001b91a0001b944
-0001ba540001bb060001bbb60001bc4a0001bd180001be540001be640001
-be980001bf580001c1100001c1e80001c2520001c3780001c3d60001c4e8
-0001c5b60001c6420001c6c00001c79c0001c8dc0001c9d60001ca8c0001
-cb780001cc400001cd1e0001cdee0001cecc0001cf600001d18c0001d1b6
-0001d1e00001d1f00001d21a0001d3540001d4720001d5820001d5ac0001
-d5d60001d6000001d62a0001d6540001d8380001d8620001d88c0001d8b6
-0001d8e00001d90a0001d9340001d95e0001d9880001d9bc0001d9e60001
-da100001da3a0001dbd40001dbe40001dd1c0001dd2c0001dd560001dd80
-0001ddaa0001ddd40001df6e0001e1e80001e3460001e3560001e4c80001
-e4d80001e6360001e81a0001e91c0001eaa20001ec6c0001eec00001f02e
-0001f2220001f2320001f2420001f3a60001f3d00001f3fa0001f4240001
-f44e0001f4780001f4a20001f4cc0001f4f60001f5200001f54a0001f574
-0001f59e0001f5c80001f5f20001f61c0001f8d40001fab40001fc3e0001
-fe7e0001fff6000200200002004a0002007a000200aa000200fa0002014a
-0002018a000201fc00020250000202ae000203040002033a0002037c0002
-03c20002040c0002043c00020474000204a40002060a000209500002097a
-000209a4000209ce000209f800020a2200020a4c00020a7600020aa00002
-0aca00020af400020b1e00020b4800020b7200020b9c00020bc600020bf0
-00020c1a00020c4400020c6e00020c9800020cc200020cec00020d160002
-0d4000020d6a00020d9400020dbe00020de800020e8000020f1000020f3a
-000212c2000213cc00021544000216ca000218ac00021a8000021c9e0002
-1cae00021e5600021fee00022260000224a00002261800022628000226d4
-0002277e000228ba000228ca00022996000229a600022b4800022d300002
-2e9c00022eac00022fb400022fc40002313e0002314e0002327c0002328c
-000233c80002357c000236740002368400023776000238d4000239800002
-399000023ad200023c8000023d7600023d8600023e2a00023e3a00023f22
-00023f3200023ffc0002400c0002412200024132000242f8000243080002
-447600024486000246f800024708000249180002492800024aa400024ab4
-00024be600024bf600024db400024dc400024f3a00024f4a000250b80002
-50c8000250d8000250e8000252a8000252b8000252c8000252d800025428
-0002556000025678000257720002591400025aa600025c0e00025d5c0002
-5f2200025f3200026084000261e6000263cc000263dc0002656400026708
-0002694200026952000269620002697200026adc00026aec00026bbe0002
-6bce00026d0600026d1600026dfc00026e0c00026f4600026f5600027010
-0002702000027146000272aa00027418000275c6000276f6000277060002
-7880000279c200027be200027db400027ec400027ed40002815600028382
-0002864c000288a800028b6800028daa00028f68000290c2000290ec0002
-91160002912600029136000291600002918a000291b4000291c4000291d4
-000291fe000292280002923800029248000292720002929c000292c60002
-92d6000292e6000292f60002930600029316000293260002935000029360
-000293700002939a000293c4000293ee00029418000294420002946c0002
-9496000294c0000294ea000295140002953e0002956800029592000295bc
-000295e6000296100002963a000296640002968e000296b8000296e20002
-970c00029736000297600002978a000297b4000297de0002980800029832
-0002985c00029886000298b0000298da000299040002992e000299580002
-9982000299ac000299d600029a0000029a2a00029a5400029a7e00029aa8
-00029ad200029afc00029b2600029b5000029b7a00029ba400029bce0002
-9bf800029c2200029c4c00029cf400029d3800029dae00029dd800029e02
-00029e2c00029e5600029e8000029eaa00029ed400029efe00029f280002
-9f5200029f7c00029fa600029fd000029ffa0002a0240002a04e0002a078
-0002a0a20002a0cc0002a0f60002a1200002a14a0002a1740002a2260002
-a25a0002a28e0002a2c20002a4460002a5c60002a7320002a8800002a940
-0002aa020002aa740002ab460002ac180002ac8a0002ad4e0002ae400002
-af040002aff60002b09c0002b1a80002b23a0002b3820002b4c00002b524
-0002b64c0002b81a0002ba620002bace0002bb3a0002bba40002bc100002
-bcbe0002bd6c0002be120002beb80002bf5e0002bf8e0002bfbe0002bfee
-0002c0000002c0120002c0240002c0360002c0480002c0b80002c12a0002
-c15a0002c16c0002c17e0002c18e0002c19e0002c1b00002c1c20002c1d4
-0002c1e60002c1f80002c20a0002c3160002c3bc0002c4c80002c56e0002
-c5c60002c5ec0002c6120002c63c0002c66a0002c6b40002c7100002c74a
-0002c7a20002c7e20002c8320002c86a0002c8c00002c9020002c9420002
-c9940002ca060002ca500002cabc0002cafc0002cb680002cba80002cc10
-0002cc520002cca60002cccc0002ccf20002cd1c0002cd4c0002cd7c0002
-cdac0002cdfa0002ce560002ce940002ceee0002cf360002cf8c0002cfd0
-0002d0240002d06a0002d0ac0002d0d20002d1080002d12e0002d1540002
-d17a0002d1a00002d1ce0002d1f80002d2420002d29e0002d2d80002d330
-0002d3700002d3c40002d3fc0002d44c0002d48e0002d4ce0002d5080002
-d5440002d5800002d5bc0002d5ea0002d6140002d6520002d6820002d6a8
-0002d6ce0002d6f40002d71a0002d7440002d76e0002d7ae0002d7fa0002
-d8400002d8780002d8a20002d8cc0002d8fc0002d92c0002d9520002d978
-0002d9a20002d9cc0002d9fe0002da300002da600002da900002dac00002
-daf00002db200002db4e0002db7e0002dbae0002dbde0002dc0e0002dc42
-0002dca20002dcd60002dd3a0002dd6e0002ddce0002de020002de660002
-df0e0002dfde0002e0f40002e1c60002e2400002e2ae0002e4900002e65a
-0002e77a0002e88c0002e9d00002eae40002eb740002ebf40002ec880002
-ed0a0002edca0002ee6a0002ef360002f01c0002f0d40002f1a00002f21c
-0002f22c0002f2fa0002f3ba0002f4840002f5380002f62e0002f6a40002
-f7cc0002f8e60002fa6e0002faf00002fbe00002fcd60002fdce0002fe60
-0003007200030202000302880003040a00030476000304e00003054e0003
-0714000308dc0003096c000309b8000309f600030a3800030a8000030aac
-00030af200030b2800030b6400030ba200030be000030c6800030cf00003
-0d3200030d6a00030da400030dde00030e0600030e2e00030e7200030eb6
-00030ef400030f3200030f6200030f9200030fb800030fde000310200003
-1062000310a8000310ee000311460003119e000311fa00031256000312b2
-0003130e0003135c000313aa000313d2000313fa00031420000314460003
-148a000314ce0003151a00031566000315b0000315fa0003164800031696
-000316d6000317760003179c000317c20003180c0003187c000318a40003
-18cc0003191200031958000319ae00031a0400031a5200031b0c00031b34
-00031b5c00031bb000031c0400031c4400031c8400031caa00031cd00003
-1d3600031d9c00031dde00031e2000031e4600031e6c00031ec200031f18
-00031f7400031fd00003202400032078000320c6000321140003215e0003
-21a8000322020003225c000322b000032304000323460003238800032426
-000324c40003250e00032558000325aa000325fc00032662000326c80003
-272000032778000327a4000327d0000327fc000328280003285400032880
-000328ac000328d8000328fe00032924000329500003297c000329ca0003
-2a1800032a6400032ab000032b0000032b5000032bca00032c2c00032ca4
-00032cee00032e8000032eb400032ee800032f1e00032f4200032fac0003
-301600033098000331000003314800033190000331dc000332460003326e
-00033296000332bc000332e2000333320003338200033416000334680003
-34c6000335240003358a000335f0000336d6000337e6000338b4000339ae
-00033a1a00033a8000033ade00033b4000033bc600033c4c00033cb20003
-3d1800033d8400033df000033e4600033e9c00033ece00033f0000033f26
-00033f4c00033fb80003401e0003407c000340de000341f0000342fc0003
-440a0003450e000345340003455c00034580000345a4000345cc000345f4
-0003461a00034640000347620003489e000349cc00034af800034bb20003
-4c6c00034d2c00034dec00034ed000034fb4000350b0000351ac00035290
-000353740003544a000355200003556a000355b4000355da000356000003
-5650000356a0000356c4000356e8000357be000357ce0003582200035876
-000358d40003593200035972000359b2000359fc00035a4600035a960003
-5ae600035b3c00035b9200035be400035c2200035c9c00035cde00035d22
-00035db000035e3e00035ff0000360000003603a00036074000360a40003
-60d4000361080003613c00036176000361b00003620400036258000362ba
-0003631c000364cc0003665400036690000366c8000367120003675c0003
-67a2000367e80003683800036a5e00036a8400036aaa00036afe00036da8
-00036e7a00036f1600036f6400036fa200036fd4000371c20003747e0003
-7550000376b4000377ee0003789a00037a3000037c8400037ec000037f1a
-00037f600003802e000381200003813e000381e80003830e000383ea0003
-83fc0003855c000386e200038708000387c6000387e40003880a00038830
-000388560003887c000388a2000388c8000388ee00038914000389600003
-89c0000389e800038a0e00038b6c00038d4800038d5800038e2800038f38
-00038f96000390ae0003923c000392e2000394280003947a000394cc0003
-9504000395500003957c000395c2000395ee0003962a00039684000396ce
-0003971a0003978a00039850000398cc0003998c00039a0400039ade0003
-9b6e00039ba800039be400039d5c00039e4c00039e9600039edc0003a026
-0003a1360003a1460003a2500003a3360003a4480003a5140003a62a0003
-a7680003a7780003a8500003a9120003aa120003ab6c0003abcc0003ad50
-0003adc40003af180003b0800003b1640003b1b60003b21e0003b3a80003
-b51e0003b5a60003b74a0003b83a0003b95e0003ba000003baea0003bbd4
-0003bccc0003bdb40003bee60003c02c0003c1ce0003c38a0003c39a0003
-c49e0003c5d00003c67a0003c78e0003c81a0003c98a0003ca520003cb4c
-0003cc9a0003cdb20003cf580003d0980003d1ea0003d30e0003d4c00003
-d6480003d7420003d8180003d9740003da340003da6a0003dad20003dba6
-0003dbb60003dc160003dc720003dccc0003dd040003dd420003dd8c0003
-ddc80003de060003de500003df620003dfb40003e0100003e0bc0003e0e4
-0003e1540003e1840003e1b60003e3600003e4860003e4c00003e4f00003
-e53c0003e56e0003e5940003e5ba0003e5fc0003e63e0003e66e0003e69e
-0003e6e20003e7280003e7660003e7a00003e7da0003e80a0003e8c60003
-e9800003e9c20003e9f20003ea260003ea620003ea920003eac20003eafc
-0003eb340003eb640003eb980003ebcc0003ebf40003ec240003ec540003
-ec880003ecc00003ecf00003ed200003ed600003ed920003edce0003ee00
-0003ee400003ee7a0003eeaa0003eeda0003ef000003ef260003ef4c0003
-ef7c0003f0940003f1920003f1c20003f1f40003f2980003f43e0003f5a8
-0003f6960003f8000003f8300003f8600003f8980003f8d00003f9220003
-f97e0003fa700003fa980003fb060003fb360003fb660003fb8e0003fc00
-0003fc300003fc660003fdc60003fe880003ff6400040088000401800004
-02d0000403ec0004050a0004060e000407700004091600040aae00040cba
-00040df000040e8a00040ff800041008000410d6000412980004149a0004
-154c0004162a00041744000417f400041846000418980004196e00041a54
-00041ae400041c5c00041d5a00041e5c00041f900004206e000421540004
-21f4000422fe000424260004251a000426020004267e000426fa000427a6
-0004285800042936000429ac000429fe00042b7000042cf000042eee0004
-2fb2000430840004316a000432a00004336c000434740004358e00043692
-0004376200043840000439da00043af600043bd000043d4400043f380004
-404e000441fc0004428e00044330000443be0004445c0004456000044570
-000446ca000447da000447ea000448c4000449e800044a4800044b680004
-4c3600044d1800044f000004510e000453e40004561e000457ac000459d6
-00045b7e00045d6000045eba00046026000460a80004615c0004624a0004
-62f600046362000463e4000464bc00046600000467720004688000046890
-000468a00004690200046966000469c400046a5200046ade00046ba40004
-6c3e00046c4e00046c5e00046cf800046d9800046dde00046e5000046ec2
-00046f1000046f4400046fb6000470260004709a000470ea0004717e0004
-720e0004728c00047310000473ac000473d800047446000474f800047606
-000476520004781c00047908000479180004794e00047992000479d60004
-7a1a00047a5000047a8200047ac400047b1a00047b6600047c1400047c8c
-00047d1600047d8a00047df000047e7600047ed600047f4000047fb80004
-802c0004808a00048134000481d000048240000482d200048330000483a2
-00048450000484fa00048594000486080004868e000486f6000487a60004
-886800048918000489ae00048a1000048a8000048ad600048b5800048bda
-00048c6400048cf400048d4e00048dba00048e2a00048e9c00048f100004
-8f980004902c00049096000491100004919000049208000492b20004934e
-000493e200049444000494e600049566000495fc000496a4000497520004
-97ee0004984e000498a600049912000499bc00049a6a00049b3800049be2
-00049c4800049ca000049d0400049d9600049e2000049eb200049f160004
-9f7e00049fe80004a0500004a0bc0004a1380004a1c40004a25c0004a2c8
-0004a3300004a3940004a4440004a5080004a5ba0004a64c0004a6ae0004
-a71e0004a7920004a83a0004a8e40004a9ac0004aa520004aaba0004ab4e
-0004abc40004ac600004ace20004ad600004add00004ae620004aebe0004
-af200004afaa0004b02a0004b0920004b0fa0004b1520004b1c00004b228
-0004b2aa0004b3240004b3a20004b4260004b4820004b4e80004b5500004
-b5f40004b69a0004b75c0004b8100004b8700004b8ec0004b94e0004b9dc
-0004ba780004bb0a0004bb740004bbd60004bc680004bcde0004bd7c0004
-be140004be880004befc0004bf780004bfd60004c03a0004c0b80004c116
-0004c17a0004c1d80004c2380004c2a00004c2f40004c32a0004c3760004
-c3da0004c41a0004c4640004c50e0004c5b60004c60c0004c6440004c694
-0004c7440004c7f20004c8440004c8980004c8f00004c9400004c9980004
-c9fe0004ca5e0004cafe0004cba20004cbe00004cc460004cce40004cd78
-0004ce0a0004ceb00004cee20004cf4a0004cfb20004cffc0004d0ce0004
-d1500004d1f80004d2600004d29e0004d3080004d3ae0004d4040004d458
-0004d4c40004d5280004d5c80004d5fa0004d62a0004d6740004d70c0004
-d7360004d7600004d8280004d8820004d9240004d98e0004da0a0004daba
-0004db300004dba00004dbf80004dc5e0004dcc00004dd600004ddb80004
-de840004def00004df4a0004df940004dfea0004e08a0004e1500004e29c
-0004e3b80004e41c0004e4900004e7b60004e8460004e8c60004e9140004
-ea7c0004eba80004ebf00004ecec0004edb40004ee920004ef840004f03e
-0004f1180004f1820004f21a0004f2ec0004f3e00004f4520004f4c00004
-f5040004f6160004f74a0004f83c0004f8800004f8bc0004f9a60004faa8
-0004fc2a0004fd260004fe2a0004ff340005002000050082000500f80005
-02820005031400050444000505340005065c000507940005085800050940
-00050a0000050b5400050d0600050e9800050fd2000511380005120e0005
-12cc0005138a00051450000515a8000516f8000517080005171800051728
-000517c400051862000518b0000518ee000519340005196400051ac20005
-1c5e00051d7000051e980005202400052196000522a60005247a00052666
-000528c000052a2000052b4a00052cdc00052e4e00053064000532d20005
-33d200053508000536280005377a0005386e000539b4000539f600053a36
-00053c7800053ec600054026000541bc000543ec0005458c000546180005
-46480005469000054724000547be0005491e000549b000054a2000054a60
-00054a9e00054c5000054e8e0005503e000551680005525e000553640005
-553a000556f0000557f20005590800055ace00055cbc00055e6400055fe0
-00056166000562c60005635e000563fa000565180005663e000567960005
-694a00056a8600056bda00056c6000056cde00056d9200056e5800056f04
-00056fce00057100000572a0000572c6000572ec000572fc0005732c0005
-735c000574d00005764000057702000577c4000578a60005797e00057a32
-00057b0600057bb000057c7600057df800057fa800058012000580420005
-806a0005809e000580d2000580e2000580f2000581220005814800058184
-000581c0000581f4000582280005825c00058292000583b8000583c80005
-83f8000584280005845c00058494000584c8000584fc0005853000058564
-00058598000585ce000585fe0005863400058668000586a2000586f20005
-873c00058770000587a4000587da00058810000588c4000588d4000589de
-00058b4a00058cb400058e5400058f9a000590f2000591e4000592ee0005
-93d2000594d2000595f8000596e4000597a0000598620005994a00059a04
-00059ace00059b5600059c0400059c9600059d1400059e2e00059e9a0005
-9f620005a05e0005a0cc0005a13c0005a1f40005a3d80005a4e60005a56c
-0005a5b20005a67a0005a70a0005a7f40005a8a00005a90e0005aa160005
-ab020005abc20005ac080005ac9a0005ada80005ae440005aea00005af96
-0005b0900005b2120005b3760005b4740005b55e0005b62c0005b6540005
-b67c0005b6ac0005b6dc0005b7040005b72c0005b7540005b77c0005b7d6
-0005b8400005b8720005b8a20005b8c80005b8f00005b9180005b9420005
-b96c0005b9940005b9bc0005b9e20005ba0e0005ba980005bac00005bb42
-0005bb6a0005bb900005bbb60005bbdc0005bc2e0005bc820005bcb40005
-bce40005bd160005bd520005bd820005bdb80005bdde0005be040005be38
-0005be6c0005beac0005bef20005bf180005bf3e0005bf640005bf8a0005
-bfb40005c0180005c0640005c0960005c0c40005c0fa0005c1380005c160
-0005c1860005c1ac0005c1f60005c2380005c2600005c2860005c2b20005
-c2d80005c3340005c3640005c3940005c3c40005c3ea0005c4140005c444
-0005c4740005c49a0005c4c00005c4e60005c50c0005c5320005c5580005
-c5800005c5f80005c6220005c68c0005c6b40005c7580005c7800005c7fc
-0005c8300005c8720005c8a20005c8d20005c9020005c9320005c95e0005
-c9840005c9cc0005ca0e0005ca3a0005ca620005ca920005cac20005cae8
-0005cb0e0005cb3a0005cbee0005cc160005ccc60005cd080005cd4a0005
-cd7a0005cdae0005cdd40005cdfc0005ce220005ce4a0005ce700005ce98
-0005cec00005cee80005cf0e0005cf340005cf5a0005cf800005cfa80005
-d0300005d0640005d0ca0005d0fa0005d12a0005d1500005d1760005d1b0
-0005d1f40005d2260005d2620005d2920005d2c20005d2f60005d32a0005
-d35a0005d3900005d3c80005d3f80005d4260005d4500005d47e0005d4a4
-0005d4ca0005d4fe0005d5440005d57e0005d5ba0005d5ec0005d61c0005
-d6580005d6940005d6d00005d71a0005d7640005d79c0005d7da0005d816
-0005d8560005d8b20005d90e0005d96a0005d9c60005da300005da9a0005
-daca0005db020005db420005db860005dbca0005dc0e0005dc6a0005dcc6
-0005dd320005dd9e0005de0a0005de760005dea60005ded60005df0e0005
-df460005df860005dfc60005e0020005e03e0005e09a0005e0f60005e15a
-0005e1be0005e2220005e2860005e2e40005e3420005e3700005e39e0005
-e3d00005e4020005e4340005e4660005e4a40005e4e20005e5520005e5c4
-0005e6260005e6880005e6ea0005e74c0005e7a40005e7fc0005e82c0005
-e85c0005e8900005e8c40005e8f80005e92c0005e9860005e9f20005ea5c
-0005eac60005eb2e0005eb960005ebc60005ebf60005ec2a0005ec5e0005
-ec9e0005ecde0005ed1a0005ed560005edaa0005ee100005ee640005eeb2
-0005eee20005ef120005ef460005ef7a0005efae0005efe20005f01a0005
-f0520005f0ae0005f1040005f1640005f1c40005f21a0005f2700005f2ca
-0005f31e0005f3540005f3860005f3c40005f3f40005f4240005f46e0005
-f49c0005f4cc0005f5120005f54a0005f5860005f5ca0005f5fe0005f62e
-0005f6780005f6cc0005f7220005f7780005f7dc0005f8400005f8920005
-f8e80005f9340005f9860005f9f20005fa5e0005faca0005fb360005fbb2
-0005fc2e0005fc700005fcb20005fcfa0005fd420005fd940005fde60005
-fe340005fe820005fef00005ff5e0005ffd40006004a000600c000060136
-000601a600060216000602580006029a000602de00060322000603660006
-03aa000603f40006043e000604ac0006051400060586000605f800060660
-000606c80006073200060796000607cc0006080200060852000608800006
-08cc000609080006095e0006098e000609be000609ea00060a1600060a3c
-00060a9000060afe00060b5200060bee00060ce000060d2200060d480006
-0da400060dd400060e1600060e7c00060eea00060f5000060fba00060fe0
-00061088000611260006126600061294000612c2000613260006138a0006
-13b8000613ec0006141c0006144c000614bc00061532000615da00061678
-000617b4000617e4000618140006187a000618e000061910000619400006
-1970000619a6000619d600061a0600061a5200061ab200061b0e00061be8
-00061cc200061d3400061d7a00061da000061de200061e1200061e540006
-1e8800061ef200061f3800061fae00061fd40006204400062092000621b2
-00062444000625d800062730000628e200062bf000062e860006306e0006
-320c00063464000635a6000637bc0006382c000638940006390600063978
-00063a0000063a9e00063c7c00063e2a00063ff6000640f60006428a0006
-43ea000644ae000645a40006460c0006466e000646dc0006474000064814
-0006487c0006494600064a0400064aa000064b0200064b9800064c2a0006
-4cc600064d5e00064dc400064e2200064e8e00064ef600064f7200065020
-0006508a000650e80006514a000651fc0006527e00065300000653360006
-5368000653780006538800065494000655bc000657dc0006592e0006593e
-000659f800065aee00065b7800065b8800065c0800065c8000065ca20006
-5d6400065d7400065d8400065d9400065da400065ea000065fe6000661a6
-000663ba000664ac00066512000665760006663800066648000667e20006
-67f200066802000668c6000669e200066abe00066ace00066ade00066aee
-00066c4a00066e3a00066f4a00066f5a00066f6a00066f7a00066f8a0006
-704000067050000671a6000672e2000673d0000674e000067584000675f2
-000676620006777c000677e000067824000678b200067a7200067ab20006
-7ba600067c7200067d3e00067dc400067e9a00067f360006809e00068122
-000681b600068330000684a20006862a0006870e000688d8000689c20006
-8ab000068bdc00068d0200068e5c00068fc60006910800069180000692b6
-000693ae000694ac000695a80006968e00069718000697a2000698940006
-995000069a1200069abe00069bb400069c9000069d9400069ed400069fbc
-0006a13c0006a26a0006a36e0006a3b80006a4240006a4e40006a5c00006
-a6fe0006a7e60006a9320006aa600006ab6a0006ac0c0006ad580006ae14
-0006af3e0006b0000006b0480006b2420006b2f80006b4e60006b6420006
-b7e00006b8e20006b9480006ba900006bb080006bc980006bcce0006bd04
-0006bd560006bda80006bde00006be200006be580006be980006bfc60006
-c0280006c0e80006c19c0006c23e0006c2d60006c3520006c45e0006c4bc
-0006c5ea0006c69a0006c7680006c7a20006c7de0006c8660006c9260006
-ca220006caf80006cb1e0006cb440006cbdc0006cbec0006cbfc0006cc0c
-0006cc1c0006cc2c0006cc3c0006cc4c0006cc5c0006cc6c0006cc7c0006
-cc8c0006cc8c0006cdf00006ce000006ce740006cf0e0006d01c0006d176
-0006d2d60006d4900006d65e0006d8320006d8b60006d9d40006db1e0006
-dcc60006dd620006ddb20006de480006df660006dfb60006e0460006e170
-0006e1800006e2ae0006e3be0006e4340006e48c0006e5780006e5be0006
-e5fe0006e69a0006e6ee0006e8700006e94e0006e98e0006e9f80006ea62
-0006ea9a0006ebe20006ecd80006ede60006ee1e0006ee560006ee7c0006
-eea20006eed20006ef020006ef260006ef4a0006ef760006efa20006efe8
-0006f02e0006f05a0006f0860006f0cc0006f1120006f16e0006f1ca0006
-f1ee0006f2120006f26a0006f2c20006f3080006f34e0006f3840006f3ba
-0006f3f00006f4260006f4880006f4f20006f5520006f5b20006f5fe0006
-f6cc0006f6f40006f71c0006f7880006f7f40006f8420006f8900006f996
-0006f9a60006f9f00006fa3a0006fa820006faca0006fb280006fb8a0006
-fbe40006fc360006fcba0006fd220006fd960006fe080006fe8e0006fefc
-0006ff6e0006ffd40006fffa0007002000070044000700680007009c0007
-00d0000700f60007011c00070188000701f400070260000702c80007031a
-0007036c000703c2000704140007043c0007046400070496000704c40007
-051a00070570000705cc000706280007064e00070674000706a0000706cc
-0007072800070784000707a8000707cc000708820007093800070b0a0007
-0b1a00070b7e00070be200070c2e00070c7a00070e3e00070e4e00070f5c
-00070f6c00070fc60007102000071078000710d000071134000711980007
-11dc00071220000713b6000715480007169800071866000719e400071b9e
-00071ccc00071dc40007203e000721c2000723ea00072566000725f20007
-272a0007294e000729d6000729e600072b5600072c8200072dea00072f30
-00073066000731640007333a000734ee0007357e000736c2000737ae0007
-38fc000739ea00073bd600073cf200073e1400073fe800074152000742f6
-000743fc0007454c000746a40007489a00074a7600074bda00074c9e0007
-4dd200074e9c00074fa60007512000075214000752f80007549600075668
-0007567800075726000757f000075800000758c800075962000759ae0007
-59be00075a3800075b0c00075b6800075c1800075c5a00075d9000075e86
-00075f82000760820007612000076264000763ac000765cc000766620007
-676200076882000769ca00076a8600076b6000076c3c00076d0800076e0a
-00076fb6000770d6000771fc0007728a0007731a0007742c0007748c0007
-7578000776e40007781600077912000779fe00077b2400077cb400077e5a
-0007802600078156000781d800078258000782e200078362000783ec0007
-84a800078550000785fe000786a600078720000787a40007881e000788a2
-00078958000789fa00078a9a00078b3c00078bb800078c3e00078cba0007
-8d4000078df800078ea200078f4800078ff0000790e0000791d4000792b4
-0007939c0007948e0007958200079668000797540007991c00079a7e0007
-9b2200079c3200079cf800079d0800079dfc00079f5600079fea0007a094
-0007a15e0007a2300007a3120007a3ae0007a4980007a5be0007a5ce0007
-a6880007a7420007a7520007a7fa0007a8a00007a98e0007aa7c0007ab58
-0007ac2a0007adae0007af540007afee0007b08a0007b0c60007b1040007
-b1400007b17e0007b1d80007b2300007b28a0007b2ee0007b37a0007b578
-0007b5cc0007b5dc0007b6680007b6ec0007b7700007b8280007b9380007
-baf60007bc140007bca40007bd480007bdf80007beda0007bf5c0007bfea
-0007c1120007c15a0007c1b20007c28c0007c2c80007c3260007c3640007
-c3960007c3da0007c41c0007c44c000100000d3500f2003c008f00060002
-0010002f0055000006fa02c20005000200>
-<0000005303ea0000000300000000006a00000000000300000001000a006a
-00000003000000020008007400000003000000030058007c000000030000
-0004001400d40000000300000005001800e8000000030000000600180100
-000000030000000700ba01180000000300000008003001d2000000030000
-0009008a0202000000030000000d02aa028c000100000000000000350536
-00010000000000010005056b000100000000000200040570000100000000
-0003002c05740001000000000004000a05a00001000000000005000c05aa
-0001000000000006000c05b60001000000000007005d05c2000100000000
-00080018061f000100000000000900450637000100000000000d0155067c
-0003000104030002000e07d10003000104030004001a07df000300010405
-0002000a07f9000300010405000400160803000300010406000200060819
-00030001040600040012081f000300010407000200080831000300010407
-0004001408390003000104080002000c084d000300010408000400180859
-0003000104090000006a08710003000104090001000a08db000300010409
-0002000808e50003000104090003005808ed000300010409000400140945
-000300010409000500180959000300010409000600180971000300010409
-000700ba0989000300010409000800300a430003000104090009008a0a73
-000300010409000d02aa0afd00030001040a0002000e0da700030001040a
-0004001a0db500030001040b000200120dcf00030001040b0004001e0de1
-00030001040c000200080dff00030001040c000400140e0700030001040e
-000200100e1b00030001040e0004001c0e2b000300010410000200120e47
-0003000104100004001e0e59000300010413000200060e77000300010413
-000400120e7d0003000104140002000e0e8f0003000104140004001a0e9d
-000300010415000200140eb7000300010415000400200ecb000300010416
-0002000e0eeb0003000104160004001a0ef9000300010419000200140f13
-000300010419000400200f2700030001041b0002000a0f4700030001041b
-000400160f5100030001041d000200060f6700030001041d000400120f6d
-00030001041f0002000a0f7f00030001041f000400160f89000300010424
-0002000c0f9f000300010424000400180fab00030001042a000200080fc3
-00030001042a000400140fcb00030001042d0002000a0fdf00030001042d
-000400160fe900030001080a0002000e0fff00030001080a0004001a100d
-0003000108160002000e10270003000108160004001a1035000300010c0a
-0002000e104f000300010c0a0004001a105d000300010c0c000200081077
-000300010c0c00040014107f00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0042006f006c0064004d006f006e006f007400790070
-0065003a0041007200690061006c00200042006f006c0064003a00560065
-007200730069006f006e00200035002e0030003100200028004d00690063
-0072006f0073006f0066007400290041007200690061006c00200042006f
-006c006400560065007200730069006f006e00200035002e003000310041
-007200690061006c002d0042006f006c0064004d00540041007200690061
-006c00200069007300200061002000740072006100640065006d00610072
-006b0020006f006600200054006800650020004d006f006e006f00740079
-0070006500200043006f00720070006f0072006100740069006f006e0020
-0069006e002000740068006500200055006e006900740065006400200053
-0074006100740065007300200061006e0064002f006f00720020006f0074
-00680065007200200063006f0075006e00740072006900650073002e0054
-006800650020004d006f006e006f007400790070006500200043006f0072
-0070006f0072006100740069006f006e004d006f006e006f007400790070
-006500200054007900700065002000440072006100770069006e00670020
-004f006600660069006300650020002d00200052006f00620069006e0020
-004e006900630068006f006c00610073002c002000500061007400720069
-0063006900610020005300610075006e0064006500720073002000310039
-003800320059006f00750020006d00610079002000750073006500200074
-00680069007300200066006f006e007400200074006f0020006400690073
-0070006c0061007900200061006e00640020007000720069006e00740020
-0063006f006e00740065006e00740020006100730020007000650072006d
-0069007400740065006400200062007900200074006800650020006c0069
-00630065006e007300650020007400650072006d007300200066006f0072
-0020007400680065002000700072006f006400750063007400200069006e
-0020007700680069006300680020007400680069007300200066006f006e
-007400200069007300200069006e0063006c0075006400650064002e0020
-0059006f00750020006d006100790020006f006e006c0079002000280069
-002900200065006d0062006500640020007400680069007300200066006f
-006e007400200069006e00200063006f006e00740065006e007400200061
-00730020007000650072006d006900740074006500640020006200790020
-00740068006500200065006d00620065006400640069006e006700200072
-00650073007400720069006300740069006f006e007300200069006e0063
-006c007500640065006400200069006e0020007400680069007300200066
-006f006e0074003b00200061006e00640020002800690069002900200074
-0065006d0070006f0072006100720069006c007900200064006f0077006e
-006c006f006100640020007400680069007300200066006f006e00740020
-0074006f002000610020007000720069006e0074006500720020006f0072
-0020006f00740068006500720020006f0075007400700075007400200064
-0065007600690063006500200074006f002000680065006c007000200070
-00720069006e007400200063006f006e00740065006e0074002ea9203230
-303620546865204d6f6e6f7479706520436f72706f726174696f6e2e2041
-6c6c205269676874732052657365727665642e417269616c426f6c644d6f
-6e6f747970653a417269616c20426f6c643a56657273696f6e20352e3031
-20284d6963726f736f667429417269616c20426f6c6456657273696f6e20
-352e3031417269616c2d426f6c644d54417269616c206973206120747261
-64656d61726b206f6620546865204d6f6e6f7479706520436f72706f7261
-74696f6e20696e2074686520556e697465642053746174657320616e642f
-6f72206f7468657220636f756e74726965732e546865204d6f6e6f747970
-6520436f72706f726174696f6e4d6f6e6f74797065205479706520447261
-77696e67204f6666696365202d20526f62696e204e6963686f6c61732c20
-5061747269636961205361756e646572732031393832596f75206d617920
-757365207468697320666f6e7420746f20646973706c617920616e642070
-72696e7420636f6e74656e74206173207065726d69747465642062792074
-6865206c6963656e7365207465726d7320666f72207468652070726f6475
-637420696e207768696368207468697320666f6e7420697320696e636c75
-6465642e20596f75206d6179206f6e6c792028692920656d626564207468
-697320666f6e7420696e20636f6e74656e74206173207065726d69747465
-642062792074686520656d62656464696e67207265737472696374696f6e
-7320696e636c7564656420696e207468697320666f6e743b20616e642028
-6969292074656d706f726172696c7920646f776e6c6f6164207468697320
-666f6e7420746f2061207072696e746572206f72206f74686572206f7574
-7075742064657669636520746f2068656c70207072696e7420636f6e7465
-6e742e004e0065006700720065007400610041007200690061006c002000
-4e00650067007200650074006100740075010d006e00e900410072006900
-61006c002000740075010d006e00e9006600650064004100720069006100
-6c002000660065006400460065007400740041007200690061006c002000
-46006500740074038803bd03c403bf03bd03b10041007200690061006c00
-20038803bd03c403bf03bd03b100a9002000320030003000360020005400
-6800650020004d006f006e006f007400790070006500200043006f007200
-70006f0072006100740069006f006e002e00200041006c006c0020005200
-690067006800740073002000520065007300650072007600650064002e00
-41007200690061006c0042006f006c0064004d006f006e006f0074007900
-700065003a0041007200690061006c00200042006f006c0064003a005600
-65007200730069006f006e00200035002e0030003100200028004d006900
-630072006f0073006f0066007400290041007200690061006c0020004200
-6f006c006400560065007200730069006f006e00200035002e0030003100
-41007200690061006c002d0042006f006c0064004d005400410072006900
-61006c00200069007300200061002000740072006100640065006d006100
-72006b0020006f006600200054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-200069006e002000740068006500200055006e0069007400650064002000
-530074006100740065007300200061006e0064002f006f00720020006f00
-7400680065007200200063006f0075006e00740072006900650073002e00
-54006800650020004d006f006e006f007400790070006500200043006f00
-720070006f0072006100740069006f006e004d006f006e006f0074007900
-70006500200054007900700065002000440072006100770069006e006700
-20004f006600660069006300650020002d00200052006f00620069006e00
-20004e006900630068006f006c00610073002c0020005000610074007200
-690063006900610020005300610075006e00640065007200730020003100
-39003800320059006f00750020006d006100790020007500730065002000
-7400680069007300200066006f006e007400200074006f00200064006900
-730070006c0061007900200061006e00640020007000720069006e007400
-200063006f006e00740065006e0074002000610073002000700065007200
-6d0069007400740065006400200062007900200074006800650020006c00
-6900630065006e007300650020007400650072006d007300200066006f00
-720020007400680065002000700072006f00640075006300740020006900
-6e0020007700680069006300680020007400680069007300200066006f00
-6e007400200069007300200069006e0063006c0075006400650064002e00
-200059006f00750020006d006100790020006f006e006c00790020002800
-69002900200065006d006200650064002000740068006900730020006600
-6f006e007400200069006e00200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-2000740068006500200065006d00620065006400640069006e0067002000
-7200650073007400720069006300740069006f006e007300200069006e00
-63006c007500640065006400200069006e00200074006800690073002000
-66006f006e0074003b00200061006e006400200028006900690029002000
-740065006d0070006f0072006100720069006c007900200064006f007700
-6e006c006f006100640020007400680069007300200066006f006e007400
-200074006f002000610020007000720069006e0074006500720020006f00
-720020006f00740068006500720020006f00750074007000750074002000
-640065007600690063006500200074006f002000680065006c0070002000
-7000720069006e007400200063006f006e00740065006e0074002e004e00
-65006700720069007400610041007200690061006c0020004e0065006700
-72006900740061004c0069006800610076006f0069007400750041007200
-690061006c0020004c0069006800610076006f0069007400750047007200
-6100730041007200690061006c00200047007200610073004600e9006c00
-6b00f6007600e900720041007200690061006c0020004600e9006c006b00
-f6007600e9007200470072006100730073006500740074006f0041007200
-690061006c002000470072006100730073006500740074006f0056006500
-740041007200690061006c002000560065007400480061006c0076006600
-6500740041007200690061006c002000480061006c007600660065007400
-50006f00670072007500620069006f006e00790041007200690061006c00
-200050006f00670072007500620069006f006e0079004e00650067007200
-690074006f0041007200690061006c0020004e0065006700720069007400
-6f041f043e043b0443043604380440043d044b0439004100720069006100
-6c0020041f043e043b0443043604380440043d044b043900540075010d00
-6e00e90041007200690061006c002000540075010d006e00e90046006500
-740041007200690061006c0020004600650074004b0061006c0131006e00
-41007200690061006c0020004b0061006c0131006e004b00720065007000
-6b006f0041007200690061006c0020004b007200650070006b006f011100
-e20323006d0041007200690061006c0020011100e20323006d004c006f00
-64006900610041007200690061006c0020004c006f006400690061004e00
-65006700720069007400610041007200690061006c0020004e0065006700
-72006900740061004e00650067007200690074006f004100720069006100
-6c0020004e00650067007200690074006f004e0065006700720069007400
-610041007200690061006c0020004e006500670072006900740061004700
-72006100730041007200690061006c00200047007200610073000000b154
-80410d03ac00af03ac0002001003ac002003ac00a003ac0003004003acb3
-070d3240b803acb312143240b803acb2162b32b9ffc003acb23a3340b803
-acb32d943280bc03ab005f0033ffc003abb2553340b803abb340443240b8
-03abb3333b3240b803abb32f313240b803abb2083340b803abb30714321f
-411a03ab002f03ab0002000f03ab002f03ab004f03ab008f03ab009f03ab
-00bf03ab0006001003ab00df03ab00ff03ab000303a803a2b2461f40b803
-a5b208330f411403a50001004003a500cf03a500ff03a50003002003a500
-af03a500ef03a500ff03a50004ffc003a3b3090c3240b803a3b208330f41
-1b03a30001000f03a3001003a3008003a300af03a300cf03a30005006f03
-a3009f03a300ff03a30003009f03a200af03a2000203a203a1b2101f1041
-0a039e007f039e0002039a000f0101001fffc00398b310143240b80399b3
-0f1332404110039500500395000200b0034d00c0034d0002006f0391007f
-03910002ffc0034bb22d3132b9ffc0034bb30a0e32104110038b0020038b
-0080038b000300a0038b00010020038b0040038b0002ffc0038bb3131632
-40b80383b20f1132b9ffc0037bb2303432b9ffc0037bb310183250411403
-7800010365036e0023001f037e036e001e001f0363036e001d001f036203
-64000d001fffc00340b30f1032804110033f0001033f03150029001f0341
-03160032001f0344031a001b001fffc00375b20e1132b9ffc00375b2282a
-32410a034303180032001f030f030d0034001f03080307b2321f20bb0340
-000100400388b3090b3240b80388b2101532bd038503070014001f038003
-07b2171f0fbd030a002f030a0002ffc00354b3090d3290410c035400a003
-540002001f036e0001009f036e00010040036eb2090b3241110345031c00
-16001f036b031d0015001f0346031e0015001f03a703a10046001f039db3
-261c1fc0bb0393000100400392b3090d3240b8033eb2083340b8033eb30d
-0e32c04109033e000100b0038e00c0038e0002ffc00390b3263832004126
-03280030032800020020037f0030037f00020010038a0030038a0050038a
-006f038a007f038a009f038a000600000389003003890002002f037a0070
-037700900377009f037a0004ffc00315b20f1032b9ffc00315b2242832b9
-03190318b2321f10bb031a0001ffc0031ab3090e3240b80318b2121332b9
-ffc00318b30c0e323fbd0373004f0373000200400374b31718326fbb032a
-00010040032cb3181b3240b80370b2090c32bd031703160032001fffc003
-16b20e1132bd031c031e0016001f031d031eb2151fb0411f031e0001000f
-031f000102ca02d00015001f02d302d5000d001f02cf02d0000d001f02cb
-02d0000d001f02cd02d0000d001f02ce02d0000d001fffc002d0b3090c32
-40b802d2b3090c32e0411c02e50001005f02dd009f02e5000202bb02c300
-30001f02da02b80032001f02d902b9003f001f02d802b80064001f02b902
-b80033001f02bab221c81fb802b8b321c81f40b8039bb20d1632b9ffc002
-c3b22b2f32b9ffc002c3b21f2532b9ffc002c3b2171b32b9ffc002c3b212
-1632412502c202c1001c001f02d702c10024001f02c102c00022001f02bf
-02c00018001f02c0027400c8001f02b50235003b001f02b40235003b001f
-02c402bc001e001f02b702b60038001f02b3b20ec81fb802b0b207c81fb8
-02afb206c81fb802aeb200c81fb802afb2502f1fbc02ae02ab001a001f02
-adb2261a1fb802a8b326241f0fbb0235000102a50274b21d1f12410a02a1
-015801f4001f02a000d801f4001f001202a2b237c81fb80290b2bc201fb9
-029002904018374025402d40a6033025302d30a6032025202d203720a620
-4110028e0005009f028b0001028b028b0037002002890030028900400289
-00900289b20437b041fd027400c0027400020080027400a0027400020060
-0274007002740002000002740010027400020080027400f002740002003f
-0285004f028500020090027e0090027f009002800090028100040090027a
-0090027b0090027c0090027d000400900274009002750090027700030070
-027e0070027f007002800070028100040070027a0070027b0070027c0070
-027d000400700274007002750070027700030060027e0060027f00600280
-0060028100040060027a0060027b0060027c0060027d0004006002740060
-02750060027700030050027e0050027f005002800050028100040050027a
-0050027b0050027c0050027d000400500274005002750050027700030040
-027e0040027f004002800040028100040040027a0040027b0040027c0040
-027d000400400274004002750040027700030030027e0030027f00300280
-0030028100040030027a0030027b0030027c0030027d0004003002740030
-02750030027700030020027e0020027f002002800020028100040020027a
-0020027b0020027c0020027d000400200274002002750020027700030010
-027e0010027f001002800010028100040010027a0010027b0010027c0010
-027d0004001002740010027500100277000300e0027e00e0027f00e00280
-00e00281000400e0027a00e0027b00e0027c00e0027d000400e0027400e0
-027500e00277b103d041c5027e00d0027f00d0028000d00281000400d002
-7a00d0027b00d0027c00d0027d000400d0027400d0027500d00277000300
-30027400400274000200c0027e00c0027f00c0028000c00281000400c002
-7a00c0027b00c0027c00c0027d000400c0027400c0027500c00277000300
-b0027e00b0027f00b0028000b00281000400b0027a00b0027b00b0027c00
-b0027d000400b0027400b0027500b00277000300a0027e00a0027f00a002
-8000a00281000400a0027a00a0027b00a0027c00a0027d000400a0027400
-a0027500a0027700030090027e0090027f00900280009002810004009002
-7a0090027b0090027c0090027d0004009002740090027500900277000300
-20027e0020027f002002800020028100040020027a0020027b0020027c00
-20027d00040020027400200275002002770003028101580801001f028001
-290801001f027f00ec0801001f027e00d80801001f027d00b10801001f02
-7c00a60801001f027b00820801001f027a00370801001f02770026080100
-1f027500200801001f0274001f0801b21f370f41160235004f0235005f02
-35006f0235009f023500af023500bf0235000700af023500cf023500df02
-3500ff02354022040f074f079f07af07bf0705af07e007020f064f069f06
-af06bf0605af06e0060220411b020d0001005f02350001008f0235000100
-7f023500ef02350002002f0235003f02350002003f0234004f0234000202
-350235023402344011ed20ef2a01cf2a01bf2a01af2a018f2a0141090247
-0104001e001f022000370201001f0158400c263e1fd8263e1f3726273e1f
-b8028eb6ec171fb226361fb801bcb226361fb80129402b26361fec26361f
-b126361fa626361f8226361f3726361f3226361f2d26361f2526361f1f26
-361f37262a1fb801584022263e1fd8263e1fbc263e1f27263e1f21263e1f
-20263e1f3700161600000012110840b9020d01a6b3c50d0009b801bcb227
-281fb801bbb227301fb801b8b2274f1fb801b7b227621f410901b6002701
-01001f01b5002002ab001f01afb21fe41fb801adb21fe41fb801acb21fbb
-1fb801a8b21f341fb8015db2272e1fb8015bb227cd1f410d0155001f0401
-001f0154001f0401001f0153001f0201001f0152b21f561fb80151b21f29
-1fb8012bb227261f410d012a00270125001f0129015800e4001f0125001f
-0401001f0124b21fe41fb80123b21f3b1fb80122b21f391f410d01080027
-0801001f0106002d0101001f0105001f0101001f0103b31fbb1fefb90158
-0401400b1fed1f931fec1fe41feb1fb80201b21fd920b80401b21fcf25b8
-0156400a1fbc2d9e1fbb1f411fb2410a01580401001f00b101580401001f
-00b001580401b51fa625891f9bb901580125b61f991f2e1f8e2db80801b5
-1f8d1f291f89b901580401b21f8220b802ab40131f801f301f742de41f73
-1f4a1f611f521f5d25b802abb21f5c1fbc0801001f0059015802abb61f50
-25891f491fb80125b21f4725b80401400b1f461f791f401f271f3920bc02
-ab001f003801580401b21f372dbc0125001f003201580125b61f2c1f341f
-2a25b80801b21f5537b80111402a07f00790075b0742073b07230722071e
-071d071408120810080e080c080a080808060804080208000814b8ffe040
-2b0000010014061000000100060400000100041000000100100200000100
-0200000001000002010802004a00b013034b024b5342014bb0c063004b62
-20b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807ff52
-b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ffb101
-018e851bb0124358b10100858d1bb900010119858d5959001816763f183f
-123e113946443e113946443e113946443e113946443e11394660443e1139
-4660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b182b1db096
-4b5358b0aa1d59b0324b5358b0ff1d594bb08153205c58b9020f020d4544
-b9020e020d45445958b90470020f455258b9020f04704459594bb0e45320
-5c58b90020020e4544b90027020e45445958b908420020455258b9002008
-424459594bb8012553205c58b90026020f4544b90021020f45445958b90a
-0d0026455258b900260a0d4459594bb8040153205c58b1d8204544b12020
-45445958b9250000d8455258b900d825004459594bb8040153205c58b901
-5800264544b1262645445958b923200158455258b9015823204459594bb0
-2953205c58b11f1f4544b12d1f45445958b9010d001f455258b9001f010d
-4459594bb02f53205c58b11f1f4544b1251f45445958b90135001f455258
-b9001f01354459594bb8030153205c58b11f1f4544b11f1f45445958b914
-28001f455258b9001f14284459592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65422b01b331757ec3456523
-456023456560234560b08b766818b080622020b17e754565234520b00326
-6062636820b003266165b075236544b07e234420b131c34565234520b003
-266062636820b003266165b0c3236544b0312344b100c3455458b1c34065
-44b23140314523614459b33f3c5841456523456023456560234560b08976
-6818b080622020b1583c4565234520b003266062636820b003266165b03c
-236544b058234420b13f414565234520b003266062636820b003266165b0
-41236544b03f2344b10041455458b141406544b23f403f45236144594569
-5342014b5058b108004259435c58b108004259b3020b0a124358601b2159
-421610703eb0124358b93b21187e1bba040001a8000b2b59b00c2342b00d
-2342b0124358b92d412d411bba04000400000b2b59b00e2342b00f2342b0
-124358b9187e3b211bba01a80400000b2b59b0102342b0112342002b2b2b
-2b2b2b2b2b00b01243584bb035514bb021535a58b1262645b04061445959
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b737373737345b040614418
-004569444569447373737473737374737473742b2b2b2b2b2b2b2b2b2b2b
-2b0073737373737373737373737373737373737373737373747474747474
-7474747474747474747474747474747575757374757575752b7300004bb0
-2a534bb036515a58b1070745b040604459004bb02e534bb036515a58b103
-0345b0406044b1090945b8ffc06044592b4569440174007373732b456944
-2b012b435c58400a0006000702a006a00702b9ffc00274b31a1d326fbd02
-77007f02770002ffc00277b22f3132b9ffc00277b322253240b80274b32f
-353240b80274b3282a3240b80274b21a2132b8ffc0b3371a1d32b8ffc0b3
-251a1d32b8ffc040112d1a1d329025902d9037a025a02da03706b8ffc0b6
-a61a1d321fa61fb8028eb22fa60300742b732b2b2b2b2b2b2b2b742b7374
-59002b2b435c58b9ffc002a1b21c1d32b9ffc002a0b21c1d322b2b592b73
-012b2b2b2b002b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b012b2b2b2b2b
-2b2b73742b2b2b2b2b2b2b2b73732b2b2b2b2b2b732b732b2b2b742b2b2b
-73737373732b73732b2b2b732b2b002b2b2b2b7374732b732b2b2b2b752b
-2b2b2b2b2b2b2b752b2b2b2b2b732b2b2b2b7374752b2b7373732b2b2b73
-2b737374752b2b7374752b2b7374752b2b2b2b2b2b2b2b2b2b2b2b74752b
-000000>
-[16305 16261 16301 15993 16353 16361 16377 15773 16093 16113 15821 16109 16365
-15025 16197 16361 15857 16053 15881 16233 16301 15449 16065 16377 15477 15965
-16117 15425 15557 16353 16369 11749 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-2 1942 9 <0003005affda05a605d30022002e0038010240780b110a2f1a11192f371f
-37309d24a60ea919a520a924a62e0c090406231904172325032a1d262138
-309423ed03e61a0b1c1c1a1d1d0d1919182323202f2f3038380d0d322f23
-19032c381c1a030426201d01030016000306382f23201d1c1a190d093529
-6113013547060b010b001a3a269b10162f160216b80184400d0a2c9b0f10
-1f109010a0100410b8011e400f329b0f0a1f0a300a030a19394d7c182b4e
-10f45d4dfdfd5ded10fd5ded4e10e6003f3f4ded3fed1117391239390111
-12173912173911173912398710083c0710083c8710083cb10602435458b3
-e4230123b8ffe0b3090e341ab8ffe0b7090e340310090e34002b2b2b5d59
-3130005d015d250726270606232027263534363726263534363332161514
-060713363717060607161601373635342623220615141703060615141633
-32363705a6aa7d7359c88afeee8a6ba8a74b4cd5c5bed66aa1cc241afe26
-38202f95fd264c545145434c402961607764427a48b3d93d6b504c9a779b
-8de15359a14885b9c28c59a065fef340673a877d2a2c69030c3a4140364c
-432c344afe7f318a485b73343c00>Arial-BoldMT AddT42Char 
-2 8582 38 <00010061ffe7055e05d3001a00d6404e8609891489169f009806c709d403
-d40bf503092509280c280d29142916750575098605080713071717131717
-29022a03250507280599059709c903c50b053f014f01020152100001e000
-f0000200b8ffc0b311183400b8ffc0b30a0d3400b8015a4017182d04080e
-400e12340e4b5f0f014f0f010f401518340fb801284022122d0a030fef0e
-5600ef00014f0102011a301c011c1527a007010f071f0730070307b8028c
-b31b7e53182b4e10f45d714ded4e105df65d4dedf4ed003ffdf42b5d71e4
-2b3ffdf42b2b5d71e45d3130005d015d5d5d010506042320001110002120
-171617052626232206111016333236043f011f42fecdecfedcfe88017a01
-34010da86432fedb1aa576a3cbc8a076aa021b5bf0e9018f015a016e0195
-9f5eb0467284eafefafeeaec9600>Arial-BoldMT AddT42Char 
-2 9476 42 <00010062ffe705bd05d3002000d84046381e4b1e56077608760c8508840c
-8517841b090617061b1217121b28112818281a281e08480b5b0454095a0b
-6a047b047a18741ab60eb610c70dc610d710e7100e031c062000b8ffc040
-1f1a391f00010025020101161c2d060912400e1234124b4f130113401518
-3413b80128402a162d0f0300010120195f130113271256021f202003021a
-2022302202221927a00a010f0a1f0a300a030ab8028cb3217e9f182b4e10
-f45d714ded4e105df63c4dfd3c10f4ed711112392f3c003ffdf42b5de42b
-3fed11392f3cfd712b3c1112393130005d015d5d01352111060423222402
-3534123736332004170526262322061510123332363735033f027e5dfe9f
-b5e6feaaacc0b98dd2011101332cfeda1fab80c2e5e8bc5dbb43021bf7fd
-b85a89c10167d3e501645f49e5ca376c7df6f2fefbfefb4934ba>Arial-BoldMT AddT42Char 
-2 10014 44 <0001008c000001b405ba0003006fb90005ffc0b332343405b8ffc0b32325
-3405b8ffc0403f1417340005400550058005e005051f0560057005f00504
-8005010201020300080203d9010000b000e00003c000f0000220003000d0
-00e00004006e04319f182b4e10f45d71723c4dfd3c003f3c3f3c3130015d
-71722b2b2b331121118c012805bafa46>Arial-BoldMT AddT42Char 
-2 10766 47 <0001009d000004a505ae0005003d401a5007010201020403250500080405
-1a0702032001200030000200b8028bb30631b9182b4e10f45d3c4dfd3c4e
-10fe3c003f3c4dfd3c3f3c3130015d3311211121159d012802e005aefb49
-f700>Arial-BoldMT AddT42Char 
-2 10858 48 <000100910000061905ba000c0218400b0b032608260b0304030103b8ff80
-40091c3a340a203a3b3409b8ffe0b33a3b3409b8ffe040a41c2e340a201c
-2e340609080ae309ec0a0404090a0a13021c0410091f0a23022c0420092f
-0a6702680465096a0a77027804a409aa0ab509ba0af609fa0a169f049009
-9f0ac609c90ad702d804d609d90ae702e804e509ea0a0d7709780a83028c
-0483098c0a900207580b65026a046709680a760279040744024b0444094b
-0a57085709580a07180a2f0e34023a0434093b0a3f0e0703020c04060909
-0a15021a04170907b10602435458401f0204030a09050c070732060e0c32
-0000031003020850080d340b50080d3403b8ff80400e0b0d3408400e2734
-0b400e273403b8ff9c40100e2734030b08030100040102070a0008003f3c
-3c3f3c111217392b2b2b2b2b2b5d012fed10d4ed111217391bb8ff3b402d
-030a09200408090932030414030304020b0a0a320302140303020b080303
-0c0402020c0a0a090907081f0e010eb8010db307060504ba02380005ffc0
-b35b5d3405b8ffc0401753543405320740077f080108bd7f030103bd0b20
-0b0c02b802384012010000405b5d34004053543400321f0c010cb8010db3
-0d3175182b10f471ed2b2b103cee103c1a1910fd71fd713c1a1810fd2b2b
-ee103c10e471003f3c103c103c3f3c12173987052e2b877dc4872e182b87
-7dc42b593130014bb0135358b90008ffe0b10b20383859015d5d5d5d5d5d
-71722b2b2b2b002b715d331121010121112111012101119101bb010a0107
-01bcfeedfeddfee3fede05bafc1803e8fa460482fb7e0482fb7e>Arial-BoldMT AddT42Char 
-3 434 68 <00020049ffe8042e043e0023003201714068071a081c051d161a4a1b481c
-4925db10df11093619461957266619672686269219931aa61ab91bc71ac8
-1b0c06060d151606191627062915591977028602a606b506c6060cbf34d9
-10021d243231112c0d24402b2e3424402228342440191d346f24fc240224
-461db8ffc040300e0f343d1d01001d101db01df91d041d1d2c013300400e
-0f340f001f0002005521401c113f21401b103f2140181a3421b80274b504
-070c0d0a2cb8ffc0b31c113f2cb8ffc0b31b103f2cb8ffc0b3181a342cb8
-02744040140b1e3126082909280d591f0c9f0c021f0c01ff0c010c400e16
-340c1a4f340134600001008e300101013329215f1701df17014f175f176f
-17031719336941182b4e10f45d71724dedf471ed5d4e105df62b5d71724d
-edf4e4fd3c003fed2b2b2b3f3c3ffd2b2b2bf45d2be412392f5d712bb106
-02435458b22f1d017159edb10602435458b90024ffc0b71b1d3454246424
-025d2b595d2b2b2b111239030e103c3c3c313001715d005d710127363633
-321616150314161721262726270606232226353436363736373534262322
-060106060706151416333237363736350165ff2bd2cfbcb84b031b25feea
-0b10070348a45da4bd569b92c54c506f4b54015e36ea243758444c453310
-0b02e22e9a945989b7feb88c854c1c3719084646b2885a8d4b1c25201c51
-453bfed2123218273c3b563226372465>Arial-BoldMT AddT42Char 
-3 960 69 <00020087ffe8049405ba000f001c009db90012fff840310b39371b471b02
-125606560a56165618591cf7070635043b0d3b13351b45044b0d4b13451b
-940799090a0c0e010201001ab80274b2050714b8027440130b0b0f000a17
-21081a701e011e10290203260fb80129400c01700080000200191d3f4118
-2b4e10f4713c4dedfd3ce64e1071f64ded003f3c3fed3fed3f3c31300071
-5d015d4358400b6606660a66166618691c055d59005d2b33112111363332
-1211100023222627151314171633323635342623220687011982b2c2fefe
-fdb95bb140123449795d838467658605bafdf094fee7fef9fef0feda5b59
-9c022aa54f709fabb6a19d00>Arial-BoldMT AddT42Char 
-3 1212 70 <00010055ffe8043f043e001900e14051580f59125916680f691269167d18
-79199702970cc610c618d710d618e906e908e913e915f80613381338154a
-124a164618590c690c073a1237163718037705770f8705860f8919a812a7
-16b912b616090eb8ffc0b3181b340eb8ffc0b51214340e330db8ffc0b319
-1e340db8ffc0b30f11340dba0104000a02744012110b0040181b34004012
-1434003390010101ba0101000402744020170701401214340121002f0d40
-1214340d214f0e010e1a1b072114191a5841182b4e10f44ded4e10f65d4d
-ed2bf4ed2b003ffdf45de42b2b3ffdf42b2be42b2b3130005d7101715d01
-052626232206151416333236370506062322001110003332160431feeb0e
-634f697d7f6b50661501142bf4cde9feeb0116edc2e502ec32535491aabd
-9c5b6f2fbec20126010401070125a700>Arial-BoldMT AddT42Char 
-3 1768 72 <00020041ffe80427043e0014001c01a3b90010fff840460b3999099a0d96
-10a805a70abb09bb0db81a0808140148024706460a4f1ea80db606b61ac7
-0ac80cd60ad80cf807f70d0d1c0f1c15401b1d3415400e11340f15bf15cf
-150315b8ffc0b30f1e3f15b8ffc0b30e173f15b8028d400c0f0e12500e60
-0e020e181201b8ffc0b6191b3401331200b8ffc0b31d203400b8ffc0b322
-293400b8ffc0b32b2d3400b8ffc0b3181c3400b8ffc0400f0e0f34a00001
-0000100002005f1212b80274b3040b1218b8027440240b070021012f1521
-4f0e010e1a2f1e5f1e6f1e9f1e041e0f2108400d0f3408191d6941182b4e
-10f42b4ded4e105df65d4dedf4ed003fed435c584014184028143f18401e
-0f3f18401b103f18401c113f2b2b2b2b593ffd435c58b90012ffc0b32814
-3f12b8ffc0b31e0f3f12b8ffc0b31b103f12b8ffc0b21c113f2b2b2b2b59
-f45d712b2b2b2b2b435c58b90000ffc0b2123900b8ffc0b2173900b8ffb0
-b3090a3e00b8ffc0b241213f2b002b2b2b59e42b1112395d435c5840140e
-400f1e3f0e401c113f0e401b103f0e400e173f002b2b2b2b592f3cfd2b2b
-722b2b3c0111333130015d71005d2b010506062320272635100033320003
-211616333236132626232207061702fa011836e9affeeb85690114d3ed01
-1206fd40038261425a270378565c3c3c0101522f9aa1b591dd0108012bfe
-c7febd7d8b48016c7a7f43437300>Arial-BoldMT AddT42Char 
-3 3024 75 <000100920000045905ba001600b2402b0f011f0139013302331042014211
-de01f9010907051605240258116811050101021314111213031402010fb8
-0274401d0307090a0a14150a1600000b0a26080940202434af0901ff0901
-091a18b8ffc040162224349018a018027018f01802ef1801180014261615
-b8ffc0400f202434a01501f015011519173f3c182b4e10f471722b3c4dfd
-3c4e105d71722bf671722b3c4dfd3c003f3c3f3c3c103c3fed3939111739
-030e103c083c3130015d005d01113633321e021511211134262623220606
-1511211101ab88bd619c4f1dfee720513d466e33fee705bafde59f487088
-8ffd910231a75a35448986fdec05ba00>Arial-BoldMT AddT42Char 
-3 3280 76 <00020093000001ac05ba000300070077b90009ffc0403f110a3f40095009
-028009b009c009d009ef09051f0960097f09a009b0090503060700050403
-0f00014000d000e00003005d02010006050607040a0207260104b8ffc040
-092124340419083f3c182b4e10f42b3c4dfd3c003f3c3f3c3f3cfd5d713c
-0305103c3c103c3c313001715d722b1311211101112111930119fee70119
-04b60104fefcfb4a0426fbda>Arial-BoldMT AddT42Char 
-3 4502 81 <0001009100000459043e0016009f4018071317135a08680804b804013408
-34104408440fe9100506b80274401d11070e0d060c0b0b01000a02012616
-0040202434af0001ff0001001a18b8ffc040162224349018a018027018f0
-1802ef1801180a0b260c0eb80129b20d0d0cb8ffc0400f202434a00c01f0
-0c010c19173f3c182b4e10f471722b3c4d10ed10fd3c4e105d71722bf671
-722b3c4dfd3c003f3c3c103c3f3c3fed3130005d01715d21211134262623
-2206061511211121153633321e02150459fee724513949742bfee701058b
-d35d9a4f1f021eac65385084b2fe1f04269cb44368847b00>Arial-BoldMT AddT42Char 
-3 4976 83 <0002008bfe6c0497043e0010001c009a402e3813481302123403390d3913
-341b4403490d4913441bf91b095606560a591256165618591cf607f91b08
-0100061ab80274b2050714b8027440160b0b100f0e1721081a701e011e11
-290e0e0f26101001b80129400b700080000200191d3f41182b4e10f4714d
-ed3c10fd3c10e44e1071f64ded003f3c3fed3fed3f3c3130015d005d0143
-58400d6606660a691266166618691c065d59005d13211536363332001110
-002322262711210114163332363534262322068b010633ae6ab90102fefc
-b9588f4ffee701168e6662828663678804269c5064fedefefdfef6fed946
-55fde903b9b3ab9db3a7a29f>Arial-BoldMT AddT42Char 
-3 5486 85 <0001008700000337043e001000a84028970501090e01530566057505032f
-12580e680e7012040a090f0c1f0c028f0cff0c023f0c4f0c020cb8027740
-29070701000a0302060a28000910093009700904091a7f129f12025f127f
-12af12d01204121000260103b80129400b02028001a001020119113fb901
-1c00182b4e10f4713c4d10ed10fd3c4e105d71f65d194de400183f3c3f3c
-3fed5d717239323130015d005d71004bb017534bb035515a58b10a323859
-005d212111211536363332170726232206061101a0fee70105436b446059
-57473d3b522f0426976b4435f52e41aafef1>Arial-BoldMT AddT42Char 
-3 5714 86 <00010030ffe80410043e002a02c240c00611062308271711172398129814
-9727952a09071446140212bb0db90ec721e523f80df62206290d550d650d
-950b9712a722b90c07412340244426672264268712871486228324093726
-4506460b4a0d4f0f462142220722242726370c352135223523352407060a
-05110921180d270c22222223072422402c730c781479157629752a881584
-2a9a15952ab422b4230d80018f178c18992aa92ab02c0617211640212334
-16401c1f341f1601df16011633082150258f25022540181d34251a2cb8ff
-c04017110a3f502c01302c012f2c012c1e213010011033012100b8ffc0b3
-0f093f00b8ffc0b3110a3f00b8ffc04009090d3400192b78b8182b4e10fc
-2b2b2b4dedf471ed4e105d71722bf62b714dedf471722b2bed00b1060243
-54584035060101060116012622362146215401591764016917f6010a0117
-02041a21220228130d0c02281a5f04010446280b501a011a4613073ffd5d
-3ffd5d1112173911121739111217395d711bb90022ffcbb3282a3421b8ff
-cbb3282a3422b8ffe0b31e243421b8ffe0b31f243422b8ffe0b3191a3421
-b8ffe0401b191a346b0d0136224622980d9422c422d4220621220c0d0404
-1a00b8ffc0b5191b34003301b8ffc0b3172d3f01b8ffb0b3090a3e01b8ff
-c0b322253401b8ffc0401d1a1c3400013001400150010460018001f00103
-00011001500160010401b8ffc0b313163401b80101404d0004015f04f004
-020446280b1640191b3416331740172d3f1740090a3e174035373417402b
-2e34174025293417401a1c340f171f175f176f170417551a402224340f1a
-01501aff1a021a4613073ffd5d712bf45d2b2b2b2b2b2be42b3ffd5d71f4
-2b5d71722b2b2b2be42b111217395d712b2b2b2b2b2b59313001715d0071
-7171715d5d435c58b90024ffc940090b123f0f280b123f21b8ffecb60d39
-0c140c3921b8ffecb20c3922b8ffeab10b39002b2b2b2b012b2b5900715d
-132516163332373635342726272427263534363332161705262623220706
-1514171604171615140623222630011a126e636d3725141549feac5b7eda
-e5dad428fef7115f586f30201c2601c15958f4efd9fd012f2b5255281c2f
-201514114b3e56998abc8e8b313e421f16231e151c664a4b8692d2b0>Arial-BoldMT AddT42Char 
-3 6552 87 <0001001fffe80291059d001900cd402920002001230a290f3a0e4a0e590f
-07191500180316150017121314011712021401180309070a070c18b80101
-400f0017a017b017036017a017c0170317b80104b2150114b80274b30015
-0607b80274400e0c0b092f0a2f00002f015f010201b80104402818032617
-1255153f149f14af1403601480149014d014f01405001410142014301404
-14191a78a0182b4e10f45d71724bb037534bb03b515a58b90014ffc03859
-3c4dfc3cfd3cf45d3c10f419e400183fed3f3cfd3c10f45d71e411123911
-330f0f0f0f3130015d011523111416163332371706232226262726351123
-3533352511027ac00b271c274a18627c4c7a390b098181011a0426e0fe54
-822b1c1bda2a335145319501cfe0d3a4fe89>Arial-BoldMT AddT42Char 
-3 8496 92 <0001000efe510452042600130134b41228050113b8ffe040180c0f340816
-0d0f3407160d0f3406160d0f3405160c0f3402b8ffc0401f1a3a34050606
-040d0b0e061002001306041302040303010100061360100110b801af4012
-0b0f0d2f0e280020153015601503f0150115b8ffc0b322263415b8ffc040
-121c1e341517171a043903401819347f030103b80127400902401819347f
-020102b801274012013900401c36342000300002001914c4a0182b4e10f4
-5d2b4dfd19f45d2bf45d2b18fd4e456544e62b2b71724d10f4e4003fed5d
-2f3f3c103c103c0112391139001112391239391139070e103c3130002b01
-2b2b2b2b2b5d4bb010534bb03a515a58b2041000bafff00001fff0b10310
-013838383859435c58b90005ffe8400e0d113f131013193f131012183f05
-b8fff0b313193f05b8fff0b212183f012b2b2b2b2b59132113132101070e
-032322272716333236370e012bfef80123fe89432543577f50514e194235
-625e190426fd0e02f2fc02b95d623d2211dc0d735900>Arial-BoldMT AddT42Char 
-2 0 0 <00020100000005000500000300070042b40201fe0607b8023f4013000504
-fe03000a0704fe010019080605fe0203bc0126000901b0011800182b10f6
-3cfd3c4e10f43c4dfd3c003f3cfd3c10fc3cfd3c31302111211125211121
-01000400fc2003c0fc400500fb002004c000>Arial-BoldMT AddT42Char 
-Arial-BoldMT /CharStrings get begin
-/ampersand 9 def
-/C 38 def
-/G 42 def
-/I 44 def
-/L 47 def
-/M 48 def
-/a 68 def
-/b 69 def
-/c 70 def
-/e 72 def
-/h 75 def
-/i 76 def
-/n 81 def
-/p 83 def
-/r 85 def
-/s 86 def
-/t 87 def
-/y 92 def
-end
-Arial-BoldMT /Encoding get
-dup 38 /ampersand put
-dup 67 /C put
-dup 71 /G put
-dup 73 /I put
-dup 76 /L put
-dup 77 /M put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 101 /e put
-dup 104 /h put
-dup 105 /i put
-dup 110 /n put
-dup 112 /p put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 121 /y put
-pop
-end
-%ADOEndSubsetFont
-/KUDFNU+Arial-BoldMT /Arial-BoldMT findfont ct_VMDictPut
-/KUDFNU+Arial-BoldMT*1 
-[38{/.notdef}rp /ampersand 28{/.notdef}rp /C 3{/.notdef}rp /G /.notdef /I 
-2{/.notdef}rp /L /M 19{/.notdef}rp /a /b /c /.notdef 
-/e 2{/.notdef}rp /h /i 4{/.notdef}rp /n /.notdef /p 
-/.notdef /r /s /t 4{/.notdef}rp /y 134{/.notdef}rp]
-KUDFNU+Arial-BoldMT nf
-KUDFNU+Arial-BoldMT*1 [14.04 0 0 -14.04 0 0 ]msf
-402.375 400.185 mo
-(Graphics)
-[10.9231 5.51782 7.80624 8.52216 8.52219 3.95926 7.80624 0 ]xsh
-408.749 416.682 mo
-(Library)
-[8.52219 3.95926 8.52219 5.51782 7.80624 5.51782 0 ]xsh
-427.001 433.053 mo
-(&)sh
-397.756 449.297 mo
-(Interpreter)
-[3.95929 8.52216 4.67523 7.80621 5.51785 8.52216 5.51782 7.79221 4.6752 7.6799 0 ]xsh
-258.254 388.04 mo
-(CMM)
-[10.0807 11.8777 0 ]xsh
-/KUDFNU+Arial-BoldMT*1 uf
-/KUDFNU+Arial-BoldMT uf
-/Arial-BoldMT uf
-360 60 mo
-558 60 li
-558 222 li
-360 222 li
-cp
-@
-384 65.875 mo
-423.5 65.875 li
-423.5 80.25 li
-384 80.25 li
-cp
-3.0518e-5 3.0518e-5 3.0518e-5 3.0518e-5 cmyk
-f
-380.125 126.125 mo
-436.625 126.125 li
-436.625 134.375 li
-380.125 134.375 li
-cp
-f
-377.25 177.5 mo
-444.625 177.5 li
-444.625 186.25 li
-377.25 186.25 li
-cp
-f
-gsave
-396.006 89.99 mo
-424.512 89.99 li
-424.512 121.246 li
-396.006 121.246 li
-cp
-clp
-396 89.7523 mo
-424.505 89.7523 li
-424.505 121.256 li
-396 121.256 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.5033 396 450.248 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-.75021 .679683 .670222 .90164 cmyk
-%ADOBeginSubsetFont: ArialMT Initial
-ct_T42Dict begin
--0.664 -0.324 2 1.004
- 256 array 0 1 255 {1 index exch /.notdef put} for  /ArialMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f3210325d73000000cc000000606376
-7420a11cd7eb0000012c000006546670676dcc79599a000007800000066e
-676c796607022dca000094e0000822cc68656164d6144b3e00000df00000
-003668686561123315fe00000e2800000024686d7478f65efffb00000e4c
-000034d46c6f6361361cd72000004320000034d86d617870124c05df0000
-77f8000000206e616d659617a74000007818000011057072657025d64dbf
-0000892000000bbe67646972000000000000000000000000000303880190
-00050008059a05330000011b059a0533000003d1006602120805020b0604
-020202020204e0002affc00078430000000900000000544d432000400020
-fffc05d3fe510133073e01b2400001ffffff0000042605bb000000200004
-05ba001905ba001a05a70019042600180000ffe70000ffe80000ffe7fe69
-ffe805ba0019fe69ffe802ea000000b8000000b80000000000a800ad0169
-00ad00bf00c201f0001800af00b900b400c800170044009c007c00940087
-0006005a00c80089005200520005004400940119ffb4002f00a1000300a1
-00cd00170057007e00ba00160118ffe9007f008503d300870085000d0022
-00410050006f008d014cff75005c00df04830037004c006e00700180ff58
-ff8eff92ffa400a500b903c8fffd000b001a0063006300cdffee05d8ffdc
-002d005c0095009900df019209b500400057008000b9039d0072009a035d
-0401ff67fffa00030021007700cd0004004d00cd01c0022b004c006500e7
-0118017c034305d8ffa3ffb0ffc40003001c005d0068009a00ba01350147
-0221055cff4dffcd0016002d00780080009900b200b600b600b800bd00da
-010c05f0ffa4fff00019002c0049007f00b400ce01c003fefd81fe3f0000
-00050018002900390049006f00be00c700d0012301c1026f050c05320540
-057affd4001400310055005700a700b400e601f7027e027e027f03c60446
-ff42000e0085009100bf00c200c500e1011a012f014f01560229026f029e
-03720008002c00310031006400690089009800c700de012b01b6020c02cf
-03a304ab04fb061dfee0ff0e00060026009b009d00c1010d011801200173
-018201d601e30243025f029b02e2039404a904d20761001c005e006d008d
-00ab00f7011201380151015b0168017c01870191019901cd01d001e80241
-0254026b02ef0368037103bd044204420453047304830586058b06e8fe58
-fec4fed1fef7ff32ff860051007c008100910095009e00b400b900cf00d9
-00d900df00e20105010b010e010e012001210155017b017b017e018d01a2
-01a801a901b401d001d001e201e901f201f501fb020002000206021b0221
-022202220223027202770294029c02cf02cf02d002ec02f903170322032b
-0335033c0359036f037103870390039003b503e1041a04cf04ff05320532
-0596059f05a805ab05c205f0060c0782080008ccfca3fd2afddefe00fe88
-fe96feb2feb4ffe100150019001a001c001f003c005100610061006a0078
-009600a500af00d3010c0118011a012a013e014c0151015f016a01710178
-01820184019a01a501a801a901ae01bc01cd01d701ef0200020d021c0221
-0222022e02350242024f024f025e026502710290029202b402d602fa0307
-030b030f0315032a0347035d036503740379039603b003cc03dd03e203f6
-03fc03fc03ff040a041f04220426042b0447045f0475049e04e704e7055c
-05cb05e5060a066d068606b806f10736073e07500751075d078f07b607d4
-086000b600c300b500b700000000000000000000000001e00381034503b5
-008e0233041902ce02ce002d005f0064034d023f000002a80188027d01b4
-02240578063b023b014e00f00426029402c6029f02f6023b034d014b0153
-006a0231000000000000061404aa0000003c04c300ed04bc026502ce03b5
-0078060c017e02ef060c00b201000239000001c50330042b03cb00da03df
-010704a100db040a011701ed02a70350010b01bd043e05580021039c00ae
-0371017d00b5024500000afb088c012b014e01aa00870054013201f803ff
-0003024e00b4003703e30083006b02d800ed00770088009701640467008e
-0033017c00e700a6029e0329056e062a061501c90269048a021301b40002
-04a9000002390124010305140084015d039a06ef02d9007500cf040a00de
-03ac04bc02cf02ae034d04f005520168006d007d00860071ff8100790558
-04d2016700030156002504e00094007c033204210094007f0072005c002f
-00b6001800ba00b80041034d00720018001f004c016a01550099009a009a
-009800b200040078006900140057006e00ce00b4065402b80067050e0165
-00e7000004cbfe52005affa60099ff67006eff92002dffd40087ff7c00b8
-00a800e5008f00a80185fe7b0070001e00d900de014c054602cf0546ff2d
-028a02d90253029600b700000000000000000000000000000125011800ea
-00ea00ae0000003e05bb008a04d70053003fff8cffd50015002800220099
-0062004a00e4006d00ee00e5004803c00033fe4e02b1ff460370007905df
-0051ffa7ff1f010a0068ff6c004f00bc00a507050061072b00ed04b001d2
-00b6007b00650252ff740365fe690094008f005c00400086007500890089
-4043555441403f3e3d3c3b3a3938373534333231302f2e2d2c2b2a292827
-262524232221201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09
-0807060504030201002c4523466020b02660b004262348482d2c45234623
-6120b02661b004262348482d2c45234660b0206120b04660b00426234848
-2d2c4523462361b0206020b02661b02061b004262348482d2c45234660b0
-406120b06660b004262348482d2c4523462361b0406020b02661b04061b0
-04262348482d2c0110203c003c2d2c20452320b0cd442320b8015a515823
-20b08d44235920b0ed51582320b04d44235920b09051582320b00d442359
-21212d2c20204518684420b001602045b04676688a4560442d2c01b10b0a
-432343650a2d2c00b10a0b4323430b2d2c00b0172370b101173e01b01723
-70b10217453ab10200080d2d2c45b01a234445b01923442d2c2045b00325
-456164b050515845441b2121592d2cb00143632362b0002342b00f2b2d2c
-2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b1
-2cc08a8cb8100062602b0c642364615c58b00361592d2c45b0112bb01723
-44b0177ae4182d2c45b0112bb01723442d2cb01243588745b0112bb01723
-44b0177ae41b038a45186920b01723448a8a8720b0a05158b0112bb01723
-44b0177ae41b21b0177ae45959182d2c2d2cb0022546608a46b040618c48
-2d2c4b53205c58b002855958b00185592d2c20b0032545b019234445b01a
-23444565234520b00325606a20b009234223688a6a606120b01a8ab00052
-7921b21a1a40b9ffe0001a45208a54582321b03f1b235961441cb114008a
-5279b31940201945208a54582321b03f1b235961442d2cb110114323430b
-2d2cb10e0f4323430b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2c
-b10e0f432343650b2d2cb11011432343650b2d2c4b525845441b2121592d
-2c0120b003252349b04060b0206320b000525823b002253823b002256538
-008a63381b212121212159012d2c4bb06451584569b00943608a103a1b21
-2121592d2c01b005251023208af500b0016023edec2d2c01b00525102320
-8af500b0016123edec2d2c01b0062510f500edec2d2c20b001600110203c
-003c2d2c20b001610110203c003c2d2cb02b2bb02a2a2d2c00b00743b006
-430b2d2c3eb02a2a2d2c352d2c76b8022323701020b802234520b0005058
-b00161593a2f182d2c21210c6423648bb84000622d2c21b08051580c6423
-648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb815
-55621bb200802f2b59b002602d2c0c6423648bb84000626023212d2cb400
-0100000015b00826b00826b00826b008260f10161345683ab001162d2cb4
-000100000015b00826b00826b00826b008260f1016134568653ab001162d
-2c4b53234b515a5820458a60441b2121592d2c4b545820458a60441b2121
-592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb01343
-58031b02592d2cb0134358021b03592d2c4b54b012435c5a58381b212159
-2d2cb012435c580cb00425b00425060c6423646164b807085158b00425b0
-0425012046b01060482046b0106048590a21211b2121592d2cb012435c58
-0cb00425b00425060c6423646164b807085158b00425b00425012046b8ff
-f060482046b8fff06048590a21211b2121592d2c4b53234b515a58b03a2b
-1b2121592d2c4b53234b515a58b03b2b1b2121592d2c4b53234b515ab012
-435c5a58381b2121592d2c0c8a034b54b00426024b545a8a8a0ab012435c
-5a58381b2121592d2c4b5258b00425b0042549b00425b00425496120b000
-5458212043b0005558b00325b00325b8ffc038b8ffc038591bb040545820
-43b0005458b00225b8ffc038591b2043b0005458b00325b00325b8ffc038
-b8ffc0381bb00325b8ffc03859595959212121212d2c462346608a8a4623
-20468a608a61b8ff8062232010238ab902c202c28a70456020b0005058b0
-0161b8ffba8b1bb0468c59b0106068013a2d2cb1020042b123018851b140
-0188535a58b910000020885458b202010243604259b12401885158b92000
-0040885458b2020202436042b12401885458b2022002436042004b014b52
-58b2020802436042591bb940000080885458b202040243604259b9400000
-8063b80100885458b202080243604259b94000010063b80200885458b202
-100243604259b94000020063b80400885458b20240024360425959595959
-2d2cb0024354584b53234b515a58381b2121591b21212121592d00000001
-00000005028fa58dc35f5f0f3cf5081b080000000000a2e3272a00000000
-c14fd713faaffd671000080c00000009000100010000000000010000073e
-fe4e00431000faaffa7a1000000100000000000000000000000000000d35
-06000100000000000239000002390000023900b002d7005e047300150473
-0049071d0077055600580187005a02aa007c02aa007c031d004004ac0072
-023900aa02aa0041023900ba0239000004730055047300df0473003c0473
-00560473001a047300550473004d047300610473005304730055023900b9
-023900aa04ac007004ac007204ac00700473005a081f006f0556fffd0556
-009605c7006605c7009e055600a204e300a80639006d05c700a4023900bf
-04000037055600960473009606aa009805c7009c063900630556009e0639
-005805c700a10556005c04e3003005c700a105560009078d001905560009
-0556000604e300290239008b023900000239002703c100360473ffe102aa
-00590473004a0473008604000050047300460473004b0239001304730042
-0473008701c7008801c7ffa20400008801c7008306aa0087047300870473
-0044047300870473004802aa00850400003f02390024047300830400001a
-05c700060400000f040000210400002802ac0039021400bc02ac002f04ac
-00570556fffd0556fffd05c70068055600a205c7009c0639006305c700a1
-0473004a0473004a0473004a0473004a0473004a0473004a040000500473
-004b0473004b0473004b0473004b023900bd023900230239ffe502390009
-047300870473004404730044047300440473004404730044047300830473
-0083047300830473008304730049033300800473006b0473001b04730051
-02cd006d044c000104e3009905e5000305e50003080000e102aa00de02aa
-003d0464004e080000010639005305b4009a0464004e0464004d0464004d
-0473fffd049c00a003f4003805b4007a069600a1046400000231000002f6
-002f02ec002d0625007f071d004404e3008104e3009e02aa00e804ac0072
-046400540473002e0464003304e5001a047300860473008c080000ef0556
-fffd0556fffd0639006308000081078d00520473fffc0800000002aa0053
-02aa004701c7008001c7006c0464004e03f4002f04000021055600060156
-fe390473ffe402aa005c02aa005c040000170400001704730049023900b9
-01c7006c02aa0047080000250556fffd055600a20556fffd055600a20556
-00a20239008d0239ffe00239000402390015063900630639006306390063
-05c700a105c700a105c700a1023900c602aa001902aa000602aa001d02aa
-002e02aa00e502aa00a202aa006b02aa003a02aa004b02aa002804730000
-01c700030556005c0400003f04e3002904000028021400bc05c7fffd0473
-004905560006040000210556009e0473008704ac007204ac00a102aa006b
-02aa001902aa002106ac006b06ac006b06ac0021047300000639006d0473
-0042023900b10556005c0400003f05c700660400005005c7006604000050
-04730046046bffe102aa00ee0556fffd0473004a0556fffd0473004a05c7
-009e04eb004705c7fffd055600a20473004b055600a20473004b04730096
-01c7004204730096025500880473009a02ac008305c7009c0473008705c7
-009c04730087063900630473004405c700a102aa008505c700a102aa003c
-0556005c0400003f04e300300239002404e300300300002305c700a10473
-008305c700a10473008304e300290400002804e3002904000028046800a4
-063900600662005504a00048047400480391006204f000440329002e0530
-0048046bffe1040000b002eb005208c000330800004f040000990800004f
-040000990800004f040000980400009807d5016a05c0009e04ab007204d5
-009d04ac007104d5022204d5010505abffe9050001c905ab027e05abffe9
-05ab027e05abffe905ab027e05abffe905abffe905abffe905abffe905ab
-ffe905ab01c005ab027e05ab01c005ab01c005abffe905abffe905abffe9
-05ab027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab
-01c005ab01c005abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905abffe905abffe905ab02d605ab006605abffea05d5ffff04d50092
-0800000007eb013007eb012007eb013007eb012004d500b204d5008004d5
-002a082b0198086b01b807550010060000f40600006f0440003a05400037
-04c0003f04150040040000250600005505e100bf038d008904d5ffd90180
-008002d50086071500610296000f04d5009202d6008302d6008304d500b2
-02d600700556fffd0473004a05c700660400005005c70066040000500556
-00a20473004b055600a20473004b055600a20473004b0639006d04730042
-0639006d047300420639006d0473004205c700a40473008705c7001f0473
-00060239ffce0239ffce0239ffe40239ffe40239fff60239fff50239004b
-01c700190400003701c7ffa20556009604000088040000860473009601c7
-fffa05c7009c0473008705c900a50473008b063900630473004406390063
-0473004405c700a102aa006b0556005c0400003f04e300300239000c05c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-078d001905c70006055600060400002101c700890556fffd0473004a0800
-0001071d00440639005304e30081023900b9078d001905c70006078d0019
-05c70006078d001905c70006055600060400002101c7008a02aaffe10473
-001b04cd005a06ac006b06ac002206ac002206ac004a02aa00e202aa006b
-02aa00de02aaffea0557ffff0646ffa706b4ffa80312ffa80632ffa706d8
-ffa70605ffa701c7ff780556fffd055600960558fffe055600a204e30029
-05c700a4023900bf055600960558000b06aa009805c7009c0533006d0639
-006305c700a40556009e04f2009404e30030055600060556000906af007f
-05fb0061023900040556000604a00048039100620473008b01c7006b0460
-0088049a008c04000019038700480473008b0473005c01c7008904000086
-04000018049c00a00400001a0395005c04730044048d008303db00560460
-00880433001105b4007a063f005701c7ffc9046000880473004804600088
-063f0057055700a206eb0032045500a105c000640556005c023900bf0239
-0004040000370875000d081500a406d5003104a900a10515000a05c000a0
-0556fffd054000a705560096045500a1056b0000055600a20763000704d5
-004e05c000a105c000a104a900a10540001206aa009805c700a406390063
-05c000a00556009e05c7006604e300300515000a061500520556000905eb
-009f05550057075500a1078000a106550000071500a8054000a505c00055
-081500a405c7001a0473004a0495005b0440008802eb008804ab00000473
-004b055afffb03ab003204780087047800870380008604ab00180580008c
-046b00880473004404550088047300870400005003aa0026040000210695
-004b0400000f0495008a042b0045066b008d0695008d0500002805c0008b
-042b008404150030060000890455001f0473004b0473000002eb00890415
-004b0400003f01c700880239000901c7ffa2074000130680008304730000
-0380008604000021046b008803e900a1034a008808000041089500a00585
-002d000001010000001e0000003100000031000001010000007e0000007e
-0000008c0000008c000001010000001000000101000001210310007d0000
-008c023300d20000030b0000ff04023900b9048100690456003203310019
-0411002d04d1009601f9009b030f005f04ca009b04b8008c01f9009b0413
-002803b0005003b4003c04ca009b04cf005001f9009b02d2003c0498005a
-043c00190488006e045f007303b1001903d4000a0466009604130028058e
-00640524002803f2009b03f2009b03f2009b01e3005a0356005a0686009b
-01f9ffac041300280413002803b4ff5703b4ff570448002d058e0064058e
-0064058e0064058e00640481006904810069048100690456003203310019
-0411002d04d10096024b0000034a000004b8008c024b00000413002803b0
-005003b4003c04cf005002d2003c0498005a0488006e045f007303d4000a
-0466009604130028058e00640524002801f9009b0456003203b00050045f
-0073049b003c0000ffdc0000ff250000ffdc0000fe51028d00ab028d00a0
-02da0043034d007901a8ffba000000460000004600000046000000460000
-00480000004600000046000000460435017c0435012e043500b704350081
-0435012c043500be043500af043500810435009a043500db04350085028d
-00c1043500b3060001000600010002420036060001000435009e04350098
-043500cb0600010006000100060001000600010006000100000000460600
-010006000100060001000600010006000100060001000600010006000100
-051bffba06000100060001000600010005b5003a05b5003a01f4ffba01f4
-ffba060001000600010006000100060001000481003604350036043dffba
-043dffba03e9004a03e9004a067f0014077600140327ffba041effba067f
-0014077600140327ffba041effba051b003204b500240300fff706000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010000000030
-0000004600000046000000400000004606000100060001000000ffdc0000
-fe510000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ff160000ff160000ffdc0000ff160000ffdc0000ff200000ffdc0473
-004a08000000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010006000100028d
-007f028d005d0600010004ee0015034d007901a8000e01d6ffdc01a80056
-01d60010037500320375003201a8002d01d60013051b003204b5002401f4
-ffba01f4ffba01a8009301d6001305b5003a05b5003a01f4ffba01f4ffba
-024200000300fff705b5003a05b5003a01f4ffba01f4ffba05b5003a05b5
-003a01f4ffba01f4ffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba02b3
-005f02b3005f02b3005f02b3005f03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba08c9003e08c9003e06c5ffba06c5ffba08c9003e08c9003e06c5ffba
-06c5ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7
-ffba04a7ffba045a002a039a00360435ffba0327ffba045a002a039a0036
-0435ffba0327ffba064f0027064f00270224ffba021affba04a7004604a7
-00460224ffba021affba04cf002d04cf002d0327ffba0327ffba040d0047
-040d004701a8ffba01a8ffba02b4002302b400230327ffba0327ffba0435
-00450435004501f4ffba01f4ffba024200360300fff7039affba0327ffba
-0375003203750032051b003204b50024051b003204b5002401f4ffba01f4
-ffba045a004004ce0049045a002604ce0039045a005304ce004a045a0053
-04ce004a0600010006000100000000460000004606000100060001000600
-010000000046000000460600010006000100000000480000004606000100
-060001000600010000000046000000460000004600000046000000400000
-003006000100000000460000004606000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d00ca028d00c7028d
-00c606000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000100ffba0800ffba1000ffba06dc0063053f004406d5
-00a1055b00830000fddc0000fc2f0000fca60000fe540000fcd70000fd73
-0000fe290000fe0d0000fd110000fc670000fd9d0000fbf50000fc720000
-fed50000fed50000ff02041b00a006ac006b06ac00190000feb60000fd73
-0000fe080000fca60000fe530000fd110000fbc80000faf40000faaf0000
-fc720000fbaa0000fb6a0000fcf10000fc7d0000fbdd0000fcc10000fb98
-0000fdea0000fe840000fdc20000fcf10000fd5f0000fe760000febc0000
-fceb0000fd6c0000fd580000fc900000fd150000fc2c0000fc130000fc12
-0000fb960000fb9601c700880556fffd0473004a0556fffd0473004a0556
-fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473004a
-0556fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473
-004a0556fffd0473004a0556fffd0473004a055600a20473004b055600a2
-0473004b055600a20473004b055600a20473004b055600a20473004b0556
-00a20473004b055600a20473004b055600a20473004b0239006301c7001f
-023900ba01c7007c06390063047300440639006304730044063900630473
-004406390063047300440639006304730044063900630473004406390063
-0473004406dc0063053f004406dc0063053f004406dc0063053f004406dc
-0063053f004406dc0063053f004405c700a10473008305c700a104730083
-06d500a1055b008306d500a1055b008306d500a1055b008306d500a1055b
-008306d500a1055b00830556000604000021055600060400002105560006
-040000210556fffd0473004a0239ffe201c7ffb0063900630473004405c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-05c700a1047300830000fefe0000fefe0000fefe0000fefe0455fffd02eb
-000c07630007055afffb04a900a10380008604a900a10380008605c700a4
-046b00880473fffd040000140473fffd04000014055600090400000f0555
-0057042b0045055500a10473008706050063047300550639006004730044
-05b5003a01f4ffba0224ffba021affba04a7004601f4009e01f4001001f4
-001b01f4001001f4006b01f4fff90227ffce0000000f0000fff502aa00a4
-02aa00a40000000e00000056000000560000ffcf01a8000f01d6ffbf01a8
-fff501d6ffcd01a8001d01d6fff501a8009301d600130375003203750032
-0375003203750032051b003204b5002405b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba
-01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4
-ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a
-01f4ffba01f4ffba0481003604350036043dffba043dffba048100360435
-0036043dffba043dffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba0481
-003604350036043dffba043dffba02b3003202b3003202b3005f02b3005f
-02b3005f02b3005f02b3003202b3003202b3005f02b3005f02b3005f02b3
-005f02b3005f02b3005f02b3003802b3003802b3004902b3004903e9004a
-03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9
-004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba0692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba08c9003e08c9003e06c5ffba06c5ffba04a7ffba04a7ffba045a
-002a039a00360435ffba0327ffba064f0027064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba064f0027064f00270224
-ffba021affba064f0027064f00270224ffba021affba064f0027064f0027
-0224ffba021affba04a7004604a7004604a7004604a70046093e0032093e
-00320740ffba0740ffba067f0014077600140327ffba041effba04cf002d
-04cf002d0327ffba0327ffba04cf002d04cf002d0327ffba0327ffba04cf
-002d04cf002d0327ffba0327ffba067f0014077600140327ffba041effba
-067f0014077600140327ffba041effba067f0014077600140327ffba041e
-ffba067f0014077600140327ffba041effba067f0014077600140327ffba
-041effba040d0047040d004701a8ffba01a8ffba040d0047040d004701a8
-ffba01a8ffba040d0047040d004701a8ffba01a8ffba040d0047040d0047
-01a8ffba01a8ffba043500450435004501f4ffba01f4ffba043500450435
-00450435004504350045043500450435004501f4ffba01f4ffba04350045
-043500450481003604350036043dffba043dffba024200360300fff7031a
-001a031a001a031a001a0375003203750032037500320375003203750032
-037500320375003203750032037500320375003203750032037500320375
-0032037500320375003203750032051bffba04b5ffba051b003204b50024
-01f4ffba01f4ffba0375003203750032051b003204b5002401f4ffba01f4
-ffba051b003204b50024067f0045067f0045067f0045067f004501a80028
-0000fe290000fea20000ff300000ff1d0000ff120000ff920000fe7e08fc
-003208ad00320000ffb50000ffb60000feed0000ff640000fe7e0000ff9f
-018d000002f6fffd0000fe820000ff1004cd00320000ff580000ff580000
-ff640692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba045a002a039a00360435ffba0327ffba034d007902b400230242
-003601f4ffba0290ffba01f4002f01f4003b01f4001201f400b101f4006d
-067f00140776001401f9009b0000fed902bc000003f2009b045afff504ce
-fff5045a005304ce004a045a005304ce004a045a005304ce004a045a0053
-04ce004a045a005304ce004a045a005304ce004a04350071043500ad045a
-000f04ce000f0473001406110014054000a7047300860540000a0473000a
-05c7005105c700660400005005c7fffd067a00140540004a047300460474
-00480556006e04d5005304e3ffc40639006d04fe000f070c008701c70083
-0239001f055600960400008801c7001504000018072000a405c7ffb80473
-008b0639006006f200630557004406090014047300860556009e0556006b
-0400004f04f20094030b00440239002404e300140239002404e3003005fb
-006105c700a1062e00140400002104e300290400002804e3002904e30031
-045c0044045c003f0473003c0473005503ab003203e50024047300870214
-00bc034e00bc04ac0072023900b00aaa009e09c7009e08640046087f0096
-06aa0096039c008309c7009c078e009c062b0087047300550556fffd0473
-004a0000fefe0556fffd0473004a08000001071d00440639006d0473001a
-0639006d0473004205560096040000880639006304730044063900630473
-004404e30029045c004c01c7ffa20aaa009e09c7009e086400460639006d
-04730042084600a404f2009e05c7009c047300870556fffd0473004a0556
-fffd0473004a055600a20473004b055600a20473004b0239ff8a0239ff64
-023900040239fff60639006304730044063900630473004405c700a102aa
-ffcc05c700a102aa006805c700a10473007605c700a1047300830556005c
-0400003f04e3003002390024045c0051037e001305c700a40473008705a6
-00a404d6005e0486005e04e30029040000280556fffd0473004a055600a2
-0473004b06390063047300440000fefd0639006304730044063900630473
-004406390063047300440556000604000021047300570473004804730086
-04730086040000130400005004730046047300460473005505e9005503ab
-004903ab0032050d0032040f00440239ffb9047300420473004204780050
-0402001904ef00190473008b047300870473008701c7001901c7008901c7
-0089029e0000026e001401c700830493008306aa008406aa008406aa0087
-0473ffa60473008b046c00870473004406530044063f00570466004402aa
-ffe402aaffe402aaffe402aa008502aa008502aa008502aaffe40455008a
-0455008a0400003f01c7ffa20214ffb901c7ff7202cb00000239000f0239
-002404730019048c0044046000880400001a05c700060400001804280019
-0400002804540028045c004c045c00790400002404000050040000240400
-00500639006304400088040f004904780050046b0088032e000004000008
-033b008804730048040000240400005007b7004607400046080b004605b3
-0024036f002405c00024061c0013054a0083050f008303e2001e04380063
-03110064031100640146ffce01eb006401eb000001eb000002ea006403d9
-0000029100000187005a02d7005e01c7008001c7006c01c7008a02aa00fb
-02aa00fb02ca003202ca003204ac007004ac007004ac006504ac006502aa
-012102aa00de02aa005902aa012102aa001d02aa005902aa00de023900b6
-023900b602aa00fb02aa00fb02aa00a602aa00a602aa00a602aa001d02aa
-ffe202aafffb029400000142006402b8003202a0000002ca003203100096
-0310009603100096031000960310009602aa006202aa006202aa002802aa
-001d02aa0047045700960457009604570096045700960457004304570043
-045700430457004304570043031000430457002f0457002f0457002f0457
-002f0457002f0310002f0457002504570025045700250457002504570025
-0310002f0457001a0457001a0457001a0457001a0457001a0310001a0457
-004204570042045700420457004204570042031000420457009604570096
-045700960457009604570042045700420457004204570042045700420310
-00420457002f0457002f0457002f0457002f0457002f0310002f0457002f
-0457002f0457002f0457002f0457002f0310002f04570026045700260457
-002604570026045700260310002604570042045700420457004204570042
-045700420310004204570096045700960457009604570096045700420457
-004204570042045700420457004203100042045700260457002604570026
-045700260457002603100026045700230457002304570023045700230457
-0023031000230457002f0457002f0457002f0457002f0457002f0310002f
-0457004b0457004b0457004b0457004b0457004b0310004b045700960457
-009604570096045700960457004204570042045700420457004204570042
-031000420457001a0457001a0457001a0457001a0457001a0310001a0457
-002404570024045700240457002404570024031000240457002f0457002f
-0457002f0457002f0457002f0310002f0457004e0457004e0457004e0457
-004e0457004e0310004e045700960457009604570096045700960000fec1
-0000fec60000fdac0000fed80000ff920000fee90000ff4c0000fea00000
-fec40000ffce0000ff660000fea00000fed80000fed80000ff970000ff98
-0000ff990000fff40000ff420000ff420000ff440000ff5f0000fe870000
-ffec0000ffa60000ff510000ff510000ff510000fec90000ff1c00000000
-0000fee90000ff4c0000ff930000ff2a0000ff560000ffce0000fe870000
-febb0000fec40000fec40000fed80000fed80000feb30000fec90000fdad
-0000fdac0000feb30000fec90000fdad0000fe160000fee60000ffa60000
-fe870000ff440000feba0000ff230000ff9a0000fdac0000fe8800000000
-0000feb00000ff980000fe930000ffa60000fe870000fdac0000ff660000
-ff440000feb00000feb00000feb00000ff030000ff520000fd1f0000ff53
-0000ff530000ff530000feb50000feb50000ffc30000feae0000fedc0000
-fec70000fec80000fedc0000fe1e0000ff420000ff510000feb70000feb0
-02aa00de02aa005902aa00fa049a008c04600088062e001407aa0000062e
-0014047b004c063f005704cf0044063900630473004405c7006604000050
-04e300a8033b008804ff0000043c0032060d000a049d0042072000a406aa
-0084056500630473008b056400a40400000a0556006b0556006b04e00005
-04c5001905e5005f046e004403b600140347002804cf00440495005b0400
-005001c7ffa2063900600389004d03890050055600a205c000a10473004b
-047800870ab4006d04fe00100639001404e70014079900bf05b500880558
-000b0400001a072e00bf0590008806a10078057b007a086d00bf06f00088
-04d5006603ab001f065f0039058200480639006004730044066d0009050c
-001a066d0009050c001a0b010063091c004406aa005c04e600440987006d
-06d000500000fe370ab4006d04fe001005c7006604000050040700140000
-fea60000febc0000feaa0000fead0000fc2b0000fc4c05c000a104780087
-05400004042b00140556009e04730087055d00a40464008804d5004e03ab
-003204a900040380000005ef002904490028070900a4052f0088091800a0
-06f6008806060066042b005005c700660400005004e3003003aa00260767
-00310587002605550057042b004506e4000a0554000a06e4000a0554000a
-023900bf07630007055afffb055700a1046800860540001204ab001805c7
-00a4046b008805c700a4046b008805550057042b004506aa00980580008c
-02aa002e0556fffd0473004a0556fffd0473004a08000001071d00440556
-00a20473004b060500630473005507630007055afffb04d5004e03ab0032
-04d5004e045c004c05c000a10478008705c000a104780087063900630473
-0044063900600473004405c0004a0415002b0515000a040000210515000a
-040000210515000a0400002105550057042b0045071500a805c0008b0540
-004a0473004607bf004a0703004607a6006606860053054d006604130053
-07c3001207470018084600a4070700880639006d0478005005f900300553
-00260000ff430000fec90000ff770000ffb00000ff470000ff560000ff74
-0000fed70000feac000000000000ff520000ff56000000000000feac0000
-fd9a000000000000ff6a0000ff7c0000ff690000ff560000feac0000ff7f
-0000ff560000fdef0000ff430000ff690000ff7c000000000000fdae0000
-ff8c000001020000fefe0000fefe0000fedf0000fedf0000ff580000ff20
-0000fefe0556fffd0473004a055600960473008605560096047300860556
-00960473008605c700660400005005c7009e0473004605c7009e04730046
-05c7009e0473004605c7009e0473004605c7009e04730046055600a20473
-004b055600a20473004b055600a20473004b055600a20473004b055600a2
-0473004b04e300a8023900130639006d0473004205c700a40473008705c7
-00a40473008705c700a40473008705c700930473006805c700a404730087
-0239ffdf01c7ff9202390020023900060556009604000088055600960400
-008805560096040000880473009601c7007e0473009601c7ffb904730096
-01c7ffa50473009601c7ffa306aa009806aa008706aa009806aa008706aa
-009806aa008705c7009c0473008705c7009c0473008705c7009c04730087
-05c7009c0473008706390063047300440639006304730044063900630473
-004406390063047300440556009e047300870556009e0473008705c700a1
-02aa008505c700a102aa008505c700a102aa005e05c700a102aa00260556
-005c0400003f0556005c0400003f0556005c0400003f0556005c0400003f
-0556005c0400003f04e300300239002404e300300239002404e300300239
-ffff04e300300239000e05c700a10473008305c700a10473008305c700a1
-0473008305c700a10473008305c700a104730083055600090400001a0556
-00090400001a078d001905c70006078d001905c70006055600090400000f
-055600090400000f055600060400002104e300290400002804e300290400
-002804e3002904000028047300870239000305c70006040000210473004a
-01c7008904a0004804a0004804a0004804a0004804a0004804a0004804a0
-004804a000480556fffd0556fffd06820013068200130682001306820013
-068200560682005603910062039100620391006203910062039100620391
-0062061e0000061e0000076c0000076c0000076c0000076c00000473008b
-0473008b0473008b0473008b0473008b0473008b0473008b0473008b068f
-0000068f0000081f0000081f0000081f0000081f0000081ffff3081ffff3
-01c7008101c7008101c7ff9b01c7ff9b01c7ffeb01c7ffeb01c7ffa201c7
-ffa20301000003010000049100000491000004910000049100000491fff3
-0491fff3047300440473004404730044047300440473004404730044069d
-0000069d0000082d0000082d000007c9000007c900000460008804600088
-0460008804600088046000880460008804600088046000880682000007ae
-00000812000007ae0006063f0057063f0057063f0057063f0057063f0057
-063f0057063f0057063f0057065f0000065f000007ef000007ef0000078b
-0000078b0000078bffff078bffff04a0004804a000480391006203910062
-0473008b0473008b01c7ffe601c700680473004404730044046000880460
-0088063f0057063f005704a0004804a0004804a0004804a0004804a00048
-04a0004804a0004804a000480556fffd0556fffd06820013068200130682
-00130682001306820056068200560473008b0473008b0473008b0473008b
-0473008b0473008b0473008b0473008b068f0000068f0000081f0000081f
-0000081f0000081f0000081ffff3081ffff3063f0057063f0057063f0057
-063f0057063f0057063f0057063f0057063f0057065f0000065f000007ef
-000007ef0000078b0000078b0000078bffff078bffff04a0004804a00048
-04a0004804a0004804a0004804a0004804a000480556fffd0556fffd0556
-fffd0556fffd0556fffd02aa00e502aa00fd02aa00e502aa000602aa0006
-0473008b0473008b0473008b0473008b0473008b068200000682000006f3
-000006f3000005c700a402aa001302aa001302aa000601c7ffbb01c7ffab
-01c7ffca01c7ffca01c7ff9301c7ff930239001a0239fff5036500000365
-000002aa001302aa001302aa000604600088046000880460008804600088
-048d0083048d00830460008804600088055600060556000606e600000718
-0000061e000002aaffea02aaffea02aa0059063f0057063f0057063f0057
-063f0057063f005707650000069d000007270000065f000005fb006102aa
-00de02aa00e50473000d05c7006605c7006606aa008705c70024095000a1
-078d00190556001f04e30030080000290400003004c100660000ff530000
-ff530000ff530000ff5301c7001901c7ffa2042b00050556001105740046
-02cbffa3057a008702f0ffc8057f000a057f000a02aa008402aa008402aa
-00c902aa00c902aa00a002aa005902aaffaf02aa003a02aa0006023900b9
-02aa00a902aa00a902aa00a902aa00a9032e001e032e001e02aa003a0000
-ff730000ffa50000fed80000ff230000ff720000ff720000fee70000ffa5
-0000ff530000ff530000ff530556009e0473008703f8001905fb0019071d
-00440440001904000050046900870469001903eb008703ab003201c70088
-0361004104000088033600100580008c04780087047300440400001304de
-004404de004404de000d078d005003a800440473004404730044042b0084
-0455001f0455001f03aa00260460008804c6004405de004404c600440400
-001a05c700060400002803ab0032036b003f04db001f02eb00880400001a
-04550088042b008405b4007a04ab001803a00000054f0000035100320351
-ffd103980032034800320348003203f80032036e0032015600690284002d
-0366003202d000320415003203710032036f003204180032030f00320359
-0032039c003203760031036f003204fb000002fa003202fa003203040032
-04cc0032030500640305003202f9003202f90032028c0032028c00320304
-00320142006402b6006404950064030f00640305003202d5003203050032
-030500320306006401c20032030f00640342003204950064029200000320
-00000315006402920000030600320385003202bf00000142006401eb0064
-030f0064029200000315006402920000030900320385003202bf000005ed
-00460a660046061300460689ffba0541ffba01e9003c045a00110000ff0d
-0000ff350000fece0000feb70000fec90000ffcf0000ff4f0000ff9e0000
-feca02b3005f02b3005f03e9004a03e9004a039affba0327ffba039affba
-0327ffba05ad0069053d002d05fd009604dc005004e0003c05f6009b053f
-00280650002804ac00720000fe3b0000fe660000fe660473fffc02aa0053
-02d5ffce01a8ffba01a8ffba01a8ffba01a8ffba0658001509c500470400
-000008000000040000000800000002ab0000020000000155000004730000
-02390000019a000000ab00000000000005e5000305c7006606aa00980580
-008c0744008307180046071800480556fffd05c70066040000140473000a
-04e300300400004f0400002804a5001d000001020000ff420000febf0000
-ff3a0000ff53048d000a05c7005105c7006605c70051045500a102eb0088
-0000ff430000ff040000ffac02d200960000ff37021affba0250001e0000
-ff3a0000ff5b0000ff5f0000ff7e0000ff940000ff4a0000fe9c05b5003a
-05b5003a01f4ff9601f4ff9605b5003a05b5003a01f4ffba01f4ffba05b5
-003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba
-05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba0481003604350036043dffba
-043dffba0481003604350036043dffba043dffba02b3003202b3003202b3
-005f02b3005f03e9004a03e9004a0692003e0692003e043fffba043fffba
-045a002a039a00360435ffba0327ffba045a002a039a00360435ffba0327
-ffba045a002a039a00360435ffba0327ffba064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba067f0014077600140327
-ffba041effba067f0014077600140327ffba041effba067f001407760014
-0327ffba041effba02b4002302b400230327ffba0327ffba02b4002302b4
-00230327ffba0327ffba043500450435004501f4ffba01f4ffba04350045
-0435004501f4ffba01f4ffba043500450435004501f4ffba01f4ffba040d
-0047040d004701a8ffba01a8ffba03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0473ff93047300460239ffbf06aa
-ffd50473ffb70473ff9102aaffa402aaffa40400ffff0239ffb904000028
-04730089030b0064047400480649002401c7001901c700190473001e0460
-001e048c000a04730086047300460239001305b400420400008801c7fffc
-06aa00870473008b0473008702aafffb0400003f0318ffa20400001a0400
-000f040000280473004a04730048047300460473004b03ab004903ab0032
-0534005501c700880400001301c7ffa204730083045c004c0304006402d5
-003202c9003302fc0032028c003201d5003201d500000304003203110064
-01420019014200640142006401420019022a000001420064014200090233
-00640493006404930064030fffc9030f0064030e00640305003203000032
-02b800320142ffca01c20032030f001d031a00320306006402d400640292
-000002de003202de003202de003202f4003202ea00320000febc0000febc
-0000ff730000fea9023900b902fa003202f900320305003202a0000002f9
-00320639006d0556fffd0473000f05c7006602aa004104a0004804a00048
-04a0004804a0004804a0004804a0004804a0004804a0004801c7ff9b01c7
-ffab01c7ff9b01c7ffab01c7ff9b01c7ffbb01c7ff9b01c7ffbb04600088
-0460008804600088046000880460008804600088046000880460008801c7
-ffab01c7ffab01c7ffbb01c7ffbb04600088046000880460008804600088
-045a005304ce004a03a000130556001105c700290558000b055600a20473
-004b0400003301c7ffa205e600630473004805c7000002aa000f05560006
-0400002104000013040000500400001301c700830455fffd02eb00010556
-00090400000f055600090400000f04d5005303ab00490540001204ab0018
-0000fec60000fed40000fec60000fed40000fe5f0000fe5f0000ff720000
-ff730000fee7078b000a03eb004c040000130473000a01c700150473fff4
-0556001105c700a1047300190239ff8b05c700a404730087055600960400
-008804e30029040000280400003b049e00a403670088053000480000ff53
-0000ffbc0000fefe0000fefe0000fea40000fea401c70088000000000000
-002a0000002a0000002a0000002a000000d60000017e00000320000005a6
-0000074e000009380000097e000009fe00000aa400000b8400000bec0000
-0c6400000caa00000ce600000d5600000f1200000fee00001218000013f2
-000015520000170c000018e20000198e00001c2200001e5600001eb20000
-1f7000001ff200002062000020e8000021da000023da000025840000271c
-000028560000299e00002a6200002b1800002ca800002dae00002e920000
-2f7a000031b00000323a000035640000370e000038420000394800003b3c
-00003da800004052000041000000422400004398000045d6000048e20000
-4a8800004bc800004c3200004c9c00004d0000004d8800004dbc00004e38
-0000510a000052e80000549c000056500000580e0000596200005b520000
-5cf600005dea00005f020000619a00006296000064c60000668c0000684e
-00006a1200006ba800006cae000070560000717a00007318000075360000
-79a000007bc400007e1c00008004000081020000814e00008250000082f0
-0000833c00008370000083ac000083ee000084540000849a000084ce0000
-85040000853a0000858a000085cc0000861e00008656000086a8000086de
-0000871e000087600000879e000087e800008828000088560000888e0000
-88de00008914000089540000898e000089d200008a1c00008a5800008a88
-00008acc00008b0400008b9400008c1a00008e2800008fbc0000916c0000
-91b80000924c00009470000096c4000098b4000099a000009a2200009a8c
-00009baa00009d0600009f4e0000a0b00000a13e0000a1e80000a2ac0000
-a3f40000a59e0000a68c0000a7520000a7b60000a8240000a94e0000aa72
-0000ab020000ace40000af3e0000b2900000b3860000b42c0000b47c0000
-b5320000b6520000b7f00000b88a0000b94e0000ba0e0000ba760000bab2
-0000bb0a0000bb580000bd700000bfb60000bfee0000c0200000c14a0000
-c2760000c3240000c3c80000c46a0000c53c0000c5900000c5c60000c61e
-0000c7700000c7e20000c83c0000c9b40000cb200000cc000000cc320000
-ccce0000cdf20000d0680000d0a20000d0e60000d1220000d1840000d1c6
-0000d20c0000d2580000d28a0000d2de0000d31c0000d34c0000d38a0000
-d3d00000d4120000d4500000d4d20000d5400000d6260000d6620000d6e2
-0000d7160000d7b80000d8400000d8ac0000d90e0000d97a0000da660000
-db580000db8c0000dbc00000dbf00000dc340000dcac0000de260000e040
-0000e0720000e0ac0000e1a60000e3340000e36a0000e4ce0000e54a0000
-e62a0000e7200000e8b00000ea1a0000ec080000ed040000ed4a0000ed7e
-0000edc00000edfa0000ee4e0000ee960000eee00000ef100000ef400000
-f1280000f1660000f18e0000f1be0000f1f20000f2180000f23e0000f286
-0000f43c0000f5b60000f5dc0000f6020000f6460000f6760000f6a60000
-f6fc0000f7da0000f8ec0000f9300000f9660000f9c00000f9fe0000fa32
-0000fa620000fa9e0000fade0000fb1c0000fb580000fb9a0000fbd00000
-fc0c0000fc4c0000fc720000fc960000fce60000fe420000fe980000fecc
-0000ff1a0000ff660000ffa80000ffe0000100160001005e000101000001
-029c00010464000105e6000107d80001092a00010aae00010b9000010d2a
-00010d9400010dbc00010e5a000110dc0001111c0001115c0001119c0001
-11da000112380001129600011304000113240001140e000114ae000114e4
-000115320001157c000115c6000115e2000115fe0001161e0001163e0001
-165e0001167e000116a4000116ca000116f000011716000117460001176e
-00011796000117c2000117ee000118220001184c00011878000118ae0001
-18d8000119040001193a000119640001198e000119c2000119f200011a26
-00011a6a00011a9a00011ace00011b1000011b4400011b7600011bb80001
-1bec00011c1c00011c5e00011ca200011ce800011d4400011d6000011d7c
-00011d9800011db400011dd000011f3e000121ea0001245a000124760001
-2490000124ac000124c8000124e4000125000001255c0001259600012600
-000126ca0001276a00012840000128c000012948000129b800012a4e0001
-2aac00012af200012b5000012bb200012c6a00012d2800012d5400012db0
-00012df400012f60000130540001307e0001309a000130c6000130fe0001
-314a0001318a000131be000131ee0001321e0001324e00013292000132c2
-000132f2000133320001336200013392000133c200013402000134320001
-346200013492000134b8000136bc000136ec0001371c0001386c00013a22
-00013a5200013a8000013ab000013ade00013b0e00013b3c00013b600001
-3b8400013bb400013d2400013d5c00013d8c00013f1e00013f4c00013f7a
-00013fa800013fd00001412e000142c6000142fe0001433e0001437a0001
-43aa000143d8000143f4000144240001445400014544000146ac000146dc
-000147160001475600014786000147b6000147f80001481e000148440001
-4884000148c4000148f40001493400014a1e00014a9e00014b8200014bb2
-00014be200014c1200014c4200014c7e00014cb000014ce200014d120001
-4d4200014d8800014dba00014dea00014e2000014e9200014ec600015094
-000151960001532600015556000157a6000159380001599c00015a260001
-5a3600015ac400015cc200015dee00015f5a0001604a000161ce000163e8
-000166140001670600016716000167260001683e0001684e0001685e0001
-686e0001687e0001688e000169ac000169bc000169cc00016a4000016a50
-00016b2000016b3000016c4200016c5200016c6200016c7200016dd00001
-6fae00016ff0000170260001705c0001708c000170bc0001711000017138
-000172c20001740a0001755e000176c60001784a000178ae00017a400001
-7b5c00017b6c00017b7c00017d0200017d1200017e7800017fd200018106
-00018264000183d200018598000185d800018610000186460001866c0001
-869c000186c200018838000188680001899e000189ae000189be00018a00
-00018a1000018ba400018d5000018eda00018f0200018f320001908e0001
-909e000191d6000191e600019280000193e0000193f000019656000197e0
-000199480001997800019aee00019c2000019c3000019c4000019c500001
-9d2a00019d3a00019d4a00019d5a00019e5200019fcc00019fdc0001a104
-0001a2380001a38a0001a51e0001a63c0001a7c80001a8da0001a9100001
-ab460001abe60001abf60001ad8c0001af2e0001afb20001b1340001b144
-0001b3ac0001b52c0001b6ac0001b6dc0001b87c0001ba020001bbc60001
-bcf20001bd020001be320001be420001be520001bf120001bf220001c108
-0001c1180001c24e0001c35c0001c5080001c6be0001c8000001c9700001
-cab80001cb0a0001ccec0001ce680001cea60001d04c0001d0700001d1b0
-0001d1c00001d1d00001d2080001d2180001d3a40001d50c0001d6800001
-d6a40001d6d40001d8420001d8f40001d9b20001d9e00001db960001dc8e
-0001dd1c0001de420001def00001dfc40001e00e0001e0860001e1460001
-e16e0001e1b20001e2080001e2e40001e32e0001e3620001e38a0001e3b2
-0001e3e60001e42a0001e46e0001e4ac0001e5ea0001e6a20001e7c20001
-e8380001e9060001e9580001e9ea0001ea9a0001eb8e0001ebe20001ec78
-0001ed360001ee200001eed20001eff20001f0440001f0ee0001f2240001
-f2fc0001f3e20001f4e80001f5ce0001f6b00001f7a40001f8420001f948
-0001fa420001faba0001fb320001fba80001fbde0001fc3a0001fd020001
-fd8e0001fdc60001fe0c0001fe3c0001fea60001ff660001ff9a0001ffca
-0001fffe0002002e0002005e0002008e0002022e00020266000202a60002
-02de00020316000203b2000204ac000204dc00020580000205ae000205ee
-0002063e0002066e000206ba00020852000209b800020b1800020b5e0002
-0bb200020bea00020d5c00020d9200020e2400020e6200020e9000020ece
-00020ffe0002102600021162000211f20002129c0002131e000213da0002
-14f20002160000021634000216ba0002181600021898000218e2000219ec
-00021a3400021b3800021bb400021c0c00021c9000021d7a00021e900002
-1f8c0002203600022126000221f8000222e2000223ca0002247a000224fc
-0002275a00022784000227ae0002286600022890000229d200022ad80002
-2bc200022bec00022c1600022c4000022c6a00022c9400022e1400022e3e
-00022e6800022e9200022ebc00022ee600022f1000022f3a00022f640002
-2f9800022fc200022fec0002301600023190000231a0000232ba000232ca
-000232f40002331e00023348000233720002351c00023738000238660002
-3876000239f200023a0200023b4800023d1400023e1a00023f9a0002413a
-0002435e000244b80002469a000247de0002490c000249fa00024a240002
-4a4e00024a7800024aa200024acc00024af600024b2000024b4a00024b74
-00024b9e00024bc800024bf200024c1c00024c4600024c7000024eac0002
-50280002516c000253540002549c000254c6000254f00002552000025550
-000255a0000255f000025630000256a2000256f600025754000257aa0002
-57e00002582200025868000258b2000258e20002591a0002594a00025a82
-00025dc800025df200025e1c00025e4600025e7000025e9a00025ec40002
-5eee00025f1800025f4200025f6c00025f9600025fc000025fea00026014
-0002603e0002606800026092000260bc000260e6000261100002613a0002
-61640002618e000261b8000261e20002620c0002623600026260000262fe
-000263140002633e0002661e0002662e000267480002686a000269a80002
-6aea00026c9000026ca000026de200026f3200027122000272f60002740e
-0002741e000274a00002752e0002762e0002763e000276de000276ee0002
-78040002795600027a8600027a9600027b6400027b7400027cea00027cfa
-00027e0e00027e1e00027f52000280e8000281a4000281b4000282b20002
-840c00028498000284a8000285d20002875e0002881a0002882a000288c6
-000288d6000289a4000289b400028a8c00028a9c00028ba400028bb40002
-8d7a00028d8a00028ee200028ef20002915c0002916c0002936600029376
-000294e0000294f0000295e0000295f00002978800029798000298b60002
-98c600029a0600029a1600029a2600029a3600029bae00029bbe00029bce
-00029bde00029d3000029e7e00029f4c0002a0300002a1b00002a3320002
-a4320002a5460002a68a0002a69a0002a7880002a8620002a9fe0002aa0e
-0002ab2c0002ac320002ae300002ae400002ae500002ae600002afaa0002
-afba0002b0720002b0820002b1900002b1a00002b28c0002b29c0002b3ba
-0002b3ca0002b4680002b4780002b4880002b5760002b6ea0002b8160002
-b9100002b9200002b9300002b9400002bade0002bc980002bd660002bd76
-0002bfd60002c21c0002c4a20002c7060002c98a0002cbfc0002cdcc0002
-cf820002cfac0002cfd60002cfe60002cff60002d0200002d04a0002d074
-0002d0840002d0940002d0be0002d0e80002d0f80002d1080002d1320002
-d15c0002d1860002d1960002d1a60002d1b60002d1c60002d1d60002d1e6
-0002d2100002d2200002d2300002d25a0002d2840002d2ae0002d2d80002
-d3020002d32c0002d3560002d3800002d3aa0002d3d40002d3fe0002d428
-0002d4520002d47c0002d4a60002d4d00002d4fa0002d5240002d54e0002
-d5780002d5a20002d5cc0002d5f60002d6200002d64a0002d6740002d69e
-0002d6c80002d6f20002d71c0002d7460002d7700002d79a0002d7c40002
-d7ee0002d8180002d8420002d86c0002d8960002d8c00002d8ea0002d914
-0002d93e0002d9680002d9920002d9bc0002d9e60002da100002da3a0002
-da640002da8e0002dab80002dae20002db0c0002dbac0002dbf00002dc66
-0002dc900002dcba0002dce40002dd0e0002dd380002dd620002dd8c0002
-ddb60002dde00002de0a0002de340002de5e0002de880002deb20002dedc
-0002df060002df300002df5a0002df840002dfae0002dfd80002e0020002
-e02c0002e0560002e08a0002e0be0002e0f20002e2840002e4200002e5bc
-0002e7480002e78e0002e7d40002e8420002e89e0002e8f00002e9600002
-ea380002eb040002ebdc0002eca80002ed480002ee620002ef160002ef98
-0002eff20002f0320002f1500002f29a0002f4320002f48e0002f4ec0002
-f5480002f5a40002f6580002f70e0002f7ba0002f8660002f9120002f9ca
-0002fa820002fb3a0002fb4c0002fb5e0002fb700002fb820002fb940002
-fc020002fc700002fd280002fd3a0002fd4c0002fd5e0002fd6e0002fd80
-0002fd920002fda40002fdb60002fdc80002fdda0002fe880002ff340002
-ffe20003008e00030126000301600003018a000301b4000302080003025a
-000302d6000303200003039c000303f000030474000304c60003053c0003
-0594000305fa00030650000306aa0003072800030774000307d200030836
-00030884000308d20003092a000309720003099c000309ca000309f00003
-0a2400030a5400030a8400030ad600030b4400030b9a00030c0e00030c62
-00030cd600030d1c00030d8400030dca00030e2600030e5600030e900003
-0eb600030ee600030f0c00030f3200030f6400030f9400030fe60003104c
-000310a2000311080003115c000311ca0003120c0003126c000312ae0003
-12fa0003133400031370000313aa000313e60003141a0003144c0003147c
-000314ac000314d6000314fc00031526000315540003157e000315ca0003
-160e0003164400031680000316b4000316e200031720000317500003178a
-000317b4000317e2000318080003182e0003185a000318b6000318e60003
-1916000319460003197e000319b2000319e000031a1000031a4000031a70
-00031aa000031ad400031b2a00031b5e00031bbe00031bf200031c4a0003
-1c7e00031cda00031d7800031e4600031f660003202e000320be00032154
-000323400003253c000326b400032830000329da00032b8c00032c740003
-2daa00032ea200032fb4000330d20003320800033372000334e000033676
-000337f2000339020003391200033a3e00033b7a00033cbc00033e400003
-3f1a00033f9000034046000340ec0003425c000342940003430e000343d0
-0003448a000344f2000345f80003472e000347fa00034958000349d20003
-4a4c00034b1800034bd200034c8600034ce200034d3c00034d8400034df4
-00034e7000034eba00034ef400034f3a00034f7e00034fd0000350220003
-50a40003512600035168000351a8000351de000352140003524200035270
-000352a4000352d80003531a0003535c00035398000353d40003540e0003
-54480003547a000354ac000354de000355100003554a00035584000355c6
-000356080003564a0003568c000356da000357280003576a000357ac0003
-57ec0003582c00035866000358a0000358ec0003593800035976000359b6
-000359fc00035a4200035a7e00035ad400035b1000035b4c00035b8c0003
-5bcc00035c0800035c4400035c8400035cc400035d0800035d4c00035da0
-00035e2e00035e7000035eb200035f1a00035f8200035fb400035fe60003
-601e00036056000360ec00036182000361cc00036216000362520003628e
-000362e40003633a00036384000363ce000364260003647e000364be0003
-64fe000365360003656e000365b800036602000366400003667e000366c0
-0003670200036756000367aa000367f0000368360003687c000368c20003
-69180003696e000369c400036a1a00036a6600036ab200036afe00036b4a
-00036bbe00036c3200036ca600036d1a00036d5800036d9600036dd40003
-6e1200036e5000036e8e00036ed200036f1600036f6200036fae0003700e
-0003705a00037098000370e6000371f60003724600037296000372ce0003
-73060003735c000373b2000374260003748a000374cc0003750e00037564
-000375b2000375fe0003764a0003768a000376ca000377120003775a0003
-77c6000378200003785800037890000378d000037910000379e000037adc
-00037b9c00037c8a00037ce000037d3600037d8800037ddc00037e400003
-7ea400037efa00037f5000037fc60003803c0003807e000380c000038102
-0003814400038186000381c80003821e00038274000382c60003831a0003
-83a200038424000384c400038566000385a4000385e2000386200003865c
-0003869a000386d80003871600038752000388360003892200038a380003
-8b5400038c1e00038ce800038de200038edc00038fda000390d8000391f6
-000393140003943a000395600003966200039764000397f6000398880003
-98c6000399040003995e000399b8000399f000039a2800039b3800039b48
-00039b9000039bd800039c3000039c8800039cba00039cec00039d2e0003
-9d7000039daa00039de400039e2800039e6c00039ee400039f5e00039fee
-0003a0320003a0720003a0f40003a1760003a2ce0003a2de0003a32c0003
-a37a0003a3b60003a3f20003a4380003a47e0003a4cc0003a51a0003a56a
-0003a5ba0003a6160003a6720003a7e80003a9500003a9880003a9c20003
-aa0e0003aa5a0003aaac0003aafe0003ab500003aba60003abe20003ac1e
-0003ac740003acc80003ae000003aea00003aeee0003af2e0003af680003
-b0fe0003b3820003b4460003b5dc0003b73a0003b8080003b9ae0003bc02
-0003be3a0003be800003beb20003bf5c0003c0800003c0a40003c13e0003
-c24a0003c35a0003c46a0003c5780003c6fe0003c7300003c7d20003c7fa
-0003c85c0003c8be0003c9200003c9820003c9c00003c9fe0003ca380003
-ca720003ca9e0003caea0003cb240003cb5e0003ccba0003ce0e0003ce1e
-0003cedc0003d0120003d0700003d1880003d3160003d3bc0003d5020003
-d5400003d57e0003d5bc0003d6100003d6380003d6920003d6f60003d73e
-0003d7a00003d8000003d8720003d8ee0003d96a0003d9ec0003da780003
-db040003db8e0003dc0e0003dc480003dc840003dde80003deb20003dee2
-0003df120003e04a0003e19a0003e1aa0003e2980003e36c0003e4640003
-e55a0003e6dc0003e8360003e8460003e95e0003ea0a0003eb4c0003eca2
-0003ecfe0003ee5c0003eeea0003f0900003f2020003f3160003f34e0003
-f3b20003f5620003f6cc0003f72e0003f8960003f99c0003fa520003fafe
-0003fc260003fd140003fdf40003ff34000400600004017a000402ea0004
-046400040474000405540004064a000406fa000407f6000408a2000409ac
-00040a9800040bc200040ce600040dea00040f1800041056000411c20004
-12f80004148c000416340004172c000418400004197200041a6400041a9c
-00041af200041ba000041bb000041c1200041c6e00041cd400041d200004
-1d6000041d9800041dc400041df200041e2c00041f6200041f960004201a
-000420d00004210000042184000421b4000421ec00042384000425100004
-255a00042594000425ea000426360004265c00042682000426c400042706
-0004274800042778000427b0000427e60004281c0004285e0004288e0004
-28be000429b400042ab800042aec00042b2400042b6a00042b9e00042bce
-00042c0600042c3a00042c6e00042c9e00042cce00042d0400042d3a0004
-2d6a00042d9a00042dce00042e0200042e3200042e6200042e9c00042ed0
-00042f0200042f3400042f6800042f9c00042fcc00042ffc0004302a0004
-305800043166000432d2000434060004353a0004356a000435a40004363e
-000437a800043904000439c800043adc00043b0c00043b4000043c380004
-3de800043e4000043eb800043ff400044032000440a4000440d400044104
-0004413e000441c6000441f600044226000443b6000445000004460c0004
-471a000448460004499c00044af800044c5800044d9200044f0400045064
-000450740004522a00045352000453ec0004557400045584000456800004
-58060004595e00045a1000045ae000045bec00045c9600045cce00045cde
-00045d8e00045e3400045eb000046000000460f4000461ea000462f60004
-63ce000464a80004653c0004664e000467de000468fc000469f200046a9c
-00046b4600046c1000046cb800046d8e00046e0a00046e6600046fc80004
-70fc000472980004735a0004745a00047532000476700004771c000477e6
-000478d6000479fc00047ad800047bde00047d1600047e0600047ea40004
-7f960004810600048250000484bc0004858e000486420004871000048804
-000489420004895200048a8600048b9800048ba800048cb400048de40004
-8e3800048fac000490d4000491e80004939a000495ae00049842000499fc
-00049b2800049d0800049eca0004a05c0004a1280004a2c40004a33a0004
-a3e80004a4c40004a5500004a5f20004a6940004a7780004a8b00004ab0c
-0004ac540004ac640004ac740004acd60004ad340004ad960004ae340004
-aecc0004afd00004b0be0004b0ce0004b0de0004b1780004b2120004b24e
-0004b2ca0004b33e0004b3940004b3c80004b44e0004b4da0004b5520004
-b5b00004b64a0004b6dc0004b75c0004b7de0004b8720004b8a60004b908
-0004b9ba0004bb800004bbb80004bd940004bea80004beb80004beee0004
-bf320004bf760004bfba0004bff00004c0220004c0640004c1000004c156
-0004c1fc0004c2740004c2fa0004c36a0004c3cc0004c4520004c4b20004
-c51c0004c5900004c6000004c65e0004c7040004c79c0004c8080004c898
-0004c8f60004c9640004ca0c0004cab80004cb4e0004cbb80004cc3a0004
-cc9e0004cd4a0004ce020004ceae0004cf3c0004cf980004d0040004d05a
-0004d0dc0004d15a0004d1e00004d26c0004d2c60004d3320004d3a20004
-d4120004d4820004d5060004d5960004d5fc0004d6760004d6f20004d76a
-0004d8100004d8ac0004d93c0004d99a0004da380004dab40004db460004
-dbe80004dc920004dd2a0004dd860004dddc0004de440004deea0004df92
-0004e05c0004e1020004e1640004e1bc0004e21c0004e2aa0004e3300004
-e3be0004e41e0004e4820004e4ec0004e5540004e5bc0004e63a0004e6c2
-0004e7560004e7c20004e82a0004e88e0004e9360004e9f00004ea9e0004
-eb2c0004eb8a0004ebf60004ec660004ed0c0004edb60004ee780004ef1a
-0004ef7e0004f00e0004f0800004f1100004f18e0004f20a0004f2760004
-f3040004f3600004f3be0004f4440004f4c00004f5280004f58c0004f5e0
-0004f64e0004f6b60004f7340004f7aa0004f8240004f8a40004f9000004
-f9660004f9ca0004fa6a0004fb0c0004fbc20004fc720004fcce0004fd46
-0004fda40004fe2e0004fec60004ff560004ffbc0005001a000500a80005
-011a000501ae00050246000502b6000503260005039e000503fc0005045c
-000504d60005053000050590000505ea00050646000506ae0005073c0005
-0772000507aa0005083600050860000508a20005093600050a2400050ab4
-00050aea00050b3a00050bac00050c5800050cea00050d4200050d9c0005
-0df400050e4e00050ed200050f5800050ffc000510a4000510e200051152
-000511e60005127e00051314000513be000513f000051440000514940005
-14da0005157e000516080005168e000516ee000517320005178000051820
-000518b000051950000519f600051a9c00051b6000051b9200051bbc0005
-1c4200051cf200051d2400051d4c00051e1a00051e7800051f1200051f60
-00051fc60005206e000520dc00052142000521ce00052240000522b60005
-236a000523c40005243400052470000524c200052548000525a80005264c
-0005272c00052854000529e400052a4000052a9600052dbc00052e560005
-2eb200052efa00053068000531ba000532000005330e000533a6000534b4
-000535be0005366000053748000537da000538760005396800053a680005
-3ae400053b6a00053bb200053d2400053e8000053f6400053fb400053fe8
-000540d6000541fe00054398000544c8000545de000547120005482e0005
-489c0005493000054a7000054b2600054c9000054dc000054ef20005501e
-000550ca0005519000055262000553bc0005553c0005566c000557880005
-594200055a9400055b8000055c5c00055d1e00055e8800055fd800055fe8
-00055ff800056008000560c000056176000561b2000561e8000562200005
-6256000563e2000565f6000566e0000567f80005697000056ade00056bc8
-00056cfa00056e4200056fc800057166000572ba000574a80005766e0005
-78a400057af200057bda00057cb600057dfe00057f800005806800058182
-000581c40005820e0005842a000586420005878e0005890400058b620005
-8d6400058de800058e1800058e6400058f2c00058ffc0005919000059218
-00059280000592c0000592fe000594b0000596e000059816000599f80005
-9ad400059bee00059d9a00059fa60005a0a80005a1940005a3860005a58e
-0005a6fa0005a87e0005a9de0005ab4c0005abda0005ac6a0005ad840005
-ae900005b0520005b1be0005b3ae0005b5780005b60c0005b6a80005b73e
-0005b7c60005b8ac0005b9840005bb1e0005bcb00005bcd60005bcfc0005
-bd0c0005bd3c0005bd6c0005bee60005c0880005c1320005c2140005c2d4
-0005c37e0005c4180005c4fa0005c5b80005c6940005c84a0005c9840005
-ca100005ca400005ca700005caa40005cad80005cae80005caf80005cb28
-0005cb580005cb8c0005cbc00005cbf40005cc280005cc5c0005cc900005
-ce0a0005ce1a0005ce4a0005ce7a0005ceb20005cee60005cf1a0005cf4e
-0005cf820005cfb60005cfea0005d0220005d0580005d0880005d0c80005
-d1000005d1480005d18e0005d1c20005d1f60005d2300005d2680005d308
-0005d3180005d46a0005d6320005d7d80005d9820005dace0005dbe40005
-dcf20005de080005df020005dfea0005e10c0005e2080005e2e00005e3d0
-0005e48c0005e53e0005e6080005e67a0005e7200005e7b00005e8140005
-e9220005e9880005ea360005eb2c0005eb940005ebfc0005ecac0005ee86
-0005ef8a0005f00a0005f0480005f0f40005f1820005f26a0005f3020005
-f3680005f4660005f5280005f5e20005f6200005f6b00005f7b20005f846
-0005f88a0005f9a80005fad20005fcb40005fe760005ffac000600da0006
-01da000602020006022a0006026000060292000602be000602e60006030e
-0006033c0006039a000604080006044000060478000604a8000604ce0006
-0502000605380006055e00060584000605b2000605e00006060c00060682
-000606aa0006070c00060732000607580006077e000607a4000607d40006
-0804000608340006086e0006089e000608d400060904000609360006095c
-00060982000609b6000609ec00060a1c00060a4c00060a7200060a980006
-0abe00060aec00060b2000060ba600060bea00060c2400060c5800060c9c
-00060cd600060d1000060d3600060d6000060dac00060dee00060e140006
-0e4200060e6800060e8e00060ece00060f0000060f3000060f6000060f86
-00060fac00060fdc0006100c00061032000610580006107e000610a40006
-10ca000610f000061118000611a0000611ca0006123e00061266000612dc
-000613040006136600061398000613ca000613fa00061432000614640006
-1492000614cc000614f40006155400061596000615c6000615f200061622
-000616520006167a000616a2000616ca0006172c00061754000617b20006
-17f60006183a0006186a000618a0000618c6000618ee000619140006193c
-000619620006198a000619b2000619dc00061a0200061a2800061a4e0006
-1a8000061aa800061b2e00061b5800061bc200061bf200061c2200061c48
-00061c6e00061cc600061cf600061d3200061d5c00061d8c00061dbc0006
-1df000061e2400061e5400061e9400061ece00061f1600061f3c00061f62
-00061f8800061fae00061fd4000620140006205400062090000620c00006
-20f0000621200006215000062188000621c000062200000622400006227a
-000622b4000622f00006232e00062378000623c2000624080006244e0006
-2490000624d20006250200062532000625660006259a000625d40006260e
-0006265a000626a6000626fe00062756000627ae0006280c0006283c0006
-286c000628a2000628d80006290e0006294a0006297e000629b200062a06
-00062a5a00062aae00062b0200062b5600062baa00062c0200062c5a0006
-2c8800062cb600062ce800062d1a00062d6000062da600062dd800062e0a
-00062e5c00062eb400062ef800062f3c00062f8000062fc4000630180006
-306c0006309c000630cc000631020006313800063176000631bc00063210
-0006325a000632ac000632fe0006335e000633be000633ee000634200006
-345a00063494000634e60006353a00063584000635cc0006360e00063678
-000636c6000637120006374400063776000637aa000637de000638140006
-384a00063888000638be000638f00006392c00063982000639d800063a36
-00063a9400063aea00063b4000063b7400063ba400063be800063c1e0006
-3c4e00063c9200063cd000063d0800063d4000063d7600063db200063de2
-00063e1e00063e5e00063ea400063eee00063f3a00063f8600063fdc0006
-403200064080000640ce0006411c0006416c000641c8000642240006427c
-000642d4000643280006437c000643be0006440000064448000644900006
-44d8000645260006456a000645ae000646140006467a000646e000064746
-000647ac000648120006487c000648e60006492e00064976000649be0006
-4a0600064a5200064a9e00064af200064b3e00064b8200064bd000064c38
-00064ca000064d1000064d8000064de800064e5000064e9000064ece0006
-4f1800064f4200064f8800064fc00006500e0006503e0006506e000650aa
-000650de000651040006515800065196000651ea000652d0000653f80006
-543a00065460000654b6000654e60006552800065570000655be00065608
-000656580006567e000657660006584a0006599c000659ca000659f80006
-5a8c00065b1200065b4000065bca00065bfa00065c2a00065c7800065cc6
-00065daa00065e8600065fca00065ffa0006602a000660c0000661480006
-6178000661a8000661d80006626800066298000662c80006631a00066362
-000663b80006644e000664e60006655a000665ac000665d60006662c0006
-6660000666aa000666e20006673200066770000667bc000667e20006685e
-000668b0000669c200066bcc00066d8000066f0200067074000673160006
-75e6000677a6000678ec00067b4600067c8800067e9e00067ef000067f40
-00067f9600067fec0006804e000680d600068324000684b6000686c20006
-87de0006899200068b1400068bd400068cb600068d1e00068d8000068df6
-00068e5e00068f0a00068f7a0006900a0006911e000691e20006922e0006
-92c40006937000069414000694be000695080006954a000695c000069628
-000696b800069766000697d0000698340006989a00069954000699ea0006
-9a4800069a7200069a9c00069aac00069abc00069b7e00069c8200069e8c
-00069fe200069ff20006a0a20006a1860006a1e60006a1f60006a2520006
-a2b00006a3d00006a4be0006a4ce0006a4de0006a4ee0006a4fe0006a5e4
-0006a6e40006a8bc0006aa780006ab7e0006abf80006ac720006ad240006
-ad340006ae420006ae520006ae620006af240006b0580006b1440006b154
-0006b1640006b1740006b2da0006b4460006b5720006b5820006b5920006
-b5a20006b5b20006b6940006b6a40006b8060006b9100006ba0e0006bb46
-0006bc180006bc960006bd140006be340006beb00006befc0006bf880006
-c09c0006c0f00006c2320006c2f20006c3be0006c4b40006c5be0006c670
-0006c7d60006c83c0006c9000006cb020006cc900006ce0e0006cf3e0006
-d1f00006d3320006d4600006d5d80006d7500006d8d00006da5e0006dc10
-0006dc7e0006dde20006df1a0006e01e0006e1540006e2860006e3560006
-e4260006e5820006e65c0006e6fc0006e8000006e92a0006ea280006eba8
-0006ed120006ee500006efc80006f1140006f1f60006f25e0006f3000006
-f3a00006f49e0006f6060006f7400006f8d40006fa1e0006fb020006fb60
-0006fc660006fcfc0006fdbe0006fe640006fea400070050000701220007
-01e800070310000704b0000705bc00070614000707ac0007083a0007084c
-0007087c000708ac000708e40007091c000709520007098e000709c40007
-0a0000070b6e00070bb800070c5200070cea00070d6400070de800070e4e
-00070efa00070f46000710660007111c000711f20007122a000712680007
-12dc000713d6000714f4000715f6000716380007167a000716e8000716f8
-000717080007171800071728000717380007174800071758000717680007
-17780007178800071798000717980007191c0007192c000719ec00071ab2
-00071be800071dde00071fe0000721dc00072412000726120007267e0007
-27900007292200072a7a00072b2c00072b7000072c0e00072d3e00072d8e
-00072e2400072f6000072f70000731260007325a000732aa000733000007
-33c20007340600073448000734ce0007352c0007361e000736ac000736e2
-0007375c000737d4000738240007393000073a2600073ad000073afa0007
-3b2400073b4e00073b7800073bb800073bf800073c3000073c6800073cb2
-00073cfc00073d3c00073d7c00073dc600073e1000073e5000073e900007
-3eea00073f4400073f7e00073fb800073ffc0007404000074084000740c8
-0007411c00074170000741bc00074208000742460007428a000742da0007
-432a00074384000743e20007440c00074436000744d00007456a000745ae
-000745f2000747080007471800074760000747a8000747fa0007484c0007
-48b60007490a00074956000749b400074a3e00074aa200074ae600074b30
-00074b9800074be200074c2200074c6a00074ca600074ce200074d1e0007
-4d5800074d9a00074ddc00074e1c00074e5c00074ea600074ef000074f46
-00074f9e00074fec0007503a0007507c000750ca0007510c000751560007
-5198000751dc0007523800075294000752e00007532c00075376000753c0
-000753fe0007543c000754ba0007553800075572000755ac000756460007
-56e0000757b400075888000758e400075940000759b400075a2800075b86
-00075b9600075c8000075c9000075cc600075cfc00075d3600075d700007
-5dac00075de800075e2e00075e7400075fda00076190000762dc0007649a
-00076610000767b8000768e8000769ee00076c0c00076d5000076ee60007
-706e000770ec0007723000077438000774cc00077560000776b4000777de
-0007795800077a9800077c0400077cf200077ebc00078050000780d20007
-8204000782ee0007845600078538000786ee000787e00007894200078a7e
-00078b7200078d3600078ebe00079062000791c600079362000795200007
-96a600079742000798b6000799a800079a9000079c1000079d6200079e82
-0007a01a0007a1f00007a37e0007a4280007a4de0007a6900007a7340007
-a7c20007a80e0007a85a0007a8d20007a9b00007aa2a0007aacc0007ab20
-0007ac840007adb00007aec20007afc40007b08c0007b2000007b3400007
-b5660007b6100007b73a0007b83e0007b9de0007baca0007bbc40007bcc2
-0007bda80007bec20007c07c0007c22a0007c3980007c4100007c4840007
-c5a20007c6260007c7280007c8b40007ca2c0007cb620007cc6c0007cde2
-0007cf5a0007d14c0007d33a0007d5000007d5740007d6240007d6da0007
-d78a0007d8480007d9420007da460007db400007dc4c0007dcd40007dd62
-0007ddea0007de7e0007df5a0007e0500007e1340007e22a0007e2be0007
-e37a0007e40e0007e4cc0007e5bc0007e6c40007e7c20007e8d60007e9f8
-0007eb0c0007ec4c0007ed860007eea80007efbc0007f1000007f2540007
-f4680007f61a0007f6ce0007f7ea0007f8c00007f9de0007fabc0007fc50
-0007fd0a0007fda60007fe980007ff800008006c000800ea000801e40008
-03220008044e00080482000804c6000804d600080576000806180008070e
-000807fa000808d4000809ac00080b0a00080c6a00080d0800080d9e0008
-0ddc00080e1c00080e5a00080e9a00080ef400080f4c00080fa60008100a
-0008109600081292000812e20008140e0008149400081514000815ee0008
-16c2000817c6000819b200081aca00081b3a00081bca00081c8c00081d5e
-00081dca00081e4800081f9c00081fe2000820280008210c000821480008
-21a6000821e4000822160008225a0008229c000822cc000100000d3500f2
-003c009d000700020010002f005600000468041d0005000200>
-<0000003a02be0000000300000000006a00000000000300000001000a006a
-0000000300000002000e00740000000300000003005e0082000000030000
-0004000a00e00000000300000005001800ea0000000300000006000e0102
-000000030000000700ba01100000000300000008003001ca000000030000
-0009008a01fa000000030000000d02aa028400010000000000000035052e
-000100000000000100050563000100000000000200070568000100000000
-0003002f056f00010000000000040005059e0001000000000005000c05a3
-0001000000000006000705af0001000000000007005d05b6000100000000
-00080018061300010000000000090045062b000100000000000d01550670
-0003000104030002000c07c50003000104050002001007d1000300010406
-0002000c07e10003000104070002001007ed0003000104080002001007fd
-0003000104090000006a080d0003000104090001000a0877000300010409
-0002000e08810003000104090003005e088f0003000104090004000a08ed
-0003000104090005001808f70003000104090006000e090f000300010409
-000700ba091d0003000104090008003009d70003000104090009008a0a07
-000300010409000d02aa0a9100030001040a0002000c0d3b00030001040b
-000200100d4700030001040c0002000c0d5700030001040e0002000c0d63
-0003000104100002000e0d6f000300010413000200120d7d000300010414
-0002000c0d8f000300010415000200100d9b0003000104160002000c0dab
-0003000104190002000e0db700030001041b000200100dc500030001041d
-0002000c0dd500030001041f0002000c0de10003000104240002000e0ded
-00030001042a0002000e0dfb00030001042d0002000e0e0900030001080a
-0002000c0e170003000108160002000c0e23000300010c0a0002000c0e2f
-000300010c0c0002000c0e3b00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0052006500670075006c00610072004d006f006e006f
-0074007900700065003a0041007200690061006c00200052006500670075
-006c00610072003a00560065007200730069006f006e00200035002e0030
-003100200028004d006900630072006f0073006f00660074002900410072
-00690061006c00560065007200730069006f006e00200035002e00300031
-0041007200690061006c004d00540041007200690061006c002000690073
-00200061002000740072006100640065006d00610072006b0020006f0066
-00200054006800650020004d006f006e006f007400790070006500200043
-006f00720070006f0072006100740069006f006e00200069006e00200074
-0068006500200055006e0069007400650064002000530074006100740065
-007300200061006e0064002f006f00720020006f00740068006500720020
-0063006f0075006e00740072006900650073002e0054006800650020004d
-006f006e006f007400790070006500200043006f00720070006f00720061
-00740069006f006e004d006f006e006f0074007900700065002000540079
-00700065002000440072006100770069006e00670020004f006600660069
-006300650020002d00200052006f00620069006e0020004e006900630068
-006f006c00610073002c0020005000610074007200690063006900610020
-005300610075006e0064006500720073002000310039003800320059006f
-00750020006d006100790020007500730065002000740068006900730020
-0066006f006e007400200074006f00200064006900730070006c00610079
-00200061006e00640020007000720069006e007400200063006f006e0074
-0065006e00740020006100730020007000650072006d0069007400740065
-006400200062007900200074006800650020006c006900630065006e0073
-00650020007400650072006d007300200066006f00720020007400680065
-002000700072006f006400750063007400200069006e0020007700680069
-006300680020007400680069007300200066006f006e0074002000690073
-00200069006e0063006c0075006400650064002e00200059006f00750020
-006d006100790020006f006e006c0079002000280069002900200065006d
-0062006500640020007400680069007300200066006f006e007400200069
-006e00200063006f006e00740065006e0074002000610073002000700065
-0072006d0069007400740065006400200062007900200074006800650020
-0065006d00620065006400640069006e0067002000720065007300740072
-0069006300740069006f006e007300200069006e0063006c007500640065
-006400200069006e0020007400680069007300200066006f006e0074003b
-00200061006e006400200028006900690029002000740065006d0070006f
-0072006100720069006c007900200064006f0077006e006c006f00610064
-0020007400680069007300200066006f006e007400200074006f00200061
-0020007000720069006e0074006500720020006f00720020006f00740068
-006500720020006f00750074007000750074002000640065007600690063
-006500200074006f002000680065006c00700020007000720069006e0074
-00200063006f006e00740065006e0074002ea9203230303620546865204d
-6f6e6f7479706520436f72706f726174696f6e2e20416c6c205269676874
-732052657365727665642e417269616c526567756c61724d6f6e6f747970
-653a417269616c20526567756c61723a56657273696f6e20352e30312028
-4d6963726f736f667429417269616c56657273696f6e20352e3031417269
-616c4d54417269616c20697320612074726164656d61726b206f66205468
-65204d6f6e6f7479706520436f72706f726174696f6e20696e2074686520
-556e697465642053746174657320616e642f6f72206f7468657220636f75
-6e74726965732e546865204d6f6e6f7479706520436f72706f726174696f
-6e4d6f6e6f7479706520547970652044726177696e67204f666669636520
-2d20526f62696e204e6963686f6c61732c20506174726963696120536175
-6e646572732031393832596f75206d617920757365207468697320666f6e
-7420746f20646973706c617920616e64207072696e7420636f6e74656e74
-206173207065726d697474656420627920746865206c6963656e73652074
-65726d7320666f72207468652070726f6475637420696e20776869636820
-7468697320666f6e7420697320696e636c756465642e20596f75206d6179
-206f6e6c792028692920656d626564207468697320666f6e7420696e2063
-6f6e74656e74206173207065726d69747465642062792074686520656d62
-656464696e67207265737472696374696f6e7320696e636c756465642069
-6e207468697320666f6e743b20616e6420286969292074656d706f726172
-696c7920646f776e6c6f6164207468697320666f6e7420746f2061207072
-696e746572206f72206f74686572206f7574707574206465766963652074
-6f2068656c70207072696e7420636f6e74656e742e004e006f0072006d00
-61006c006f00620079010d0065006a006e00e9006e006f0072006d006100
-6c005300740061006e0064006100720064039a03b103bd03bf03bd03b903
-ba03ac00a90020003200300030003600200054006800650020004d006f00
-6e006f007400790070006500200043006f00720070006f00720061007400
-69006f006e002e00200041006c006c002000520069006700680074007300
-2000520065007300650072007600650064002e0041007200690061006c00
-52006500670075006c00610072004d006f006e006f007400790070006500
-3a0041007200690061006c00200052006500670075006c00610072003a00
-560065007200730069006f006e00200035002e0030003100200028004d00
-6900630072006f0073006f0066007400290041007200690061006c005600
-65007200730069006f006e00200035002e00300031004100720069006100
-6c004d00540041007200690061006c002000690073002000610020007400
-72006100640065006d00610072006b0020006f0066002000540068006500
-20004d006f006e006f007400790070006500200043006f00720070006f00
-72006100740069006f006e00200069006e00200074006800650020005500
-6e0069007400650064002000530074006100740065007300200061006e00
-64002f006f00720020006f007400680065007200200063006f0075006e00
-740072006900650073002e0054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-4d006f006e006f0074007900700065002000540079007000650020004400
-72006100770069006e00670020004f006600660069006300650020002d00
-200052006f00620069006e0020004e006900630068006f006c0061007300
-2c0020005000610074007200690063006900610020005300610075006e00
-64006500720073002000310039003800320059006f00750020006d006100
-7900200075007300650020007400680069007300200066006f006e007400
-200074006f00200064006900730070006c0061007900200061006e006400
-20007000720069006e007400200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-200074006800650020006c006900630065006e0073006500200074006500
-72006d007300200066006f00720020007400680065002000700072006f00
-6400750063007400200069006e0020007700680069006300680020007400
-680069007300200066006f006e007400200069007300200069006e006300
-6c0075006400650064002e00200059006f00750020006d00610079002000
-6f006e006c0079002000280069002900200065006d006200650064002000
-7400680069007300200066006f006e007400200069006e00200063006f00
-6e00740065006e00740020006100730020007000650072006d0069007400
-7400650064002000620079002000740068006500200065006d0062006500
-6400640069006e0067002000720065007300740072006900630074006900
-6f006e007300200069006e0063006c007500640065006400200069006e00
-20007400680069007300200066006f006e0074003b00200061006e006400
-200028006900690029002000740065006d0070006f007200610072006900
-6c007900200064006f0077006e006c006f00610064002000740068006900
-7300200066006f006e007400200074006f00200061002000700072006900
-6e0074006500720020006f00720020006f00740068006500720020006f00
-750074007000750074002000640065007600690063006500200074006f00
-2000680065006c00700020007000720069006e007400200063006f006e00
-740065006e0074002e004e006f0072006d0061006c004e006f0072006d00
-610061006c0069004e006f0072006d0061006c004e006f0072006d00e100
-6c004e006f0072006d0061006c0065005300740061006e00640061006100
-720064004e006f0072006d0061006c004e006f0072006d0061006c006e00
-79004e006f0072006d0061006c041e0431044b0447043d044b0439004e00
-6f0072006d00e1006c006e0065004e006f0072006d0061006c004e006f00
-72006d0061006c004e0061007600610064006e006f0074006801b001a103
-00006e00670041007200720075006e00740061004e006f0072006d006100
-6c004e006f0072006d0061006c004e006f0072006d0061006c004e006f00
-72006d0061006c000000b900540328b326181fd0bc032900e00329000203
-29b22b1d1fb90327031db23b1f40b80323b31215320f412d03200001002f
-0320000100200320006f032000af032000bf03200004005f031e00010010
-031e007f031e0080031e00af031e00bf031e00d0031e00060000031e0010
-031e0020031e006f031e009f031e00e0031e0006031d031cb2201f104127
-0319007f03190002000f031700ef031700ff03170003001f0317002f0317
-004f0317005f0317008f0317009f03170006000f0317005f0317006f0317
-007f031700bf031700f00317000600400317b2923340b80317b28b3340b8
-0317b36a6c3240b80317b2613340b80317b35c5d3240b80317b357593240
-b80317b34d513240b80317b344493240b80317b23a3340b80317b3313432
-40b80317b32e423240b80317b3272c3240b80317b312253280b80317b30a
-0d32c04116031600d00316000200700316000102c4000f0101001f00a003
-1500b0031500020306000f0101001f00400312b32426329fbf0304000103
-0203010064001fffc00301b20d1132410a02ff02ef0012001f02ee02ed00
-64001fffc002edb30e11329f414a02e200af02e200bf02e2000302e202e2
-02e102e1007f02e00001001002e0003f02e0009f02e000bf02e000cf02e0
-00ef02e0000602e002e002df02df02de02de000f02dd002f02dd003f02dd
-005f02dd009f02dd00bf02dd00ef02dd000702dd02dd001002dc00010000
-02dc0001001002dc003f02dc000202dc02dc001002db000102db02db000f
-02da000102da02daffc002d3b2373932b9ffc002d3b22b2f32b9ffc002d3
-b21f2532b9ffc002d3b2171b32b9ffc002d3b2121632b802d2b2f9291fb9
-0326031cb23b1f40bb0322003e00330322b225311fb80318b23c691fb802
-e3b3202b1fa0413002d400b002d40002000002d4001002d4002002d40050
-02d4006002d4007002d40006006002d6007002d6008002d6009002d600a0
-02d600b002d60006000002d6001002d6002002ca002002cc002002d60030
-02d6004002d6005002d6000802d0b2202b1fb802cfb226421f411602ce02
-c70017001f02cd02c80017001f02cc02c60017001f02cb02c50017001f02
-c902c5001e001f02ca02c6b21e1f00410b02c6000002c7001002c6001002
-c7002f02c5000502c1b324121fff411102bf0001001f02bf002f02bf003f
-02bf004f02bf005f02bf008f02bf000602bf0222b2641f12410b02bb00ca
-0800001f02b200e90800001f02a600a20800406a1f402643493240204349
-3240263a3d3240203a3d329f209f26024026969932402096993240268e92
-3240208e92324026848c324020848c3240267a813240207a813240266c76
-3240206c76324026646a324020646a3240265a5f3240205a5f3240264f54
-3240204f5432b8029eb724271f374f6b0120410f02770030027700400277
-00500277000402770277027700f90400001f029bb22a2a1fb8029a402b29
-2a1f80ba0180bc0180520180a201806501807e01808101803c01805e0180
-2b01801c01801e0180400180bb0138000100800140b40180400180bb0138
-00010080013940180180ca0180ad01807301802601802501802401802001
-3740b80221b2493340b80221b2453340b80221b341423240b80221b33d3e
-320f410f0221003f0221007f0221000300bf022100cf022100ff02210003
-00400221b320223240b80221b3191e3240b80222b32a3f3240b80221b32e
-3a326f414802c3007f02c3008f02c300df02c30004002f02c3006002c300
-cf02c30003000f02c3003f02c3005f02c300c002c300ef02c300ff02c300
-0600df02220001008f02220001000f0222002f0222003f0222005f022200
-7f022200ef0222000600bf022100ef02210002006f0221007f022100af02
-210003002f0221003f0221004f0221000302c302c3022202220221022140
-1d101c102b1048038f1c010f1e014f1eff1e023700161600000012110811
-b8010db6f70df8f70d00094109028e028f001d001f0290028f001d001f02
-8fb2f91d1fb80198b226bb1f41150197001e0401001f013900260125001f
-013800730401001f0135001c0801001f0134001c02ab001f0132b21c561f
-b8010fb2262c1fba010e001e0401b61ff91ce41fe91cb80201b61fe81cbb
-1fd720b80401b21fd51cb802abb61fd41c891fc92fb80801b21fbc26b801
-01b21fba20b80201b61fb91c381fadcab80401b21f8126b8019ab21f7e26
-b8019ab61f7d1c471f6b1cb80401b21f6526b8019ab21f5e73b80401400f
-1f52265a1f481c891f441c621f4073b80801b61f3f1c5e1f3c26b8019ab2
-1f351cb80401b61f301cbb1f2b1cb80401b61f2a1c561f291cb80101b21f
-231eb80401b21f5537b80168402c07960758074f07360732072c0721071f
-071d071b071408120810080e080c080a080808060804080208000814b8ff
-e0402b000001001406100000010006040000010004100000010010020000
-01000200000001000002010802004a00b013034b024b5342014bb0c06300
-4b6220b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807
-ff52b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ff
-b101018e851bb0124358b900010111858d1bb900010128858d5959001816
-763f183f123e113946443e113946443e113946443e113946443e11394660
-443e11394660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b2b
-182b1db0964b5358b0aa1d59b0324b5358b0ff1d594bb09353205c58b901
-f201f04544b901f101f045445958b9033e01f2455258b901f2033e445959
-4bb8015653205c58b9002001f14544b9002601f145445958b9081e002045
-5258b90020081e4459594bb8019a53205c58b9002501f24544b9002401f2
-45445958b909090025455258b9002509094459594bb8040153205c58b173
-244544b1242445445958b917200073455258b9007317204459594bb80401
-53205c58b1ca254544b1252545445958b9168000ca455258b900ca168044
-59594bb03e53205c58b11c1c4544b11e1c45445958b9011a001c455258b9
-001c011a4459594bb05653205c58b11c1c4544b12f1c45445958b9018900
-1c455258b9001c01894459594bb8030153205c58b11c1c4544b11c1c4544
-5958b90de0001c455258b9001c0de04459592b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65
-422b2b01b33b59635c456523456023456560234560b08b766818b0806220
-20b163594565234520b003266062636820b003266165b059236544b06323
-4420b13b5c4565234520b003266062636820b003266165b05c236544b03b
-2344b1005c455458b15c406544b23b403b4523614459b347503437456523
-456023456560234560b089766818b080622020b134504565234520b00326
-6062636820b003266165b050236544b034234420b147374565234520b003
-266062636820b003266165b037236544b0472344b10037455458b1374065
-44b24740474523614459004b5342014b5058b108004259435c58b1080042
-59b3020b0a124358601b2159421610703eb0124358b93b21187e1bba0400
-01a8000b2b59b00c2342b00d2342b0124358b92d412d411bba0400040000
-0b2b59b00e2342b00f2342b0124358b9187e3b211bba01a80400000b2b59
-b0102342b0112342002b7475737500184569444569444569447373737374
-757374752b2b2b2b74752b2b2b2b2b737373737373737373737373737373
-737373737373737373732b2b2b45b0406144737400004bb02a534bb03f51
-5a58b1070745b040604459004bb03a534bb03f515a58b10b0b45b8ffc060
-4459004bb02e534bb03a515a58b1030345b040604459004bb02e534bb03c
-515a58b1090945b8ffc06044592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b752b2b2b2b2b2b2b435c58b9008002bbb301401e017400735903b01e4b
-5402b0124b545ab012435c5a58ba009f02220001007359002b7473012b01
-732b2b2b2b2b2b2b2b737373732b2b2b2b2b002b2b2b2b2b2b0045694473
-456944734569447374754569447345694445694445694473744569444569
-44732b2b2b2b2b732b002b732b74752b2b2b2b2b2b2b2b2b2b2b2b2b2b73
-7475732b7374757374752b2b2b742b2b000000>
-[15785 15901 16277 16325 16277 16273 15933 16169 16277 15721 16361 15561 15973
-16029 16305 15693 16345 16249 15893 15629 16365 15481 16245 16249 16357 16337
-15821 15749 16345 15937 16257 16033 19077 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-2 3242 17 <000100ba0000018700cd000300254018023c000a023c5f006f007f00af00
-04a0000100a004a198182b10f65d5ded003fed313033353315bacdcdcd00
->ArialMT AddT42Char 
-2 10326 39 <0002009e0000055a05ba000f001d00e5402f201f0143081c1d1e02010211
-101e0f000817262009011f400d0d0255092010100255090a0f0f02550918
-0d0d025509b8fff440150c0c0655091a1f1d102001200001002010100255
-00b8fff6b40f0f025500b8fff6b40d0d025500b8fffab40c0c025500b8ff
-f7b40c0c065500b8fff8400a0d0d0655005d1e3b5c182b10f62b2b2b2b2b
-2b5d3cfd3c10f62b2b2b2b2b5ded003f3cfd3c3f3cfd3c31304379403603
-1b0708060805080408040619181a1802060b0a0c0a0d0a03061516141613
-1603061b03172101120e17210118081c2101160a1121002b2b012b2b2a2a
-2a2a81015d3311213217161716121514020e022325213236373636353426
-272623219e01f9ab5a7e5974734e7a91cd85feb1013991a531454d976c4e
-adfecc05ba151d4c62fecfc4a7fefea96132ad363145e9a6e6f72a1e>ArialMT AddT42Char 
-2 14402 51 <0002009e000004fd05ba000d001800b2402c65116b14024b104b145b105b
-14040b0c1e0f0e0e0017181e02010200081226080a0d0d025508100b0b06
-5508b8fff4401b0c0c0655081a201a01201a011a180d2001200001002010
-10025500b8fff6b40f0f025500b8fff6b40d0d025500b8fffa400b0c0c02
-55000c0b0b065500b8fffab40c0c065500b8fff0400a0d0d0655005d193b
-5c182b10f62b2b2b2b2b2b2b5d3cfd3c4e10715df62b2b2b4ded003f3f3c
-fd3c12392f3cfd3c3130015d005d33112132171e02151402212111112132
-36353426272623219e0229924d6c9259eefec9fe88017bbc9e5d4c3184fe
-8905ba0e1265b66dbbfefdfdac03018c7f5c83150d00>ArialMT AddT42Char 
-3 5440 70 <00010050ffe803ed043e001a015ab1020243545840340e7f0f010f0b0140
-0050007000030004121c0b07181c040b010e1507080e0e0255070c0d0d02
-55070c0c0c025507100b0b0255072f2b2b2b2bcdd4c6003fed3fed10c45d
-3210c45d3231301b4047090c011f1c4313431753135317601360179b029b
-039a0da410a41a0c080d190a6a0269036a05750c700d800da60cb509b60a
-b50c0c160c860ce302030e225f0f6f0f7f0f030f01b802aa407930004000
-5000600070009000a000e000f00009000f0f0b000004121c0b07181c040b
-1c0f010f240e080d0d06550e221b000100240b2b1f010100010101400b0b
-065501401010065501480c0c0655011a0d0d065501491c1524cf07011f07
-3f0702070e0b0b0655070a1010065507120c0c065507311b34c4182b10f6
-2b2b2b5d71ed10f62b2b2b2b5d724b53234b515a58b90001ffc03859ed72
-f42bed72003fed3fed12392f11392f105de4105de43130005d71015d7159
-011706062322001134123633321617072626232206151416333236033cb1
-1defaedafef772e989addc1faf197f5a88aaa4846a8e018517b7cf011d01
-0aac010281afa11b6b6cc3d3d6c28200>ArialMT AddT42Char 
-3 6312 72 <0002004bffe8041e043e0015001d015340171f001c150255035d055d0955
-0b65036b056f09650b0815b8ffe4b40d0d065511b8ffe440520d0d06551d
-1c0d0d06552712d905fa14f61a0431123a19311c41124d1a411c51125c19
-521c61126d1a611c78067815f602f618100016010f0d1717501660167016
-03161c0f9010a010021010041b1c0a0700ba02aa0001ffc0b41010025501
-b8ffc04010101006551001010195131c040b17400db8ffdcb40d0d02550d
-b8ffeeb40d0d06550db8ffeab40c0c06550db8ffc04009272a34b00d010d
-1a1fb8ffc0b32526341fb8ffc040411e2334301f011f163310240740242a
-341f073f074f070307200b0b025507180c0c0255071c0d0d0255070e0b0b
-0655071c0c0c065507160d0d065507191e3437182b4e10f42b2b2b2b2b2b
-5d2b4dfde44e10712b2bf6712b2b2b2b4ded003fedfd5d2b2be43fed1239
-2f5d3cfd713c011112393912393130015d005d2b2b2b0171720117060623
-22001110003332001114072116163332360121262726232206035eba2cee
-b9e9feef0114dcd5010e01fce80ab285638cfdda02510c3856897ca90156
-17a3b4011f0103010c0128fedefef91020afba680195864368a6>ArialMT AddT42Char 
-3 6758 73 <000100130000028005d30017010d401e1409010f192f193019401970199b
-0c9c0da90d081a0d280db019c0190419b8ffc040281a1f341d080d030c0f
-1c0a0115022b1413040306000a9f140114ff134004172504000302920101
-00b8ffc0b331383400b8ffc0402b1c1f3490000119400f0f025519400d0e
-025500141010025500280f0f025500220e0e0255002c0d0d025500b8fff2
-400b0c0c025500140b0b065500b8ffeab41010065500b8ffe6b40f0f0655
-00b8fffab70c0c065500a31819bc01ba002100f6010a00182b2bf62b2b2b
-2b2b2b2b2b2b2b2b5d2b2b3c10f43c103ced10eded5d003f3f3c3c3cfd3c
-3fed391139313043794014101106090706080602061009121b0011060f1b
-012b012b2a8181012b715d00723311233533353437363633321707262322
-06151533152311b29f9f131a83764c5c1b38325244cfcf039a8c716b3446
-57129d0a4660628cfc66>ArialMT AddT42Char 
-3 8014 76 <000200880000013c05ba0003000700cd405e09360b0b02554f099009a009
-b009c009df09f0090700091f09700980099f09b009c009df09e009ff090a
-1f09010001070402030906037e0100060506040a0607250500049f04a004
-b004c004e00406c004f0040200042004d004e0040404b8fff8b410100255
-04b8fffa40170e0e025504040c0c0255040a0b0b025504140b0b065504b8
-ffeab41010065504b8fffeb40d0d065504b8fffc400a0c0c0655044e0847
-50182b10f62b2b2b2b2b2b2b2b5d71723cfd3c003f3f3c3fed0111123939
-111239393130015d72712b133533150311331188b4b4b404ebcfcffb1504
-26fbda00>ArialMT AddT42Char 
-3 9202 79 <000100830000013705ba000300e3b605360b0b025505b8ffc0b337383405
-b8ffc0b334353405b8ffc0b330313405b8ffc0b322253405b8ffc0402515
-17340f051f059f05df05044f05df05f005031f0570058005ff0504010000
-0a0203250100b8ffc0b337383400b8ffc040153335349f0001c000f00002
-00002000d000e0000400b8fff8b41010025500b8fffa401d0e0e02550004
-0c0c0255000a0b0b025500140b0b065500081010065500b8fffeb40d0d06
-5500b8ffffb40c0c065500b8fffc400a0c0c0655004e044750182b10f62b
-2b2b2b2b2b2b2b2b5d71722b2b3cfd3c003f3f3130015d71722b2b2b2b2b
-2b3311331183b405bafa4600>ArialMT AddT42Char 
-3 10468 82 <00020044ffe80427043e000d0019016bb615180d0d065513b8ffe8b40d0d
-06550fb8ffe840730d0d065519180d0d065512070a190c47064808560659
-08670669080834103a123a16351845104b124b1645185c055c0952105d12
-5d1652186d056d0964106d126d1664187701150906050d5b035405540a5b
-0c6c036505650a6c0c0a171c0407111c0b0b14241b400d0d02551b400b0b
-025507b8ffea40110f0f025507180d0d025507100b0b025507b8fff0b40b
-0b065507b8fff0b40d0d065507b8fff0b40f0f065507b8fff0b40c0c0655
-07b8ffc04013242534300701000710072007030731df1b011bb8ffc04049
-1e2334301b011b0e24000c0e0f025500120d0d0255000c0c0c0255001c0b
-0b0255000e0b0b0655000e0d0d0655000c1010065500160c0c0655004024
-25341f003f000200311a3437182b10f65d2b2b2b2b2b2b2b2b2bed10712b
-5df65d5d2b2b2b2b2b2b2b2b2b2bed003fed3fed313001715d0071435c58
-4009530553096205620904015d59002b2b2b2b1310373633320015140606
-23220013141633323635342623220644a489c5db01167beb8bdffeedb9b2
-8786b2b38587b2021301278e76fee1fdcdeb82011e010dcccbccd1c5cbca
->ArialMT AddT42Char 
-3 11776 85 <00010085000002c6043e001100c9403b2f13011004012304340443045304
-66047404060911080908090d1311090d000308010b1c06070106000a0928
-900801082220130113022211250100b8ffc04010333634f0000100002000
-d000e0000400b8fff8b41010025500b8fff840110e0e025500040c0c0255
-00060b0b025500b8fffcb41010065500b8fff440160f0f065500060c0c06
-5500080d0d0655004e1247c4182b10f62b2b2b2b2b2b2b2b5d712b3cfde4
-105df472e4003f3f3fed11393911393901111239390010c9870e7dc43130
-005d72015d33113315363633321707262322060706151185a23e693f5b5e
-3e42423b5e141e0426a171483aa727473f6072fdd400>ArialMT AddT42Char 
-3 13680 89 <0001001a000003e80426000a01eab1020243545840170508000a08060106
-0a0005090805010205240f0f0255052f2bddcd10ddcd113333003f3f3f12
-3931301bb7350501002211390ab8ffde400d11390916121c340816121c34
-02b8ffeab3121c3401b8ffeab3121c340ab8ffd840091e213400281e2134
-0ab8ffe8400922253400162225340ab8ffda407e282e340020282e340f0c
-29002809260a3900350a4800470a56015602590858096601660269086909
-78007701770279087809770a870187028603890788088a099d009809910a
-ac00a20abd00b707b10ac900c50ada00d50aec00e30afb00f40a2c0a0005
-0a1800160a2800260a370a4f00400a09054012163405400b0d34b1060243
-5458400905010008060106000ab8fff4400f0d0d06550a000c0d0d065500
-050908b8fff440120d0d0655080501020c0d0d06550205050c0b1112392f
-dd2bcd10dd2bcd10cd2bcd2b002f3f3f11123931301b40370a0708082509
-0a1409090a0003020225010014010100050a0a000a09080802020106070a
-09030001052f0c010c22084040400980090209b8011bb5400580050205b8
-011b400920024001220bead2182b10f6ed1a19fd5dfd5d1a18ede45d1112
-3939123939003f3c103c103c3f3c113987052e2b877dc4872e182b877dc4
-593130002b2b01715d2b2b2b2b2b2b2b2b2b2b2b2b005d59210133131617
-363713330101aefe6cbee4251f182becb9fe6e0426fd84676f54760288fb
-da00>ArialMT AddT42Char 
-2 0 0 <00020100000005000500000300070000211121112521112101000400fc20
-03c0fc400500fb002004c000>ArialMT AddT42Char 
-ArialMT /CharStrings get begin
-/period 17 def
-/D 39 def
-/P 51 def
-/c 70 def
-/e 72 def
-/f 73 def
-/i 76 def
-/l 79 def
-/o 82 def
-/r 85 def
-/v 89 def
-end
-ArialMT /Encoding get
-dup 46 /period put
-dup 68 /D put
-dup 80 /P put
-dup 99 /c put
-dup 101 /e put
-dup 102 /f put
-dup 105 /i put
-dup 108 /l put
-dup 111 /o put
-dup 114 /r put
-dup 118 /v put
-pop
-end
-%ADOEndSubsetFont
-/KUDFNV+ArialMT /ArialMT findfont ct_VMDictPut
-/KUDFNV+ArialMT*1 
-[46{/.notdef}rp /period 21{/.notdef}rp /D 11{/.notdef}rp /P 18{/.notdef}rp /c 
-/.notdef /e /f 2{/.notdef}rp /i 2{/.notdef}rp /l 2{/.notdef}rp 
-/o 2{/.notdef}rp /r 3{/.notdef}rp /v 137{/.notdef}rp]
-KUDFNV+ArialMT nf
-KUDFNV+ArialMT*1 [9 0 0 -9 0 0 ]msf
-374.75 132.635 mo
-(DeviceProfile.icc)
-[6.48001 5.03998 4.43701 2.043 4.56299 5.04001 6.00308 2.99692 5.04001 2.51999 2.043 2.043 
-5.04001 2.51999 2.043 4.56299 0 ]xsh
-/KUDFNV+ArialMT*1 uf
-/KUDFNV+ArialMT uf
-/ArialMT uf
-gsave
-396.006 143.991 mo
-424.512 143.991 li
-424.512 175.247 li
-396.006 175.247 li
-cp
-clp
-396 143.752 mo
-424.505 143.752 li
-424.505 175.256 li
-396 175.256 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.5033 396 396.248 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-%ADOBeginSubsetFont: ArialMT Initial
-ct_T42Dict begin
--0.664 -0.324 2 1.004
- 256 array 0 1 255 {1 index exch /.notdef put} for  /ArialMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f3210325d73000000cc000000606376
-7420a11cd7eb0000012c000006546670676dcc79599a000007800000066e
-676c796607022dca000094e0000822cc68656164d6144b3e00000df00000
-003668686561123315fe00000e2800000024686d7478f65efffb00000e4c
-000034d46c6f6361361cd72000004320000034d86d617870124c05df0000
-77f8000000206e616d659617a74000007818000011057072657025d64dbf
-0000892000000bbe67646972000000000000000000000000000303880190
-00050008059a05330000011b059a0533000003d1006602120805020b0604
-020202020204e0002affc00078430000000900000000544d432000400020
-fffc05d3fe510133073e01b2400001ffffff0000042605bb000000200004
-05ba001905ba001a05a70019042600180000ffe70000ffe80000ffe7fe69
-ffe805ba0019fe69ffe802ea000000b8000000b80000000000a800ad0169
-00ad00bf00c201f0001800af00b900b400c800170044009c007c00940087
-0006005a00c80089005200520005004400940119ffb4002f00a1000300a1
-00cd00170057007e00ba00160118ffe9007f008503d300870085000d0022
-00410050006f008d014cff75005c00df04830037004c006e00700180ff58
-ff8eff92ffa400a500b903c8fffd000b001a0063006300cdffee05d8ffdc
-002d005c0095009900df019209b500400057008000b9039d0072009a035d
-0401ff67fffa00030021007700cd0004004d00cd01c0022b004c006500e7
-0118017c034305d8ffa3ffb0ffc40003001c005d0068009a00ba01350147
-0221055cff4dffcd0016002d00780080009900b200b600b600b800bd00da
-010c05f0ffa4fff00019002c0049007f00b400ce01c003fefd81fe3f0000
-00050018002900390049006f00be00c700d0012301c1026f050c05320540
-057affd4001400310055005700a700b400e601f7027e027e027f03c60446
-ff42000e0085009100bf00c200c500e1011a012f014f01560229026f029e
-03720008002c00310031006400690089009800c700de012b01b6020c02cf
-03a304ab04fb061dfee0ff0e00060026009b009d00c1010d011801200173
-018201d601e30243025f029b02e2039404a904d20761001c005e006d008d
-00ab00f7011201380151015b0168017c01870191019901cd01d001e80241
-0254026b02ef0368037103bd044204420453047304830586058b06e8fe58
-fec4fed1fef7ff32ff860051007c008100910095009e00b400b900cf00d9
-00d900df00e20105010b010e010e012001210155017b017b017e018d01a2
-01a801a901b401d001d001e201e901f201f501fb020002000206021b0221
-022202220223027202770294029c02cf02cf02d002ec02f903170322032b
-0335033c0359036f037103870390039003b503e1041a04cf04ff05320532
-0596059f05a805ab05c205f0060c0782080008ccfca3fd2afddefe00fe88
-fe96feb2feb4ffe100150019001a001c001f003c005100610061006a0078
-009600a500af00d3010c0118011a012a013e014c0151015f016a01710178
-01820184019a01a501a801a901ae01bc01cd01d701ef0200020d021c0221
-0222022e02350242024f024f025e026502710290029202b402d602fa0307
-030b030f0315032a0347035d036503740379039603b003cc03dd03e203f6
-03fc03fc03ff040a041f04220426042b0447045f0475049e04e704e7055c
-05cb05e5060a066d068606b806f10736073e07500751075d078f07b607d4
-086000b600c300b500b700000000000000000000000001e00381034503b5
-008e0233041902ce02ce002d005f0064034d023f000002a80188027d01b4
-02240578063b023b014e00f00426029402c6029f02f6023b034d014b0153
-006a0231000000000000061404aa0000003c04c300ed04bc026502ce03b5
-0078060c017e02ef060c00b201000239000001c50330042b03cb00da03df
-010704a100db040a011701ed02a70350010b01bd043e05580021039c00ae
-0371017d00b5024500000afb088c012b014e01aa00870054013201f803ff
-0003024e00b4003703e30083006b02d800ed00770088009701640467008e
-0033017c00e700a6029e0329056e062a061501c90269048a021301b40002
-04a9000002390124010305140084015d039a06ef02d9007500cf040a00de
-03ac04bc02cf02ae034d04f005520168006d007d00860071ff8100790558
-04d2016700030156002504e00094007c033204210094007f0072005c002f
-00b6001800ba00b80041034d00720018001f004c016a01550099009a009a
-009800b200040078006900140057006e00ce00b4065402b80067050e0165
-00e7000004cbfe52005affa60099ff67006eff92002dffd40087ff7c00b8
-00a800e5008f00a80185fe7b0070001e00d900de014c054602cf0546ff2d
-028a02d90253029600b700000000000000000000000000000125011800ea
-00ea00ae0000003e05bb008a04d70053003fff8cffd50015002800220099
-0062004a00e4006d00ee00e5004803c00033fe4e02b1ff460370007905df
-0051ffa7ff1f010a0068ff6c004f00bc00a507050061072b00ed04b001d2
-00b6007b00650252ff740365fe690094008f005c00400086007500890089
-4043555441403f3e3d3c3b3a3938373534333231302f2e2d2c2b2a292827
-262524232221201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09
-0807060504030201002c4523466020b02660b004262348482d2c45234623
-6120b02661b004262348482d2c45234660b0206120b04660b00426234848
-2d2c4523462361b0206020b02661b02061b004262348482d2c45234660b0
-406120b06660b004262348482d2c4523462361b0406020b02661b04061b0
-04262348482d2c0110203c003c2d2c20452320b0cd442320b8015a515823
-20b08d44235920b0ed51582320b04d44235920b09051582320b00d442359
-21212d2c20204518684420b001602045b04676688a4560442d2c01b10b0a
-432343650a2d2c00b10a0b4323430b2d2c00b0172370b101173e01b01723
-70b10217453ab10200080d2d2c45b01a234445b01923442d2c2045b00325
-456164b050515845441b2121592d2cb00143632362b0002342b00f2b2d2c
-2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b1
-2cc08a8cb8100062602b0c642364615c58b00361592d2c45b0112bb01723
-44b0177ae4182d2c45b0112bb01723442d2cb01243588745b0112bb01723
-44b0177ae41b038a45186920b01723448a8a8720b0a05158b0112bb01723
-44b0177ae41b21b0177ae45959182d2c2d2cb0022546608a46b040618c48
-2d2c4b53205c58b002855958b00185592d2c20b0032545b019234445b01a
-23444565234520b00325606a20b009234223688a6a606120b01a8ab00052
-7921b21a1a40b9ffe0001a45208a54582321b03f1b235961441cb114008a
-5279b31940201945208a54582321b03f1b235961442d2cb110114323430b
-2d2cb10e0f4323430b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2c
-b10e0f432343650b2d2cb11011432343650b2d2c4b525845441b2121592d
-2c0120b003252349b04060b0206320b000525823b002253823b002256538
-008a63381b212121212159012d2c4bb06451584569b00943608a103a1b21
-2121592d2c01b005251023208af500b0016023edec2d2c01b00525102320
-8af500b0016123edec2d2c01b0062510f500edec2d2c20b001600110203c
-003c2d2c20b001610110203c003c2d2cb02b2bb02a2a2d2c00b00743b006
-430b2d2c3eb02a2a2d2c352d2c76b8022323701020b802234520b0005058
-b00161593a2f182d2c21210c6423648bb84000622d2c21b08051580c6423
-648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb815
-55621bb200802f2b59b002602d2c0c6423648bb84000626023212d2cb400
-0100000015b00826b00826b00826b008260f10161345683ab001162d2cb4
-000100000015b00826b00826b00826b008260f1016134568653ab001162d
-2c4b53234b515a5820458a60441b2121592d2c4b545820458a60441b2121
-592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb01343
-58031b02592d2cb0134358021b03592d2c4b54b012435c5a58381b212159
-2d2cb012435c580cb00425b00425060c6423646164b807085158b00425b0
-0425012046b01060482046b0106048590a21211b2121592d2cb012435c58
-0cb00425b00425060c6423646164b807085158b00425b00425012046b8ff
-f060482046b8fff06048590a21211b2121592d2c4b53234b515a58b03a2b
-1b2121592d2c4b53234b515a58b03b2b1b2121592d2c4b53234b515ab012
-435c5a58381b2121592d2c0c8a034b54b00426024b545a8a8a0ab012435c
-5a58381b2121592d2c4b5258b00425b0042549b00425b00425496120b000
-5458212043b0005558b00325b00325b8ffc038b8ffc038591bb040545820
-43b0005458b00225b8ffc038591b2043b0005458b00325b00325b8ffc038
-b8ffc0381bb00325b8ffc03859595959212121212d2c462346608a8a4623
-20468a608a61b8ff8062232010238ab902c202c28a70456020b0005058b0
-0161b8ffba8b1bb0468c59b0106068013a2d2cb1020042b123018851b140
-0188535a58b910000020885458b202010243604259b12401885158b92000
-0040885458b2020202436042b12401885458b2022002436042004b014b52
-58b2020802436042591bb940000080885458b202040243604259b9400000
-8063b80100885458b202080243604259b94000010063b80200885458b202
-100243604259b94000020063b80400885458b20240024360425959595959
-2d2cb0024354584b53234b515a58381b2121591b21212121592d00000001
-00000005028fa58dc35f5f0f3cf5081b080000000000a2e3272a00000000
-c14fd713faaffd671000080c00000009000100010000000000010000073e
-fe4e00431000faaffa7a1000000100000000000000000000000000000d35
-06000100000000000239000002390000023900b002d7005e047300150473
-0049071d0077055600580187005a02aa007c02aa007c031d004004ac0072
-023900aa02aa0041023900ba0239000004730055047300df0473003c0473
-00560473001a047300550473004d047300610473005304730055023900b9
-023900aa04ac007004ac007204ac00700473005a081f006f0556fffd0556
-009605c7006605c7009e055600a204e300a80639006d05c700a4023900bf
-04000037055600960473009606aa009805c7009c063900630556009e0639
-005805c700a10556005c04e3003005c700a105560009078d001905560009
-0556000604e300290239008b023900000239002703c100360473ffe102aa
-00590473004a0473008604000050047300460473004b0239001304730042
-0473008701c7008801c7ffa20400008801c7008306aa0087047300870473
-0044047300870473004802aa00850400003f02390024047300830400001a
-05c700060400000f040000210400002802ac0039021400bc02ac002f04ac
-00570556fffd0556fffd05c70068055600a205c7009c0639006305c700a1
-0473004a0473004a0473004a0473004a0473004a0473004a040000500473
-004b0473004b0473004b0473004b023900bd023900230239ffe502390009
-047300870473004404730044047300440473004404730044047300830473
-0083047300830473008304730049033300800473006b0473001b04730051
-02cd006d044c000104e3009905e5000305e50003080000e102aa00de02aa
-003d0464004e080000010639005305b4009a0464004e0464004d0464004d
-0473fffd049c00a003f4003805b4007a069600a1046400000231000002f6
-002f02ec002d0625007f071d004404e3008104e3009e02aa00e804ac0072
-046400540473002e0464003304e5001a047300860473008c080000ef0556
-fffd0556fffd0639006308000081078d00520473fffc0800000002aa0053
-02aa004701c7008001c7006c0464004e03f4002f04000021055600060156
-fe390473ffe402aa005c02aa005c040000170400001704730049023900b9
-01c7006c02aa0047080000250556fffd055600a20556fffd055600a20556
-00a20239008d0239ffe00239000402390015063900630639006306390063
-05c700a105c700a105c700a1023900c602aa001902aa000602aa001d02aa
-002e02aa00e502aa00a202aa006b02aa003a02aa004b02aa002804730000
-01c700030556005c0400003f04e3002904000028021400bc05c7fffd0473
-004905560006040000210556009e0473008704ac007204ac00a102aa006b
-02aa001902aa002106ac006b06ac006b06ac0021047300000639006d0473
-0042023900b10556005c0400003f05c700660400005005c7006604000050
-04730046046bffe102aa00ee0556fffd0473004a0556fffd0473004a05c7
-009e04eb004705c7fffd055600a20473004b055600a20473004b04730096
-01c7004204730096025500880473009a02ac008305c7009c0473008705c7
-009c04730087063900630473004405c700a102aa008505c700a102aa003c
-0556005c0400003f04e300300239002404e300300300002305c700a10473
-008305c700a10473008304e300290400002804e3002904000028046800a4
-063900600662005504a00048047400480391006204f000440329002e0530
-0048046bffe1040000b002eb005208c000330800004f040000990800004f
-040000990800004f040000980400009807d5016a05c0009e04ab007204d5
-009d04ac007104d5022204d5010505abffe9050001c905ab027e05abffe9
-05ab027e05abffe905ab027e05abffe905abffe905abffe905abffe905ab
-ffe905ab01c005ab027e05ab01c005ab01c005abffe905abffe905abffe9
-05ab027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab
-01c005ab01c005abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905abffe905abffe905ab02d605ab006605abffea05d5ffff04d50092
-0800000007eb013007eb012007eb013007eb012004d500b204d5008004d5
-002a082b0198086b01b807550010060000f40600006f0440003a05400037
-04c0003f04150040040000250600005505e100bf038d008904d5ffd90180
-008002d50086071500610296000f04d5009202d6008302d6008304d500b2
-02d600700556fffd0473004a05c700660400005005c70066040000500556
-00a20473004b055600a20473004b055600a20473004b0639006d04730042
-0639006d047300420639006d0473004205c700a40473008705c7001f0473
-00060239ffce0239ffce0239ffe40239ffe40239fff60239fff50239004b
-01c700190400003701c7ffa20556009604000088040000860473009601c7
-fffa05c7009c0473008705c900a50473008b063900630473004406390063
-0473004405c700a102aa006b0556005c0400003f04e300300239000c05c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-078d001905c70006055600060400002101c700890556fffd0473004a0800
-0001071d00440639005304e30081023900b9078d001905c70006078d0019
-05c70006078d001905c70006055600060400002101c7008a02aaffe10473
-001b04cd005a06ac006b06ac002206ac002206ac004a02aa00e202aa006b
-02aa00de02aaffea0557ffff0646ffa706b4ffa80312ffa80632ffa706d8
-ffa70605ffa701c7ff780556fffd055600960558fffe055600a204e30029
-05c700a4023900bf055600960558000b06aa009805c7009c0533006d0639
-006305c700a40556009e04f2009404e30030055600060556000906af007f
-05fb0061023900040556000604a00048039100620473008b01c7006b0460
-0088049a008c04000019038700480473008b0473005c01c7008904000086
-04000018049c00a00400001a0395005c04730044048d008303db00560460
-00880433001105b4007a063f005701c7ffc9046000880473004804600088
-063f0057055700a206eb0032045500a105c000640556005c023900bf0239
-0004040000370875000d081500a406d5003104a900a10515000a05c000a0
-0556fffd054000a705560096045500a1056b0000055600a20763000704d5
-004e05c000a105c000a104a900a10540001206aa009805c700a406390063
-05c000a00556009e05c7006604e300300515000a061500520556000905eb
-009f05550057075500a1078000a106550000071500a8054000a505c00055
-081500a405c7001a0473004a0495005b0440008802eb008804ab00000473
-004b055afffb03ab003204780087047800870380008604ab00180580008c
-046b00880473004404550088047300870400005003aa0026040000210695
-004b0400000f0495008a042b0045066b008d0695008d0500002805c0008b
-042b008404150030060000890455001f0473004b0473000002eb00890415
-004b0400003f01c700880239000901c7ffa2074000130680008304730000
-0380008604000021046b008803e900a1034a008808000041089500a00585
-002d000001010000001e0000003100000031000001010000007e0000007e
-0000008c0000008c000001010000001000000101000001210310007d0000
-008c023300d20000030b0000ff04023900b9048100690456003203310019
-0411002d04d1009601f9009b030f005f04ca009b04b8008c01f9009b0413
-002803b0005003b4003c04ca009b04cf005001f9009b02d2003c0498005a
-043c00190488006e045f007303b1001903d4000a0466009604130028058e
-00640524002803f2009b03f2009b03f2009b01e3005a0356005a0686009b
-01f9ffac041300280413002803b4ff5703b4ff570448002d058e0064058e
-0064058e0064058e00640481006904810069048100690456003203310019
-0411002d04d10096024b0000034a000004b8008c024b00000413002803b0
-005003b4003c04cf005002d2003c0498005a0488006e045f007303d4000a
-0466009604130028058e00640524002801f9009b0456003203b00050045f
-0073049b003c0000ffdc0000ff250000ffdc0000fe51028d00ab028d00a0
-02da0043034d007901a8ffba000000460000004600000046000000460000
-00480000004600000046000000460435017c0435012e043500b704350081
-0435012c043500be043500af043500810435009a043500db04350085028d
-00c1043500b3060001000600010002420036060001000435009e04350098
-043500cb0600010006000100060001000600010006000100000000460600
-010006000100060001000600010006000100060001000600010006000100
-051bffba06000100060001000600010005b5003a05b5003a01f4ffba01f4
-ffba060001000600010006000100060001000481003604350036043dffba
-043dffba03e9004a03e9004a067f0014077600140327ffba041effba067f
-0014077600140327ffba041effba051b003204b500240300fff706000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010000000030
-0000004600000046000000400000004606000100060001000000ffdc0000
-fe510000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ff160000ff160000ffdc0000ff160000ffdc0000ff200000ffdc0473
-004a08000000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010006000100028d
-007f028d005d0600010004ee0015034d007901a8000e01d6ffdc01a80056
-01d60010037500320375003201a8002d01d60013051b003204b5002401f4
-ffba01f4ffba01a8009301d6001305b5003a05b5003a01f4ffba01f4ffba
-024200000300fff705b5003a05b5003a01f4ffba01f4ffba05b5003a05b5
-003a01f4ffba01f4ffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba02b3
-005f02b3005f02b3005f02b3005f03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba08c9003e08c9003e06c5ffba06c5ffba08c9003e08c9003e06c5ffba
-06c5ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7
-ffba04a7ffba045a002a039a00360435ffba0327ffba045a002a039a0036
-0435ffba0327ffba064f0027064f00270224ffba021affba04a7004604a7
-00460224ffba021affba04cf002d04cf002d0327ffba0327ffba040d0047
-040d004701a8ffba01a8ffba02b4002302b400230327ffba0327ffba0435
-00450435004501f4ffba01f4ffba024200360300fff7039affba0327ffba
-0375003203750032051b003204b50024051b003204b5002401f4ffba01f4
-ffba045a004004ce0049045a002604ce0039045a005304ce004a045a0053
-04ce004a0600010006000100000000460000004606000100060001000600
-010000000046000000460600010006000100000000480000004606000100
-060001000600010000000046000000460000004600000046000000400000
-003006000100000000460000004606000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d00ca028d00c7028d
-00c606000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000100ffba0800ffba1000ffba06dc0063053f004406d5
-00a1055b00830000fddc0000fc2f0000fca60000fe540000fcd70000fd73
-0000fe290000fe0d0000fd110000fc670000fd9d0000fbf50000fc720000
-fed50000fed50000ff02041b00a006ac006b06ac00190000feb60000fd73
-0000fe080000fca60000fe530000fd110000fbc80000faf40000faaf0000
-fc720000fbaa0000fb6a0000fcf10000fc7d0000fbdd0000fcc10000fb98
-0000fdea0000fe840000fdc20000fcf10000fd5f0000fe760000febc0000
-fceb0000fd6c0000fd580000fc900000fd150000fc2c0000fc130000fc12
-0000fb960000fb9601c700880556fffd0473004a0556fffd0473004a0556
-fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473004a
-0556fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473
-004a0556fffd0473004a0556fffd0473004a055600a20473004b055600a2
-0473004b055600a20473004b055600a20473004b055600a20473004b0556
-00a20473004b055600a20473004b055600a20473004b0239006301c7001f
-023900ba01c7007c06390063047300440639006304730044063900630473
-004406390063047300440639006304730044063900630473004406390063
-0473004406dc0063053f004406dc0063053f004406dc0063053f004406dc
-0063053f004406dc0063053f004405c700a10473008305c700a104730083
-06d500a1055b008306d500a1055b008306d500a1055b008306d500a1055b
-008306d500a1055b00830556000604000021055600060400002105560006
-040000210556fffd0473004a0239ffe201c7ffb0063900630473004405c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-05c700a1047300830000fefe0000fefe0000fefe0000fefe0455fffd02eb
-000c07630007055afffb04a900a10380008604a900a10380008605c700a4
-046b00880473fffd040000140473fffd04000014055600090400000f0555
-0057042b0045055500a10473008706050063047300550639006004730044
-05b5003a01f4ffba0224ffba021affba04a7004601f4009e01f4001001f4
-001b01f4001001f4006b01f4fff90227ffce0000000f0000fff502aa00a4
-02aa00a40000000e00000056000000560000ffcf01a8000f01d6ffbf01a8
-fff501d6ffcd01a8001d01d6fff501a8009301d600130375003203750032
-0375003203750032051b003204b5002405b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba
-01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4
-ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a
-01f4ffba01f4ffba0481003604350036043dffba043dffba048100360435
-0036043dffba043dffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba0481
-003604350036043dffba043dffba02b3003202b3003202b3005f02b3005f
-02b3005f02b3005f02b3003202b3003202b3005f02b3005f02b3005f02b3
-005f02b3005f02b3005f02b3003802b3003802b3004902b3004903e9004a
-03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9
-004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba0692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba08c9003e08c9003e06c5ffba06c5ffba04a7ffba04a7ffba045a
-002a039a00360435ffba0327ffba064f0027064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba064f0027064f00270224
-ffba021affba064f0027064f00270224ffba021affba064f0027064f0027
-0224ffba021affba04a7004604a7004604a7004604a70046093e0032093e
-00320740ffba0740ffba067f0014077600140327ffba041effba04cf002d
-04cf002d0327ffba0327ffba04cf002d04cf002d0327ffba0327ffba04cf
-002d04cf002d0327ffba0327ffba067f0014077600140327ffba041effba
-067f0014077600140327ffba041effba067f0014077600140327ffba041e
-ffba067f0014077600140327ffba041effba067f0014077600140327ffba
-041effba040d0047040d004701a8ffba01a8ffba040d0047040d004701a8
-ffba01a8ffba040d0047040d004701a8ffba01a8ffba040d0047040d0047
-01a8ffba01a8ffba043500450435004501f4ffba01f4ffba043500450435
-00450435004504350045043500450435004501f4ffba01f4ffba04350045
-043500450481003604350036043dffba043dffba024200360300fff7031a
-001a031a001a031a001a0375003203750032037500320375003203750032
-037500320375003203750032037500320375003203750032037500320375
-0032037500320375003203750032051bffba04b5ffba051b003204b50024
-01f4ffba01f4ffba0375003203750032051b003204b5002401f4ffba01f4
-ffba051b003204b50024067f0045067f0045067f0045067f004501a80028
-0000fe290000fea20000ff300000ff1d0000ff120000ff920000fe7e08fc
-003208ad00320000ffb50000ffb60000feed0000ff640000fe7e0000ff9f
-018d000002f6fffd0000fe820000ff1004cd00320000ff580000ff580000
-ff640692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba045a002a039a00360435ffba0327ffba034d007902b400230242
-003601f4ffba0290ffba01f4002f01f4003b01f4001201f400b101f4006d
-067f00140776001401f9009b0000fed902bc000003f2009b045afff504ce
-fff5045a005304ce004a045a005304ce004a045a005304ce004a045a0053
-04ce004a045a005304ce004a045a005304ce004a04350071043500ad045a
-000f04ce000f0473001406110014054000a7047300860540000a0473000a
-05c7005105c700660400005005c7fffd067a00140540004a047300460474
-00480556006e04d5005304e3ffc40639006d04fe000f070c008701c70083
-0239001f055600960400008801c7001504000018072000a405c7ffb80473
-008b0639006006f200630557004406090014047300860556009e0556006b
-0400004f04f20094030b00440239002404e300140239002404e3003005fb
-006105c700a1062e00140400002104e300290400002804e3002904e30031
-045c0044045c003f0473003c0473005503ab003203e50024047300870214
-00bc034e00bc04ac0072023900b00aaa009e09c7009e08640046087f0096
-06aa0096039c008309c7009c078e009c062b0087047300550556fffd0473
-004a0000fefe0556fffd0473004a08000001071d00440639006d0473001a
-0639006d0473004205560096040000880639006304730044063900630473
-004404e30029045c004c01c7ffa20aaa009e09c7009e086400460639006d
-04730042084600a404f2009e05c7009c047300870556fffd0473004a0556
-fffd0473004a055600a20473004b055600a20473004b0239ff8a0239ff64
-023900040239fff60639006304730044063900630473004405c700a102aa
-ffcc05c700a102aa006805c700a10473007605c700a1047300830556005c
-0400003f04e3003002390024045c0051037e001305c700a40473008705a6
-00a404d6005e0486005e04e30029040000280556fffd0473004a055600a2
-0473004b06390063047300440000fefd0639006304730044063900630473
-004406390063047300440556000604000021047300570473004804730086
-04730086040000130400005004730046047300460473005505e9005503ab
-004903ab0032050d0032040f00440239ffb9047300420473004204780050
-0402001904ef00190473008b047300870473008701c7001901c7008901c7
-0089029e0000026e001401c700830493008306aa008406aa008406aa0087
-0473ffa60473008b046c00870473004406530044063f00570466004402aa
-ffe402aaffe402aaffe402aa008502aa008502aa008502aaffe40455008a
-0455008a0400003f01c7ffa20214ffb901c7ff7202cb00000239000f0239
-002404730019048c0044046000880400001a05c700060400001804280019
-0400002804540028045c004c045c00790400002404000050040000240400
-00500639006304400088040f004904780050046b0088032e000004000008
-033b008804730048040000240400005007b7004607400046080b004605b3
-0024036f002405c00024061c0013054a0083050f008303e2001e04380063
-03110064031100640146ffce01eb006401eb000001eb000002ea006403d9
-0000029100000187005a02d7005e01c7008001c7006c01c7008a02aa00fb
-02aa00fb02ca003202ca003204ac007004ac007004ac006504ac006502aa
-012102aa00de02aa005902aa012102aa001d02aa005902aa00de023900b6
-023900b602aa00fb02aa00fb02aa00a602aa00a602aa00a602aa001d02aa
-ffe202aafffb029400000142006402b8003202a0000002ca003203100096
-0310009603100096031000960310009602aa006202aa006202aa002802aa
-001d02aa0047045700960457009604570096045700960457004304570043
-045700430457004304570043031000430457002f0457002f0457002f0457
-002f0457002f0310002f0457002504570025045700250457002504570025
-0310002f0457001a0457001a0457001a0457001a0457001a0310001a0457
-004204570042045700420457004204570042031000420457009604570096
-045700960457009604570042045700420457004204570042045700420310
-00420457002f0457002f0457002f0457002f0457002f0310002f0457002f
-0457002f0457002f0457002f0457002f0310002f04570026045700260457
-002604570026045700260310002604570042045700420457004204570042
-045700420310004204570096045700960457009604570096045700420457
-004204570042045700420457004203100042045700260457002604570026
-045700260457002603100026045700230457002304570023045700230457
-0023031000230457002f0457002f0457002f0457002f0457002f0310002f
-0457004b0457004b0457004b0457004b0457004b0310004b045700960457
-009604570096045700960457004204570042045700420457004204570042
-031000420457001a0457001a0457001a0457001a0457001a0310001a0457
-002404570024045700240457002404570024031000240457002f0457002f
-0457002f0457002f0457002f0310002f0457004e0457004e0457004e0457
-004e0457004e0310004e045700960457009604570096045700960000fec1
-0000fec60000fdac0000fed80000ff920000fee90000ff4c0000fea00000
-fec40000ffce0000ff660000fea00000fed80000fed80000ff970000ff98
-0000ff990000fff40000ff420000ff420000ff440000ff5f0000fe870000
-ffec0000ffa60000ff510000ff510000ff510000fec90000ff1c00000000
-0000fee90000ff4c0000ff930000ff2a0000ff560000ffce0000fe870000
-febb0000fec40000fec40000fed80000fed80000feb30000fec90000fdad
-0000fdac0000feb30000fec90000fdad0000fe160000fee60000ffa60000
-fe870000ff440000feba0000ff230000ff9a0000fdac0000fe8800000000
-0000feb00000ff980000fe930000ffa60000fe870000fdac0000ff660000
-ff440000feb00000feb00000feb00000ff030000ff520000fd1f0000ff53
-0000ff530000ff530000feb50000feb50000ffc30000feae0000fedc0000
-fec70000fec80000fedc0000fe1e0000ff420000ff510000feb70000feb0
-02aa00de02aa005902aa00fa049a008c04600088062e001407aa0000062e
-0014047b004c063f005704cf0044063900630473004405c7006604000050
-04e300a8033b008804ff0000043c0032060d000a049d0042072000a406aa
-0084056500630473008b056400a40400000a0556006b0556006b04e00005
-04c5001905e5005f046e004403b600140347002804cf00440495005b0400
-005001c7ffa2063900600389004d03890050055600a205c000a10473004b
-047800870ab4006d04fe00100639001404e70014079900bf05b500880558
-000b0400001a072e00bf0590008806a10078057b007a086d00bf06f00088
-04d5006603ab001f065f0039058200480639006004730044066d0009050c
-001a066d0009050c001a0b010063091c004406aa005c04e600440987006d
-06d000500000fe370ab4006d04fe001005c7006604000050040700140000
-fea60000febc0000feaa0000fead0000fc2b0000fc4c05c000a104780087
-05400004042b00140556009e04730087055d00a40464008804d5004e03ab
-003204a900040380000005ef002904490028070900a4052f0088091800a0
-06f6008806060066042b005005c700660400005004e3003003aa00260767
-00310587002605550057042b004506e4000a0554000a06e4000a0554000a
-023900bf07630007055afffb055700a1046800860540001204ab001805c7
-00a4046b008805c700a4046b008805550057042b004506aa00980580008c
-02aa002e0556fffd0473004a0556fffd0473004a08000001071d00440556
-00a20473004b060500630473005507630007055afffb04d5004e03ab0032
-04d5004e045c004c05c000a10478008705c000a104780087063900630473
-0044063900600473004405c0004a0415002b0515000a040000210515000a
-040000210515000a0400002105550057042b0045071500a805c0008b0540
-004a0473004607bf004a0703004607a6006606860053054d006604130053
-07c3001207470018084600a4070700880639006d0478005005f900300553
-00260000ff430000fec90000ff770000ffb00000ff470000ff560000ff74
-0000fed70000feac000000000000ff520000ff56000000000000feac0000
-fd9a000000000000ff6a0000ff7c0000ff690000ff560000feac0000ff7f
-0000ff560000fdef0000ff430000ff690000ff7c000000000000fdae0000
-ff8c000001020000fefe0000fefe0000fedf0000fedf0000ff580000ff20
-0000fefe0556fffd0473004a055600960473008605560096047300860556
-00960473008605c700660400005005c7009e0473004605c7009e04730046
-05c7009e0473004605c7009e0473004605c7009e04730046055600a20473
-004b055600a20473004b055600a20473004b055600a20473004b055600a2
-0473004b04e300a8023900130639006d0473004205c700a40473008705c7
-00a40473008705c700a40473008705c700930473006805c700a404730087
-0239ffdf01c7ff9202390020023900060556009604000088055600960400
-008805560096040000880473009601c7007e0473009601c7ffb904730096
-01c7ffa50473009601c7ffa306aa009806aa008706aa009806aa008706aa
-009806aa008705c7009c0473008705c7009c0473008705c7009c04730087
-05c7009c0473008706390063047300440639006304730044063900630473
-004406390063047300440556009e047300870556009e0473008705c700a1
-02aa008505c700a102aa008505c700a102aa005e05c700a102aa00260556
-005c0400003f0556005c0400003f0556005c0400003f0556005c0400003f
-0556005c0400003f04e300300239002404e300300239002404e300300239
-ffff04e300300239000e05c700a10473008305c700a10473008305c700a1
-0473008305c700a10473008305c700a104730083055600090400001a0556
-00090400001a078d001905c70006078d001905c70006055600090400000f
-055600090400000f055600060400002104e300290400002804e300290400
-002804e3002904000028047300870239000305c70006040000210473004a
-01c7008904a0004804a0004804a0004804a0004804a0004804a0004804a0
-004804a000480556fffd0556fffd06820013068200130682001306820013
-068200560682005603910062039100620391006203910062039100620391
-0062061e0000061e0000076c0000076c0000076c0000076c00000473008b
-0473008b0473008b0473008b0473008b0473008b0473008b0473008b068f
-0000068f0000081f0000081f0000081f0000081f0000081ffff3081ffff3
-01c7008101c7008101c7ff9b01c7ff9b01c7ffeb01c7ffeb01c7ffa201c7
-ffa20301000003010000049100000491000004910000049100000491fff3
-0491fff3047300440473004404730044047300440473004404730044069d
-0000069d0000082d0000082d000007c9000007c900000460008804600088
-0460008804600088046000880460008804600088046000880682000007ae
-00000812000007ae0006063f0057063f0057063f0057063f0057063f0057
-063f0057063f0057063f0057065f0000065f000007ef000007ef0000078b
-0000078b0000078bffff078bffff04a0004804a000480391006203910062
-0473008b0473008b01c7ffe601c700680473004404730044046000880460
-0088063f0057063f005704a0004804a0004804a0004804a0004804a00048
-04a0004804a0004804a000480556fffd0556fffd06820013068200130682
-00130682001306820056068200560473008b0473008b0473008b0473008b
-0473008b0473008b0473008b0473008b068f0000068f0000081f0000081f
-0000081f0000081f0000081ffff3081ffff3063f0057063f0057063f0057
-063f0057063f0057063f0057063f0057063f0057065f0000065f000007ef
-000007ef0000078b0000078b0000078bffff078bffff04a0004804a00048
-04a0004804a0004804a0004804a0004804a000480556fffd0556fffd0556
-fffd0556fffd0556fffd02aa00e502aa00fd02aa00e502aa000602aa0006
-0473008b0473008b0473008b0473008b0473008b068200000682000006f3
-000006f3000005c700a402aa001302aa001302aa000601c7ffbb01c7ffab
-01c7ffca01c7ffca01c7ff9301c7ff930239001a0239fff5036500000365
-000002aa001302aa001302aa000604600088046000880460008804600088
-048d0083048d00830460008804600088055600060556000606e600000718
-0000061e000002aaffea02aaffea02aa0059063f0057063f0057063f0057
-063f0057063f005707650000069d000007270000065f000005fb006102aa
-00de02aa00e50473000d05c7006605c7006606aa008705c70024095000a1
-078d00190556001f04e30030080000290400003004c100660000ff530000
-ff530000ff530000ff5301c7001901c7ffa2042b00050556001105740046
-02cbffa3057a008702f0ffc8057f000a057f000a02aa008402aa008402aa
-00c902aa00c902aa00a002aa005902aaffaf02aa003a02aa0006023900b9
-02aa00a902aa00a902aa00a902aa00a9032e001e032e001e02aa003a0000
-ff730000ffa50000fed80000ff230000ff720000ff720000fee70000ffa5
-0000ff530000ff530000ff530556009e0473008703f8001905fb0019071d
-00440440001904000050046900870469001903eb008703ab003201c70088
-0361004104000088033600100580008c04780087047300440400001304de
-004404de004404de000d078d005003a800440473004404730044042b0084
-0455001f0455001f03aa00260460008804c6004405de004404c600440400
-001a05c700060400002803ab0032036b003f04db001f02eb00880400001a
-04550088042b008405b4007a04ab001803a00000054f0000035100320351
-ffd103980032034800320348003203f80032036e0032015600690284002d
-0366003202d000320415003203710032036f003204180032030f00320359
-0032039c003203760031036f003204fb000002fa003202fa003203040032
-04cc0032030500640305003202f9003202f90032028c0032028c00320304
-00320142006402b6006404950064030f00640305003202d5003203050032
-030500320306006401c20032030f00640342003204950064029200000320
-00000315006402920000030600320385003202bf00000142006401eb0064
-030f0064029200000315006402920000030900320385003202bf000005ed
-00460a660046061300460689ffba0541ffba01e9003c045a00110000ff0d
-0000ff350000fece0000feb70000fec90000ffcf0000ff4f0000ff9e0000
-feca02b3005f02b3005f03e9004a03e9004a039affba0327ffba039affba
-0327ffba05ad0069053d002d05fd009604dc005004e0003c05f6009b053f
-00280650002804ac00720000fe3b0000fe660000fe660473fffc02aa0053
-02d5ffce01a8ffba01a8ffba01a8ffba01a8ffba0658001509c500470400
-000008000000040000000800000002ab0000020000000155000004730000
-02390000019a000000ab00000000000005e5000305c7006606aa00980580
-008c0744008307180046071800480556fffd05c70066040000140473000a
-04e300300400004f0400002804a5001d000001020000ff420000febf0000
-ff3a0000ff53048d000a05c7005105c7006605c70051045500a102eb0088
-0000ff430000ff040000ffac02d200960000ff37021affba0250001e0000
-ff3a0000ff5b0000ff5f0000ff7e0000ff940000ff4a0000fe9c05b5003a
-05b5003a01f4ff9601f4ff9605b5003a05b5003a01f4ffba01f4ffba05b5
-003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba
-05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba0481003604350036043dffba
-043dffba0481003604350036043dffba043dffba02b3003202b3003202b3
-005f02b3005f03e9004a03e9004a0692003e0692003e043fffba043fffba
-045a002a039a00360435ffba0327ffba045a002a039a00360435ffba0327
-ffba045a002a039a00360435ffba0327ffba064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba067f0014077600140327
-ffba041effba067f0014077600140327ffba041effba067f001407760014
-0327ffba041effba02b4002302b400230327ffba0327ffba02b4002302b4
-00230327ffba0327ffba043500450435004501f4ffba01f4ffba04350045
-0435004501f4ffba01f4ffba043500450435004501f4ffba01f4ffba040d
-0047040d004701a8ffba01a8ffba03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0473ff93047300460239ffbf06aa
-ffd50473ffb70473ff9102aaffa402aaffa40400ffff0239ffb904000028
-04730089030b0064047400480649002401c7001901c700190473001e0460
-001e048c000a04730086047300460239001305b400420400008801c7fffc
-06aa00870473008b0473008702aafffb0400003f0318ffa20400001a0400
-000f040000280473004a04730048047300460473004b03ab004903ab0032
-0534005501c700880400001301c7ffa204730083045c004c0304006402d5
-003202c9003302fc0032028c003201d5003201d500000304003203110064
-01420019014200640142006401420019022a000001420064014200090233
-00640493006404930064030fffc9030f0064030e00640305003203000032
-02b800320142ffca01c20032030f001d031a00320306006402d400640292
-000002de003202de003202de003202f4003202ea00320000febc0000febc
-0000ff730000fea9023900b902fa003202f900320305003202a0000002f9
-00320639006d0556fffd0473000f05c7006602aa004104a0004804a00048
-04a0004804a0004804a0004804a0004804a0004804a0004801c7ff9b01c7
-ffab01c7ff9b01c7ffab01c7ff9b01c7ffbb01c7ff9b01c7ffbb04600088
-0460008804600088046000880460008804600088046000880460008801c7
-ffab01c7ffab01c7ffbb01c7ffbb04600088046000880460008804600088
-045a005304ce004a03a000130556001105c700290558000b055600a20473
-004b0400003301c7ffa205e600630473004805c7000002aa000f05560006
-0400002104000013040000500400001301c700830455fffd02eb00010556
-00090400000f055600090400000f04d5005303ab00490540001204ab0018
-0000fec60000fed40000fec60000fed40000fe5f0000fe5f0000ff720000
-ff730000fee7078b000a03eb004c040000130473000a01c700150473fff4
-0556001105c700a1047300190239ff8b05c700a404730087055600960400
-008804e30029040000280400003b049e00a403670088053000480000ff53
-0000ffbc0000fefe0000fefe0000fea40000fea401c70088000000000000
-002a0000002a0000002a0000002a000000d60000017e00000320000005a6
-0000074e000009380000097e000009fe00000aa400000b8400000bec0000
-0c6400000caa00000ce600000d5600000f1200000fee00001218000013f2
-000015520000170c000018e20000198e00001c2200001e5600001eb20000
-1f7000001ff200002062000020e8000021da000023da000025840000271c
-000028560000299e00002a6200002b1800002ca800002dae00002e920000
-2f7a000031b00000323a000035640000370e000038420000394800003b3c
-00003da800004052000041000000422400004398000045d6000048e20000
-4a8800004bc800004c3200004c9c00004d0000004d8800004dbc00004e38
-0000510a000052e80000549c000056500000580e0000596200005b520000
-5cf600005dea00005f020000619a00006296000064c60000668c0000684e
-00006a1200006ba800006cae000070560000717a00007318000075360000
-79a000007bc400007e1c00008004000081020000814e00008250000082f0
-0000833c00008370000083ac000083ee000084540000849a000084ce0000
-85040000853a0000858a000085cc0000861e00008656000086a8000086de
-0000871e000087600000879e000087e800008828000088560000888e0000
-88de00008914000089540000898e000089d200008a1c00008a5800008a88
-00008acc00008b0400008b9400008c1a00008e2800008fbc0000916c0000
-91b80000924c00009470000096c4000098b4000099a000009a2200009a8c
-00009baa00009d0600009f4e0000a0b00000a13e0000a1e80000a2ac0000
-a3f40000a59e0000a68c0000a7520000a7b60000a8240000a94e0000aa72
-0000ab020000ace40000af3e0000b2900000b3860000b42c0000b47c0000
-b5320000b6520000b7f00000b88a0000b94e0000ba0e0000ba760000bab2
-0000bb0a0000bb580000bd700000bfb60000bfee0000c0200000c14a0000
-c2760000c3240000c3c80000c46a0000c53c0000c5900000c5c60000c61e
-0000c7700000c7e20000c83c0000c9b40000cb200000cc000000cc320000
-ccce0000cdf20000d0680000d0a20000d0e60000d1220000d1840000d1c6
-0000d20c0000d2580000d28a0000d2de0000d31c0000d34c0000d38a0000
-d3d00000d4120000d4500000d4d20000d5400000d6260000d6620000d6e2
-0000d7160000d7b80000d8400000d8ac0000d90e0000d97a0000da660000
-db580000db8c0000dbc00000dbf00000dc340000dcac0000de260000e040
-0000e0720000e0ac0000e1a60000e3340000e36a0000e4ce0000e54a0000
-e62a0000e7200000e8b00000ea1a0000ec080000ed040000ed4a0000ed7e
-0000edc00000edfa0000ee4e0000ee960000eee00000ef100000ef400000
-f1280000f1660000f18e0000f1be0000f1f20000f2180000f23e0000f286
-0000f43c0000f5b60000f5dc0000f6020000f6460000f6760000f6a60000
-f6fc0000f7da0000f8ec0000f9300000f9660000f9c00000f9fe0000fa32
-0000fa620000fa9e0000fade0000fb1c0000fb580000fb9a0000fbd00000
-fc0c0000fc4c0000fc720000fc960000fce60000fe420000fe980000fecc
-0000ff1a0000ff660000ffa80000ffe0000100160001005e000101000001
-029c00010464000105e6000107d80001092a00010aae00010b9000010d2a
-00010d9400010dbc00010e5a000110dc0001111c0001115c0001119c0001
-11da000112380001129600011304000113240001140e000114ae000114e4
-000115320001157c000115c6000115e2000115fe0001161e0001163e0001
-165e0001167e000116a4000116ca000116f000011716000117460001176e
-00011796000117c2000117ee000118220001184c00011878000118ae0001
-18d8000119040001193a000119640001198e000119c2000119f200011a26
-00011a6a00011a9a00011ace00011b1000011b4400011b7600011bb80001
-1bec00011c1c00011c5e00011ca200011ce800011d4400011d6000011d7c
-00011d9800011db400011dd000011f3e000121ea0001245a000124760001
-2490000124ac000124c8000124e4000125000001255c0001259600012600
-000126ca0001276a00012840000128c000012948000129b800012a4e0001
-2aac00012af200012b5000012bb200012c6a00012d2800012d5400012db0
-00012df400012f60000130540001307e0001309a000130c6000130fe0001
-314a0001318a000131be000131ee0001321e0001324e00013292000132c2
-000132f2000133320001336200013392000133c200013402000134320001
-346200013492000134b8000136bc000136ec0001371c0001386c00013a22
-00013a5200013a8000013ab000013ade00013b0e00013b3c00013b600001
-3b8400013bb400013d2400013d5c00013d8c00013f1e00013f4c00013f7a
-00013fa800013fd00001412e000142c6000142fe0001433e0001437a0001
-43aa000143d8000143f4000144240001445400014544000146ac000146dc
-000147160001475600014786000147b6000147f80001481e000148440001
-4884000148c4000148f40001493400014a1e00014a9e00014b8200014bb2
-00014be200014c1200014c4200014c7e00014cb000014ce200014d120001
-4d4200014d8800014dba00014dea00014e2000014e9200014ec600015094
-000151960001532600015556000157a6000159380001599c00015a260001
-5a3600015ac400015cc200015dee00015f5a0001604a000161ce000163e8
-000166140001670600016716000167260001683e0001684e0001685e0001
-686e0001687e0001688e000169ac000169bc000169cc00016a4000016a50
-00016b2000016b3000016c4200016c5200016c6200016c7200016dd00001
-6fae00016ff0000170260001705c0001708c000170bc0001711000017138
-000172c20001740a0001755e000176c60001784a000178ae00017a400001
-7b5c00017b6c00017b7c00017d0200017d1200017e7800017fd200018106
-00018264000183d200018598000185d800018610000186460001866c0001
-869c000186c200018838000188680001899e000189ae000189be00018a00
-00018a1000018ba400018d5000018eda00018f0200018f320001908e0001
-909e000191d6000191e600019280000193e0000193f000019656000197e0
-000199480001997800019aee00019c2000019c3000019c4000019c500001
-9d2a00019d3a00019d4a00019d5a00019e5200019fcc00019fdc0001a104
-0001a2380001a38a0001a51e0001a63c0001a7c80001a8da0001a9100001
-ab460001abe60001abf60001ad8c0001af2e0001afb20001b1340001b144
-0001b3ac0001b52c0001b6ac0001b6dc0001b87c0001ba020001bbc60001
-bcf20001bd020001be320001be420001be520001bf120001bf220001c108
-0001c1180001c24e0001c35c0001c5080001c6be0001c8000001c9700001
-cab80001cb0a0001ccec0001ce680001cea60001d04c0001d0700001d1b0
-0001d1c00001d1d00001d2080001d2180001d3a40001d50c0001d6800001
-d6a40001d6d40001d8420001d8f40001d9b20001d9e00001db960001dc8e
-0001dd1c0001de420001def00001dfc40001e00e0001e0860001e1460001
-e16e0001e1b20001e2080001e2e40001e32e0001e3620001e38a0001e3b2
-0001e3e60001e42a0001e46e0001e4ac0001e5ea0001e6a20001e7c20001
-e8380001e9060001e9580001e9ea0001ea9a0001eb8e0001ebe20001ec78
-0001ed360001ee200001eed20001eff20001f0440001f0ee0001f2240001
-f2fc0001f3e20001f4e80001f5ce0001f6b00001f7a40001f8420001f948
-0001fa420001faba0001fb320001fba80001fbde0001fc3a0001fd020001
-fd8e0001fdc60001fe0c0001fe3c0001fea60001ff660001ff9a0001ffca
-0001fffe0002002e0002005e0002008e0002022e00020266000202a60002
-02de00020316000203b2000204ac000204dc00020580000205ae000205ee
-0002063e0002066e000206ba00020852000209b800020b1800020b5e0002
-0bb200020bea00020d5c00020d9200020e2400020e6200020e9000020ece
-00020ffe0002102600021162000211f20002129c0002131e000213da0002
-14f20002160000021634000216ba0002181600021898000218e2000219ec
-00021a3400021b3800021bb400021c0c00021c9000021d7a00021e900002
-1f8c0002203600022126000221f8000222e2000223ca0002247a000224fc
-0002275a00022784000227ae0002286600022890000229d200022ad80002
-2bc200022bec00022c1600022c4000022c6a00022c9400022e1400022e3e
-00022e6800022e9200022ebc00022ee600022f1000022f3a00022f640002
-2f9800022fc200022fec0002301600023190000231a0000232ba000232ca
-000232f40002331e00023348000233720002351c00023738000238660002
-3876000239f200023a0200023b4800023d1400023e1a00023f9a0002413a
-0002435e000244b80002469a000247de0002490c000249fa00024a240002
-4a4e00024a7800024aa200024acc00024af600024b2000024b4a00024b74
-00024b9e00024bc800024bf200024c1c00024c4600024c7000024eac0002
-50280002516c000253540002549c000254c6000254f00002552000025550
-000255a0000255f000025630000256a2000256f600025754000257aa0002
-57e00002582200025868000258b2000258e20002591a0002594a00025a82
-00025dc800025df200025e1c00025e4600025e7000025e9a00025ec40002
-5eee00025f1800025f4200025f6c00025f9600025fc000025fea00026014
-0002603e0002606800026092000260bc000260e6000261100002613a0002
-61640002618e000261b8000261e20002620c0002623600026260000262fe
-000263140002633e0002661e0002662e000267480002686a000269a80002
-6aea00026c9000026ca000026de200026f3200027122000272f60002740e
-0002741e000274a00002752e0002762e0002763e000276de000276ee0002
-78040002795600027a8600027a9600027b6400027b7400027cea00027cfa
-00027e0e00027e1e00027f52000280e8000281a4000281b4000282b20002
-840c00028498000284a8000285d20002875e0002881a0002882a000288c6
-000288d6000289a4000289b400028a8c00028a9c00028ba400028bb40002
-8d7a00028d8a00028ee200028ef20002915c0002916c0002936600029376
-000294e0000294f0000295e0000295f00002978800029798000298b60002
-98c600029a0600029a1600029a2600029a3600029bae00029bbe00029bce
-00029bde00029d3000029e7e00029f4c0002a0300002a1b00002a3320002
-a4320002a5460002a68a0002a69a0002a7880002a8620002a9fe0002aa0e
-0002ab2c0002ac320002ae300002ae400002ae500002ae600002afaa0002
-afba0002b0720002b0820002b1900002b1a00002b28c0002b29c0002b3ba
-0002b3ca0002b4680002b4780002b4880002b5760002b6ea0002b8160002
-b9100002b9200002b9300002b9400002bade0002bc980002bd660002bd76
-0002bfd60002c21c0002c4a20002c7060002c98a0002cbfc0002cdcc0002
-cf820002cfac0002cfd60002cfe60002cff60002d0200002d04a0002d074
-0002d0840002d0940002d0be0002d0e80002d0f80002d1080002d1320002
-d15c0002d1860002d1960002d1a60002d1b60002d1c60002d1d60002d1e6
-0002d2100002d2200002d2300002d25a0002d2840002d2ae0002d2d80002
-d3020002d32c0002d3560002d3800002d3aa0002d3d40002d3fe0002d428
-0002d4520002d47c0002d4a60002d4d00002d4fa0002d5240002d54e0002
-d5780002d5a20002d5cc0002d5f60002d6200002d64a0002d6740002d69e
-0002d6c80002d6f20002d71c0002d7460002d7700002d79a0002d7c40002
-d7ee0002d8180002d8420002d86c0002d8960002d8c00002d8ea0002d914
-0002d93e0002d9680002d9920002d9bc0002d9e60002da100002da3a0002
-da640002da8e0002dab80002dae20002db0c0002dbac0002dbf00002dc66
-0002dc900002dcba0002dce40002dd0e0002dd380002dd620002dd8c0002
-ddb60002dde00002de0a0002de340002de5e0002de880002deb20002dedc
-0002df060002df300002df5a0002df840002dfae0002dfd80002e0020002
-e02c0002e0560002e08a0002e0be0002e0f20002e2840002e4200002e5bc
-0002e7480002e78e0002e7d40002e8420002e89e0002e8f00002e9600002
-ea380002eb040002ebdc0002eca80002ed480002ee620002ef160002ef98
-0002eff20002f0320002f1500002f29a0002f4320002f48e0002f4ec0002
-f5480002f5a40002f6580002f70e0002f7ba0002f8660002f9120002f9ca
-0002fa820002fb3a0002fb4c0002fb5e0002fb700002fb820002fb940002
-fc020002fc700002fd280002fd3a0002fd4c0002fd5e0002fd6e0002fd80
-0002fd920002fda40002fdb60002fdc80002fdda0002fe880002ff340002
-ffe20003008e00030126000301600003018a000301b4000302080003025a
-000302d6000303200003039c000303f000030474000304c60003053c0003
-0594000305fa00030650000306aa0003072800030774000307d200030836
-00030884000308d20003092a000309720003099c000309ca000309f00003
-0a2400030a5400030a8400030ad600030b4400030b9a00030c0e00030c62
-00030cd600030d1c00030d8400030dca00030e2600030e5600030e900003
-0eb600030ee600030f0c00030f3200030f6400030f9400030fe60003104c
-000310a2000311080003115c000311ca0003120c0003126c000312ae0003
-12fa0003133400031370000313aa000313e60003141a0003144c0003147c
-000314ac000314d6000314fc00031526000315540003157e000315ca0003
-160e0003164400031680000316b4000316e200031720000317500003178a
-000317b4000317e2000318080003182e0003185a000318b6000318e60003
-1916000319460003197e000319b2000319e000031a1000031a4000031a70
-00031aa000031ad400031b2a00031b5e00031bbe00031bf200031c4a0003
-1c7e00031cda00031d7800031e4600031f660003202e000320be00032154
-000323400003253c000326b400032830000329da00032b8c00032c740003
-2daa00032ea200032fb4000330d20003320800033372000334e000033676
-000337f2000339020003391200033a3e00033b7a00033cbc00033e400003
-3f1a00033f9000034046000340ec0003425c000342940003430e000343d0
-0003448a000344f2000345f80003472e000347fa00034958000349d20003
-4a4c00034b1800034bd200034c8600034ce200034d3c00034d8400034df4
-00034e7000034eba00034ef400034f3a00034f7e00034fd0000350220003
-50a40003512600035168000351a8000351de000352140003524200035270
-000352a4000352d80003531a0003535c00035398000353d40003540e0003
-54480003547a000354ac000354de000355100003554a00035584000355c6
-000356080003564a0003568c000356da000357280003576a000357ac0003
-57ec0003582c00035866000358a0000358ec0003593800035976000359b6
-000359fc00035a4200035a7e00035ad400035b1000035b4c00035b8c0003
-5bcc00035c0800035c4400035c8400035cc400035d0800035d4c00035da0
-00035e2e00035e7000035eb200035f1a00035f8200035fb400035fe60003
-601e00036056000360ec00036182000361cc00036216000362520003628e
-000362e40003633a00036384000363ce000364260003647e000364be0003
-64fe000365360003656e000365b800036602000366400003667e000366c0
-0003670200036756000367aa000367f0000368360003687c000368c20003
-69180003696e000369c400036a1a00036a6600036ab200036afe00036b4a
-00036bbe00036c3200036ca600036d1a00036d5800036d9600036dd40003
-6e1200036e5000036e8e00036ed200036f1600036f6200036fae0003700e
-0003705a00037098000370e6000371f60003724600037296000372ce0003
-73060003735c000373b2000374260003748a000374cc0003750e00037564
-000375b2000375fe0003764a0003768a000376ca000377120003775a0003
-77c6000378200003785800037890000378d000037910000379e000037adc
-00037b9c00037c8a00037ce000037d3600037d8800037ddc00037e400003
-7ea400037efa00037f5000037fc60003803c0003807e000380c000038102
-0003814400038186000381c80003821e00038274000382c60003831a0003
-83a200038424000384c400038566000385a4000385e2000386200003865c
-0003869a000386d80003871600038752000388360003892200038a380003
-8b5400038c1e00038ce800038de200038edc00038fda000390d8000391f6
-000393140003943a000395600003966200039764000397f6000398880003
-98c6000399040003995e000399b8000399f000039a2800039b3800039b48
-00039b9000039bd800039c3000039c8800039cba00039cec00039d2e0003
-9d7000039daa00039de400039e2800039e6c00039ee400039f5e00039fee
-0003a0320003a0720003a0f40003a1760003a2ce0003a2de0003a32c0003
-a37a0003a3b60003a3f20003a4380003a47e0003a4cc0003a51a0003a56a
-0003a5ba0003a6160003a6720003a7e80003a9500003a9880003a9c20003
-aa0e0003aa5a0003aaac0003aafe0003ab500003aba60003abe20003ac1e
-0003ac740003acc80003ae000003aea00003aeee0003af2e0003af680003
-b0fe0003b3820003b4460003b5dc0003b73a0003b8080003b9ae0003bc02
-0003be3a0003be800003beb20003bf5c0003c0800003c0a40003c13e0003
-c24a0003c35a0003c46a0003c5780003c6fe0003c7300003c7d20003c7fa
-0003c85c0003c8be0003c9200003c9820003c9c00003c9fe0003ca380003
-ca720003ca9e0003caea0003cb240003cb5e0003ccba0003ce0e0003ce1e
-0003cedc0003d0120003d0700003d1880003d3160003d3bc0003d5020003
-d5400003d57e0003d5bc0003d6100003d6380003d6920003d6f60003d73e
-0003d7a00003d8000003d8720003d8ee0003d96a0003d9ec0003da780003
-db040003db8e0003dc0e0003dc480003dc840003dde80003deb20003dee2
-0003df120003e04a0003e19a0003e1aa0003e2980003e36c0003e4640003
-e55a0003e6dc0003e8360003e8460003e95e0003ea0a0003eb4c0003eca2
-0003ecfe0003ee5c0003eeea0003f0900003f2020003f3160003f34e0003
-f3b20003f5620003f6cc0003f72e0003f8960003f99c0003fa520003fafe
-0003fc260003fd140003fdf40003ff34000400600004017a000402ea0004
-046400040474000405540004064a000406fa000407f6000408a2000409ac
-00040a9800040bc200040ce600040dea00040f1800041056000411c20004
-12f80004148c000416340004172c000418400004197200041a6400041a9c
-00041af200041ba000041bb000041c1200041c6e00041cd400041d200004
-1d6000041d9800041dc400041df200041e2c00041f6200041f960004201a
-000420d00004210000042184000421b4000421ec00042384000425100004
-255a00042594000425ea000426360004265c00042682000426c400042706
-0004274800042778000427b0000427e60004281c0004285e0004288e0004
-28be000429b400042ab800042aec00042b2400042b6a00042b9e00042bce
-00042c0600042c3a00042c6e00042c9e00042cce00042d0400042d3a0004
-2d6a00042d9a00042dce00042e0200042e3200042e6200042e9c00042ed0
-00042f0200042f3400042f6800042f9c00042fcc00042ffc0004302a0004
-305800043166000432d2000434060004353a0004356a000435a40004363e
-000437a800043904000439c800043adc00043b0c00043b4000043c380004
-3de800043e4000043eb800043ff400044032000440a4000440d400044104
-0004413e000441c6000441f600044226000443b6000445000004460c0004
-471a000448460004499c00044af800044c5800044d9200044f0400045064
-000450740004522a00045352000453ec0004557400045584000456800004
-58060004595e00045a1000045ae000045bec00045c9600045cce00045cde
-00045d8e00045e3400045eb000046000000460f4000461ea000462f60004
-63ce000464a80004653c0004664e000467de000468fc000469f200046a9c
-00046b4600046c1000046cb800046d8e00046e0a00046e6600046fc80004
-70fc000472980004735a0004745a00047532000476700004771c000477e6
-000478d6000479fc00047ad800047bde00047d1600047e0600047ea40004
-7f960004810600048250000484bc0004858e000486420004871000048804
-000489420004895200048a8600048b9800048ba800048cb400048de40004
-8e3800048fac000490d4000491e80004939a000495ae00049842000499fc
-00049b2800049d0800049eca0004a05c0004a1280004a2c40004a33a0004
-a3e80004a4c40004a5500004a5f20004a6940004a7780004a8b00004ab0c
-0004ac540004ac640004ac740004acd60004ad340004ad960004ae340004
-aecc0004afd00004b0be0004b0ce0004b0de0004b1780004b2120004b24e
-0004b2ca0004b33e0004b3940004b3c80004b44e0004b4da0004b5520004
-b5b00004b64a0004b6dc0004b75c0004b7de0004b8720004b8a60004b908
-0004b9ba0004bb800004bbb80004bd940004bea80004beb80004beee0004
-bf320004bf760004bfba0004bff00004c0220004c0640004c1000004c156
-0004c1fc0004c2740004c2fa0004c36a0004c3cc0004c4520004c4b20004
-c51c0004c5900004c6000004c65e0004c7040004c79c0004c8080004c898
-0004c8f60004c9640004ca0c0004cab80004cb4e0004cbb80004cc3a0004
-cc9e0004cd4a0004ce020004ceae0004cf3c0004cf980004d0040004d05a
-0004d0dc0004d15a0004d1e00004d26c0004d2c60004d3320004d3a20004
-d4120004d4820004d5060004d5960004d5fc0004d6760004d6f20004d76a
-0004d8100004d8ac0004d93c0004d99a0004da380004dab40004db460004
-dbe80004dc920004dd2a0004dd860004dddc0004de440004deea0004df92
-0004e05c0004e1020004e1640004e1bc0004e21c0004e2aa0004e3300004
-e3be0004e41e0004e4820004e4ec0004e5540004e5bc0004e63a0004e6c2
-0004e7560004e7c20004e82a0004e88e0004e9360004e9f00004ea9e0004
-eb2c0004eb8a0004ebf60004ec660004ed0c0004edb60004ee780004ef1a
-0004ef7e0004f00e0004f0800004f1100004f18e0004f20a0004f2760004
-f3040004f3600004f3be0004f4440004f4c00004f5280004f58c0004f5e0
-0004f64e0004f6b60004f7340004f7aa0004f8240004f8a40004f9000004
-f9660004f9ca0004fa6a0004fb0c0004fbc20004fc720004fcce0004fd46
-0004fda40004fe2e0004fec60004ff560004ffbc0005001a000500a80005
-011a000501ae00050246000502b6000503260005039e000503fc0005045c
-000504d60005053000050590000505ea00050646000506ae0005073c0005
-0772000507aa0005083600050860000508a20005093600050a2400050ab4
-00050aea00050b3a00050bac00050c5800050cea00050d4200050d9c0005
-0df400050e4e00050ed200050f5800050ffc000510a4000510e200051152
-000511e60005127e00051314000513be000513f000051440000514940005
-14da0005157e000516080005168e000516ee000517320005178000051820
-000518b000051950000519f600051a9c00051b6000051b9200051bbc0005
-1c4200051cf200051d2400051d4c00051e1a00051e7800051f1200051f60
-00051fc60005206e000520dc00052142000521ce00052240000522b60005
-236a000523c40005243400052470000524c200052548000525a80005264c
-0005272c00052854000529e400052a4000052a9600052dbc00052e560005
-2eb200052efa00053068000531ba000532000005330e000533a6000534b4
-000535be0005366000053748000537da000538760005396800053a680005
-3ae400053b6a00053bb200053d2400053e8000053f6400053fb400053fe8
-000540d6000541fe00054398000544c8000545de000547120005482e0005
-489c0005493000054a7000054b2600054c9000054dc000054ef20005501e
-000550ca0005519000055262000553bc0005553c0005566c000557880005
-594200055a9400055b8000055c5c00055d1e00055e8800055fd800055fe8
-00055ff800056008000560c000056176000561b2000561e8000562200005
-6256000563e2000565f6000566e0000567f80005697000056ade00056bc8
-00056cfa00056e4200056fc800057166000572ba000574a80005766e0005
-78a400057af200057bda00057cb600057dfe00057f800005806800058182
-000581c40005820e0005842a000586420005878e0005890400058b620005
-8d6400058de800058e1800058e6400058f2c00058ffc0005919000059218
-00059280000592c0000592fe000594b0000596e000059816000599f80005
-9ad400059bee00059d9a00059fa60005a0a80005a1940005a3860005a58e
-0005a6fa0005a87e0005a9de0005ab4c0005abda0005ac6a0005ad840005
-ae900005b0520005b1be0005b3ae0005b5780005b60c0005b6a80005b73e
-0005b7c60005b8ac0005b9840005bb1e0005bcb00005bcd60005bcfc0005
-bd0c0005bd3c0005bd6c0005bee60005c0880005c1320005c2140005c2d4
-0005c37e0005c4180005c4fa0005c5b80005c6940005c84a0005c9840005
-ca100005ca400005ca700005caa40005cad80005cae80005caf80005cb28
-0005cb580005cb8c0005cbc00005cbf40005cc280005cc5c0005cc900005
-ce0a0005ce1a0005ce4a0005ce7a0005ceb20005cee60005cf1a0005cf4e
-0005cf820005cfb60005cfea0005d0220005d0580005d0880005d0c80005
-d1000005d1480005d18e0005d1c20005d1f60005d2300005d2680005d308
-0005d3180005d46a0005d6320005d7d80005d9820005dace0005dbe40005
-dcf20005de080005df020005dfea0005e10c0005e2080005e2e00005e3d0
-0005e48c0005e53e0005e6080005e67a0005e7200005e7b00005e8140005
-e9220005e9880005ea360005eb2c0005eb940005ebfc0005ecac0005ee86
-0005ef8a0005f00a0005f0480005f0f40005f1820005f26a0005f3020005
-f3680005f4660005f5280005f5e20005f6200005f6b00005f7b20005f846
-0005f88a0005f9a80005fad20005fcb40005fe760005ffac000600da0006
-01da000602020006022a0006026000060292000602be000602e60006030e
-0006033c0006039a000604080006044000060478000604a8000604ce0006
-0502000605380006055e00060584000605b2000605e00006060c00060682
-000606aa0006070c00060732000607580006077e000607a4000607d40006
-0804000608340006086e0006089e000608d400060904000609360006095c
-00060982000609b6000609ec00060a1c00060a4c00060a7200060a980006
-0abe00060aec00060b2000060ba600060bea00060c2400060c5800060c9c
-00060cd600060d1000060d3600060d6000060dac00060dee00060e140006
-0e4200060e6800060e8e00060ece00060f0000060f3000060f6000060f86
-00060fac00060fdc0006100c00061032000610580006107e000610a40006
-10ca000610f000061118000611a0000611ca0006123e00061266000612dc
-000613040006136600061398000613ca000613fa00061432000614640006
-1492000614cc000614f40006155400061596000615c6000615f200061622
-000616520006167a000616a2000616ca0006172c00061754000617b20006
-17f60006183a0006186a000618a0000618c6000618ee000619140006193c
-000619620006198a000619b2000619dc00061a0200061a2800061a4e0006
-1a8000061aa800061b2e00061b5800061bc200061bf200061c2200061c48
-00061c6e00061cc600061cf600061d3200061d5c00061d8c00061dbc0006
-1df000061e2400061e5400061e9400061ece00061f1600061f3c00061f62
-00061f8800061fae00061fd4000620140006205400062090000620c00006
-20f0000621200006215000062188000621c000062200000622400006227a
-000622b4000622f00006232e00062378000623c2000624080006244e0006
-2490000624d20006250200062532000625660006259a000625d40006260e
-0006265a000626a6000626fe00062756000627ae0006280c0006283c0006
-286c000628a2000628d80006290e0006294a0006297e000629b200062a06
-00062a5a00062aae00062b0200062b5600062baa00062c0200062c5a0006
-2c8800062cb600062ce800062d1a00062d6000062da600062dd800062e0a
-00062e5c00062eb400062ef800062f3c00062f8000062fc4000630180006
-306c0006309c000630cc000631020006313800063176000631bc00063210
-0006325a000632ac000632fe0006335e000633be000633ee000634200006
-345a00063494000634e60006353a00063584000635cc0006360e00063678
-000636c6000637120006374400063776000637aa000637de000638140006
-384a00063888000638be000638f00006392c00063982000639d800063a36
-00063a9400063aea00063b4000063b7400063ba400063be800063c1e0006
-3c4e00063c9200063cd000063d0800063d4000063d7600063db200063de2
-00063e1e00063e5e00063ea400063eee00063f3a00063f8600063fdc0006
-403200064080000640ce0006411c0006416c000641c8000642240006427c
-000642d4000643280006437c000643be0006440000064448000644900006
-44d8000645260006456a000645ae000646140006467a000646e000064746
-000647ac000648120006487c000648e60006492e00064976000649be0006
-4a0600064a5200064a9e00064af200064b3e00064b8200064bd000064c38
-00064ca000064d1000064d8000064de800064e5000064e9000064ece0006
-4f1800064f4200064f8800064fc00006500e0006503e0006506e000650aa
-000650de000651040006515800065196000651ea000652d0000653f80006
-543a00065460000654b6000654e60006552800065570000655be00065608
-000656580006567e000657660006584a0006599c000659ca000659f80006
-5a8c00065b1200065b4000065bca00065bfa00065c2a00065c7800065cc6
-00065daa00065e8600065fca00065ffa0006602a000660c0000661480006
-6178000661a8000661d80006626800066298000662c80006631a00066362
-000663b80006644e000664e60006655a000665ac000665d60006662c0006
-6660000666aa000666e20006673200066770000667bc000667e20006685e
-000668b0000669c200066bcc00066d8000066f0200067074000673160006
-75e6000677a6000678ec00067b4600067c8800067e9e00067ef000067f40
-00067f9600067fec0006804e000680d600068324000684b6000686c20006
-87de0006899200068b1400068bd400068cb600068d1e00068d8000068df6
-00068e5e00068f0a00068f7a0006900a0006911e000691e20006922e0006
-92c40006937000069414000694be000695080006954a000695c000069628
-000696b800069766000697d0000698340006989a00069954000699ea0006
-9a4800069a7200069a9c00069aac00069abc00069b7e00069c8200069e8c
-00069fe200069ff20006a0a20006a1860006a1e60006a1f60006a2520006
-a2b00006a3d00006a4be0006a4ce0006a4de0006a4ee0006a4fe0006a5e4
-0006a6e40006a8bc0006aa780006ab7e0006abf80006ac720006ad240006
-ad340006ae420006ae520006ae620006af240006b0580006b1440006b154
-0006b1640006b1740006b2da0006b4460006b5720006b5820006b5920006
-b5a20006b5b20006b6940006b6a40006b8060006b9100006ba0e0006bb46
-0006bc180006bc960006bd140006be340006beb00006befc0006bf880006
-c09c0006c0f00006c2320006c2f20006c3be0006c4b40006c5be0006c670
-0006c7d60006c83c0006c9000006cb020006cc900006ce0e0006cf3e0006
-d1f00006d3320006d4600006d5d80006d7500006d8d00006da5e0006dc10
-0006dc7e0006dde20006df1a0006e01e0006e1540006e2860006e3560006
-e4260006e5820006e65c0006e6fc0006e8000006e92a0006ea280006eba8
-0006ed120006ee500006efc80006f1140006f1f60006f25e0006f3000006
-f3a00006f49e0006f6060006f7400006f8d40006fa1e0006fb020006fb60
-0006fc660006fcfc0006fdbe0006fe640006fea400070050000701220007
-01e800070310000704b0000705bc00070614000707ac0007083a0007084c
-0007087c000708ac000708e40007091c000709520007098e000709c40007
-0a0000070b6e00070bb800070c5200070cea00070d6400070de800070e4e
-00070efa00070f46000710660007111c000711f20007122a000712680007
-12dc000713d6000714f4000715f6000716380007167a000716e8000716f8
-000717080007171800071728000717380007174800071758000717680007
-17780007178800071798000717980007191c0007192c000719ec00071ab2
-00071be800071dde00071fe0000721dc00072412000726120007267e0007
-27900007292200072a7a00072b2c00072b7000072c0e00072d3e00072d8e
-00072e2400072f6000072f70000731260007325a000732aa000733000007
-33c20007340600073448000734ce0007352c0007361e000736ac000736e2
-0007375c000737d4000738240007393000073a2600073ad000073afa0007
-3b2400073b4e00073b7800073bb800073bf800073c3000073c6800073cb2
-00073cfc00073d3c00073d7c00073dc600073e1000073e5000073e900007
-3eea00073f4400073f7e00073fb800073ffc0007404000074084000740c8
-0007411c00074170000741bc00074208000742460007428a000742da0007
-432a00074384000743e20007440c00074436000744d00007456a000745ae
-000745f2000747080007471800074760000747a8000747fa0007484c0007
-48b60007490a00074956000749b400074a3e00074aa200074ae600074b30
-00074b9800074be200074c2200074c6a00074ca600074ce200074d1e0007
-4d5800074d9a00074ddc00074e1c00074e5c00074ea600074ef000074f46
-00074f9e00074fec0007503a0007507c000750ca0007510c000751560007
-5198000751dc0007523800075294000752e00007532c00075376000753c0
-000753fe0007543c000754ba0007553800075572000755ac000756460007
-56e0000757b400075888000758e400075940000759b400075a2800075b86
-00075b9600075c8000075c9000075cc600075cfc00075d3600075d700007
-5dac00075de800075e2e00075e7400075fda00076190000762dc0007649a
-00076610000767b8000768e8000769ee00076c0c00076d5000076ee60007
-706e000770ec0007723000077438000774cc00077560000776b4000777de
-0007795800077a9800077c0400077cf200077ebc00078050000780d20007
-8204000782ee0007845600078538000786ee000787e00007894200078a7e
-00078b7200078d3600078ebe00079062000791c600079362000795200007
-96a600079742000798b6000799a800079a9000079c1000079d6200079e82
-0007a01a0007a1f00007a37e0007a4280007a4de0007a6900007a7340007
-a7c20007a80e0007a85a0007a8d20007a9b00007aa2a0007aacc0007ab20
-0007ac840007adb00007aec20007afc40007b08c0007b2000007b3400007
-b5660007b6100007b73a0007b83e0007b9de0007baca0007bbc40007bcc2
-0007bda80007bec20007c07c0007c22a0007c3980007c4100007c4840007
-c5a20007c6260007c7280007c8b40007ca2c0007cb620007cc6c0007cde2
-0007cf5a0007d14c0007d33a0007d5000007d5740007d6240007d6da0007
-d78a0007d8480007d9420007da460007db400007dc4c0007dcd40007dd62
-0007ddea0007de7e0007df5a0007e0500007e1340007e22a0007e2be0007
-e37a0007e40e0007e4cc0007e5bc0007e6c40007e7c20007e8d60007e9f8
-0007eb0c0007ec4c0007ed860007eea80007efbc0007f1000007f2540007
-f4680007f61a0007f6ce0007f7ea0007f8c00007f9de0007fabc0007fc50
-0007fd0a0007fda60007fe980007ff800008006c000800ea000801e40008
-03220008044e00080482000804c6000804d600080576000806180008070e
-000807fa000808d4000809ac00080b0a00080c6a00080d0800080d9e0008
-0ddc00080e1c00080e5a00080e9a00080ef400080f4c00080fa60008100a
-0008109600081292000812e20008140e0008149400081514000815ee0008
-16c2000817c6000819b200081aca00081b3a00081bca00081c8c00081d5e
-00081dca00081e4800081f9c00081fe2000820280008210c000821480008
-21a6000821e4000822160008225a0008229c000822cc000100000d3500f2
-003c009d000700020010002f005600000468041d0005000200>
-<0000003a02be0000000300000000006a00000000000300000001000a006a
-0000000300000002000e00740000000300000003005e0082000000030000
-0004000a00e00000000300000005001800ea0000000300000006000e0102
-000000030000000700ba01100000000300000008003001ca000000030000
-0009008a01fa000000030000000d02aa028400010000000000000035052e
-000100000000000100050563000100000000000200070568000100000000
-0003002f056f00010000000000040005059e0001000000000005000c05a3
-0001000000000006000705af0001000000000007005d05b6000100000000
-00080018061300010000000000090045062b000100000000000d01550670
-0003000104030002000c07c50003000104050002001007d1000300010406
-0002000c07e10003000104070002001007ed0003000104080002001007fd
-0003000104090000006a080d0003000104090001000a0877000300010409
-0002000e08810003000104090003005e088f0003000104090004000a08ed
-0003000104090005001808f70003000104090006000e090f000300010409
-000700ba091d0003000104090008003009d70003000104090009008a0a07
-000300010409000d02aa0a9100030001040a0002000c0d3b00030001040b
-000200100d4700030001040c0002000c0d5700030001040e0002000c0d63
-0003000104100002000e0d6f000300010413000200120d7d000300010414
-0002000c0d8f000300010415000200100d9b0003000104160002000c0dab
-0003000104190002000e0db700030001041b000200100dc500030001041d
-0002000c0dd500030001041f0002000c0de10003000104240002000e0ded
-00030001042a0002000e0dfb00030001042d0002000e0e0900030001080a
-0002000c0e170003000108160002000c0e23000300010c0a0002000c0e2f
-000300010c0c0002000c0e3b00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0052006500670075006c00610072004d006f006e006f
-0074007900700065003a0041007200690061006c00200052006500670075
-006c00610072003a00560065007200730069006f006e00200035002e0030
-003100200028004d006900630072006f0073006f00660074002900410072
-00690061006c00560065007200730069006f006e00200035002e00300031
-0041007200690061006c004d00540041007200690061006c002000690073
-00200061002000740072006100640065006d00610072006b0020006f0066
-00200054006800650020004d006f006e006f007400790070006500200043
-006f00720070006f0072006100740069006f006e00200069006e00200074
-0068006500200055006e0069007400650064002000530074006100740065
-007300200061006e0064002f006f00720020006f00740068006500720020
-0063006f0075006e00740072006900650073002e0054006800650020004d
-006f006e006f007400790070006500200043006f00720070006f00720061
-00740069006f006e004d006f006e006f0074007900700065002000540079
-00700065002000440072006100770069006e00670020004f006600660069
-006300650020002d00200052006f00620069006e0020004e006900630068
-006f006c00610073002c0020005000610074007200690063006900610020
-005300610075006e0064006500720073002000310039003800320059006f
-00750020006d006100790020007500730065002000740068006900730020
-0066006f006e007400200074006f00200064006900730070006c00610079
-00200061006e00640020007000720069006e007400200063006f006e0074
-0065006e00740020006100730020007000650072006d0069007400740065
-006400200062007900200074006800650020006c006900630065006e0073
-00650020007400650072006d007300200066006f00720020007400680065
-002000700072006f006400750063007400200069006e0020007700680069
-006300680020007400680069007300200066006f006e0074002000690073
-00200069006e0063006c0075006400650064002e00200059006f00750020
-006d006100790020006f006e006c0079002000280069002900200065006d
-0062006500640020007400680069007300200066006f006e007400200069
-006e00200063006f006e00740065006e0074002000610073002000700065
-0072006d0069007400740065006400200062007900200074006800650020
-0065006d00620065006400640069006e0067002000720065007300740072
-0069006300740069006f006e007300200069006e0063006c007500640065
-006400200069006e0020007400680069007300200066006f006e0074003b
-00200061006e006400200028006900690029002000740065006d0070006f
-0072006100720069006c007900200064006f0077006e006c006f00610064
-0020007400680069007300200066006f006e007400200074006f00200061
-0020007000720069006e0074006500720020006f00720020006f00740068
-006500720020006f00750074007000750074002000640065007600690063
-006500200074006f002000680065006c00700020007000720069006e0074
-00200063006f006e00740065006e0074002ea9203230303620546865204d
-6f6e6f7479706520436f72706f726174696f6e2e20416c6c205269676874
-732052657365727665642e417269616c526567756c61724d6f6e6f747970
-653a417269616c20526567756c61723a56657273696f6e20352e30312028
-4d6963726f736f667429417269616c56657273696f6e20352e3031417269
-616c4d54417269616c20697320612074726164656d61726b206f66205468
-65204d6f6e6f7479706520436f72706f726174696f6e20696e2074686520
-556e697465642053746174657320616e642f6f72206f7468657220636f75
-6e74726965732e546865204d6f6e6f7479706520436f72706f726174696f
-6e4d6f6e6f7479706520547970652044726177696e67204f666669636520
-2d20526f62696e204e6963686f6c61732c20506174726963696120536175
-6e646572732031393832596f75206d617920757365207468697320666f6e
-7420746f20646973706c617920616e64207072696e7420636f6e74656e74
-206173207065726d697474656420627920746865206c6963656e73652074
-65726d7320666f72207468652070726f6475637420696e20776869636820
-7468697320666f6e7420697320696e636c756465642e20596f75206d6179
-206f6e6c792028692920656d626564207468697320666f6e7420696e2063
-6f6e74656e74206173207065726d69747465642062792074686520656d62
-656464696e67207265737472696374696f6e7320696e636c756465642069
-6e207468697320666f6e743b20616e6420286969292074656d706f726172
-696c7920646f776e6c6f6164207468697320666f6e7420746f2061207072
-696e746572206f72206f74686572206f7574707574206465766963652074
-6f2068656c70207072696e7420636f6e74656e742e004e006f0072006d00
-61006c006f00620079010d0065006a006e00e9006e006f0072006d006100
-6c005300740061006e0064006100720064039a03b103bd03bf03bd03b903
-ba03ac00a90020003200300030003600200054006800650020004d006f00
-6e006f007400790070006500200043006f00720070006f00720061007400
-69006f006e002e00200041006c006c002000520069006700680074007300
-2000520065007300650072007600650064002e0041007200690061006c00
-52006500670075006c00610072004d006f006e006f007400790070006500
-3a0041007200690061006c00200052006500670075006c00610072003a00
-560065007200730069006f006e00200035002e0030003100200028004d00
-6900630072006f0073006f0066007400290041007200690061006c005600
-65007200730069006f006e00200035002e00300031004100720069006100
-6c004d00540041007200690061006c002000690073002000610020007400
-72006100640065006d00610072006b0020006f0066002000540068006500
-20004d006f006e006f007400790070006500200043006f00720070006f00
-72006100740069006f006e00200069006e00200074006800650020005500
-6e0069007400650064002000530074006100740065007300200061006e00
-64002f006f00720020006f007400680065007200200063006f0075006e00
-740072006900650073002e0054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-4d006f006e006f0074007900700065002000540079007000650020004400
-72006100770069006e00670020004f006600660069006300650020002d00
-200052006f00620069006e0020004e006900630068006f006c0061007300
-2c0020005000610074007200690063006900610020005300610075006e00
-64006500720073002000310039003800320059006f00750020006d006100
-7900200075007300650020007400680069007300200066006f006e007400
-200074006f00200064006900730070006c0061007900200061006e006400
-20007000720069006e007400200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-200074006800650020006c006900630065006e0073006500200074006500
-72006d007300200066006f00720020007400680065002000700072006f00
-6400750063007400200069006e0020007700680069006300680020007400
-680069007300200066006f006e007400200069007300200069006e006300
-6c0075006400650064002e00200059006f00750020006d00610079002000
-6f006e006c0079002000280069002900200065006d006200650064002000
-7400680069007300200066006f006e007400200069006e00200063006f00
-6e00740065006e00740020006100730020007000650072006d0069007400
-7400650064002000620079002000740068006500200065006d0062006500
-6400640069006e0067002000720065007300740072006900630074006900
-6f006e007300200069006e0063006c007500640065006400200069006e00
-20007400680069007300200066006f006e0074003b00200061006e006400
-200028006900690029002000740065006d0070006f007200610072006900
-6c007900200064006f0077006e006c006f00610064002000740068006900
-7300200066006f006e007400200074006f00200061002000700072006900
-6e0074006500720020006f00720020006f00740068006500720020006f00
-750074007000750074002000640065007600690063006500200074006f00
-2000680065006c00700020007000720069006e007400200063006f006e00
-740065006e0074002e004e006f0072006d0061006c004e006f0072006d00
-610061006c0069004e006f0072006d0061006c004e006f0072006d00e100
-6c004e006f0072006d0061006c0065005300740061006e00640061006100
-720064004e006f0072006d0061006c004e006f0072006d0061006c006e00
-79004e006f0072006d0061006c041e0431044b0447043d044b0439004e00
-6f0072006d00e1006c006e0065004e006f0072006d0061006c004e006f00
-72006d0061006c004e0061007600610064006e006f0074006801b001a103
-00006e00670041007200720075006e00740061004e006f0072006d006100
-6c004e006f0072006d0061006c004e006f0072006d0061006c004e006f00
-72006d0061006c000000b900540328b326181fd0bc032900e00329000203
-29b22b1d1fb90327031db23b1f40b80323b31215320f412d03200001002f
-0320000100200320006f032000af032000bf03200004005f031e00010010
-031e007f031e0080031e00af031e00bf031e00d0031e00060000031e0010
-031e0020031e006f031e009f031e00e0031e0006031d031cb2201f104127
-0319007f03190002000f031700ef031700ff03170003001f0317002f0317
-004f0317005f0317008f0317009f03170006000f0317005f0317006f0317
-007f031700bf031700f00317000600400317b2923340b80317b28b3340b8
-0317b36a6c3240b80317b2613340b80317b35c5d3240b80317b357593240
-b80317b34d513240b80317b344493240b80317b23a3340b80317b3313432
-40b80317b32e423240b80317b3272c3240b80317b312253280b80317b30a
-0d32c04116031600d00316000200700316000102c4000f0101001f00a003
-1500b0031500020306000f0101001f00400312b32426329fbf0304000103
-0203010064001fffc00301b20d1132410a02ff02ef0012001f02ee02ed00
-64001fffc002edb30e11329f414a02e200af02e200bf02e2000302e202e2
-02e102e1007f02e00001001002e0003f02e0009f02e000bf02e000cf02e0
-00ef02e0000602e002e002df02df02de02de000f02dd002f02dd003f02dd
-005f02dd009f02dd00bf02dd00ef02dd000702dd02dd001002dc00010000
-02dc0001001002dc003f02dc000202dc02dc001002db000102db02db000f
-02da000102da02daffc002d3b2373932b9ffc002d3b22b2f32b9ffc002d3
-b21f2532b9ffc002d3b2171b32b9ffc002d3b2121632b802d2b2f9291fb9
-0326031cb23b1f40bb0322003e00330322b225311fb80318b23c691fb802
-e3b3202b1fa0413002d400b002d40002000002d4001002d4002002d40050
-02d4006002d4007002d40006006002d6007002d6008002d6009002d600a0
-02d600b002d60006000002d6001002d6002002ca002002cc002002d60030
-02d6004002d6005002d6000802d0b2202b1fb802cfb226421f411602ce02
-c70017001f02cd02c80017001f02cc02c60017001f02cb02c50017001f02
-c902c5001e001f02ca02c6b21e1f00410b02c6000002c7001002c6001002
-c7002f02c5000502c1b324121fff411102bf0001001f02bf002f02bf003f
-02bf004f02bf005f02bf008f02bf000602bf0222b2641f12410b02bb00ca
-0800001f02b200e90800001f02a600a20800406a1f402643493240204349
-3240263a3d3240203a3d329f209f26024026969932402096993240268e92
-3240208e92324026848c324020848c3240267a813240207a813240266c76
-3240206c76324026646a324020646a3240265a5f3240205a5f3240264f54
-3240204f5432b8029eb724271f374f6b0120410f02770030027700400277
-00500277000402770277027700f90400001f029bb22a2a1fb8029a402b29
-2a1f80ba0180bc0180520180a201806501807e01808101803c01805e0180
-2b01801c01801e0180400180bb0138000100800140b40180400180bb0138
-00010080013940180180ca0180ad01807301802601802501802401802001
-3740b80221b2493340b80221b2453340b80221b341423240b80221b33d3e
-320f410f0221003f0221007f0221000300bf022100cf022100ff02210003
-00400221b320223240b80221b3191e3240b80222b32a3f3240b80221b32e
-3a326f414802c3007f02c3008f02c300df02c30004002f02c3006002c300
-cf02c30003000f02c3003f02c3005f02c300c002c300ef02c300ff02c300
-0600df02220001008f02220001000f0222002f0222003f0222005f022200
-7f022200ef0222000600bf022100ef02210002006f0221007f022100af02
-210003002f0221003f0221004f0221000302c302c3022202220221022140
-1d101c102b1048038f1c010f1e014f1eff1e023700161600000012110811
-b8010db6f70df8f70d00094109028e028f001d001f0290028f001d001f02
-8fb2f91d1fb80198b226bb1f41150197001e0401001f013900260125001f
-013800730401001f0135001c0801001f0134001c02ab001f0132b21c561f
-b8010fb2262c1fba010e001e0401b61ff91ce41fe91cb80201b61fe81cbb
-1fd720b80401b21fd51cb802abb61fd41c891fc92fb80801b21fbc26b801
-01b21fba20b80201b61fb91c381fadcab80401b21f8126b8019ab21f7e26
-b8019ab61f7d1c471f6b1cb80401b21f6526b8019ab21f5e73b80401400f
-1f52265a1f481c891f441c621f4073b80801b61f3f1c5e1f3c26b8019ab2
-1f351cb80401b61f301cbb1f2b1cb80401b61f2a1c561f291cb80101b21f
-231eb80401b21f5537b80168402c07960758074f07360732072c0721071f
-071d071b071408120810080e080c080a080808060804080208000814b8ff
-e0402b000001001406100000010006040000010004100000010010020000
-01000200000001000002010802004a00b013034b024b5342014bb0c06300
-4b6220b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807
-ff52b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ff
-b101018e851bb0124358b900010111858d1bb900010128858d5959001816
-763f183f123e113946443e113946443e113946443e113946443e11394660
-443e11394660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b2b
-182b1db0964b5358b0aa1d59b0324b5358b0ff1d594bb09353205c58b901
-f201f04544b901f101f045445958b9033e01f2455258b901f2033e445959
-4bb8015653205c58b9002001f14544b9002601f145445958b9081e002045
-5258b90020081e4459594bb8019a53205c58b9002501f24544b9002401f2
-45445958b909090025455258b9002509094459594bb8040153205c58b173
-244544b1242445445958b917200073455258b9007317204459594bb80401
-53205c58b1ca254544b1252545445958b9168000ca455258b900ca168044
-59594bb03e53205c58b11c1c4544b11e1c45445958b9011a001c455258b9
-001c011a4459594bb05653205c58b11c1c4544b12f1c45445958b9018900
-1c455258b9001c01894459594bb8030153205c58b11c1c4544b11c1c4544
-5958b90de0001c455258b9001c0de04459592b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65
-422b2b01b33b59635c456523456023456560234560b08b766818b0806220
-20b163594565234520b003266062636820b003266165b059236544b06323
-4420b13b5c4565234520b003266062636820b003266165b05c236544b03b
-2344b1005c455458b15c406544b23b403b4523614459b347503437456523
-456023456560234560b089766818b080622020b134504565234520b00326
-6062636820b003266165b050236544b034234420b147374565234520b003
-266062636820b003266165b037236544b0472344b10037455458b1374065
-44b24740474523614459004b5342014b5058b108004259435c58b1080042
-59b3020b0a124358601b2159421610703eb0124358b93b21187e1bba0400
-01a8000b2b59b00c2342b00d2342b0124358b92d412d411bba0400040000
-0b2b59b00e2342b00f2342b0124358b9187e3b211bba01a80400000b2b59
-b0102342b0112342002b7475737500184569444569444569447373737374
-757374752b2b2b2b74752b2b2b2b2b737373737373737373737373737373
-737373737373737373732b2b2b45b0406144737400004bb02a534bb03f51
-5a58b1070745b040604459004bb03a534bb03f515a58b10b0b45b8ffc060
-4459004bb02e534bb03a515a58b1030345b040604459004bb02e534bb03c
-515a58b1090945b8ffc06044592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b752b2b2b2b2b2b2b435c58b9008002bbb301401e017400735903b01e4b
-5402b0124b545ab012435c5a58ba009f02220001007359002b7473012b01
-732b2b2b2b2b2b2b2b737373732b2b2b2b2b002b2b2b2b2b2b0045694473
-456944734569447374754569447345694445694445694473744569444569
-44732b2b2b2b2b732b002b732b74752b2b2b2b2b2b2b2b2b2b2b2b2b2b73
-7475732b7374757374752b2b2b742b2b000000>
-[15785 15901 16277 16325 16277 16273 15933 16169 16277 15721 16361 15561 15973
-16029 16305 15693 16345 16249 15893 15629 16365 15481 16245 16249 16357 16337
-15821 15749 16345 15937 16257 16033 19077 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-2 3242 17 <000100ba0000018700cd000300254018023c000a023c5f006f007f00af00
-04a0000100a004a198182b10f65d5ded003fed313033353315bacdcdcd00
->ArialMT AddT42Char 
-2 10012 38 <00010066ffe7057605d3001d00d3b563026a1d0201b8ffe8b40b0b065500
-b8ffe8405f0b0b06552000320d63007000741d8000841d90009a05ab03a5
-0db903b40dc70dd000e41df31d110e121d111d1d032a0628112a1c201f47
-0d56145715561968056b1d7b128b129a03990e9a1ca801a402a811d50e13
-0014001a1014101a0402b8ffdeb2283901b8ffc0402d2839100f0001041b
-131e0c031b1e040910260f4a0026200101011a1f1726200801080c0b0b06
-5508191e635c182b4e10f42b5d4ded4e10f65d4dedf4ed003fed3fed1117
-393130012b2b5d5d71005d2b2b0172011706042322240235341224333204
-17072626232206021514121633323604b4c23dfec3e5edfed79baf0143c2
-dc012c3bbf33c293a9e35c6de686a3e2020231effbc1016ed2e50155b1e0
-cb2da092a2feef91bbfee98abc00>ArialMT AddT42Char 
-2 13668 49 <0001009c0000051f05ba0009017db1120bb8ffc0400a13153408180c1602
-5503b8ffe840210c16025508020303200708140707080207030308090402
-02090708040320060605b8ffecb40f0f025505b8fff2400b0d0d02550512
-0c0c025505b8fff7401a0b0b0655055d200b01200b500b600b700b800b05
-0b0809200100b8ffc0400d13153420000100201010025500b8fff6b40f0f
-025500b8fff6b40d0d025500b8fffa400b0c0c025500040b0b065500b8ff
-f7b40c0c065500b8fff8400a0d0d0655005d0a3b59182b10f62b2b2b2b2b
-2b2b5d2b3cfd3c105d71f42b2b2b2b3c10fd3c003f3c3f3c123939011139
-3987042e2b877dc4b10602435458b90003ffe0b70c113408200c1134002b
-2b5931302b2b012b435c58b40840463903b8ffc0b646390840323903b8ff
-c0b632390722193902b8ffdeb619390722323902b8ffdeb6323907222339
-02b8ffde400b2339070e1439070e133902b8fff4b61339070e1d3902b8ff
-f4b61d39070e153902b8fff8b115392b2b2b2b2b2b2b012b2b2b2b2b2b00
-2b2b2b2b59331133011133112301119cc70302bac7fcfe05bafb81047ffa
-460480fb8000>ArialMT AddT42Char 
-3 4064 66 <0001ffe1fe69048afeeb0003001a400c013f00021a050019044341182b4e
-10e410e6002f4ded3130033521151f04a9fe69828200>ArialMT AddT42Char 
-3 4240 68 <0002004affe8041c043e00280037022d402c090d092a190d1a2a290d2a2a
-390d3615371b3a2a492a5d0d5d2a6a0d692a60308a0d86299a169b1aa90d
-1528b8ffe8b40b0b065527b8ffe840190b0b0655a619aa28b619bb28c419
-cf28d215dd28084416011eb8fff440110c0c065512120c0c0655050c0c0c
-065535b8ffe040550c0c06551f171f182b2c2a343904392c4904482c5608
-592b6608692b760c870cc90cf90df92b1137340e0104102f243417322114
-185f296f2902291c2f0e3f0e8f0e9f0eff0e059f0eaf0eef0e030e0c0f0f
-02550eb8ffeab4101002550eb8fff44015101006550e0c0d0d06550e060f
-0f06550e0e1c0317b802aab61895141c1c0700b8fff4401a0c0c06550045
-270a321c030b2961106100060d0d025500252124b8ffecb41010025524b8
-ffec400b0d0d025524040c0c025524b8ffe4b40b0b025524b8fff4b40b0b
-065524b8ffdc400b1010065524060f0f065524b8fffcb40c0c065524b802
-5b400e27400026102620263026af260539b8ffc0b40e0e025526b8ffd6b6
-0e0e0255263139b8ffc0400d1e23343039c03902a039013917b8fff44041
-10100655172518222f24bf06cf06021f063f0602060e0f0f0255060c0d0d
-025506180c0c0255060c0b0b0255060c0b0b0655060e0d0d065506100c0c
-065506313810f62b2b2b2b2b2b2b5d71edf4ed2b105d712bf62b2b5dedf4
-2b2b2b2b2b2b2b2b3cfd2be5e5003fed3fe42b3fedfde41112392f2b2b2b
-2b2b5d71ed711112391112393901111217393130005d2b2b2b2b01715d2b
-2b0071250606232226353436363736373637363534272623220607273e02
-333216161716151514161723260306070e02151416333236373635033c64
-b96aafbc477348356bda67013345887f791db0186ed08988aa5010091722
-bc1c1762c46f5c326d6968a2261d835546ab854e814e140e0d1a24250a6e
-2d3d597118718b4b40614a2e78f0fb853d3801dd281c10284d2f48605b4f
-3d77>ArialMT AddT42Char 
-3 5440 70 <00010050ffe803ed043e001a015ab1020243545840340e7f0f010f0b0140
-0050007000030004121c0b07181c040b010e1507080e0e0255070c0d0d02
-55070c0c0c025507100b0b0255072f2b2b2b2bcdd4c6003fed3fed10c45d
-3210c45d3231301b4047090c011f1c4313431753135317601360179b029b
-039a0da410a41a0c080d190a6a0269036a05750c700d800da60cb509b60a
-b50c0c160c860ce302030e225f0f6f0f7f0f030f01b802aa407930004000
-5000600070009000a000e000f00009000f0f0b000004121c0b07181c040b
-1c0f010f240e080d0d06550e221b000100240b2b1f010100010101400b0b
-065501401010065501480c0c0655011a0d0d065501491c1524cf07011f07
-3f0702070e0b0b0655070a1010065507120c0c065507311b34c4182b10f6
-2b2b2b5d71ed10f62b2b2b2b5d724b53234b515a58b90001ffc03859ed72
-f42bed72003fed3fed12392f11392f105de4105de43130005d71015d7159
-011706062322001134123633321617072626232206151416333236033cb1
-1defaedafef772e989addc1faf197f5a88aaa4846a8e018517b7cf011d01
-0aac010281afa11b6b6cc3d3d6c28200>ArialMT AddT42Char 
-3 5876 71 <00020046ffe803df05ba0011001d015540a40a02040d250d340d440d0535
-14351c5702540a5214531c6702640565096314601cc01fd405d513dd19e5
-13e514ef17eb19e51de01fff1f161f1f2b1a3c163c1a4b1a701f901f072e
-02240d2e163a02350d4b02450d4614491c570a560d670de506e716fa01f4
-0e100115030e0b100f001b1c0b0711000a151c030b1833010025110f2510
-10d011011011401160118011041f400b0b02551f400d0d02551112101002
-5511b8fff440110f0f025511060e0e025511180d0d025511b8fff2400b0b
-0b0655110e1010065511b8ffeeb40c0c065511b8fff840420d0d06551174
-1224bf07cf07df07ff07041f073f074f0703071e0b0b025507180c0c0255
-071e0d0d0255070c0b0b0655070c0d0d0655071a0c0c065507191e345018
-2b4e10f42b2b2b2b2b2b5d714dedfd2b2b2b2b2b2b2b2b2b2b5d713c10ed
-10fd3ce4003fed3f3c3fed3f3c11391112393130005d01715d0071213506
-232226263534123633321617113311011416333236353426232206033865
-c47fd5756ad48360962fb3fd20ac7576a5a87b78a1869e8cfba39f01038a
-5141020efa460212cccac1c6daccc400>ArialMT AddT42Char 
-3 6312 72 <0002004bffe8041e043e0015001d015340171f001c150255035d055d0955
-0b65036b056f09650b0815b8ffe4b40d0d065511b8ffe440520d0d06551d
-1c0d0d06552712d905fa14f61a0431123a19311c41124d1a411c51125c19
-521c61126d1a611c78067815f602f618100016010f0d1717501660167016
-03161c0f9010a010021010041b1c0a0700ba02aa0001ffc0b41010025501
-b8ffc04010101006551001010195131c040b17400db8ffdcb40d0d02550d
-b8ffeeb40d0d06550db8ffeab40c0c06550db8ffc04009272a34b00d010d
-1a1fb8ffc0b32526341fb8ffc040411e2334301f011f163310240740242a
-341f073f074f070307200b0b025507180c0c0255071c0d0d0255070e0b0b
-0655071c0c0c065507160d0d065507191e3437182b4e10f42b2b2b2b2b2b
-5d2b4dfde44e10712b2bf6712b2b2b2b4ded003fedfd5d2b2be43fed1239
-2f5d3cfd713c011112393912393130015d005d2b2b2b0171720117060623
-22001110003332001114072116163332360121262726232206035eba2cee
-b9e9feef0114dcd5010e01fce80ab285638cfdda02510c3856897ca90156
-17a3b4011f0103010c0128fedefef91020afba680195864368a6>ArialMT AddT42Char 
-3 6758 73 <000100130000028005d30017010d401e1409010f192f193019401970199b
-0c9c0da90d081a0d280db019c0190419b8ffc040281a1f341d080d030c0f
-1c0a0115022b1413040306000a9f140114ff134004172504000302920101
-00b8ffc0b331383400b8ffc0402b1c1f3490000119400f0f025519400d0e
-025500141010025500280f0f025500220e0e0255002c0d0d025500b8fff2
-400b0c0c025500140b0b065500b8ffeab41010065500b8ffe6b40f0f0655
-00b8fffab70c0c065500a31819bc01ba002100f6010a00182b2bf62b2b2b
-2b2b2b2b2b2b2b2b5d2b2b3c10f43c103ced10eded5d003f3f3c3c3cfd3c
-3fed391139313043794014101106090706080602061009121b0011060f1b
-012b012b2a8181012b715d00723311233533353437363633321707262322
-06151533152311b29f9f131a83764c5c1b38325244cfcf039a8c716b3446
-57129d0a4660628cfc66>ArialMT AddT42Char 
-3 7098 74 <00020042fe5103ea043e001e002a016f40600b0b05142c0b25144c0b4514
-06091d191d2c0b26142c23390b36144a0b46145607580b680bfa0af5150e
-2e232c273e233e274c27902ca02c07362136293f2c460b46214529542154
-29690763216329602c802cda27e821ee23ef271117160615b802b1b4281c
-130701b802aa401020003000600070008000c000d0000700b8027d403205
-1c1c0f0a45221c0c0a16153325330a251818d01701101740176017801704
-2c400b0c02552c400d0d025517121010025517b8fff440110f0f02551706
-0e0e025517160d0d025517b8ffea400b0b0b065517121010065517b8ffee
-b40c0c065517b8fffc404a0d0d065517740f012500221f24bf0fcf0fdf0f
-ff0f041f0f3f0f4f0f030f200b0b02550f1a0c0c02550f220d0d02550f1c
-0b0b06550f0c0d0d06550f1a0c0c06550f192b2c74213450182b2b4ef42b
-2b2b2b2b2b5d714dedf4ed10fd2b2b2b2b2b2b2b2b2b2b5d713c10fde4f6
-3c003fede43fedfd5de43fede43f3c3130015d71005d7117171617163332
-363736270623220235341236333217353311140606232226131416333236
-35342623220666af0b3243747d88180e0176b0dbf06ed18dbc7aa665dba0
-beea99a67d7ca8ad7a78a8581a512532645a37b08b013cdd9801018c9880
-fc6af8cf78ab032ad1c0bfccc3c6c300>ArialMT AddT42Char 
-3 8014 76 <000200880000013c05ba0003000700cd405e09360b0b02554f099009a009
-b009c009df09f0090700091f09700980099f09b009c009df09e009ff090a
-1f09010001070402030906037e0100060506040a0607250500049f04a004
-b004c004e00406c004f0040200042004d004e0040404b8fff8b410100255
-04b8fffa40170e0e025504040c0c0255040a0b0b025504140b0b065504b8
-ffeab41010065504b8fffeb40d0d065504b8fffc400a0c0c0655044e0847
-50182b10f62b2b2b2b2b2b2b2b5d71723cfd3c003f3f3c3fed0111123939
-111239393130015d72712b133533150311331188b4b4b404ebcfcffb1504
-26fbda00>ArialMT AddT42Char 
-3 9202 79 <000100830000013705ba000300e3b605360b0b025505b8ffc0b337383405
-b8ffc0b334353405b8ffc0b330313405b8ffc0b322253405b8ffc0402515
-17340f051f059f05df05044f05df05f005031f0570058005ff0504010000
-0a0203250100b8ffc0b337383400b8ffc040153335349f0001c000f00002
-00002000d000e0000400b8fff8b41010025500b8fffa401d0e0e02550004
-0c0c0255000a0b0b025500140b0b065500081010065500b8fffeb40d0d06
-5500b8ffffb40c0c065500b8fffc400a0c0c0655004e044750182b10f62b
-2b2b2b2b2b2b2b2b5d71722b2b3cfd3c003f3f3130015d71722b2b2b2b2b
-2b3311331183b405bafa4600>ArialMT AddT42Char 
-3 9454 80 <0001008700000626043e002301c7b9000dfff4b40d0d065508b8fff4b40d
-0d065509b8ffd8404d0b0d342504e404e409e117e52005d505f620021708
-202309181b20090303231e1c06151c0b0b06070106231a19100ad0250190
-25a025022517171a0e2590110111041010025511180f0f025511b8ffec40
-0b0e0e025511140c0c025511b8ffe840170b0b025511020b0b0655110c10
-10065511060f0f065511b8fffab40c0c065511b8fff8b40d0d065511b801
-5d400c1825901b011b180f0f02551bb8ffec400b0e0e02551b140c0c0255
-1bb8ffee40110b0b02551b040b0b06551b0a101006551bb8fffe400b0d0d
-06551b0c0f0f06551bb8fffcb40c0c06551bb8015d4016000233232501d0
-00019000a000021f003f004f000300b8fffe401d0e0e025500100d0d0255
-00100c0c0255000c0b0b025500160b0b065500b8fffcb41010065500b8ff
-f440140f0f0655000a0c0c0655000e0d0d065500192425b80178b3214750
-182b2b4ef42b2b2b2b2b2b2b2b2b5d71723c4dfde410f42b2b2b2b2b2b2b
-2b2b5dedf42b2b2b2b2b2b2b2b2b2b5dfd4e456544e67172003f3c3c3c3f
-3f3c4d10ed10ed11173901111239123931304379400e0c141326140c111b
-01120d151b01002b012b2b81015d005d2b2b2b3311331536363332161736
-3332161511231134262623220615112311342623220606151187a132a66a
-76971f7eca9eaab3235c3e7094b458644c813a0426954e5f6258baafb6fd
-27029d6c5f3a95a4fd9702b27878509a91fdd900>ArialMT AddT42Char 
-3 10014 81 <00010087000003e6043e0016017d40130503061302a810b810e303e713f0
-03f6130604b8fff0403c0b0d347910019810d018e018ff18042008140e14
-16121c05070106160d0a0d0e0c0e2418401010025518400b0b02550b2810
-1002550b140e0e02550bb8ffec40110d0d02550b040c0c02550b220b0b02
-550bb8fff4400b0b0b06550b14101006550bb8fff9400b0d0d06550b0a0f
-0f06550bb8fff640120c0c06550b40333634ff0b01ff0b010b4e18b8ffc0
-401a343634b018f018027018a018b018c01804180302331516250100b8ff
-f6b41111025500b8fffab41010025500b8fffa40170e0e025500040c0c02
-55000a0b0b025500040b0b065500b8fffa40110f0f065500020c0c065500
-040d0d065500b8ffc04012333634f0000100002000d000e00004004e1710
-f65d712b2b2b2b2b2b2b2b2b2b3cfd3cf43c105d712bf65d712b2b2b2b2b
-2b2b2b2b2b2b2b2bed3c103c003f3c3f3fed113901123931304379401606
-11090a080a070a0306102611060e1b010f0a121b01002b012b2b2a81015d
-71002b5d71331133153633321616171615112311342626232206151187a2
-75dd60a150100ab42a6b4873a7042697af45704d327dfd7302866e6d4192
-ccfdbc00>ArialMT AddT42Char 
-3 10468 82 <00020044ffe80427043e000d0019016bb615180d0d065513b8ffe8b40d0d
-06550fb8ffe840730d0d065519180d0d065512070a190c47064808560659
-08670669080834103a123a16351845104b124b1645185c055c0952105d12
-5d1652186d056d0964106d126d1664187701150906050d5b035405540a5b
-0c6c036505650a6c0c0a171c0407111c0b0b14241b400d0d02551b400b0b
-025507b8ffea40110f0f025507180d0d025507100b0b025507b8fff0b40b
-0b065507b8fff0b40d0d065507b8fff0b40f0f065507b8fff0b40c0c0655
-07b8ffc04013242534300701000710072007030731df1b011bb8ffc04049
-1e2334301b011b0e24000c0e0f025500120d0d0255000c0c0c0255001c0b
-0b0255000e0b0b0655000e0d0d0655000c1010065500160c0c0655004024
-25341f003f000200311a3437182b10f65d2b2b2b2b2b2b2b2b2bed10712b
-5df65d5d2b2b2b2b2b2b2b2b2b2bed003fed3fed313001715d0071435c58
-4009530553096205620904015d59002b2b2b2b1310373633320015140606
-23220013141633323635342623220644a489c5db01167beb8bdffeedb9b2
-8786b2b38587b2021301278e76fee1fdcdeb82011e010dcccbccd1c5cbca
->ArialMT AddT42Char 
-3 10918 83 <00020087fe690421043e0012001e0162408e0c102d103d104b10043f20b0
-20021f20290c231d3215321d421d70209020083a173a1b4a174a1b59085b
-0c5c175c1b6a086b0c69106d176b1bc020d314dd18dd1ad31ee414e41ee0
-20ff201623042b102b1535043a1046044a105a10e50beb1dfe100b110e03
-161c1c06070106161c0e0b000e1924d00a01100a400a600a800a0420400b
-0b025520400d0d02550ab8ffe6400b0f0f02550a180d0d02550ab8fffab4
-0c0c02550ab8ffeeb40b0b06550ab8fff4b40f0f06550ab8ffe840230c0c
-06550a74011333023312250000c001019001a001b001f001041f013f014f
-010301b8fffc401d0e0e025501100d0d025501100c0c025501100b0b0255
-010c0b0b065501b8fff6b41010065501b8fffc40160f0f0655010c0c0c06
-5501120d0d065501191f473718012b4e10f42b2b2b2b2b2b2b2b2b5d7172
-3c4d10fdf4e410fd2b2b2b2b2b2b2b2b5d71ed003f3fed3f3fed11391239
-3130005d015d717200711311331536363332161615140206232226271103
-141633323635342623220687a43a926888d06a75df7b5a8f2e11a67678ab
-a77473b1fe6905bd8a51518cff98a3fefb8b4c3afdfb03a4cdc4cbd5cbca
-d700>ArialMT AddT42Char 
-3 11776 85 <00010085000002c6043e001100c9403b2f13011004012304340443045304
-66047404060911080908090d1311090d000308010b1c06070106000a0928
-900801082220130113022211250100b8ffc04010333634f0000100002000
-d000e0000400b8fff8b41010025500b8fff840110e0e025500040c0c0255
-00060b0b025500b8fffcb41010065500b8fff440160f0f065500060c0c06
-5500080d0d0655004e1247c4182b10f62b2b2b2b2b2b2b2b5d712b3cfde4
-105df472e4003f3f3fed11393911393901111239390010c9870e7dc43130
-005d72015d33113315363633321707262322060706151185a23e693f5b5e
-3e42423b5e141e0426a171483aa727473f6072fdd400>ArialMT AddT42Char 
-3 12038 86 <0001003fffe803b1043e00300317407b042214223a094a09442456226522
-7c098e098424a613ab2cc2030d09171a1817304b2cd617051b0255020210
-32010a185c085c095c0a5c0b5c0c5c0d6a086a096a0a6a0b6a0c6a0db426
-b4270f27262427242936245a0a590b64266428742374248024930a9c0c92
-28972c9530a40aa90ca327a428b326c5261628b8fff4b40d0d065522b8ff
-f4b40d0d065523b8fff4b40d0d065524b8fff4b40d0d065528b8fff4b40c
-0c065522b8fff4b40c0c065523b8fff4b40c0c065524b8fff4b40c0c0655
-1db8ffde40121e395a0827250c0a041a202615040b2e1d1ab802aa402219
-2c0b0b02551f193f194f195f19af19cf19060f191f196f19df19041f198f
-190219bd02550015000002aa0001ffc040140b0b025510014001021001d0
-0102000110010201b8ffc0b314163401b8ffc040100e113401012e5c1d6c
-1d021d1c150704b8fff4b40b0b025504b8ffe6b41010065504b8ffe64013
-0f0f0655041c2e0b1f1a011a24194013183432b8ffc0402f0f0f02551918
-0f0f025519180d0d025519160c0c025519201010065519200f0f06551910
-0c0c065519160d0d065519b8025bb207242ab8ffc0b51c39d02a012ab8ff
-e6b40c0c02552ab8ffe8b40f0f02552ab8ffe8b40c0c06552ab8ffeab60d
-0d06552a1a32b8ffc04021272a346032c032023f32803202321001010124
-00180d0d025500100d0d06550020b8fff4b40d0d025520b8fff4b4101006
-5520b8fff440190f0f065520240f100b0b02550f160c0c02550f200d0d02
-550fb8fffa40200f0f02550f0e0c0c06550f0c0d0d06550f22df00013f00
-4f00020019313437182b4e10f45d714df42b2b2b2b2b2bed2b2b2b102b2b
-ed724e105d712bf62b2b2b2b712b4dedf42b2b2b2b2b2b2b2b2bed72003f
-ed2b2b2b3fed7112392f2b2b5d71722be410fd5d71722be4111239111239
-0111121739313043794040272d1e2305142c261110121013100306220d20
-1b000928071b01052d071b011e14201b00210e231b0022230d0c08290a1b
-012827090a062b041b001f101d1b01002b2b103c103c2b103c103c2b012b
-2b2b2b2a2b818181002b2b2b2b2b2b2b2b2b5d71015d72715d1337161633
-323635342726272e02353436373636333216161707262623220615141716
-1716171e02151406062322263fb20f897b7c78352593c6994f41382a9153
-7dbd5a11b00c73697c6a16162f1b84bf975669c67dcfd9013d1c6b726544
-3d2318253249814e4779281f2b487b6718525c5237231c1d130a2433417c
-5c5a9f57ac00>ArialMT AddT42Char 
-3 12974 87 <00010024fff2022a0599001700d8b9000affc0b323263409b8ffc0404123
-263480190100010c0d0a0103001610092b0f0a06161c030b0f1022002201
-0d12250c01ff070845094560077007800790070400072007a007b007c007
-d0070607b8ffeeb41010025507b8fff4b40f0f025507b8fff2b40e0e0255
-07b8fff8b40d0d025507b8fff8b40c0c025507b8fffab41010065507b8ff
-f0400b0f0f065507060c0c065507b8ffe8b40d0d065507ba026a00180136
-b166182b10f62b2b2b2b2b2b2b2b2b5d71f4e410ed3cfd3c10e4f43c003f
-ed3f3cfd3c1139123911333310c93130015d2b2b25170623222626351123
-353311371133152311141616333202101a4c3c626c2c8484b3b5b5132b28
-1ea19f103e65a202638c01076cfe8d8cfd934d2c1a00>ArialMT AddT42Char 
-3 13680 89 <0001001a000003e80426000a01eab1020243545840170508000a08060106
-0a0005090805010205240f0f0255052f2bddcd10ddcd113333003f3f3f12
-3931301bb7350501002211390ab8ffde400d11390916121c340816121c34
-02b8ffeab3121c3401b8ffeab3121c340ab8ffd840091e213400281e2134
-0ab8ffe8400922253400162225340ab8ffda407e282e340020282e340f0c
-29002809260a3900350a4800470a56015602590858096601660269086909
-78007701770279087809770a870187028603890788088a099d009809910a
-ac00a20abd00b707b10ac900c50ada00d50aec00e30afb00f40a2c0a0005
-0a1800160a2800260a370a4f00400a09054012163405400b0d34b1060243
-5458400905010008060106000ab8fff4400f0d0d06550a000c0d0d065500
-050908b8fff440120d0d0655080501020c0d0d06550205050c0b1112392f
-dd2bcd10dd2bcd10cd2bcd2b002f3f3f11123931301b40370a0708082509
-0a1409090a0003020225010014010100050a0a000a09080802020106070a
-09030001052f0c010c22084040400980090209b8011bb5400580050205b8
-011b400920024001220bead2182b10f6ed1a19fd5dfd5d1a18ede45d1112
-3939123939003f3c103c103c3f3c113987052e2b877dc4872e182b877dc4
-593130002b2b01715d2b2b2b2b2b2b2b2b2b2b2b2b005d59210133131617
-363713330101aefe6cbee4251f182becb9fe6e0426fd84676f54760288fb
-da00>ArialMT AddT42Char 
-2 0 0 <00020100000005000500000300070000211121112521112101000400fc20
-03c0fc400500fb002004c000>ArialMT AddT42Char 
-ArialMT /CharStrings get begin
-/period 17 def
-/C 38 def
-/N 49 def
-/underscore 66 def
-/a 68 def
-/c 70 def
-/d 71 def
-/e 72 def
-/f 73 def
-/g 74 def
-/i 76 def
-/l 79 def
-/m 80 def
-/n 81 def
-/o 82 def
-/p 83 def
-/r 85 def
-/s 86 def
-/t 87 def
-/v 89 def
-end
-ArialMT /Encoding get
-dup 46 /period put
-dup 67 /C put
-dup 78 /N put
-dup 95 /underscore put
-dup 97 /a put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 105 /i put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 118 /v put
-pop
-end
-%ADOEndSubsetFont
-/KUDFNW+ArialMT /ArialMT findfont ct_VMDictPut
-/KUDFNW+ArialMT*1 
-[46{/.notdef}rp /period 20{/.notdef}rp /C 10{/.notdef}rp /N 16{/.notdef}rp /underscore 
-/.notdef /a /.notdef /c /d /e /f /g 
-/.notdef /i 2{/.notdef}rp /l /m /n /o /p 
-/.notdef /r /s /t /.notdef /v 137{/.notdef}rp]
-KUDFNW+ArialMT nf
-KUDFNW+ArialMT*1 [9 0 0 -9 0 0 ]msf
-378.625 185.76 mo
-(NamedColor.icc)
-[6.48001 5.03998 7.55994 5.04001 5.03998 6.48001 5.04001 2.043 5.04001 2.99692 2.51999 2.04303 
-4.56299 0 ]xsh
-/KUDFNW+ArialMT*1 uf
-/KUDFNW+ArialMT uf
-/ArialMT uf
-%ADOBeginSubsetFont: PBAAAA+MicrosoftSansSerif Initial
-ct_T42Dict begin
--0.578 -0.215 1.48 0.922
- 256 array 0 1 255 {1 index exch /.notdef put} for  /PBAAAA+MicrosoftSansSerif
-Type42DictBegin
-[<00010000000c000c000c000c4f532f3274c457c1000000cc000000606376
-742077d37c860000012c000002906670676d03741f64000003bc00000789
-676c7966097801900000769c0000154868656164d7a46fa800000b480000
-0036686865610e9d10dc00000b8000000024686d7478398ea43900000ba4
-00002fb06c6f636100f77be600003b5400002fb86d61787010f503fc0000
-6b0c000000206e616d65e420cea800006b2c000003eb707265701207efc7
-00006f180000078267646972000000000000000000000000000303850190
-00050008059a05330000011b059a0533000003d1006602120805020b0604
-020202020204e1002affc000000200000008000000004d53202000400020
-fffc05d3fe51010d076001ae200101ff20280000042505ba000000200004
-05ba0019000005ba00190000000000000000000000000000000000000000
-0425001900000000ffe700000000ffe70000000000000000fe68ffea0000
-00000000000000000000000002f5ffee05cd000002ddffee02f000000000
-000000000000000000000000000000000000000000000000000000000000
-000000000000000000000800000008000000000000000000000000000000
-000000000000000000000000000000000000000000d2010e012c01130000
-000000c8010900c8000000000000000000000000000000890048001bff77
-ffb8ffe500a4005f000aff5cffa1fff6000000000000000afff600000000
-0000000000000059ffa700c9000000c3000000c2008300c3000000bd0000
-00bd007900c3006c00bd009100af00000000026f00ae00a6009a0000009b
-0094008b00cc00ae00a600940000000000ff000001e30000000000000000
-000000000000000000000000000000000000000000cd00cd006801ee0060
-008c0000000000000000000000000000000000a800a800a800b900cd00a8
-0052016a0049007d007d0083008a00000071009b00910078000001fc0071
-ff8f022a006d009400a0029a030a00b800ae008b018b019101d10391008c
-00730268027d01b001dd021c033302a3026b02730152024c0021004c05e7
-04f20098ff6800ac00c500850085005c0054006000b401baff1ffe680000
-008300bc00940094ff85ffae00520029061400ae00460046fe580560008f
-076002f20025003e004700500058007300a80160006000950025003e0047
-00500058007300a801600000002d005000600081009300ba0108ffd3ffae
-ff9106520060005c00b0012b012b04ba013e018507600016000a004b047d
-069c076000600060004c00cb01dc04b305c2008200660082006e40415452
-4d4c49483b393837363534333231302f2e2d2c2b2a292827262524232221
-201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403
-0201002c01b0184358456ab0194360b0462344231020b0464ef04d2fb000
-121b21231133592d2c01b0184358b0052bb000134bb0145058b100403859
-b0062b1b21231133592d2c01b01843584eb0032510f221b000124d1b2045
-b00425b00425234a6164b0285258212310d21bb0032510f221b000125959
-2d2cb01a435821211bb00225b0022549b00325b003254a612064b0105058
-2121211bb00325b0032549b0005058b0005058b8ffe238211bb010382159
-1bb0005258b01e38211bb8fff03821595959592d2c01b0184358b0052bb0
-00134bb0145058b90000ffc03859b0062b1b21231133592d2c4e018a10b1
-46194344b00014b10046e2b00015b90000fff03800b0003cb0282bb00225
-10b0003c2d2c0118b0002fb00114f2b00113b001154db000122d2c01b018
-4358b0052bb00013b90000ffe038b0062b1b21231133592d2c01b0184358
-45646a23456469b01943646060b0462344231020b046f02fb000121b2121
-208a208a525811331b212159592d2c01b10b0a432343650a2d2c00b10a0b
-4323430b2d2c00b0462370b101463e01b0462370b10246453ab10200080d
-2d2cb0122bb0022545b00225456ab0408b60b0022523442121212d2cb013
-2bb0022545b00225456ab8ffc08c60b0022523442121212d2cb000b0122b
-2121212d2cb000b0132b2121212d2c01b00643b00743650a2d2c2069b040
-61b0008b20b12cc08a8cb8100062602b0c642364615c58b00361592d2cb1
-000325456854b01c4b505a58b0032545b0032545606820b004252344b004
-2523441bb00325204568208a2344b00325456860b003252344592d2cb003
-25204568208a2344b003254564686560b00425b0016023442d2cb0094358
-8721c01bb01243588745b0112bb0472344b0477ae41b038a45186920b047
-23448a8a8720b0a05158b0112bb0472344b0477ae41b21b0477ae4595959
-182d2c208a4523456860442d2c456a422d2c01182f2d2c01b0184358b004
-25b004254964234564696120b080626ab00225b00225618cb0194360b046
-2344218a10b046f6211b21212121592d2c01b0184358b0022545b0022545
-64606ab00325456a6120b00425456a208a8b65b0042523448cb003252344
-21211b20456a4420456a44592d2c012045b00055b018435a584568234569
-b0408b6120b080626a208a236120b003258b65b0042523448cb003252344
-21211b2121b0192b592d2c018a8a45642345646164422d2cb00425b00425
-b0192bb0184358b00425b00425b00325b01b2b01b0022543b04054b00225
-43b000545a58b003252045b040614459b0022543b00054b0022543b04054
-5a58b004252045b04060445959212121212d2c014b525843b00225452361
-441b2121592d2c014b525843b00225452360441b2121592d2c4b52584544
-1b2121592d2c0120b003252349b04060b0206320b000525823b002253823
-b002256538008a63381b212121212159012d2c4b505845441b2121592d2c
-01b005251023208af500b0016023edec2d2c01b005251023208af500b001
-6123edec2d2c01b0062510f500edec2d2c462346608a8a462320468a608a
-61b8ff8062232010238ab14b4b8a70456020b0005058b00161b8ffba8b1b
-b0468c59b0106068013a2d2c2045b00325465258b0022546206861b00325
-b003253f2321381b2111592d2c2045b00325465058b0022546206861b003
-25b003253f2321381b2111592d2c00b00743b006430b2d2c8a10ec2d2cb0
-0c4358211b2046b0005258b8fff0381bb0103859592d2c20b0005558b810
-0063b003254564b00325456461b0005358b0021bb04061b0035925456953
-5845441b2121591b21b0022545b00225456164b028515845441b21215959
-2d2c21210c6423648bb84000622d2c21b08051580c6423648bb82000621b
-b200402f2b59b002602d2c21b0c051580c6423648bb81555621bb200802f
-2b59b002602d2c0c6423648bb84000626023212d2c4b5358b00425b00425
-4964234564696120b080626ab00225b00225618cb0462344218a10b046f6
-211b218a11231220392f592d2c2121212121212d2cb0134358031b02592d
-2cb0134358021b03592d2cb00a2b2310203cb0172b2d2cb00225b8fff038
-b0282b8a102320d023b0102bb0054358c01b3c59201011b00012012d2c4b
-53234b515a58381b2121592d2c01b0022510d023c901b00113b0001410b0
-013cb001162d2c01b00013b001b0032549b0031738b001132d2c4b53234b
-515a5820458a60441b2121592d2cb0024354584b53234b515a58381b2121
-591b21212121592d2c4b53234b515a58381b2121592d2c4b5458381b2121
-592d2cb002435458b0482b1b21212121592d2cb002435458b0492b1b2121
-21592d2c4b52587d1b7a592d2cb1020042b123018851b1400188535a58b9
-10000020885458b202010243604259b12401885158b920000040885458b2
-02020243604259b12401885458b2022002436042004b014b5258b2020802
-436042591bb940000080885458b202040243604259b94000008063b80100
-885458b202080243604259b94000010063b80200885458b2021002436042
-595959592d0000000001000000050000480d3d4a5f0f3cf5001b08000000
-0000aff53caf00000000c142e854fb5cfe460bde07600000000900010001
-00000000000100000760fe5200000c24fb5cfa7a0bde0001000000000000
-00000000000000000beb02580032000000000239000002200000023900b6
-02d70054047300170473004e071d0081055600580187005c02aa007b02aa
-004a031d004204ac0071023900b602aa0042023900b6023900000473005c
-047300e30473003f0473005a0473001f047300560473005c047300620473
-005604730056023900b6023900b604ac007104ac007104ac00710473005e
-081f00730556fffe055600a405c7006005c700a4055600a404e300a40639
-006005c700a4023900bc04000037055600a4047300a406aa00a405c700a4
-06390060055600a40639006005c700a40556005c04e3002d05c700a40556
-000c078d00190556000a0556000a04e300250239008b0239000002390021
-03c1004a046afff402aa00560473004e0473008b04000048047300480473
-004802390010047300480473008b01d3008b01d3ffb80400008b01d3008b
-06aa008b0473008b047300480473008b0473004802aa008b0400003f0239
-0023047300870400001b05c7000a0400000e0400001b0400002902ac0039
-021400bc02ac003104ac00580556fffe0556fffe05c70060055600a405c7
-00a40639006005c700a40473004e0473004e0473004e0473004e0473004e
-0473004e040000480473004804730048047300480473004801d3007901d3
-ffec01d3ffac01d3ffd50473008b04730048047300480473004804730048
-047300480473008704730087047300870473008704730050033300850473
-0071047300310473005602cd0068044cfffe04e3008b05e5000005e50000
-0578003202aa00e302aa003f04ac0071080000000639005004ac005c04ac
-007104ac007104ac0071047300020473008b03f4003305b4007b069600a4
-046400000231ffb202f6002b02ec002d06250071071d004e047300480473
-0062023900b604ac00710464001404730042046400330556fffe0473008d
-0473008d0486005b0556fffe0556fffe0639006008000060078d00480258
-fff404b0fff402aa005402aa005401c7007d01c7007d04ac007103f4002e
-0400001b0556000a0156fe540473004c02aa005a02aa007f040000100400
-001004730050023900b6023900b603220090080000190556fffe055600a4
-0556fffe055600a4055600a4023900ac0239ffdf023900080239001f0639
-0060063900600639006005c700a405c700a405c700a401d3008b02aa0017
-02aa000602aa001d02aa002d02aa00f802aa00a202aa0085037a009d02aa
-004202aa00170473000801d3000c0556005c0400003f04e3002504000029
-021400bc05c70002047300480556000a0400001b055600a40473008b04ac
-007104ac00a602aa006a02aa001902aa002106ac007f06ac007f06ac0035
-04e300000639006004730048023900bc0556005c0400003f05c700600400
-004805c7006004000048047300480400fff4023900b60556fffe0473004e
-0556fffe0473004e05c700a40513004805c70002055600a4047300480556
-00a404730048047300a401d30047047300a40255008b047300a402f30042
-05c700a40473008b05c700a40473008b063900600473004805c700a402aa
-008b05c700a402aa002b0556005c0400003f04e3002d0239002304e3002d
-02d0002305c700a40473008705c700a40473008704e300250400002904e3
-00250400002904ae00a40639006006790060049c00480473004804000048
-04ae004804000021053100480400fff4047200b602f6004c09e9008f0639
-00bc03a6008b0568002102aa00e502aa0056071d00810296000f04d50092
-02d6008302d6008304d500b102d600700556fffe0473004e05c700600400
-004805c7006004000048055600a404730048055600a404730048055600a4
-0473004806390060047300480639006004730048063900600473004805c7
-00a40473008b05c70014047300000239ffce01d3ff9b0239ffe501d3ffb2
-0239fff501d3ffc20239004801d300140400003701d3ffac056800a40400
-008b0400008b047300a401d3003505c700a40473008b05c700a40473008b
-0639006004730048063900600473004805c700a402aa00710556005c0400
-003f04e3002d0239002305c700a40473008705c700a40473008705c700a4
-0473008705c700a404730087078d001905c7000a0556000a0400001b0200
-008b0556fffe0473004e08000000071d004e0639005004730048023900b6
-078d001905c7000a078d001905c7000a078d001905c7000a0556000a0400
-001b01c7007d0400fff4047300310473004806ac007f06ac003606ac0036
-06ac006d02aa00fc02aa008502aa00ee034800370556fffe0646003306b7
-003303290033069a000006310000069a0000033300290556fffe055600a4
-0575000c055600a404e3002505c700a4023900bc055600a40556fffe06aa
-00a405c700a4053f006d0639006005c700a4055600a404e5006004e3002d
-0556000a0556000a0679005e06390066023900080556000a049c00480400
-00480473008b01ec0079047300870481008b0452001b03e100480473008b
-0473005c01ec008b0400008b0400001b0473008b0400001b03e100480473
-00480491008b0448004804730087042d000e058500870585004802520008
-04730087047300480473008705850048055600a40666002d048900a405bc
-00600556005c023900bc023900080400003707ae000a07ae00a40666002d
-055600a4051f000805c700a40556fffe053d00a4055600a4048900a40633
-0023055600a4073500060514005a05c700a405c700a4055600a405a4000a
-06aa00a405c700a40639006005c700a4055600a405c7006004e3002d051f
-000806cb00600556000a05fc00a40579007706e100a4071700a4063d0000
-071000a4053d00a405bc005e080c00a405c7005c0473004e0496005e043f
-008b0310008b04aa00000473004805aa0004040000230479008b0479008b
-0400008b0491000a05b6008b0473008b047300480473008b0473008b0400
-004803aa00250400001b069800480400000e0498008b0444005e066a008b
-068f008b04f6000005bc008b042f008b0400001b05f4008b045600350473
-0048047300000310008b040000480400003f01d3008b01d3ffd501d3ffb8
-06e9000a0698008b047300000400008b0400001b0473008b047300a403b8
-008b046afff407fc008f0473008b02aa002302aa002102aa006d02aa0021
-01d3008b0556005c0400003f04730000000000600000004e0000005e0000
-005e000000600000004e000000580000007100000056000000600000004e
-0000006000000075021400390000007101cf0091000000600000ff790239
-00b604cd0083048f003b035c00170429001404cd0098028f004c02cd0014
-04cd009804cd003b028f004c0429003f0429005a0429004804cd005004cd
-003b02cd004a02cd003b04cd005004cd002d04cd00870466006f043d003b
-0466003b047b00980400002d0550009804cd005404cd003704cd003704cd
-0037020000600371006005660077028fffa20429003f0429003f0429ff79
-0429ff7904cd002d0550009805500098055000980550009804cd008304cd
-008304cd0083048f003b035c00170429001404cd0098028f003d02cd0014
-04cd003b028f003d0429003f0429005a0429004804cd003b02cd003b04cd
-005004cd00870466006f0466003b047b00980400002d0550009804cd0054
-028f004c048f003b0429005a0466006f04cd00290000ffdc0000ff250000
-ffdc0000fe5100000060063900600473004805c700a404730087000000cf
-000000f800000056000000e302aa001702aaff0c02aa001702aa000402aa
-002d02aa002d02aa002d02aa000402aa00cf02aa000402aa002d02aa002b
-02aa002b02aa001902aa00170556fffe0473004e0556fffe0473004e0556
-fffe0473004e0556fffe0473fff20556fffe0473004e0556fffe0473004e
-0556fffe0473004e0556fffe0473004e0556fffe0473004e0556fffe0473
-004e0556fffe0473004e0556fffe0473004e055600a404730048055600a4
-04730048055600a404730048055600a404730048055600770473fff10556
-00a404730048055600a404730048055600a4047300480239009801d30098
-023900bc01d3008b06390060047300480639006004730048063900600473
-0048063900600473fff20639006004730048063900600473004806390060
-047300480639006004730048063900600473004806390060047300480639
-006004730048063900600473004805c700a40473008705c700a404730087
-05c700a40473008705c700a40473008705c700a40473008705c700a40473
-008705c700a4047300870556000a0400001b0556000a0400001b0556000a
-0400001b0473004801df00b201df007501df002b01df007501f4ff8501f4
-ff8501f4ff850458ff85045800560458ff85045800560458ff8504580056
-04d7ff8504d7ff8506c3ff85045801310458013f0458005a0458003d0458
-007504580048045800480458002d0458002b0458005c06c3ff850458ff85
-0323ff8503a000560458ff850323ff8503a000560252ff85025eff850225
-00ac0252ff85025eff850327ff8501baff850323ff8501f4ff85039aff85
-0323ff85030e004801f4ff8504bc001f030e004804bc001f026600cd01f4
-ff85045c000c04c30035000000000000000000000000045c000c04c30035
-045cfff604bc001f022500ac04c3001f026600cd04730062034c008901df
-002701df00710364000001df0071051f001f01df00ae05b80050027b003d
-05b8005005b8005004580056045800560458005602b8000a02b8000a03e1
-005203e100520698000a0698000a08b8000a08b8000a04a4ff8504a4ff85
-045c0052045c005201baff850652005004a8002704cd00330414002902b8
-001f043d0033027b003d03640000051f001f051f001f0000000000000000
-00000000000000000000001b00000000000000000000000a045c000c04c3
-0035000000680000001f026600e9026600620266005601f4ff850252ff85
-025eff8505b8005003df00930000fb5c0000fb5c0000fb5c0000fb5c0000
-fe000000fd3b0000fc4c0000fd0a0000fd2d0000ff170000fdaa0000fda8
-0000fe850000fe9605c3005e0000fbdf0000fd1b0000fbfa0000fe020000
-fdf00000fc4c0000fd7f0000fd2d045e005e047f002d04ac002d047f0056
-047f0056055c002d0364000603df0050051f0050047f002d04ac002d05c3
-005e05c3005e04ac005004ac005003df00930571002d062100560635005e
-047f0056047f0056045e005e049a00500404009304f6005004ac005004ac
-0050047f0081047f0081053700500537005004ac005004ac002f04000081
-03df0093045e005e03df005004ac005003df0050047f0056051200500431
-005004db00500537005004310050045e005e04000050039a004a0000fcfe
-035c001f035cfe620000fc730000fc730000fc730000fc730000fee10000
-fe000000fee9031f00b604fe009a0248008b048f008b035c0010035cffc9
-03df0000035c001f048300500000fd100000ff190000fe5e0000fda80000
-fec10000fe960000fe620000fe680431006204bc006004bc005c04fe000e
-04fe007f04fe006004fe006004bc001704fe003504fe006004fe004a0527
-005006d100350000fee10000fe000000fee901baff8505b8005001f4ff85
-04580056045800560458ff8503e1005204c100330327ff8504c100330327
-ff85051f001f04bc001f01f4ff85030e0048027b003d045801310458013f
-0458005a0458003d0458003d0458004a045800c90458002d0458002b0458
-005c04e3002d02390023055600a40473004805c700a40479008b04140029
-023900bc0400003701d3008b01d3ffb80489003a031000300786000605cf
-000405aa00a40447008b055600a40400008b05fc00a4049a008b0556000a
-0400001b0556000a0400001b05a5000a043a000e057900770444005e0579
-00a40473008b06390060047300480639006004730048080000000000ffdc
-0000ff160000ffdc0000ff200000ffdc0000ff200000000005b8005001f4
-ff8502b8000a03e10052043d00330440006401f4ff8503fdff8504400064
-0440006406d9001306d9001306d9001306d9001301ba00280493004a031d
-0042065200500252ff85025eff85000000000000000006750048027b003d
-0000ffdd0000fe870000fefd047300690568005c05c7006005c7006006aa
-008b05c70000098700a4078d00000556000004e3002d0800002900000005
-0000002a026600ea02660056026600620000002e04a80027000000100000
-00680000006801df000501df000501df002a01df002a01df002a01df002a
-028000ae028000b20364000003640000057e001f04bc001f05b8005001f4
-ff8505b8005001f4ff8505b8005001f4ff8505b8005001f4ff8505b80050
-01f4ff8505b8005001f4ff8504580056045800560458ff85045800560458
-00560458ff8504580056045800560458ff8504580056045800560458ff85
-04580056045800560458ff8504580056045800560458ff8502b8000a02b8
-000a02b8000a02b8000002b8000a02b8fffc02b8fffc02b8000803e10052
-03e1005203e1005203e1005203e1005203e1005203e100520698000a04d7
-ff850698000a04d7ff850698000a04d7ff8508b8000a06c3ff8508b8000a
-06c3ff8504a4ff85045c005203a000560458ff850323ff85065200500652
-00500252ff85025eff85065200500252ff85025eff85065200500252ff85
-025eff85065200500252ff85025eff8504a8002704a8002708ff001e07d3
-ff7904c100330327ff8504cd00330327ff8504cd00330327ff8504cd0033
-0327ff8504c100330327ff8504c100330327ff8504c100330327ff8504c1
-00330327ff8504c100330327ff660414002901baff850414002901baff85
-0414002901baff850414002901baff85043d003301f4ff85043d0033043d
-003301f4ff85043d003301f4ff8504580056045800560458ff8503640000
-0364000003640000036400000364000003640000036400000364000005f3
-000505900005051f001f04bc001f01f4ff8503640000051f001f04bc001f
-051f001f04bc001f0000fe460000ff6e0000ff590000ffb70000fec308fc
-003208ad00320000ffb50000ffb60000ff410000ff920000fec30000ffbf
-0168003202cc00320000fea20000ff5a04cd00320000ff580000ff580000
-ff920698000a04d7ff8508b8000a06c3ff85045c005203a000560458ff85
-0323ff85034c008902b8001f02aa001d02aa001d02aa001d02aa001d02aa
-003f02aa003f02aa000402aa000402aa000402aa000402aa00ca02aa00e3
-02aa001702aa001702aa001d02aa001d055600a4047300480556fffe0473
-004e055600a40473008b055600a40473008b055600a40473008b05c70060
-0400004805c700a40473004805c700a40473004805c700a40473004805c7
-00a40473004805c700a404730048055600a404730048055600a404730048
-055600a404730048055600a404730048055600a40473004804e300a40239
-0010063900600473004805c700a40473008b05c700a40473008b05c700a4
-0473008b05c700710473005305c700a40473008b0239ffce01d3ff9b0239
-000701d3ffd3055600a40400008b055600a40400008b055600a40400008b
-047300a401d3008b047300a401d3ffb1047300a401d3ffb1047300a401d3
-ffac06aa00a406aa008b06aa00a406aa008b06aa00a406aa008b05c700a4
-0473008b05c700a40473008b05c700a40473008b05c700a40473008b0639
-006004730048063900600473004806390060047300480639006004730048
-055600a40473008b055600a40473008b05c700a402aa008b05c700a402aa
-008b05c700a402aa006605c700a402aa001d0556005c0400003f0556005c
-0400003f0556005c0400003f0556005c0400003f0556005c0400003f04e3
-002d0239002304e3002d0239002304e3002d0239ffed04e3002d02390017
-05c700a40473008705c700a40473008705c700a40473008705c700a40473
-008705c700a4047300870556000c0400001b0556000c0400001b078d0019
-05c7000a078d001905c7000a0556000a0400000e0556000a0400000e0556
-000a0400001b04e300250400002904e300250400002904e3002504000029
-0473008b0239000d05c7000a0400001b0473004e0200008b049c0048049c
-0048049c0048049c0048049c0048049c0048049c0048049c00480556fffe
-0556fffe060a0000060a000005e2000005e20000059c0000059c00000400
-0048040000480400004804000048040000480400004805eb000005eb0000
-073000000730000007300000073000000473008b0473008b0473008b0473
-008b0473008b0473008b0473008b0473008b065c0000065c000007a10000
-07a1000007a1000007a10000075900000759000001ec008b01ec008b01ec
-ffdb01ecffdb01ec000301ec000301ecff9b01ecff9b02b6000002b60000
-03fb000003fb000003fb000003fb000003b3000003b30000047300480473
-004804730048047300480473004804730048063900000639000007da0000
-07da00000776000007760000047300870473008704730087047300870473
-0087047300870473008704730087064c00000778000007ca000007490000
-058500480585004805850048058500480585004805850048058500480585
-0048063900000639000007da000007da0000077600000776000007360000
-07360000049c0048049c004804000048040000480473008b0473008b01ec
-ffeb01ec0078047300480473004804730087047300870585004805850048
-049c0048049c0048049c0048049c0048049c0048049c0048049c0048049c
-00480556fffe0556fffe060a0000060a000005e2000005e20000059c0000
-059c00000473008b0473008b0473008b0473008b0473008b0473008b0473
-008b0473008b065c0000065c000007a1000007a1000007a1000007a10000
-075900000759000005850048058500480585004805850048058500480585
-00480585004805850048063900000639000007da000007da000007760000
-077600000736000007360000049c0048049c0048049c0048049c0048049c
-0048049c0048049c00480556fffe0556fffe0556fffe0556fffe0556fffe
-02aa010302aa00f902aa010302aa000602aa00060473008b0473008b0473
-008b0473008b0473008b065e0000064d000006cf000006be000005c700a4
-02aa004602aa006e02aa000601ecffc201ecffb201ecff7e01ecff7e01ec
-ff9b01ecff9b0239fff60239ffe6032900000318000002aa004602aa006e
-02aa0006047300870473008704730087047300870491008b0491008b0473
-0087047300870556000a0556000a06a6000006e7000005eb000003480037
-0348003702aa005605850048058500480585004805850048058500480708
-00000693000007080000069300000639006602aa00e302aa01030000fec3
-0000fec80000fdf40000fed80000ffa40000feea0000ff4c0000fe9e0000
-fec30000ffbf0000ff3d0000fe9e0000fed80000fed80000ffae0000ffae
-0000ffae000000640000ff470000ff480000ff440000ff440000fe870000
-00000000ffa60000ff440000ff440000ff440000fec80000ff2d00000000
-0000feeb0000ff4c0000ffae0000ff350000ff5f0000ffbf0000fe870000
-febb0000fec30000fec30000fed80000fed80000feb10000fec80000fdbf
-0000fdf40000feb10000fec80000fdbf0000fe870000fee30000ffa60000
-fe870000ff440000feba0000ff230000ff9a0000fdf40000feb10000ffae
-0000fe940000ffa40000fe870000fdf40000ff3d0000ff440000feb10000
-feb10000feb10000ff030000ff440000ff530000ff530000ff53045cffee
-04c30016045c000c04c30035045c000c04c30035045c000c04c30035045c
-000c04c30035045c000c04c30035045c000c04c30035045800790458003c
-0473000a05fd0000053d00a40473008b053d000d0473000305c7006905c7
-00600400004805c70002066e0000053d005104730048047300480556006d
-0514006a04e3ffd1063900600556000c0724008b01d3008b023900140556
-00a40400008b01d300140400001b06aa008505c7ffd10473008b06390060
-070e006005a0004805fd00000473008b055600a40556006a0400005004e5
-0060035600000239002304f700140239002304e3002d0625007105c700a4
-062c000a0400001b04e3002504000029046c001f046c006003c6004803c6
-00330473003f0473002f03a90020044e0023046c008b021400bc02140026
-05d200c1023900b60a5b00a4097800a4084c0048086000a4064a00a40363
-008b097800a4073e00a40607008b0556fffe0473004e0239ffdf01d3ffa9
-063900600473004805c700a40473008705c700a40473008705c700a40473
-008705c700a40473008705c700a404730087047300480556fffe0473004e
-0556fffe0473004e08000000071d004e0639006004730048063900600473
-0048055600a40400008b06390060047300480639006004730048046c001f
-03c6002b01d3ffac0a5b00a4097800a4084c00480639006004730048085b
-00a4046c008b05c700a40473008b0556fffe0473004e0556fffe0473004e
-055600a404730048055600a4047300480239ff6601d3ff3e0239fffa01d3
-ffc80639006004730048063900600473004805c700a402aa000605c700a4
-02aa007c05c700a40473006a05c700a404730087040200420374002305c7
-00a40473008b057900a404a800420446003904e30025040000290556fffe
-0473004e0639006004730048063900600473004806390060047300480639
-0060047300480556000a0400001b02aa001d02aa001d02aa001702aa003f
-02aa00040473008c049c0048049c00480473008b0400001b040000000473
-0048047300480473004805db004804000048040000230552002304460048
-02620010047300480473004804ae004b0400001b04e0001d047300870473
-008b0473008b01d3000001ec008b01d3008b029e0000024e000001d3008b
-0486008b06aa008506aa008506aa008b0473ffb80473008b0455008b0473
-004805c50048058500480473004802aafff802aafff802aafff802aa008b
-02aa008b0239008b0239fff80447008b0447008b0400003f0231ffb20262
-00100231ffcf0399000002390012023900230473000004c50048043b0087
-0400001b05c7000a0400001b03ce000004000029046e002903c6002b03c6
-002c0400001b040000480400001b0400004806390060043f008b04460048
-04ae004b0473008b02ff000a040000080364008b047300480400001b0400
-0048078e00480718004807fc004805b6002303930023060c002306190010
-0568008b04f0008b03e2001e048200880481008b0473008705cd000a0767
-fffd05cd000a047300480585004804970014063900600473004805c70060
-0400004804e300a403fc008b04ff0000043c0032060d000a049d000006aa
-008506aa00850579007704730087057900a4044e000a0556006a0556006a
-04e0000504e0000505e500600476004803c70014034f0028049700140496
-005e0400004801d3ffb80639006003b6004803b6001b095f006005e8001b
-0600000a04c0000a079800a405c2008b054a000d03fe001b06f800a4057a
-008b0735000805aa000508f700a4076c008b0514006d0400004a0679005e
-0585008706390060047300480604000c04a4001b0604000c04a4001b0ab3
-006008d300480711005f05680048095f006008800048095f006005e8001b
-05c700600400004803f800140000fffa0000000000000000000000000000
-fc2b0000fc4c05c700a40479008b053d000f042f0008055600a40473008b
-048900a40426008b0514005a040000230556001804000008069d000a04d1
-000a071200a40543008b084700a406c6008b05c700600400004805c70060
-0400004804e3002d03aa00250744000a0563000a057900770444005e070b
-000a053b000a070b000a053b000a023900bc0735000605aa0004055600a4
-0400008b05a4000a0491000a05c700a40473008b05c700a40473008b0579
-00770444005e06aa00a405b6008b0556fffe0473004e0556fffe0473004e
-08000000071d004e055600a40473004806390060047300480735000605aa
-00040514005a040000230443001f03c6002b05c700a40479008b05c700a4
-0479008b0639006004730048063900600473004805bc005e0400001b051f
-00080400001b051f00080400001b051f00080400001b057900770444005e
-071000a405bc008b053d00510473004807d100510724004807e2006d06f0
-004a0582006d0468004a0838000a073e000a085b00a4071f008b06390060
-04ae004b0609002d056b002502aa001d02aa001702aa003f02aa001d02aa
-000402aaff8c04c1003304c10033028f004c0000fed802fe000004cd0037
-045cffc904c3fff10000ff1a0000ff070000ffd00000ff070000ff280000
-ff190000ff190000ff280000fe970000ff760000ff7e0000ff0e0000ff07
-02aa00a102aa00a702aa00f902f7005a02f7005a0170000a01d5005a01d5
-000a01d5000a02dc005a03e4000a029e000a02aa00e502aa005601c7007d
-01c7007d01c7007d02aa00fb02aa00fb031f005a031f005a04ac007104ac
-007104ac006604ac006602aa011402aa00e302aa005602aa011402aa001d
-02aa005602aa00e3023900b6023900b602aa00fb02aa00fb02aa009902aa
-009902aa009902aa001d02aaffe9030e002d029e000a0133005a0303005a
-02b0000a031f005a031000960310009603100096031000960310009602aa
-006202aa006202aa001802aa002a02aa0054045700960457009604570096
-045700960457004304570043045700430457004304570043031000430457
-002f0457002f0457002f0457002f0457002f0310002f0457002504570025
-0457002504570025045700250310002f0457001a0457001a0457001a0457
-001a0457001a0310001a0457004204570042045700420457004204570042
-031000420457009604570096045700960457009604570042045700420457
-00420457004204570042031000420457002f0457002f0457002f0457002f
-0457002f0310002f0457002f0457002f0457002f0457002f0457002f0310
-002f04570026045700260457002604570026045700260310002604570042
-045700420457004204570042045700420310004204570096045700960457
-009604570096045700420457004204570042045700420457004203100042
-045700260457002604570026045700260457002603100026045700230457
-0023045700230457002304570023031000230457002f0457002f0457002f
-0457002f0457002f0310002f0457004b0457004b0457004b0457004b0457
-004b0310004b045700960457009604570096045700960457004204570042
-045700420457004204570042031000420457001a0457001a0457001a0457
-001a0457001a0310001a0457002404570024045700240457002404570024
-031000240457002f0457002f0457002f0457002f0457002f0310002f0457
-004e0457004e0457004e0457004e0457004e0310004e0457009604570096
-04570096045700960000fd1f0000ff430000ff070000ff770000ffbd0000
-ff600000ff560000ff740000fed70000feac000000000000ff560000ff56
-000000000000feac0000fd99000000000000ff6a0000ff7c0000ff690000
-ff560000feac0000ff7f0000ff560000fdee0000ff430000ff690000ff7c
-000000000000fdae0000ff8c04c100660000ff530000ff530000ff530000
-ff5301d3000001d3ffb80424000505560021060500480365004f0609008b
-0380002304ef000a0540000a02aa008702aa008702aa00c902aa00c902aa
-00a202aa0056037a0056037a009d02aa0006023900b602aa009902aa0099
-02aa009902aa0099032e001e032e001e02aa003a0000fee70000ffa50000
-fed80000ff230000ff710000ff710000fee70000ffa50000ff530000ff53
-0000ff53055600a40473008b0444000005fc0000071d004e043f001e0400
-00480469008d0469001e03f3008b0400002301d3008b037e00480400008b
-0395001405b6008b0479008b047300480400001b04e6004804e6004804e6
-0018078d0048039200480473004804730048042f008b0456003504560035
-03aa00250473008704ce004805e4004806aa013a0400001b05c7000a0400
-0029037b00480401004804e0001d0310008b0400001b0473008b042f008b
-058500870491000a0396000005610000039200640392001703e000640391
-0064039100500448005003cb0064014b006402cf00500386006403130064
-0464006403cb006403cb0064044d005003180050039e006403e6006403a9
-005003cb006404f0000002ff003c02ff005a0303003c04d7003c0304005a
-0303003c0313003c0313003c02df003c02df003c0303003c0133005a02a5
-005a0474005a02f7005a0313003c02e3003c0313003c0313003c0304005a
-01d2003c02f6005a0350003c0474005a028a0000031c0000030e005a02c0
-00000313003c0391003c02b900000133005a01d5005a02f6005a028a0000
-030e005a02c000000313003c0391003c02b90000074400460c2400460958
-003d0713ff850958003d0295003c045c00140000ff150000ff230000ff12
-0000feb60000fed30000ffdd0000ff460000ff7c0000ff3f02b8000a02b8
-000a03e1005203e10052039aff850323ff85039aff850323ff8505fa0083
-0555001405f900980555005a0555004805f90050052c002d05f9005404ac
-00710000fe930000fea90000fe910473010102aa005402aaffce04ac0071
-01baff8501baff8501baff8501baff850851004809bd0029040000000800
-0000040000000800000002ab000002000000015500000473000002390000
-019a000000ab00000000000005c7006006aa00a405b6008b000000000000
-00000000000000000000000000280753008707120048071200480556fffe
-05c700600400ffcf0473ffca04e300160400003f0400002904b7001b0000
-00f80000ff2b0000febd0000ff600000fce80491000005c7006905c70060
-05c70069048900a40310008b0000ff430000ff460000ffaf02cd009803d2
-0000026600560000ff290000ff570000ff560000ffb70000001b00000000
-05b8005001f4ff7605b8005001f4ff8505b8005001f4ff8505b8005001f4
-ff8505b8005001f4ff8505b8005001f4ff8505b8005001f4ff8504580056
-045800560458ff8504580056045800560458ff8502b8000a02b8000a03e1
-00520698000a04d7ff85045c005203a000560458ff850323ff85045c0052
-03a000560458ff850323ff85045c005203a000560458ff850323ff850652
-00500252ff85025eff85065200500252ff85025eff8504c100330327ff85
-0327ff8504c100330327ff850327ff8504c100330327ff850327ff8502b8
-001f0323ff8502b8001f0323ff85043d003301f4ff85043d003301f4ff85
-043d003301f4ff85041400290414002901baff8501baff8503e1005203e1
-00520698000a04d7ff850473ff99047300480239ffbd06aaffa00473ffa0
-0473ff9b02aaff9e0239ff9e0400ff790239ffb7040000240473008c03cc
-0070041e003206acfff4026b002601ecffb20473000904d9000904c50005
-0473008b0473004802390010047300480400008b01d3007506aa008b0473
-008b0473008b02aa00750400003f0231ffb20400001b0400000e04000029
-0473004e04730048047300480473004804000048040000230473004801d3
-008b0400001b0231ffb20473008703c6002b0304005a02ae003002ae0000
-02fb003002ae0017017d000b0199000b02fb003002fb005a01390000014a
-005d01a3001401a30014020200070139005d0139004e0246005d0477005d
-0477005902fbffd002fb005d02e7005d02fb003002fb003002ae002a0178
-ffcc017d001702fb00000332003002fb005a02d6005a02ae001202ae001b
-02ae001b02f8001b0287001d02fb003e0000ff3e0000ff3e0000ff9c0000
-fedd023900b602fb003c02fb003c02fb003c02ae000902fb003c0473005c
-0473fffe047300160473005c02aa00420266ffdb0506001606aaffa00473
-ffa004000024040001fe02ae00090000ff2d049c0048049c0048049c0048
-049c0048049c0048049c0048049c0048049c004801ecffbe01ecffbe01ec
-ffbe01ecffbe01ecffce01ecffcd01ecffce01ecffcd0473008704730087
-04730087047300870473008704730087047300870473008701ecffbe01ec
-ffbe01ecffce01ecffce04730087047300870473008704730087045c000c
-04c300350400001b0556001505c700140556fffe055600a4047300480400
-003701d3ffb8060100600473004805c7001502aa00150556000a0400001b
-03f0003c03f0004803f0003c01d3008b04ae003a0310003005ba000a0468
-000e0556000a0400000e0514006a0400004805a4000a0491000a00000061
-0000001d0000001e0000001d0000001e0000005600000057000000b00000
-00770000007706ac002503f500480400001b04730015024a001404c8000a
-0556001505c700a40473004e029e002305fc00a404b3008b05a800a40460
-008b054d002504600029041e001e043d00a4032b008b05310048035b00c8
-03530075035a007503de007504c9007504c90075040001aa040001a10400
-013504000135040001350400013504a6014a0110000001c7000000000000
-03e1005203e1005203e1005203e1005203e1005203e1005203e1005203e1
-005203e1005203e1005203e1005203e1005203e10052027b003d030e0048
-01f4ff85ff85ff8500000000000000280000002800000028000000280000
-002800000028000000280000002800000028000000280000002800000028
-000000280000002800000028000000280000002800000028000000280000
-002800000028000000ee000000ee000000ee000000ee000000ee000000ee
-000000ee000000ee000000ee000000ee000000ee000000ee000000ee0000
-00ee000000ee000000ee000000ee000000ee000000ee000000ee000000ee
-000000ee000000ee000000ee000000ee000000ee000000ee000000ee0000
-00ee000000ee000000ee000000ee000000ee000000ee000000ee000000ee
-000000ee000000ee000000ee000000ee000000ee000000ee000000ee0000
-00ee000000ee0000011800000118000002a0000003b2000004a0000005a2
-000006de000007b20000093c000009e600000a3c00000a3c00000b5a0000
-0b9a00000cb200000d6400000e5800000f7400000f7400000ff200001158
-0000121e000012d8000013d8000013d8000013d800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-154800001548000015480000154800001548000015480000154800001548
-000015480000154800001548000015480000154800001548000015480000
-1548000015480000154800001548000100000bed00a80018005f00070002
-0010002f00550000047e02c3000500010000000c00960001000000000000
-0032000000010000000000030019003200010000000000040019004b0001
-000000000006001900640001000000000007008a007d0003000104090000
-0064010700030001040900010032016b0003000104090002000e019d0003
-000104090003003201ab0003000104090004003201dd0003000104090006
-0032020f000300010409000701140241a92032303036204d6963726f736f
-667420436f72706f726174696f6e2e20416c6c2052696768747320526573
-65727665642e5241434347412b4d6963726f736f667453616e7353657269
-665241434347412b4d6963726f736f667453616e73536572696652414343
-47412b4d6963726f736f667453616e7353657269664d6963726f736f6674
-2053616e7320536572696620697320656974686572206120726567697374
-657265642074726164656d61726b206f7220612074726164656d61726b20
-6f66204d6963726f736f667420436f72706f726174696f6e20696e207468
-6520556e697465642053746174657320616e642f6f72206f746865722063
-6f756e74726965732e00a9002000320030003000360020004d0069006300
-72006f0073006f0066007400200043006f00720070006f00720061007400
-69006f006e002e00200041006c006c002000520069006700680074007300
-2000520065007300650072007600650064002e0052004100430043004700
-41002b004d006900630072006f0073006f0066007400530061006e007300
-5300650072006900660052006500670075006c0061007200520041004300
-4300470041002b004d006900630072006f0073006f006600740053006100
-6e007300530065007200690066005200410043004300470041002b004d00
-6900630072006f0073006f0066007400530061006e007300530065007200
-690066005200410043004300470041002b004d006900630072006f007300
-6f0066007400530061006e007300530065007200690066004d0069006300
-72006f0073006f00660074002000530061006e0073002000530065007200
-690066002000690073002000650069007400680065007200200061002000
-720065006700690073007400650072006500640020007400720061006400
-65006d00610072006b0020006f0072002000610020007400720061006400
-65006d00610072006b0020006f00660020004d006900630072006f007300
-6f0066007400200043006f00720070006f0072006100740069006f006e00
-200069006e002000740068006500200055006e0069007400650064002000
-530074006100740065007300200061006e0064002f006f00720020006f00
-7400680065007200200063006f0075006e00740072006900650073002e00
-b15440b80135b31c22392f410c0135003f0135004f0135008f0135009f01
-3500050040012eb31c1f3930411201280001004001280080012800900128
-00a0012800b00128000500ef0126000100400125b31b1f3940410a012400
-01002f01050001004f010400010040010340aa090d392f652f662f672f68
-2f692f6a2f742f752f7b2f7c2fd12fd20c20fc30fc40fcd0fc04f1f2197f
-f2018ff2aff2e0f203d1d216171c7b7c161b7b7c19307c407c507c607c70
-7c05767716171c6d7016171c6c6f16171c6b6e161b0f6b7f6b8f6e9f6eaf
-6e056b6e7f721a747514151c676a14151ca96ab96ae96af96a0466691415
-1cc669016568141b0f651f6502af68bf68ef65ff6504656885711a197316
-7a431921794319212f4147014200400142007f014200030050013b000100
-2f013a004f013a006f013a007f013a00bf013a0005007f01340001007f01
-3300800133009001330003006f0132007f0132008f013200030070012100
-01002f0121003f0121004f0121005f0121000400a0011e00b0011e00c001
-1e00030020012d0030012d0060012d0070012d0080012d0090012d000600
-40010fb40b1f39092f411f010e005f010e009f010e00af010e00bf010e00
-050090010e00bf010e00cf010e00df010e00ef010e00050020010e006f01
-0e00b0010e00d0010e00e0010eb205d10f4123010e003f010e00bf010e00
-cf010e0004000f010e005f010e006f010e00a0010e00bf010e00cf010e00
-df010e0007003f010e004f010e007f010e00af010e00ef010e00ff010eb2
-069f7f4123010e00af010e00e0010e00ff010e0004001f010e003f010e00
-af010e00df010e00ef010e0005000f010e001f010e002f010e007f010e00
-8f010e00c0010e00df010e00ef010eb2086d9f411b010e00cf010e00ef01
-0e00ff010e0004000f010e00ef010e0002000f010e002f010e003f010e00
-4f010e00c0010e00df010e00ef010eb2073a70bd010e00df010e00020040
-010eb32b33395f411b010e0070010e008f010e009f010e00cf010e00df01
-0e0006000f010e001f010e003f010e0080010e00bf010e00ef010e000600
-40010eb3091b3970bb0136000100200108b30d113940b80102b20b1439b9
-ffc00107b31b22392f4118010c004f010c0002002f010c0001008f010b00
-01002f0107004f010700c0010700d001070004004f010700010040010040
-640b103940fe0b1139e0f601e0f60114f424f40274f40140df60df0220d8
-30d840d80366c176c10299be0120b230b240b20360b070b0029b93002b9a
-92002b9991002b9493002b9293002b9193062b9395032b9885042b979604
-2b9695032b9995a995026f410f0131007f0131008f013100030130011600
-32001f011901160015001f0116b285032bb9ffe0012fb30b143970410d01
-170001002f0117003f0117004f0117005f0117000401130114b22a1fa0bc
-011400b0011400c0011440160370fbf0fb022ffb6ffb7ffb0340fa50fa60
-faf0fa04b8ffc040fffa11153950ec70ec0250ec70ec0240ec01bfeb0170
-ea0130ea0170e9015fe970e9f0e903a0e9015fe870e802efe8017fe8bfe8
-efe803f0e701f0e7012fe780e7a0e7f0e70450e6f0e60250e660e670e6c0
-e60450e50170e50180e4e0e4f0e40340dca0dc02309050900220a04fa05f
-a09fa0afa0efa006e0f501e0f501f3851e1f2fe20140dd019fd5afd5bfd5
-030fd340d302e0d0010fc470c4022fc43fc44fc45fc49fc4afc4efc4ffc4
-0899bd99bf02dad9042bd685022bcccd062bcd85022bc9c8062bc885022b
-8d8b042b8c8b191f8b83c81f897d641f817f082b7d7f082b7f85072baf85
-042b8885012b8785002b8485042b8385002b2ffd4ffd027f40abef012df0
-3bf04ff069f07ff0051b37151836151535151234150f33150c3215093115
-063015032f15002e1526270f28270f26002a1f0f2a2f2a3f2a032f24bf24
-022a2b0f2c2b0f22230e24230f1e1f0e201f0f2005010f10110c0c0d0e0c
-090a0b0c0607080c0304050c0001020c0003181f500f700f027f0f800fbf
-0f030f031f032f034f037f03bf03ef030704012c1f1b011d0d18071a0d15
-10170d1204140d701b01501b701bf01b03b8ffc0400b1b131839701b801b
-02503301b0124b004b5442b013014b004b5342b0332b4bb8032052b0322b
-4bb009505b58b101018e59b0332bb00288b8010054b00488b8020054b012
-435a5b58b80119b101018e851bb900040100b04b60858d592b1db0644b53
-58b0801d59b0324b5358b0901d5900732b74742b2b2b2b2b7373742b2b2b
-2b2b2b2b732b2b2b2b2b2b73732bb1282645b02a4561b02c4560442b2b2b
-2b2b2b2b2b2b2b2b2b73b0ef45b0f0456168b0f04560b0ef23447373012b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b73737473737373732b74737374
-7373737473747374747373747374747374737374742b747374742b73742b
-2b2b2b7300732b2b2b2b2b2b2b2b2b2b737373737373737473742b2b7373
-7373732b2b2b742b73742b755e7374755e7374755e7374755e7374755e2b
-73747374737373737373012b2bb018b0314b53422b2b73742b732b732b2b
-2b732b2b2b2b732b2b2b73742b73732b7373732b7373742b732bb109322b
-4bb05052424bb03c524bb00f505bb01a23424bb0c8524bb036505bb00c23
-422b000000>
-[5449 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-1 40 21 <0001003f0000040a05d300180073402f0f16010f151f153f154f15040b0b
-1b0b2b0b030d0a07010f0d099b0610011010041799019017010f171f1702
-120317b8ffc840190b1036170118068913010c890d401a137c02190d7b02
-a01a015d2b2b011a18104dedc410edc612392b5f5e5d5d002fed3f5e5ded
-cd31305e5d5e5d5d5d212134360036353426232206072336363332161514
-06000721040afc35a601bba48c7f6e9c0ac310fdcedbeeb0fdf50502c486
-f40165d587798b8c88c1e7ebb1a0f5fe4c40>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 238 66 <0001fff4febe0476ff240003000fb501b3020005012f10c4002fed313001
-2135210476fb7e0482febe66>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 280 68 <0002004effe703e7043d00090020012240321f2a0d1136071d171d271d37
-1d0402971aa71ab71ac71ad71a05017a140103b70ec70ed70ee70ef70e05
-080d180d02090109b8ffe0400b0d113603300d1036019712b8ffc040400d
-0d063b1240120c14183608121812020d001b0c1297183008191819281968
-197819c819061916961b1007960c162020210d1136188508191819281903
-0a0019b8fff440180d0d063b190c0b0b063b19190f120120851f0c0d0d06
-3b1fb8ffe8b50b0b063b1f04b8fff8400d0d0d063b04830f140d0d063b0f
-b8ffe440180b0b063b0f40221f6802210f6602572201a72201482201005f
-5d5d712b2b011a18102b2b4ded2b102b2bed323212392f2b2b5f5e5ded2b
-002f3fed3fedc45d2b005f5e5d2b1a18102b4ded31302b2b5f5e5d5d5f5d
-5f5d5f5d012b013523201514163332361706232226351021333426262322
-072312213216151123032b81fe6678665dae3290e39ecc02815c186e78fc
-08bc1501b5cce4bc0117ebdf5157546286ab870174726744b40147a2edfd
-5200>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 672 69 <0002008bffe7042b05ba000e001900bd4047a819b819020248190100a715
-b715020225130103580f010a0a1a0a2a0a3a0a5a0a6a0a7a0a0702770687
-0697060301a704b70402a801b80102179602100d00119608160c148305b8
-fff4b40d0d063b05b8ffd240150b0b063b050805180528054805040d020f
-000b850cb8fff4b40d0d063b0cb8ffca40160b0b063b0c401b0569021a0c
-6502481be81bf81b03005f5d2b2b011a18102b2b4ded32325f5e5d102b2b
-ed002f3fed3f3fed31305d5d5f5d5f5d5d5f5d5f5d5f5d5f5d0136333212
-15100223222715231133111633323635342623220701487eb1d0e4ffc2ac
-76bdbd799d7a90887a9d8103a697fed9fbfefbfed16b5205bafb4281d1cf
-c4cbb600>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 946 70 <00010048ffe703e5043d0019009740212818381802270837080202090d96
-4a060106101713964500010300160a09168317b8ffe0b40d0d063b17b8ff
-d4401b0b0b063b1747176717020005101510020d03108303120d0d063b03
-b8ffdc401d0b0b063b034007033703470357030411021b176a021a036602
-f81b01005f712b2b015f5e5d1a18102b2b4ded5f5e5d5f5d102b2bed3939
-003f5f5dedcd3f5dedcd31305f5d5d052200111000333216172326262322
-06151416333236373306060239e2fef1010fe2aee915c204875f87a8a887
-5f8704c215e9190123010801090122b0a65f64cdcbcacd645ea6b000>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 1184 71 <00020048ffe703e705ba000a001900acb90014ffe0403b0d1036a80fb80f
-02080c180c02a70ab70a02a807b807020228050101570101024700010103
-961310170009960d190d161500198518120d0d063b18b8ffe8400e0b0b06
-3b18068310100d0d063b10b8ffe040270b0b063b10400710171027104710
-771087109710070d021b1868021a106602481be81bf81b03005f5d2b2b01
-5f5e5d1a18102b2b4ded102b2bed3232003f2f10ed3f3fed31305f5d5f5d
-5f5d5f5d5d5d5d2b01112623220615141633323706232202351012333217
-11331123032b7a9d799189799e817eb1d0e4ffc1ac77bcbc013101f881d1
-cfc4cb04980128fb0104012f6a01e7fa4600>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 1442 72 <00020048ffe7042b043d0014001b00d840091a110108201317360cb8ffe0
-40450b0e360813011067017701020b961b400a1b01110206001b9618304a
-185a180218968a060165060103061007121712020900120e962500010a00
-010f030016118312158309b8ffeeb40d0d063b09b8ffde400f0b0b063b09
-1b0b8303100d0d063b03b8ffde40260b0b063b0340070337034703570304
-11021d0969021c036602571d771d02481de81df81d03005f5d712b2b015f
-5e5d1a18102b2b4ded32102b2bedd4ed003f5f5e5d5dedcd5f5e5d3f5f5d
-5ded5d2b005f5e5d1a18104ded31305d5e5d2b2b015d0522001110003332
-0011152116163332363733060613262623220607024eeafee40113dee301
-0ffce10cb383639f04c316fd6017a07471a216190125010601040127fede
-fef72db8b2655da4b202929998979a00>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 1758 73 <000100100000026205d300140091b90008ffd64051090d36271001020e95
-090112000396060f02a714b71402370b470ba70bb70be70bf70b060b0314
-12060085780301070317032703b703c703d7030604280301280301570301
-9703a70302030c0d0d063b03b8ffbe40120b0b063b037816014716a716b7
-16f71604005f5d5d2f2b2b5d715d71cd5d5dfd3939cd10c45d5d002f3fed
-39393fed31305f712b011123112335333510213217152623220615153315
-0168bc9c9c01295b32383a4543c90391fc6f0391945e01500ca40a4d5f5c
-9400>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 1970 74 <00020048fe5203e7043d00180023011eb61a180b0b063b0bb8ffe8b40b0b
-063b0cb8ffe8b40b0b063b19b8ffe0403b0b0b063ba723b72302281e0102
-47190100a820b8200202551565150203a810b81002a70db70d0202470a01
-00050a150a250a034501013a01010315b8ffd6b30d103604b8ffd6401812
-16361c961410180f22960e1637050100053f0d10063b05b8ffc040130a11
-36050896021c19160c8500100d0d063b00b8ffe840160b0b063b00068305
-400d1036051f8311100d0d063b11b8ffe040270b0b063b11400711171127
-114711771187119711070d0225006802241166024825e825f82503005f5d
-2b2b015f5e5d1a18102b2b4dedd42bed102b2bed3232003fedc42b2b5f5d
-3fed3f3fed31302b2b5f5d5d5d5f5d5f5d5d5f5d5f5d5f5d5f5d5d002b2b
-2b2b25102122263533143332363535062322023510123332173533031126
-232206151416333203e7fe32c8e7c3ea84907eb1d0e4ffc1ac77bcbc7a9d
-799189799e52fe00ae93ae91d435980128fb0104012f6a52fd0c01f881d1
-cfc4cb00>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 2364 75 <0001008b000003ec05ba0010006e402d9308a308020103110371039103a1
-030509030113012301030a030a95000e02100f00060e068505040d0d063b
-05b8ffe640090b0b063b05000d850eb8ffca400e0b0b063b0e4012056802
-110e65022b2b011a18102b4ded32102b2bed002f333f3f1239ed31305f5e
-5d5e5d5d013633201111231134262322071123113301488db00167bd5d6a
-9090bdbd039e9ffe79fd4a02ae8272aafd0805ba>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 2534 76 <0002008b0000014805ba000300070033b2059806b8ffc040100b0b063b06
-00020f0109680504008501b8ffd0b60b0b063b01650810f62bfd3939e600
-2f3f3f2bed313021231133352335330148bdbdbdbd0425c9cc00>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 2620 78 <0001008b000003f805ba000b00eab50920161b3608b8ffe0404c141b3627
-08470802000b0b0002030201030a02011c02030187000b1400000b08091c
-09870a03140a0a03150b01070b01020703010f00010208030a0f0600050b
-05130ae30a020a0a0111030ab8ffc0b3141b360ab8ffc0b50b10360a0a00
-b8ffc840090b0b063b0008038505b8fff4b40d0d063b05b8ffc840140b0b
-063b05400d0075020c056502870da70d02005f5d2b2b011a18102b2b4ded
-32122b392f2b2b5f5e5d5d1239002f3f3f173931305f5e5d5f5d5d87052e
-2b044b52587d1b7a5910c487052e182b084b52587d1b7a5910c40708103c
-083c005f5d2b012b21230107112311331101330103f8e1fea776bdbd0199
-eefe6e021b75fe5a05bafcc101aafe75>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 2906 79 <0001008b0000014805ba00030028b70200010568008501b8fffcb40d0d06
-3b01b8ffd0b60b0b063b01650410f62b2bfde6002f3f3130212311330148
-bdbd05ba>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 2970 80 <0001008b00000625043d001d00beb9001cffeab3090b3617b8ffea402e09
-0b36561c861c02005117811702171901171501021b050d95181411161012
-0f0109110185009008180814108511b8fffc400f0b0b063b119008850904
-0d0d063b09b8ffd640370b0b063b09400809010b001e1f09853030561f01
-081f481fa81fd81fe81f05381fd81fe81f03671fc71f02271f571f971fb7
-1fc71f05005f5d715d71712b015f5e5d1a18102b2b4dedf42bed32113310
-f4ed002f33333f3f123939ed393931305f5d5d5d5f5d2b2b212311342623
-2207112311342623220711231133153633321736363320110625bd4c5989
-84bc4c5a8983bdbd86a3e9406a9447014602ae8470aafd0802ae8470aafd
-080425879fc07d43fe79>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 3250 81 <0001008b000003ec043d00100075402d9308a308020103110371039103a1
-030509030113012301030a030a95000e02100f0f060e068505040d0d063b
-05b8ffe6400f0b0b063b05000d850e020d0d063b0eb8ffca400e0b0b063b
-0e4012056802110e65022b2b011a18102b2b4ded32102b2bed002f333f3f
-1239ed31305f5e5d5e5d5d01363320111123113426232207112311330148
-8db00167bd5d6a9090bdbd039e9ffe79fd4a02ae8272aafd08042500>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 3428 82 <00020048ffe7042b043d000b0017009b400a12960a001a004a000300b8ff
-e8402c0d0d063b00100c96050615064506030d0306180d0d063b06160803
-18032803030709170927090314020f8303b8fff0b40d0d063b03b8ffd040
-0e0b0b063b03158309100d0d063b09b8ffe0401b0b0b063b094019036902
-18096602f8190148196819e819f81904005f5d712b2b011a18102b2b4ded
-102b2bed5f5e5d5d003f2b5f5e5ded3f2b5ded3130013200111000232200
-1110001332363534262322061514160239e3010ffef1e3e2fef1010fe287
-a8a88787a8a8043dfedefef7fef8fedd0123010801090122fc3ecdcacbcd
-cdcbcacd>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 3672 83 <0002008bfe68042b043d000e001900c6404c19100b0b063ba819b8190202
-48190100a715b715020225130103580f010a0a1a0a2a0a3a0a0402770687
-0697060301a704b70402020501150125010303179602100d0f119608160c
-1b148305b8fff4b40d0d063b05b8ffd240150b0b063b0508051805280548
-05040d020f000b850cb8fff4b40d0d063b0cb8ffca40160b0b063b0c401b
-0569021a0c6502481be81bf81b03005f5d2b2b011a18102b2b4ded32325f
-5e5d102b2bed003f3fed3f3fed31305f5d5f5d5f5d5f5d5d5f5d5f5d5f5d
-5f5d002b0136333212151002232227112311331116333236353426232207
-01487eb1d0e4ffc2ac76bdbd799d7a90887a9d8103a697fed9fbfefbfed1
-6bfe1605bdfcd781d1cfc4cbb600>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 3956 85 <0001008b000002b2043d000d004a4018050a150a020c0202950b10070f06
-09058506040d0d063b06b8ffd040140b0b063b06400f0075020e06650227
-0fb70f02005f5d2b2b011a18102b2b4ded32002f3f3fed31305f5e5d0126
-23220711231133153633321702b2284b9067bdbd779d282e03790c97fd12
-042594ac0800>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 4082 86 <0001003fffe703b0043d001f0101b90003ffe640750b0b063b611b01271b
-371b0203271b371b0200771a010247195719671977190403471957196719
-77190400050e150e250e350e0403680c01870b0102280b380b0200780a01
-02080d181d0400121596101007021702670277028702c702d702e702f702
-09000205960016071d171d02090213851218b8fff440100d0d063b18850d
-120d02100d0d063b02b8ffe6b70b0b063b0208851db8fff0b40d0d063b1d
-b8ffdc40170b0b063b1d03850240211d6902200266022721a72102005f5d
-2b2b011a18104ded102b2bed122b2b39392fed2b2fed5f5e5d003fedc45f
-5d3fedc412173931305f5d5f5d5f5d5d5f5d5f5d5f5d5f5d5f5d5f5d5d01
-2b0520033316213236353426242635343633201323262322061514160416
-1514060206fe4d14bd020106757b78fe89add7b401a109bc0ad75f7d6001
-81bbe7190156c26149483b5e749284adfed79648453e375d7c9891bf>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 4440 87 <00010023fff20227052d0016007f4045032a091036aa040103280b780b02
-0b100d07960a0f1496027716010fa71601160d0a10857807010707170727
-070308280701280701a707b707c707d70704070c0d0d063b07b8ffc24012
-0b0b063b077818014718a718b718f71804005f5d5d2f2b2b5d5d71cd5d5d
-fd3939d65dc65d002fed3fed3939cd5d31305f5d2b050623222626351123
-353311331133152311141633323702273e49746c1a8383bcacac3730312d
-020c538270025a940108fef894fd9c6d3b08>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 4638 88 <00010087ffe703e704250010007e401f180b01029c08ac08020e031e037e
-039e03ae0305090c011c012c01030a030cb8ffe840180b0b063b00020d05
-0f100a950216100d850e040d0d063b0eb8ffe8b70b0b063b0e068505b8ff
-cc400e0b0b063b0540120e6802110565022b2b011a18102b4ded102b2bed
-32003fed2f3f33123931302b5f5e5d5e5d5d5f5d25062320111133111416
-33323711331123032b8db0fe99bd5c6a9e83bcbc87a0018802b6fd528272
-aa02f8fbdb00>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 4824 89 <0001001b000003e50425000600d4b106024354584011050302060f030f02
-010205000605030405b8ffe0b70b0b063b050508071112392f2bddcd10dd
-cd10cdcd002f3f3f11123931301b401b05061c0504068700011400000105
-041c0506048703021403030203b8ffe24043091936001e0919365e02010a
-021a024a0203510101050115014501030b03030f0208006a020703670277
-08f708023708670877088708a708e708f708070808180802005f5d5d712b
-2b00182f3f3130015f5e5d5d5d5d2b2b872e4d2b084b52587d1b7a5910c4
-87052e182b084b52587d1b7a5910c4590101230133010103e5fe6fa8fe6f
-cc011901190425fbdb0425fcc2033e00>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 5080 92 <0001001bfe5203e504250010012cb10602435458401702080503030c060f
-030f0f00950c1c0e05070605030405b8ffdcb70b0b063b05051211111239
-2f2bddcd10ddcd10c4003ffdc63f3f1112173931301b4049080818082808
-03022607010605160526050300470b570b670b03029702a7020203070217
-0227020309013a01010305061c0504068707081407070805041c05060487
-03021403030203b8ffe2401d091936071e091936030f08490201000a023a
-02020c02020095400c1c0fb8ffc040290910360f02080f03070312076a02
-11036702671277120227123712671277128712a712e712f71208005f5d71
-2b2b0111121739182f2b003f1a4ded2f5f5e5d5f5d333f3130012b2b8705
-2e2b084b52587d1b7a5910c487052e182b084b52587d1b7a5910c4015f5d
-5f5e5d5f5d5f5d005f5d5d5f5d591332130133010133010e022322273516
-c78c59fe6fcc01190119ccfe6f3a51835f47332cff0001000425fcc2033e
-fbdb98a5710eae0e>PBAAAA+MicrosoftSansSerif AddT42Char 
-1 0 0 <0002003200000226060000030007000033112111252111213201f4fe7801
-1cfee40600fa006c0528>PBAAAA+MicrosoftSansSerif AddT42Char 
-PBAAAA+MicrosoftSansSerif /CharStrings get begin
-/two 21 def
-/underscore 66 def
-/a 68 def
-/b 69 def
-/c 70 def
-/d 71 def
-/e 72 def
-/f 73 def
-/g 74 def
-/h 75 def
-/i 76 def
-/k 78 def
-/l 79 def
-/m 80 def
-/n 81 def
-/o 82 def
-/p 83 def
-/r 85 def
-/s 86 def
-/t 87 def
-/u 88 def
-/v 89 def
-/y 92 def
-end
-PBAAAA+MicrosoftSansSerif /Encoding get
-dup 50 /two put
-dup 95 /underscore put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 121 /y put
-pop
-end
-%ADOEndSubsetFont
-/KUDFNX+MicrosoftSansSerif /PBAAAA+MicrosoftSansSerif findfont ct_VMDictPut
-/KUDFNX+MicrosoftSansSerif*1 
-[50{/.notdef}rp /two 44{/.notdef}rp /underscore /.notdef /a /b /c 
-/d /e /f /g /h /i /.notdef /k 
-/l /m /n /o /p /.notdef /r /s 
-/t /u /v 2{/.notdef}rp /y 134{/.notdef}rp]
-KUDFNX+MicrosoftSansSerif nf
-KUDFNX+MicrosoftSansSerif*1 [9 0 0 -9 0 0 ]msf
-244.876 410.76 mo
-(gscms_create)
-[5.03999 4.563 4.56299 7.44293 4.56302 4.923 4.56302 2.99692 5.04001 5.04001 2.51999 0 
-]xsh
-244.876 421.389 mo
-(gscms_destroy)
-[5.03999 4.563 4.56299 7.44293 4.56302 4.923 5.04001 5.04001 4.56299 2.51999 2.99695 5.04001 
-0 ]xsh
-244.876 431.892 mo
-(gscms_get_profile_handle_mem)
-[5.03999 4.563 4.56299 7.44293 4.56302 4.923 5.04001 5.04001 2.51999 4.923 5.04001 2.99692 
-5.04001 2.51999 2.043 2.04297 5.03998 4.92303 5.03998 5.04001 5.03998 5.04001 1.91696 5.04001 
-4.923 7.44293 5.04001 0 ]xsh
-244.876 442.395 mo
-(gscms_release_profile)
-[5.03999 4.563 4.56299 7.44293 4.56302 4.923 2.99695 5.03998 2.04297 5.04001 5.04001 4.56299 
-5.04001 4.923 5.04001 2.99695 5.03998 2.51999 2.04297 1.91699 0 ]xsh
-244.876 452.898 mo
-(gscms_get_channel_count)
-[5.03999 4.563 4.56299 7.44293 4.56302 4.923 5.04001 5.04001 2.51999 4.923 4.56302 5.03998 
-5.04001 5.04001 5.04001 5.03998 2.04297 4.92303 4.56299 4.923 5.03998 5.04001 0 ]xsh
-244.876 463.401 mo
-(gscms_get_link)
-[5.03999 4.563 4.56299 7.44293 4.56302 4.923 5.04001 5.04001 2.51999 4.923 2.04297 2.04297 
-5.04001 0 ]xsh
-244.876 474.03 mo
-(gscms_get_link_proof)
-[5.03999 4.563 4.56299 7.44293 4.56302 4.923 5.04001 5.04001 2.51999 4.923 2.04297 2.04297 
-5.04001 4.56302 4.923 5.04001 2.99692 5.04001 5.03998 0 ]xsh
-244.876 484.533 mo
-(gscms_release_link)
-[5.03999 4.563 4.56299 7.44293 4.56302 4.923 2.99695 5.03998 2.04297 5.04001 5.04001 4.56299 
-5.04001 4.923 2.04297 2.043 5.04001 0 ]xsh
-244.876 495.036 mo
-(gscms_transform_color_buffer)
-[5.03999 4.563 4.56299 7.44293 4.56302 4.923 2.52002 2.99692 5.04001 5.03998 4.56302 2.51999 
-5.04001 2.99692 7.44293 4.92303 4.56299 5.04001 2.04294 5.04001 2.99695 4.923 5.04001 5.03998 
-2.51999 2.52002 4.92297 0 ]xsh
-244.876 505.836 mo
-(gscms_transform_color)
-[5.03999 4.563 4.56299 7.44293 4.56302 4.923 2.52002 2.99692 5.04001 5.03998 4.56302 2.51999 
-5.04001 2.99692 7.44293 4.92303 4.56299 5.04001 2.04294 5.04001 0 ]xsh
-244.876 516.636 mo
-(gscms_get_name2device_link)
-[5.03999 4.563 4.56299 7.44293 4.56302 4.923 5.04001 5.04001 2.51999 4.923 5.04001 5.04001 
-7.44293 5.03998 5.04001 5.04001 5.03998 4.56299 2.04297 4.43701 5.04001 4.923 2.04297 2.04297 
-5.03998 0 ]xsh
-244.876 527.436 mo
-(gscms_transform_named_color)
-[5.03999 4.563 4.56299 7.44293 4.56302 4.923 2.52002 2.99692 5.04001 5.03998 4.56302 2.51999 
-5.04001 2.99692 7.44293 4.92303 5.03998 5.04001 7.44293 5.04001 5.03998 4.92303 4.56299 5.03998 
-2.04297 5.04001 0 ]xsh
-%ADOBeginSubsetFont: ArialMT Initial
-ct_T42Dict begin
--0.664 -0.324 2 1.004
- 256 array 0 1 255 {1 index exch /.notdef put} for  /ArialMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f3210325d73000000cc000000606376
-7420a11cd7eb0000012c000006546670676dcc79599a000007800000066e
-676c796607022dca000094e0000822cc68656164d6144b3e00000df00000
-003668686561123315fe00000e2800000024686d7478f65efffb00000e4c
-000034d46c6f6361361cd72000004320000034d86d617870124c05df0000
-77f8000000206e616d659617a74000007818000011057072657025d64dbf
-0000892000000bbe67646972000000000000000000000000000303880190
-00050008059a05330000011b059a0533000003d1006602120805020b0604
-020202020204e0002affc00078430000000900000000544d432000400020
-fffc05d3fe510133073e01b2400001ffffff0000042605bb000000200004
-05ba001905ba001a05a70019042600180000ffe70000ffe80000ffe7fe69
-ffe805ba0019fe69ffe802ea000000b8000000b80000000000a800ad0169
-00ad00bf00c201f0001800af00b900b400c800170044009c007c00940087
-0006005a00c80089005200520005004400940119ffb4002f00a1000300a1
-00cd00170057007e00ba00160118ffe9007f008503d300870085000d0022
-00410050006f008d014cff75005c00df04830037004c006e00700180ff58
-ff8eff92ffa400a500b903c8fffd000b001a0063006300cdffee05d8ffdc
-002d005c0095009900df019209b500400057008000b9039d0072009a035d
-0401ff67fffa00030021007700cd0004004d00cd01c0022b004c006500e7
-0118017c034305d8ffa3ffb0ffc40003001c005d0068009a00ba01350147
-0221055cff4dffcd0016002d00780080009900b200b600b600b800bd00da
-010c05f0ffa4fff00019002c0049007f00b400ce01c003fefd81fe3f0000
-00050018002900390049006f00be00c700d0012301c1026f050c05320540
-057affd4001400310055005700a700b400e601f7027e027e027f03c60446
-ff42000e0085009100bf00c200c500e1011a012f014f01560229026f029e
-03720008002c00310031006400690089009800c700de012b01b6020c02cf
-03a304ab04fb061dfee0ff0e00060026009b009d00c1010d011801200173
-018201d601e30243025f029b02e2039404a904d20761001c005e006d008d
-00ab00f7011201380151015b0168017c01870191019901cd01d001e80241
-0254026b02ef0368037103bd044204420453047304830586058b06e8fe58
-fec4fed1fef7ff32ff860051007c008100910095009e00b400b900cf00d9
-00d900df00e20105010b010e010e012001210155017b017b017e018d01a2
-01a801a901b401d001d001e201e901f201f501fb020002000206021b0221
-022202220223027202770294029c02cf02cf02d002ec02f903170322032b
-0335033c0359036f037103870390039003b503e1041a04cf04ff05320532
-0596059f05a805ab05c205f0060c0782080008ccfca3fd2afddefe00fe88
-fe96feb2feb4ffe100150019001a001c001f003c005100610061006a0078
-009600a500af00d3010c0118011a012a013e014c0151015f016a01710178
-01820184019a01a501a801a901ae01bc01cd01d701ef0200020d021c0221
-0222022e02350242024f024f025e026502710290029202b402d602fa0307
-030b030f0315032a0347035d036503740379039603b003cc03dd03e203f6
-03fc03fc03ff040a041f04220426042b0447045f0475049e04e704e7055c
-05cb05e5060a066d068606b806f10736073e07500751075d078f07b607d4
-086000b600c300b500b700000000000000000000000001e00381034503b5
-008e0233041902ce02ce002d005f0064034d023f000002a80188027d01b4
-02240578063b023b014e00f00426029402c6029f02f6023b034d014b0153
-006a0231000000000000061404aa0000003c04c300ed04bc026502ce03b5
-0078060c017e02ef060c00b201000239000001c50330042b03cb00da03df
-010704a100db040a011701ed02a70350010b01bd043e05580021039c00ae
-0371017d00b5024500000afb088c012b014e01aa00870054013201f803ff
-0003024e00b4003703e30083006b02d800ed00770088009701640467008e
-0033017c00e700a6029e0329056e062a061501c90269048a021301b40002
-04a9000002390124010305140084015d039a06ef02d9007500cf040a00de
-03ac04bc02cf02ae034d04f005520168006d007d00860071ff8100790558
-04d2016700030156002504e00094007c033204210094007f0072005c002f
-00b6001800ba00b80041034d00720018001f004c016a01550099009a009a
-009800b200040078006900140057006e00ce00b4065402b80067050e0165
-00e7000004cbfe52005affa60099ff67006eff92002dffd40087ff7c00b8
-00a800e5008f00a80185fe7b0070001e00d900de014c054602cf0546ff2d
-028a02d90253029600b700000000000000000000000000000125011800ea
-00ea00ae0000003e05bb008a04d70053003fff8cffd50015002800220099
-0062004a00e4006d00ee00e5004803c00033fe4e02b1ff460370007905df
-0051ffa7ff1f010a0068ff6c004f00bc00a507050061072b00ed04b001d2
-00b6007b00650252ff740365fe690094008f005c00400086007500890089
-4043555441403f3e3d3c3b3a3938373534333231302f2e2d2c2b2a292827
-262524232221201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09
-0807060504030201002c4523466020b02660b004262348482d2c45234623
-6120b02661b004262348482d2c45234660b0206120b04660b00426234848
-2d2c4523462361b0206020b02661b02061b004262348482d2c45234660b0
-406120b06660b004262348482d2c4523462361b0406020b02661b04061b0
-04262348482d2c0110203c003c2d2c20452320b0cd442320b8015a515823
-20b08d44235920b0ed51582320b04d44235920b09051582320b00d442359
-21212d2c20204518684420b001602045b04676688a4560442d2c01b10b0a
-432343650a2d2c00b10a0b4323430b2d2c00b0172370b101173e01b01723
-70b10217453ab10200080d2d2c45b01a234445b01923442d2c2045b00325
-456164b050515845441b2121592d2cb00143632362b0002342b00f2b2d2c
-2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b1
-2cc08a8cb8100062602b0c642364615c58b00361592d2c45b0112bb01723
-44b0177ae4182d2c45b0112bb01723442d2cb01243588745b0112bb01723
-44b0177ae41b038a45186920b01723448a8a8720b0a05158b0112bb01723
-44b0177ae41b21b0177ae45959182d2c2d2cb0022546608a46b040618c48
-2d2c4b53205c58b002855958b00185592d2c20b0032545b019234445b01a
-23444565234520b00325606a20b009234223688a6a606120b01a8ab00052
-7921b21a1a40b9ffe0001a45208a54582321b03f1b235961441cb114008a
-5279b31940201945208a54582321b03f1b235961442d2cb110114323430b
-2d2cb10e0f4323430b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2c
-b10e0f432343650b2d2cb11011432343650b2d2c4b525845441b2121592d
-2c0120b003252349b04060b0206320b000525823b002253823b002256538
-008a63381b212121212159012d2c4bb06451584569b00943608a103a1b21
-2121592d2c01b005251023208af500b0016023edec2d2c01b00525102320
-8af500b0016123edec2d2c01b0062510f500edec2d2c20b001600110203c
-003c2d2c20b001610110203c003c2d2cb02b2bb02a2a2d2c00b00743b006
-430b2d2c3eb02a2a2d2c352d2c76b8022323701020b802234520b0005058
-b00161593a2f182d2c21210c6423648bb84000622d2c21b08051580c6423
-648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb815
-55621bb200802f2b59b002602d2c0c6423648bb84000626023212d2cb400
-0100000015b00826b00826b00826b008260f10161345683ab001162d2cb4
-000100000015b00826b00826b00826b008260f1016134568653ab001162d
-2c4b53234b515a5820458a60441b2121592d2c4b545820458a60441b2121
-592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb01343
-58031b02592d2cb0134358021b03592d2c4b54b012435c5a58381b212159
-2d2cb012435c580cb00425b00425060c6423646164b807085158b00425b0
-0425012046b01060482046b0106048590a21211b2121592d2cb012435c58
-0cb00425b00425060c6423646164b807085158b00425b00425012046b8ff
-f060482046b8fff06048590a21211b2121592d2c4b53234b515a58b03a2b
-1b2121592d2c4b53234b515a58b03b2b1b2121592d2c4b53234b515ab012
-435c5a58381b2121592d2c0c8a034b54b00426024b545a8a8a0ab012435c
-5a58381b2121592d2c4b5258b00425b0042549b00425b00425496120b000
-5458212043b0005558b00325b00325b8ffc038b8ffc038591bb040545820
-43b0005458b00225b8ffc038591b2043b0005458b00325b00325b8ffc038
-b8ffc0381bb00325b8ffc03859595959212121212d2c462346608a8a4623
-20468a608a61b8ff8062232010238ab902c202c28a70456020b0005058b0
-0161b8ffba8b1bb0468c59b0106068013a2d2cb1020042b123018851b140
-0188535a58b910000020885458b202010243604259b12401885158b92000
-0040885458b2020202436042b12401885458b2022002436042004b014b52
-58b2020802436042591bb940000080885458b202040243604259b9400000
-8063b80100885458b202080243604259b94000010063b80200885458b202
-100243604259b94000020063b80400885458b20240024360425959595959
-2d2cb0024354584b53234b515a58381b2121591b21212121592d00000001
-00000005028fa58dc35f5f0f3cf5081b080000000000a2e3272a00000000
-c14fd713faaffd671000080c00000009000100010000000000010000073e
-fe4e00431000faaffa7a1000000100000000000000000000000000000d35
-06000100000000000239000002390000023900b002d7005e047300150473
-0049071d0077055600580187005a02aa007c02aa007c031d004004ac0072
-023900aa02aa0041023900ba0239000004730055047300df0473003c0473
-00560473001a047300550473004d047300610473005304730055023900b9
-023900aa04ac007004ac007204ac00700473005a081f006f0556fffd0556
-009605c7006605c7009e055600a204e300a80639006d05c700a4023900bf
-04000037055600960473009606aa009805c7009c063900630556009e0639
-005805c700a10556005c04e3003005c700a105560009078d001905560009
-0556000604e300290239008b023900000239002703c100360473ffe102aa
-00590473004a0473008604000050047300460473004b0239001304730042
-0473008701c7008801c7ffa20400008801c7008306aa0087047300870473
-0044047300870473004802aa00850400003f02390024047300830400001a
-05c700060400000f040000210400002802ac0039021400bc02ac002f04ac
-00570556fffd0556fffd05c70068055600a205c7009c0639006305c700a1
-0473004a0473004a0473004a0473004a0473004a0473004a040000500473
-004b0473004b0473004b0473004b023900bd023900230239ffe502390009
-047300870473004404730044047300440473004404730044047300830473
-0083047300830473008304730049033300800473006b0473001b04730051
-02cd006d044c000104e3009905e5000305e50003080000e102aa00de02aa
-003d0464004e080000010639005305b4009a0464004e0464004d0464004d
-0473fffd049c00a003f4003805b4007a069600a1046400000231000002f6
-002f02ec002d0625007f071d004404e3008104e3009e02aa00e804ac0072
-046400540473002e0464003304e5001a047300860473008c080000ef0556
-fffd0556fffd0639006308000081078d00520473fffc0800000002aa0053
-02aa004701c7008001c7006c0464004e03f4002f04000021055600060156
-fe390473ffe402aa005c02aa005c040000170400001704730049023900b9
-01c7006c02aa0047080000250556fffd055600a20556fffd055600a20556
-00a20239008d0239ffe00239000402390015063900630639006306390063
-05c700a105c700a105c700a1023900c602aa001902aa000602aa001d02aa
-002e02aa00e502aa00a202aa006b02aa003a02aa004b02aa002804730000
-01c700030556005c0400003f04e3002904000028021400bc05c7fffd0473
-004905560006040000210556009e0473008704ac007204ac00a102aa006b
-02aa001902aa002106ac006b06ac006b06ac0021047300000639006d0473
-0042023900b10556005c0400003f05c700660400005005c7006604000050
-04730046046bffe102aa00ee0556fffd0473004a0556fffd0473004a05c7
-009e04eb004705c7fffd055600a20473004b055600a20473004b04730096
-01c7004204730096025500880473009a02ac008305c7009c0473008705c7
-009c04730087063900630473004405c700a102aa008505c700a102aa003c
-0556005c0400003f04e300300239002404e300300300002305c700a10473
-008305c700a10473008304e300290400002804e3002904000028046800a4
-063900600662005504a00048047400480391006204f000440329002e0530
-0048046bffe1040000b002eb005208c000330800004f040000990800004f
-040000990800004f040000980400009807d5016a05c0009e04ab007204d5
-009d04ac007104d5022204d5010505abffe9050001c905ab027e05abffe9
-05ab027e05abffe905ab027e05abffe905abffe905abffe905abffe905ab
-ffe905ab01c005ab027e05ab01c005ab01c005abffe905abffe905abffe9
-05ab027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab
-01c005ab01c005abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905abffe905abffe905ab02d605ab006605abffea05d5ffff04d50092
-0800000007eb013007eb012007eb013007eb012004d500b204d5008004d5
-002a082b0198086b01b807550010060000f40600006f0440003a05400037
-04c0003f04150040040000250600005505e100bf038d008904d5ffd90180
-008002d50086071500610296000f04d5009202d6008302d6008304d500b2
-02d600700556fffd0473004a05c700660400005005c70066040000500556
-00a20473004b055600a20473004b055600a20473004b0639006d04730042
-0639006d047300420639006d0473004205c700a40473008705c7001f0473
-00060239ffce0239ffce0239ffe40239ffe40239fff60239fff50239004b
-01c700190400003701c7ffa20556009604000088040000860473009601c7
-fffa05c7009c0473008705c900a50473008b063900630473004406390063
-0473004405c700a102aa006b0556005c0400003f04e300300239000c05c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-078d001905c70006055600060400002101c700890556fffd0473004a0800
-0001071d00440639005304e30081023900b9078d001905c70006078d0019
-05c70006078d001905c70006055600060400002101c7008a02aaffe10473
-001b04cd005a06ac006b06ac002206ac002206ac004a02aa00e202aa006b
-02aa00de02aaffea0557ffff0646ffa706b4ffa80312ffa80632ffa706d8
-ffa70605ffa701c7ff780556fffd055600960558fffe055600a204e30029
-05c700a4023900bf055600960558000b06aa009805c7009c0533006d0639
-006305c700a40556009e04f2009404e30030055600060556000906af007f
-05fb0061023900040556000604a00048039100620473008b01c7006b0460
-0088049a008c04000019038700480473008b0473005c01c7008904000086
-04000018049c00a00400001a0395005c04730044048d008303db00560460
-00880433001105b4007a063f005701c7ffc9046000880473004804600088
-063f0057055700a206eb0032045500a105c000640556005c023900bf0239
-0004040000370875000d081500a406d5003104a900a10515000a05c000a0
-0556fffd054000a705560096045500a1056b0000055600a20763000704d5
-004e05c000a105c000a104a900a10540001206aa009805c700a406390063
-05c000a00556009e05c7006604e300300515000a061500520556000905eb
-009f05550057075500a1078000a106550000071500a8054000a505c00055
-081500a405c7001a0473004a0495005b0440008802eb008804ab00000473
-004b055afffb03ab003204780087047800870380008604ab00180580008c
-046b00880473004404550088047300870400005003aa0026040000210695
-004b0400000f0495008a042b0045066b008d0695008d0500002805c0008b
-042b008404150030060000890455001f0473004b0473000002eb00890415
-004b0400003f01c700880239000901c7ffa2074000130680008304730000
-0380008604000021046b008803e900a1034a008808000041089500a00585
-002d000001010000001e0000003100000031000001010000007e0000007e
-0000008c0000008c000001010000001000000101000001210310007d0000
-008c023300d20000030b0000ff04023900b9048100690456003203310019
-0411002d04d1009601f9009b030f005f04ca009b04b8008c01f9009b0413
-002803b0005003b4003c04ca009b04cf005001f9009b02d2003c0498005a
-043c00190488006e045f007303b1001903d4000a0466009604130028058e
-00640524002803f2009b03f2009b03f2009b01e3005a0356005a0686009b
-01f9ffac041300280413002803b4ff5703b4ff570448002d058e0064058e
-0064058e0064058e00640481006904810069048100690456003203310019
-0411002d04d10096024b0000034a000004b8008c024b00000413002803b0
-005003b4003c04cf005002d2003c0498005a0488006e045f007303d4000a
-0466009604130028058e00640524002801f9009b0456003203b00050045f
-0073049b003c0000ffdc0000ff250000ffdc0000fe51028d00ab028d00a0
-02da0043034d007901a8ffba000000460000004600000046000000460000
-00480000004600000046000000460435017c0435012e043500b704350081
-0435012c043500be043500af043500810435009a043500db04350085028d
-00c1043500b3060001000600010002420036060001000435009e04350098
-043500cb0600010006000100060001000600010006000100000000460600
-010006000100060001000600010006000100060001000600010006000100
-051bffba06000100060001000600010005b5003a05b5003a01f4ffba01f4
-ffba060001000600010006000100060001000481003604350036043dffba
-043dffba03e9004a03e9004a067f0014077600140327ffba041effba067f
-0014077600140327ffba041effba051b003204b500240300fff706000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010000000030
-0000004600000046000000400000004606000100060001000000ffdc0000
-fe510000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ff160000ff160000ffdc0000ff160000ffdc0000ff200000ffdc0473
-004a08000000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010006000100028d
-007f028d005d0600010004ee0015034d007901a8000e01d6ffdc01a80056
-01d60010037500320375003201a8002d01d60013051b003204b5002401f4
-ffba01f4ffba01a8009301d6001305b5003a05b5003a01f4ffba01f4ffba
-024200000300fff705b5003a05b5003a01f4ffba01f4ffba05b5003a05b5
-003a01f4ffba01f4ffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba02b3
-005f02b3005f02b3005f02b3005f03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba08c9003e08c9003e06c5ffba06c5ffba08c9003e08c9003e06c5ffba
-06c5ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7
-ffba04a7ffba045a002a039a00360435ffba0327ffba045a002a039a0036
-0435ffba0327ffba064f0027064f00270224ffba021affba04a7004604a7
-00460224ffba021affba04cf002d04cf002d0327ffba0327ffba040d0047
-040d004701a8ffba01a8ffba02b4002302b400230327ffba0327ffba0435
-00450435004501f4ffba01f4ffba024200360300fff7039affba0327ffba
-0375003203750032051b003204b50024051b003204b5002401f4ffba01f4
-ffba045a004004ce0049045a002604ce0039045a005304ce004a045a0053
-04ce004a0600010006000100000000460000004606000100060001000600
-010000000046000000460600010006000100000000480000004606000100
-060001000600010000000046000000460000004600000046000000400000
-003006000100000000460000004606000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d00ca028d00c7028d
-00c606000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000100ffba0800ffba1000ffba06dc0063053f004406d5
-00a1055b00830000fddc0000fc2f0000fca60000fe540000fcd70000fd73
-0000fe290000fe0d0000fd110000fc670000fd9d0000fbf50000fc720000
-fed50000fed50000ff02041b00a006ac006b06ac00190000feb60000fd73
-0000fe080000fca60000fe530000fd110000fbc80000faf40000faaf0000
-fc720000fbaa0000fb6a0000fcf10000fc7d0000fbdd0000fcc10000fb98
-0000fdea0000fe840000fdc20000fcf10000fd5f0000fe760000febc0000
-fceb0000fd6c0000fd580000fc900000fd150000fc2c0000fc130000fc12
-0000fb960000fb9601c700880556fffd0473004a0556fffd0473004a0556
-fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473004a
-0556fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473
-004a0556fffd0473004a0556fffd0473004a055600a20473004b055600a2
-0473004b055600a20473004b055600a20473004b055600a20473004b0556
-00a20473004b055600a20473004b055600a20473004b0239006301c7001f
-023900ba01c7007c06390063047300440639006304730044063900630473
-004406390063047300440639006304730044063900630473004406390063
-0473004406dc0063053f004406dc0063053f004406dc0063053f004406dc
-0063053f004406dc0063053f004405c700a10473008305c700a104730083
-06d500a1055b008306d500a1055b008306d500a1055b008306d500a1055b
-008306d500a1055b00830556000604000021055600060400002105560006
-040000210556fffd0473004a0239ffe201c7ffb0063900630473004405c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-05c700a1047300830000fefe0000fefe0000fefe0000fefe0455fffd02eb
-000c07630007055afffb04a900a10380008604a900a10380008605c700a4
-046b00880473fffd040000140473fffd04000014055600090400000f0555
-0057042b0045055500a10473008706050063047300550639006004730044
-05b5003a01f4ffba0224ffba021affba04a7004601f4009e01f4001001f4
-001b01f4001001f4006b01f4fff90227ffce0000000f0000fff502aa00a4
-02aa00a40000000e00000056000000560000ffcf01a8000f01d6ffbf01a8
-fff501d6ffcd01a8001d01d6fff501a8009301d600130375003203750032
-0375003203750032051b003204b5002405b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba
-01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4
-ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a
-01f4ffba01f4ffba0481003604350036043dffba043dffba048100360435
-0036043dffba043dffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba0481
-003604350036043dffba043dffba02b3003202b3003202b3005f02b3005f
-02b3005f02b3005f02b3003202b3003202b3005f02b3005f02b3005f02b3
-005f02b3005f02b3005f02b3003802b3003802b3004902b3004903e9004a
-03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9
-004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba0692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba08c9003e08c9003e06c5ffba06c5ffba04a7ffba04a7ffba045a
-002a039a00360435ffba0327ffba064f0027064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba064f0027064f00270224
-ffba021affba064f0027064f00270224ffba021affba064f0027064f0027
-0224ffba021affba04a7004604a7004604a7004604a70046093e0032093e
-00320740ffba0740ffba067f0014077600140327ffba041effba04cf002d
-04cf002d0327ffba0327ffba04cf002d04cf002d0327ffba0327ffba04cf
-002d04cf002d0327ffba0327ffba067f0014077600140327ffba041effba
-067f0014077600140327ffba041effba067f0014077600140327ffba041e
-ffba067f0014077600140327ffba041effba067f0014077600140327ffba
-041effba040d0047040d004701a8ffba01a8ffba040d0047040d004701a8
-ffba01a8ffba040d0047040d004701a8ffba01a8ffba040d0047040d0047
-01a8ffba01a8ffba043500450435004501f4ffba01f4ffba043500450435
-00450435004504350045043500450435004501f4ffba01f4ffba04350045
-043500450481003604350036043dffba043dffba024200360300fff7031a
-001a031a001a031a001a0375003203750032037500320375003203750032
-037500320375003203750032037500320375003203750032037500320375
-0032037500320375003203750032051bffba04b5ffba051b003204b50024
-01f4ffba01f4ffba0375003203750032051b003204b5002401f4ffba01f4
-ffba051b003204b50024067f0045067f0045067f0045067f004501a80028
-0000fe290000fea20000ff300000ff1d0000ff120000ff920000fe7e08fc
-003208ad00320000ffb50000ffb60000feed0000ff640000fe7e0000ff9f
-018d000002f6fffd0000fe820000ff1004cd00320000ff580000ff580000
-ff640692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba045a002a039a00360435ffba0327ffba034d007902b400230242
-003601f4ffba0290ffba01f4002f01f4003b01f4001201f400b101f4006d
-067f00140776001401f9009b0000fed902bc000003f2009b045afff504ce
-fff5045a005304ce004a045a005304ce004a045a005304ce004a045a0053
-04ce004a045a005304ce004a045a005304ce004a04350071043500ad045a
-000f04ce000f0473001406110014054000a7047300860540000a0473000a
-05c7005105c700660400005005c7fffd067a00140540004a047300460474
-00480556006e04d5005304e3ffc40639006d04fe000f070c008701c70083
-0239001f055600960400008801c7001504000018072000a405c7ffb80473
-008b0639006006f200630557004406090014047300860556009e0556006b
-0400004f04f20094030b00440239002404e300140239002404e3003005fb
-006105c700a1062e00140400002104e300290400002804e3002904e30031
-045c0044045c003f0473003c0473005503ab003203e50024047300870214
-00bc034e00bc04ac0072023900b00aaa009e09c7009e08640046087f0096
-06aa0096039c008309c7009c078e009c062b0087047300550556fffd0473
-004a0000fefe0556fffd0473004a08000001071d00440639006d0473001a
-0639006d0473004205560096040000880639006304730044063900630473
-004404e30029045c004c01c7ffa20aaa009e09c7009e086400460639006d
-04730042084600a404f2009e05c7009c047300870556fffd0473004a0556
-fffd0473004a055600a20473004b055600a20473004b0239ff8a0239ff64
-023900040239fff60639006304730044063900630473004405c700a102aa
-ffcc05c700a102aa006805c700a10473007605c700a1047300830556005c
-0400003f04e3003002390024045c0051037e001305c700a40473008705a6
-00a404d6005e0486005e04e30029040000280556fffd0473004a055600a2
-0473004b06390063047300440000fefd0639006304730044063900630473
-004406390063047300440556000604000021047300570473004804730086
-04730086040000130400005004730046047300460473005505e9005503ab
-004903ab0032050d0032040f00440239ffb9047300420473004204780050
-0402001904ef00190473008b047300870473008701c7001901c7008901c7
-0089029e0000026e001401c700830493008306aa008406aa008406aa0087
-0473ffa60473008b046c00870473004406530044063f00570466004402aa
-ffe402aaffe402aaffe402aa008502aa008502aa008502aaffe40455008a
-0455008a0400003f01c7ffa20214ffb901c7ff7202cb00000239000f0239
-002404730019048c0044046000880400001a05c700060400001804280019
-0400002804540028045c004c045c00790400002404000050040000240400
-00500639006304400088040f004904780050046b0088032e000004000008
-033b008804730048040000240400005007b7004607400046080b004605b3
-0024036f002405c00024061c0013054a0083050f008303e2001e04380063
-03110064031100640146ffce01eb006401eb000001eb000002ea006403d9
-0000029100000187005a02d7005e01c7008001c7006c01c7008a02aa00fb
-02aa00fb02ca003202ca003204ac007004ac007004ac006504ac006502aa
-012102aa00de02aa005902aa012102aa001d02aa005902aa00de023900b6
-023900b602aa00fb02aa00fb02aa00a602aa00a602aa00a602aa001d02aa
-ffe202aafffb029400000142006402b8003202a0000002ca003203100096
-0310009603100096031000960310009602aa006202aa006202aa002802aa
-001d02aa0047045700960457009604570096045700960457004304570043
-045700430457004304570043031000430457002f0457002f0457002f0457
-002f0457002f0310002f0457002504570025045700250457002504570025
-0310002f0457001a0457001a0457001a0457001a0457001a0310001a0457
-004204570042045700420457004204570042031000420457009604570096
-045700960457009604570042045700420457004204570042045700420310
-00420457002f0457002f0457002f0457002f0457002f0310002f0457002f
-0457002f0457002f0457002f0457002f0310002f04570026045700260457
-002604570026045700260310002604570042045700420457004204570042
-045700420310004204570096045700960457009604570096045700420457
-004204570042045700420457004203100042045700260457002604570026
-045700260457002603100026045700230457002304570023045700230457
-0023031000230457002f0457002f0457002f0457002f0457002f0310002f
-0457004b0457004b0457004b0457004b0457004b0310004b045700960457
-009604570096045700960457004204570042045700420457004204570042
-031000420457001a0457001a0457001a0457001a0457001a0310001a0457
-002404570024045700240457002404570024031000240457002f0457002f
-0457002f0457002f0457002f0310002f0457004e0457004e0457004e0457
-004e0457004e0310004e045700960457009604570096045700960000fec1
-0000fec60000fdac0000fed80000ff920000fee90000ff4c0000fea00000
-fec40000ffce0000ff660000fea00000fed80000fed80000ff970000ff98
-0000ff990000fff40000ff420000ff420000ff440000ff5f0000fe870000
-ffec0000ffa60000ff510000ff510000ff510000fec90000ff1c00000000
-0000fee90000ff4c0000ff930000ff2a0000ff560000ffce0000fe870000
-febb0000fec40000fec40000fed80000fed80000feb30000fec90000fdad
-0000fdac0000feb30000fec90000fdad0000fe160000fee60000ffa60000
-fe870000ff440000feba0000ff230000ff9a0000fdac0000fe8800000000
-0000feb00000ff980000fe930000ffa60000fe870000fdac0000ff660000
-ff440000feb00000feb00000feb00000ff030000ff520000fd1f0000ff53
-0000ff530000ff530000feb50000feb50000ffc30000feae0000fedc0000
-fec70000fec80000fedc0000fe1e0000ff420000ff510000feb70000feb0
-02aa00de02aa005902aa00fa049a008c04600088062e001407aa0000062e
-0014047b004c063f005704cf0044063900630473004405c7006604000050
-04e300a8033b008804ff0000043c0032060d000a049d0042072000a406aa
-0084056500630473008b056400a40400000a0556006b0556006b04e00005
-04c5001905e5005f046e004403b600140347002804cf00440495005b0400
-005001c7ffa2063900600389004d03890050055600a205c000a10473004b
-047800870ab4006d04fe00100639001404e70014079900bf05b500880558
-000b0400001a072e00bf0590008806a10078057b007a086d00bf06f00088
-04d5006603ab001f065f0039058200480639006004730044066d0009050c
-001a066d0009050c001a0b010063091c004406aa005c04e600440987006d
-06d000500000fe370ab4006d04fe001005c7006604000050040700140000
-fea60000febc0000feaa0000fead0000fc2b0000fc4c05c000a104780087
-05400004042b00140556009e04730087055d00a40464008804d5004e03ab
-003204a900040380000005ef002904490028070900a4052f0088091800a0
-06f6008806060066042b005005c700660400005004e3003003aa00260767
-00310587002605550057042b004506e4000a0554000a06e4000a0554000a
-023900bf07630007055afffb055700a1046800860540001204ab001805c7
-00a4046b008805c700a4046b008805550057042b004506aa00980580008c
-02aa002e0556fffd0473004a0556fffd0473004a08000001071d00440556
-00a20473004b060500630473005507630007055afffb04d5004e03ab0032
-04d5004e045c004c05c000a10478008705c000a104780087063900630473
-0044063900600473004405c0004a0415002b0515000a040000210515000a
-040000210515000a0400002105550057042b0045071500a805c0008b0540
-004a0473004607bf004a0703004607a6006606860053054d006604130053
-07c3001207470018084600a4070700880639006d0478005005f900300553
-00260000ff430000fec90000ff770000ffb00000ff470000ff560000ff74
-0000fed70000feac000000000000ff520000ff56000000000000feac0000
-fd9a000000000000ff6a0000ff7c0000ff690000ff560000feac0000ff7f
-0000ff560000fdef0000ff430000ff690000ff7c000000000000fdae0000
-ff8c000001020000fefe0000fefe0000fedf0000fedf0000ff580000ff20
-0000fefe0556fffd0473004a055600960473008605560096047300860556
-00960473008605c700660400005005c7009e0473004605c7009e04730046
-05c7009e0473004605c7009e0473004605c7009e04730046055600a20473
-004b055600a20473004b055600a20473004b055600a20473004b055600a2
-0473004b04e300a8023900130639006d0473004205c700a40473008705c7
-00a40473008705c700a40473008705c700930473006805c700a404730087
-0239ffdf01c7ff9202390020023900060556009604000088055600960400
-008805560096040000880473009601c7007e0473009601c7ffb904730096
-01c7ffa50473009601c7ffa306aa009806aa008706aa009806aa008706aa
-009806aa008705c7009c0473008705c7009c0473008705c7009c04730087
-05c7009c0473008706390063047300440639006304730044063900630473
-004406390063047300440556009e047300870556009e0473008705c700a1
-02aa008505c700a102aa008505c700a102aa005e05c700a102aa00260556
-005c0400003f0556005c0400003f0556005c0400003f0556005c0400003f
-0556005c0400003f04e300300239002404e300300239002404e300300239
-ffff04e300300239000e05c700a10473008305c700a10473008305c700a1
-0473008305c700a10473008305c700a104730083055600090400001a0556
-00090400001a078d001905c70006078d001905c70006055600090400000f
-055600090400000f055600060400002104e300290400002804e300290400
-002804e3002904000028047300870239000305c70006040000210473004a
-01c7008904a0004804a0004804a0004804a0004804a0004804a0004804a0
-004804a000480556fffd0556fffd06820013068200130682001306820013
-068200560682005603910062039100620391006203910062039100620391
-0062061e0000061e0000076c0000076c0000076c0000076c00000473008b
-0473008b0473008b0473008b0473008b0473008b0473008b0473008b068f
-0000068f0000081f0000081f0000081f0000081f0000081ffff3081ffff3
-01c7008101c7008101c7ff9b01c7ff9b01c7ffeb01c7ffeb01c7ffa201c7
-ffa20301000003010000049100000491000004910000049100000491fff3
-0491fff3047300440473004404730044047300440473004404730044069d
-0000069d0000082d0000082d000007c9000007c900000460008804600088
-0460008804600088046000880460008804600088046000880682000007ae
-00000812000007ae0006063f0057063f0057063f0057063f0057063f0057
-063f0057063f0057063f0057065f0000065f000007ef000007ef0000078b
-0000078b0000078bffff078bffff04a0004804a000480391006203910062
-0473008b0473008b01c7ffe601c700680473004404730044046000880460
-0088063f0057063f005704a0004804a0004804a0004804a0004804a00048
-04a0004804a0004804a000480556fffd0556fffd06820013068200130682
-00130682001306820056068200560473008b0473008b0473008b0473008b
-0473008b0473008b0473008b0473008b068f0000068f0000081f0000081f
-0000081f0000081f0000081ffff3081ffff3063f0057063f0057063f0057
-063f0057063f0057063f0057063f0057063f0057065f0000065f000007ef
-000007ef0000078b0000078b0000078bffff078bffff04a0004804a00048
-04a0004804a0004804a0004804a0004804a000480556fffd0556fffd0556
-fffd0556fffd0556fffd02aa00e502aa00fd02aa00e502aa000602aa0006
-0473008b0473008b0473008b0473008b0473008b068200000682000006f3
-000006f3000005c700a402aa001302aa001302aa000601c7ffbb01c7ffab
-01c7ffca01c7ffca01c7ff9301c7ff930239001a0239fff5036500000365
-000002aa001302aa001302aa000604600088046000880460008804600088
-048d0083048d00830460008804600088055600060556000606e600000718
-0000061e000002aaffea02aaffea02aa0059063f0057063f0057063f0057
-063f0057063f005707650000069d000007270000065f000005fb006102aa
-00de02aa00e50473000d05c7006605c7006606aa008705c70024095000a1
-078d00190556001f04e30030080000290400003004c100660000ff530000
-ff530000ff530000ff5301c7001901c7ffa2042b00050556001105740046
-02cbffa3057a008702f0ffc8057f000a057f000a02aa008402aa008402aa
-00c902aa00c902aa00a002aa005902aaffaf02aa003a02aa0006023900b9
-02aa00a902aa00a902aa00a902aa00a9032e001e032e001e02aa003a0000
-ff730000ffa50000fed80000ff230000ff720000ff720000fee70000ffa5
-0000ff530000ff530000ff530556009e0473008703f8001905fb0019071d
-00440440001904000050046900870469001903eb008703ab003201c70088
-0361004104000088033600100580008c04780087047300440400001304de
-004404de004404de000d078d005003a800440473004404730044042b0084
-0455001f0455001f03aa00260460008804c6004405de004404c600440400
-001a05c700060400002803ab0032036b003f04db001f02eb00880400001a
-04550088042b008405b4007a04ab001803a00000054f0000035100320351
-ffd103980032034800320348003203f80032036e0032015600690284002d
-0366003202d000320415003203710032036f003204180032030f00320359
-0032039c003203760031036f003204fb000002fa003202fa003203040032
-04cc0032030500640305003202f9003202f90032028c0032028c00320304
-00320142006402b6006404950064030f00640305003202d5003203050032
-030500320306006401c20032030f00640342003204950064029200000320
-00000315006402920000030600320385003202bf00000142006401eb0064
-030f0064029200000315006402920000030900320385003202bf000005ed
-00460a660046061300460689ffba0541ffba01e9003c045a00110000ff0d
-0000ff350000fece0000feb70000fec90000ffcf0000ff4f0000ff9e0000
-feca02b3005f02b3005f03e9004a03e9004a039affba0327ffba039affba
-0327ffba05ad0069053d002d05fd009604dc005004e0003c05f6009b053f
-00280650002804ac00720000fe3b0000fe660000fe660473fffc02aa0053
-02d5ffce01a8ffba01a8ffba01a8ffba01a8ffba0658001509c500470400
-000008000000040000000800000002ab0000020000000155000004730000
-02390000019a000000ab00000000000005e5000305c7006606aa00980580
-008c0744008307180046071800480556fffd05c70066040000140473000a
-04e300300400004f0400002804a5001d000001020000ff420000febf0000
-ff3a0000ff53048d000a05c7005105c7006605c70051045500a102eb0088
-0000ff430000ff040000ffac02d200960000ff37021affba0250001e0000
-ff3a0000ff5b0000ff5f0000ff7e0000ff940000ff4a0000fe9c05b5003a
-05b5003a01f4ff9601f4ff9605b5003a05b5003a01f4ffba01f4ffba05b5
-003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba
-05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba0481003604350036043dffba
-043dffba0481003604350036043dffba043dffba02b3003202b3003202b3
-005f02b3005f03e9004a03e9004a0692003e0692003e043fffba043fffba
-045a002a039a00360435ffba0327ffba045a002a039a00360435ffba0327
-ffba045a002a039a00360435ffba0327ffba064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba067f0014077600140327
-ffba041effba067f0014077600140327ffba041effba067f001407760014
-0327ffba041effba02b4002302b400230327ffba0327ffba02b4002302b4
-00230327ffba0327ffba043500450435004501f4ffba01f4ffba04350045
-0435004501f4ffba01f4ffba043500450435004501f4ffba01f4ffba040d
-0047040d004701a8ffba01a8ffba03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0473ff93047300460239ffbf06aa
-ffd50473ffb70473ff9102aaffa402aaffa40400ffff0239ffb904000028
-04730089030b0064047400480649002401c7001901c700190473001e0460
-001e048c000a04730086047300460239001305b400420400008801c7fffc
-06aa00870473008b0473008702aafffb0400003f0318ffa20400001a0400
-000f040000280473004a04730048047300460473004b03ab004903ab0032
-0534005501c700880400001301c7ffa204730083045c004c0304006402d5
-003202c9003302fc0032028c003201d5003201d500000304003203110064
-01420019014200640142006401420019022a000001420064014200090233
-00640493006404930064030fffc9030f0064030e00640305003203000032
-02b800320142ffca01c20032030f001d031a00320306006402d400640292
-000002de003202de003202de003202f4003202ea00320000febc0000febc
-0000ff730000fea9023900b902fa003202f900320305003202a0000002f9
-00320639006d0556fffd0473000f05c7006602aa004104a0004804a00048
-04a0004804a0004804a0004804a0004804a0004804a0004801c7ff9b01c7
-ffab01c7ff9b01c7ffab01c7ff9b01c7ffbb01c7ff9b01c7ffbb04600088
-0460008804600088046000880460008804600088046000880460008801c7
-ffab01c7ffab01c7ffbb01c7ffbb04600088046000880460008804600088
-045a005304ce004a03a000130556001105c700290558000b055600a20473
-004b0400003301c7ffa205e600630473004805c7000002aa000f05560006
-0400002104000013040000500400001301c700830455fffd02eb00010556
-00090400000f055600090400000f04d5005303ab00490540001204ab0018
-0000fec60000fed40000fec60000fed40000fe5f0000fe5f0000ff720000
-ff730000fee7078b000a03eb004c040000130473000a01c700150473fff4
-0556001105c700a1047300190239ff8b05c700a404730087055600960400
-008804e30029040000280400003b049e00a403670088053000480000ff53
-0000ffbc0000fefe0000fefe0000fea40000fea401c70088000000000000
-002a0000002a0000002a0000002a000000d60000017e00000320000005a6
-0000074e000009380000097e000009fe00000aa400000b8400000bec0000
-0c6400000caa00000ce600000d5600000f1200000fee00001218000013f2
-000015520000170c000018e20000198e00001c2200001e5600001eb20000
-1f7000001ff200002062000020e8000021da000023da000025840000271c
-000028560000299e00002a6200002b1800002ca800002dae00002e920000
-2f7a000031b00000323a000035640000370e000038420000394800003b3c
-00003da800004052000041000000422400004398000045d6000048e20000
-4a8800004bc800004c3200004c9c00004d0000004d8800004dbc00004e38
-0000510a000052e80000549c000056500000580e0000596200005b520000
-5cf600005dea00005f020000619a00006296000064c60000668c0000684e
-00006a1200006ba800006cae000070560000717a00007318000075360000
-79a000007bc400007e1c00008004000081020000814e00008250000082f0
-0000833c00008370000083ac000083ee000084540000849a000084ce0000
-85040000853a0000858a000085cc0000861e00008656000086a8000086de
-0000871e000087600000879e000087e800008828000088560000888e0000
-88de00008914000089540000898e000089d200008a1c00008a5800008a88
-00008acc00008b0400008b9400008c1a00008e2800008fbc0000916c0000
-91b80000924c00009470000096c4000098b4000099a000009a2200009a8c
-00009baa00009d0600009f4e0000a0b00000a13e0000a1e80000a2ac0000
-a3f40000a59e0000a68c0000a7520000a7b60000a8240000a94e0000aa72
-0000ab020000ace40000af3e0000b2900000b3860000b42c0000b47c0000
-b5320000b6520000b7f00000b88a0000b94e0000ba0e0000ba760000bab2
-0000bb0a0000bb580000bd700000bfb60000bfee0000c0200000c14a0000
-c2760000c3240000c3c80000c46a0000c53c0000c5900000c5c60000c61e
-0000c7700000c7e20000c83c0000c9b40000cb200000cc000000cc320000
-ccce0000cdf20000d0680000d0a20000d0e60000d1220000d1840000d1c6
-0000d20c0000d2580000d28a0000d2de0000d31c0000d34c0000d38a0000
-d3d00000d4120000d4500000d4d20000d5400000d6260000d6620000d6e2
-0000d7160000d7b80000d8400000d8ac0000d90e0000d97a0000da660000
-db580000db8c0000dbc00000dbf00000dc340000dcac0000de260000e040
-0000e0720000e0ac0000e1a60000e3340000e36a0000e4ce0000e54a0000
-e62a0000e7200000e8b00000ea1a0000ec080000ed040000ed4a0000ed7e
-0000edc00000edfa0000ee4e0000ee960000eee00000ef100000ef400000
-f1280000f1660000f18e0000f1be0000f1f20000f2180000f23e0000f286
-0000f43c0000f5b60000f5dc0000f6020000f6460000f6760000f6a60000
-f6fc0000f7da0000f8ec0000f9300000f9660000f9c00000f9fe0000fa32
-0000fa620000fa9e0000fade0000fb1c0000fb580000fb9a0000fbd00000
-fc0c0000fc4c0000fc720000fc960000fce60000fe420000fe980000fecc
-0000ff1a0000ff660000ffa80000ffe0000100160001005e000101000001
-029c00010464000105e6000107d80001092a00010aae00010b9000010d2a
-00010d9400010dbc00010e5a000110dc0001111c0001115c0001119c0001
-11da000112380001129600011304000113240001140e000114ae000114e4
-000115320001157c000115c6000115e2000115fe0001161e0001163e0001
-165e0001167e000116a4000116ca000116f000011716000117460001176e
-00011796000117c2000117ee000118220001184c00011878000118ae0001
-18d8000119040001193a000119640001198e000119c2000119f200011a26
-00011a6a00011a9a00011ace00011b1000011b4400011b7600011bb80001
-1bec00011c1c00011c5e00011ca200011ce800011d4400011d6000011d7c
-00011d9800011db400011dd000011f3e000121ea0001245a000124760001
-2490000124ac000124c8000124e4000125000001255c0001259600012600
-000126ca0001276a00012840000128c000012948000129b800012a4e0001
-2aac00012af200012b5000012bb200012c6a00012d2800012d5400012db0
-00012df400012f60000130540001307e0001309a000130c6000130fe0001
-314a0001318a000131be000131ee0001321e0001324e00013292000132c2
-000132f2000133320001336200013392000133c200013402000134320001
-346200013492000134b8000136bc000136ec0001371c0001386c00013a22
-00013a5200013a8000013ab000013ade00013b0e00013b3c00013b600001
-3b8400013bb400013d2400013d5c00013d8c00013f1e00013f4c00013f7a
-00013fa800013fd00001412e000142c6000142fe0001433e0001437a0001
-43aa000143d8000143f4000144240001445400014544000146ac000146dc
-000147160001475600014786000147b6000147f80001481e000148440001
-4884000148c4000148f40001493400014a1e00014a9e00014b8200014bb2
-00014be200014c1200014c4200014c7e00014cb000014ce200014d120001
-4d4200014d8800014dba00014dea00014e2000014e9200014ec600015094
-000151960001532600015556000157a6000159380001599c00015a260001
-5a3600015ac400015cc200015dee00015f5a0001604a000161ce000163e8
-000166140001670600016716000167260001683e0001684e0001685e0001
-686e0001687e0001688e000169ac000169bc000169cc00016a4000016a50
-00016b2000016b3000016c4200016c5200016c6200016c7200016dd00001
-6fae00016ff0000170260001705c0001708c000170bc0001711000017138
-000172c20001740a0001755e000176c60001784a000178ae00017a400001
-7b5c00017b6c00017b7c00017d0200017d1200017e7800017fd200018106
-00018264000183d200018598000185d800018610000186460001866c0001
-869c000186c200018838000188680001899e000189ae000189be00018a00
-00018a1000018ba400018d5000018eda00018f0200018f320001908e0001
-909e000191d6000191e600019280000193e0000193f000019656000197e0
-000199480001997800019aee00019c2000019c3000019c4000019c500001
-9d2a00019d3a00019d4a00019d5a00019e5200019fcc00019fdc0001a104
-0001a2380001a38a0001a51e0001a63c0001a7c80001a8da0001a9100001
-ab460001abe60001abf60001ad8c0001af2e0001afb20001b1340001b144
-0001b3ac0001b52c0001b6ac0001b6dc0001b87c0001ba020001bbc60001
-bcf20001bd020001be320001be420001be520001bf120001bf220001c108
-0001c1180001c24e0001c35c0001c5080001c6be0001c8000001c9700001
-cab80001cb0a0001ccec0001ce680001cea60001d04c0001d0700001d1b0
-0001d1c00001d1d00001d2080001d2180001d3a40001d50c0001d6800001
-d6a40001d6d40001d8420001d8f40001d9b20001d9e00001db960001dc8e
-0001dd1c0001de420001def00001dfc40001e00e0001e0860001e1460001
-e16e0001e1b20001e2080001e2e40001e32e0001e3620001e38a0001e3b2
-0001e3e60001e42a0001e46e0001e4ac0001e5ea0001e6a20001e7c20001
-e8380001e9060001e9580001e9ea0001ea9a0001eb8e0001ebe20001ec78
-0001ed360001ee200001eed20001eff20001f0440001f0ee0001f2240001
-f2fc0001f3e20001f4e80001f5ce0001f6b00001f7a40001f8420001f948
-0001fa420001faba0001fb320001fba80001fbde0001fc3a0001fd020001
-fd8e0001fdc60001fe0c0001fe3c0001fea60001ff660001ff9a0001ffca
-0001fffe0002002e0002005e0002008e0002022e00020266000202a60002
-02de00020316000203b2000204ac000204dc00020580000205ae000205ee
-0002063e0002066e000206ba00020852000209b800020b1800020b5e0002
-0bb200020bea00020d5c00020d9200020e2400020e6200020e9000020ece
-00020ffe0002102600021162000211f20002129c0002131e000213da0002
-14f20002160000021634000216ba0002181600021898000218e2000219ec
-00021a3400021b3800021bb400021c0c00021c9000021d7a00021e900002
-1f8c0002203600022126000221f8000222e2000223ca0002247a000224fc
-0002275a00022784000227ae0002286600022890000229d200022ad80002
-2bc200022bec00022c1600022c4000022c6a00022c9400022e1400022e3e
-00022e6800022e9200022ebc00022ee600022f1000022f3a00022f640002
-2f9800022fc200022fec0002301600023190000231a0000232ba000232ca
-000232f40002331e00023348000233720002351c00023738000238660002
-3876000239f200023a0200023b4800023d1400023e1a00023f9a0002413a
-0002435e000244b80002469a000247de0002490c000249fa00024a240002
-4a4e00024a7800024aa200024acc00024af600024b2000024b4a00024b74
-00024b9e00024bc800024bf200024c1c00024c4600024c7000024eac0002
-50280002516c000253540002549c000254c6000254f00002552000025550
-000255a0000255f000025630000256a2000256f600025754000257aa0002
-57e00002582200025868000258b2000258e20002591a0002594a00025a82
-00025dc800025df200025e1c00025e4600025e7000025e9a00025ec40002
-5eee00025f1800025f4200025f6c00025f9600025fc000025fea00026014
-0002603e0002606800026092000260bc000260e6000261100002613a0002
-61640002618e000261b8000261e20002620c0002623600026260000262fe
-000263140002633e0002661e0002662e000267480002686a000269a80002
-6aea00026c9000026ca000026de200026f3200027122000272f60002740e
-0002741e000274a00002752e0002762e0002763e000276de000276ee0002
-78040002795600027a8600027a9600027b6400027b7400027cea00027cfa
-00027e0e00027e1e00027f52000280e8000281a4000281b4000282b20002
-840c00028498000284a8000285d20002875e0002881a0002882a000288c6
-000288d6000289a4000289b400028a8c00028a9c00028ba400028bb40002
-8d7a00028d8a00028ee200028ef20002915c0002916c0002936600029376
-000294e0000294f0000295e0000295f00002978800029798000298b60002
-98c600029a0600029a1600029a2600029a3600029bae00029bbe00029bce
-00029bde00029d3000029e7e00029f4c0002a0300002a1b00002a3320002
-a4320002a5460002a68a0002a69a0002a7880002a8620002a9fe0002aa0e
-0002ab2c0002ac320002ae300002ae400002ae500002ae600002afaa0002
-afba0002b0720002b0820002b1900002b1a00002b28c0002b29c0002b3ba
-0002b3ca0002b4680002b4780002b4880002b5760002b6ea0002b8160002
-b9100002b9200002b9300002b9400002bade0002bc980002bd660002bd76
-0002bfd60002c21c0002c4a20002c7060002c98a0002cbfc0002cdcc0002
-cf820002cfac0002cfd60002cfe60002cff60002d0200002d04a0002d074
-0002d0840002d0940002d0be0002d0e80002d0f80002d1080002d1320002
-d15c0002d1860002d1960002d1a60002d1b60002d1c60002d1d60002d1e6
-0002d2100002d2200002d2300002d25a0002d2840002d2ae0002d2d80002
-d3020002d32c0002d3560002d3800002d3aa0002d3d40002d3fe0002d428
-0002d4520002d47c0002d4a60002d4d00002d4fa0002d5240002d54e0002
-d5780002d5a20002d5cc0002d5f60002d6200002d64a0002d6740002d69e
-0002d6c80002d6f20002d71c0002d7460002d7700002d79a0002d7c40002
-d7ee0002d8180002d8420002d86c0002d8960002d8c00002d8ea0002d914
-0002d93e0002d9680002d9920002d9bc0002d9e60002da100002da3a0002
-da640002da8e0002dab80002dae20002db0c0002dbac0002dbf00002dc66
-0002dc900002dcba0002dce40002dd0e0002dd380002dd620002dd8c0002
-ddb60002dde00002de0a0002de340002de5e0002de880002deb20002dedc
-0002df060002df300002df5a0002df840002dfae0002dfd80002e0020002
-e02c0002e0560002e08a0002e0be0002e0f20002e2840002e4200002e5bc
-0002e7480002e78e0002e7d40002e8420002e89e0002e8f00002e9600002
-ea380002eb040002ebdc0002eca80002ed480002ee620002ef160002ef98
-0002eff20002f0320002f1500002f29a0002f4320002f48e0002f4ec0002
-f5480002f5a40002f6580002f70e0002f7ba0002f8660002f9120002f9ca
-0002fa820002fb3a0002fb4c0002fb5e0002fb700002fb820002fb940002
-fc020002fc700002fd280002fd3a0002fd4c0002fd5e0002fd6e0002fd80
-0002fd920002fda40002fdb60002fdc80002fdda0002fe880002ff340002
-ffe20003008e00030126000301600003018a000301b4000302080003025a
-000302d6000303200003039c000303f000030474000304c60003053c0003
-0594000305fa00030650000306aa0003072800030774000307d200030836
-00030884000308d20003092a000309720003099c000309ca000309f00003
-0a2400030a5400030a8400030ad600030b4400030b9a00030c0e00030c62
-00030cd600030d1c00030d8400030dca00030e2600030e5600030e900003
-0eb600030ee600030f0c00030f3200030f6400030f9400030fe60003104c
-000310a2000311080003115c000311ca0003120c0003126c000312ae0003
-12fa0003133400031370000313aa000313e60003141a0003144c0003147c
-000314ac000314d6000314fc00031526000315540003157e000315ca0003
-160e0003164400031680000316b4000316e200031720000317500003178a
-000317b4000317e2000318080003182e0003185a000318b6000318e60003
-1916000319460003197e000319b2000319e000031a1000031a4000031a70
-00031aa000031ad400031b2a00031b5e00031bbe00031bf200031c4a0003
-1c7e00031cda00031d7800031e4600031f660003202e000320be00032154
-000323400003253c000326b400032830000329da00032b8c00032c740003
-2daa00032ea200032fb4000330d20003320800033372000334e000033676
-000337f2000339020003391200033a3e00033b7a00033cbc00033e400003
-3f1a00033f9000034046000340ec0003425c000342940003430e000343d0
-0003448a000344f2000345f80003472e000347fa00034958000349d20003
-4a4c00034b1800034bd200034c8600034ce200034d3c00034d8400034df4
-00034e7000034eba00034ef400034f3a00034f7e00034fd0000350220003
-50a40003512600035168000351a8000351de000352140003524200035270
-000352a4000352d80003531a0003535c00035398000353d40003540e0003
-54480003547a000354ac000354de000355100003554a00035584000355c6
-000356080003564a0003568c000356da000357280003576a000357ac0003
-57ec0003582c00035866000358a0000358ec0003593800035976000359b6
-000359fc00035a4200035a7e00035ad400035b1000035b4c00035b8c0003
-5bcc00035c0800035c4400035c8400035cc400035d0800035d4c00035da0
-00035e2e00035e7000035eb200035f1a00035f8200035fb400035fe60003
-601e00036056000360ec00036182000361cc00036216000362520003628e
-000362e40003633a00036384000363ce000364260003647e000364be0003
-64fe000365360003656e000365b800036602000366400003667e000366c0
-0003670200036756000367aa000367f0000368360003687c000368c20003
-69180003696e000369c400036a1a00036a6600036ab200036afe00036b4a
-00036bbe00036c3200036ca600036d1a00036d5800036d9600036dd40003
-6e1200036e5000036e8e00036ed200036f1600036f6200036fae0003700e
-0003705a00037098000370e6000371f60003724600037296000372ce0003
-73060003735c000373b2000374260003748a000374cc0003750e00037564
-000375b2000375fe0003764a0003768a000376ca000377120003775a0003
-77c6000378200003785800037890000378d000037910000379e000037adc
-00037b9c00037c8a00037ce000037d3600037d8800037ddc00037e400003
-7ea400037efa00037f5000037fc60003803c0003807e000380c000038102
-0003814400038186000381c80003821e00038274000382c60003831a0003
-83a200038424000384c400038566000385a4000385e2000386200003865c
-0003869a000386d80003871600038752000388360003892200038a380003
-8b5400038c1e00038ce800038de200038edc00038fda000390d8000391f6
-000393140003943a000395600003966200039764000397f6000398880003
-98c6000399040003995e000399b8000399f000039a2800039b3800039b48
-00039b9000039bd800039c3000039c8800039cba00039cec00039d2e0003
-9d7000039daa00039de400039e2800039e6c00039ee400039f5e00039fee
-0003a0320003a0720003a0f40003a1760003a2ce0003a2de0003a32c0003
-a37a0003a3b60003a3f20003a4380003a47e0003a4cc0003a51a0003a56a
-0003a5ba0003a6160003a6720003a7e80003a9500003a9880003a9c20003
-aa0e0003aa5a0003aaac0003aafe0003ab500003aba60003abe20003ac1e
-0003ac740003acc80003ae000003aea00003aeee0003af2e0003af680003
-b0fe0003b3820003b4460003b5dc0003b73a0003b8080003b9ae0003bc02
-0003be3a0003be800003beb20003bf5c0003c0800003c0a40003c13e0003
-c24a0003c35a0003c46a0003c5780003c6fe0003c7300003c7d20003c7fa
-0003c85c0003c8be0003c9200003c9820003c9c00003c9fe0003ca380003
-ca720003ca9e0003caea0003cb240003cb5e0003ccba0003ce0e0003ce1e
-0003cedc0003d0120003d0700003d1880003d3160003d3bc0003d5020003
-d5400003d57e0003d5bc0003d6100003d6380003d6920003d6f60003d73e
-0003d7a00003d8000003d8720003d8ee0003d96a0003d9ec0003da780003
-db040003db8e0003dc0e0003dc480003dc840003dde80003deb20003dee2
-0003df120003e04a0003e19a0003e1aa0003e2980003e36c0003e4640003
-e55a0003e6dc0003e8360003e8460003e95e0003ea0a0003eb4c0003eca2
-0003ecfe0003ee5c0003eeea0003f0900003f2020003f3160003f34e0003
-f3b20003f5620003f6cc0003f72e0003f8960003f99c0003fa520003fafe
-0003fc260003fd140003fdf40003ff34000400600004017a000402ea0004
-046400040474000405540004064a000406fa000407f6000408a2000409ac
-00040a9800040bc200040ce600040dea00040f1800041056000411c20004
-12f80004148c000416340004172c000418400004197200041a6400041a9c
-00041af200041ba000041bb000041c1200041c6e00041cd400041d200004
-1d6000041d9800041dc400041df200041e2c00041f6200041f960004201a
-000420d00004210000042184000421b4000421ec00042384000425100004
-255a00042594000425ea000426360004265c00042682000426c400042706
-0004274800042778000427b0000427e60004281c0004285e0004288e0004
-28be000429b400042ab800042aec00042b2400042b6a00042b9e00042bce
-00042c0600042c3a00042c6e00042c9e00042cce00042d0400042d3a0004
-2d6a00042d9a00042dce00042e0200042e3200042e6200042e9c00042ed0
-00042f0200042f3400042f6800042f9c00042fcc00042ffc0004302a0004
-305800043166000432d2000434060004353a0004356a000435a40004363e
-000437a800043904000439c800043adc00043b0c00043b4000043c380004
-3de800043e4000043eb800043ff400044032000440a4000440d400044104
-0004413e000441c6000441f600044226000443b6000445000004460c0004
-471a000448460004499c00044af800044c5800044d9200044f0400045064
-000450740004522a00045352000453ec0004557400045584000456800004
-58060004595e00045a1000045ae000045bec00045c9600045cce00045cde
-00045d8e00045e3400045eb000046000000460f4000461ea000462f60004
-63ce000464a80004653c0004664e000467de000468fc000469f200046a9c
-00046b4600046c1000046cb800046d8e00046e0a00046e6600046fc80004
-70fc000472980004735a0004745a00047532000476700004771c000477e6
-000478d6000479fc00047ad800047bde00047d1600047e0600047ea40004
-7f960004810600048250000484bc0004858e000486420004871000048804
-000489420004895200048a8600048b9800048ba800048cb400048de40004
-8e3800048fac000490d4000491e80004939a000495ae00049842000499fc
-00049b2800049d0800049eca0004a05c0004a1280004a2c40004a33a0004
-a3e80004a4c40004a5500004a5f20004a6940004a7780004a8b00004ab0c
-0004ac540004ac640004ac740004acd60004ad340004ad960004ae340004
-aecc0004afd00004b0be0004b0ce0004b0de0004b1780004b2120004b24e
-0004b2ca0004b33e0004b3940004b3c80004b44e0004b4da0004b5520004
-b5b00004b64a0004b6dc0004b75c0004b7de0004b8720004b8a60004b908
-0004b9ba0004bb800004bbb80004bd940004bea80004beb80004beee0004
-bf320004bf760004bfba0004bff00004c0220004c0640004c1000004c156
-0004c1fc0004c2740004c2fa0004c36a0004c3cc0004c4520004c4b20004
-c51c0004c5900004c6000004c65e0004c7040004c79c0004c8080004c898
-0004c8f60004c9640004ca0c0004cab80004cb4e0004cbb80004cc3a0004
-cc9e0004cd4a0004ce020004ceae0004cf3c0004cf980004d0040004d05a
-0004d0dc0004d15a0004d1e00004d26c0004d2c60004d3320004d3a20004
-d4120004d4820004d5060004d5960004d5fc0004d6760004d6f20004d76a
-0004d8100004d8ac0004d93c0004d99a0004da380004dab40004db460004
-dbe80004dc920004dd2a0004dd860004dddc0004de440004deea0004df92
-0004e05c0004e1020004e1640004e1bc0004e21c0004e2aa0004e3300004
-e3be0004e41e0004e4820004e4ec0004e5540004e5bc0004e63a0004e6c2
-0004e7560004e7c20004e82a0004e88e0004e9360004e9f00004ea9e0004
-eb2c0004eb8a0004ebf60004ec660004ed0c0004edb60004ee780004ef1a
-0004ef7e0004f00e0004f0800004f1100004f18e0004f20a0004f2760004
-f3040004f3600004f3be0004f4440004f4c00004f5280004f58c0004f5e0
-0004f64e0004f6b60004f7340004f7aa0004f8240004f8a40004f9000004
-f9660004f9ca0004fa6a0004fb0c0004fbc20004fc720004fcce0004fd46
-0004fda40004fe2e0004fec60004ff560004ffbc0005001a000500a80005
-011a000501ae00050246000502b6000503260005039e000503fc0005045c
-000504d60005053000050590000505ea00050646000506ae0005073c0005
-0772000507aa0005083600050860000508a20005093600050a2400050ab4
-00050aea00050b3a00050bac00050c5800050cea00050d4200050d9c0005
-0df400050e4e00050ed200050f5800050ffc000510a4000510e200051152
-000511e60005127e00051314000513be000513f000051440000514940005
-14da0005157e000516080005168e000516ee000517320005178000051820
-000518b000051950000519f600051a9c00051b6000051b9200051bbc0005
-1c4200051cf200051d2400051d4c00051e1a00051e7800051f1200051f60
-00051fc60005206e000520dc00052142000521ce00052240000522b60005
-236a000523c40005243400052470000524c200052548000525a80005264c
-0005272c00052854000529e400052a4000052a9600052dbc00052e560005
-2eb200052efa00053068000531ba000532000005330e000533a6000534b4
-000535be0005366000053748000537da000538760005396800053a680005
-3ae400053b6a00053bb200053d2400053e8000053f6400053fb400053fe8
-000540d6000541fe00054398000544c8000545de000547120005482e0005
-489c0005493000054a7000054b2600054c9000054dc000054ef20005501e
-000550ca0005519000055262000553bc0005553c0005566c000557880005
-594200055a9400055b8000055c5c00055d1e00055e8800055fd800055fe8
-00055ff800056008000560c000056176000561b2000561e8000562200005
-6256000563e2000565f6000566e0000567f80005697000056ade00056bc8
-00056cfa00056e4200056fc800057166000572ba000574a80005766e0005
-78a400057af200057bda00057cb600057dfe00057f800005806800058182
-000581c40005820e0005842a000586420005878e0005890400058b620005
-8d6400058de800058e1800058e6400058f2c00058ffc0005919000059218
-00059280000592c0000592fe000594b0000596e000059816000599f80005
-9ad400059bee00059d9a00059fa60005a0a80005a1940005a3860005a58e
-0005a6fa0005a87e0005a9de0005ab4c0005abda0005ac6a0005ad840005
-ae900005b0520005b1be0005b3ae0005b5780005b60c0005b6a80005b73e
-0005b7c60005b8ac0005b9840005bb1e0005bcb00005bcd60005bcfc0005
-bd0c0005bd3c0005bd6c0005bee60005c0880005c1320005c2140005c2d4
-0005c37e0005c4180005c4fa0005c5b80005c6940005c84a0005c9840005
-ca100005ca400005ca700005caa40005cad80005cae80005caf80005cb28
-0005cb580005cb8c0005cbc00005cbf40005cc280005cc5c0005cc900005
-ce0a0005ce1a0005ce4a0005ce7a0005ceb20005cee60005cf1a0005cf4e
-0005cf820005cfb60005cfea0005d0220005d0580005d0880005d0c80005
-d1000005d1480005d18e0005d1c20005d1f60005d2300005d2680005d308
-0005d3180005d46a0005d6320005d7d80005d9820005dace0005dbe40005
-dcf20005de080005df020005dfea0005e10c0005e2080005e2e00005e3d0
-0005e48c0005e53e0005e6080005e67a0005e7200005e7b00005e8140005
-e9220005e9880005ea360005eb2c0005eb940005ebfc0005ecac0005ee86
-0005ef8a0005f00a0005f0480005f0f40005f1820005f26a0005f3020005
-f3680005f4660005f5280005f5e20005f6200005f6b00005f7b20005f846
-0005f88a0005f9a80005fad20005fcb40005fe760005ffac000600da0006
-01da000602020006022a0006026000060292000602be000602e60006030e
-0006033c0006039a000604080006044000060478000604a8000604ce0006
-0502000605380006055e00060584000605b2000605e00006060c00060682
-000606aa0006070c00060732000607580006077e000607a4000607d40006
-0804000608340006086e0006089e000608d400060904000609360006095c
-00060982000609b6000609ec00060a1c00060a4c00060a7200060a980006
-0abe00060aec00060b2000060ba600060bea00060c2400060c5800060c9c
-00060cd600060d1000060d3600060d6000060dac00060dee00060e140006
-0e4200060e6800060e8e00060ece00060f0000060f3000060f6000060f86
-00060fac00060fdc0006100c00061032000610580006107e000610a40006
-10ca000610f000061118000611a0000611ca0006123e00061266000612dc
-000613040006136600061398000613ca000613fa00061432000614640006
-1492000614cc000614f40006155400061596000615c6000615f200061622
-000616520006167a000616a2000616ca0006172c00061754000617b20006
-17f60006183a0006186a000618a0000618c6000618ee000619140006193c
-000619620006198a000619b2000619dc00061a0200061a2800061a4e0006
-1a8000061aa800061b2e00061b5800061bc200061bf200061c2200061c48
-00061c6e00061cc600061cf600061d3200061d5c00061d8c00061dbc0006
-1df000061e2400061e5400061e9400061ece00061f1600061f3c00061f62
-00061f8800061fae00061fd4000620140006205400062090000620c00006
-20f0000621200006215000062188000621c000062200000622400006227a
-000622b4000622f00006232e00062378000623c2000624080006244e0006
-2490000624d20006250200062532000625660006259a000625d40006260e
-0006265a000626a6000626fe00062756000627ae0006280c0006283c0006
-286c000628a2000628d80006290e0006294a0006297e000629b200062a06
-00062a5a00062aae00062b0200062b5600062baa00062c0200062c5a0006
-2c8800062cb600062ce800062d1a00062d6000062da600062dd800062e0a
-00062e5c00062eb400062ef800062f3c00062f8000062fc4000630180006
-306c0006309c000630cc000631020006313800063176000631bc00063210
-0006325a000632ac000632fe0006335e000633be000633ee000634200006
-345a00063494000634e60006353a00063584000635cc0006360e00063678
-000636c6000637120006374400063776000637aa000637de000638140006
-384a00063888000638be000638f00006392c00063982000639d800063a36
-00063a9400063aea00063b4000063b7400063ba400063be800063c1e0006
-3c4e00063c9200063cd000063d0800063d4000063d7600063db200063de2
-00063e1e00063e5e00063ea400063eee00063f3a00063f8600063fdc0006
-403200064080000640ce0006411c0006416c000641c8000642240006427c
-000642d4000643280006437c000643be0006440000064448000644900006
-44d8000645260006456a000645ae000646140006467a000646e000064746
-000647ac000648120006487c000648e60006492e00064976000649be0006
-4a0600064a5200064a9e00064af200064b3e00064b8200064bd000064c38
-00064ca000064d1000064d8000064de800064e5000064e9000064ece0006
-4f1800064f4200064f8800064fc00006500e0006503e0006506e000650aa
-000650de000651040006515800065196000651ea000652d0000653f80006
-543a00065460000654b6000654e60006552800065570000655be00065608
-000656580006567e000657660006584a0006599c000659ca000659f80006
-5a8c00065b1200065b4000065bca00065bfa00065c2a00065c7800065cc6
-00065daa00065e8600065fca00065ffa0006602a000660c0000661480006
-6178000661a8000661d80006626800066298000662c80006631a00066362
-000663b80006644e000664e60006655a000665ac000665d60006662c0006
-6660000666aa000666e20006673200066770000667bc000667e20006685e
-000668b0000669c200066bcc00066d8000066f0200067074000673160006
-75e6000677a6000678ec00067b4600067c8800067e9e00067ef000067f40
-00067f9600067fec0006804e000680d600068324000684b6000686c20006
-87de0006899200068b1400068bd400068cb600068d1e00068d8000068df6
-00068e5e00068f0a00068f7a0006900a0006911e000691e20006922e0006
-92c40006937000069414000694be000695080006954a000695c000069628
-000696b800069766000697d0000698340006989a00069954000699ea0006
-9a4800069a7200069a9c00069aac00069abc00069b7e00069c8200069e8c
-00069fe200069ff20006a0a20006a1860006a1e60006a1f60006a2520006
-a2b00006a3d00006a4be0006a4ce0006a4de0006a4ee0006a4fe0006a5e4
-0006a6e40006a8bc0006aa780006ab7e0006abf80006ac720006ad240006
-ad340006ae420006ae520006ae620006af240006b0580006b1440006b154
-0006b1640006b1740006b2da0006b4460006b5720006b5820006b5920006
-b5a20006b5b20006b6940006b6a40006b8060006b9100006ba0e0006bb46
-0006bc180006bc960006bd140006be340006beb00006befc0006bf880006
-c09c0006c0f00006c2320006c2f20006c3be0006c4b40006c5be0006c670
-0006c7d60006c83c0006c9000006cb020006cc900006ce0e0006cf3e0006
-d1f00006d3320006d4600006d5d80006d7500006d8d00006da5e0006dc10
-0006dc7e0006dde20006df1a0006e01e0006e1540006e2860006e3560006
-e4260006e5820006e65c0006e6fc0006e8000006e92a0006ea280006eba8
-0006ed120006ee500006efc80006f1140006f1f60006f25e0006f3000006
-f3a00006f49e0006f6060006f7400006f8d40006fa1e0006fb020006fb60
-0006fc660006fcfc0006fdbe0006fe640006fea400070050000701220007
-01e800070310000704b0000705bc00070614000707ac0007083a0007084c
-0007087c000708ac000708e40007091c000709520007098e000709c40007
-0a0000070b6e00070bb800070c5200070cea00070d6400070de800070e4e
-00070efa00070f46000710660007111c000711f20007122a000712680007
-12dc000713d6000714f4000715f6000716380007167a000716e8000716f8
-000717080007171800071728000717380007174800071758000717680007
-17780007178800071798000717980007191c0007192c000719ec00071ab2
-00071be800071dde00071fe0000721dc00072412000726120007267e0007
-27900007292200072a7a00072b2c00072b7000072c0e00072d3e00072d8e
-00072e2400072f6000072f70000731260007325a000732aa000733000007
-33c20007340600073448000734ce0007352c0007361e000736ac000736e2
-0007375c000737d4000738240007393000073a2600073ad000073afa0007
-3b2400073b4e00073b7800073bb800073bf800073c3000073c6800073cb2
-00073cfc00073d3c00073d7c00073dc600073e1000073e5000073e900007
-3eea00073f4400073f7e00073fb800073ffc0007404000074084000740c8
-0007411c00074170000741bc00074208000742460007428a000742da0007
-432a00074384000743e20007440c00074436000744d00007456a000745ae
-000745f2000747080007471800074760000747a8000747fa0007484c0007
-48b60007490a00074956000749b400074a3e00074aa200074ae600074b30
-00074b9800074be200074c2200074c6a00074ca600074ce200074d1e0007
-4d5800074d9a00074ddc00074e1c00074e5c00074ea600074ef000074f46
-00074f9e00074fec0007503a0007507c000750ca0007510c000751560007
-5198000751dc0007523800075294000752e00007532c00075376000753c0
-000753fe0007543c000754ba0007553800075572000755ac000756460007
-56e0000757b400075888000758e400075940000759b400075a2800075b86
-00075b9600075c8000075c9000075cc600075cfc00075d3600075d700007
-5dac00075de800075e2e00075e7400075fda00076190000762dc0007649a
-00076610000767b8000768e8000769ee00076c0c00076d5000076ee60007
-706e000770ec0007723000077438000774cc00077560000776b4000777de
-0007795800077a9800077c0400077cf200077ebc00078050000780d20007
-8204000782ee0007845600078538000786ee000787e00007894200078a7e
-00078b7200078d3600078ebe00079062000791c600079362000795200007
-96a600079742000798b6000799a800079a9000079c1000079d6200079e82
-0007a01a0007a1f00007a37e0007a4280007a4de0007a6900007a7340007
-a7c20007a80e0007a85a0007a8d20007a9b00007aa2a0007aacc0007ab20
-0007ac840007adb00007aec20007afc40007b08c0007b2000007b3400007
-b5660007b6100007b73a0007b83e0007b9de0007baca0007bbc40007bcc2
-0007bda80007bec20007c07c0007c22a0007c3980007c4100007c4840007
-c5a20007c6260007c7280007c8b40007ca2c0007cb620007cc6c0007cde2
-0007cf5a0007d14c0007d33a0007d5000007d5740007d6240007d6da0007
-d78a0007d8480007d9420007da460007db400007dc4c0007dcd40007dd62
-0007ddea0007de7e0007df5a0007e0500007e1340007e22a0007e2be0007
-e37a0007e40e0007e4cc0007e5bc0007e6c40007e7c20007e8d60007e9f8
-0007eb0c0007ec4c0007ed860007eea80007efbc0007f1000007f2540007
-f4680007f61a0007f6ce0007f7ea0007f8c00007f9de0007fabc0007fc50
-0007fd0a0007fda60007fe980007ff800008006c000800ea000801e40008
-03220008044e00080482000804c6000804d600080576000806180008070e
-000807fa000808d4000809ac00080b0a00080c6a00080d0800080d9e0008
-0ddc00080e1c00080e5a00080e9a00080ef400080f4c00080fa60008100a
-0008109600081292000812e20008140e0008149400081514000815ee0008
-16c2000817c6000819b200081aca00081b3a00081bca00081c8c00081d5e
-00081dca00081e4800081f9c00081fe2000820280008210c000821480008
-21a6000821e4000822160008225a0008229c000822cc000100000d3500f2
-003c009d000700020010002f005600000468041d0005000200>
-<0000003a02be0000000300000000006a00000000000300000001000a006a
-0000000300000002000e00740000000300000003005e0082000000030000
-0004000a00e00000000300000005001800ea0000000300000006000e0102
-000000030000000700ba01100000000300000008003001ca000000030000
-0009008a01fa000000030000000d02aa028400010000000000000035052e
-000100000000000100050563000100000000000200070568000100000000
-0003002f056f00010000000000040005059e0001000000000005000c05a3
-0001000000000006000705af0001000000000007005d05b6000100000000
-00080018061300010000000000090045062b000100000000000d01550670
-0003000104030002000c07c50003000104050002001007d1000300010406
-0002000c07e10003000104070002001007ed0003000104080002001007fd
-0003000104090000006a080d0003000104090001000a0877000300010409
-0002000e08810003000104090003005e088f0003000104090004000a08ed
-0003000104090005001808f70003000104090006000e090f000300010409
-000700ba091d0003000104090008003009d70003000104090009008a0a07
-000300010409000d02aa0a9100030001040a0002000c0d3b00030001040b
-000200100d4700030001040c0002000c0d5700030001040e0002000c0d63
-0003000104100002000e0d6f000300010413000200120d7d000300010414
-0002000c0d8f000300010415000200100d9b0003000104160002000c0dab
-0003000104190002000e0db700030001041b000200100dc500030001041d
-0002000c0dd500030001041f0002000c0de10003000104240002000e0ded
-00030001042a0002000e0dfb00030001042d0002000e0e0900030001080a
-0002000c0e170003000108160002000c0e23000300010c0a0002000c0e2f
-000300010c0c0002000c0e3b00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0052006500670075006c00610072004d006f006e006f
-0074007900700065003a0041007200690061006c00200052006500670075
-006c00610072003a00560065007200730069006f006e00200035002e0030
-003100200028004d006900630072006f0073006f00660074002900410072
-00690061006c00560065007200730069006f006e00200035002e00300031
-0041007200690061006c004d00540041007200690061006c002000690073
-00200061002000740072006100640065006d00610072006b0020006f0066
-00200054006800650020004d006f006e006f007400790070006500200043
-006f00720070006f0072006100740069006f006e00200069006e00200074
-0068006500200055006e0069007400650064002000530074006100740065
-007300200061006e0064002f006f00720020006f00740068006500720020
-0063006f0075006e00740072006900650073002e0054006800650020004d
-006f006e006f007400790070006500200043006f00720070006f00720061
-00740069006f006e004d006f006e006f0074007900700065002000540079
-00700065002000440072006100770069006e00670020004f006600660069
-006300650020002d00200052006f00620069006e0020004e006900630068
-006f006c00610073002c0020005000610074007200690063006900610020
-005300610075006e0064006500720073002000310039003800320059006f
-00750020006d006100790020007500730065002000740068006900730020
-0066006f006e007400200074006f00200064006900730070006c00610079
-00200061006e00640020007000720069006e007400200063006f006e0074
-0065006e00740020006100730020007000650072006d0069007400740065
-006400200062007900200074006800650020006c006900630065006e0073
-00650020007400650072006d007300200066006f00720020007400680065
-002000700072006f006400750063007400200069006e0020007700680069
-006300680020007400680069007300200066006f006e0074002000690073
-00200069006e0063006c0075006400650064002e00200059006f00750020
-006d006100790020006f006e006c0079002000280069002900200065006d
-0062006500640020007400680069007300200066006f006e007400200069
-006e00200063006f006e00740065006e0074002000610073002000700065
-0072006d0069007400740065006400200062007900200074006800650020
-0065006d00620065006400640069006e0067002000720065007300740072
-0069006300740069006f006e007300200069006e0063006c007500640065
-006400200069006e0020007400680069007300200066006f006e0074003b
-00200061006e006400200028006900690029002000740065006d0070006f
-0072006100720069006c007900200064006f0077006e006c006f00610064
-0020007400680069007300200066006f006e007400200074006f00200061
-0020007000720069006e0074006500720020006f00720020006f00740068
-006500720020006f00750074007000750074002000640065007600690063
-006500200074006f002000680065006c00700020007000720069006e0074
-00200063006f006e00740065006e0074002ea9203230303620546865204d
-6f6e6f7479706520436f72706f726174696f6e2e20416c6c205269676874
-732052657365727665642e417269616c526567756c61724d6f6e6f747970
-653a417269616c20526567756c61723a56657273696f6e20352e30312028
-4d6963726f736f667429417269616c56657273696f6e20352e3031417269
-616c4d54417269616c20697320612074726164656d61726b206f66205468
-65204d6f6e6f7479706520436f72706f726174696f6e20696e2074686520
-556e697465642053746174657320616e642f6f72206f7468657220636f75
-6e74726965732e546865204d6f6e6f7479706520436f72706f726174696f
-6e4d6f6e6f7479706520547970652044726177696e67204f666669636520
-2d20526f62696e204e6963686f6c61732c20506174726963696120536175
-6e646572732031393832596f75206d617920757365207468697320666f6e
-7420746f20646973706c617920616e64207072696e7420636f6e74656e74
-206173207065726d697474656420627920746865206c6963656e73652074
-65726d7320666f72207468652070726f6475637420696e20776869636820
-7468697320666f6e7420697320696e636c756465642e20596f75206d6179
-206f6e6c792028692920656d626564207468697320666f6e7420696e2063
-6f6e74656e74206173207065726d69747465642062792074686520656d62
-656464696e67207265737472696374696f6e7320696e636c756465642069
-6e207468697320666f6e743b20616e6420286969292074656d706f726172
-696c7920646f776e6c6f6164207468697320666f6e7420746f2061207072
-696e746572206f72206f74686572206f7574707574206465766963652074
-6f2068656c70207072696e7420636f6e74656e742e004e006f0072006d00
-61006c006f00620079010d0065006a006e00e9006e006f0072006d006100
-6c005300740061006e0064006100720064039a03b103bd03bf03bd03b903
-ba03ac00a90020003200300030003600200054006800650020004d006f00
-6e006f007400790070006500200043006f00720070006f00720061007400
-69006f006e002e00200041006c006c002000520069006700680074007300
-2000520065007300650072007600650064002e0041007200690061006c00
-52006500670075006c00610072004d006f006e006f007400790070006500
-3a0041007200690061006c00200052006500670075006c00610072003a00
-560065007200730069006f006e00200035002e0030003100200028004d00
-6900630072006f0073006f0066007400290041007200690061006c005600
-65007200730069006f006e00200035002e00300031004100720069006100
-6c004d00540041007200690061006c002000690073002000610020007400
-72006100640065006d00610072006b0020006f0066002000540068006500
-20004d006f006e006f007400790070006500200043006f00720070006f00
-72006100740069006f006e00200069006e00200074006800650020005500
-6e0069007400650064002000530074006100740065007300200061006e00
-64002f006f00720020006f007400680065007200200063006f0075006e00
-740072006900650073002e0054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-4d006f006e006f0074007900700065002000540079007000650020004400
-72006100770069006e00670020004f006600660069006300650020002d00
-200052006f00620069006e0020004e006900630068006f006c0061007300
-2c0020005000610074007200690063006900610020005300610075006e00
-64006500720073002000310039003800320059006f00750020006d006100
-7900200075007300650020007400680069007300200066006f006e007400
-200074006f00200064006900730070006c0061007900200061006e006400
-20007000720069006e007400200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-200074006800650020006c006900630065006e0073006500200074006500
-72006d007300200066006f00720020007400680065002000700072006f00
-6400750063007400200069006e0020007700680069006300680020007400
-680069007300200066006f006e007400200069007300200069006e006300
-6c0075006400650064002e00200059006f00750020006d00610079002000
-6f006e006c0079002000280069002900200065006d006200650064002000
-7400680069007300200066006f006e007400200069006e00200063006f00
-6e00740065006e00740020006100730020007000650072006d0069007400
-7400650064002000620079002000740068006500200065006d0062006500
-6400640069006e0067002000720065007300740072006900630074006900
-6f006e007300200069006e0063006c007500640065006400200069006e00
-20007400680069007300200066006f006e0074003b00200061006e006400
-200028006900690029002000740065006d0070006f007200610072006900
-6c007900200064006f0077006e006c006f00610064002000740068006900
-7300200066006f006e007400200074006f00200061002000700072006900
-6e0074006500720020006f00720020006f00740068006500720020006f00
-750074007000750074002000640065007600690063006500200074006f00
-2000680065006c00700020007000720069006e007400200063006f006e00
-740065006e0074002e004e006f0072006d0061006c004e006f0072006d00
-610061006c0069004e006f0072006d0061006c004e006f0072006d00e100
-6c004e006f0072006d0061006c0065005300740061006e00640061006100
-720064004e006f0072006d0061006c004e006f0072006d0061006c006e00
-79004e006f0072006d0061006c041e0431044b0447043d044b0439004e00
-6f0072006d00e1006c006e0065004e006f0072006d0061006c004e006f00
-72006d0061006c004e0061007600610064006e006f0074006801b001a103
-00006e00670041007200720075006e00740061004e006f0072006d006100
-6c004e006f0072006d0061006c004e006f0072006d0061006c004e006f00
-72006d0061006c000000b900540328b326181fd0bc032900e00329000203
-29b22b1d1fb90327031db23b1f40b80323b31215320f412d03200001002f
-0320000100200320006f032000af032000bf03200004005f031e00010010
-031e007f031e0080031e00af031e00bf031e00d0031e00060000031e0010
-031e0020031e006f031e009f031e00e0031e0006031d031cb2201f104127
-0319007f03190002000f031700ef031700ff03170003001f0317002f0317
-004f0317005f0317008f0317009f03170006000f0317005f0317006f0317
-007f031700bf031700f00317000600400317b2923340b80317b28b3340b8
-0317b36a6c3240b80317b2613340b80317b35c5d3240b80317b357593240
-b80317b34d513240b80317b344493240b80317b23a3340b80317b3313432
-40b80317b32e423240b80317b3272c3240b80317b312253280b80317b30a
-0d32c04116031600d00316000200700316000102c4000f0101001f00a003
-1500b0031500020306000f0101001f00400312b32426329fbf0304000103
-0203010064001fffc00301b20d1132410a02ff02ef0012001f02ee02ed00
-64001fffc002edb30e11329f414a02e200af02e200bf02e2000302e202e2
-02e102e1007f02e00001001002e0003f02e0009f02e000bf02e000cf02e0
-00ef02e0000602e002e002df02df02de02de000f02dd002f02dd003f02dd
-005f02dd009f02dd00bf02dd00ef02dd000702dd02dd001002dc00010000
-02dc0001001002dc003f02dc000202dc02dc001002db000102db02db000f
-02da000102da02daffc002d3b2373932b9ffc002d3b22b2f32b9ffc002d3
-b21f2532b9ffc002d3b2171b32b9ffc002d3b2121632b802d2b2f9291fb9
-0326031cb23b1f40bb0322003e00330322b225311fb80318b23c691fb802
-e3b3202b1fa0413002d400b002d40002000002d4001002d4002002d40050
-02d4006002d4007002d40006006002d6007002d6008002d6009002d600a0
-02d600b002d60006000002d6001002d6002002ca002002cc002002d60030
-02d6004002d6005002d6000802d0b2202b1fb802cfb226421f411602ce02
-c70017001f02cd02c80017001f02cc02c60017001f02cb02c50017001f02
-c902c5001e001f02ca02c6b21e1f00410b02c6000002c7001002c6001002
-c7002f02c5000502c1b324121fff411102bf0001001f02bf002f02bf003f
-02bf004f02bf005f02bf008f02bf000602bf0222b2641f12410b02bb00ca
-0800001f02b200e90800001f02a600a20800406a1f402643493240204349
-3240263a3d3240203a3d329f209f26024026969932402096993240268e92
-3240208e92324026848c324020848c3240267a813240207a813240266c76
-3240206c76324026646a324020646a3240265a5f3240205a5f3240264f54
-3240204f5432b8029eb724271f374f6b0120410f02770030027700400277
-00500277000402770277027700f90400001f029bb22a2a1fb8029a402b29
-2a1f80ba0180bc0180520180a201806501807e01808101803c01805e0180
-2b01801c01801e0180400180bb0138000100800140b40180400180bb0138
-00010080013940180180ca0180ad01807301802601802501802401802001
-3740b80221b2493340b80221b2453340b80221b341423240b80221b33d3e
-320f410f0221003f0221007f0221000300bf022100cf022100ff02210003
-00400221b320223240b80221b3191e3240b80222b32a3f3240b80221b32e
-3a326f414802c3007f02c3008f02c300df02c30004002f02c3006002c300
-cf02c30003000f02c3003f02c3005f02c300c002c300ef02c300ff02c300
-0600df02220001008f02220001000f0222002f0222003f0222005f022200
-7f022200ef0222000600bf022100ef02210002006f0221007f022100af02
-210003002f0221003f0221004f0221000302c302c3022202220221022140
-1d101c102b1048038f1c010f1e014f1eff1e023700161600000012110811
-b8010db6f70df8f70d00094109028e028f001d001f0290028f001d001f02
-8fb2f91d1fb80198b226bb1f41150197001e0401001f013900260125001f
-013800730401001f0135001c0801001f0134001c02ab001f0132b21c561f
-b8010fb2262c1fba010e001e0401b61ff91ce41fe91cb80201b61fe81cbb
-1fd720b80401b21fd51cb802abb61fd41c891fc92fb80801b21fbc26b801
-01b21fba20b80201b61fb91c381fadcab80401b21f8126b8019ab21f7e26
-b8019ab61f7d1c471f6b1cb80401b21f6526b8019ab21f5e73b80401400f
-1f52265a1f481c891f441c621f4073b80801b61f3f1c5e1f3c26b8019ab2
-1f351cb80401b61f301cbb1f2b1cb80401b61f2a1c561f291cb80101b21f
-231eb80401b21f5537b80168402c07960758074f07360732072c0721071f
-071d071b071408120810080e080c080a080808060804080208000814b8ff
-e0402b000001001406100000010006040000010004100000010010020000
-01000200000001000002010802004a00b013034b024b5342014bb0c06300
-4b6220b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807
-ff52b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ff
-b101018e851bb0124358b900010111858d1bb900010128858d5959001816
-763f183f123e113946443e113946443e113946443e113946443e11394660
-443e11394660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b2b
-182b1db0964b5358b0aa1d59b0324b5358b0ff1d594bb09353205c58b901
-f201f04544b901f101f045445958b9033e01f2455258b901f2033e445959
-4bb8015653205c58b9002001f14544b9002601f145445958b9081e002045
-5258b90020081e4459594bb8019a53205c58b9002501f24544b9002401f2
-45445958b909090025455258b9002509094459594bb8040153205c58b173
-244544b1242445445958b917200073455258b9007317204459594bb80401
-53205c58b1ca254544b1252545445958b9168000ca455258b900ca168044
-59594bb03e53205c58b11c1c4544b11e1c45445958b9011a001c455258b9
-001c011a4459594bb05653205c58b11c1c4544b12f1c45445958b9018900
-1c455258b9001c01894459594bb8030153205c58b11c1c4544b11c1c4544
-5958b90de0001c455258b9001c0de04459592b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65
-422b2b01b33b59635c456523456023456560234560b08b766818b0806220
-20b163594565234520b003266062636820b003266165b059236544b06323
-4420b13b5c4565234520b003266062636820b003266165b05c236544b03b
-2344b1005c455458b15c406544b23b403b4523614459b347503437456523
-456023456560234560b089766818b080622020b134504565234520b00326
-6062636820b003266165b050236544b034234420b147374565234520b003
-266062636820b003266165b037236544b0472344b10037455458b1374065
-44b24740474523614459004b5342014b5058b108004259435c58b1080042
-59b3020b0a124358601b2159421610703eb0124358b93b21187e1bba0400
-01a8000b2b59b00c2342b00d2342b0124358b92d412d411bba0400040000
-0b2b59b00e2342b00f2342b0124358b9187e3b211bba01a80400000b2b59
-b0102342b0112342002b7475737500184569444569444569447373737374
-757374752b2b2b2b74752b2b2b2b2b737373737373737373737373737373
-737373737373737373732b2b2b45b0406144737400004bb02a534bb03f51
-5a58b1070745b040604459004bb03a534bb03f515a58b10b0b45b8ffc060
-4459004bb02e534bb03a515a58b1030345b040604459004bb02e534bb03c
-515a58b1090945b8ffc06044592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b752b2b2b2b2b2b2b435c58b9008002bbb301401e017400735903b01e4b
-5402b0124b545ab012435c5a58ba009f02220001007359002b7473012b01
-732b2b2b2b2b2b2b2b737373732b2b2b2b2b002b2b2b2b2b2b0045694473
-456944734569447374754569447345694445694445694473744569444569
-44732b2b2b2b2b732b002b732b74752b2b2b2b2b2b2b2b2b2b2b2b2b2b73
-7475732b7374757374752b2b2b742b2b000000>
-[15785 15901 16277 16325 16277 16273 15933 16169 16277 15721 16361 15561 15973
-16029 16305 15693 16345 16249 15893 15629 16365 15481 16245 16249 16357 16337
-15821 15749 16345 15937 16257 16033 19077 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-3 4064 66 <0001ffe1fe69048afeeb0003001a400c013f00021a050019044341182b4e
-10e410e6002f4ded3130033521151f04a9fe69828200>ArialMT AddT42Char 
-3 4240 68 <0002004affe8041c043e00280037022d402c090d092a190d1a2a290d2a2a
-390d3615371b3a2a492a5d0d5d2a6a0d692a60308a0d86299a169b1aa90d
-1528b8ffe8b40b0b065527b8ffe840190b0b0655a619aa28b619bb28c419
-cf28d215dd28084416011eb8fff440110c0c065512120c0c0655050c0c0c
-065535b8ffe040550c0c06551f171f182b2c2a343904392c4904482c5608
-592b6608692b760c870cc90cf90df92b1137340e0104102f243417322114
-185f296f2902291c2f0e3f0e8f0e9f0eff0e059f0eaf0eef0e030e0c0f0f
-02550eb8ffeab4101002550eb8fff44015101006550e0c0d0d06550e060f
-0f06550e0e1c0317b802aab61895141c1c0700b8fff4401a0c0c06550045
-270a321c030b2961106100060d0d025500252124b8ffecb41010025524b8
-ffec400b0d0d025524040c0c025524b8ffe4b40b0b025524b8fff4b40b0b
-065524b8ffdc400b1010065524060f0f065524b8fffcb40c0c065524b802
-5b400e27400026102620263026af260539b8ffc0b40e0e025526b8ffd6b6
-0e0e0255263139b8ffc0400d1e23343039c03902a039013917b8fff44041
-10100655172518222f24bf06cf06021f063f0602060e0f0f0255060c0d0d
-025506180c0c0255060c0b0b0255060c0b0b0655060e0d0d065506100c0c
-065506313810f62b2b2b2b2b2b2b5d71edf4ed2b105d712bf62b2b5dedf4
-2b2b2b2b2b2b2b2b3cfd2be5e5003fed3fe42b3fedfde41112392f2b2b2b
-2b2b5d71ed711112391112393901111217393130005d2b2b2b2b01715d2b
-2b0071250606232226353436363736373637363534272623220607273e02
-333216161716151514161723260306070e02151416333236373635033c64
-b96aafbc477348356bda67013345887f791db0186ed08988aa5010091722
-bc1c1762c46f5c326d6968a2261d835546ab854e814e140e0d1a24250a6e
-2d3d597118718b4b40614a2e78f0fb853d3801dd281c10284d2f48605b4f
-3d77>ArialMT AddT42Char 
-3 5440 70 <00010050ffe803ed043e001a015ab1020243545840340e7f0f010f0b0140
-0050007000030004121c0b07181c040b010e1507080e0e0255070c0d0d02
-55070c0c0c025507100b0b0255072f2b2b2b2bcdd4c6003fed3fed10c45d
-3210c45d3231301b4047090c011f1c4313431753135317601360179b029b
-039a0da410a41a0c080d190a6a0269036a05750c700d800da60cb509b60a
-b50c0c160c860ce302030e225f0f6f0f7f0f030f01b802aa407930004000
-5000600070009000a000e000f00009000f0f0b000004121c0b07181c040b
-1c0f010f240e080d0d06550e221b000100240b2b1f010100010101400b0b
-065501401010065501480c0c0655011a0d0d065501491c1524cf07011f07
-3f0702070e0b0b0655070a1010065507120c0c065507311b34c4182b10f6
-2b2b2b5d71ed10f62b2b2b2b5d724b53234b515a58b90001ffc03859ed72
-f42bed72003fed3fed12392f11392f105de4105de43130005d71015d7159
-011706062322001134123633321617072626232206151416333236033cb1
-1defaedafef772e989addc1faf197f5a88aaa4846a8e018517b7cf011d01
-0aac010281afa11b6b6cc3d3d6c28200>ArialMT AddT42Char 
-3 5876 71 <00020046ffe803df05ba0011001d015540a40a02040d250d340d440d0535
-14351c5702540a5214531c6702640565096314601cc01fd405d513dd19e5
-13e514ef17eb19e51de01fff1f161f1f2b1a3c163c1a4b1a701f901f072e
-02240d2e163a02350d4b02450d4614491c570a560d670de506e716fa01f4
-0e100115030e0b100f001b1c0b0711000a151c030b1833010025110f2510
-10d011011011401160118011041f400b0b02551f400d0d02551112101002
-5511b8fff440110f0f025511060e0e025511180d0d025511b8fff2400b0b
-0b0655110e1010065511b8ffeeb40c0c065511b8fff840420d0d06551174
-1224bf07cf07df07ff07041f073f074f0703071e0b0b025507180c0c0255
-071e0d0d0255070c0b0b0655070c0d0d0655071a0c0c065507191e345018
-2b4e10f42b2b2b2b2b2b5d714dedfd2b2b2b2b2b2b2b2b2b2b5d713c10ed
-10fd3ce4003fed3f3c3fed3f3c11391112393130005d01715d0071213506
-232226263534123633321617113311011416333236353426232206033865
-c47fd5756ad48360962fb3fd20ac7576a5a87b78a1869e8cfba39f01038a
-5141020efa460212cccac1c6daccc400>ArialMT AddT42Char 
-3 6312 72 <0002004bffe8041e043e0015001d015340171f001c150255035d055d0955
-0b65036b056f09650b0815b8ffe4b40d0d065511b8ffe440520d0d06551d
-1c0d0d06552712d905fa14f61a0431123a19311c41124d1a411c51125c19
-521c61126d1a611c78067815f602f618100016010f0d1717501660167016
-03161c0f9010a010021010041b1c0a0700ba02aa0001ffc0b41010025501
-b8ffc04010101006551001010195131c040b17400db8ffdcb40d0d02550d
-b8ffeeb40d0d06550db8ffeab40c0c06550db8ffc04009272a34b00d010d
-1a1fb8ffc0b32526341fb8ffc040411e2334301f011f163310240740242a
-341f073f074f070307200b0b025507180c0c0255071c0d0d0255070e0b0b
-0655071c0c0c065507160d0d065507191e3437182b4e10f42b2b2b2b2b2b
-5d2b4dfde44e10712b2bf6712b2b2b2b4ded003fedfd5d2b2be43fed1239
-2f5d3cfd713c011112393912393130015d005d2b2b2b0171720117060623
-22001110003332001114072116163332360121262726232206035eba2cee
-b9e9feef0114dcd5010e01fce80ab285638cfdda02510c3856897ca90156
-17a3b4011f0103010c0128fedefef91020afba680195864368a6>ArialMT AddT42Char 
-3 6758 73 <000100130000028005d30017010d401e1409010f192f193019401970199b
-0c9c0da90d081a0d280db019c0190419b8ffc040281a1f341d080d030c0f
-1c0a0115022b1413040306000a9f140114ff134004172504000302920101
-00b8ffc0b331383400b8ffc0402b1c1f3490000119400f0f025519400d0e
-025500141010025500280f0f025500220e0e0255002c0d0d025500b8fff2
-400b0c0c025500140b0b065500b8ffeab41010065500b8ffe6b40f0f0655
-00b8fffab70c0c065500a31819bc01ba002100f6010a00182b2bf62b2b2b
-2b2b2b2b2b2b2b2b5d2b2b3c10f43c103ced10eded5d003f3f3c3c3cfd3c
-3fed391139313043794014101106090706080602061009121b0011060f1b
-012b012b2a8181012b715d00723311233533353437363633321707262322
-06151533152311b29f9f131a83764c5c1b38325244cfcf039a8c716b3446
-57129d0a4660628cfc66>ArialMT AddT42Char 
-3 7098 74 <00020042fe5103ea043e001e002a016f40600b0b05142c0b25144c0b4514
-06091d191d2c0b26142c23390b36144a0b46145607580b680bfa0af5150e
-2e232c273e233e274c27902ca02c07362136293f2c460b46214529542154
-29690763216329602c802cda27e821ee23ef271117160615b802b1b4281c
-130701b802aa401020003000600070008000c000d0000700b8027d403205
-1c1c0f0a45221c0c0a16153325330a251818d01701101740176017801704
-2c400b0c02552c400d0d025517121010025517b8fff440110f0f02551706
-0e0e025517160d0d025517b8ffea400b0b0b065517121010065517b8ffee
-b40c0c065517b8fffc404a0d0d065517740f012500221f24bf0fcf0fdf0f
-ff0f041f0f3f0f4f0f030f200b0b02550f1a0c0c02550f220d0d02550f1c
-0b0b06550f0c0d0d06550f1a0c0c06550f192b2c74213450182b2b4ef42b
-2b2b2b2b2b5d714dedf4ed10fd2b2b2b2b2b2b2b2b2b2b5d713c10fde4f6
-3c003fede43fedfd5de43fede43f3c3130015d71005d7117171617163332
-363736270623220235341236333217353311140606232226131416333236
-35342623220666af0b3243747d88180e0176b0dbf06ed18dbc7aa665dba0
-beea99a67d7ca8ad7a78a8581a512532645a37b08b013cdd9801018c9880
-fc6af8cf78ab032ad1c0bfccc3c6c300>ArialMT AddT42Char 
-3 8014 76 <000200880000013c05ba0003000700cd405e09360b0b02554f099009a009
-b009c009df09f0090700091f09700980099f09b009c009df09e009ff090a
-1f09010001070402030906037e0100060506040a0607250500049f04a004
-b004c004e00406c004f0040200042004d004e0040404b8fff8b410100255
-04b8fffa40170e0e025504040c0c0255040a0b0b025504140b0b065504b8
-ffeab41010065504b8fffeb40d0d065504b8fffc400a0c0c0655044e0847
-50182b10f62b2b2b2b2b2b2b2b5d71723cfd3c003f3f3c3fed0111123939
-111239393130015d72712b133533150311331188b4b4b404ebcfcffb1504
-26fbda00>ArialMT AddT42Char 
-3 9202 79 <000100830000013705ba000300e3b605360b0b025505b8ffc0b337383405
-b8ffc0b334353405b8ffc0b330313405b8ffc0b322253405b8ffc0402515
-17340f051f059f05df05044f05df05f005031f0570058005ff0504010000
-0a0203250100b8ffc0b337383400b8ffc040153335349f0001c000f00002
-00002000d000e0000400b8fff8b41010025500b8fffa401d0e0e02550004
-0c0c0255000a0b0b025500140b0b065500081010065500b8fffeb40d0d06
-5500b8ffffb40c0c065500b8fffc400a0c0c0655004e044750182b10f62b
-2b2b2b2b2b2b2b2b5d71722b2b3cfd3c003f3f3130015d71722b2b2b2b2b
-2b3311331183b405bafa4600>ArialMT AddT42Char 
-3 9454 80 <0001008700000626043e002301c7b9000dfff4b40d0d065508b8fff4b40d
-0d065509b8ffd8404d0b0d342504e404e409e117e52005d505f620021708
-202309181b20090303231e1c06151c0b0b06070106231a19100ad0250190
-25a025022517171a0e2590110111041010025511180f0f025511b8ffec40
-0b0e0e025511140c0c025511b8ffe840170b0b025511020b0b0655110c10
-10065511060f0f065511b8fffab40c0c065511b8fff8b40d0d065511b801
-5d400c1825901b011b180f0f02551bb8ffec400b0e0e02551b140c0c0255
-1bb8ffee40110b0b02551b040b0b06551b0a101006551bb8fffe400b0d0d
-06551b0c0f0f06551bb8fffcb40c0c06551bb8015d4016000233232501d0
-00019000a000021f003f004f000300b8fffe401d0e0e025500100d0d0255
-00100c0c0255000c0b0b025500160b0b065500b8fffcb41010065500b8ff
-f440140f0f0655000a0c0c0655000e0d0d065500192425b80178b3214750
-182b2b4ef42b2b2b2b2b2b2b2b2b5d71723c4dfde410f42b2b2b2b2b2b2b
-2b2b5dedf42b2b2b2b2b2b2b2b2b2b5dfd4e456544e67172003f3c3c3c3f
-3f3c4d10ed10ed11173901111239123931304379400e0c141326140c111b
-01120d151b01002b012b2b81015d005d2b2b2b3311331536363332161736
-3332161511231134262623220615112311342623220606151187a132a66a
-76971f7eca9eaab3235c3e7094b458644c813a0426954e5f6258baafb6fd
-27029d6c5f3a95a4fd9702b27878509a91fdd900>ArialMT AddT42Char 
-3 10014 81 <00010087000003e6043e0016017d40130503061302a810b810e303e713f0
-03f6130604b8fff0403c0b0d347910019810d018e018ff18042008140e14
-16121c05070106160d0a0d0e0c0e2418401010025518400b0b02550b2810
-1002550b140e0e02550bb8ffec40110d0d02550b040c0c02550b220b0b02
-550bb8fff4400b0b0b06550b14101006550bb8fff9400b0d0d06550b0a0f
-0f06550bb8fff640120c0c06550b40333634ff0b01ff0b010b4e18b8ffc0
-401a343634b018f018027018a018b018c01804180302331516250100b8ff
-f6b41111025500b8fffab41010025500b8fffa40170e0e025500040c0c02
-55000a0b0b025500040b0b065500b8fffa40110f0f065500020c0c065500
-040d0d065500b8ffc04012333634f0000100002000d000e00004004e1710
-f65d712b2b2b2b2b2b2b2b2b2b3cfd3cf43c105d712bf65d712b2b2b2b2b
-2b2b2b2b2b2b2b2bed3c103c003f3c3f3fed113901123931304379401606
-11090a080a070a0306102611060e1b010f0a121b01002b012b2b2a81015d
-71002b5d71331133153633321616171615112311342626232206151187a2
-75dd60a150100ab42a6b4873a7042697af45704d327dfd7302866e6d4192
-ccfdbc00>ArialMT AddT42Char 
-3 10468 82 <00020044ffe80427043e000d0019016bb615180d0d065513b8ffe8b40d0d
-06550fb8ffe840730d0d065519180d0d065512070a190c47064808560659
-08670669080834103a123a16351845104b124b1645185c055c0952105d12
-5d1652186d056d0964106d126d1664187701150906050d5b035405540a5b
-0c6c036505650a6c0c0a171c0407111c0b0b14241b400d0d02551b400b0b
-025507b8ffea40110f0f025507180d0d025507100b0b025507b8fff0b40b
-0b065507b8fff0b40d0d065507b8fff0b40f0f065507b8fff0b40c0c0655
-07b8ffc04013242534300701000710072007030731df1b011bb8ffc04049
-1e2334301b011b0e24000c0e0f025500120d0d0255000c0c0c0255001c0b
-0b0255000e0b0b0655000e0d0d0655000c1010065500160c0c0655004024
-25341f003f000200311a3437182b10f65d2b2b2b2b2b2b2b2b2bed10712b
-5df65d5d2b2b2b2b2b2b2b2b2b2bed003fed3fed313001715d0071435c58
-4009530553096205620904015d59002b2b2b2b1310373633320015140606
-23220013141633323635342623220644a489c5db01167beb8bdffeedb9b2
-8786b2b38587b2021301278e76fee1fdcdeb82011e010dcccbccd1c5cbca
->ArialMT AddT42Char 
-3 10918 83 <00020087fe690421043e0012001e0162408e0c102d103d104b10043f20b0
-20021f20290c231d3215321d421d70209020083a173a1b4a174a1b59085b
-0c5c175c1b6a086b0c69106d176b1bc020d314dd18dd1ad31ee414e41ee0
-20ff201623042b102b1535043a1046044a105a10e50beb1dfe100b110e03
-161c1c06070106161c0e0b000e1924d00a01100a400a600a800a0420400b
-0b025520400d0d02550ab8ffe6400b0f0f02550a180d0d02550ab8fffab4
-0c0c02550ab8ffeeb40b0b06550ab8fff4b40f0f06550ab8ffe840230c0c
-06550a74011333023312250000c001019001a001b001f001041f013f014f
-010301b8fffc401d0e0e025501100d0d025501100c0c025501100b0b0255
-010c0b0b065501b8fff6b41010065501b8fffc40160f0f0655010c0c0c06
-5501120d0d065501191f473718012b4e10f42b2b2b2b2b2b2b2b2b5d7172
-3c4d10fdf4e410fd2b2b2b2b2b2b2b2b5d71ed003f3fed3f3fed11391239
-3130005d015d717200711311331536363332161615140206232226271103
-141633323635342623220687a43a926888d06a75df7b5a8f2e11a67678ab
-a77473b1fe6905bd8a51518cff98a3fefb8b4c3afdfb03a4cdc4cbd5cbca
-d700>ArialMT AddT42Char 
-3 11776 85 <00010085000002c6043e001100c9403b2f13011004012304340443045304
-66047404060911080908090d1311090d000308010b1c06070106000a0928
-900801082220130113022211250100b8ffc04010333634f0000100002000
-d000e0000400b8fff8b41010025500b8fff840110e0e025500040c0c0255
-00060b0b025500b8fffcb41010065500b8fff440160f0f065500060c0c06
-5500080d0d0655004e1247c4182b10f62b2b2b2b2b2b2b2b5d712b3cfde4
-105df472e4003f3f3fed11393911393901111239390010c9870e7dc43130
-005d72015d33113315363633321707262322060706151185a23e693f5b5e
-3e42423b5e141e0426a171483aa727473f6072fdd400>ArialMT AddT42Char 
-3 12038 86 <0001003fffe803b1043e00300317407b042214223a094a09442456226522
-7c098e098424a613ab2cc2030d09171a1817304b2cd617051b0255020210
-32010a185c085c095c0a5c0b5c0c5c0d6a086a096a0a6a0b6a0c6a0db426
-b4270f27262427242936245a0a590b64266428742374248024930a9c0c92
-28972c9530a40aa90ca327a428b326c5261628b8fff4b40d0d065522b8ff
-f4b40d0d065523b8fff4b40d0d065524b8fff4b40d0d065528b8fff4b40c
-0c065522b8fff4b40c0c065523b8fff4b40c0c065524b8fff4b40c0c0655
-1db8ffde40121e395a0827250c0a041a202615040b2e1d1ab802aa402219
-2c0b0b02551f193f194f195f19af19cf19060f191f196f19df19041f198f
-190219bd02550015000002aa0001ffc040140b0b025510014001021001d0
-0102000110010201b8ffc0b314163401b8ffc040100e113401012e5c1d6c
-1d021d1c150704b8fff4b40b0b025504b8ffe6b41010065504b8ffe64013
-0f0f0655041c2e0b1f1a011a24194013183432b8ffc0402f0f0f02551918
-0f0f025519180d0d025519160c0c025519201010065519200f0f06551910
-0c0c065519160d0d065519b8025bb207242ab8ffc0b51c39d02a012ab8ff
-e6b40c0c02552ab8ffe8b40f0f02552ab8ffe8b40c0c06552ab8ffeab60d
-0d06552a1a32b8ffc04021272a346032c032023f32803202321001010124
-00180d0d025500100d0d06550020b8fff4b40d0d025520b8fff4b4101006
-5520b8fff440190f0f065520240f100b0b02550f160c0c02550f200d0d02
-550fb8fffa40200f0f02550f0e0c0c06550f0c0d0d06550f22df00013f00
-4f00020019313437182b4e10f45d714df42b2b2b2b2b2bed2b2b2b102b2b
-ed724e105d712bf62b2b2b2b712b4dedf42b2b2b2b2b2b2b2b2bed72003f
-ed2b2b2b3fed7112392f2b2b5d71722be410fd5d71722be4111239111239
-0111121739313043794040272d1e2305142c261110121013100306220d20
-1b000928071b01052d071b011e14201b00210e231b0022230d0c08290a1b
-012827090a062b041b001f101d1b01002b2b103c103c2b103c103c2b012b
-2b2b2b2a2b818181002b2b2b2b2b2b2b2b2b5d71015d72715d1337161633
-323635342726272e02353436373636333216161707262623220615141716
-1716171e02151406062322263fb20f897b7c78352593c6994f41382a9153
-7dbd5a11b00c73697c6a16162f1b84bf975669c67dcfd9013d1c6b726544
-3d2318253249814e4779281f2b487b6718525c5237231c1d130a2433417c
-5c5a9f57ac00>ArialMT AddT42Char 
-3 12974 87 <00010024fff2022a0599001700d8b9000affc0b323263409b8ffc0404123
-263480190100010c0d0a0103001610092b0f0a06161c030b0f1022002201
-0d12250c01ff070845094560077007800790070400072007a007b007c007
-d0070607b8ffeeb41010025507b8fff4b40f0f025507b8fff2b40e0e0255
-07b8fff8b40d0d025507b8fff8b40c0c025507b8fffab41010065507b8ff
-f0400b0f0f065507060c0c065507b8ffe8b40d0d065507ba026a00180136
-b166182b10f62b2b2b2b2b2b2b2b2b5d71f4e410ed3cfd3c10e4f43c003f
-ed3f3cfd3c1139123911333310c93130015d2b2b25170623222626351123
-353311371133152311141616333202101a4c3c626c2c8484b3b5b5132b28
-1ea19f103e65a202638c01076cfe8d8cfd934d2c1a00>ArialMT AddT42Char 
-3 13680 89 <0001001a000003e80426000a01eab1020243545840170508000a08060106
-0a0005090805010205240f0f0255052f2bddcd10ddcd113333003f3f3f12
-3931301bb7350501002211390ab8ffde400d11390916121c340816121c34
-02b8ffeab3121c3401b8ffeab3121c340ab8ffd840091e213400281e2134
-0ab8ffe8400922253400162225340ab8ffda407e282e340020282e340f0c
-29002809260a3900350a4800470a56015602590858096601660269086909
-78007701770279087809770a870187028603890788088a099d009809910a
-ac00a20abd00b707b10ac900c50ada00d50aec00e30afb00f40a2c0a0005
-0a1800160a2800260a370a4f00400a09054012163405400b0d34b1060243
-5458400905010008060106000ab8fff4400f0d0d06550a000c0d0d065500
-050908b8fff440120d0d0655080501020c0d0d06550205050c0b1112392f
-dd2bcd10dd2bcd10cd2bcd2b002f3f3f11123931301b40370a0708082509
-0a1409090a0003020225010014010100050a0a000a09080802020106070a
-09030001052f0c010c22084040400980090209b8011bb5400580050205b8
-011b400920024001220bead2182b10f6ed1a19fd5dfd5d1a18ede45d1112
-3939123939003f3c103c103c3f3c113987052e2b877dc4872e182b877dc4
-593130002b2b01715d2b2b2b2b2b2b2b2b2b2b2b2b005d59210133131617
-363713330101aefe6cbee4251f182becb9fe6e0426fd84676f54760288fb
-da00>ArialMT AddT42Char 
-2 0 0 <00020100000005000500000300070000211121112521112101000400fc20
-03c0fc400500fb002004c000>ArialMT AddT42Char 
-ArialMT /CharStrings get begin
-/underscore 66 def
-/a 68 def
-/c 70 def
-/d 71 def
-/e 72 def
-/f 73 def
-/g 74 def
-/i 76 def
-/l 79 def
-/m 80 def
-/n 81 def
-/o 82 def
-/p 83 def
-/r 85 def
-/s 86 def
-/t 87 def
-/v 89 def
-end
-ArialMT /Encoding get
-dup 95 /underscore put
-dup 97 /a put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 105 /i put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 118 /v put
-pop
-end
-%ADOEndSubsetFont
-/KUDFNY+ArialMT /ArialMT findfont ct_VMDictPut
-/KUDFNY+ArialMT*1 
-[95{/.notdef}rp /underscore /.notdef /a /.notdef /c /d /e 
-/f /g /.notdef /i 2{/.notdef}rp /l /m /n 
-/o /p /.notdef /r /s /t /.notdef /v 
-137{/.notdef}rp]
-KUDFNY+ArialMT nf
-KUDFNY+ArialMT*1 [9 0 0 -9 0 0 ]msf
-395.626 33.5339 mo
-(gs_get_device_profile)
-[5.04001 4.56299 5.04001 5.03998 5.04001 2.51999 5.04001 5.04001 5.03998 4.43701 2.043 4.56299 
-4.923 5.04001 5.04001 2.99692 4.923 2.51999 2.043 1.91702 0 ]xsh
-340.123 44.0369 mo
-(gs_get_device_named_color_profile)
-[5.04001 4.56299 5.04001 5.03998 5.04001 2.51999 5.04001 5.04001 5.03998 4.43701 2.043 4.56299 
-4.923 5.04001 5.04001 4.92297 7.55994 4.923 5.03998 5.04001 4.43701 5.04001 2.04297 4.923 
-2.99695 5.04001 5.03998 2.99695 4.92297 2.52002 2.04297 2.04303 0 ]xsh
-396.877 20.7899 mo
-(gs_set_device_profile)
-[5.04001 4.56299 5.04001 4.56299 5.04001 2.51999 5.04001 5.03998 5.04001 4.43701 2.043 4.43698 
-5.04001 5.04001 4.923 2.99692 5.04001 2.51999 2.043 1.91702 0 ]xsh
-/KUDFNX+MicrosoftSansSerif*1 uf
-/KUDFNX+MicrosoftSansSerif uf
-/PBAAAA+MicrosoftSansSerif uf
-/KUDFNY+ArialMT*1 uf
-/KUDFNY+ArialMT uf
-/ArialMT uf
-gsave
-45.501 24.004 mo
-74.006 24.004 li
-74.006 55.135 li
-45.501 55.135 li
-cp
-clp
-45.5 23.7535 mo
-74.0051 23.7535 li
-74.0051 55.1317 li
-45.5 55.1317 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 45.5 516.246 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-gsave
-45.501 77.99 mo
-74.006 77.99 li
-74.006 109.246 li
-45.501 109.246 li
-cp
-clp
-45.5 77.7524 mo
-74.0051 77.7524 li
-74.0051 109.256 li
-45.5 109.256 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.5033 45.5 462.248 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-gsave
-47.751 134.129 mo
-76.256 134.129 li
-76.256 165.26 li
-47.751 165.26 li
-cp
-clp
-47.75 133.878 mo
-76.2551 133.878 li
-76.2551 165.257 li
-47.75 165.257 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 47.75 406.122 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-%ADOBeginSubsetFont: ArialMT Initial
-ct_T42Dict begin
--0.664 -0.324 2 1.004
- 256 array 0 1 255 {1 index exch /.notdef put} for  /ArialMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f3210325d73000000cc000000606376
-7420a11cd7eb0000012c000006546670676dcc79599a000007800000066e
-676c796607022dca000094e0000822cc68656164d6144b3e00000df00000
-003668686561123315fe00000e2800000024686d7478f65efffb00000e4c
-000034d46c6f6361361cd72000004320000034d86d617870124c05df0000
-77f8000000206e616d659617a74000007818000011057072657025d64dbf
-0000892000000bbe67646972000000000000000000000000000303880190
-00050008059a05330000011b059a0533000003d1006602120805020b0604
-020202020204e0002affc00078430000000900000000544d432000400020
-fffc05d3fe510133073e01b2400001ffffff0000042605bb000000200004
-05ba001905ba001a05a70019042600180000ffe70000ffe80000ffe7fe69
-ffe805ba0019fe69ffe802ea000000b8000000b80000000000a800ad0169
-00ad00bf00c201f0001800af00b900b400c800170044009c007c00940087
-0006005a00c80089005200520005004400940119ffb4002f00a1000300a1
-00cd00170057007e00ba00160118ffe9007f008503d300870085000d0022
-00410050006f008d014cff75005c00df04830037004c006e00700180ff58
-ff8eff92ffa400a500b903c8fffd000b001a0063006300cdffee05d8ffdc
-002d005c0095009900df019209b500400057008000b9039d0072009a035d
-0401ff67fffa00030021007700cd0004004d00cd01c0022b004c006500e7
-0118017c034305d8ffa3ffb0ffc40003001c005d0068009a00ba01350147
-0221055cff4dffcd0016002d00780080009900b200b600b600b800bd00da
-010c05f0ffa4fff00019002c0049007f00b400ce01c003fefd81fe3f0000
-00050018002900390049006f00be00c700d0012301c1026f050c05320540
-057affd4001400310055005700a700b400e601f7027e027e027f03c60446
-ff42000e0085009100bf00c200c500e1011a012f014f01560229026f029e
-03720008002c00310031006400690089009800c700de012b01b6020c02cf
-03a304ab04fb061dfee0ff0e00060026009b009d00c1010d011801200173
-018201d601e30243025f029b02e2039404a904d20761001c005e006d008d
-00ab00f7011201380151015b0168017c01870191019901cd01d001e80241
-0254026b02ef0368037103bd044204420453047304830586058b06e8fe58
-fec4fed1fef7ff32ff860051007c008100910095009e00b400b900cf00d9
-00d900df00e20105010b010e010e012001210155017b017b017e018d01a2
-01a801a901b401d001d001e201e901f201f501fb020002000206021b0221
-022202220223027202770294029c02cf02cf02d002ec02f903170322032b
-0335033c0359036f037103870390039003b503e1041a04cf04ff05320532
-0596059f05a805ab05c205f0060c0782080008ccfca3fd2afddefe00fe88
-fe96feb2feb4ffe100150019001a001c001f003c005100610061006a0078
-009600a500af00d3010c0118011a012a013e014c0151015f016a01710178
-01820184019a01a501a801a901ae01bc01cd01d701ef0200020d021c0221
-0222022e02350242024f024f025e026502710290029202b402d602fa0307
-030b030f0315032a0347035d036503740379039603b003cc03dd03e203f6
-03fc03fc03ff040a041f04220426042b0447045f0475049e04e704e7055c
-05cb05e5060a066d068606b806f10736073e07500751075d078f07b607d4
-086000b600c300b500b700000000000000000000000001e00381034503b5
-008e0233041902ce02ce002d005f0064034d023f000002a80188027d01b4
-02240578063b023b014e00f00426029402c6029f02f6023b034d014b0153
-006a0231000000000000061404aa0000003c04c300ed04bc026502ce03b5
-0078060c017e02ef060c00b201000239000001c50330042b03cb00da03df
-010704a100db040a011701ed02a70350010b01bd043e05580021039c00ae
-0371017d00b5024500000afb088c012b014e01aa00870054013201f803ff
-0003024e00b4003703e30083006b02d800ed00770088009701640467008e
-0033017c00e700a6029e0329056e062a061501c90269048a021301b40002
-04a9000002390124010305140084015d039a06ef02d9007500cf040a00de
-03ac04bc02cf02ae034d04f005520168006d007d00860071ff8100790558
-04d2016700030156002504e00094007c033204210094007f0072005c002f
-00b6001800ba00b80041034d00720018001f004c016a01550099009a009a
-009800b200040078006900140057006e00ce00b4065402b80067050e0165
-00e7000004cbfe52005affa60099ff67006eff92002dffd40087ff7c00b8
-00a800e5008f00a80185fe7b0070001e00d900de014c054602cf0546ff2d
-028a02d90253029600b700000000000000000000000000000125011800ea
-00ea00ae0000003e05bb008a04d70053003fff8cffd50015002800220099
-0062004a00e4006d00ee00e5004803c00033fe4e02b1ff460370007905df
-0051ffa7ff1f010a0068ff6c004f00bc00a507050061072b00ed04b001d2
-00b6007b00650252ff740365fe690094008f005c00400086007500890089
-4043555441403f3e3d3c3b3a3938373534333231302f2e2d2c2b2a292827
-262524232221201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09
-0807060504030201002c4523466020b02660b004262348482d2c45234623
-6120b02661b004262348482d2c45234660b0206120b04660b00426234848
-2d2c4523462361b0206020b02661b02061b004262348482d2c45234660b0
-406120b06660b004262348482d2c4523462361b0406020b02661b04061b0
-04262348482d2c0110203c003c2d2c20452320b0cd442320b8015a515823
-20b08d44235920b0ed51582320b04d44235920b09051582320b00d442359
-21212d2c20204518684420b001602045b04676688a4560442d2c01b10b0a
-432343650a2d2c00b10a0b4323430b2d2c00b0172370b101173e01b01723
-70b10217453ab10200080d2d2c45b01a234445b01923442d2c2045b00325
-456164b050515845441b2121592d2cb00143632362b0002342b00f2b2d2c
-2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b1
-2cc08a8cb8100062602b0c642364615c58b00361592d2c45b0112bb01723
-44b0177ae4182d2c45b0112bb01723442d2cb01243588745b0112bb01723
-44b0177ae41b038a45186920b01723448a8a8720b0a05158b0112bb01723
-44b0177ae41b21b0177ae45959182d2c2d2cb0022546608a46b040618c48
-2d2c4b53205c58b002855958b00185592d2c20b0032545b019234445b01a
-23444565234520b00325606a20b009234223688a6a606120b01a8ab00052
-7921b21a1a40b9ffe0001a45208a54582321b03f1b235961441cb114008a
-5279b31940201945208a54582321b03f1b235961442d2cb110114323430b
-2d2cb10e0f4323430b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2c
-b10e0f432343650b2d2cb11011432343650b2d2c4b525845441b2121592d
-2c0120b003252349b04060b0206320b000525823b002253823b002256538
-008a63381b212121212159012d2c4bb06451584569b00943608a103a1b21
-2121592d2c01b005251023208af500b0016023edec2d2c01b00525102320
-8af500b0016123edec2d2c01b0062510f500edec2d2c20b001600110203c
-003c2d2c20b001610110203c003c2d2cb02b2bb02a2a2d2c00b00743b006
-430b2d2c3eb02a2a2d2c352d2c76b8022323701020b802234520b0005058
-b00161593a2f182d2c21210c6423648bb84000622d2c21b08051580c6423
-648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb815
-55621bb200802f2b59b002602d2c0c6423648bb84000626023212d2cb400
-0100000015b00826b00826b00826b008260f10161345683ab001162d2cb4
-000100000015b00826b00826b00826b008260f1016134568653ab001162d
-2c4b53234b515a5820458a60441b2121592d2c4b545820458a60441b2121
-592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb01343
-58031b02592d2cb0134358021b03592d2c4b54b012435c5a58381b212159
-2d2cb012435c580cb00425b00425060c6423646164b807085158b00425b0
-0425012046b01060482046b0106048590a21211b2121592d2cb012435c58
-0cb00425b00425060c6423646164b807085158b00425b00425012046b8ff
-f060482046b8fff06048590a21211b2121592d2c4b53234b515a58b03a2b
-1b2121592d2c4b53234b515a58b03b2b1b2121592d2c4b53234b515ab012
-435c5a58381b2121592d2c0c8a034b54b00426024b545a8a8a0ab012435c
-5a58381b2121592d2c4b5258b00425b0042549b00425b00425496120b000
-5458212043b0005558b00325b00325b8ffc038b8ffc038591bb040545820
-43b0005458b00225b8ffc038591b2043b0005458b00325b00325b8ffc038
-b8ffc0381bb00325b8ffc03859595959212121212d2c462346608a8a4623
-20468a608a61b8ff8062232010238ab902c202c28a70456020b0005058b0
-0161b8ffba8b1bb0468c59b0106068013a2d2cb1020042b123018851b140
-0188535a58b910000020885458b202010243604259b12401885158b92000
-0040885458b2020202436042b12401885458b2022002436042004b014b52
-58b2020802436042591bb940000080885458b202040243604259b9400000
-8063b80100885458b202080243604259b94000010063b80200885458b202
-100243604259b94000020063b80400885458b20240024360425959595959
-2d2cb0024354584b53234b515a58381b2121591b21212121592d00000001
-00000005028fa58dc35f5f0f3cf5081b080000000000a2e3272a00000000
-c14fd713faaffd671000080c00000009000100010000000000010000073e
-fe4e00431000faaffa7a1000000100000000000000000000000000000d35
-06000100000000000239000002390000023900b002d7005e047300150473
-0049071d0077055600580187005a02aa007c02aa007c031d004004ac0072
-023900aa02aa0041023900ba0239000004730055047300df0473003c0473
-00560473001a047300550473004d047300610473005304730055023900b9
-023900aa04ac007004ac007204ac00700473005a081f006f0556fffd0556
-009605c7006605c7009e055600a204e300a80639006d05c700a4023900bf
-04000037055600960473009606aa009805c7009c063900630556009e0639
-005805c700a10556005c04e3003005c700a105560009078d001905560009
-0556000604e300290239008b023900000239002703c100360473ffe102aa
-00590473004a0473008604000050047300460473004b0239001304730042
-0473008701c7008801c7ffa20400008801c7008306aa0087047300870473
-0044047300870473004802aa00850400003f02390024047300830400001a
-05c700060400000f040000210400002802ac0039021400bc02ac002f04ac
-00570556fffd0556fffd05c70068055600a205c7009c0639006305c700a1
-0473004a0473004a0473004a0473004a0473004a0473004a040000500473
-004b0473004b0473004b0473004b023900bd023900230239ffe502390009
-047300870473004404730044047300440473004404730044047300830473
-0083047300830473008304730049033300800473006b0473001b04730051
-02cd006d044c000104e3009905e5000305e50003080000e102aa00de02aa
-003d0464004e080000010639005305b4009a0464004e0464004d0464004d
-0473fffd049c00a003f4003805b4007a069600a1046400000231000002f6
-002f02ec002d0625007f071d004404e3008104e3009e02aa00e804ac0072
-046400540473002e0464003304e5001a047300860473008c080000ef0556
-fffd0556fffd0639006308000081078d00520473fffc0800000002aa0053
-02aa004701c7008001c7006c0464004e03f4002f04000021055600060156
-fe390473ffe402aa005c02aa005c040000170400001704730049023900b9
-01c7006c02aa0047080000250556fffd055600a20556fffd055600a20556
-00a20239008d0239ffe00239000402390015063900630639006306390063
-05c700a105c700a105c700a1023900c602aa001902aa000602aa001d02aa
-002e02aa00e502aa00a202aa006b02aa003a02aa004b02aa002804730000
-01c700030556005c0400003f04e3002904000028021400bc05c7fffd0473
-004905560006040000210556009e0473008704ac007204ac00a102aa006b
-02aa001902aa002106ac006b06ac006b06ac0021047300000639006d0473
-0042023900b10556005c0400003f05c700660400005005c7006604000050
-04730046046bffe102aa00ee0556fffd0473004a0556fffd0473004a05c7
-009e04eb004705c7fffd055600a20473004b055600a20473004b04730096
-01c7004204730096025500880473009a02ac008305c7009c0473008705c7
-009c04730087063900630473004405c700a102aa008505c700a102aa003c
-0556005c0400003f04e300300239002404e300300300002305c700a10473
-008305c700a10473008304e300290400002804e3002904000028046800a4
-063900600662005504a00048047400480391006204f000440329002e0530
-0048046bffe1040000b002eb005208c000330800004f040000990800004f
-040000990800004f040000980400009807d5016a05c0009e04ab007204d5
-009d04ac007104d5022204d5010505abffe9050001c905ab027e05abffe9
-05ab027e05abffe905ab027e05abffe905abffe905abffe905abffe905ab
-ffe905ab01c005ab027e05ab01c005ab01c005abffe905abffe905abffe9
-05ab027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab
-01c005ab01c005abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905abffe905abffe905ab02d605ab006605abffea05d5ffff04d50092
-0800000007eb013007eb012007eb013007eb012004d500b204d5008004d5
-002a082b0198086b01b807550010060000f40600006f0440003a05400037
-04c0003f04150040040000250600005505e100bf038d008904d5ffd90180
-008002d50086071500610296000f04d5009202d6008302d6008304d500b2
-02d600700556fffd0473004a05c700660400005005c70066040000500556
-00a20473004b055600a20473004b055600a20473004b0639006d04730042
-0639006d047300420639006d0473004205c700a40473008705c7001f0473
-00060239ffce0239ffce0239ffe40239ffe40239fff60239fff50239004b
-01c700190400003701c7ffa20556009604000088040000860473009601c7
-fffa05c7009c0473008705c900a50473008b063900630473004406390063
-0473004405c700a102aa006b0556005c0400003f04e300300239000c05c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-078d001905c70006055600060400002101c700890556fffd0473004a0800
-0001071d00440639005304e30081023900b9078d001905c70006078d0019
-05c70006078d001905c70006055600060400002101c7008a02aaffe10473
-001b04cd005a06ac006b06ac002206ac002206ac004a02aa00e202aa006b
-02aa00de02aaffea0557ffff0646ffa706b4ffa80312ffa80632ffa706d8
-ffa70605ffa701c7ff780556fffd055600960558fffe055600a204e30029
-05c700a4023900bf055600960558000b06aa009805c7009c0533006d0639
-006305c700a40556009e04f2009404e30030055600060556000906af007f
-05fb0061023900040556000604a00048039100620473008b01c7006b0460
-0088049a008c04000019038700480473008b0473005c01c7008904000086
-04000018049c00a00400001a0395005c04730044048d008303db00560460
-00880433001105b4007a063f005701c7ffc9046000880473004804600088
-063f0057055700a206eb0032045500a105c000640556005c023900bf0239
-0004040000370875000d081500a406d5003104a900a10515000a05c000a0
-0556fffd054000a705560096045500a1056b0000055600a20763000704d5
-004e05c000a105c000a104a900a10540001206aa009805c700a406390063
-05c000a00556009e05c7006604e300300515000a061500520556000905eb
-009f05550057075500a1078000a106550000071500a8054000a505c00055
-081500a405c7001a0473004a0495005b0440008802eb008804ab00000473
-004b055afffb03ab003204780087047800870380008604ab00180580008c
-046b00880473004404550088047300870400005003aa0026040000210695
-004b0400000f0495008a042b0045066b008d0695008d0500002805c0008b
-042b008404150030060000890455001f0473004b0473000002eb00890415
-004b0400003f01c700880239000901c7ffa2074000130680008304730000
-0380008604000021046b008803e900a1034a008808000041089500a00585
-002d000001010000001e0000003100000031000001010000007e0000007e
-0000008c0000008c000001010000001000000101000001210310007d0000
-008c023300d20000030b0000ff04023900b9048100690456003203310019
-0411002d04d1009601f9009b030f005f04ca009b04b8008c01f9009b0413
-002803b0005003b4003c04ca009b04cf005001f9009b02d2003c0498005a
-043c00190488006e045f007303b1001903d4000a0466009604130028058e
-00640524002803f2009b03f2009b03f2009b01e3005a0356005a0686009b
-01f9ffac041300280413002803b4ff5703b4ff570448002d058e0064058e
-0064058e0064058e00640481006904810069048100690456003203310019
-0411002d04d10096024b0000034a000004b8008c024b00000413002803b0
-005003b4003c04cf005002d2003c0498005a0488006e045f007303d4000a
-0466009604130028058e00640524002801f9009b0456003203b00050045f
-0073049b003c0000ffdc0000ff250000ffdc0000fe51028d00ab028d00a0
-02da0043034d007901a8ffba000000460000004600000046000000460000
-00480000004600000046000000460435017c0435012e043500b704350081
-0435012c043500be043500af043500810435009a043500db04350085028d
-00c1043500b3060001000600010002420036060001000435009e04350098
-043500cb0600010006000100060001000600010006000100000000460600
-010006000100060001000600010006000100060001000600010006000100
-051bffba06000100060001000600010005b5003a05b5003a01f4ffba01f4
-ffba060001000600010006000100060001000481003604350036043dffba
-043dffba03e9004a03e9004a067f0014077600140327ffba041effba067f
-0014077600140327ffba041effba051b003204b500240300fff706000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010000000030
-0000004600000046000000400000004606000100060001000000ffdc0000
-fe510000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ff160000ff160000ffdc0000ff160000ffdc0000ff200000ffdc0473
-004a08000000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010006000100028d
-007f028d005d0600010004ee0015034d007901a8000e01d6ffdc01a80056
-01d60010037500320375003201a8002d01d60013051b003204b5002401f4
-ffba01f4ffba01a8009301d6001305b5003a05b5003a01f4ffba01f4ffba
-024200000300fff705b5003a05b5003a01f4ffba01f4ffba05b5003a05b5
-003a01f4ffba01f4ffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba02b3
-005f02b3005f02b3005f02b3005f03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba08c9003e08c9003e06c5ffba06c5ffba08c9003e08c9003e06c5ffba
-06c5ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7
-ffba04a7ffba045a002a039a00360435ffba0327ffba045a002a039a0036
-0435ffba0327ffba064f0027064f00270224ffba021affba04a7004604a7
-00460224ffba021affba04cf002d04cf002d0327ffba0327ffba040d0047
-040d004701a8ffba01a8ffba02b4002302b400230327ffba0327ffba0435
-00450435004501f4ffba01f4ffba024200360300fff7039affba0327ffba
-0375003203750032051b003204b50024051b003204b5002401f4ffba01f4
-ffba045a004004ce0049045a002604ce0039045a005304ce004a045a0053
-04ce004a0600010006000100000000460000004606000100060001000600
-010000000046000000460600010006000100000000480000004606000100
-060001000600010000000046000000460000004600000046000000400000
-003006000100000000460000004606000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d00ca028d00c7028d
-00c606000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000100ffba0800ffba1000ffba06dc0063053f004406d5
-00a1055b00830000fddc0000fc2f0000fca60000fe540000fcd70000fd73
-0000fe290000fe0d0000fd110000fc670000fd9d0000fbf50000fc720000
-fed50000fed50000ff02041b00a006ac006b06ac00190000feb60000fd73
-0000fe080000fca60000fe530000fd110000fbc80000faf40000faaf0000
-fc720000fbaa0000fb6a0000fcf10000fc7d0000fbdd0000fcc10000fb98
-0000fdea0000fe840000fdc20000fcf10000fd5f0000fe760000febc0000
-fceb0000fd6c0000fd580000fc900000fd150000fc2c0000fc130000fc12
-0000fb960000fb9601c700880556fffd0473004a0556fffd0473004a0556
-fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473004a
-0556fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473
-004a0556fffd0473004a0556fffd0473004a055600a20473004b055600a2
-0473004b055600a20473004b055600a20473004b055600a20473004b0556
-00a20473004b055600a20473004b055600a20473004b0239006301c7001f
-023900ba01c7007c06390063047300440639006304730044063900630473
-004406390063047300440639006304730044063900630473004406390063
-0473004406dc0063053f004406dc0063053f004406dc0063053f004406dc
-0063053f004406dc0063053f004405c700a10473008305c700a104730083
-06d500a1055b008306d500a1055b008306d500a1055b008306d500a1055b
-008306d500a1055b00830556000604000021055600060400002105560006
-040000210556fffd0473004a0239ffe201c7ffb0063900630473004405c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-05c700a1047300830000fefe0000fefe0000fefe0000fefe0455fffd02eb
-000c07630007055afffb04a900a10380008604a900a10380008605c700a4
-046b00880473fffd040000140473fffd04000014055600090400000f0555
-0057042b0045055500a10473008706050063047300550639006004730044
-05b5003a01f4ffba0224ffba021affba04a7004601f4009e01f4001001f4
-001b01f4001001f4006b01f4fff90227ffce0000000f0000fff502aa00a4
-02aa00a40000000e00000056000000560000ffcf01a8000f01d6ffbf01a8
-fff501d6ffcd01a8001d01d6fff501a8009301d600130375003203750032
-0375003203750032051b003204b5002405b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba
-01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4
-ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a
-01f4ffba01f4ffba0481003604350036043dffba043dffba048100360435
-0036043dffba043dffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba0481
-003604350036043dffba043dffba02b3003202b3003202b3005f02b3005f
-02b3005f02b3005f02b3003202b3003202b3005f02b3005f02b3005f02b3
-005f02b3005f02b3005f02b3003802b3003802b3004902b3004903e9004a
-03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9
-004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba0692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba08c9003e08c9003e06c5ffba06c5ffba04a7ffba04a7ffba045a
-002a039a00360435ffba0327ffba064f0027064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba064f0027064f00270224
-ffba021affba064f0027064f00270224ffba021affba064f0027064f0027
-0224ffba021affba04a7004604a7004604a7004604a70046093e0032093e
-00320740ffba0740ffba067f0014077600140327ffba041effba04cf002d
-04cf002d0327ffba0327ffba04cf002d04cf002d0327ffba0327ffba04cf
-002d04cf002d0327ffba0327ffba067f0014077600140327ffba041effba
-067f0014077600140327ffba041effba067f0014077600140327ffba041e
-ffba067f0014077600140327ffba041effba067f0014077600140327ffba
-041effba040d0047040d004701a8ffba01a8ffba040d0047040d004701a8
-ffba01a8ffba040d0047040d004701a8ffba01a8ffba040d0047040d0047
-01a8ffba01a8ffba043500450435004501f4ffba01f4ffba043500450435
-00450435004504350045043500450435004501f4ffba01f4ffba04350045
-043500450481003604350036043dffba043dffba024200360300fff7031a
-001a031a001a031a001a0375003203750032037500320375003203750032
-037500320375003203750032037500320375003203750032037500320375
-0032037500320375003203750032051bffba04b5ffba051b003204b50024
-01f4ffba01f4ffba0375003203750032051b003204b5002401f4ffba01f4
-ffba051b003204b50024067f0045067f0045067f0045067f004501a80028
-0000fe290000fea20000ff300000ff1d0000ff120000ff920000fe7e08fc
-003208ad00320000ffb50000ffb60000feed0000ff640000fe7e0000ff9f
-018d000002f6fffd0000fe820000ff1004cd00320000ff580000ff580000
-ff640692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba045a002a039a00360435ffba0327ffba034d007902b400230242
-003601f4ffba0290ffba01f4002f01f4003b01f4001201f400b101f4006d
-067f00140776001401f9009b0000fed902bc000003f2009b045afff504ce
-fff5045a005304ce004a045a005304ce004a045a005304ce004a045a0053
-04ce004a045a005304ce004a045a005304ce004a04350071043500ad045a
-000f04ce000f0473001406110014054000a7047300860540000a0473000a
-05c7005105c700660400005005c7fffd067a00140540004a047300460474
-00480556006e04d5005304e3ffc40639006d04fe000f070c008701c70083
-0239001f055600960400008801c7001504000018072000a405c7ffb80473
-008b0639006006f200630557004406090014047300860556009e0556006b
-0400004f04f20094030b00440239002404e300140239002404e3003005fb
-006105c700a1062e00140400002104e300290400002804e3002904e30031
-045c0044045c003f0473003c0473005503ab003203e50024047300870214
-00bc034e00bc04ac0072023900b00aaa009e09c7009e08640046087f0096
-06aa0096039c008309c7009c078e009c062b0087047300550556fffd0473
-004a0000fefe0556fffd0473004a08000001071d00440639006d0473001a
-0639006d0473004205560096040000880639006304730044063900630473
-004404e30029045c004c01c7ffa20aaa009e09c7009e086400460639006d
-04730042084600a404f2009e05c7009c047300870556fffd0473004a0556
-fffd0473004a055600a20473004b055600a20473004b0239ff8a0239ff64
-023900040239fff60639006304730044063900630473004405c700a102aa
-ffcc05c700a102aa006805c700a10473007605c700a1047300830556005c
-0400003f04e3003002390024045c0051037e001305c700a40473008705a6
-00a404d6005e0486005e04e30029040000280556fffd0473004a055600a2
-0473004b06390063047300440000fefd0639006304730044063900630473
-004406390063047300440556000604000021047300570473004804730086
-04730086040000130400005004730046047300460473005505e9005503ab
-004903ab0032050d0032040f00440239ffb9047300420473004204780050
-0402001904ef00190473008b047300870473008701c7001901c7008901c7
-0089029e0000026e001401c700830493008306aa008406aa008406aa0087
-0473ffa60473008b046c00870473004406530044063f00570466004402aa
-ffe402aaffe402aaffe402aa008502aa008502aa008502aaffe40455008a
-0455008a0400003f01c7ffa20214ffb901c7ff7202cb00000239000f0239
-002404730019048c0044046000880400001a05c700060400001804280019
-0400002804540028045c004c045c00790400002404000050040000240400
-00500639006304400088040f004904780050046b0088032e000004000008
-033b008804730048040000240400005007b7004607400046080b004605b3
-0024036f002405c00024061c0013054a0083050f008303e2001e04380063
-03110064031100640146ffce01eb006401eb000001eb000002ea006403d9
-0000029100000187005a02d7005e01c7008001c7006c01c7008a02aa00fb
-02aa00fb02ca003202ca003204ac007004ac007004ac006504ac006502aa
-012102aa00de02aa005902aa012102aa001d02aa005902aa00de023900b6
-023900b602aa00fb02aa00fb02aa00a602aa00a602aa00a602aa001d02aa
-ffe202aafffb029400000142006402b8003202a0000002ca003203100096
-0310009603100096031000960310009602aa006202aa006202aa002802aa
-001d02aa0047045700960457009604570096045700960457004304570043
-045700430457004304570043031000430457002f0457002f0457002f0457
-002f0457002f0310002f0457002504570025045700250457002504570025
-0310002f0457001a0457001a0457001a0457001a0457001a0310001a0457
-004204570042045700420457004204570042031000420457009604570096
-045700960457009604570042045700420457004204570042045700420310
-00420457002f0457002f0457002f0457002f0457002f0310002f0457002f
-0457002f0457002f0457002f0457002f0310002f04570026045700260457
-002604570026045700260310002604570042045700420457004204570042
-045700420310004204570096045700960457009604570096045700420457
-004204570042045700420457004203100042045700260457002604570026
-045700260457002603100026045700230457002304570023045700230457
-0023031000230457002f0457002f0457002f0457002f0457002f0310002f
-0457004b0457004b0457004b0457004b0457004b0310004b045700960457
-009604570096045700960457004204570042045700420457004204570042
-031000420457001a0457001a0457001a0457001a0457001a0310001a0457
-002404570024045700240457002404570024031000240457002f0457002f
-0457002f0457002f0457002f0310002f0457004e0457004e0457004e0457
-004e0457004e0310004e045700960457009604570096045700960000fec1
-0000fec60000fdac0000fed80000ff920000fee90000ff4c0000fea00000
-fec40000ffce0000ff660000fea00000fed80000fed80000ff970000ff98
-0000ff990000fff40000ff420000ff420000ff440000ff5f0000fe870000
-ffec0000ffa60000ff510000ff510000ff510000fec90000ff1c00000000
-0000fee90000ff4c0000ff930000ff2a0000ff560000ffce0000fe870000
-febb0000fec40000fec40000fed80000fed80000feb30000fec90000fdad
-0000fdac0000feb30000fec90000fdad0000fe160000fee60000ffa60000
-fe870000ff440000feba0000ff230000ff9a0000fdac0000fe8800000000
-0000feb00000ff980000fe930000ffa60000fe870000fdac0000ff660000
-ff440000feb00000feb00000feb00000ff030000ff520000fd1f0000ff53
-0000ff530000ff530000feb50000feb50000ffc30000feae0000fedc0000
-fec70000fec80000fedc0000fe1e0000ff420000ff510000feb70000feb0
-02aa00de02aa005902aa00fa049a008c04600088062e001407aa0000062e
-0014047b004c063f005704cf0044063900630473004405c7006604000050
-04e300a8033b008804ff0000043c0032060d000a049d0042072000a406aa
-0084056500630473008b056400a40400000a0556006b0556006b04e00005
-04c5001905e5005f046e004403b600140347002804cf00440495005b0400
-005001c7ffa2063900600389004d03890050055600a205c000a10473004b
-047800870ab4006d04fe00100639001404e70014079900bf05b500880558
-000b0400001a072e00bf0590008806a10078057b007a086d00bf06f00088
-04d5006603ab001f065f0039058200480639006004730044066d0009050c
-001a066d0009050c001a0b010063091c004406aa005c04e600440987006d
-06d000500000fe370ab4006d04fe001005c7006604000050040700140000
-fea60000febc0000feaa0000fead0000fc2b0000fc4c05c000a104780087
-05400004042b00140556009e04730087055d00a40464008804d5004e03ab
-003204a900040380000005ef002904490028070900a4052f0088091800a0
-06f6008806060066042b005005c700660400005004e3003003aa00260767
-00310587002605550057042b004506e4000a0554000a06e4000a0554000a
-023900bf07630007055afffb055700a1046800860540001204ab001805c7
-00a4046b008805c700a4046b008805550057042b004506aa00980580008c
-02aa002e0556fffd0473004a0556fffd0473004a08000001071d00440556
-00a20473004b060500630473005507630007055afffb04d5004e03ab0032
-04d5004e045c004c05c000a10478008705c000a104780087063900630473
-0044063900600473004405c0004a0415002b0515000a040000210515000a
-040000210515000a0400002105550057042b0045071500a805c0008b0540
-004a0473004607bf004a0703004607a6006606860053054d006604130053
-07c3001207470018084600a4070700880639006d0478005005f900300553
-00260000ff430000fec90000ff770000ffb00000ff470000ff560000ff74
-0000fed70000feac000000000000ff520000ff56000000000000feac0000
-fd9a000000000000ff6a0000ff7c0000ff690000ff560000feac0000ff7f
-0000ff560000fdef0000ff430000ff690000ff7c000000000000fdae0000
-ff8c000001020000fefe0000fefe0000fedf0000fedf0000ff580000ff20
-0000fefe0556fffd0473004a055600960473008605560096047300860556
-00960473008605c700660400005005c7009e0473004605c7009e04730046
-05c7009e0473004605c7009e0473004605c7009e04730046055600a20473
-004b055600a20473004b055600a20473004b055600a20473004b055600a2
-0473004b04e300a8023900130639006d0473004205c700a40473008705c7
-00a40473008705c700a40473008705c700930473006805c700a404730087
-0239ffdf01c7ff9202390020023900060556009604000088055600960400
-008805560096040000880473009601c7007e0473009601c7ffb904730096
-01c7ffa50473009601c7ffa306aa009806aa008706aa009806aa008706aa
-009806aa008705c7009c0473008705c7009c0473008705c7009c04730087
-05c7009c0473008706390063047300440639006304730044063900630473
-004406390063047300440556009e047300870556009e0473008705c700a1
-02aa008505c700a102aa008505c700a102aa005e05c700a102aa00260556
-005c0400003f0556005c0400003f0556005c0400003f0556005c0400003f
-0556005c0400003f04e300300239002404e300300239002404e300300239
-ffff04e300300239000e05c700a10473008305c700a10473008305c700a1
-0473008305c700a10473008305c700a104730083055600090400001a0556
-00090400001a078d001905c70006078d001905c70006055600090400000f
-055600090400000f055600060400002104e300290400002804e300290400
-002804e3002904000028047300870239000305c70006040000210473004a
-01c7008904a0004804a0004804a0004804a0004804a0004804a0004804a0
-004804a000480556fffd0556fffd06820013068200130682001306820013
-068200560682005603910062039100620391006203910062039100620391
-0062061e0000061e0000076c0000076c0000076c0000076c00000473008b
-0473008b0473008b0473008b0473008b0473008b0473008b0473008b068f
-0000068f0000081f0000081f0000081f0000081f0000081ffff3081ffff3
-01c7008101c7008101c7ff9b01c7ff9b01c7ffeb01c7ffeb01c7ffa201c7
-ffa20301000003010000049100000491000004910000049100000491fff3
-0491fff3047300440473004404730044047300440473004404730044069d
-0000069d0000082d0000082d000007c9000007c900000460008804600088
-0460008804600088046000880460008804600088046000880682000007ae
-00000812000007ae0006063f0057063f0057063f0057063f0057063f0057
-063f0057063f0057063f0057065f0000065f000007ef000007ef0000078b
-0000078b0000078bffff078bffff04a0004804a000480391006203910062
-0473008b0473008b01c7ffe601c700680473004404730044046000880460
-0088063f0057063f005704a0004804a0004804a0004804a0004804a00048
-04a0004804a0004804a000480556fffd0556fffd06820013068200130682
-00130682001306820056068200560473008b0473008b0473008b0473008b
-0473008b0473008b0473008b0473008b068f0000068f0000081f0000081f
-0000081f0000081f0000081ffff3081ffff3063f0057063f0057063f0057
-063f0057063f0057063f0057063f0057063f0057065f0000065f000007ef
-000007ef0000078b0000078b0000078bffff078bffff04a0004804a00048
-04a0004804a0004804a0004804a0004804a000480556fffd0556fffd0556
-fffd0556fffd0556fffd02aa00e502aa00fd02aa00e502aa000602aa0006
-0473008b0473008b0473008b0473008b0473008b068200000682000006f3
-000006f3000005c700a402aa001302aa001302aa000601c7ffbb01c7ffab
-01c7ffca01c7ffca01c7ff9301c7ff930239001a0239fff5036500000365
-000002aa001302aa001302aa000604600088046000880460008804600088
-048d0083048d00830460008804600088055600060556000606e600000718
-0000061e000002aaffea02aaffea02aa0059063f0057063f0057063f0057
-063f0057063f005707650000069d000007270000065f000005fb006102aa
-00de02aa00e50473000d05c7006605c7006606aa008705c70024095000a1
-078d00190556001f04e30030080000290400003004c100660000ff530000
-ff530000ff530000ff5301c7001901c7ffa2042b00050556001105740046
-02cbffa3057a008702f0ffc8057f000a057f000a02aa008402aa008402aa
-00c902aa00c902aa00a002aa005902aaffaf02aa003a02aa0006023900b9
-02aa00a902aa00a902aa00a902aa00a9032e001e032e001e02aa003a0000
-ff730000ffa50000fed80000ff230000ff720000ff720000fee70000ffa5
-0000ff530000ff530000ff530556009e0473008703f8001905fb0019071d
-00440440001904000050046900870469001903eb008703ab003201c70088
-0361004104000088033600100580008c04780087047300440400001304de
-004404de004404de000d078d005003a800440473004404730044042b0084
-0455001f0455001f03aa00260460008804c6004405de004404c600440400
-001a05c700060400002803ab0032036b003f04db001f02eb00880400001a
-04550088042b008405b4007a04ab001803a00000054f0000035100320351
-ffd103980032034800320348003203f80032036e0032015600690284002d
-0366003202d000320415003203710032036f003204180032030f00320359
-0032039c003203760031036f003204fb000002fa003202fa003203040032
-04cc0032030500640305003202f9003202f90032028c0032028c00320304
-00320142006402b6006404950064030f00640305003202d5003203050032
-030500320306006401c20032030f00640342003204950064029200000320
-00000315006402920000030600320385003202bf00000142006401eb0064
-030f0064029200000315006402920000030900320385003202bf000005ed
-00460a660046061300460689ffba0541ffba01e9003c045a00110000ff0d
-0000ff350000fece0000feb70000fec90000ffcf0000ff4f0000ff9e0000
-feca02b3005f02b3005f03e9004a03e9004a039affba0327ffba039affba
-0327ffba05ad0069053d002d05fd009604dc005004e0003c05f6009b053f
-00280650002804ac00720000fe3b0000fe660000fe660473fffc02aa0053
-02d5ffce01a8ffba01a8ffba01a8ffba01a8ffba0658001509c500470400
-000008000000040000000800000002ab0000020000000155000004730000
-02390000019a000000ab00000000000005e5000305c7006606aa00980580
-008c0744008307180046071800480556fffd05c70066040000140473000a
-04e300300400004f0400002804a5001d000001020000ff420000febf0000
-ff3a0000ff53048d000a05c7005105c7006605c70051045500a102eb0088
-0000ff430000ff040000ffac02d200960000ff37021affba0250001e0000
-ff3a0000ff5b0000ff5f0000ff7e0000ff940000ff4a0000fe9c05b5003a
-05b5003a01f4ff9601f4ff9605b5003a05b5003a01f4ffba01f4ffba05b5
-003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba
-05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba0481003604350036043dffba
-043dffba0481003604350036043dffba043dffba02b3003202b3003202b3
-005f02b3005f03e9004a03e9004a0692003e0692003e043fffba043fffba
-045a002a039a00360435ffba0327ffba045a002a039a00360435ffba0327
-ffba045a002a039a00360435ffba0327ffba064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba067f0014077600140327
-ffba041effba067f0014077600140327ffba041effba067f001407760014
-0327ffba041effba02b4002302b400230327ffba0327ffba02b4002302b4
-00230327ffba0327ffba043500450435004501f4ffba01f4ffba04350045
-0435004501f4ffba01f4ffba043500450435004501f4ffba01f4ffba040d
-0047040d004701a8ffba01a8ffba03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0473ff93047300460239ffbf06aa
-ffd50473ffb70473ff9102aaffa402aaffa40400ffff0239ffb904000028
-04730089030b0064047400480649002401c7001901c700190473001e0460
-001e048c000a04730086047300460239001305b400420400008801c7fffc
-06aa00870473008b0473008702aafffb0400003f0318ffa20400001a0400
-000f040000280473004a04730048047300460473004b03ab004903ab0032
-0534005501c700880400001301c7ffa204730083045c004c0304006402d5
-003202c9003302fc0032028c003201d5003201d500000304003203110064
-01420019014200640142006401420019022a000001420064014200090233
-00640493006404930064030fffc9030f0064030e00640305003203000032
-02b800320142ffca01c20032030f001d031a00320306006402d400640292
-000002de003202de003202de003202f4003202ea00320000febc0000febc
-0000ff730000fea9023900b902fa003202f900320305003202a0000002f9
-00320639006d0556fffd0473000f05c7006602aa004104a0004804a00048
-04a0004804a0004804a0004804a0004804a0004804a0004801c7ff9b01c7
-ffab01c7ff9b01c7ffab01c7ff9b01c7ffbb01c7ff9b01c7ffbb04600088
-0460008804600088046000880460008804600088046000880460008801c7
-ffab01c7ffab01c7ffbb01c7ffbb04600088046000880460008804600088
-045a005304ce004a03a000130556001105c700290558000b055600a20473
-004b0400003301c7ffa205e600630473004805c7000002aa000f05560006
-0400002104000013040000500400001301c700830455fffd02eb00010556
-00090400000f055600090400000f04d5005303ab00490540001204ab0018
-0000fec60000fed40000fec60000fed40000fe5f0000fe5f0000ff720000
-ff730000fee7078b000a03eb004c040000130473000a01c700150473fff4
-0556001105c700a1047300190239ff8b05c700a404730087055600960400
-008804e30029040000280400003b049e00a403670088053000480000ff53
-0000ffbc0000fefe0000fefe0000fea40000fea401c70088000000000000
-002a0000002a0000002a0000002a000000d60000017e00000320000005a6
-0000074e000009380000097e000009fe00000aa400000b8400000bec0000
-0c6400000caa00000ce600000d5600000f1200000fee00001218000013f2
-000015520000170c000018e20000198e00001c2200001e5600001eb20000
-1f7000001ff200002062000020e8000021da000023da000025840000271c
-000028560000299e00002a6200002b1800002ca800002dae00002e920000
-2f7a000031b00000323a000035640000370e000038420000394800003b3c
-00003da800004052000041000000422400004398000045d6000048e20000
-4a8800004bc800004c3200004c9c00004d0000004d8800004dbc00004e38
-0000510a000052e80000549c000056500000580e0000596200005b520000
-5cf600005dea00005f020000619a00006296000064c60000668c0000684e
-00006a1200006ba800006cae000070560000717a00007318000075360000
-79a000007bc400007e1c00008004000081020000814e00008250000082f0
-0000833c00008370000083ac000083ee000084540000849a000084ce0000
-85040000853a0000858a000085cc0000861e00008656000086a8000086de
-0000871e000087600000879e000087e800008828000088560000888e0000
-88de00008914000089540000898e000089d200008a1c00008a5800008a88
-00008acc00008b0400008b9400008c1a00008e2800008fbc0000916c0000
-91b80000924c00009470000096c4000098b4000099a000009a2200009a8c
-00009baa00009d0600009f4e0000a0b00000a13e0000a1e80000a2ac0000
-a3f40000a59e0000a68c0000a7520000a7b60000a8240000a94e0000aa72
-0000ab020000ace40000af3e0000b2900000b3860000b42c0000b47c0000
-b5320000b6520000b7f00000b88a0000b94e0000ba0e0000ba760000bab2
-0000bb0a0000bb580000bd700000bfb60000bfee0000c0200000c14a0000
-c2760000c3240000c3c80000c46a0000c53c0000c5900000c5c60000c61e
-0000c7700000c7e20000c83c0000c9b40000cb200000cc000000cc320000
-ccce0000cdf20000d0680000d0a20000d0e60000d1220000d1840000d1c6
-0000d20c0000d2580000d28a0000d2de0000d31c0000d34c0000d38a0000
-d3d00000d4120000d4500000d4d20000d5400000d6260000d6620000d6e2
-0000d7160000d7b80000d8400000d8ac0000d90e0000d97a0000da660000
-db580000db8c0000dbc00000dbf00000dc340000dcac0000de260000e040
-0000e0720000e0ac0000e1a60000e3340000e36a0000e4ce0000e54a0000
-e62a0000e7200000e8b00000ea1a0000ec080000ed040000ed4a0000ed7e
-0000edc00000edfa0000ee4e0000ee960000eee00000ef100000ef400000
-f1280000f1660000f18e0000f1be0000f1f20000f2180000f23e0000f286
-0000f43c0000f5b60000f5dc0000f6020000f6460000f6760000f6a60000
-f6fc0000f7da0000f8ec0000f9300000f9660000f9c00000f9fe0000fa32
-0000fa620000fa9e0000fade0000fb1c0000fb580000fb9a0000fbd00000
-fc0c0000fc4c0000fc720000fc960000fce60000fe420000fe980000fecc
-0000ff1a0000ff660000ffa80000ffe0000100160001005e000101000001
-029c00010464000105e6000107d80001092a00010aae00010b9000010d2a
-00010d9400010dbc00010e5a000110dc0001111c0001115c0001119c0001
-11da000112380001129600011304000113240001140e000114ae000114e4
-000115320001157c000115c6000115e2000115fe0001161e0001163e0001
-165e0001167e000116a4000116ca000116f000011716000117460001176e
-00011796000117c2000117ee000118220001184c00011878000118ae0001
-18d8000119040001193a000119640001198e000119c2000119f200011a26
-00011a6a00011a9a00011ace00011b1000011b4400011b7600011bb80001
-1bec00011c1c00011c5e00011ca200011ce800011d4400011d6000011d7c
-00011d9800011db400011dd000011f3e000121ea0001245a000124760001
-2490000124ac000124c8000124e4000125000001255c0001259600012600
-000126ca0001276a00012840000128c000012948000129b800012a4e0001
-2aac00012af200012b5000012bb200012c6a00012d2800012d5400012db0
-00012df400012f60000130540001307e0001309a000130c6000130fe0001
-314a0001318a000131be000131ee0001321e0001324e00013292000132c2
-000132f2000133320001336200013392000133c200013402000134320001
-346200013492000134b8000136bc000136ec0001371c0001386c00013a22
-00013a5200013a8000013ab000013ade00013b0e00013b3c00013b600001
-3b8400013bb400013d2400013d5c00013d8c00013f1e00013f4c00013f7a
-00013fa800013fd00001412e000142c6000142fe0001433e0001437a0001
-43aa000143d8000143f4000144240001445400014544000146ac000146dc
-000147160001475600014786000147b6000147f80001481e000148440001
-4884000148c4000148f40001493400014a1e00014a9e00014b8200014bb2
-00014be200014c1200014c4200014c7e00014cb000014ce200014d120001
-4d4200014d8800014dba00014dea00014e2000014e9200014ec600015094
-000151960001532600015556000157a6000159380001599c00015a260001
-5a3600015ac400015cc200015dee00015f5a0001604a000161ce000163e8
-000166140001670600016716000167260001683e0001684e0001685e0001
-686e0001687e0001688e000169ac000169bc000169cc00016a4000016a50
-00016b2000016b3000016c4200016c5200016c6200016c7200016dd00001
-6fae00016ff0000170260001705c0001708c000170bc0001711000017138
-000172c20001740a0001755e000176c60001784a000178ae00017a400001
-7b5c00017b6c00017b7c00017d0200017d1200017e7800017fd200018106
-00018264000183d200018598000185d800018610000186460001866c0001
-869c000186c200018838000188680001899e000189ae000189be00018a00
-00018a1000018ba400018d5000018eda00018f0200018f320001908e0001
-909e000191d6000191e600019280000193e0000193f000019656000197e0
-000199480001997800019aee00019c2000019c3000019c4000019c500001
-9d2a00019d3a00019d4a00019d5a00019e5200019fcc00019fdc0001a104
-0001a2380001a38a0001a51e0001a63c0001a7c80001a8da0001a9100001
-ab460001abe60001abf60001ad8c0001af2e0001afb20001b1340001b144
-0001b3ac0001b52c0001b6ac0001b6dc0001b87c0001ba020001bbc60001
-bcf20001bd020001be320001be420001be520001bf120001bf220001c108
-0001c1180001c24e0001c35c0001c5080001c6be0001c8000001c9700001
-cab80001cb0a0001ccec0001ce680001cea60001d04c0001d0700001d1b0
-0001d1c00001d1d00001d2080001d2180001d3a40001d50c0001d6800001
-d6a40001d6d40001d8420001d8f40001d9b20001d9e00001db960001dc8e
-0001dd1c0001de420001def00001dfc40001e00e0001e0860001e1460001
-e16e0001e1b20001e2080001e2e40001e32e0001e3620001e38a0001e3b2
-0001e3e60001e42a0001e46e0001e4ac0001e5ea0001e6a20001e7c20001
-e8380001e9060001e9580001e9ea0001ea9a0001eb8e0001ebe20001ec78
-0001ed360001ee200001eed20001eff20001f0440001f0ee0001f2240001
-f2fc0001f3e20001f4e80001f5ce0001f6b00001f7a40001f8420001f948
-0001fa420001faba0001fb320001fba80001fbde0001fc3a0001fd020001
-fd8e0001fdc60001fe0c0001fe3c0001fea60001ff660001ff9a0001ffca
-0001fffe0002002e0002005e0002008e0002022e00020266000202a60002
-02de00020316000203b2000204ac000204dc00020580000205ae000205ee
-0002063e0002066e000206ba00020852000209b800020b1800020b5e0002
-0bb200020bea00020d5c00020d9200020e2400020e6200020e9000020ece
-00020ffe0002102600021162000211f20002129c0002131e000213da0002
-14f20002160000021634000216ba0002181600021898000218e2000219ec
-00021a3400021b3800021bb400021c0c00021c9000021d7a00021e900002
-1f8c0002203600022126000221f8000222e2000223ca0002247a000224fc
-0002275a00022784000227ae0002286600022890000229d200022ad80002
-2bc200022bec00022c1600022c4000022c6a00022c9400022e1400022e3e
-00022e6800022e9200022ebc00022ee600022f1000022f3a00022f640002
-2f9800022fc200022fec0002301600023190000231a0000232ba000232ca
-000232f40002331e00023348000233720002351c00023738000238660002
-3876000239f200023a0200023b4800023d1400023e1a00023f9a0002413a
-0002435e000244b80002469a000247de0002490c000249fa00024a240002
-4a4e00024a7800024aa200024acc00024af600024b2000024b4a00024b74
-00024b9e00024bc800024bf200024c1c00024c4600024c7000024eac0002
-50280002516c000253540002549c000254c6000254f00002552000025550
-000255a0000255f000025630000256a2000256f600025754000257aa0002
-57e00002582200025868000258b2000258e20002591a0002594a00025a82
-00025dc800025df200025e1c00025e4600025e7000025e9a00025ec40002
-5eee00025f1800025f4200025f6c00025f9600025fc000025fea00026014
-0002603e0002606800026092000260bc000260e6000261100002613a0002
-61640002618e000261b8000261e20002620c0002623600026260000262fe
-000263140002633e0002661e0002662e000267480002686a000269a80002
-6aea00026c9000026ca000026de200026f3200027122000272f60002740e
-0002741e000274a00002752e0002762e0002763e000276de000276ee0002
-78040002795600027a8600027a9600027b6400027b7400027cea00027cfa
-00027e0e00027e1e00027f52000280e8000281a4000281b4000282b20002
-840c00028498000284a8000285d20002875e0002881a0002882a000288c6
-000288d6000289a4000289b400028a8c00028a9c00028ba400028bb40002
-8d7a00028d8a00028ee200028ef20002915c0002916c0002936600029376
-000294e0000294f0000295e0000295f00002978800029798000298b60002
-98c600029a0600029a1600029a2600029a3600029bae00029bbe00029bce
-00029bde00029d3000029e7e00029f4c0002a0300002a1b00002a3320002
-a4320002a5460002a68a0002a69a0002a7880002a8620002a9fe0002aa0e
-0002ab2c0002ac320002ae300002ae400002ae500002ae600002afaa0002
-afba0002b0720002b0820002b1900002b1a00002b28c0002b29c0002b3ba
-0002b3ca0002b4680002b4780002b4880002b5760002b6ea0002b8160002
-b9100002b9200002b9300002b9400002bade0002bc980002bd660002bd76
-0002bfd60002c21c0002c4a20002c7060002c98a0002cbfc0002cdcc0002
-cf820002cfac0002cfd60002cfe60002cff60002d0200002d04a0002d074
-0002d0840002d0940002d0be0002d0e80002d0f80002d1080002d1320002
-d15c0002d1860002d1960002d1a60002d1b60002d1c60002d1d60002d1e6
-0002d2100002d2200002d2300002d25a0002d2840002d2ae0002d2d80002
-d3020002d32c0002d3560002d3800002d3aa0002d3d40002d3fe0002d428
-0002d4520002d47c0002d4a60002d4d00002d4fa0002d5240002d54e0002
-d5780002d5a20002d5cc0002d5f60002d6200002d64a0002d6740002d69e
-0002d6c80002d6f20002d71c0002d7460002d7700002d79a0002d7c40002
-d7ee0002d8180002d8420002d86c0002d8960002d8c00002d8ea0002d914
-0002d93e0002d9680002d9920002d9bc0002d9e60002da100002da3a0002
-da640002da8e0002dab80002dae20002db0c0002dbac0002dbf00002dc66
-0002dc900002dcba0002dce40002dd0e0002dd380002dd620002dd8c0002
-ddb60002dde00002de0a0002de340002de5e0002de880002deb20002dedc
-0002df060002df300002df5a0002df840002dfae0002dfd80002e0020002
-e02c0002e0560002e08a0002e0be0002e0f20002e2840002e4200002e5bc
-0002e7480002e78e0002e7d40002e8420002e89e0002e8f00002e9600002
-ea380002eb040002ebdc0002eca80002ed480002ee620002ef160002ef98
-0002eff20002f0320002f1500002f29a0002f4320002f48e0002f4ec0002
-f5480002f5a40002f6580002f70e0002f7ba0002f8660002f9120002f9ca
-0002fa820002fb3a0002fb4c0002fb5e0002fb700002fb820002fb940002
-fc020002fc700002fd280002fd3a0002fd4c0002fd5e0002fd6e0002fd80
-0002fd920002fda40002fdb60002fdc80002fdda0002fe880002ff340002
-ffe20003008e00030126000301600003018a000301b4000302080003025a
-000302d6000303200003039c000303f000030474000304c60003053c0003
-0594000305fa00030650000306aa0003072800030774000307d200030836
-00030884000308d20003092a000309720003099c000309ca000309f00003
-0a2400030a5400030a8400030ad600030b4400030b9a00030c0e00030c62
-00030cd600030d1c00030d8400030dca00030e2600030e5600030e900003
-0eb600030ee600030f0c00030f3200030f6400030f9400030fe60003104c
-000310a2000311080003115c000311ca0003120c0003126c000312ae0003
-12fa0003133400031370000313aa000313e60003141a0003144c0003147c
-000314ac000314d6000314fc00031526000315540003157e000315ca0003
-160e0003164400031680000316b4000316e200031720000317500003178a
-000317b4000317e2000318080003182e0003185a000318b6000318e60003
-1916000319460003197e000319b2000319e000031a1000031a4000031a70
-00031aa000031ad400031b2a00031b5e00031bbe00031bf200031c4a0003
-1c7e00031cda00031d7800031e4600031f660003202e000320be00032154
-000323400003253c000326b400032830000329da00032b8c00032c740003
-2daa00032ea200032fb4000330d20003320800033372000334e000033676
-000337f2000339020003391200033a3e00033b7a00033cbc00033e400003
-3f1a00033f9000034046000340ec0003425c000342940003430e000343d0
-0003448a000344f2000345f80003472e000347fa00034958000349d20003
-4a4c00034b1800034bd200034c8600034ce200034d3c00034d8400034df4
-00034e7000034eba00034ef400034f3a00034f7e00034fd0000350220003
-50a40003512600035168000351a8000351de000352140003524200035270
-000352a4000352d80003531a0003535c00035398000353d40003540e0003
-54480003547a000354ac000354de000355100003554a00035584000355c6
-000356080003564a0003568c000356da000357280003576a000357ac0003
-57ec0003582c00035866000358a0000358ec0003593800035976000359b6
-000359fc00035a4200035a7e00035ad400035b1000035b4c00035b8c0003
-5bcc00035c0800035c4400035c8400035cc400035d0800035d4c00035da0
-00035e2e00035e7000035eb200035f1a00035f8200035fb400035fe60003
-601e00036056000360ec00036182000361cc00036216000362520003628e
-000362e40003633a00036384000363ce000364260003647e000364be0003
-64fe000365360003656e000365b800036602000366400003667e000366c0
-0003670200036756000367aa000367f0000368360003687c000368c20003
-69180003696e000369c400036a1a00036a6600036ab200036afe00036b4a
-00036bbe00036c3200036ca600036d1a00036d5800036d9600036dd40003
-6e1200036e5000036e8e00036ed200036f1600036f6200036fae0003700e
-0003705a00037098000370e6000371f60003724600037296000372ce0003
-73060003735c000373b2000374260003748a000374cc0003750e00037564
-000375b2000375fe0003764a0003768a000376ca000377120003775a0003
-77c6000378200003785800037890000378d000037910000379e000037adc
-00037b9c00037c8a00037ce000037d3600037d8800037ddc00037e400003
-7ea400037efa00037f5000037fc60003803c0003807e000380c000038102
-0003814400038186000381c80003821e00038274000382c60003831a0003
-83a200038424000384c400038566000385a4000385e2000386200003865c
-0003869a000386d80003871600038752000388360003892200038a380003
-8b5400038c1e00038ce800038de200038edc00038fda000390d8000391f6
-000393140003943a000395600003966200039764000397f6000398880003
-98c6000399040003995e000399b8000399f000039a2800039b3800039b48
-00039b9000039bd800039c3000039c8800039cba00039cec00039d2e0003
-9d7000039daa00039de400039e2800039e6c00039ee400039f5e00039fee
-0003a0320003a0720003a0f40003a1760003a2ce0003a2de0003a32c0003
-a37a0003a3b60003a3f20003a4380003a47e0003a4cc0003a51a0003a56a
-0003a5ba0003a6160003a6720003a7e80003a9500003a9880003a9c20003
-aa0e0003aa5a0003aaac0003aafe0003ab500003aba60003abe20003ac1e
-0003ac740003acc80003ae000003aea00003aeee0003af2e0003af680003
-b0fe0003b3820003b4460003b5dc0003b73a0003b8080003b9ae0003bc02
-0003be3a0003be800003beb20003bf5c0003c0800003c0a40003c13e0003
-c24a0003c35a0003c46a0003c5780003c6fe0003c7300003c7d20003c7fa
-0003c85c0003c8be0003c9200003c9820003c9c00003c9fe0003ca380003
-ca720003ca9e0003caea0003cb240003cb5e0003ccba0003ce0e0003ce1e
-0003cedc0003d0120003d0700003d1880003d3160003d3bc0003d5020003
-d5400003d57e0003d5bc0003d6100003d6380003d6920003d6f60003d73e
-0003d7a00003d8000003d8720003d8ee0003d96a0003d9ec0003da780003
-db040003db8e0003dc0e0003dc480003dc840003dde80003deb20003dee2
-0003df120003e04a0003e19a0003e1aa0003e2980003e36c0003e4640003
-e55a0003e6dc0003e8360003e8460003e95e0003ea0a0003eb4c0003eca2
-0003ecfe0003ee5c0003eeea0003f0900003f2020003f3160003f34e0003
-f3b20003f5620003f6cc0003f72e0003f8960003f99c0003fa520003fafe
-0003fc260003fd140003fdf40003ff34000400600004017a000402ea0004
-046400040474000405540004064a000406fa000407f6000408a2000409ac
-00040a9800040bc200040ce600040dea00040f1800041056000411c20004
-12f80004148c000416340004172c000418400004197200041a6400041a9c
-00041af200041ba000041bb000041c1200041c6e00041cd400041d200004
-1d6000041d9800041dc400041df200041e2c00041f6200041f960004201a
-000420d00004210000042184000421b4000421ec00042384000425100004
-255a00042594000425ea000426360004265c00042682000426c400042706
-0004274800042778000427b0000427e60004281c0004285e0004288e0004
-28be000429b400042ab800042aec00042b2400042b6a00042b9e00042bce
-00042c0600042c3a00042c6e00042c9e00042cce00042d0400042d3a0004
-2d6a00042d9a00042dce00042e0200042e3200042e6200042e9c00042ed0
-00042f0200042f3400042f6800042f9c00042fcc00042ffc0004302a0004
-305800043166000432d2000434060004353a0004356a000435a40004363e
-000437a800043904000439c800043adc00043b0c00043b4000043c380004
-3de800043e4000043eb800043ff400044032000440a4000440d400044104
-0004413e000441c6000441f600044226000443b6000445000004460c0004
-471a000448460004499c00044af800044c5800044d9200044f0400045064
-000450740004522a00045352000453ec0004557400045584000456800004
-58060004595e00045a1000045ae000045bec00045c9600045cce00045cde
-00045d8e00045e3400045eb000046000000460f4000461ea000462f60004
-63ce000464a80004653c0004664e000467de000468fc000469f200046a9c
-00046b4600046c1000046cb800046d8e00046e0a00046e6600046fc80004
-70fc000472980004735a0004745a00047532000476700004771c000477e6
-000478d6000479fc00047ad800047bde00047d1600047e0600047ea40004
-7f960004810600048250000484bc0004858e000486420004871000048804
-000489420004895200048a8600048b9800048ba800048cb400048de40004
-8e3800048fac000490d4000491e80004939a000495ae00049842000499fc
-00049b2800049d0800049eca0004a05c0004a1280004a2c40004a33a0004
-a3e80004a4c40004a5500004a5f20004a6940004a7780004a8b00004ab0c
-0004ac540004ac640004ac740004acd60004ad340004ad960004ae340004
-aecc0004afd00004b0be0004b0ce0004b0de0004b1780004b2120004b24e
-0004b2ca0004b33e0004b3940004b3c80004b44e0004b4da0004b5520004
-b5b00004b64a0004b6dc0004b75c0004b7de0004b8720004b8a60004b908
-0004b9ba0004bb800004bbb80004bd940004bea80004beb80004beee0004
-bf320004bf760004bfba0004bff00004c0220004c0640004c1000004c156
-0004c1fc0004c2740004c2fa0004c36a0004c3cc0004c4520004c4b20004
-c51c0004c5900004c6000004c65e0004c7040004c79c0004c8080004c898
-0004c8f60004c9640004ca0c0004cab80004cb4e0004cbb80004cc3a0004
-cc9e0004cd4a0004ce020004ceae0004cf3c0004cf980004d0040004d05a
-0004d0dc0004d15a0004d1e00004d26c0004d2c60004d3320004d3a20004
-d4120004d4820004d5060004d5960004d5fc0004d6760004d6f20004d76a
-0004d8100004d8ac0004d93c0004d99a0004da380004dab40004db460004
-dbe80004dc920004dd2a0004dd860004dddc0004de440004deea0004df92
-0004e05c0004e1020004e1640004e1bc0004e21c0004e2aa0004e3300004
-e3be0004e41e0004e4820004e4ec0004e5540004e5bc0004e63a0004e6c2
-0004e7560004e7c20004e82a0004e88e0004e9360004e9f00004ea9e0004
-eb2c0004eb8a0004ebf60004ec660004ed0c0004edb60004ee780004ef1a
-0004ef7e0004f00e0004f0800004f1100004f18e0004f20a0004f2760004
-f3040004f3600004f3be0004f4440004f4c00004f5280004f58c0004f5e0
-0004f64e0004f6b60004f7340004f7aa0004f8240004f8a40004f9000004
-f9660004f9ca0004fa6a0004fb0c0004fbc20004fc720004fcce0004fd46
-0004fda40004fe2e0004fec60004ff560004ffbc0005001a000500a80005
-011a000501ae00050246000502b6000503260005039e000503fc0005045c
-000504d60005053000050590000505ea00050646000506ae0005073c0005
-0772000507aa0005083600050860000508a20005093600050a2400050ab4
-00050aea00050b3a00050bac00050c5800050cea00050d4200050d9c0005
-0df400050e4e00050ed200050f5800050ffc000510a4000510e200051152
-000511e60005127e00051314000513be000513f000051440000514940005
-14da0005157e000516080005168e000516ee000517320005178000051820
-000518b000051950000519f600051a9c00051b6000051b9200051bbc0005
-1c4200051cf200051d2400051d4c00051e1a00051e7800051f1200051f60
-00051fc60005206e000520dc00052142000521ce00052240000522b60005
-236a000523c40005243400052470000524c200052548000525a80005264c
-0005272c00052854000529e400052a4000052a9600052dbc00052e560005
-2eb200052efa00053068000531ba000532000005330e000533a6000534b4
-000535be0005366000053748000537da000538760005396800053a680005
-3ae400053b6a00053bb200053d2400053e8000053f6400053fb400053fe8
-000540d6000541fe00054398000544c8000545de000547120005482e0005
-489c0005493000054a7000054b2600054c9000054dc000054ef20005501e
-000550ca0005519000055262000553bc0005553c0005566c000557880005
-594200055a9400055b8000055c5c00055d1e00055e8800055fd800055fe8
-00055ff800056008000560c000056176000561b2000561e8000562200005
-6256000563e2000565f6000566e0000567f80005697000056ade00056bc8
-00056cfa00056e4200056fc800057166000572ba000574a80005766e0005
-78a400057af200057bda00057cb600057dfe00057f800005806800058182
-000581c40005820e0005842a000586420005878e0005890400058b620005
-8d6400058de800058e1800058e6400058f2c00058ffc0005919000059218
-00059280000592c0000592fe000594b0000596e000059816000599f80005
-9ad400059bee00059d9a00059fa60005a0a80005a1940005a3860005a58e
-0005a6fa0005a87e0005a9de0005ab4c0005abda0005ac6a0005ad840005
-ae900005b0520005b1be0005b3ae0005b5780005b60c0005b6a80005b73e
-0005b7c60005b8ac0005b9840005bb1e0005bcb00005bcd60005bcfc0005
-bd0c0005bd3c0005bd6c0005bee60005c0880005c1320005c2140005c2d4
-0005c37e0005c4180005c4fa0005c5b80005c6940005c84a0005c9840005
-ca100005ca400005ca700005caa40005cad80005cae80005caf80005cb28
-0005cb580005cb8c0005cbc00005cbf40005cc280005cc5c0005cc900005
-ce0a0005ce1a0005ce4a0005ce7a0005ceb20005cee60005cf1a0005cf4e
-0005cf820005cfb60005cfea0005d0220005d0580005d0880005d0c80005
-d1000005d1480005d18e0005d1c20005d1f60005d2300005d2680005d308
-0005d3180005d46a0005d6320005d7d80005d9820005dace0005dbe40005
-dcf20005de080005df020005dfea0005e10c0005e2080005e2e00005e3d0
-0005e48c0005e53e0005e6080005e67a0005e7200005e7b00005e8140005
-e9220005e9880005ea360005eb2c0005eb940005ebfc0005ecac0005ee86
-0005ef8a0005f00a0005f0480005f0f40005f1820005f26a0005f3020005
-f3680005f4660005f5280005f5e20005f6200005f6b00005f7b20005f846
-0005f88a0005f9a80005fad20005fcb40005fe760005ffac000600da0006
-01da000602020006022a0006026000060292000602be000602e60006030e
-0006033c0006039a000604080006044000060478000604a8000604ce0006
-0502000605380006055e00060584000605b2000605e00006060c00060682
-000606aa0006070c00060732000607580006077e000607a4000607d40006
-0804000608340006086e0006089e000608d400060904000609360006095c
-00060982000609b6000609ec00060a1c00060a4c00060a7200060a980006
-0abe00060aec00060b2000060ba600060bea00060c2400060c5800060c9c
-00060cd600060d1000060d3600060d6000060dac00060dee00060e140006
-0e4200060e6800060e8e00060ece00060f0000060f3000060f6000060f86
-00060fac00060fdc0006100c00061032000610580006107e000610a40006
-10ca000610f000061118000611a0000611ca0006123e00061266000612dc
-000613040006136600061398000613ca000613fa00061432000614640006
-1492000614cc000614f40006155400061596000615c6000615f200061622
-000616520006167a000616a2000616ca0006172c00061754000617b20006
-17f60006183a0006186a000618a0000618c6000618ee000619140006193c
-000619620006198a000619b2000619dc00061a0200061a2800061a4e0006
-1a8000061aa800061b2e00061b5800061bc200061bf200061c2200061c48
-00061c6e00061cc600061cf600061d3200061d5c00061d8c00061dbc0006
-1df000061e2400061e5400061e9400061ece00061f1600061f3c00061f62
-00061f8800061fae00061fd4000620140006205400062090000620c00006
-20f0000621200006215000062188000621c000062200000622400006227a
-000622b4000622f00006232e00062378000623c2000624080006244e0006
-2490000624d20006250200062532000625660006259a000625d40006260e
-0006265a000626a6000626fe00062756000627ae0006280c0006283c0006
-286c000628a2000628d80006290e0006294a0006297e000629b200062a06
-00062a5a00062aae00062b0200062b5600062baa00062c0200062c5a0006
-2c8800062cb600062ce800062d1a00062d6000062da600062dd800062e0a
-00062e5c00062eb400062ef800062f3c00062f8000062fc4000630180006
-306c0006309c000630cc000631020006313800063176000631bc00063210
-0006325a000632ac000632fe0006335e000633be000633ee000634200006
-345a00063494000634e60006353a00063584000635cc0006360e00063678
-000636c6000637120006374400063776000637aa000637de000638140006
-384a00063888000638be000638f00006392c00063982000639d800063a36
-00063a9400063aea00063b4000063b7400063ba400063be800063c1e0006
-3c4e00063c9200063cd000063d0800063d4000063d7600063db200063de2
-00063e1e00063e5e00063ea400063eee00063f3a00063f8600063fdc0006
-403200064080000640ce0006411c0006416c000641c8000642240006427c
-000642d4000643280006437c000643be0006440000064448000644900006
-44d8000645260006456a000645ae000646140006467a000646e000064746
-000647ac000648120006487c000648e60006492e00064976000649be0006
-4a0600064a5200064a9e00064af200064b3e00064b8200064bd000064c38
-00064ca000064d1000064d8000064de800064e5000064e9000064ece0006
-4f1800064f4200064f8800064fc00006500e0006503e0006506e000650aa
-000650de000651040006515800065196000651ea000652d0000653f80006
-543a00065460000654b6000654e60006552800065570000655be00065608
-000656580006567e000657660006584a0006599c000659ca000659f80006
-5a8c00065b1200065b4000065bca00065bfa00065c2a00065c7800065cc6
-00065daa00065e8600065fca00065ffa0006602a000660c0000661480006
-6178000661a8000661d80006626800066298000662c80006631a00066362
-000663b80006644e000664e60006655a000665ac000665d60006662c0006
-6660000666aa000666e20006673200066770000667bc000667e20006685e
-000668b0000669c200066bcc00066d8000066f0200067074000673160006
-75e6000677a6000678ec00067b4600067c8800067e9e00067ef000067f40
-00067f9600067fec0006804e000680d600068324000684b6000686c20006
-87de0006899200068b1400068bd400068cb600068d1e00068d8000068df6
-00068e5e00068f0a00068f7a0006900a0006911e000691e20006922e0006
-92c40006937000069414000694be000695080006954a000695c000069628
-000696b800069766000697d0000698340006989a00069954000699ea0006
-9a4800069a7200069a9c00069aac00069abc00069b7e00069c8200069e8c
-00069fe200069ff20006a0a20006a1860006a1e60006a1f60006a2520006
-a2b00006a3d00006a4be0006a4ce0006a4de0006a4ee0006a4fe0006a5e4
-0006a6e40006a8bc0006aa780006ab7e0006abf80006ac720006ad240006
-ad340006ae420006ae520006ae620006af240006b0580006b1440006b154
-0006b1640006b1740006b2da0006b4460006b5720006b5820006b5920006
-b5a20006b5b20006b6940006b6a40006b8060006b9100006ba0e0006bb46
-0006bc180006bc960006bd140006be340006beb00006befc0006bf880006
-c09c0006c0f00006c2320006c2f20006c3be0006c4b40006c5be0006c670
-0006c7d60006c83c0006c9000006cb020006cc900006ce0e0006cf3e0006
-d1f00006d3320006d4600006d5d80006d7500006d8d00006da5e0006dc10
-0006dc7e0006dde20006df1a0006e01e0006e1540006e2860006e3560006
-e4260006e5820006e65c0006e6fc0006e8000006e92a0006ea280006eba8
-0006ed120006ee500006efc80006f1140006f1f60006f25e0006f3000006
-f3a00006f49e0006f6060006f7400006f8d40006fa1e0006fb020006fb60
-0006fc660006fcfc0006fdbe0006fe640006fea400070050000701220007
-01e800070310000704b0000705bc00070614000707ac0007083a0007084c
-0007087c000708ac000708e40007091c000709520007098e000709c40007
-0a0000070b6e00070bb800070c5200070cea00070d6400070de800070e4e
-00070efa00070f46000710660007111c000711f20007122a000712680007
-12dc000713d6000714f4000715f6000716380007167a000716e8000716f8
-000717080007171800071728000717380007174800071758000717680007
-17780007178800071798000717980007191c0007192c000719ec00071ab2
-00071be800071dde00071fe0000721dc00072412000726120007267e0007
-27900007292200072a7a00072b2c00072b7000072c0e00072d3e00072d8e
-00072e2400072f6000072f70000731260007325a000732aa000733000007
-33c20007340600073448000734ce0007352c0007361e000736ac000736e2
-0007375c000737d4000738240007393000073a2600073ad000073afa0007
-3b2400073b4e00073b7800073bb800073bf800073c3000073c6800073cb2
-00073cfc00073d3c00073d7c00073dc600073e1000073e5000073e900007
-3eea00073f4400073f7e00073fb800073ffc0007404000074084000740c8
-0007411c00074170000741bc00074208000742460007428a000742da0007
-432a00074384000743e20007440c00074436000744d00007456a000745ae
-000745f2000747080007471800074760000747a8000747fa0007484c0007
-48b60007490a00074956000749b400074a3e00074aa200074ae600074b30
-00074b9800074be200074c2200074c6a00074ca600074ce200074d1e0007
-4d5800074d9a00074ddc00074e1c00074e5c00074ea600074ef000074f46
-00074f9e00074fec0007503a0007507c000750ca0007510c000751560007
-5198000751dc0007523800075294000752e00007532c00075376000753c0
-000753fe0007543c000754ba0007553800075572000755ac000756460007
-56e0000757b400075888000758e400075940000759b400075a2800075b86
-00075b9600075c8000075c9000075cc600075cfc00075d3600075d700007
-5dac00075de800075e2e00075e7400075fda00076190000762dc0007649a
-00076610000767b8000768e8000769ee00076c0c00076d5000076ee60007
-706e000770ec0007723000077438000774cc00077560000776b4000777de
-0007795800077a9800077c0400077cf200077ebc00078050000780d20007
-8204000782ee0007845600078538000786ee000787e00007894200078a7e
-00078b7200078d3600078ebe00079062000791c600079362000795200007
-96a600079742000798b6000799a800079a9000079c1000079d6200079e82
-0007a01a0007a1f00007a37e0007a4280007a4de0007a6900007a7340007
-a7c20007a80e0007a85a0007a8d20007a9b00007aa2a0007aacc0007ab20
-0007ac840007adb00007aec20007afc40007b08c0007b2000007b3400007
-b5660007b6100007b73a0007b83e0007b9de0007baca0007bbc40007bcc2
-0007bda80007bec20007c07c0007c22a0007c3980007c4100007c4840007
-c5a20007c6260007c7280007c8b40007ca2c0007cb620007cc6c0007cde2
-0007cf5a0007d14c0007d33a0007d5000007d5740007d6240007d6da0007
-d78a0007d8480007d9420007da460007db400007dc4c0007dcd40007dd62
-0007ddea0007de7e0007df5a0007e0500007e1340007e22a0007e2be0007
-e37a0007e40e0007e4cc0007e5bc0007e6c40007e7c20007e8d60007e9f8
-0007eb0c0007ec4c0007ed860007eea80007efbc0007f1000007f2540007
-f4680007f61a0007f6ce0007f7ea0007f8c00007f9de0007fabc0007fc50
-0007fd0a0007fda60007fe980007ff800008006c000800ea000801e40008
-03220008044e00080482000804c6000804d600080576000806180008070e
-000807fa000808d4000809ac00080b0a00080c6a00080d0800080d9e0008
-0ddc00080e1c00080e5a00080e9a00080ef400080f4c00080fa60008100a
-0008109600081292000812e20008140e0008149400081514000815ee0008
-16c2000817c6000819b200081aca00081b3a00081bca00081c8c00081d5e
-00081dca00081e4800081f9c00081fe2000820280008210c000821480008
-21a6000821e4000822160008225a0008229c000822cc000100000d3500f2
-003c009d000700020010002f005600000468041d0005000200>
-<0000003a02be0000000300000000006a00000000000300000001000a006a
-0000000300000002000e00740000000300000003005e0082000000030000
-0004000a00e00000000300000005001800ea0000000300000006000e0102
-000000030000000700ba01100000000300000008003001ca000000030000
-0009008a01fa000000030000000d02aa028400010000000000000035052e
-000100000000000100050563000100000000000200070568000100000000
-0003002f056f00010000000000040005059e0001000000000005000c05a3
-0001000000000006000705af0001000000000007005d05b6000100000000
-00080018061300010000000000090045062b000100000000000d01550670
-0003000104030002000c07c50003000104050002001007d1000300010406
-0002000c07e10003000104070002001007ed0003000104080002001007fd
-0003000104090000006a080d0003000104090001000a0877000300010409
-0002000e08810003000104090003005e088f0003000104090004000a08ed
-0003000104090005001808f70003000104090006000e090f000300010409
-000700ba091d0003000104090008003009d70003000104090009008a0a07
-000300010409000d02aa0a9100030001040a0002000c0d3b00030001040b
-000200100d4700030001040c0002000c0d5700030001040e0002000c0d63
-0003000104100002000e0d6f000300010413000200120d7d000300010414
-0002000c0d8f000300010415000200100d9b0003000104160002000c0dab
-0003000104190002000e0db700030001041b000200100dc500030001041d
-0002000c0dd500030001041f0002000c0de10003000104240002000e0ded
-00030001042a0002000e0dfb00030001042d0002000e0e0900030001080a
-0002000c0e170003000108160002000c0e23000300010c0a0002000c0e2f
-000300010c0c0002000c0e3b00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0052006500670075006c00610072004d006f006e006f
-0074007900700065003a0041007200690061006c00200052006500670075
-006c00610072003a00560065007200730069006f006e00200035002e0030
-003100200028004d006900630072006f0073006f00660074002900410072
-00690061006c00560065007200730069006f006e00200035002e00300031
-0041007200690061006c004d00540041007200690061006c002000690073
-00200061002000740072006100640065006d00610072006b0020006f0066
-00200054006800650020004d006f006e006f007400790070006500200043
-006f00720070006f0072006100740069006f006e00200069006e00200074
-0068006500200055006e0069007400650064002000530074006100740065
-007300200061006e0064002f006f00720020006f00740068006500720020
-0063006f0075006e00740072006900650073002e0054006800650020004d
-006f006e006f007400790070006500200043006f00720070006f00720061
-00740069006f006e004d006f006e006f0074007900700065002000540079
-00700065002000440072006100770069006e00670020004f006600660069
-006300650020002d00200052006f00620069006e0020004e006900630068
-006f006c00610073002c0020005000610074007200690063006900610020
-005300610075006e0064006500720073002000310039003800320059006f
-00750020006d006100790020007500730065002000740068006900730020
-0066006f006e007400200074006f00200064006900730070006c00610079
-00200061006e00640020007000720069006e007400200063006f006e0074
-0065006e00740020006100730020007000650072006d0069007400740065
-006400200062007900200074006800650020006c006900630065006e0073
-00650020007400650072006d007300200066006f00720020007400680065
-002000700072006f006400750063007400200069006e0020007700680069
-006300680020007400680069007300200066006f006e0074002000690073
-00200069006e0063006c0075006400650064002e00200059006f00750020
-006d006100790020006f006e006c0079002000280069002900200065006d
-0062006500640020007400680069007300200066006f006e007400200069
-006e00200063006f006e00740065006e0074002000610073002000700065
-0072006d0069007400740065006400200062007900200074006800650020
-0065006d00620065006400640069006e0067002000720065007300740072
-0069006300740069006f006e007300200069006e0063006c007500640065
-006400200069006e0020007400680069007300200066006f006e0074003b
-00200061006e006400200028006900690029002000740065006d0070006f
-0072006100720069006c007900200064006f0077006e006c006f00610064
-0020007400680069007300200066006f006e007400200074006f00200061
-0020007000720069006e0074006500720020006f00720020006f00740068
-006500720020006f00750074007000750074002000640065007600690063
-006500200074006f002000680065006c00700020007000720069006e0074
-00200063006f006e00740065006e0074002ea9203230303620546865204d
-6f6e6f7479706520436f72706f726174696f6e2e20416c6c205269676874
-732052657365727665642e417269616c526567756c61724d6f6e6f747970
-653a417269616c20526567756c61723a56657273696f6e20352e30312028
-4d6963726f736f667429417269616c56657273696f6e20352e3031417269
-616c4d54417269616c20697320612074726164656d61726b206f66205468
-65204d6f6e6f7479706520436f72706f726174696f6e20696e2074686520
-556e697465642053746174657320616e642f6f72206f7468657220636f75
-6e74726965732e546865204d6f6e6f7479706520436f72706f726174696f
-6e4d6f6e6f7479706520547970652044726177696e67204f666669636520
-2d20526f62696e204e6963686f6c61732c20506174726963696120536175
-6e646572732031393832596f75206d617920757365207468697320666f6e
-7420746f20646973706c617920616e64207072696e7420636f6e74656e74
-206173207065726d697474656420627920746865206c6963656e73652074
-65726d7320666f72207468652070726f6475637420696e20776869636820
-7468697320666f6e7420697320696e636c756465642e20596f75206d6179
-206f6e6c792028692920656d626564207468697320666f6e7420696e2063
-6f6e74656e74206173207065726d69747465642062792074686520656d62
-656464696e67207265737472696374696f6e7320696e636c756465642069
-6e207468697320666f6e743b20616e6420286969292074656d706f726172
-696c7920646f776e6c6f6164207468697320666f6e7420746f2061207072
-696e746572206f72206f74686572206f7574707574206465766963652074
-6f2068656c70207072696e7420636f6e74656e742e004e006f0072006d00
-61006c006f00620079010d0065006a006e00e9006e006f0072006d006100
-6c005300740061006e0064006100720064039a03b103bd03bf03bd03b903
-ba03ac00a90020003200300030003600200054006800650020004d006f00
-6e006f007400790070006500200043006f00720070006f00720061007400
-69006f006e002e00200041006c006c002000520069006700680074007300
-2000520065007300650072007600650064002e0041007200690061006c00
-52006500670075006c00610072004d006f006e006f007400790070006500
-3a0041007200690061006c00200052006500670075006c00610072003a00
-560065007200730069006f006e00200035002e0030003100200028004d00
-6900630072006f0073006f0066007400290041007200690061006c005600
-65007200730069006f006e00200035002e00300031004100720069006100
-6c004d00540041007200690061006c002000690073002000610020007400
-72006100640065006d00610072006b0020006f0066002000540068006500
-20004d006f006e006f007400790070006500200043006f00720070006f00
-72006100740069006f006e00200069006e00200074006800650020005500
-6e0069007400650064002000530074006100740065007300200061006e00
-64002f006f00720020006f007400680065007200200063006f0075006e00
-740072006900650073002e0054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-4d006f006e006f0074007900700065002000540079007000650020004400
-72006100770069006e00670020004f006600660069006300650020002d00
-200052006f00620069006e0020004e006900630068006f006c0061007300
-2c0020005000610074007200690063006900610020005300610075006e00
-64006500720073002000310039003800320059006f00750020006d006100
-7900200075007300650020007400680069007300200066006f006e007400
-200074006f00200064006900730070006c0061007900200061006e006400
-20007000720069006e007400200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-200074006800650020006c006900630065006e0073006500200074006500
-72006d007300200066006f00720020007400680065002000700072006f00
-6400750063007400200069006e0020007700680069006300680020007400
-680069007300200066006f006e007400200069007300200069006e006300
-6c0075006400650064002e00200059006f00750020006d00610079002000
-6f006e006c0079002000280069002900200065006d006200650064002000
-7400680069007300200066006f006e007400200069006e00200063006f00
-6e00740065006e00740020006100730020007000650072006d0069007400
-7400650064002000620079002000740068006500200065006d0062006500
-6400640069006e0067002000720065007300740072006900630074006900
-6f006e007300200069006e0063006c007500640065006400200069006e00
-20007400680069007300200066006f006e0074003b00200061006e006400
-200028006900690029002000740065006d0070006f007200610072006900
-6c007900200064006f0077006e006c006f00610064002000740068006900
-7300200066006f006e007400200074006f00200061002000700072006900
-6e0074006500720020006f00720020006f00740068006500720020006f00
-750074007000750074002000640065007600690063006500200074006f00
-2000680065006c00700020007000720069006e007400200063006f006e00
-740065006e0074002e004e006f0072006d0061006c004e006f0072006d00
-610061006c0069004e006f0072006d0061006c004e006f0072006d00e100
-6c004e006f0072006d0061006c0065005300740061006e00640061006100
-720064004e006f0072006d0061006c004e006f0072006d0061006c006e00
-79004e006f0072006d0061006c041e0431044b0447043d044b0439004e00
-6f0072006d00e1006c006e0065004e006f0072006d0061006c004e006f00
-72006d0061006c004e0061007600610064006e006f0074006801b001a103
-00006e00670041007200720075006e00740061004e006f0072006d006100
-6c004e006f0072006d0061006c004e006f0072006d0061006c004e006f00
-72006d0061006c000000b900540328b326181fd0bc032900e00329000203
-29b22b1d1fb90327031db23b1f40b80323b31215320f412d03200001002f
-0320000100200320006f032000af032000bf03200004005f031e00010010
-031e007f031e0080031e00af031e00bf031e00d0031e00060000031e0010
-031e0020031e006f031e009f031e00e0031e0006031d031cb2201f104127
-0319007f03190002000f031700ef031700ff03170003001f0317002f0317
-004f0317005f0317008f0317009f03170006000f0317005f0317006f0317
-007f031700bf031700f00317000600400317b2923340b80317b28b3340b8
-0317b36a6c3240b80317b2613340b80317b35c5d3240b80317b357593240
-b80317b34d513240b80317b344493240b80317b23a3340b80317b3313432
-40b80317b32e423240b80317b3272c3240b80317b312253280b80317b30a
-0d32c04116031600d00316000200700316000102c4000f0101001f00a003
-1500b0031500020306000f0101001f00400312b32426329fbf0304000103
-0203010064001fffc00301b20d1132410a02ff02ef0012001f02ee02ed00
-64001fffc002edb30e11329f414a02e200af02e200bf02e2000302e202e2
-02e102e1007f02e00001001002e0003f02e0009f02e000bf02e000cf02e0
-00ef02e0000602e002e002df02df02de02de000f02dd002f02dd003f02dd
-005f02dd009f02dd00bf02dd00ef02dd000702dd02dd001002dc00010000
-02dc0001001002dc003f02dc000202dc02dc001002db000102db02db000f
-02da000102da02daffc002d3b2373932b9ffc002d3b22b2f32b9ffc002d3
-b21f2532b9ffc002d3b2171b32b9ffc002d3b2121632b802d2b2f9291fb9
-0326031cb23b1f40bb0322003e00330322b225311fb80318b23c691fb802
-e3b3202b1fa0413002d400b002d40002000002d4001002d4002002d40050
-02d4006002d4007002d40006006002d6007002d6008002d6009002d600a0
-02d600b002d60006000002d6001002d6002002ca002002cc002002d60030
-02d6004002d6005002d6000802d0b2202b1fb802cfb226421f411602ce02
-c70017001f02cd02c80017001f02cc02c60017001f02cb02c50017001f02
-c902c5001e001f02ca02c6b21e1f00410b02c6000002c7001002c6001002
-c7002f02c5000502c1b324121fff411102bf0001001f02bf002f02bf003f
-02bf004f02bf005f02bf008f02bf000602bf0222b2641f12410b02bb00ca
-0800001f02b200e90800001f02a600a20800406a1f402643493240204349
-3240263a3d3240203a3d329f209f26024026969932402096993240268e92
-3240208e92324026848c324020848c3240267a813240207a813240266c76
-3240206c76324026646a324020646a3240265a5f3240205a5f3240264f54
-3240204f5432b8029eb724271f374f6b0120410f02770030027700400277
-00500277000402770277027700f90400001f029bb22a2a1fb8029a402b29
-2a1f80ba0180bc0180520180a201806501807e01808101803c01805e0180
-2b01801c01801e0180400180bb0138000100800140b40180400180bb0138
-00010080013940180180ca0180ad01807301802601802501802401802001
-3740b80221b2493340b80221b2453340b80221b341423240b80221b33d3e
-320f410f0221003f0221007f0221000300bf022100cf022100ff02210003
-00400221b320223240b80221b3191e3240b80222b32a3f3240b80221b32e
-3a326f414802c3007f02c3008f02c300df02c30004002f02c3006002c300
-cf02c30003000f02c3003f02c3005f02c300c002c300ef02c300ff02c300
-0600df02220001008f02220001000f0222002f0222003f0222005f022200
-7f022200ef0222000600bf022100ef02210002006f0221007f022100af02
-210003002f0221003f0221004f0221000302c302c3022202220221022140
-1d101c102b1048038f1c010f1e014f1eff1e023700161600000012110811
-b8010db6f70df8f70d00094109028e028f001d001f0290028f001d001f02
-8fb2f91d1fb80198b226bb1f41150197001e0401001f013900260125001f
-013800730401001f0135001c0801001f0134001c02ab001f0132b21c561f
-b8010fb2262c1fba010e001e0401b61ff91ce41fe91cb80201b61fe81cbb
-1fd720b80401b21fd51cb802abb61fd41c891fc92fb80801b21fbc26b801
-01b21fba20b80201b61fb91c381fadcab80401b21f8126b8019ab21f7e26
-b8019ab61f7d1c471f6b1cb80401b21f6526b8019ab21f5e73b80401400f
-1f52265a1f481c891f441c621f4073b80801b61f3f1c5e1f3c26b8019ab2
-1f351cb80401b61f301cbb1f2b1cb80401b61f2a1c561f291cb80101b21f
-231eb80401b21f5537b80168402c07960758074f07360732072c0721071f
-071d071b071408120810080e080c080a080808060804080208000814b8ff
-e0402b000001001406100000010006040000010004100000010010020000
-01000200000001000002010802004a00b013034b024b5342014bb0c06300
-4b6220b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807
-ff52b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ff
-b101018e851bb0124358b900010111858d1bb900010128858d5959001816
-763f183f123e113946443e113946443e113946443e113946443e11394660
-443e11394660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b2b
-182b1db0964b5358b0aa1d59b0324b5358b0ff1d594bb09353205c58b901
-f201f04544b901f101f045445958b9033e01f2455258b901f2033e445959
-4bb8015653205c58b9002001f14544b9002601f145445958b9081e002045
-5258b90020081e4459594bb8019a53205c58b9002501f24544b9002401f2
-45445958b909090025455258b9002509094459594bb8040153205c58b173
-244544b1242445445958b917200073455258b9007317204459594bb80401
-53205c58b1ca254544b1252545445958b9168000ca455258b900ca168044
-59594bb03e53205c58b11c1c4544b11e1c45445958b9011a001c455258b9
-001c011a4459594bb05653205c58b11c1c4544b12f1c45445958b9018900
-1c455258b9001c01894459594bb8030153205c58b11c1c4544b11c1c4544
-5958b90de0001c455258b9001c0de04459592b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65
-422b2b01b33b59635c456523456023456560234560b08b766818b0806220
-20b163594565234520b003266062636820b003266165b059236544b06323
-4420b13b5c4565234520b003266062636820b003266165b05c236544b03b
-2344b1005c455458b15c406544b23b403b4523614459b347503437456523
-456023456560234560b089766818b080622020b134504565234520b00326
-6062636820b003266165b050236544b034234420b147374565234520b003
-266062636820b003266165b037236544b0472344b10037455458b1374065
-44b24740474523614459004b5342014b5058b108004259435c58b1080042
-59b3020b0a124358601b2159421610703eb0124358b93b21187e1bba0400
-01a8000b2b59b00c2342b00d2342b0124358b92d412d411bba0400040000
-0b2b59b00e2342b00f2342b0124358b9187e3b211bba01a80400000b2b59
-b0102342b0112342002b7475737500184569444569444569447373737374
-757374752b2b2b2b74752b2b2b2b2b737373737373737373737373737373
-737373737373737373732b2b2b45b0406144737400004bb02a534bb03f51
-5a58b1070745b040604459004bb03a534bb03f515a58b10b0b45b8ffc060
-4459004bb02e534bb03a515a58b1030345b040604459004bb02e534bb03c
-515a58b1090945b8ffc06044592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b752b2b2b2b2b2b2b435c58b9008002bbb301401e017400735903b01e4b
-5402b0124b545ab012435c5a58ba009f02220001007359002b7473012b01
-732b2b2b2b2b2b2b2b737373732b2b2b2b2b002b2b2b2b2b2b0045694473
-456944734569447374754569447345694445694445694473744569444569
-44732b2b2b2b2b732b002b732b74752b2b2b2b2b2b2b2b2b2b2b2b2b2b73
-7475732b7374757374752b2b2b742b2b000000>
-[15785 15901 16277 16325 16277 16273 15933 16169 16277 15721 16361 15561 15973
-16029 16305 15693 16345 16249 15893 15629 16365 15481 16245 16249 16357 16337
-15821 15749 16345 15937 16257 16033 19077 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-2 3242 17 <000100ba0000018700cd000300254018023c000a023c5f006f007f00af00
-04a0000100a004a198182b10f65d5ded003fed313033353315bacdcdcd00
->ArialMT AddT42Char 
-3 4064 66 <0001ffe1fe69048afeeb0003001a400c013f00021a050019044341182b4e
-10e410e6002f4ded3130033521151f04a9fe69828200>ArialMT AddT42Char 
-3 4240 68 <0002004affe8041c043e00280037022d402c090d092a190d1a2a290d2a2a
-390d3615371b3a2a492a5d0d5d2a6a0d692a60308a0d86299a169b1aa90d
-1528b8ffe8b40b0b065527b8ffe840190b0b0655a619aa28b619bb28c419
-cf28d215dd28084416011eb8fff440110c0c065512120c0c0655050c0c0c
-065535b8ffe040550c0c06551f171f182b2c2a343904392c4904482c5608
-592b6608692b760c870cc90cf90df92b1137340e0104102f243417322114
-185f296f2902291c2f0e3f0e8f0e9f0eff0e059f0eaf0eef0e030e0c0f0f
-02550eb8ffeab4101002550eb8fff44015101006550e0c0d0d06550e060f
-0f06550e0e1c0317b802aab61895141c1c0700b8fff4401a0c0c06550045
-270a321c030b2961106100060d0d025500252124b8ffecb41010025524b8
-ffec400b0d0d025524040c0c025524b8ffe4b40b0b025524b8fff4b40b0b
-065524b8ffdc400b1010065524060f0f065524b8fffcb40c0c065524b802
-5b400e27400026102620263026af260539b8ffc0b40e0e025526b8ffd6b6
-0e0e0255263139b8ffc0400d1e23343039c03902a039013917b8fff44041
-10100655172518222f24bf06cf06021f063f0602060e0f0f0255060c0d0d
-025506180c0c0255060c0b0b0255060c0b0b0655060e0d0d065506100c0c
-065506313810f62b2b2b2b2b2b2b5d71edf4ed2b105d712bf62b2b5dedf4
-2b2b2b2b2b2b2b2b3cfd2be5e5003fed3fe42b3fedfde41112392f2b2b2b
-2b2b5d71ed711112391112393901111217393130005d2b2b2b2b01715d2b
-2b0071250606232226353436363736373637363534272623220607273e02
-333216161716151514161723260306070e02151416333236373635033c64
-b96aafbc477348356bda67013345887f791db0186ed08988aa5010091722
-bc1c1762c46f5c326d6968a2261d835546ab854e814e140e0d1a24250a6e
-2d3d597118718b4b40614a2e78f0fb853d3801dd281c10284d2f48605b4f
-3d77>ArialMT AddT42Char 
-3 4962 69 <00020086ffe8041f05ba0010001d0180409b01050c0f240535054505053f
-1fb01f021f1f221c331c421c701f901f063a133c163c1a4c164c1a5d085d
-0d580f5d165e1a6a086c0d680f6e166e1ac01fd90cda17da19e213ec17ec
-19e31de01fff1f1920052f0f2f1430053f0f40054c0f50056605da1df504
-fa100c10150e040602001b1c0607010a151c0e0b1824d00b01100b400b60
-0b800b041f400d0d02550b0c0f0f02550b180d0d02550bb8fff6b40c0c02
-550bb8fff0b40b0b06550bb8fff4b40f0f06550bb8ffe0b40c0c06550bb8
-fff4402f0d0d06550b7401113300040c0c025500040d0d06550033032502
-02c001019001a001b001f001041f013f014f010301b8fffeb41010025501
-b8fffc401d0e0e0255010c0d0d025501100c0c025501120b0b0255010c0b
-0b065501b8fff8b41010065501b8fffc40160f0f065501180c0c06550114
-0d0d065501191e4737182b4e10f42b2b2b2b2b2b2b2b2b2b5d71723c4d10
-fdf42b2be410fd2b2b2b2b2b2b2b2b5d71ed003fed3f3fed3f1139111239
-3130005d015d7172007121231133113633321e0215100023222703141716
-333236353426232206012da7b472b162af7140fef2bdbc6b0234559176ac
-a57576ac05bafdf58f4f8fca73feeffed69d0196bf558bcdcbd0c6cd>ArialMT AddT42Char 
-3 5440 70 <00010050ffe803ed043e001a015ab1020243545840340e7f0f010f0b0140
-0050007000030004121c0b07181c040b010e1507080e0e0255070c0d0d02
-55070c0c0c025507100b0b0255072f2b2b2b2bcdd4c6003fed3fed10c45d
-3210c45d3231301b4047090c011f1c4313431753135317601360179b029b
-039a0da410a41a0c080d190a6a0269036a05750c700d800da60cb509b60a
-b50c0c160c860ce302030e225f0f6f0f7f0f030f01b802aa407930004000
-5000600070009000a000e000f00009000f0f0b000004121c0b07181c040b
-1c0f010f240e080d0d06550e221b000100240b2b1f010100010101400b0b
-065501401010065501480c0c0655011a0d0d065501491c1524cf07011f07
-3f0702070e0b0b0655070a1010065507120c0c065507311b34c4182b10f6
-2b2b2b5d71ed10f62b2b2b2b5d724b53234b515a58b90001ffc03859ed72
-f42bed72003fed3fed12392f11392f105de4105de43130005d71015d7159
-011706062322001134123633321617072626232206151416333236033cb1
-1defaedafef772e989addc1faf197f5a88aaa4846a8e018517b7cf011d01
-0aac010281afa11b6b6cc3d3d6c28200>ArialMT AddT42Char 
-3 5876 71 <00020046ffe803df05ba0011001d015540a40a02040d250d340d440d0535
-14351c5702540a5214531c6702640565096314601cc01fd405d513dd19e5
-13e514ef17eb19e51de01fff1f161f1f2b1a3c163c1a4b1a701f901f072e
-02240d2e163a02350d4b02450d4614491c570a560d670de506e716fa01f4
-0e100115030e0b100f001b1c0b0711000a151c030b1833010025110f2510
-10d011011011401160118011041f400b0b02551f400d0d02551112101002
-5511b8fff440110f0f025511060e0e025511180d0d025511b8fff2400b0b
-0b0655110e1010065511b8ffeeb40c0c065511b8fff840420d0d06551174
-1224bf07cf07df07ff07041f073f074f0703071e0b0b025507180c0c0255
-071e0d0d0255070c0b0b0655070c0d0d0655071a0c0c065507191e345018
-2b4e10f42b2b2b2b2b2b5d714dedfd2b2b2b2b2b2b2b2b2b2b5d713c10ed
-10fd3ce4003fed3f3c3fed3f3c11391112393130005d01715d0071213506
-232226263534123633321617113311011416333236353426232206033865
-c47fd5756ad48360962fb3fd20ac7576a5a87b78a1869e8cfba39f01038a
-5141020efa460212cccac1c6daccc400>ArialMT AddT42Char 
-3 6312 72 <0002004bffe8041e043e0015001d015340171f001c150255035d055d0955
-0b65036b056f09650b0815b8ffe4b40d0d065511b8ffe440520d0d06551d
-1c0d0d06552712d905fa14f61a0431123a19311c41124d1a411c51125c19
-521c61126d1a611c78067815f602f618100016010f0d1717501660167016
-03161c0f9010a010021010041b1c0a0700ba02aa0001ffc0b41010025501
-b8ffc04010101006551001010195131c040b17400db8ffdcb40d0d02550d
-b8ffeeb40d0d06550db8ffeab40c0c06550db8ffc04009272a34b00d010d
-1a1fb8ffc0b32526341fb8ffc040411e2334301f011f163310240740242a
-341f073f074f070307200b0b025507180c0c0255071c0d0d0255070e0b0b
-0655071c0c0c065507160d0d065507191e3437182b4e10f42b2b2b2b2b2b
-5d2b4dfde44e10712b2bf6712b2b2b2b4ded003fedfd5d2b2be43fed1239
-2f5d3cfd713c011112393912393130015d005d2b2b2b0171720117060623
-22001110003332001114072116163332360121262726232206035eba2cee
-b9e9feef0114dcd5010e01fce80ab285638cfdda02510c3856897ca90156
-17a3b4011f0103010c0128fedefef91020afba680195864368a6>ArialMT AddT42Char 
-3 6758 73 <000100130000028005d30017010d401e1409010f192f193019401970199b
-0c9c0da90d081a0d280db019c0190419b8ffc040281a1f341d080d030c0f
-1c0a0115022b1413040306000a9f140114ff134004172504000302920101
-00b8ffc0b331383400b8ffc0402b1c1f3490000119400f0f025519400d0e
-025500141010025500280f0f025500220e0e0255002c0d0d025500b8fff2
-400b0c0c025500140b0b065500b8ffeab41010065500b8ffe6b40f0f0655
-00b8fffab70c0c065500a31819bc01ba002100f6010a00182b2bf62b2b2b
-2b2b2b2b2b2b2b2b5d2b2b3c10f43c103ced10eded5d003f3f3c3c3cfd3c
-3fed391139313043794014101106090706080602061009121b0011060f1b
-012b012b2a8181012b715d00723311233533353437363633321707262322
-06151533152311b29f9f131a83764c5c1b38325244cfcf039a8c716b3446
-57129d0a4660628cfc66>ArialMT AddT42Char 
-3 7098 74 <00020042fe5103ea043e001e002a016f40600b0b05142c0b25144c0b4514
-06091d191d2c0b26142c23390b36144a0b46145607580b680bfa0af5150e
-2e232c273e233e274c27902ca02c07362136293f2c460b46214529542154
-29690763216329602c802cda27e821ee23ef271117160615b802b1b4281c
-130701b802aa401020003000600070008000c000d0000700b8027d403205
-1c1c0f0a45221c0c0a16153325330a251818d01701101740176017801704
-2c400b0c02552c400d0d025517121010025517b8fff440110f0f02551706
-0e0e025517160d0d025517b8ffea400b0b0b065517121010065517b8ffee
-b40c0c065517b8fffc404a0d0d065517740f012500221f24bf0fcf0fdf0f
-ff0f041f0f3f0f4f0f030f200b0b02550f1a0c0c02550f220d0d02550f1c
-0b0b06550f0c0d0d06550f1a0c0c06550f192b2c74213450182b2b4ef42b
-2b2b2b2b2b5d714dedf4ed10fd2b2b2b2b2b2b2b2b2b2b5d713c10fde4f6
-3c003fede43fedfd5de43fede43f3c3130015d71005d7117171617163332
-363736270623220235341236333217353311140606232226131416333236
-35342623220666af0b3243747d88180e0176b0dbf06ed18dbc7aa665dba0
-beea99a67d7ca8ad7a78a8581a512532645a37b08b013cdd9801018c9880
-fc6af8cf78ab032ad1c0bfccc3c6c300>ArialMT AddT42Char 
-3 8014 76 <000200880000013c05ba0003000700cd405e09360b0b02554f099009a009
-b009c009df09f0090700091f09700980099f09b009c009df09e009ff090a
-1f09010001070402030906037e0100060506040a0607250500049f04a004
-b004c004e00406c004f0040200042004d004e0040404b8fff8b410100255
-04b8fffa40170e0e025504040c0c0255040a0b0b025504140b0b065504b8
-ffeab41010065504b8fffeb40d0d065504b8fffc400a0c0c0655044e0847
-50182b10f62b2b2b2b2b2b2b2b5d71723cfd3c003f3f3c3fed0111123939
-111239393130015d72712b133533150311331188b4b4b404ebcfcffb1504
-26fbda00>ArialMT AddT42Char 
-3 8538 78 <00010088000003f805ba000b0261401b060c0d0d0655070656065a09030f
-0df305f60603090c1010025506b8fff4b40c0c02550ab8fff4b40c0c0255
-09b8fff4b40c0c025503b8ffe840100d0d06555503770a02120620132134
-08b8fff0b312273409b8fff0b41227341205b8fff0b312213409b8fff040
-84122734060404050406370947040525062d0a580a7703750ada03e30607
-a60601230626072508390638093f0d4f0d59045906580759097d04790599
-09c606d204d606e406e907f706f90815120a0a0503030402060607090908
-0a0a050908082507061407070603040425050a1405050a0a090603040801
-02000405060708080b0b000a04b8010f400905040c0c0655052208b8010f
-402120073f070207100c0c0655071a900d010d0b2500022501019000013f
-004f000200b8fffe40310e0e025500100d0d025500100c0c0255000a0b0b
-025500120b0b065500120c0c065500080d0d065500190c0de1214766182b
-2b4ef42b2b2b2b2b2b2b5d713c4d10ed10ed4e1071f62b5d4dedf42bed00
-3f3c103c103c3f3c3f3c11173987052e2b047d10c487052e182b0e7d10c4
-0710083c083c0310083c083cb10602435458400d4b09011f098403020918
-0d1134002b5d7159313001435c58400a092c1d3909081d1d3c06b8ffdeb2
-1d3906b8ffd4b2203906b8ffd4b121392b2b2b2b2b595d00715d0171002b
-2b435c58b90006ffc0b2213903b8ffc0b2163903b8ffdeb2103906b8ffde
-b2103903b8ffdeb20c3903b8ffdeb10b392b2b2b2b2b2b59012b2b2b435c
-584012dd040108141639090814143c090814143c06b8fff6b2183906b8ff
-ecb11b392b2b2b2b2b015d59005d2b2b2b2b2b015d712b33113311013301
-012301071188b401aae9fe6a01bfdefea17f05bafcbc01b0fe76fd64021f
-7afe5b00>ArialMT AddT42Char 
-3 9202 79 <000100830000013705ba000300e3b605360b0b025505b8ffc0b337383405
-b8ffc0b334353405b8ffc0b330313405b8ffc0b322253405b8ffc0402515
-17340f051f059f05df05044f05df05f005031f0570058005ff0504010000
-0a0203250100b8ffc0b337383400b8ffc040153335349f0001c000f00002
-00002000d000e0000400b8fff8b41010025500b8fffa401d0e0e02550004
-0c0c0255000a0b0b025500140b0b065500081010065500b8fffeb40d0d06
-5500b8ffffb40c0c065500b8fffc400a0c0c0655004e044750182b10f62b
-2b2b2b2b2b2b2b2b5d71722b2b3cfd3c003f3f3130015d71722b2b2b2b2b
-2b3311331183b405bafa4600>ArialMT AddT42Char 
-3 9454 80 <0001008700000626043e002301c7b9000dfff4b40d0d065508b8fff4b40d
-0d065509b8ffd8404d0b0d342504e404e409e117e52005d505f620021708
-202309181b20090303231e1c06151c0b0b06070106231a19100ad0250190
-25a025022517171a0e2590110111041010025511180f0f025511b8ffec40
-0b0e0e025511140c0c025511b8ffe840170b0b025511020b0b0655110c10
-10065511060f0f065511b8fffab40c0c065511b8fff8b40d0d065511b801
-5d400c1825901b011b180f0f02551bb8ffec400b0e0e02551b140c0c0255
-1bb8ffee40110b0b02551b040b0b06551b0a101006551bb8fffe400b0d0d
-06551b0c0f0f06551bb8fffcb40c0c06551bb8015d4016000233232501d0
-00019000a000021f003f004f000300b8fffe401d0e0e025500100d0d0255
-00100c0c0255000c0b0b025500160b0b065500b8fffcb41010065500b8ff
-f440140f0f0655000a0c0c0655000e0d0d065500192425b80178b3214750
-182b2b4ef42b2b2b2b2b2b2b2b2b5d71723c4dfde410f42b2b2b2b2b2b2b
-2b2b5dedf42b2b2b2b2b2b2b2b2b2b5dfd4e456544e67172003f3c3c3c3f
-3f3c4d10ed10ed11173901111239123931304379400e0c141326140c111b
-01120d151b01002b012b2b81015d005d2b2b2b3311331536363332161736
-3332161511231134262623220615112311342623220606151187a132a66a
-76971f7eca9eaab3235c3e7094b458644c813a0426954e5f6258baafb6fd
-27029d6c5f3a95a4fd9702b27878509a91fdd900>ArialMT AddT42Char 
-3 11776 85 <00010085000002c6043e001100c9403b2f13011004012304340443045304
-66047404060911080908090d1311090d000308010b1c06070106000a0928
-900801082220130113022211250100b8ffc04010333634f0000100002000
-d000e0000400b8fff8b41010025500b8fff840110e0e025500040c0c0255
-00060b0b025500b8fffcb41010065500b8fff440160f0f065500060c0c06
-5500080d0d0655004e1247c4182b10f62b2b2b2b2b2b2b2b5d712b3cfde4
-105df472e4003f3f3fed11393911393901111239390010c9870e7dc43130
-005d72015d33113315363633321707262322060706151185a23e693f5b5e
-3e42423b5e141e0426a171483aa727473f6072fdd400>ArialMT AddT42Char 
-3 12974 87 <00010024fff2022a0599001700d8b9000affc0b323263409b8ffc0404123
-263480190100010c0d0a0103001610092b0f0a06161c030b0f1022002201
-0d12250c01ff070845094560077007800790070400072007a007b007c007
-d0070607b8ffeeb41010025507b8fff4b40f0f025507b8fff2b40e0e0255
-07b8fff8b40d0d025507b8fff8b40c0c025507b8fffab41010065507b8ff
-f0400b0f0f065507060c0c065507b8ffe8b40d0d065507ba026a00180136
-b166182b10f62b2b2b2b2b2b2b2b2b5d71f4e410ed3cfd3c10e4f43c003f
-ed3f3cfd3c1139123911333310c93130015d2b2b25170623222626351123
-353311371133152311141616333202101a4c3c626c2c8484b3b5b5132b28
-1ea19f103e65a202638c01076cfe8d8cfd934d2c1a00>ArialMT AddT42Char 
-3 13266 88 <00010083ffe803e004260018014fb9001affc0400915173402201316340f
-b8fff040331214342b1301240813160c0113160b06000a111c030b003316
-251817403336341a401010025517281010025517120e0e025517b8ffec40
-0b0d0d025517040c0c025517b8fff4400b0b0b065517141010065517b8ff
-f8400b0d0d0655170c0f0f065517b8fff6400d0c0c0655ff1701c0170117
-4e1ab8ffc04015343634b01af01a02701aa01ab01aff1a041a0c2509b8ff
-c04010333634f0090100092009d009e0090409b8fff8b41010025509b8ff
-f840110e0e025509040c0c0255090a0b0b065509b8fff640160f0f065509
-020c0c065509020d0d0655094e194750182b10f62b2b2b2b2b2b2b5d712b
-ed105d712bf65d712b2b2b2b2b2b2b2b2b2b2b3cfde4003fed3f3f3c3939
-0111123931304379401a04100e0d0f0d0206070806080508030610040c1b
-000d08111b00002b012b2a2a81005d012b2b2b2135062322262627263511
-3311141716163332363635113311033f7cd55ea34f100bb40b116e51518e
-3bb49cb4486d4f35730292fdb38d314751538f880239fbda>ArialMT AddT42Char 
-4 0 92 <00010021fe5103ee0426001a01f7b10202435458401d0a140f030b031c19
-0f12060b061340120f200b400c200f180f0f02550f192f2b1add1a18cd1a
-1910dd1a18cd003f3f3fed12173931301bb30f1c010fb8ffde406d1c3928
-14560faf0a03400d400f020f202830341020283034070c0912160d181227
-0b270c270d360c360d350e99110b28122813481659125913591569126913
-69157906760d79117a147a15850d8a118c128c138914980aa80bbc10bb11
-ba14ea0ae714f50dfd10f914ff1c1e12b106024354584016130b1c1b040f
-440f840f030f190b031c190f12060b06003f3f3fed1112395d0111123939
-1b40370f0f0c101112120a00031914131325120a1412120a0f0c0f110c25
-0b0a140b0b0a1312120c0c0b06031c190f001c101c022f1cbf1c021cb802
-3fb50f1340124014b80254400b3f124012025f12bf120212b80142b60f01
-2200451b0ab8025440120f200b4040200c300c4f0c03500cff0c020cb801
-42b32f0f010fb8023fb41b207c66182b1a1910fd71f45d711a18ed1a1910
-ed1810f4e41910e45d71ed1a1810ed1910e45d7100183fed3f3c103c103c
-87052e2b087d10c487052e182b0e7d10c400111239870e103c3c08c44bb0
-0e534bb018515a58bb000cffe8000bffe80138385959313001435c58b900
-14ffdeb637390a2237390eb8ffe8b51539112215392b2b2b2b595d712b2b
-00715d2b015d591327163332363736373637013313161736371333010607
-060623227f143b2c3c48171126050bfe6dc2dd2b221f2be3b4fe6c412430
-7c5634fe67a91028241b6b0f1d0428fd9975817c76026bfbc8af42595300
->ArialMT AddT42Char 
-2 0 0 <00020100000005000500000300070000211121112521112101000400fc20
-03c0fc400500fb002004c000>ArialMT AddT42Char 
-ArialMT /CharStrings get begin
-/period 17 def
-/underscore 66 def
-/a 68 def
-/b 69 def
-/c 70 def
-/d 71 def
-/e 72 def
-/f 73 def
-/g 74 def
-/i 76 def
-/k 78 def
-/l 79 def
-/m 80 def
-/r 85 def
-/t 87 def
-/u 88 def
-/y 92 def
-end
-ArialMT /Encoding get
-dup 46 /period put
-dup 95 /underscore put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 105 /i put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 114 /r put
-dup 116 /t put
-dup 117 /u put
-dup 121 /y put
-pop
-end
-%ADOEndSubsetFont
-/KUDFNZ+ArialMT /ArialMT findfont ct_VMDictPut
-/KUDFNZ+ArialMT*1 
-[46{/.notdef}rp /period 48{/.notdef}rp /underscore /.notdef /a /b /c 
-/d /e /f /g /.notdef /i /.notdef /k 
-/l /m 4{/.notdef}rp /r /.notdef /t /u 3{/.notdef}rp 
-/y 134{/.notdef}rp]
-KUDFNZ+ArialMT nf
-KUDFNZ+ArialMT*1 [9 0 0 -9 0 0 ]msf
-24.5 68.26 mo
-(default_gray.icc)
-[5.04 5.04 2.52 5.04 5.04 2.043 2.52 5.04 5.04 2.99693 5.04 4.437 
-2.52 2.043 4.437 0 ]xsh
-33.5 122.764 mo
-(default_rgb.icc)
-[5.04 5.04 2.52 5.04 5.04 2.043 2.52 5.04 2.99693 5.03999 5.04 2.52 
-1.91701 4.563 0 ]xsh
-26.372 177.889 mo
-(default_cmyk.icc)
-[5.04 5.04 2.52 5.04 5.03999 2.043 2.52 5.03999 4.563 7.55993 4.437 4.563 
-2.403 2.043 4.563 0 ]xsh
-/KUDFNZ+ArialMT*1 uf
-/KUDFNZ+ArialMT uf
-/ArialMT uf
-%ADOBeginSubsetFont: Arial-BoldMT Initial
-ct_T42Dict begin
--0.625 -0.375 2 1.008
- 256 array 0 1 255 {1 index exch /.notdef put} for  /Arial-BoldMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f32115d5e9f000000cc000000606376
-7420fb3ea3da0000012c0000075a6670676d08e8ba2800000888000005d7
-676c79664fc39cd400009edc0007c44c68656164d65e5fe200000e600000
-003668686561127e15fe00000e9800000024686d7478d62bc37500000ebc
-000034d46c6f636132ab8c4800004390000034d86d61787014dc04760000
-7868000000206e616d65ae0c9081000078880000147d70726570f14ae516
-00008d08000011d267646972000000000000000000000000000303d402bc
-00050008059a05330000011b059a0533000003d1006602120805020b0704
-020202020204e0002affc00078430000000900000000544d432000200020
-fffc05d3fe510133073e01b2400001ffffff0000042605ba000000200004
-05ba001c05ba001c05a7001c0426001c0000ffe40000ffe40000ffe4fe69
-ffe405ba001cfe69ffe402ea0000011d0000011d000000000000000000b2
-00ac00d70128012000b301fa001700f8011901310049000400f7000300af
-00fd00950014005400960112002400160055004901040119012b008c019b
-ff76ffe9003d009200a2ffb70182ffaa0016008f00c600f8001c00de0401
-0037004e00550055006500e903e50059ff9a00080087000b003b00520116
-006100d600d600f500000093009400be017cfff80004001400820092003c
-00410041ffc1fffc002a008c049005d809b5009100bb0106ff63ff69001e
-0022008a022bffd6ffdf0026005900a300ac0104012b01c004480021006b
-00850098011903c6006b009500a400fe010c025d034305bf000000490056
-006e0077008a00aa00ca0112015005d805f0ff7bffe70006001300280061
-006900e90135014d02a5040cff3effda005b00b900c801190119011901c0
-045b04a7055bfe3fff9dffc2001500b7010a01bc01c10532058efd81ffa1
-ffae000c00260031003d004e00560062008300c100c900f100f2027fff7f
-00480053007700c5011d01200126012801d60219027e027e03d3002e0041
-005d006b0075009f00b000b200ba00bb00bd00d600db00e000e50114011b
-014a0162019101f2020c026402cf039b03b403d4040104a9001600230025
-002a007400a500b600cc00cd00cf0105012001300150016a016f0197019d
-01e002b002ec02f70408048304fb04fd0526fee0fefbff4efff50018001a
-004c007a007f009100a300b300b400ce00d500f200f300f6011001380168
-01a101b001e001ec02090222024f0270029602a502ad034e039103c10435
-0442046b04cd04da0586058b076107fefca6fe93feadfed1ffb7ffd10003
-000e00180026004600690081008f00a500bf00d300d500d900dd00e20119
-012b0138013b015a015e016801730188019401ad01c501d101ea01f20200
-020002000222023b0244024f026f0272027e02820293029402a502cf02cf
-02d002da02dd02eb02f5030503220336037103a103b003b803d003e60410
-0426042e0431044f045a04ff053205320547055305a805ab05c205f0063c
-0664067006e80782078408ccfd2afddefe00fe68feb0feb3ffaa00080059
-007a0091009e00a200af00b400bb00ca00cc00ce00d900e000f40114011a
-01210127012b01390146014b014d0157015c01650182018701920198019b
-01a201ae01c501c501d102070222022b024102530261026502840287028d
-02b402b402ba02c902d602d802ed02f503170323032b03310349035a035b
-036e03710374037e03840391039103aa03cf03d303e703e803ed04080417
-041e0475047a049904a704b404d1054c056d056d05a205bf05c005d105fc
-05fc0602061a061c062f066a06a806e2070607360750078907d407f30870
-011c012a011a01200000000000000000000000000219000b001e02aa0214
-047f01ed0000001d0104000f0091002b01880153011201f3003f03fe0168
-010e047f01ed036e03150219041300000000064004b00000027401bb0035
-01c5007f06020301000004e000b201dc02e004c3023d00d50160011904a7
-036e05ca022100ab0426009002bc02bb014200b4023c0256029c030001e5
-01a800e5006b00780094016b017300ab01ed013a017d0137017f00d40216
-03530184003cffa202040109014901f0006e031500810464005e00000000
-0000000000000000000000000000000000000000000000000000013900dc
-00e9fe9e040d047c012b00b80096005900ac00df01a900fa0105ffec0017
-0003005500610004008c00a3008500280120005d00d6007f012601190104
-016c06cf00b4010600000737063e047a00f000f900e905ba042604420000
-ffe7fe69049e04e3ff37ff2d01200105012000a800740068004700f200e5
-00d900bd00a800680047005c0048000a0028003200410050005a0064007d
-00870091ffb0ff9cff83ff79ff6f00cb012000fa012c01fa01a000d500b8
-005c003c00c800c8008f00d9018b00b30047000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000fe6400c000ea01180125013203b003ed0576
-059005aa05b405be05cd063100780084009b00cc00e200f4010a01200163
-00d100ea00f7010801420019002c00340041003800480058006c025903bd
-0043011a007000d30028003700420050005a0064007300780082008c009c
-00a500bd00ce00f00110015c00be00d801020117012c016300ea01080041
-004b0055005f007300a60109018301b300410064001e002a00eb00fa010e
-01380274002c00400082009600b600c000cc00dc00e600f000ff010a0120
-012c013b01440156016300f70057006401100136005001b10000ffb60039
-004e004403cc00e5002401100042012201a400f0006000e0000e001d0039
-05e30102002cfe4eff38026903bd011600ff000e00a00054001b003d0171
-0041000f005000fd0015014f0035fe52002c00d3010304b001d200b600c0
-00990265ff870377fe6c00cb00a9005c0040047607440000404154403f3e
-3d3c3b3a3938373534333231302f2e2d2c2b2a292827262524232221201f
-1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201
-002c4523466020b02660b004262348482d2c452346236120b02661b00426
-2348482d2c45234660b0206120b04660b004262348482d2c4523462361b0
-206020b02661b02061b004262348482d2c45234660b0406120b06660b004
-262348482d2c4523462361b0406020b02661b04061b004262348482d2c01
-10203c003c2d2c20452320b0cd442320b8015a51582320b08d44235920b0
-ed51582320b04d44235920b09051582320b00d44235921212d2c20204518
-684420b001602045b04676688a4560442d2c01b10b0a432343650a2d2c00
-b10a0b4323430b2d2c00b0172370b101173e01b0172370b10217453ab102
-00080d2d2c45b01a234445b01923442d2c2045b00325456164b050515845
-441b2121592d2cb00143632362b0002342b00f2b2d2c2045b0004360442d
-2c01b00643b00743650a2d2c2069b04061b0008b20b12cc08a8cb8100062
-602b0c642364615c58b00361592d2c45b0112bb0172344b0177ae4182d2c
-45b0112bb01723442d2cb01243588745b0112bb0172344b0177ae41b038a
-45186920b01723448a8a8720b0c05158b0112bb0172344b0177ae41b21b0
-177ae45959182d2c2d2cb0022546608a46b040618c482d2c4b53205c58b0
-02855958b00185592d2c20b0032545b019234445b01a23444565234520b0
-0325606a20b009234223688a6a606120b01a8ab000527921b21a1a40b9ff
-e0001a45208a54582321b03f1b235961441cb114008a5279b31940201945
-208a54582321b03f1b235961442d2cb110114323430b2d2cb10e0f432343
-0b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2cb10e0f432343650b
-2d2cb11011432343650b2d2c4b525845441b2121592d2c0120b003252349
-b04060b0206320b000525823b002253823b002256538008a63381b212121
-212159012d2c4bb06451584569b00943608a103a1b212121592d2c01b005
-251023208af500b0016023edec2d2c01b005251023208af500b0016123ed
-ec2d2c01b0062510f500edec2d2c20b001600110203c003c2d2c20b00161
-0110203c003c2d2cb02b2bb02a2a2d2c00b00743b006430b2d2c3eb02a2a
-2d2c352d2c76b8023623701020b802364520b0005058b00161593a2f182d
-2c21210c6423648bb84000622d2c21b08051580c6423648bb82000621bb2
-00402f2b59b002602d2c21b0c051580c6423648bb81555621bb200802f2b
-59b002602d2c0c6423648bb84000626023212d2cb4000100000015b00826
-b00826b00826b008260f10161345683ab001162d2cb4000100000015b008
-26b00826b00826b008260f1016134568653ab001162d2c4b53234b515a58
-20458a60441b2121592d2c4b545820458a60441b2121592d2c4b53234b51
-5a58381b2121592d2c4b5458381b2121592d2cb0134358031b02592d2cb0
-134358021b03592d2c4b54b012435c5a58381b2121592d2cb012435c580c
-b00425b00425060c6423646164b0035158b00425b00425012046b0106048
-2046b0106048590a21211b2121592d2cb012435c580cb00425b00425060c
-6423646164b807085158b00425b00425012046b8fff060482046b8fff060
-48590a21211b2121592d2c4b53234b515a58b03a2b1b2121592d2c4b5323
-4b515a58b03b2b1b2121592d2c4b53234b515ab012435c5a58381b212159
-2d2c0c8a034b54b00426024b545a8a8a0ab012435c5a58381b2121592d2c
-462346608a8a462320468a608a61b8ff8062232010238ab902a702a78a70
-456020b0005058b00161b8ffba8b1bb0468c59b0106068013a2d2cb10200
-42b123018851b1400188535a58b910000020885458b202010243604259b1
-2401885158b920000040885458b202020243604259b12401885458b20220
-02436042004b014b5258b2020802436042591bb940000080885458b20204
-0243604259b94000008063b80100885458b202080243604259b940000100
-63b80200885458b2021002436042595959592d00000100000005028f9f18
-7df95f0f3cf50819080000000000a2e33c1d00000000c14fd725fafafcfd
-1000081500010009000100010000000000010000073efe4e00431000fafa
-fa7a1000000100000000000000000000000000000d350600010000000000
-023900000239000002aa00b803cb00700473001204730046071d005905c7
-005a01e7005c02aa006b02aa0043031d001c04ac00550239007502aa0073
-023900930239fffd04730056047300a2047300330473004d047300260473
-005b0473005704730057047300530473004102aa00c902aa00aa04ac005f
-04ac005504ac005f04e3006a07cd003d05c7000005c7009605c7006105c7
-00940556009504e300970639006205c700960239008c0473002305c70099
-04e3009d06aa009105c7009806390059055600950639005905c700960556
-004a04e3002c05c700930556ffff078d0007055600000556fffd04e30016
-02aa00920239fffd02aa002604ac00730473ffed02aa002a0473004904e3
-00870473005504e300540473004102aa001804e3005404e3009202390093
-0239ffa20473008902390093071d007e04e3009104e3005204e3008b04e3
-005b031d00870473003002aa001f04e3008d0473000b063900090473000c
-0473000e04000022031d003c023d00b0031d002d04ac004305c7000005c7
-000005c700610556009505c700980639005905c700930473004904730049
-047300490473004904730049047300490473005504730041047300410473
-004104730041023900920239ffe90239ffcd0239ffd004e3009104e30052
-04e3005204e3005204e3005204e3005204e3008d04e3008d04e3008d04e3
-008d0473004403330056047300540473000d0473003b02cd00420473fffe
-04e3008b05e5fff705e5fff7080000d802aa00bb02aa0005046400310800
-ffaa0639003f05b40098046400320464003c0464003c04730001049c006f
-03f4002c05b4007a069600a1046400000231000002f6002502ec001a0625
-0037071d005804e3005704e3006502aa00c304ac0055046400540473ffec
-0464001f04e5001a047300600473006a080000c905c7000005c700000639
-005908000048078d00580473fffc08000000040000840400006902390098
-023900720464003103f4002f0473000e0556fff70156fea90473ffe002aa
-004b02aa004b04e3001f04e3001f04730044023900930239007504000071
-0800000105c700000556009505c7000005560095055600950239006a0239
-ffae0239ffbf0239ffc106390059063900590639005905c7009305c70093
-05c700930239009302aa000302aafff302aa001302aa001a02aa00cd02aa
-009102aa002602aa006002aa003902aa000304e3000a0239000a0556004a
-0473003004e3001604000022023d00b005c7fffd04e300530556fff70473
-000e0556009504e3008b04ac005504ac006d02aa005b02aa001902aa0028
-06ac005c06ac005c06ac0028047300000639006204e300540239008c0556
-004a0473003005c700610473005505c700610473005504e30054046bffed
-02aa00c805c700000473004905c700000473004905c7009405c0005105c7
-fffd0556009504730041055600950473004104e3009d0239007904e3009d
-0315009504e3009a03d5009005c7009804e3009105c7009804e300910639
-005904e3005205c70096031d008705c70096031d00500556004a04730030
-04e3002c02aa001f04e3002c03d5001e05c7009304e3008d05c7009304e3
-008d04e300160400002204e300160400002204cf009a0639005606910056
-04eb004e04da004e03cc004e0579004e0392003005b9004e046bffed04d5
-00b8032b004f08c000290800004f040000990800004f040000990800004f
-040000980400009807d5016a05c7008f04ab005504d5009d04ac005504d5
-022204d5010505abffe9050001c905ab027e05abffe905ab027e05abffe9
-05ab027e05abffe905abffe905abffe905abffe905abffe905ab01c005ab
-027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab01c0
-05ab01c005abffe905abffe905abffe905ab027e05ab01c005ab01c005ab
-ffe905abffe905abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905ab02d605ab006605abffea05d5ffff04d500920800000007eb0130
-07eb012007eb013007eb012004d500b204d5008004d5002a082b0198086b
-01b807550010060000f40600006f0440003a0540003704c0003f04150040
-04000025060000550647008c0473009005abffc701eb008d03d500860715
-002303e9001804d5009202d6005c02d6005c04d500b202d6004d05c70000
-0473004905c700610473005505c700610473005505560095047300410556
-00950473004105560095047300410639006204e300540639006204e30054
-0639006204e3005405c7009604e3009205c7000504e300190239ffba0239
-ffbb0239ffda0239ffda0239ffe10239ffe2023900480239004704730023
-0239ffa205c70099047300890473008d04e3009d0239ffed05c7009804e3
-009105c9009c04e3008e0639005904e300520639005904e3005205c70096
-031d002a0556004a0473003004e3002c02aa000705c7009304e3008d05c7
-009304e3008d05c7009304e3008d05c7009304e3008d078d000706390009
-0556fffd0473000e0239008d05c70000047300490800ffaa071d00580639
-003f04e3005702aa00c9078d000706390009078d000706390009078d0007
-063900090556fffd0473000e0239009502aaffd70473000d04cd005a06ac
-005c06ac002906ac003006ac002f02aa00bc02aa002602aa00bb03b8fff4
-05c7ffe806d3ffbb073fffbb03caffbb0699ffa6076bffc806b4ff9c0239
-ff2905c7000005c7009605c000000556009504e3001605c700960239008c
-05c700990556000006aa009105c70098052600660639005905c7009a0556
-009504cd005a04e3002c0556fffd0556000006790056066a00620239ffcc
-0556ffff04eb004e039c004e04e3008e0239008204a8006c04e200900473
-000f03af004e04e3008e0453004e023900930476008e0473000f04e50090
-0473000b0390004e04e3005204f300760429004e04a80076049b00110607
-007606c2004e0239ffcd04a8007604e3004e04a8007606c2004e055a0097
-0715002f048900a405b100580556004a0239008c0235ffca0473002308c0
-001a0880009d0700003704e2009a04fa000005c0009905c7000005c0009b
-05c70096048900a405b3fffa05560095073b00170503002c05c0009905c0
-009904e2009a059d002006aa009105c700960639005905c0009905560095
-05c7006104e3002c04fa000006d400590556000005d8009a059f007d080a
-009a0827009a06f5001a07d5009d05c0009b05b100570840009605c00004
-0473004904f1005c04eb0096035500880514fff90473004105acffff03fa
-001804eb008c04eb008c040100880515001905eb009b04d5008804e30052
-04d5008804e3008b0473005503eb00150473000e070000540473000c04eb
-008904a5007206ab008c06c0008d05d5002806d5009504eb0099046b0038
-06d5009104abfffb0473004504e3000003550088046b0051047300300239
-00930240ffd00239ffa207c000180740008c04e300000401008804730012
-04d5008803e50096039300880800004108eb00a306200030000001010000
-001e0000003100000031000001010000007f0000007e0000008c0000008c
-000001010000001000000101000001210393007d0000008c026500c80000
-03020000ff0102aa00c904a90059049b004103a7000a0466003204ea0082
-022f0087034e005a04ed00870503007d022f0087042c002803ed004b03f8
-004104e30087050a0037022f00870316004b04e800500459000a04c00064
-04b2006403ff000a0418000a04950082042c002805b8005a0563002d045e
-0087045e0087045e00870236005004090050068b0087022fffac042c0028
-042c002803f8ff1603f8ff160479003205b8005a05b8005a05b8005a05b8
-005a04a9005904a9005904a90059049b004103a2000a0466003204ea0082
-02950000038100000503007d02950000042c002803ed004b03f80041050a
-00370316004b04e8005004c0006404b200640418000a04950082042c0028
-05b8005a0563002d022f0087049b004103ed004b04b2006404db00410000
-ffdc0000ff250000ffdc0000fe51028d00ab028d00a002da004303c0007e
-0196ffba0000004600000046000000460000004600000048000000460000
-004600000046047e0188047e0150047e0104047e009e047e012d047e00ea
-047e00d5047e009c047e00bc047e00ee04350085028d00c1043500b30600
-01000600010002be005806000100047e00a5047e00bd047e00de06000100
-060001000600010006000100060001000000004606000100060001000600
-0100060001000600010006000100060001000600010004e6ffba06000100
-06000100060001000532003905320039022cffba022cffba060001000600
-01000600010006000100049e0034047800300430ffba0430ffba0376000a
-0376000a060e00290708002902e2ffba0456ffba060e00290708002902e2
-ffba0456ffba05280097046f000a03520003060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100000000300000004600000046
-000000400000004606000100060001000000ffdc0000fe510000ff160000
-ff160000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ffdc0000ff160000ffdc0000ff200000ffdc0473002d080000000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d007f028d00670600
-010005a0002e03c0007e01e800000207ffc301bc005e01e0fffa039c0006
-039c000601bc005e01e0001a05280097049e0011022cffba022cffba01bc
-008801e0001a0532003905320039022cffba022cffba02be003603520003
-0532003905320039022cffba022cffba0532003c0532003c022cffba022c
-ffba049e0034047800300430ffba0430ffba049e0034047800300430ffba
-0430ffba049e0034047800300430ffba0430ffba02be006902be006902be
-006902be00690376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba073200400732004004deffba04deffba088000400880
-0040062cffba062cffba0880004008800040062cffba062cffba0430ffba
-0430ffba0430ffba0430ffba0430ffba0430ffba0430ffba0430ffba0454
-003403c000460454ffba02e2ffba0454003403c000460454ffba02e2ffba
-0610002f0610002f0270ffba0298ffba04e6002704e600270270ffba0298
-ffba045400290454002902e2ffba02e2ffba039c0023039c002301e0ffba
-01e0ffba02e2002102e200210352ffba0352ffba0454003e0454003e022c
-ffba022cffba02be00580352000303c0ffba039cffba039c0006039c0006
-05280097046f000a05280097049e0011022cffba022cffba0454000004c4
-000003e400220454001a03e400220454001a03e400220454001a06000100
-060001000000004600000046060001000600010006000100000000460000
-004606000100060001000000004800000046060001000600010006000100
-000000460000004600000046000000460000004000000030060001000000
-004600000046060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100028d00ca028d00c7028d00c6060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010002be0069
-0100ffba0800ffba1000ffbb06d3005905b0005206a3009305cb008d0000
-fd880000fbc10000fc5f0000fe310000fcad0000fd550000fe260000fdf1
-0000fd180000fc690000fd950000fbe00000fc700000fed40000fecd0000
-fea0041b007806ac005c06ac00190000fe450000fd550000fda60000fc5f
-0000fe250000fd180000fbe00000fafa0000fb360000fc700000fb870000
-fb9b0000fcce0000fc540000fbc30000fc940000fbf50000fdb00000fe59
-0000fd7e0000fc820000fd340000fe500000fe460000fcd10000fd3e0000
-fd020000fc3a0000fce90000fc260000fc070000fc2f0000fb9e0000fb76
-0239009305c700000473004905c700000473004905c700000473004905c7
-00000473004905c700000473004905c700000473004905c7000004730049
-05c700000473004905c700000473004905c700000473004905c700000473
-004905c70000047300490556009504730041055600950473004105560095
-047300410556009504730041055600950473004105560095047300410556
-00950473004105560095047300410239006a0239005d0239008c02390093
-0639005904e300520639005904e300520639005904e300520639005904e3
-00520639005904e300520639005904e300520639005904e3005206d30059
-05b0005206d3005905b0005206d3005905b0005206d3005905b0005206d3
-005905b0005205c7009304e3008d05c7009304e3008d06a3009305cb008d
-06a3009305cb008d06a3009305cb008d06a3009305cb008d06a3009305cb
-008d0556fffd0473000e0556fffd0473000e0556fffd0473000e05c70000
-047300490239ffca0239ffca0639005904e3005205c7009304e3008d05c7
-009304e3008d05c7009304e3008d05c7009304e3008d05c7009304e3008d
-0000fef90000fef90000fef40000feef0489fffd03550007073b001705ac
-ffff04e2009a0401008804e2009a0401008805c7009604d5008804730001
-047300120473000104730012055600000473000c059f007d04a50072059f
-009c04e3009205cf00590473004c0639005604e3005205320039022cffba
-0270ffba0298ffba04e60027022c0065022c0016022c0016022c0011022c
-0043022cffd20000fef00000000f0000fff502aa009002aa009000000000
-0000005e0000005e0000ffcb01bc000f01e0ffbf01bcfff501e0ffcd01bc
-001d01e0000901bc008801e0001a039c0006039c0006039c0006039c0006
-05280097046f000a0532003905320039022cffba022cffba053200390532
-0039022cffba022cffba0532003905320039022cffba022cffba05320039
-05320039022cffba022cffba0532003905320039022cffba022cffba0532
-003905320039022cffba022cffba0532003905320039022cffba022cffba
-049e0034047800300430ffba0430ffba049e0034047800300430ffba0430
-ffba049e0034047800300430ffba0430ffba049e0034047800300430ffba
-0430ffba049e0034047800300430ffba0430ffba049e0034047800300430
-ffba0430ffba02be004f02be004f02be006902be006902be006902be0069
-02be004f02be004f02be006602be006602be006902be006902be006902be
-006902be002f02be002f02be002202be00220376000a0376000a0376000a
-0376000a0376000a0376000a0376000a0376000a0376000a0376000a0376
-000a0376000a0376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba073200400732004004deffba04deffba073200400732
-004004deffba04deffba0880004008800040062cffba062cffba08800040
-08800040062cffba062cffba0430ffba0430ffba0454003403c000460454
-ffba02e2ffba0610002f0610002f0610002f0270ffba0298ffba0610002f
-0610002f0270ffba0298ffba0610002f0610002f0270ffba0298ffba0610
-002f0610002f0270ffba0298ffba0610002f0610002f0270ffba0298ffba
-04e6002704e6002704e6002704e60027093e0032093e00320740ffba0740
-ffba060e00290708002902e2ffba0456ffba045400290454002902e2ffba
-02e2ffba045400290454002902e2ffba02e2ffba045400290454002902e2
-ffba02e2ffba060e00290708002902e2ffba0456ffba060e002907080029
-02e2ffba0456ffba060e00290708002902e2ffba0456ffba060e00290708
-002902e2ffba0456ffba060e00290708002902e2ffba0456ffba039c0023
-039c002301e0ffba01e0ffba039c0023039c002301e0ffb101e0ffb1039c
-0023039c002301e0ffba01e0ffba039c0023039c002301e0ffba01e0ffba
-0454003e0454003e022cffba022cffba0454003e0454003e0454003e0454
-003e0454003e0454003e022cffba022cffba0454003e0454003e049e0034
-047800300430ffba0430ffba02be005803520003031a001a031a001a031a
-001a039c0006039c0006039c0006039c0006039c0006039c0006039c0006
-039c0006039c0006039c0006039c0006039c0006039c0006039c0006039c
-0006039c000605280042046fffd905280097046f000a022cffba022cffba
-039c0006039c000605280097046f000a022cffba022cffba05280097046f
-000a067f0044067f0045067f0044067f004501a800280000fe290000fe8c
-0000ff250000ff230000fefa0000ff7a0000fe5908fc003208ad00320000
-ffb50000ffb60000fef00000ff590000fe590000ff8c01b4000002f70000
-0000fe850000ff0704cd00320000ff580000ff580000ff59073200400732
-004004deffba04deffba0880004008800040062cffba062cffba04540034
-03c000460454ffba02e2ffba03c0007e02e2002102be0058022cffba0290
-ffba01f4002f01f4003b01f4001201f400b101f4006d060e002907080029
-022f00870000fec803500000045e008703e4fff50454fff503e400220454
-001a03e400220454001a03e400220454001a03e400220454001a03e40022
-0454001a03e400220454001a047e0072047e00bd03e4000f0454000f04e3
-001b06b1001e05c0009b04e3008705c0000a04e3000a05c7006905c70061
-0473005505c7fffd06b3001e05c0005c04e3005404da004e055600660503
-006f04e3ffac063900620518000207720092023900930239000705c70099
-047300890239001b0473000f07ef009605c7ffad04e3008e063900560718
-005905f300550641001e04e3008b05560095055600640473006304cd005a
-02e1001e02aa001f04e3001802aa001f04e3002d066a006205c700930629
-00000473000e04e300160400002204e3003a04e300590436002a04360039
-047300330473005b03fa001e04a2001f04e3008b023d00b003fb00b004ad
-005602aa00b80aaa009409c7009408e300540956009d071c009d04720093
-0a3a009808000098071c00910473004c05c70000047300490000fefe05c7
-0000047300490800ffaa071d00580639006204e300240639006204e30054
-05c70099047300890639005904e300520639005904e3005204e3003a0436
-00220239ffa20aaa009409c7009408e300540639006204e3005408430096
-0552009505c7009804e3009105c700000473004905c70000047300490556
-00950473004105560095047300410239ff370239ff2d0239fff40239ffe6
-0639005904e300520639005904e3005205c70096031dffcd05c70096031d
-008005c7009304e3006705c7009304e3008d0556004a0473003004e3002c
-02aa001f049e002e0429004905c7009604e30092059f009c050c0052050c
-005204e300160400002205c7000004730049055600950473004106390059
-04e300520000fefd0639005904e300520639005904e300520639005904e3
-00520556fffd0473000e0473004504e3005404e3008204e3008704730034
-0473001404e3005404e300540473004c0641004c03fa004f03fa00180587
-0018048a005202aaffc404e3005404e3005404b000520473000f04ce000f
-04e3008a04e3009204e300920239001b023900930239009302a8000002d9
-00140239009304d40093071d0085071d0085071d007e04e3ffa604e30091
-04eb008c04e3005206ab005206c2004e05ff0052031dffe6031dffe6031d
-ffe6031d0087031d0087031d0087031dffe604ab008a04ab008a04730030
-02aaffc402aaffc402aaff9b0451001e02aa001902aa001f04e3001b04f8
-004904a8009104730012063900090473000f0491000f0400002205700022
-0436002204360022047300420473005504730042047300550639005904eb
-0096048a004f04b0005204d5008803ab001e04730014039e008804e3005b
-0473004204730055083f00540789005409af00540682001f0446001f0698
-001f06f4001806350093058a00930445001e0482008802f1003202f10032
-018effe202040032020400000204000003000032042f000002e2000001e7
-005c03cb007002390098023900750239009402aa00f302aa00f303000032
-0300003204ac005f04ac005f04ac002a04ac002a02aa012102aa00bb02aa
-002a02aa012102aa001302aa002a02aa00bb02aa00ca02aa00ca02aa00f3
-02aa00f302aa00a602aa00a602aa00a602aa001302aaffe102aafffb02ed
-0000012100320302003202ee000003000032031000960310009603100096
-031000960310009602aa006202aa006202aa000302aa001d040000690457
-009604570096045700960457009604570043045700430457004304570043
-04570043031000430457002f0457002f0457002f0457002f0457002f0310
-002f04570025045700250457002504570025045700250310002f0457001a
-0457001a0457001a0457001a0457001a0310001a04570042045700420457
-004204570042045700420310004204570096045700960457009604570096
-0457004204570042045700420457004204570042031000420457002f0457
-002f0457002f0457002f0457002f0310002f0457002f0457002f0457002f
-0457002f0457002f0310002f045700260457002604570026045700260457
-002603100026045700420457004204570042045700420457004203100042
-045700960457009604570096045700960457004204570042045700420457
-004204570042031000420457002604570026045700260457002604570026
-031000260457002304570023045700230457002304570023031000230457
-002f0457002f0457002f0457002f0457002f0310002f0457004b0457004b
-0457004b0457004b0457004b0310004b0457009604570096045700960457
-00960457004204570042045700420457004204570042031000420457001a
-0457001a0457001a0457001a0457001a0310001a04570024045700240457
-00240457002404570024031000240457002f0457002f0457002f0457002f
-0457002f0310002f0457004e0457004e0457004e0457004e0457004e0310
-004e045700960457009604570096045700960000feaf0000febf0000fdb5
-0000fec80000ff780000feb10000ff3d0000fe6f0000feae0000ffce0000
-ff660000fe6f0000fec80000fec80000ff680000ff680000ff6800000000
-0000ff1f0000ff1f0000ff440000ff5f0000fe870000ffec0000ff9c0000
-ff510000ff510000ff510000febf0000ff15000000000000feb10000ff3d
-0000ff6b0000fef20000ff470000ffce0000fe870000febb0000feae0000
-feae0000fec80000fec80000fea60000febf0000fdb70000fdb90000fea6
-0000febf0000fdb50000fe1f0000fee20000ff9c0000fe870000ff440000
-feba0000ff230000ff9a0000fdb90000fe3b000000000000fea70000ff68
-0000fe170000ff740000fe870000fdb90000ff660000ff440000fea70000
-fea70000fea70000ff030000ff520000fd1f0000ff530000ff530000ff53
-0000feb10000feb00000ffa10000fe8c0000feb80000feaf0000fea20000
-feba0000fdf40000ff190000ff2d0000fe8c0000fe8802aa00bb02aa002a
-02aa00c804e2009004a8007606290000080200000629000005ff005206c2
-004e056900140639005904e3005205c700610473005504e30097039e0088
-06030000043c001d066f000a04e2000a07ef0096071d0085059f007d04e3
-008a059f009c04d7000a05560064055600640524001404d4000a05e10055
-04a0004b040e0014038400280569001404f1005c047300550239ffa20639
-005603d4005103d400510556009505c000990473004104eb008c0a3d0059
-063a001406f4001a059f001b07ce008c065e0093055600000473000b0768
-008c066700930679005606070076089e008c07d800930503004603fa0043
-06790056060700760639005604e300520685ffff052c000b0685ffff052c
-000b0b3a005909bd005206840055051a004b0a3d0059073500550000fe37
-0a3d0059063a001405c700610473005504ac000f0000fea60000feb10000
-feaa0000fead0000fc2b0000fc4c05c0009904eb008c05c0001104eb001b
-0556009504e3008b059f009c04c900880503002c03fa001804e200110401
-000d0617001a04fc00280709009605b6008809020099075f008805c70061
-049f005505c700610473005504e3002d03eb001506d2002c05830015059f
-007d04a5007206da000a056d000a06da000a056d000a0239008c073b0017
-05acffff059d009a04c80088059d00200515001905c7009604d5008805c7
-009604d50088059f007d04a5007206aa009105eb009b02aa001a05c70000
-0473004905c70000047300490800ffaa071d0058055600950473004105cf
-00590473004c073b001705acffff0503002c03fa00180503002c04360022
-05c0009904eb008c05c0009904eb008c0639005904e300520639005604e3
-005205b10057046b003804fa00000473000e04fa00000473000e04fa0000
-0473000e059f007d04a5007207d5009d06d5009505c0005e04e30054083e
-005e077a005407ad004606c4004305430046044a0043081a002007a50019
-08430096076600880639006204b000520620002d059b00150000ff430000
-fec90000ff770000ffb00000ff470000ff560000ff740000fed70000feac
-000000000000ff520000ff56000000000000feac0000fd9a000000000000
-ff6a0000ff7c0000ff690000ff560000feac0000ff7f0000ff560000fdef
-0000ff430000ff690000ff7c000000000000fdae0000ff8c000001020000
-feef0000feef0000fefd0000fef90000ff530000fef80000fef905c70000
-0473004905c7009604e3008705c7009604e3008705c7009604e3008705c7
-00610473005505c7009404e3005405c7009404e3005405c7009404e30054
-05c7009404e3005405c7009404e300540556009504730041055600950473
-004105560095047300410556009504730041055600950473004104e30097
-02aa00180639006204e3005405c7009604e3009205c7009604e3009205c7
-009604e3009205c7004e04e3003b05c7009604e300920239ffd20239ffd2
-0239001b0239ffce05c700990473008905c700990473008905c700990473
-008904e3009d0239009304e3009d0239ffeb04e3009d0239ffdd04e3009d
-0239ffcb06aa0091071d007e06aa0091071d007e06aa0091071d007e05c7
-009804e3009105c7009804e3009105c7009804e3009105c7009804e30091
-0639005904e300520639005904e300520639005904e300520639005904e3
-00520556009504e3008b0556009504e3008b05c70096031d008705c70096
-031d008705c70096031d008705c70096031d00590556004a047300300556
-004a047300300556004a047300300556004a047300300556004a04730030
-04e3002c02aa001f04e3002c02aa001f04e3002c02aa001f04e3002c02aa
-001f05c7009304e3008d05c7009304e3008d05c7009304e3008d05c70093
-04e3008d05c7009304e3008d0556ffff0473000b0556ffff0473000b078d
-000706390009078d000706390009055600000473000c055600000473000c
-0556fffd0473000e04e300160400002204e300160400002204e300160400
-002204e3009202aaffde063900090473000e047300490239008d04eb004e
-04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e05c7
-000005c7000006f3fff206f3000006f3fff206f3000006f3004306f30043
-03cc004e03cc004e03cc004e03cc004e03cc004e03cc004e061efff2061e
-000007aefff207ae000007aefff207ae000004e3008e04e3008e04e3008e
-04e3008e04e3008e04e3008e04e3008e04e3008e068ffff2068f0000081f
-fff2081f0000081ffff2081f0000081f0014081f00140239009002390090
-0239ffb60239ffc40239ffde0239ffec0239ffb30239ffc00301fff20301
-00000491fff2049100000491fff204910000049100140491001404e30052
-04e3005204e3005204e3005204e3005204e30052069dfff2069d00000855
-fff20855000007c9fff207c9000004a8007604a8007604a8007604a80076
-04a8007604a8007604a8007604a800760682000007fe00000862000007ae
-fff306c2004e06c2004e06c2004e06c2004e06c2004e06c2004e06c2004e
-06c2004e06cefff206ce00000886fff20886000007fafff207fa000007fa
-fff307fafff304eb004e04eb004e03cc004e03cc004e04e3008e04e3008e
-0239ffe70239008d04e3005204e3005204a8007604a8007606c2004e06c2
-004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e
-04eb004e05c7000005c7000006f3fff206f3000006f3fff206f3000006f3
-004306f3004304e3008c04e3008c04e3008c04e3008c04e3008c04e3008c
-04e3008c04e3008c068ffff2068f0000081ffff2081f0000081ffff2081f
-0000081ffff3081ffff306c2004e06c2004e06c2004e06c2004e06c2004e
-06c2004e06c2004e06c2004e06cefff206ce00000886fff20886000007fa
-fff207fa000007fafff307fafff304eb004e04eb004e04eb004e04eb004e
-04eb004e04eb004e04eb004e05c7000005c7000005c7ffd105c7ffdd05c7
-000002aa00dc02aa00ca02aa00dc02aafff302aafff304e3008c04e3008c
-04e3008c04e3008e04e3008c06e6000006e60000075700000757000005c7
-009602aafff202aafff202aafff30239ffe50239ffdb0239ffce0239ffce
-0239ffc20239ffbb0239ffe80239ffde03c9000003c9000002aa000002aa
-000002aafff304a8007604a8007604a8007604a8007604f3007604f30076
-04a8007604a800760556fffd0556fffd06e6ffd8074affdd061e000003b8
-fff403b8fff402aa002a06c2004e06c2004e06c2004e06c2004e06c2004e
-0765ffd1069dffdd0796ffd106ceffdd066a006202aa00bb02aa00dc0473
-000a05c7006105c70061071d007e05c7002109cd0096078d000705c70020
-04e3002d08b000140400003004c100660000ff530000ff530000ff530000
-ff530239001b0239ffa2047300000556001206b3005403fe005706ab0091
-040c001f05d6ffe605d6ffe602aa008402aa008402aa00c902aa00c902aa
-009102aa002a02aaffc502aaffc302aafff302aa00c902aa00a902aa00a9
-02aa00a902aa00a9032e001e032e001e02aa003a0000ff730000ff9d0000
-fec80000ff230000ff720000ff720000fee70000ff9d0000ff530000ff53
-0000ff530556009504e3008b04b5000006350000071d006104eb000f0473
-0055049900910499001b0401008c03fa001802390093040f00490476008e
-039e000e05eb009b04eb008c04e300520473003404f1005204f1005204f1
-0021078d00540492004b04e3005304e3005304e9008c04abfffb04abfffb
-03eb001504a8007604e300510624005104e000510473000b063900090400
-002203df002203f2004b04ec0014035500880473001204d5008804e9008c
-060700760515001903e300000591000003a2003203a2000003a300320355
-00320355003204030032037c00320172005502de003203b00032031e0032
-04220032037700320378003204260032037a0032035b003203ac00320377
-0032037b00320514000003050032030500320321003204b6003203210032
-03210032030200320302003202cf003202cf0032032000320121003202ca
-00320484003402f2003203480032030a0032034900320349003203200032
-01bc000a02f20032034200320484003202e90000034c000a031b003202e9
-00000343003203da003203080000012100320204003202f2003202e90000
-031b003202e900000342003203da00320308000005ed00460a9800460613
-00460689ffba0541ffba01e9001e045400100000ff0d0000ff350000fece
-0000feb70000fec90000ffc70000ff4f0000ff9e0000fef002be006902be
-00690376000a0376000a03c0ffba039cffba03c0ffba039cffba05c80039
-05920032061600820519004b05240041060f008705580028068f002d04ac
-00550000fe3b0000fe660000fe680473fffc0400008403d5ffba01e0ffba
-01e0ffb101e0ffba01e0ffba06d0002e0984002304000000080000000400
-00000800000002ab000002000000015500000473000002390000019a0000
-00ab00000000000005e5fff705c7006106aa009105eb009b0760008d07a1
-005407a1005b05c7000005c700610473001404e3001104e3002c04730039
-0400002205290042000001010000ff420000fead0000ff3a0000ff5304f3
-000a05c7006905c7006105c70069048900a4035500880000ff430000ff01
-0000ffac0316007d0000ff370298ffba033d001e0000ff3a0000ff480000
-ff490000ff7e0000ff4f0000ff4a0000fe9e0532003905320039022cffb6
-022cffb60532003c0532003c022cffba022cffba0532003905320039022c
-ffba022cffba0532003905320039022cffba022cffba0532003905320039
-022cffba022cffba0532003905320039022cffba022cffba053200390532
-0039022cffba022cffba049e0034047800300430ffba0430ffba049e0034
-047800300430ffba0430ffba02be004f02be004f02be006902be00690376
-000a0376000a073200400732004004deffba04deffba0454003403c00046
-0454ffba02e2ffba0454003403c000460454ffba02e2ffba0454003403c0
-00460454ffba02e2ffba0610002f0610002f0270ffba0298ffba0610002f
-0610002f0270ffba0298ffba060e00290708002902e2ffba0456ffba060e
-00290708002902e2ffba0456ffba060e00290708002902e2ffba0456ffba
-02e2002102e200210352ffba0352ffba02e2002102e200210352ffba0352
-ffba0454003e0454003e022cffba022cffba0454003e0454003e022cffba
-022cffba0454003e0454003e022cffba022cffba039c0023039c002301e0
-ffba01e0ffba0376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba04e3ffc104e3005402aafff3071dffc104e3ffd504e3
-ffc5031dffc1031dffc10473ffff02aaffda0400002104e3008302f00032
-04dc004e06fb001f0239001b0239001b04e3001404a8001404f8001404e3
-008704e3005402aa0018062500540473008902390070071d007e04e30091
-04e3008b031d00660473003003baffc40473000b0473000c040000220473
-004904e3005404e300540473004103fa004f03fa0018053e005102390093
-0473003402aaffc404e3008d0436002203210032030a0032030a00060348
-003202cf003201f0000a01f000000320003202f100320174000a01210032
-012100320174000a02760000018e00320150003202490032048400340484
-0032035f0000035f003202fa003203480032040300320302003202390000
-01bc000a0340000a035e003202ea003202ea003202e9000002e4003202e4
-003203be0032030a003202e800320000fe920000fe920000ff730000fe9f
-02aa00c903050032030200320348003202ee0000030200320639006205c7
-00000556001e05c7006102aa004104eb004e04eb004e04eb004e04eb004e
-04eb004e04eb004e04eb004e04eb004e0239ffb60239ffb60239ffc40239
-ffc40239ffb60239ffb60239ffc40239ffc404a8007604a8007604a80076
-04a8007604a8007604a8007604a8007604a800760239ffc90239ffc90239
-ffc90239ffc904a8007604a8007604a8007604a8007603e400220454001a
-03df003005c7fffd05c70016055600000556009504730041047300230239
-ffa20633005904e3005b05c70000031d001b0556fffd0473000e04730034
-047300550473003402390093048900110355001b055600000473000c0556
-00000473000c0503006f03fa004f059d0020051500190000fec60000fed4
-0000fec60000fed40000fe5f0000fe5f0000ff720000ff730000fee70800
-00000401005d0473003404e300110239001b04e300060556fffd05c70096
-0473004902aaffcd05c7009604e3009205c700990473008904e300160400
-00220473002804540096037c008805b9004e0000ff530000ffbc0000fefe
-0000fefe0000fea40000fea402390093000000000000006c0000006c0000
-006c0000006c0000011a000001ba00000388000006300000079600000948
-000009a800000a3200000abc00000bf000000c6c00000cdc00000d2a0000
-0d6800000dbe00000ec200000f44000010ea000012420000135c000014ce
-00001602000016be0000185c000019a2000019fc00001a8800001b120000
-1b9400001c2200001d1000001ea40000201e00002186000022c0000023aa
-00002468000025040000264a0000271e000027a60000284400002a0e0000
-2a6a00002cbe00002ebc00002fc4000030940000322e00003392000035f2
-0000368800003768000038a200003ae400003c6000003d5600003ee80000
-3f5c00003fb000004018000040ca000040fe00004162000043700000446c
-000045a800004698000048a4000049a400004b8000004c8000004d220000
-4dfa00004f2600004f920000514600005230000053200000541c0000551e
-000056020000594800005a6800005b5000005ca400005f0a000060e00000
-625e000063ec000065140000657a000066b20000677a000067bc000067fc
-000068380000687e000068c6000069160000695a00006994000069c40000
-69f400006a3600006a7800006aaa00006aee00006b3a00006b8400006bb4
-00006bfa00006c3600006c7600006cb200006cea00006d3a00006d760000
-6db200006de200006e2400006e7400006ebe00006ef600006f3800006f6c
-00006fe40000706a000072160000738200007578000075c20000765c0000
-77aa0000799a00007b4e00007c6800007cca00007d2200007e0200007f34
-000080ac000081d40000829a0000837000008430000085d4000086900000
-877200008850000088b60000894a00008a0e00008b4a00008be200008d22
-00008fc40000914a00009250000092f00000934a0000942a000095d80000
-9744000097ee000098e2000099c800009a3c00009a7400009aba00009af8
-00009c7400009e8a00009ec400009efa00009fc20000a0960000a1060000
-a1240000a1c60000a2a00000a2dc0000a3160000a37c0000a5140000a5b2
-0000a6440000a7a00000a8ca0000a9b40000a9f20000aa020000aa200000
-ac2a0000ac6c0000acba0000acf60000ad360000ad840000adc20000ae00
-0000ae3a0000ae7c0000aeb40000aee40000af1e0000af620000af920000
-afda0000b03c0000b0a80000b1560000b18a0000b1fa0000b2400000b2f6
-0000b3900000b4240000b48c0000b4e80000b5bc0000b6880000b6b80000
-b6e80000b74c0000b7a20000b82a0000b9540000bacc0000bb020000bb32
-0000bc3a0000bd0e0000bd4a0000bee00000bf5e0000c06c0000c1a00000
-c34c0000c4da0000c7220000c7d80000c81c0000c85c0000c88e0000c8d2
-0000c90e0000c9520000c98c0000c9be0000c9f00000cb200000cb560000
-cb800000cbcc0000cc0e0000cc340000cc5a0000cc900000cdce0000cde6
-0000ce0c0000ce320000ce700000cea00000ced00000cf0e0000cfcc0000
-d07e0000d0b20000d0e80000d1240000d1620000d1b00000d1e20000d214
-0000d2500000d28c0000d2c80000d3040000d3360000d3660000d3960000
-d3bc0000d3e00000d41e0000d5920000d5d60000d60e0000d6460000d67c
-0000d6cc0000d70e0000d7540000d7a60000d7f20000d9040000da100000
-daf80000dbe80000dcee0000ddd80000de480000df720000dfc20000dff2
-0000e0ec0000e3200000e3600000e3a00000e3e00000e41e0000e47c0000
-e4da0000e5480000e5680000e6080000e6a20000e6d80000e73c0000e786
-0000e7d00000e7ec0000e8080000e8280000e8480000e8680000e8880000
-e8ae0000e8d40000e8fa0000e9200000e9500000e9780000e9a00000e9cc
-0000e9f80000ea2c0000ea560000ea820000eab80000eae20000eb0e0000
-eb440000eb6e0000eb980000ebcc0000ebfc0000ec300000ec740000eca4
-0000ecd80000ed1a0000ed4e0000ed800000edc20000edf60000ee260000
-ee680000eeac0000eef20000ef4e0000ef6a0000ef860000efa20000efbe
-0000efda0000f1480000f3f20000f6620000f67e0000f6980000f6b40000
-f6d00000f6ec0000f7080000f7640000f79e0000f8080000f8d20000f972
-0000fa480000fac80000fb500000fbc00000fc560000fcb40000fcfa0000
-fd580000fdba0000fdfa0000fe560000feba0000ff2c0000ff6a000100fc
-0001020c00010236000102520001027e000102b600010302000103320001
-036200010396000103c6000103f6000104260001045600010486000104b6
-000104e6000105160001054600010576000105a6000105d6000106060001
-07900001093e0001096e0001099e00010a8a00010ba200010bd200010c00
-00010c3000010c5e00010c8e00010cbc00010ce000010d0400010d3e0001
-0e1e00010e6e00010ed40001101a0001104c000110720001109a000110d8
-000111ae000112a6000112d6000113060001133600011366000113960001
-13c4000113f400011424000114e6000115fa0001162a0001165a0001168a
-000116ba000116ea0001171a000117400001176600011796000117c60001
-17f600011826000118c600011918000119e600011a1600011a4600011a76
-00011aa600011ad800011b0800011b3800011b6800011b9800011bcc0001
-1c0000011c3000011c6000011cbe00011ce800011e6e00011f560001210a
-0001235e0001259600012734000127940001281a0001282a000128ec0001
-2a9000012b6400012c3a00012cc600012dea00012efe00013070000130a6
-000130b6000130c6000131a0000131b0000131c0000131d0000131e00001
-31f0000132f60001330600013316000133c0000133d00001342200013432
-000135260001353600013546000135560001362800013742000137760001
-37aa000137da0001380a0001383a000138680001389c0001398600013a7c
-00013b5c00013c2600013ce600013d3800013e6a00013f7e000140420001
-40520001415e0001416e0001423800014316000143de000144fc000145c8
-000146c6000146f80001472c0001475c0001478c000147bc000147f00001
-48d20001490200014a2600014a3600014a4600014a7a00014a8a00014b90
-00014c7c00014d4a00014d7a00014daa00014e2a00014e3a00014ef00001
-4f0000014f5800014ff600015006000151e80001530c0001543200015462
-0001558c0001560400015614000156240001563400015688000156980001
-56a8000156b8000157b0000158ae000158be0001592a000159b800015a40
-00015ade00015b9c00015c8400015d3e00015e6800015f8e000160cc0001
-60dc00016202000162f00001634e0001641e0001642e0001661400016766
-0001684a0001687a0001699000016a1a00016bd400016c5a00016c6a0001
-6cd400016ce400016cf400016d5e00016d6e00016ec200016ed200016f5c
-00016fe80001707800017128000171e4000172e4000173a2000174a80001
-75b4000176e200017716000178520001788000017996000179a6000179b6
-000179e8000179f800017b0400017be800017ce600017d2000017d500001
-7df000017e4e00017ebe00017efa00018090000181140001819e000182e6
-000183a00001848a000184da000185620001862a00018668000186ba0001
-8716000188000001885400018892000188ca00018908000189560001899e
-000189e400018a4000018b9600018c3800018d4e00018dac00018e480001
-8e8600018f4000018fb6000190b4000190ee0001917800019234000192d6
-0001935c0001942800019466000194ee000195bc0001969a000197620001
-98700001992600019a3200019ae400019b6c00019c6c00019d5400019dac
-00019e0400019e5800019ea600019f3e0001a04a0001a08e0001a0cc0001
-a1140001a14a0001a1b40001a2940001a2cc0001a2fa0001a3320001a360
-0001a3920001a3c40001a43e0001a4940001a5f20001a6920001a7b00001
-a8600001a8ac0001aa020001aab20001aadc0001ab580001aba00001acd8
-0001add60001ae440001afc60001b1840001b2ea0001b3f80001b4220001
-b5b20001b6f00001b71c0001b7500001b77c0001b7ac0001b91a0001b944
-0001ba540001bb060001bbb60001bc4a0001bd180001be540001be640001
-be980001bf580001c1100001c1e80001c2520001c3780001c3d60001c4e8
-0001c5b60001c6420001c6c00001c79c0001c8dc0001c9d60001ca8c0001
-cb780001cc400001cd1e0001cdee0001cecc0001cf600001d18c0001d1b6
-0001d1e00001d1f00001d21a0001d3540001d4720001d5820001d5ac0001
-d5d60001d6000001d62a0001d6540001d8380001d8620001d88c0001d8b6
-0001d8e00001d90a0001d9340001d95e0001d9880001d9bc0001d9e60001
-da100001da3a0001dbd40001dbe40001dd1c0001dd2c0001dd560001dd80
-0001ddaa0001ddd40001df6e0001e1e80001e3460001e3560001e4c80001
-e4d80001e6360001e81a0001e91c0001eaa20001ec6c0001eec00001f02e
-0001f2220001f2320001f2420001f3a60001f3d00001f3fa0001f4240001
-f44e0001f4780001f4a20001f4cc0001f4f60001f5200001f54a0001f574
-0001f59e0001f5c80001f5f20001f61c0001f8d40001fab40001fc3e0001
-fe7e0001fff6000200200002004a0002007a000200aa000200fa0002014a
-0002018a000201fc00020250000202ae000203040002033a0002037c0002
-03c20002040c0002043c00020474000204a40002060a000209500002097a
-000209a4000209ce000209f800020a2200020a4c00020a7600020aa00002
-0aca00020af400020b1e00020b4800020b7200020b9c00020bc600020bf0
-00020c1a00020c4400020c6e00020c9800020cc200020cec00020d160002
-0d4000020d6a00020d9400020dbe00020de800020e8000020f1000020f3a
-000212c2000213cc00021544000216ca000218ac00021a8000021c9e0002
-1cae00021e5600021fee00022260000224a00002261800022628000226d4
-0002277e000228ba000228ca00022996000229a600022b4800022d300002
-2e9c00022eac00022fb400022fc40002313e0002314e0002327c0002328c
-000233c80002357c000236740002368400023776000238d4000239800002
-399000023ad200023c8000023d7600023d8600023e2a00023e3a00023f22
-00023f3200023ffc0002400c0002412200024132000242f8000243080002
-447600024486000246f800024708000249180002492800024aa400024ab4
-00024be600024bf600024db400024dc400024f3a00024f4a000250b80002
-50c8000250d8000250e8000252a8000252b8000252c8000252d800025428
-0002556000025678000257720002591400025aa600025c0e00025d5c0002
-5f2200025f3200026084000261e6000263cc000263dc0002656400026708
-0002694200026952000269620002697200026adc00026aec00026bbe0002
-6bce00026d0600026d1600026dfc00026e0c00026f4600026f5600027010
-0002702000027146000272aa00027418000275c6000276f6000277060002
-7880000279c200027be200027db400027ec400027ed40002815600028382
-0002864c000288a800028b6800028daa00028f68000290c2000290ec0002
-91160002912600029136000291600002918a000291b4000291c4000291d4
-000291fe000292280002923800029248000292720002929c000292c60002
-92d6000292e6000292f60002930600029316000293260002935000029360
-000293700002939a000293c4000293ee00029418000294420002946c0002
-9496000294c0000294ea000295140002953e0002956800029592000295bc
-000295e6000296100002963a000296640002968e000296b8000296e20002
-970c00029736000297600002978a000297b4000297de0002980800029832
-0002985c00029886000298b0000298da000299040002992e000299580002
-9982000299ac000299d600029a0000029a2a00029a5400029a7e00029aa8
-00029ad200029afc00029b2600029b5000029b7a00029ba400029bce0002
-9bf800029c2200029c4c00029cf400029d3800029dae00029dd800029e02
-00029e2c00029e5600029e8000029eaa00029ed400029efe00029f280002
-9f5200029f7c00029fa600029fd000029ffa0002a0240002a04e0002a078
-0002a0a20002a0cc0002a0f60002a1200002a14a0002a1740002a2260002
-a25a0002a28e0002a2c20002a4460002a5c60002a7320002a8800002a940
-0002aa020002aa740002ab460002ac180002ac8a0002ad4e0002ae400002
-af040002aff60002b09c0002b1a80002b23a0002b3820002b4c00002b524
-0002b64c0002b81a0002ba620002bace0002bb3a0002bba40002bc100002
-bcbe0002bd6c0002be120002beb80002bf5e0002bf8e0002bfbe0002bfee
-0002c0000002c0120002c0240002c0360002c0480002c0b80002c12a0002
-c15a0002c16c0002c17e0002c18e0002c19e0002c1b00002c1c20002c1d4
-0002c1e60002c1f80002c20a0002c3160002c3bc0002c4c80002c56e0002
-c5c60002c5ec0002c6120002c63c0002c66a0002c6b40002c7100002c74a
-0002c7a20002c7e20002c8320002c86a0002c8c00002c9020002c9420002
-c9940002ca060002ca500002cabc0002cafc0002cb680002cba80002cc10
-0002cc520002cca60002cccc0002ccf20002cd1c0002cd4c0002cd7c0002
-cdac0002cdfa0002ce560002ce940002ceee0002cf360002cf8c0002cfd0
-0002d0240002d06a0002d0ac0002d0d20002d1080002d12e0002d1540002
-d17a0002d1a00002d1ce0002d1f80002d2420002d29e0002d2d80002d330
-0002d3700002d3c40002d3fc0002d44c0002d48e0002d4ce0002d5080002
-d5440002d5800002d5bc0002d5ea0002d6140002d6520002d6820002d6a8
-0002d6ce0002d6f40002d71a0002d7440002d76e0002d7ae0002d7fa0002
-d8400002d8780002d8a20002d8cc0002d8fc0002d92c0002d9520002d978
-0002d9a20002d9cc0002d9fe0002da300002da600002da900002dac00002
-daf00002db200002db4e0002db7e0002dbae0002dbde0002dc0e0002dc42
-0002dca20002dcd60002dd3a0002dd6e0002ddce0002de020002de660002
-df0e0002dfde0002e0f40002e1c60002e2400002e2ae0002e4900002e65a
-0002e77a0002e88c0002e9d00002eae40002eb740002ebf40002ec880002
-ed0a0002edca0002ee6a0002ef360002f01c0002f0d40002f1a00002f21c
-0002f22c0002f2fa0002f3ba0002f4840002f5380002f62e0002f6a40002
-f7cc0002f8e60002fa6e0002faf00002fbe00002fcd60002fdce0002fe60
-0003007200030202000302880003040a00030476000304e00003054e0003
-0714000308dc0003096c000309b8000309f600030a3800030a8000030aac
-00030af200030b2800030b6400030ba200030be000030c6800030cf00003
-0d3200030d6a00030da400030dde00030e0600030e2e00030e7200030eb6
-00030ef400030f3200030f6200030f9200030fb800030fde000310200003
-1062000310a8000310ee000311460003119e000311fa00031256000312b2
-0003130e0003135c000313aa000313d2000313fa00031420000314460003
-148a000314ce0003151a00031566000315b0000315fa0003164800031696
-000316d6000317760003179c000317c20003180c0003187c000318a40003
-18cc0003191200031958000319ae00031a0400031a5200031b0c00031b34
-00031b5c00031bb000031c0400031c4400031c8400031caa00031cd00003
-1d3600031d9c00031dde00031e2000031e4600031e6c00031ec200031f18
-00031f7400031fd00003202400032078000320c6000321140003215e0003
-21a8000322020003225c000322b000032304000323460003238800032426
-000324c40003250e00032558000325aa000325fc00032662000326c80003
-272000032778000327a4000327d0000327fc000328280003285400032880
-000328ac000328d8000328fe00032924000329500003297c000329ca0003
-2a1800032a6400032ab000032b0000032b5000032bca00032c2c00032ca4
-00032cee00032e8000032eb400032ee800032f1e00032f4200032fac0003
-301600033098000331000003314800033190000331dc000332460003326e
-00033296000332bc000332e2000333320003338200033416000334680003
-34c6000335240003358a000335f0000336d6000337e6000338b4000339ae
-00033a1a00033a8000033ade00033b4000033bc600033c4c00033cb20003
-3d1800033d8400033df000033e4600033e9c00033ece00033f0000033f26
-00033f4c00033fb80003401e0003407c000340de000341f0000342fc0003
-440a0003450e000345340003455c00034580000345a4000345cc000345f4
-0003461a00034640000347620003489e000349cc00034af800034bb20003
-4c6c00034d2c00034dec00034ed000034fb4000350b0000351ac00035290
-000353740003544a000355200003556a000355b4000355da000356000003
-5650000356a0000356c4000356e8000357be000357ce0003582200035876
-000358d40003593200035972000359b2000359fc00035a4600035a960003
-5ae600035b3c00035b9200035be400035c2200035c9c00035cde00035d22
-00035db000035e3e00035ff0000360000003603a00036074000360a40003
-60d4000361080003613c00036176000361b00003620400036258000362ba
-0003631c000364cc0003665400036690000366c8000367120003675c0003
-67a2000367e80003683800036a5e00036a8400036aaa00036afe00036da8
-00036e7a00036f1600036f6400036fa200036fd4000371c20003747e0003
-7550000376b4000377ee0003789a00037a3000037c8400037ec000037f1a
-00037f600003802e000381200003813e000381e80003830e000383ea0003
-83fc0003855c000386e200038708000387c6000387e40003880a00038830
-000388560003887c000388a2000388c8000388ee00038914000389600003
-89c0000389e800038a0e00038b6c00038d4800038d5800038e2800038f38
-00038f96000390ae0003923c000392e2000394280003947a000394cc0003
-9504000395500003957c000395c2000395ee0003962a00039684000396ce
-0003971a0003978a00039850000398cc0003998c00039a0400039ade0003
-9b6e00039ba800039be400039d5c00039e4c00039e9600039edc0003a026
-0003a1360003a1460003a2500003a3360003a4480003a5140003a62a0003
-a7680003a7780003a8500003a9120003aa120003ab6c0003abcc0003ad50
-0003adc40003af180003b0800003b1640003b1b60003b21e0003b3a80003
-b51e0003b5a60003b74a0003b83a0003b95e0003ba000003baea0003bbd4
-0003bccc0003bdb40003bee60003c02c0003c1ce0003c38a0003c39a0003
-c49e0003c5d00003c67a0003c78e0003c81a0003c98a0003ca520003cb4c
-0003cc9a0003cdb20003cf580003d0980003d1ea0003d30e0003d4c00003
-d6480003d7420003d8180003d9740003da340003da6a0003dad20003dba6
-0003dbb60003dc160003dc720003dccc0003dd040003dd420003dd8c0003
-ddc80003de060003de500003df620003dfb40003e0100003e0bc0003e0e4
-0003e1540003e1840003e1b60003e3600003e4860003e4c00003e4f00003
-e53c0003e56e0003e5940003e5ba0003e5fc0003e63e0003e66e0003e69e
-0003e6e20003e7280003e7660003e7a00003e7da0003e80a0003e8c60003
-e9800003e9c20003e9f20003ea260003ea620003ea920003eac20003eafc
-0003eb340003eb640003eb980003ebcc0003ebf40003ec240003ec540003
-ec880003ecc00003ecf00003ed200003ed600003ed920003edce0003ee00
-0003ee400003ee7a0003eeaa0003eeda0003ef000003ef260003ef4c0003
-ef7c0003f0940003f1920003f1c20003f1f40003f2980003f43e0003f5a8
-0003f6960003f8000003f8300003f8600003f8980003f8d00003f9220003
-f97e0003fa700003fa980003fb060003fb360003fb660003fb8e0003fc00
-0003fc300003fc660003fdc60003fe880003ff6400040088000401800004
-02d0000403ec0004050a0004060e000407700004091600040aae00040cba
-00040df000040e8a00040ff800041008000410d6000412980004149a0004
-154c0004162a00041744000417f400041846000418980004196e00041a54
-00041ae400041c5c00041d5a00041e5c00041f900004206e000421540004
-21f4000422fe000424260004251a000426020004267e000426fa000427a6
-0004285800042936000429ac000429fe00042b7000042cf000042eee0004
-2fb2000430840004316a000432a00004336c000434740004358e00043692
-0004376200043840000439da00043af600043bd000043d4400043f380004
-404e000441fc0004428e00044330000443be0004445c0004456000044570
-000446ca000447da000447ea000448c4000449e800044a4800044b680004
-4c3600044d1800044f000004510e000453e40004561e000457ac000459d6
-00045b7e00045d6000045eba00046026000460a80004615c0004624a0004
-62f600046362000463e4000464bc00046600000467720004688000046890
-000468a00004690200046966000469c400046a5200046ade00046ba40004
-6c3e00046c4e00046c5e00046cf800046d9800046dde00046e5000046ec2
-00046f1000046f4400046fb6000470260004709a000470ea0004717e0004
-720e0004728c00047310000473ac000473d800047446000474f800047606
-000476520004781c00047908000479180004794e00047992000479d60004
-7a1a00047a5000047a8200047ac400047b1a00047b6600047c1400047c8c
-00047d1600047d8a00047df000047e7600047ed600047f4000047fb80004
-802c0004808a00048134000481d000048240000482d200048330000483a2
-00048450000484fa00048594000486080004868e000486f6000487a60004
-886800048918000489ae00048a1000048a8000048ad600048b5800048bda
-00048c6400048cf400048d4e00048dba00048e2a00048e9c00048f100004
-8f980004902c00049096000491100004919000049208000492b20004934e
-000493e200049444000494e600049566000495fc000496a4000497520004
-97ee0004984e000498a600049912000499bc00049a6a00049b3800049be2
-00049c4800049ca000049d0400049d9600049e2000049eb200049f160004
-9f7e00049fe80004a0500004a0bc0004a1380004a1c40004a25c0004a2c8
-0004a3300004a3940004a4440004a5080004a5ba0004a64c0004a6ae0004
-a71e0004a7920004a83a0004a8e40004a9ac0004aa520004aaba0004ab4e
-0004abc40004ac600004ace20004ad600004add00004ae620004aebe0004
-af200004afaa0004b02a0004b0920004b0fa0004b1520004b1c00004b228
-0004b2aa0004b3240004b3a20004b4260004b4820004b4e80004b5500004
-b5f40004b69a0004b75c0004b8100004b8700004b8ec0004b94e0004b9dc
-0004ba780004bb0a0004bb740004bbd60004bc680004bcde0004bd7c0004
-be140004be880004befc0004bf780004bfd60004c03a0004c0b80004c116
-0004c17a0004c1d80004c2380004c2a00004c2f40004c32a0004c3760004
-c3da0004c41a0004c4640004c50e0004c5b60004c60c0004c6440004c694
-0004c7440004c7f20004c8440004c8980004c8f00004c9400004c9980004
-c9fe0004ca5e0004cafe0004cba20004cbe00004cc460004cce40004cd78
-0004ce0a0004ceb00004cee20004cf4a0004cfb20004cffc0004d0ce0004
-d1500004d1f80004d2600004d29e0004d3080004d3ae0004d4040004d458
-0004d4c40004d5280004d5c80004d5fa0004d62a0004d6740004d70c0004
-d7360004d7600004d8280004d8820004d9240004d98e0004da0a0004daba
-0004db300004dba00004dbf80004dc5e0004dcc00004dd600004ddb80004
-de840004def00004df4a0004df940004dfea0004e08a0004e1500004e29c
-0004e3b80004e41c0004e4900004e7b60004e8460004e8c60004e9140004
-ea7c0004eba80004ebf00004ecec0004edb40004ee920004ef840004f03e
-0004f1180004f1820004f21a0004f2ec0004f3e00004f4520004f4c00004
-f5040004f6160004f74a0004f83c0004f8800004f8bc0004f9a60004faa8
-0004fc2a0004fd260004fe2a0004ff340005002000050082000500f80005
-02820005031400050444000505340005065c000507940005085800050940
-00050a0000050b5400050d0600050e9800050fd2000511380005120e0005
-12cc0005138a00051450000515a8000516f8000517080005171800051728
-000517c400051862000518b0000518ee000519340005196400051ac20005
-1c5e00051d7000051e980005202400052196000522a60005247a00052666
-000528c000052a2000052b4a00052cdc00052e4e00053064000532d20005
-33d200053508000536280005377a0005386e000539b4000539f600053a36
-00053c7800053ec600054026000541bc000543ec0005458c000546180005
-46480005469000054724000547be0005491e000549b000054a2000054a60
-00054a9e00054c5000054e8e0005503e000551680005525e000553640005
-553a000556f0000557f20005590800055ace00055cbc00055e6400055fe0
-00056166000562c60005635e000563fa000565180005663e000567960005
-694a00056a8600056bda00056c6000056cde00056d9200056e5800056f04
-00056fce00057100000572a0000572c6000572ec000572fc0005732c0005
-735c000574d00005764000057702000577c4000578a60005797e00057a32
-00057b0600057bb000057c7600057df800057fa800058012000580420005
-806a0005809e000580d2000580e2000580f2000581220005814800058184
-000581c0000581f4000582280005825c00058292000583b8000583c80005
-83f8000584280005845c00058494000584c8000584fc0005853000058564
-00058598000585ce000585fe0005863400058668000586a2000586f20005
-873c00058770000587a4000587da00058810000588c4000588d4000589de
-00058b4a00058cb400058e5400058f9a000590f2000591e4000592ee0005
-93d2000594d2000595f8000596e4000597a0000598620005994a00059a04
-00059ace00059b5600059c0400059c9600059d1400059e2e00059e9a0005
-9f620005a05e0005a0cc0005a13c0005a1f40005a3d80005a4e60005a56c
-0005a5b20005a67a0005a70a0005a7f40005a8a00005a90e0005aa160005
-ab020005abc20005ac080005ac9a0005ada80005ae440005aea00005af96
-0005b0900005b2120005b3760005b4740005b55e0005b62c0005b6540005
-b67c0005b6ac0005b6dc0005b7040005b72c0005b7540005b77c0005b7d6
-0005b8400005b8720005b8a20005b8c80005b8f00005b9180005b9420005
-b96c0005b9940005b9bc0005b9e20005ba0e0005ba980005bac00005bb42
-0005bb6a0005bb900005bbb60005bbdc0005bc2e0005bc820005bcb40005
-bce40005bd160005bd520005bd820005bdb80005bdde0005be040005be38
-0005be6c0005beac0005bef20005bf180005bf3e0005bf640005bf8a0005
-bfb40005c0180005c0640005c0960005c0c40005c0fa0005c1380005c160
-0005c1860005c1ac0005c1f60005c2380005c2600005c2860005c2b20005
-c2d80005c3340005c3640005c3940005c3c40005c3ea0005c4140005c444
-0005c4740005c49a0005c4c00005c4e60005c50c0005c5320005c5580005
-c5800005c5f80005c6220005c68c0005c6b40005c7580005c7800005c7fc
-0005c8300005c8720005c8a20005c8d20005c9020005c9320005c95e0005
-c9840005c9cc0005ca0e0005ca3a0005ca620005ca920005cac20005cae8
-0005cb0e0005cb3a0005cbee0005cc160005ccc60005cd080005cd4a0005
-cd7a0005cdae0005cdd40005cdfc0005ce220005ce4a0005ce700005ce98
-0005cec00005cee80005cf0e0005cf340005cf5a0005cf800005cfa80005
-d0300005d0640005d0ca0005d0fa0005d12a0005d1500005d1760005d1b0
-0005d1f40005d2260005d2620005d2920005d2c20005d2f60005d32a0005
-d35a0005d3900005d3c80005d3f80005d4260005d4500005d47e0005d4a4
-0005d4ca0005d4fe0005d5440005d57e0005d5ba0005d5ec0005d61c0005
-d6580005d6940005d6d00005d71a0005d7640005d79c0005d7da0005d816
-0005d8560005d8b20005d90e0005d96a0005d9c60005da300005da9a0005
-daca0005db020005db420005db860005dbca0005dc0e0005dc6a0005dcc6
-0005dd320005dd9e0005de0a0005de760005dea60005ded60005df0e0005
-df460005df860005dfc60005e0020005e03e0005e09a0005e0f60005e15a
-0005e1be0005e2220005e2860005e2e40005e3420005e3700005e39e0005
-e3d00005e4020005e4340005e4660005e4a40005e4e20005e5520005e5c4
-0005e6260005e6880005e6ea0005e74c0005e7a40005e7fc0005e82c0005
-e85c0005e8900005e8c40005e8f80005e92c0005e9860005e9f20005ea5c
-0005eac60005eb2e0005eb960005ebc60005ebf60005ec2a0005ec5e0005
-ec9e0005ecde0005ed1a0005ed560005edaa0005ee100005ee640005eeb2
-0005eee20005ef120005ef460005ef7a0005efae0005efe20005f01a0005
-f0520005f0ae0005f1040005f1640005f1c40005f21a0005f2700005f2ca
-0005f31e0005f3540005f3860005f3c40005f3f40005f4240005f46e0005
-f49c0005f4cc0005f5120005f54a0005f5860005f5ca0005f5fe0005f62e
-0005f6780005f6cc0005f7220005f7780005f7dc0005f8400005f8920005
-f8e80005f9340005f9860005f9f20005fa5e0005faca0005fb360005fbb2
-0005fc2e0005fc700005fcb20005fcfa0005fd420005fd940005fde60005
-fe340005fe820005fef00005ff5e0005ffd40006004a000600c000060136
-000601a600060216000602580006029a000602de00060322000603660006
-03aa000603f40006043e000604ac0006051400060586000605f800060660
-000606c80006073200060796000607cc0006080200060852000608800006
-08cc000609080006095e0006098e000609be000609ea00060a1600060a3c
-00060a9000060afe00060b5200060bee00060ce000060d2200060d480006
-0da400060dd400060e1600060e7c00060eea00060f5000060fba00060fe0
-00061088000611260006126600061294000612c2000613260006138a0006
-13b8000613ec0006141c0006144c000614bc00061532000615da00061678
-000617b4000617e4000618140006187a000618e000061910000619400006
-1970000619a6000619d600061a0600061a5200061ab200061b0e00061be8
-00061cc200061d3400061d7a00061da000061de200061e1200061e540006
-1e8800061ef200061f3800061fae00061fd40006204400062092000621b2
-00062444000625d800062730000628e200062bf000062e860006306e0006
-320c00063464000635a6000637bc0006382c000638940006390600063978
-00063a0000063a9e00063c7c00063e2a00063ff6000640f60006428a0006
-43ea000644ae000645a40006460c0006466e000646dc0006474000064814
-0006487c0006494600064a0400064aa000064b0200064b9800064c2a0006
-4cc600064d5e00064dc400064e2200064e8e00064ef600064f7200065020
-0006508a000650e80006514a000651fc0006527e00065300000653360006
-5368000653780006538800065494000655bc000657dc0006592e0006593e
-000659f800065aee00065b7800065b8800065c0800065c8000065ca20006
-5d6400065d7400065d8400065d9400065da400065ea000065fe6000661a6
-000663ba000664ac00066512000665760006663800066648000667e20006
-67f200066802000668c6000669e200066abe00066ace00066ade00066aee
-00066c4a00066e3a00066f4a00066f5a00066f6a00066f7a00066f8a0006
-704000067050000671a6000672e2000673d0000674e000067584000675f2
-000676620006777c000677e000067824000678b200067a7200067ab20006
-7ba600067c7200067d3e00067dc400067e9a00067f360006809e00068122
-000681b600068330000684a20006862a0006870e000688d8000689c20006
-8ab000068bdc00068d0200068e5c00068fc60006910800069180000692b6
-000693ae000694ac000695a80006968e00069718000697a2000698940006
-995000069a1200069abe00069bb400069c9000069d9400069ed400069fbc
-0006a13c0006a26a0006a36e0006a3b80006a4240006a4e40006a5c00006
-a6fe0006a7e60006a9320006aa600006ab6a0006ac0c0006ad580006ae14
-0006af3e0006b0000006b0480006b2420006b2f80006b4e60006b6420006
-b7e00006b8e20006b9480006ba900006bb080006bc980006bcce0006bd04
-0006bd560006bda80006bde00006be200006be580006be980006bfc60006
-c0280006c0e80006c19c0006c23e0006c2d60006c3520006c45e0006c4bc
-0006c5ea0006c69a0006c7680006c7a20006c7de0006c8660006c9260006
-ca220006caf80006cb1e0006cb440006cbdc0006cbec0006cbfc0006cc0c
-0006cc1c0006cc2c0006cc3c0006cc4c0006cc5c0006cc6c0006cc7c0006
-cc8c0006cc8c0006cdf00006ce000006ce740006cf0e0006d01c0006d176
-0006d2d60006d4900006d65e0006d8320006d8b60006d9d40006db1e0006
-dcc60006dd620006ddb20006de480006df660006dfb60006e0460006e170
-0006e1800006e2ae0006e3be0006e4340006e48c0006e5780006e5be0006
-e5fe0006e69a0006e6ee0006e8700006e94e0006e98e0006e9f80006ea62
-0006ea9a0006ebe20006ecd80006ede60006ee1e0006ee560006ee7c0006
-eea20006eed20006ef020006ef260006ef4a0006ef760006efa20006efe8
-0006f02e0006f05a0006f0860006f0cc0006f1120006f16e0006f1ca0006
-f1ee0006f2120006f26a0006f2c20006f3080006f34e0006f3840006f3ba
-0006f3f00006f4260006f4880006f4f20006f5520006f5b20006f5fe0006
-f6cc0006f6f40006f71c0006f7880006f7f40006f8420006f8900006f996
-0006f9a60006f9f00006fa3a0006fa820006faca0006fb280006fb8a0006
-fbe40006fc360006fcba0006fd220006fd960006fe080006fe8e0006fefc
-0006ff6e0006ffd40006fffa0007002000070044000700680007009c0007
-00d0000700f60007011c00070188000701f400070260000702c80007031a
-0007036c000703c2000704140007043c0007046400070496000704c40007
-051a00070570000705cc000706280007064e00070674000706a0000706cc
-0007072800070784000707a8000707cc000708820007093800070b0a0007
-0b1a00070b7e00070be200070c2e00070c7a00070e3e00070e4e00070f5c
-00070f6c00070fc60007102000071078000710d000071134000711980007
-11dc00071220000713b6000715480007169800071866000719e400071b9e
-00071ccc00071dc40007203e000721c2000723ea00072566000725f20007
-272a0007294e000729d6000729e600072b5600072c8200072dea00072f30
-00073066000731640007333a000734ee0007357e000736c2000737ae0007
-38fc000739ea00073bd600073cf200073e1400073fe800074152000742f6
-000743fc0007454c000746a40007489a00074a7600074bda00074c9e0007
-4dd200074e9c00074fa60007512000075214000752f80007549600075668
-0007567800075726000757f000075800000758c800075962000759ae0007
-59be00075a3800075b0c00075b6800075c1800075c5a00075d9000075e86
-00075f82000760820007612000076264000763ac000765cc000766620007
-676200076882000769ca00076a8600076b6000076c3c00076d0800076e0a
-00076fb6000770d6000771fc0007728a0007731a0007742c0007748c0007
-7578000776e40007781600077912000779fe00077b2400077cb400077e5a
-0007802600078156000781d800078258000782e200078362000783ec0007
-84a800078550000785fe000786a600078720000787a40007881e000788a2
-00078958000789fa00078a9a00078b3c00078bb800078c3e00078cba0007
-8d4000078df800078ea200078f4800078ff0000790e0000791d4000792b4
-0007939c0007948e0007958200079668000797540007991c00079a7e0007
-9b2200079c3200079cf800079d0800079dfc00079f5600079fea0007a094
-0007a15e0007a2300007a3120007a3ae0007a4980007a5be0007a5ce0007
-a6880007a7420007a7520007a7fa0007a8a00007a98e0007aa7c0007ab58
-0007ac2a0007adae0007af540007afee0007b08a0007b0c60007b1040007
-b1400007b17e0007b1d80007b2300007b28a0007b2ee0007b37a0007b578
-0007b5cc0007b5dc0007b6680007b6ec0007b7700007b8280007b9380007
-baf60007bc140007bca40007bd480007bdf80007beda0007bf5c0007bfea
-0007c1120007c15a0007c1b20007c28c0007c2c80007c3260007c3640007
-c3960007c3da0007c41c0007c44c000100000d3500f2003c008f00060002
-0010002f0055000006fa02c20005000200>
-<0000005303ea0000000300000000006a00000000000300000001000a006a
-00000003000000020008007400000003000000030058007c000000030000
-0004001400d40000000300000005001800e8000000030000000600180100
-000000030000000700ba01180000000300000008003001d2000000030000
-0009008a0202000000030000000d02aa028c000100000000000000350536
-00010000000000010005056b000100000000000200040570000100000000
-0003002c05740001000000000004000a05a00001000000000005000c05aa
-0001000000000006000c05b60001000000000007005d05c2000100000000
-00080018061f000100000000000900450637000100000000000d0155067c
-0003000104030002000e07d10003000104030004001a07df000300010405
-0002000a07f9000300010405000400160803000300010406000200060819
-00030001040600040012081f000300010407000200080831000300010407
-0004001408390003000104080002000c084d000300010408000400180859
-0003000104090000006a08710003000104090001000a08db000300010409
-0002000808e50003000104090003005808ed000300010409000400140945
-000300010409000500180959000300010409000600180971000300010409
-000700ba0989000300010409000800300a430003000104090009008a0a73
-000300010409000d02aa0afd00030001040a0002000e0da700030001040a
-0004001a0db500030001040b000200120dcf00030001040b0004001e0de1
-00030001040c000200080dff00030001040c000400140e0700030001040e
-000200100e1b00030001040e0004001c0e2b000300010410000200120e47
-0003000104100004001e0e59000300010413000200060e77000300010413
-000400120e7d0003000104140002000e0e8f0003000104140004001a0e9d
-000300010415000200140eb7000300010415000400200ecb000300010416
-0002000e0eeb0003000104160004001a0ef9000300010419000200140f13
-000300010419000400200f2700030001041b0002000a0f4700030001041b
-000400160f5100030001041d000200060f6700030001041d000400120f6d
-00030001041f0002000a0f7f00030001041f000400160f89000300010424
-0002000c0f9f000300010424000400180fab00030001042a000200080fc3
-00030001042a000400140fcb00030001042d0002000a0fdf00030001042d
-000400160fe900030001080a0002000e0fff00030001080a0004001a100d
-0003000108160002000e10270003000108160004001a1035000300010c0a
-0002000e104f000300010c0a0004001a105d000300010c0c000200081077
-000300010c0c00040014107f00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0042006f006c0064004d006f006e006f007400790070
-0065003a0041007200690061006c00200042006f006c0064003a00560065
-007200730069006f006e00200035002e0030003100200028004d00690063
-0072006f0073006f0066007400290041007200690061006c00200042006f
-006c006400560065007200730069006f006e00200035002e003000310041
-007200690061006c002d0042006f006c0064004d00540041007200690061
-006c00200069007300200061002000740072006100640065006d00610072
-006b0020006f006600200054006800650020004d006f006e006f00740079
-0070006500200043006f00720070006f0072006100740069006f006e0020
-0069006e002000740068006500200055006e006900740065006400200053
-0074006100740065007300200061006e0064002f006f00720020006f0074
-00680065007200200063006f0075006e00740072006900650073002e0054
-006800650020004d006f006e006f007400790070006500200043006f0072
-0070006f0072006100740069006f006e004d006f006e006f007400790070
-006500200054007900700065002000440072006100770069006e00670020
-004f006600660069006300650020002d00200052006f00620069006e0020
-004e006900630068006f006c00610073002c002000500061007400720069
-0063006900610020005300610075006e0064006500720073002000310039
-003800320059006f00750020006d00610079002000750073006500200074
-00680069007300200066006f006e007400200074006f0020006400690073
-0070006c0061007900200061006e00640020007000720069006e00740020
-0063006f006e00740065006e00740020006100730020007000650072006d
-0069007400740065006400200062007900200074006800650020006c0069
-00630065006e007300650020007400650072006d007300200066006f0072
-0020007400680065002000700072006f006400750063007400200069006e
-0020007700680069006300680020007400680069007300200066006f006e
-007400200069007300200069006e0063006c0075006400650064002e0020
-0059006f00750020006d006100790020006f006e006c0079002000280069
-002900200065006d0062006500640020007400680069007300200066006f
-006e007400200069006e00200063006f006e00740065006e007400200061
-00730020007000650072006d006900740074006500640020006200790020
-00740068006500200065006d00620065006400640069006e006700200072
-00650073007400720069006300740069006f006e007300200069006e0063
-006c007500640065006400200069006e0020007400680069007300200066
-006f006e0074003b00200061006e00640020002800690069002900200074
-0065006d0070006f0072006100720069006c007900200064006f0077006e
-006c006f006100640020007400680069007300200066006f006e00740020
-0074006f002000610020007000720069006e0074006500720020006f0072
-0020006f00740068006500720020006f0075007400700075007400200064
-0065007600690063006500200074006f002000680065006c007000200070
-00720069006e007400200063006f006e00740065006e0074002ea9203230
-303620546865204d6f6e6f7479706520436f72706f726174696f6e2e2041
-6c6c205269676874732052657365727665642e417269616c426f6c644d6f
-6e6f747970653a417269616c20426f6c643a56657273696f6e20352e3031
-20284d6963726f736f667429417269616c20426f6c6456657273696f6e20
-352e3031417269616c2d426f6c644d54417269616c206973206120747261
-64656d61726b206f6620546865204d6f6e6f7479706520436f72706f7261
-74696f6e20696e2074686520556e697465642053746174657320616e642f
-6f72206f7468657220636f756e74726965732e546865204d6f6e6f747970
-6520436f72706f726174696f6e4d6f6e6f74797065205479706520447261
-77696e67204f6666696365202d20526f62696e204e6963686f6c61732c20
-5061747269636961205361756e646572732031393832596f75206d617920
-757365207468697320666f6e7420746f20646973706c617920616e642070
-72696e7420636f6e74656e74206173207065726d69747465642062792074
-6865206c6963656e7365207465726d7320666f72207468652070726f6475
-637420696e207768696368207468697320666f6e7420697320696e636c75
-6465642e20596f75206d6179206f6e6c792028692920656d626564207468
-697320666f6e7420696e20636f6e74656e74206173207065726d69747465
-642062792074686520656d62656464696e67207265737472696374696f6e
-7320696e636c7564656420696e207468697320666f6e743b20616e642028
-6969292074656d706f726172696c7920646f776e6c6f6164207468697320
-666f6e7420746f2061207072696e746572206f72206f74686572206f7574
-7075742064657669636520746f2068656c70207072696e7420636f6e7465
-6e742e004e0065006700720065007400610041007200690061006c002000
-4e00650067007200650074006100740075010d006e00e900410072006900
-61006c002000740075010d006e00e9006600650064004100720069006100
-6c002000660065006400460065007400740041007200690061006c002000
-46006500740074038803bd03c403bf03bd03b10041007200690061006c00
-20038803bd03c403bf03bd03b100a9002000320030003000360020005400
-6800650020004d006f006e006f007400790070006500200043006f007200
-70006f0072006100740069006f006e002e00200041006c006c0020005200
-690067006800740073002000520065007300650072007600650064002e00
-41007200690061006c0042006f006c0064004d006f006e006f0074007900
-700065003a0041007200690061006c00200042006f006c0064003a005600
-65007200730069006f006e00200035002e0030003100200028004d006900
-630072006f0073006f0066007400290041007200690061006c0020004200
-6f006c006400560065007200730069006f006e00200035002e0030003100
-41007200690061006c002d0042006f006c0064004d005400410072006900
-61006c00200069007300200061002000740072006100640065006d006100
-72006b0020006f006600200054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-200069006e002000740068006500200055006e0069007400650064002000
-530074006100740065007300200061006e0064002f006f00720020006f00
-7400680065007200200063006f0075006e00740072006900650073002e00
-54006800650020004d006f006e006f007400790070006500200043006f00
-720070006f0072006100740069006f006e004d006f006e006f0074007900
-70006500200054007900700065002000440072006100770069006e006700
-20004f006600660069006300650020002d00200052006f00620069006e00
-20004e006900630068006f006c00610073002c0020005000610074007200
-690063006900610020005300610075006e00640065007200730020003100
-39003800320059006f00750020006d006100790020007500730065002000
-7400680069007300200066006f006e007400200074006f00200064006900
-730070006c0061007900200061006e00640020007000720069006e007400
-200063006f006e00740065006e0074002000610073002000700065007200
-6d0069007400740065006400200062007900200074006800650020006c00
-6900630065006e007300650020007400650072006d007300200066006f00
-720020007400680065002000700072006f00640075006300740020006900
-6e0020007700680069006300680020007400680069007300200066006f00
-6e007400200069007300200069006e0063006c0075006400650064002e00
-200059006f00750020006d006100790020006f006e006c00790020002800
-69002900200065006d006200650064002000740068006900730020006600
-6f006e007400200069006e00200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-2000740068006500200065006d00620065006400640069006e0067002000
-7200650073007400720069006300740069006f006e007300200069006e00
-63006c007500640065006400200069006e00200074006800690073002000
-66006f006e0074003b00200061006e006400200028006900690029002000
-740065006d0070006f0072006100720069006c007900200064006f007700
-6e006c006f006100640020007400680069007300200066006f006e007400
-200074006f002000610020007000720069006e0074006500720020006f00
-720020006f00740068006500720020006f00750074007000750074002000
-640065007600690063006500200074006f002000680065006c0070002000
-7000720069006e007400200063006f006e00740065006e0074002e004e00
-65006700720069007400610041007200690061006c0020004e0065006700
-72006900740061004c0069006800610076006f0069007400750041007200
-690061006c0020004c0069006800610076006f0069007400750047007200
-6100730041007200690061006c00200047007200610073004600e9006c00
-6b00f6007600e900720041007200690061006c0020004600e9006c006b00
-f6007600e9007200470072006100730073006500740074006f0041007200
-690061006c002000470072006100730073006500740074006f0056006500
-740041007200690061006c002000560065007400480061006c0076006600
-6500740041007200690061006c002000480061006c007600660065007400
-50006f00670072007500620069006f006e00790041007200690061006c00
-200050006f00670072007500620069006f006e0079004e00650067007200
-690074006f0041007200690061006c0020004e0065006700720069007400
-6f041f043e043b0443043604380440043d044b0439004100720069006100
-6c0020041f043e043b0443043604380440043d044b043900540075010d00
-6e00e90041007200690061006c002000540075010d006e00e90046006500
-740041007200690061006c0020004600650074004b0061006c0131006e00
-41007200690061006c0020004b0061006c0131006e004b00720065007000
-6b006f0041007200690061006c0020004b007200650070006b006f011100
-e20323006d0041007200690061006c0020011100e20323006d004c006f00
-64006900610041007200690061006c0020004c006f006400690061004e00
-65006700720069007400610041007200690061006c0020004e0065006700
-72006900740061004e00650067007200690074006f004100720069006100
-6c0020004e00650067007200690074006f004e0065006700720069007400
-610041007200690061006c0020004e006500670072006900740061004700
-72006100730041007200690061006c00200047007200610073000000b154
-80410d03ac00af03ac0002001003ac002003ac00a003ac0003004003acb3
-070d3240b803acb312143240b803acb2162b32b9ffc003acb23a3340b803
-acb32d943280bc03ab005f0033ffc003abb2553340b803abb340443240b8
-03abb3333b3240b803abb32f313240b803abb2083340b803abb30714321f
-411a03ab002f03ab0002000f03ab002f03ab004f03ab008f03ab009f03ab
-00bf03ab0006001003ab00df03ab00ff03ab000303a803a2b2461f40b803
-a5b208330f411403a50001004003a500cf03a500ff03a50003002003a500
-af03a500ef03a500ff03a50004ffc003a3b3090c3240b803a3b208330f41
-1b03a30001000f03a3001003a3008003a300af03a300cf03a30005006f03
-a3009f03a300ff03a30003009f03a200af03a2000203a203a1b2101f1041
-0a039e007f039e0002039a000f0101001fffc00398b310143240b80399b3
-0f1332404110039500500395000200b0034d00c0034d0002006f0391007f
-03910002ffc0034bb22d3132b9ffc0034bb30a0e32104110038b0020038b
-0080038b000300a0038b00010020038b0040038b0002ffc0038bb3131632
-40b80383b20f1132b9ffc0037bb2303432b9ffc0037bb310183250411403
-7800010365036e0023001f037e036e001e001f0363036e001d001f036203
-64000d001fffc00340b30f1032804110033f0001033f03150029001f0341
-03160032001f0344031a001b001fffc00375b20e1132b9ffc00375b2282a
-32410a034303180032001f030f030d0034001f03080307b2321f20bb0340
-000100400388b3090b3240b80388b2101532bd038503070014001f038003
-07b2171f0fbd030a002f030a0002ffc00354b3090d3290410c035400a003
-540002001f036e0001009f036e00010040036eb2090b3241110345031c00
-16001f036b031d0015001f0346031e0015001f03a703a10046001f039db3
-261c1fc0bb0393000100400392b3090d3240b8033eb2083340b8033eb30d
-0e32c04109033e000100b0038e00c0038e0002ffc00390b3263832004126
-03280030032800020020037f0030037f00020010038a0030038a0050038a
-006f038a007f038a009f038a000600000389003003890002002f037a0070
-037700900377009f037a0004ffc00315b20f1032b9ffc00315b2242832b9
-03190318b2321f10bb031a0001ffc0031ab3090e3240b80318b2121332b9
-ffc00318b30c0e323fbd0373004f0373000200400374b31718326fbb032a
-00010040032cb3181b3240b80370b2090c32bd031703160032001fffc003
-16b20e1132bd031c031e0016001f031d031eb2151fb0411f031e0001000f
-031f000102ca02d00015001f02d302d5000d001f02cf02d0000d001f02cb
-02d0000d001f02cd02d0000d001f02ce02d0000d001fffc002d0b3090c32
-40b802d2b3090c32e0411c02e50001005f02dd009f02e5000202bb02c300
-30001f02da02b80032001f02d902b9003f001f02d802b80064001f02b902
-b80033001f02bab221c81fb802b8b321c81f40b8039bb20d1632b9ffc002
-c3b22b2f32b9ffc002c3b21f2532b9ffc002c3b2171b32b9ffc002c3b212
-1632412502c202c1001c001f02d702c10024001f02c102c00022001f02bf
-02c00018001f02c0027400c8001f02b50235003b001f02b40235003b001f
-02c402bc001e001f02b702b60038001f02b3b20ec81fb802b0b207c81fb8
-02afb206c81fb802aeb200c81fb802afb2502f1fbc02ae02ab001a001f02
-adb2261a1fb802a8b326241f0fbb0235000102a50274b21d1f12410a02a1
-015801f4001f02a000d801f4001f001202a2b237c81fb80290b2bc201fb9
-029002904018374025402d40a6033025302d30a6032025202d203720a620
-4110028e0005009f028b0001028b028b0037002002890030028900400289
-00900289b20437b041fd027400c0027400020080027400a0027400020060
-0274007002740002000002740010027400020080027400f002740002003f
-0285004f028500020090027e0090027f009002800090028100040090027a
-0090027b0090027c0090027d000400900274009002750090027700030070
-027e0070027f007002800070028100040070027a0070027b0070027c0070
-027d000400700274007002750070027700030060027e0060027f00600280
-0060028100040060027a0060027b0060027c0060027d0004006002740060
-02750060027700030050027e0050027f005002800050028100040050027a
-0050027b0050027c0050027d000400500274005002750050027700030040
-027e0040027f004002800040028100040040027a0040027b0040027c0040
-027d000400400274004002750040027700030030027e0030027f00300280
-0030028100040030027a0030027b0030027c0030027d0004003002740030
-02750030027700030020027e0020027f002002800020028100040020027a
-0020027b0020027c0020027d000400200274002002750020027700030010
-027e0010027f001002800010028100040010027a0010027b0010027c0010
-027d0004001002740010027500100277000300e0027e00e0027f00e00280
-00e00281000400e0027a00e0027b00e0027c00e0027d000400e0027400e0
-027500e00277b103d041c5027e00d0027f00d0028000d00281000400d002
-7a00d0027b00d0027c00d0027d000400d0027400d0027500d00277000300
-30027400400274000200c0027e00c0027f00c0028000c00281000400c002
-7a00c0027b00c0027c00c0027d000400c0027400c0027500c00277000300
-b0027e00b0027f00b0028000b00281000400b0027a00b0027b00b0027c00
-b0027d000400b0027400b0027500b00277000300a0027e00a0027f00a002
-8000a00281000400a0027a00a0027b00a0027c00a0027d000400a0027400
-a0027500a0027700030090027e0090027f00900280009002810004009002
-7a0090027b0090027c0090027d0004009002740090027500900277000300
-20027e0020027f002002800020028100040020027a0020027b0020027c00
-20027d00040020027400200275002002770003028101580801001f028001
-290801001f027f00ec0801001f027e00d80801001f027d00b10801001f02
-7c00a60801001f027b00820801001f027a00370801001f02770026080100
-1f027500200801001f0274001f0801b21f370f41160235004f0235005f02
-35006f0235009f023500af023500bf0235000700af023500cf023500df02
-3500ff02354022040f074f079f07af07bf0705af07e007020f064f069f06
-af06bf0605af06e0060220411b020d0001005f02350001008f0235000100
-7f023500ef02350002002f0235003f02350002003f0234004f0234000202
-350235023402344011ed20ef2a01cf2a01bf2a01af2a018f2a0141090247
-0104001e001f022000370201001f0158400c263e1fd8263e1f3726273e1f
-b8028eb6ec171fb226361fb801bcb226361fb80129402b26361fec26361f
-b126361fa626361f8226361f3726361f3226361f2d26361f2526361f1f26
-361f37262a1fb801584022263e1fd8263e1fbc263e1f27263e1f21263e1f
-20263e1f3700161600000012110840b9020d01a6b3c50d0009b801bcb227
-281fb801bbb227301fb801b8b2274f1fb801b7b227621f410901b6002701
-01001f01b5002002ab001f01afb21fe41fb801adb21fe41fb801acb21fbb
-1fb801a8b21f341fb8015db2272e1fb8015bb227cd1f410d0155001f0401
-001f0154001f0401001f0153001f0201001f0152b21f561fb80151b21f29
-1fb8012bb227261f410d012a00270125001f0129015800e4001f0125001f
-0401001f0124b21fe41fb80123b21f3b1fb80122b21f391f410d01080027
-0801001f0106002d0101001f0105001f0101001f0103b31fbb1fefb90158
-0401400b1fed1f931fec1fe41feb1fb80201b21fd920b80401b21fcf25b8
-0156400a1fbc2d9e1fbb1f411fb2410a01580401001f00b101580401001f
-00b001580401b51fa625891f9bb901580125b61f991f2e1f8e2db80801b5
-1f8d1f291f89b901580401b21f8220b802ab40131f801f301f742de41f73
-1f4a1f611f521f5d25b802abb21f5c1fbc0801001f0059015802abb61f50
-25891f491fb80125b21f4725b80401400b1f461f791f401f271f3920bc02
-ab001f003801580401b21f372dbc0125001f003201580125b61f2c1f341f
-2a25b80801b21f5537b80111402a07f00790075b0742073b07230722071e
-071d071408120810080e080c080a080808060804080208000814b8ffe040
-2b0000010014061000000100060400000100041000000100100200000100
-0200000001000002010802004a00b013034b024b5342014bb0c063004b62
-20b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807ff52
-b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ffb101
-018e851bb0124358b10100858d1bb900010119858d5959001816763f183f
-123e113946443e113946443e113946443e113946443e11394660443e1139
-4660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b182b1db096
-4b5358b0aa1d59b0324b5358b0ff1d594bb08153205c58b9020f020d4544
-b9020e020d45445958b90470020f455258b9020f04704459594bb0e45320
-5c58b90020020e4544b90027020e45445958b908420020455258b9002008
-424459594bb8012553205c58b90026020f4544b90021020f45445958b90a
-0d0026455258b900260a0d4459594bb8040153205c58b1d8204544b12020
-45445958b9250000d8455258b900d825004459594bb8040153205c58b901
-5800264544b1262645445958b923200158455258b9015823204459594bb0
-2953205c58b11f1f4544b12d1f45445958b9010d001f455258b9001f010d
-4459594bb02f53205c58b11f1f4544b1251f45445958b90135001f455258
-b9001f01354459594bb8030153205c58b11f1f4544b11f1f45445958b914
-28001f455258b9001f14284459592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65422b01b331757ec3456523
-456023456560234560b08b766818b080622020b17e754565234520b00326
-6062636820b003266165b075236544b07e234420b131c34565234520b003
-266062636820b003266165b0c3236544b0312344b100c3455458b1c34065
-44b23140314523614459b33f3c5841456523456023456560234560b08976
-6818b080622020b1583c4565234520b003266062636820b003266165b03c
-236544b058234420b13f414565234520b003266062636820b003266165b0
-41236544b03f2344b10041455458b141406544b23f403f45236144594569
-5342014b5058b108004259435c58b108004259b3020b0a124358601b2159
-421610703eb0124358b93b21187e1bba040001a8000b2b59b00c2342b00d
-2342b0124358b92d412d411bba04000400000b2b59b00e2342b00f2342b0
-124358b9187e3b211bba01a80400000b2b59b0102342b0112342002b2b2b
-2b2b2b2b2b00b01243584bb035514bb021535a58b1262645b04061445959
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b737373737345b040614418
-004569444569447373737473737374737473742b2b2b2b2b2b2b2b2b2b2b
-2b0073737373737373737373737373737373737373737373747474747474
-7474747474747474747474747474747575757374757575752b7300004bb0
-2a534bb036515a58b1070745b040604459004bb02e534bb036515a58b103
-0345b0406044b1090945b8ffc06044592b4569440174007373732b456944
-2b012b435c58400a0006000702a006a00702b9ffc00274b31a1d326fbd02
-77007f02770002ffc00277b22f3132b9ffc00277b322253240b80274b32f
-353240b80274b3282a3240b80274b21a2132b8ffc0b3371a1d32b8ffc0b3
-251a1d32b8ffc040112d1a1d329025902d9037a025a02da03706b8ffc0b6
-a61a1d321fa61fb8028eb22fa60300742b732b2b2b2b2b2b2b2b742b7374
-59002b2b435c58b9ffc002a1b21c1d32b9ffc002a0b21c1d322b2b592b73
-012b2b2b2b002b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b012b2b2b2b2b
-2b2b73742b2b2b2b2b2b2b2b73732b2b2b2b2b2b732b732b2b2b742b2b2b
-73737373732b73732b2b2b732b2b002b2b2b2b7374732b732b2b2b2b752b
-2b2b2b2b2b2b2b752b2b2b2b2b732b2b2b2b7374752b2b7373732b2b2b73
-2b737374752b2b7374752b2b7374752b2b2b2b2b2b2b2b2b2b2b2b74752b
-000000>
-[16305 16261 16301 15993 16353 16361 16377 15773 16093 16113 15821 16109 16365
-15025 16197 16361 15857 16053 15881 16233 16301 15449 16065 16377 15477 15965
-16117 15425 15557 16353 16369 11749 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-3 1212 70 <00010055ffe8043f043e001900e14051580f59125916680f691269167d18
-79199702970cc610c618d710d618e906e908e913e915f80613381338154a
-124a164618590c690c073a1237163718037705770f8705860f8919a812a7
-16b912b616090eb8ffc0b3181b340eb8ffc0b51214340e330db8ffc0b319
-1e340db8ffc0b30f11340dba0104000a02744012110b0040181b34004012
-1434003390010101ba0101000402744020170701401214340121002f0d40
-1214340d214f0e010e1a1b072114191a5841182b4e10f44ded4e10f65d4d
-ed2bf4ed2b003ffdf45de42b2b3ffdf42b2be42b2b3130005d7101715d01
-052626232206151416333236370506062322001110003332160431feeb0e
-634f697d7f6b50661501142bf4cde9feeb0116edc2e502ec32535491aabd
-9c5b6f2fbec20126010401070125a700>Arial-BoldMT AddT42Char 
-3 1768 72 <00020041ffe80427043e0014001c01a3b90010fff840460b3999099a0d96
-10a805a70abb09bb0db81a0808140148024706460a4f1ea80db606b61ac7
-0ac80cd60ad80cf807f70d0d1c0f1c15401b1d3415400e11340f15bf15cf
-150315b8ffc0b30f1e3f15b8ffc0b30e173f15b8028d400c0f0e12500e60
-0e020e181201b8ffc0b6191b3401331200b8ffc0b31d203400b8ffc0b322
-293400b8ffc0b32b2d3400b8ffc0b3181c3400b8ffc0400f0e0f34a00001
-0000100002005f1212b80274b3040b1218b8027440240b070021012f1521
-4f0e010e1a2f1e5f1e6f1e9f1e041e0f2108400d0f3408191d6941182b4e
-10f42b4ded4e105df65d4dedf4ed003fed435c584014184028143f18401e
-0f3f18401b103f18401c113f2b2b2b2b593ffd435c58b90012ffc0b32814
-3f12b8ffc0b31e0f3f12b8ffc0b31b103f12b8ffc0b21c113f2b2b2b2b59
-f45d712b2b2b2b2b435c58b90000ffc0b2123900b8ffc0b2173900b8ffb0
-b3090a3e00b8ffc0b241213f2b002b2b2b59e42b1112395d435c5840140e
-400f1e3f0e401c113f0e401b103f0e400e173f002b2b2b2b592f3cfd2b2b
-722b2b3c0111333130015d71005d2b010506062320272635100033320003
-211616333236132626232207061702fa011836e9affeeb85690114d3ed01
-1206fd40038261425a270378565c3c3c0101522f9aa1b591dd0108012bfe
-c7febd7d8b48016c7a7f43437300>Arial-BoldMT AddT42Char 
-3 2292 73 <00010018000002e605d3001600b840323604012a04201020115904801805
-0804bf180215161102141216110e130f00100e13010010021409080f0b01
-5f0bff0b020bb80274400a0601110f1601ff160116b80274401e10000001
-f00001000613140a09333f084f085008030828102f115f110211b8010440
-0d0e132602145f00a016c0160216b8ffc0b6090c3416191778b902690018
-2b4e10f42b713c4dfc3cfd3cfc5d3cf45d19e400183f3c3f5d713cfd5d71
-3c3ffd5d7139320f0f0f0f313001715d005d133335343636333217072623
-2206151533152311211123189c399975787326433e3d35d2d2fee79c0426
-5086845324c41039514bddfcb7034900>Arial-BoldMT AddT42Char 
-3 3280 76 <00020093000001ac05ba000300070077b90009ffc0403f110a3f40095009
-028009b009c009d009ef09051f0960097f09a009b0090503060700050403
-0f00014000d000e00003005d02010006050607040a0207260104b8ffc040
-092124340419083f3c182b4e10f42b3c4dfd3c003f3c3f3c3f3cfd5d713c
-0305103c3c103c3c313001715d722b1311211101112111930119fee70119
-04b60104fefcfb4a0426fbda>Arial-BoldMT AddT42Char 
-3 3958 79 <00010093000001ac05ba00030053b90005ffc04029110a3f400550050280
-05b005c005d005ef05051f0560057f05a005b0050502010003000a020326
-0100b8ffc040092124340019043f3c182b4e10f42b3c4dfd3c003f3c3f3c
-313001715d722b3311211193011905bafa46>Arial-BoldMT AddT42Char 
-3 4736 82 <00020052ffe8049a043e000d001900974048e801e708f713f71504c702e8
-05021219051909025910561356165918970298069808970cb809d502db05
-dc09d50ce705e706e80d10a708cb02cc06c308c60c057508890684080311
-b80274b20a0b17b80274401404071439071a601b701b021b0e2100191a58
-41182b4e10f44ded4e1071f64ded003fed3fed313000715d015d71435840
-09691066126616691804015d59005d015d13341236333200151400232224
-26251416333236353426232206528afd9cf10134fec9ec92fef78a012096
-6e6e95956e6e9602228c01068afec7eff1fec384ffa89ea8a8a09ca8a800
->Arial-BoldMT AddT42Char 
-3 4976 83 <0002008bfe6c0497043e0010001c009a402e3813481302123403390d3913
-341b4403490d4913441bf91b095606560a591256165618591cf607f91b08
-0100061ab80274b2050714b8027440160b0b100f0e1721081a701e011e11
-290e0e0f26101001b80129400b700080000200191d3f41182b4e10f4714d
-ed3c10fd3c10e44e1071f64ded003f3c3fed3fed3f3c3130015d005d0143
-58400d6606660a691266166618691c065d59005d13211536363332001110
-002322262711210114163332363534262322068b010633ae6ab90102fefc
-b9588f4ffee701168e6662828663678804269c5064fedefefdfef6fed946
-55fde903b9b3ab9db3a7a29f>Arial-BoldMT AddT42Char 
-3 5486 85 <0001008700000337043e001000a84028970501090e01530566057505032f
-12580e680e7012040a090f0c1f0c028f0cff0c023f0c4f0c020cb8027740
-29070701000a0302060a28000910093009700904091a7f129f12025f127f
-12af12d01204121000260103b80129400b02028001a001020119113fb901
-1c00182b4e10f4713c4d10ed10fd3c4e105d71f65d194de400183f3c3f3c
-3fed5d717239323130015d005d71004bb017534bb035515a58b10a323859
-005d212111211536363332170726232206061101a0fee70105436b446059
-57473d3b522f0426976b4435f52e41aafef1>Arial-BoldMT AddT42Char 
-3 5714 86 <00010030ffe80410043e002a02c240c00611062308271711172398129814
-9727952a09071446140212bb0db90ec721e523f80df62206290d550d650d
-950b9712a722b90c07412340244426672264268712871486228324093726
-4506460b4a0d4f0f462142220722242726370c352135223523352407060a
-05110921180d270c22222223072422402c730c781479157629752a881584
-2a9a15952ab422b4230d80018f178c18992aa92ab02c0617211640212334
-16401c1f341f1601df16011633082150258f25022540181d34251a2cb8ff
-c04017110a3f502c01302c012f2c012c1e213010011033012100b8ffc0b3
-0f093f00b8ffc0b3110a3f00b8ffc04009090d3400192b78b8182b4e10fc
-2b2b2b4dedf471ed4e105d71722bf62b714dedf471722b2bed00b1060243
-54584035060101060116012622362146215401591764016917f6010a0117
-02041a21220228130d0c02281a5f04010446280b501a011a4613073ffd5d
-3ffd5d1112173911121739111217395d711bb90022ffcbb3282a3421b8ff
-cbb3282a3422b8ffe0b31e243421b8ffe0b31f243422b8ffe0b3191a3421
-b8ffe0401b191a346b0d0136224622980d9422c422d4220621220c0d0404
-1a00b8ffc0b5191b34003301b8ffc0b3172d3f01b8ffb0b3090a3e01b8ff
-c0b322253401b8ffc0401d1a1c3400013001400150010460018001f00103
-00011001500160010401b8ffc0b313163401b80101404d0004015f04f004
-020446280b1640191b3416331740172d3f1740090a3e174035373417402b
-2e34174025293417401a1c340f171f175f176f170417551a402224340f1a
-01501aff1a021a4613073ffd5d712bf45d2b2b2b2b2b2be42b3ffd5d71f4
-2b5d71722b2b2b2be42b111217395d712b2b2b2b2b2b59313001715d0071
-7171715d5d435c58b90024ffc940090b123f0f280b123f21b8ffecb60d39
-0c140c3921b8ffecb20c3922b8ffeab10b39002b2b2b2b012b2b5900715d
-132516163332373635342726272427263534363332161705262623220706
-1514171604171615140623222630011a126e636d3725141549feac5b7eda
-e5dad428fef7115f586f30201c2601c15958f4efd9fd012f2b5255281c2f
-201514114b3e56998abc8e8b313e421f16231e151c664a4b8692d2b0>Arial-BoldMT AddT42Char 
-2 0 0 <00020100000005000500000300070042b40201fe0607b8023f4013000504
-fe03000a0704fe010019080605fe0203bc0126000901b0011800182b10f6
-3cfd3c4e10f43c4dfd3c003f3cfd3c10fc3cfd3c31302111211125211121
-01000400fc2003c0fc400500fb002004c000>Arial-BoldMT AddT42Char 
-Arial-BoldMT /CharStrings get begin
-/c 70 def
-/e 72 def
-/f 73 def
-/i 76 def
-/l 79 def
-/o 82 def
-/p 83 def
-/r 85 def
-/s 86 def
-end
-Arial-BoldMT /Encoding get
-dup 99 /c put
-dup 101 /e put
-dup 102 /f put
-dup 105 /i put
-dup 108 /l put
-dup 111 /o put
-dup 112 /p put
-dup 114 /r put
-dup 115 /s put
-pop
-end
-%ADOEndSubsetFont
-/KUDFOA+Arial-BoldMT /Arial-BoldMT findfont ct_VMDictPut
-/KUDFOA+Arial-BoldMT*1 
-[99{/.notdef}rp /c /.notdef /e /f 2{/.notdef}rp /i 2{/.notdef}rp 
-/l 2{/.notdef}rp /o /p /.notdef /r /s 140{/.notdef}rp]
-KUDFOA+Arial-BoldMT nf
-KUDFOA+Arial-BoldMT*1 [9 0 0 -9 0 0 ]msf
-59.996 15.889 mo
-(iccprofiles)
-[2.52 5.04 5.03999 5.51694 3.48306 5.51693 2.99693 2.52 2.52 5.03999 0 ]xsh
-/KUDFOA+Arial-BoldMT*1 uf
-/KUDFOA+Arial-BoldMT uf
-/Arial-BoldMT uf
-gsave
-0 0 mo
-720 0 li
-720 540 li
-0 540 li
-cp
-eclp
-%ADOBeginSubsetFont: Arial-BoldMT Initial
-ct_T42Dict begin
--0.625 -0.375 2 1.008
- 256 array 0 1 255 {1 index exch /.notdef put} for  /Arial-BoldMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f32115d5e9f000000cc000000606376
-7420fb3ea3da0000012c0000075a6670676d08e8ba2800000888000005d7
-676c79664fc39cd400009edc0007c44c68656164d65e5fe200000e600000
-003668686561127e15fe00000e9800000024686d7478d62bc37500000ebc
-000034d46c6f636132ab8c4800004390000034d86d61787014dc04760000
-7868000000206e616d65ae0c9081000078880000147d70726570f14ae516
-00008d08000011d267646972000000000000000000000000000303d402bc
-00050008059a05330000011b059a0533000003d1006602120805020b0704
-020202020204e0002affc00078430000000900000000544d432000200020
-fffc05d3fe510133073e01b2400001ffffff0000042605ba000000200004
-05ba001c05ba001c05a7001c0426001c0000ffe40000ffe40000ffe4fe69
-ffe405ba001cfe69ffe402ea0000011d0000011d000000000000000000b2
-00ac00d70128012000b301fa001700f8011901310049000400f7000300af
-00fd00950014005400960112002400160055004901040119012b008c019b
-ff76ffe9003d009200a2ffb70182ffaa0016008f00c600f8001c00de0401
-0037004e00550055006500e903e50059ff9a00080087000b003b00520116
-006100d600d600f500000093009400be017cfff80004001400820092003c
-00410041ffc1fffc002a008c049005d809b5009100bb0106ff63ff69001e
-0022008a022bffd6ffdf0026005900a300ac0104012b01c004480021006b
-00850098011903c6006b009500a400fe010c025d034305bf000000490056
-006e0077008a00aa00ca0112015005d805f0ff7bffe70006001300280061
-006900e90135014d02a5040cff3effda005b00b900c801190119011901c0
-045b04a7055bfe3fff9dffc2001500b7010a01bc01c10532058efd81ffa1
-ffae000c00260031003d004e00560062008300c100c900f100f2027fff7f
-00480053007700c5011d01200126012801d60219027e027e03d3002e0041
-005d006b0075009f00b000b200ba00bb00bd00d600db00e000e50114011b
-014a0162019101f2020c026402cf039b03b403d4040104a9001600230025
-002a007400a500b600cc00cd00cf0105012001300150016a016f0197019d
-01e002b002ec02f70408048304fb04fd0526fee0fefbff4efff50018001a
-004c007a007f009100a300b300b400ce00d500f200f300f6011001380168
-01a101b001e001ec02090222024f0270029602a502ad034e039103c10435
-0442046b04cd04da0586058b076107fefca6fe93feadfed1ffb7ffd10003
-000e00180026004600690081008f00a500bf00d300d500d900dd00e20119
-012b0138013b015a015e016801730188019401ad01c501d101ea01f20200
-020002000222023b0244024f026f0272027e02820293029402a502cf02cf
-02d002da02dd02eb02f5030503220336037103a103b003b803d003e60410
-0426042e0431044f045a04ff053205320547055305a805ab05c205f0063c
-0664067006e80782078408ccfd2afddefe00fe68feb0feb3ffaa00080059
-007a0091009e00a200af00b400bb00ca00cc00ce00d900e000f40114011a
-01210127012b01390146014b014d0157015c01650182018701920198019b
-01a201ae01c501c501d102070222022b024102530261026502840287028d
-02b402b402ba02c902d602d802ed02f503170323032b03310349035a035b
-036e03710374037e03840391039103aa03cf03d303e703e803ed04080417
-041e0475047a049904a704b404d1054c056d056d05a205bf05c005d105fc
-05fc0602061a061c062f066a06a806e2070607360750078907d407f30870
-011c012a011a01200000000000000000000000000219000b001e02aa0214
-047f01ed0000001d0104000f0091002b01880153011201f3003f03fe0168
-010e047f01ed036e03150219041300000000064004b00000027401bb0035
-01c5007f06020301000004e000b201dc02e004c3023d00d50160011904a7
-036e05ca022100ab0426009002bc02bb014200b4023c0256029c030001e5
-01a800e5006b00780094016b017300ab01ed013a017d0137017f00d40216
-03530184003cffa202040109014901f0006e031500810464005e00000000
-0000000000000000000000000000000000000000000000000000013900dc
-00e9fe9e040d047c012b00b80096005900ac00df01a900fa0105ffec0017
-0003005500610004008c00a3008500280120005d00d6007f012601190104
-016c06cf00b4010600000737063e047a00f000f900e905ba042604420000
-ffe7fe69049e04e3ff37ff2d01200105012000a800740068004700f200e5
-00d900bd00a800680047005c0048000a0028003200410050005a0064007d
-00870091ffb0ff9cff83ff79ff6f00cb012000fa012c01fa01a000d500b8
-005c003c00c800c8008f00d9018b00b30047000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000fe6400c000ea01180125013203b003ed0576
-059005aa05b405be05cd063100780084009b00cc00e200f4010a01200163
-00d100ea00f7010801420019002c00340041003800480058006c025903bd
-0043011a007000d30028003700420050005a0064007300780082008c009c
-00a500bd00ce00f00110015c00be00d801020117012c016300ea01080041
-004b0055005f007300a60109018301b300410064001e002a00eb00fa010e
-01380274002c00400082009600b600c000cc00dc00e600f000ff010a0120
-012c013b01440156016300f70057006401100136005001b10000ffb60039
-004e004403cc00e5002401100042012201a400f0006000e0000e001d0039
-05e30102002cfe4eff38026903bd011600ff000e00a00054001b003d0171
-0041000f005000fd0015014f0035fe52002c00d3010304b001d200b600c0
-00990265ff870377fe6c00cb00a9005c0040047607440000404154403f3e
-3d3c3b3a3938373534333231302f2e2d2c2b2a292827262524232221201f
-1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201
-002c4523466020b02660b004262348482d2c452346236120b02661b00426
-2348482d2c45234660b0206120b04660b004262348482d2c4523462361b0
-206020b02661b02061b004262348482d2c45234660b0406120b06660b004
-262348482d2c4523462361b0406020b02661b04061b004262348482d2c01
-10203c003c2d2c20452320b0cd442320b8015a51582320b08d44235920b0
-ed51582320b04d44235920b09051582320b00d44235921212d2c20204518
-684420b001602045b04676688a4560442d2c01b10b0a432343650a2d2c00
-b10a0b4323430b2d2c00b0172370b101173e01b0172370b10217453ab102
-00080d2d2c45b01a234445b01923442d2c2045b00325456164b050515845
-441b2121592d2cb00143632362b0002342b00f2b2d2c2045b0004360442d
-2c01b00643b00743650a2d2c2069b04061b0008b20b12cc08a8cb8100062
-602b0c642364615c58b00361592d2c45b0112bb0172344b0177ae4182d2c
-45b0112bb01723442d2cb01243588745b0112bb0172344b0177ae41b038a
-45186920b01723448a8a8720b0c05158b0112bb0172344b0177ae41b21b0
-177ae45959182d2c2d2cb0022546608a46b040618c482d2c4b53205c58b0
-02855958b00185592d2c20b0032545b019234445b01a23444565234520b0
-0325606a20b009234223688a6a606120b01a8ab000527921b21a1a40b9ff
-e0001a45208a54582321b03f1b235961441cb114008a5279b31940201945
-208a54582321b03f1b235961442d2cb110114323430b2d2cb10e0f432343
-0b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2cb10e0f432343650b
-2d2cb11011432343650b2d2c4b525845441b2121592d2c0120b003252349
-b04060b0206320b000525823b002253823b002256538008a63381b212121
-212159012d2c4bb06451584569b00943608a103a1b212121592d2c01b005
-251023208af500b0016023edec2d2c01b005251023208af500b0016123ed
-ec2d2c01b0062510f500edec2d2c20b001600110203c003c2d2c20b00161
-0110203c003c2d2cb02b2bb02a2a2d2c00b00743b006430b2d2c3eb02a2a
-2d2c352d2c76b8023623701020b802364520b0005058b00161593a2f182d
-2c21210c6423648bb84000622d2c21b08051580c6423648bb82000621bb2
-00402f2b59b002602d2c21b0c051580c6423648bb81555621bb200802f2b
-59b002602d2c0c6423648bb84000626023212d2cb4000100000015b00826
-b00826b00826b008260f10161345683ab001162d2cb4000100000015b008
-26b00826b00826b008260f1016134568653ab001162d2c4b53234b515a58
-20458a60441b2121592d2c4b545820458a60441b2121592d2c4b53234b51
-5a58381b2121592d2c4b5458381b2121592d2cb0134358031b02592d2cb0
-134358021b03592d2c4b54b012435c5a58381b2121592d2cb012435c580c
-b00425b00425060c6423646164b0035158b00425b00425012046b0106048
-2046b0106048590a21211b2121592d2cb012435c580cb00425b00425060c
-6423646164b807085158b00425b00425012046b8fff060482046b8fff060
-48590a21211b2121592d2c4b53234b515a58b03a2b1b2121592d2c4b5323
-4b515a58b03b2b1b2121592d2c4b53234b515ab012435c5a58381b212159
-2d2c0c8a034b54b00426024b545a8a8a0ab012435c5a58381b2121592d2c
-462346608a8a462320468a608a61b8ff8062232010238ab902a702a78a70
-456020b0005058b00161b8ffba8b1bb0468c59b0106068013a2d2cb10200
-42b123018851b1400188535a58b910000020885458b202010243604259b1
-2401885158b920000040885458b202020243604259b12401885458b20220
-02436042004b014b5258b2020802436042591bb940000080885458b20204
-0243604259b94000008063b80100885458b202080243604259b940000100
-63b80200885458b2021002436042595959592d00000100000005028f9f18
-7df95f0f3cf50819080000000000a2e33c1d00000000c14fd725fafafcfd
-1000081500010009000100010000000000010000073efe4e00431000fafa
-fa7a1000000100000000000000000000000000000d350600010000000000
-023900000239000002aa00b803cb00700473001204730046071d005905c7
-005a01e7005c02aa006b02aa0043031d001c04ac00550239007502aa0073
-023900930239fffd04730056047300a2047300330473004d047300260473
-005b0473005704730057047300530473004102aa00c902aa00aa04ac005f
-04ac005504ac005f04e3006a07cd003d05c7000005c7009605c7006105c7
-00940556009504e300970639006205c700960239008c0473002305c70099
-04e3009d06aa009105c7009806390059055600950639005905c700960556
-004a04e3002c05c700930556ffff078d0007055600000556fffd04e30016
-02aa00920239fffd02aa002604ac00730473ffed02aa002a0473004904e3
-00870473005504e300540473004102aa001804e3005404e3009202390093
-0239ffa20473008902390093071d007e04e3009104e3005204e3008b04e3
-005b031d00870473003002aa001f04e3008d0473000b063900090473000c
-0473000e04000022031d003c023d00b0031d002d04ac004305c7000005c7
-000005c700610556009505c700980639005905c700930473004904730049
-047300490473004904730049047300490473005504730041047300410473
-004104730041023900920239ffe90239ffcd0239ffd004e3009104e30052
-04e3005204e3005204e3005204e3005204e3008d04e3008d04e3008d04e3
-008d0473004403330056047300540473000d0473003b02cd00420473fffe
-04e3008b05e5fff705e5fff7080000d802aa00bb02aa0005046400310800
-ffaa0639003f05b40098046400320464003c0464003c04730001049c006f
-03f4002c05b4007a069600a1046400000231000002f6002502ec001a0625
-0037071d005804e3005704e3006502aa00c304ac0055046400540473ffec
-0464001f04e5001a047300600473006a080000c905c7000005c700000639
-005908000048078d00580473fffc08000000040000840400006902390098
-023900720464003103f4002f0473000e0556fff70156fea90473ffe002aa
-004b02aa004b04e3001f04e3001f04730044023900930239007504000071
-0800000105c700000556009505c7000005560095055600950239006a0239
-ffae0239ffbf0239ffc106390059063900590639005905c7009305c70093
-05c700930239009302aa000302aafff302aa001302aa001a02aa00cd02aa
-009102aa002602aa006002aa003902aa000304e3000a0239000a0556004a
-0473003004e3001604000022023d00b005c7fffd04e300530556fff70473
-000e0556009504e3008b04ac005504ac006d02aa005b02aa001902aa0028
-06ac005c06ac005c06ac0028047300000639006204e300540239008c0556
-004a0473003005c700610473005505c700610473005504e30054046bffed
-02aa00c805c700000473004905c700000473004905c7009405c0005105c7
-fffd0556009504730041055600950473004104e3009d0239007904e3009d
-0315009504e3009a03d5009005c7009804e3009105c7009804e300910639
-005904e3005205c70096031d008705c70096031d00500556004a04730030
-04e3002c02aa001f04e3002c03d5001e05c7009304e3008d05c7009304e3
-008d04e300160400002204e300160400002204cf009a0639005606910056
-04eb004e04da004e03cc004e0579004e0392003005b9004e046bffed04d5
-00b8032b004f08c000290800004f040000990800004f040000990800004f
-040000980400009807d5016a05c7008f04ab005504d5009d04ac005504d5
-022204d5010505abffe9050001c905ab027e05abffe905ab027e05abffe9
-05ab027e05abffe905abffe905abffe905abffe905abffe905ab01c005ab
-027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab01c0
-05ab01c005abffe905abffe905abffe905ab027e05ab01c005ab01c005ab
-ffe905abffe905abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905ab02d605ab006605abffea05d5ffff04d500920800000007eb0130
-07eb012007eb013007eb012004d500b204d5008004d5002a082b0198086b
-01b807550010060000f40600006f0440003a0540003704c0003f04150040
-04000025060000550647008c0473009005abffc701eb008d03d500860715
-002303e9001804d5009202d6005c02d6005c04d500b202d6004d05c70000
-0473004905c700610473005505c700610473005505560095047300410556
-00950473004105560095047300410639006204e300540639006204e30054
-0639006204e3005405c7009604e3009205c7000504e300190239ffba0239
-ffbb0239ffda0239ffda0239ffe10239ffe2023900480239004704730023
-0239ffa205c70099047300890473008d04e3009d0239ffed05c7009804e3
-009105c9009c04e3008e0639005904e300520639005904e3005205c70096
-031d002a0556004a0473003004e3002c02aa000705c7009304e3008d05c7
-009304e3008d05c7009304e3008d05c7009304e3008d078d000706390009
-0556fffd0473000e0239008d05c70000047300490800ffaa071d00580639
-003f04e3005702aa00c9078d000706390009078d000706390009078d0007
-063900090556fffd0473000e0239009502aaffd70473000d04cd005a06ac
-005c06ac002906ac003006ac002f02aa00bc02aa002602aa00bb03b8fff4
-05c7ffe806d3ffbb073fffbb03caffbb0699ffa6076bffc806b4ff9c0239
-ff2905c7000005c7009605c000000556009504e3001605c700960239008c
-05c700990556000006aa009105c70098052600660639005905c7009a0556
-009504cd005a04e3002c0556fffd0556000006790056066a00620239ffcc
-0556ffff04eb004e039c004e04e3008e0239008204a8006c04e200900473
-000f03af004e04e3008e0453004e023900930476008e0473000f04e50090
-0473000b0390004e04e3005204f300760429004e04a80076049b00110607
-007606c2004e0239ffcd04a8007604e3004e04a8007606c2004e055a0097
-0715002f048900a405b100580556004a0239008c0235ffca0473002308c0
-001a0880009d0700003704e2009a04fa000005c0009905c7000005c0009b
-05c70096048900a405b3fffa05560095073b00170503002c05c0009905c0
-009904e2009a059d002006aa009105c700960639005905c0009905560095
-05c7006104e3002c04fa000006d400590556000005d8009a059f007d080a
-009a0827009a06f5001a07d5009d05c0009b05b100570840009605c00004
-0473004904f1005c04eb0096035500880514fff90473004105acffff03fa
-001804eb008c04eb008c040100880515001905eb009b04d5008804e30052
-04d5008804e3008b0473005503eb00150473000e070000540473000c04eb
-008904a5007206ab008c06c0008d05d5002806d5009504eb0099046b0038
-06d5009104abfffb0473004504e3000003550088046b0051047300300239
-00930240ffd00239ffa207c000180740008c04e300000401008804730012
-04d5008803e50096039300880800004108eb00a306200030000001010000
-001e0000003100000031000001010000007f0000007e0000008c0000008c
-000001010000001000000101000001210393007d0000008c026500c80000
-03020000ff0102aa00c904a90059049b004103a7000a0466003204ea0082
-022f0087034e005a04ed00870503007d022f0087042c002803ed004b03f8
-004104e30087050a0037022f00870316004b04e800500459000a04c00064
-04b2006403ff000a0418000a04950082042c002805b8005a0563002d045e
-0087045e0087045e00870236005004090050068b0087022fffac042c0028
-042c002803f8ff1603f8ff160479003205b8005a05b8005a05b8005a05b8
-005a04a9005904a9005904a90059049b004103a2000a0466003204ea0082
-02950000038100000503007d02950000042c002803ed004b03f80041050a
-00370316004b04e8005004c0006404b200640418000a04950082042c0028
-05b8005a0563002d022f0087049b004103ed004b04b2006404db00410000
-ffdc0000ff250000ffdc0000fe51028d00ab028d00a002da004303c0007e
-0196ffba0000004600000046000000460000004600000048000000460000
-004600000046047e0188047e0150047e0104047e009e047e012d047e00ea
-047e00d5047e009c047e00bc047e00ee04350085028d00c1043500b30600
-01000600010002be005806000100047e00a5047e00bd047e00de06000100
-060001000600010006000100060001000000004606000100060001000600
-0100060001000600010006000100060001000600010004e6ffba06000100
-06000100060001000532003905320039022cffba022cffba060001000600
-01000600010006000100049e0034047800300430ffba0430ffba0376000a
-0376000a060e00290708002902e2ffba0456ffba060e00290708002902e2
-ffba0456ffba05280097046f000a03520003060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100000000300000004600000046
-000000400000004606000100060001000000ffdc0000fe510000ff160000
-ff160000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ffdc0000ff160000ffdc0000ff200000ffdc0473002d080000000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d007f028d00670600
-010005a0002e03c0007e01e800000207ffc301bc005e01e0fffa039c0006
-039c000601bc005e01e0001a05280097049e0011022cffba022cffba01bc
-008801e0001a0532003905320039022cffba022cffba02be003603520003
-0532003905320039022cffba022cffba0532003c0532003c022cffba022c
-ffba049e0034047800300430ffba0430ffba049e0034047800300430ffba
-0430ffba049e0034047800300430ffba0430ffba02be006902be006902be
-006902be00690376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba073200400732004004deffba04deffba088000400880
-0040062cffba062cffba0880004008800040062cffba062cffba0430ffba
-0430ffba0430ffba0430ffba0430ffba0430ffba0430ffba0430ffba0454
-003403c000460454ffba02e2ffba0454003403c000460454ffba02e2ffba
-0610002f0610002f0270ffba0298ffba04e6002704e600270270ffba0298
-ffba045400290454002902e2ffba02e2ffba039c0023039c002301e0ffba
-01e0ffba02e2002102e200210352ffba0352ffba0454003e0454003e022c
-ffba022cffba02be00580352000303c0ffba039cffba039c0006039c0006
-05280097046f000a05280097049e0011022cffba022cffba0454000004c4
-000003e400220454001a03e400220454001a03e400220454001a06000100
-060001000000004600000046060001000600010006000100000000460000
-004606000100060001000000004800000046060001000600010006000100
-000000460000004600000046000000460000004000000030060001000000
-004600000046060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100028d00ca028d00c7028d00c6060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010002be0069
-0100ffba0800ffba1000ffbb06d3005905b0005206a3009305cb008d0000
-fd880000fbc10000fc5f0000fe310000fcad0000fd550000fe260000fdf1
-0000fd180000fc690000fd950000fbe00000fc700000fed40000fecd0000
-fea0041b007806ac005c06ac00190000fe450000fd550000fda60000fc5f
-0000fe250000fd180000fbe00000fafa0000fb360000fc700000fb870000
-fb9b0000fcce0000fc540000fbc30000fc940000fbf50000fdb00000fe59
-0000fd7e0000fc820000fd340000fe500000fe460000fcd10000fd3e0000
-fd020000fc3a0000fce90000fc260000fc070000fc2f0000fb9e0000fb76
-0239009305c700000473004905c700000473004905c700000473004905c7
-00000473004905c700000473004905c700000473004905c7000004730049
-05c700000473004905c700000473004905c700000473004905c700000473
-004905c70000047300490556009504730041055600950473004105560095
-047300410556009504730041055600950473004105560095047300410556
-00950473004105560095047300410239006a0239005d0239008c02390093
-0639005904e300520639005904e300520639005904e300520639005904e3
-00520639005904e300520639005904e300520639005904e3005206d30059
-05b0005206d3005905b0005206d3005905b0005206d3005905b0005206d3
-005905b0005205c7009304e3008d05c7009304e3008d06a3009305cb008d
-06a3009305cb008d06a3009305cb008d06a3009305cb008d06a3009305cb
-008d0556fffd0473000e0556fffd0473000e0556fffd0473000e05c70000
-047300490239ffca0239ffca0639005904e3005205c7009304e3008d05c7
-009304e3008d05c7009304e3008d05c7009304e3008d05c7009304e3008d
-0000fef90000fef90000fef40000feef0489fffd03550007073b001705ac
-ffff04e2009a0401008804e2009a0401008805c7009604d5008804730001
-047300120473000104730012055600000473000c059f007d04a50072059f
-009c04e3009205cf00590473004c0639005604e3005205320039022cffba
-0270ffba0298ffba04e60027022c0065022c0016022c0016022c0011022c
-0043022cffd20000fef00000000f0000fff502aa009002aa009000000000
-0000005e0000005e0000ffcb01bc000f01e0ffbf01bcfff501e0ffcd01bc
-001d01e0000901bc008801e0001a039c0006039c0006039c0006039c0006
-05280097046f000a0532003905320039022cffba022cffba053200390532
-0039022cffba022cffba0532003905320039022cffba022cffba05320039
-05320039022cffba022cffba0532003905320039022cffba022cffba0532
-003905320039022cffba022cffba0532003905320039022cffba022cffba
-049e0034047800300430ffba0430ffba049e0034047800300430ffba0430
-ffba049e0034047800300430ffba0430ffba049e0034047800300430ffba
-0430ffba049e0034047800300430ffba0430ffba049e0034047800300430
-ffba0430ffba02be004f02be004f02be006902be006902be006902be0069
-02be004f02be004f02be006602be006602be006902be006902be006902be
-006902be002f02be002f02be002202be00220376000a0376000a0376000a
-0376000a0376000a0376000a0376000a0376000a0376000a0376000a0376
-000a0376000a0376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba073200400732004004deffba04deffba073200400732
-004004deffba04deffba0880004008800040062cffba062cffba08800040
-08800040062cffba062cffba0430ffba0430ffba0454003403c000460454
-ffba02e2ffba0610002f0610002f0610002f0270ffba0298ffba0610002f
-0610002f0270ffba0298ffba0610002f0610002f0270ffba0298ffba0610
-002f0610002f0270ffba0298ffba0610002f0610002f0270ffba0298ffba
-04e6002704e6002704e6002704e60027093e0032093e00320740ffba0740
-ffba060e00290708002902e2ffba0456ffba045400290454002902e2ffba
-02e2ffba045400290454002902e2ffba02e2ffba045400290454002902e2
-ffba02e2ffba060e00290708002902e2ffba0456ffba060e002907080029
-02e2ffba0456ffba060e00290708002902e2ffba0456ffba060e00290708
-002902e2ffba0456ffba060e00290708002902e2ffba0456ffba039c0023
-039c002301e0ffba01e0ffba039c0023039c002301e0ffb101e0ffb1039c
-0023039c002301e0ffba01e0ffba039c0023039c002301e0ffba01e0ffba
-0454003e0454003e022cffba022cffba0454003e0454003e0454003e0454
-003e0454003e0454003e022cffba022cffba0454003e0454003e049e0034
-047800300430ffba0430ffba02be005803520003031a001a031a001a031a
-001a039c0006039c0006039c0006039c0006039c0006039c0006039c0006
-039c0006039c0006039c0006039c0006039c0006039c0006039c0006039c
-0006039c000605280042046fffd905280097046f000a022cffba022cffba
-039c0006039c000605280097046f000a022cffba022cffba05280097046f
-000a067f0044067f0045067f0044067f004501a800280000fe290000fe8c
-0000ff250000ff230000fefa0000ff7a0000fe5908fc003208ad00320000
-ffb50000ffb60000fef00000ff590000fe590000ff8c01b4000002f70000
-0000fe850000ff0704cd00320000ff580000ff580000ff59073200400732
-004004deffba04deffba0880004008800040062cffba062cffba04540034
-03c000460454ffba02e2ffba03c0007e02e2002102be0058022cffba0290
-ffba01f4002f01f4003b01f4001201f400b101f4006d060e002907080029
-022f00870000fec803500000045e008703e4fff50454fff503e400220454
-001a03e400220454001a03e400220454001a03e400220454001a03e40022
-0454001a03e400220454001a047e0072047e00bd03e4000f0454000f04e3
-001b06b1001e05c0009b04e3008705c0000a04e3000a05c7006905c70061
-0473005505c7fffd06b3001e05c0005c04e3005404da004e055600660503
-006f04e3ffac063900620518000207720092023900930239000705c70099
-047300890239001b0473000f07ef009605c7ffad04e3008e063900560718
-005905f300550641001e04e3008b05560095055600640473006304cd005a
-02e1001e02aa001f04e3001802aa001f04e3002d066a006205c700930629
-00000473000e04e300160400002204e3003a04e300590436002a04360039
-047300330473005b03fa001e04a2001f04e3008b023d00b003fb00b004ad
-005602aa00b80aaa009409c7009408e300540956009d071c009d04720093
-0a3a009808000098071c00910473004c05c70000047300490000fefe05c7
-0000047300490800ffaa071d00580639006204e300240639006204e30054
-05c70099047300890639005904e300520639005904e3005204e3003a0436
-00220239ffa20aaa009409c7009408e300540639006204e3005408430096
-0552009505c7009804e3009105c700000473004905c70000047300490556
-00950473004105560095047300410239ff370239ff2d0239fff40239ffe6
-0639005904e300520639005904e3005205c70096031dffcd05c70096031d
-008005c7009304e3006705c7009304e3008d0556004a0473003004e3002c
-02aa001f049e002e0429004905c7009604e30092059f009c050c0052050c
-005204e300160400002205c7000004730049055600950473004106390059
-04e300520000fefd0639005904e300520639005904e300520639005904e3
-00520556fffd0473000e0473004504e3005404e3008204e3008704730034
-0473001404e3005404e300540473004c0641004c03fa004f03fa00180587
-0018048a005202aaffc404e3005404e3005404b000520473000f04ce000f
-04e3008a04e3009204e300920239001b023900930239009302a8000002d9
-00140239009304d40093071d0085071d0085071d007e04e3ffa604e30091
-04eb008c04e3005206ab005206c2004e05ff0052031dffe6031dffe6031d
-ffe6031d0087031d0087031d0087031dffe604ab008a04ab008a04730030
-02aaffc402aaffc402aaff9b0451001e02aa001902aa001f04e3001b04f8
-004904a8009104730012063900090473000f0491000f0400002205700022
-0436002204360022047300420473005504730042047300550639005904eb
-0096048a004f04b0005204d5008803ab001e04730014039e008804e3005b
-0473004204730055083f00540789005409af00540682001f0446001f0698
-001f06f4001806350093058a00930445001e0482008802f1003202f10032
-018effe202040032020400000204000003000032042f000002e2000001e7
-005c03cb007002390098023900750239009402aa00f302aa00f303000032
-0300003204ac005f04ac005f04ac002a04ac002a02aa012102aa00bb02aa
-002a02aa012102aa001302aa002a02aa00bb02aa00ca02aa00ca02aa00f3
-02aa00f302aa00a602aa00a602aa00a602aa001302aaffe102aafffb02ed
-0000012100320302003202ee000003000032031000960310009603100096
-031000960310009602aa006202aa006202aa000302aa001d040000690457
-009604570096045700960457009604570043045700430457004304570043
-04570043031000430457002f0457002f0457002f0457002f0457002f0310
-002f04570025045700250457002504570025045700250310002f0457001a
-0457001a0457001a0457001a0457001a0310001a04570042045700420457
-004204570042045700420310004204570096045700960457009604570096
-0457004204570042045700420457004204570042031000420457002f0457
-002f0457002f0457002f0457002f0310002f0457002f0457002f0457002f
-0457002f0457002f0310002f045700260457002604570026045700260457
-002603100026045700420457004204570042045700420457004203100042
-045700960457009604570096045700960457004204570042045700420457
-004204570042031000420457002604570026045700260457002604570026
-031000260457002304570023045700230457002304570023031000230457
-002f0457002f0457002f0457002f0457002f0310002f0457004b0457004b
-0457004b0457004b0457004b0310004b0457009604570096045700960457
-00960457004204570042045700420457004204570042031000420457001a
-0457001a0457001a0457001a0457001a0310001a04570024045700240457
-00240457002404570024031000240457002f0457002f0457002f0457002f
-0457002f0310002f0457004e0457004e0457004e0457004e0457004e0310
-004e045700960457009604570096045700960000feaf0000febf0000fdb5
-0000fec80000ff780000feb10000ff3d0000fe6f0000feae0000ffce0000
-ff660000fe6f0000fec80000fec80000ff680000ff680000ff6800000000
-0000ff1f0000ff1f0000ff440000ff5f0000fe870000ffec0000ff9c0000
-ff510000ff510000ff510000febf0000ff15000000000000feb10000ff3d
-0000ff6b0000fef20000ff470000ffce0000fe870000febb0000feae0000
-feae0000fec80000fec80000fea60000febf0000fdb70000fdb90000fea6
-0000febf0000fdb50000fe1f0000fee20000ff9c0000fe870000ff440000
-feba0000ff230000ff9a0000fdb90000fe3b000000000000fea70000ff68
-0000fe170000ff740000fe870000fdb90000ff660000ff440000fea70000
-fea70000fea70000ff030000ff520000fd1f0000ff530000ff530000ff53
-0000feb10000feb00000ffa10000fe8c0000feb80000feaf0000fea20000
-feba0000fdf40000ff190000ff2d0000fe8c0000fe8802aa00bb02aa002a
-02aa00c804e2009004a8007606290000080200000629000005ff005206c2
-004e056900140639005904e3005205c700610473005504e30097039e0088
-06030000043c001d066f000a04e2000a07ef0096071d0085059f007d04e3
-008a059f009c04d7000a05560064055600640524001404d4000a05e10055
-04a0004b040e0014038400280569001404f1005c047300550239ffa20639
-005603d4005103d400510556009505c000990473004104eb008c0a3d0059
-063a001406f4001a059f001b07ce008c065e0093055600000473000b0768
-008c066700930679005606070076089e008c07d800930503004603fa0043
-06790056060700760639005604e300520685ffff052c000b0685ffff052c
-000b0b3a005909bd005206840055051a004b0a3d0059073500550000fe37
-0a3d0059063a001405c700610473005504ac000f0000fea60000feb10000
-feaa0000fead0000fc2b0000fc4c05c0009904eb008c05c0001104eb001b
-0556009504e3008b059f009c04c900880503002c03fa001804e200110401
-000d0617001a04fc00280709009605b6008809020099075f008805c70061
-049f005505c700610473005504e3002d03eb001506d2002c05830015059f
-007d04a5007206da000a056d000a06da000a056d000a0239008c073b0017
-05acffff059d009a04c80088059d00200515001905c7009604d5008805c7
-009604d50088059f007d04a5007206aa009105eb009b02aa001a05c70000
-0473004905c70000047300490800ffaa071d0058055600950473004105cf
-00590473004c073b001705acffff0503002c03fa00180503002c04360022
-05c0009904eb008c05c0009904eb008c0639005904e300520639005604e3
-005205b10057046b003804fa00000473000e04fa00000473000e04fa0000
-0473000e059f007d04a5007207d5009d06d5009505c0005e04e30054083e
-005e077a005407ad004606c4004305430046044a0043081a002007a50019
-08430096076600880639006204b000520620002d059b00150000ff430000
-fec90000ff770000ffb00000ff470000ff560000ff740000fed70000feac
-000000000000ff520000ff56000000000000feac0000fd9a000000000000
-ff6a0000ff7c0000ff690000ff560000feac0000ff7f0000ff560000fdef
-0000ff430000ff690000ff7c000000000000fdae0000ff8c000001020000
-feef0000feef0000fefd0000fef90000ff530000fef80000fef905c70000
-0473004905c7009604e3008705c7009604e3008705c7009604e3008705c7
-00610473005505c7009404e3005405c7009404e3005405c7009404e30054
-05c7009404e3005405c7009404e300540556009504730041055600950473
-004105560095047300410556009504730041055600950473004104e30097
-02aa00180639006204e3005405c7009604e3009205c7009604e3009205c7
-009604e3009205c7004e04e3003b05c7009604e300920239ffd20239ffd2
-0239001b0239ffce05c700990473008905c700990473008905c700990473
-008904e3009d0239009304e3009d0239ffeb04e3009d0239ffdd04e3009d
-0239ffcb06aa0091071d007e06aa0091071d007e06aa0091071d007e05c7
-009804e3009105c7009804e3009105c7009804e3009105c7009804e30091
-0639005904e300520639005904e300520639005904e300520639005904e3
-00520556009504e3008b0556009504e3008b05c70096031d008705c70096
-031d008705c70096031d008705c70096031d00590556004a047300300556
-004a047300300556004a047300300556004a047300300556004a04730030
-04e3002c02aa001f04e3002c02aa001f04e3002c02aa001f04e3002c02aa
-001f05c7009304e3008d05c7009304e3008d05c7009304e3008d05c70093
-04e3008d05c7009304e3008d0556ffff0473000b0556ffff0473000b078d
-000706390009078d000706390009055600000473000c055600000473000c
-0556fffd0473000e04e300160400002204e300160400002204e300160400
-002204e3009202aaffde063900090473000e047300490239008d04eb004e
-04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e05c7
-000005c7000006f3fff206f3000006f3fff206f3000006f3004306f30043
-03cc004e03cc004e03cc004e03cc004e03cc004e03cc004e061efff2061e
-000007aefff207ae000007aefff207ae000004e3008e04e3008e04e3008e
-04e3008e04e3008e04e3008e04e3008e04e3008e068ffff2068f0000081f
-fff2081f0000081ffff2081f0000081f0014081f00140239009002390090
-0239ffb60239ffc40239ffde0239ffec0239ffb30239ffc00301fff20301
-00000491fff2049100000491fff204910000049100140491001404e30052
-04e3005204e3005204e3005204e3005204e30052069dfff2069d00000855
-fff20855000007c9fff207c9000004a8007604a8007604a8007604a80076
-04a8007604a8007604a8007604a800760682000007fe00000862000007ae
-fff306c2004e06c2004e06c2004e06c2004e06c2004e06c2004e06c2004e
-06c2004e06cefff206ce00000886fff20886000007fafff207fa000007fa
-fff307fafff304eb004e04eb004e03cc004e03cc004e04e3008e04e3008e
-0239ffe70239008d04e3005204e3005204a8007604a8007606c2004e06c2
-004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e
-04eb004e05c7000005c7000006f3fff206f3000006f3fff206f3000006f3
-004306f3004304e3008c04e3008c04e3008c04e3008c04e3008c04e3008c
-04e3008c04e3008c068ffff2068f0000081ffff2081f0000081ffff2081f
-0000081ffff3081ffff306c2004e06c2004e06c2004e06c2004e06c2004e
-06c2004e06c2004e06c2004e06cefff206ce00000886fff20886000007fa
-fff207fa000007fafff307fafff304eb004e04eb004e04eb004e04eb004e
-04eb004e04eb004e04eb004e05c7000005c7000005c7ffd105c7ffdd05c7
-000002aa00dc02aa00ca02aa00dc02aafff302aafff304e3008c04e3008c
-04e3008c04e3008e04e3008c06e6000006e60000075700000757000005c7
-009602aafff202aafff202aafff30239ffe50239ffdb0239ffce0239ffce
-0239ffc20239ffbb0239ffe80239ffde03c9000003c9000002aa000002aa
-000002aafff304a8007604a8007604a8007604a8007604f3007604f30076
-04a8007604a800760556fffd0556fffd06e6ffd8074affdd061e000003b8
-fff403b8fff402aa002a06c2004e06c2004e06c2004e06c2004e06c2004e
-0765ffd1069dffdd0796ffd106ceffdd066a006202aa00bb02aa00dc0473
-000a05c7006105c70061071d007e05c7002109cd0096078d000705c70020
-04e3002d08b000140400003004c100660000ff530000ff530000ff530000
-ff530239001b0239ffa2047300000556001206b3005403fe005706ab0091
-040c001f05d6ffe605d6ffe602aa008402aa008402aa00c902aa00c902aa
-009102aa002a02aaffc502aaffc302aafff302aa00c902aa00a902aa00a9
-02aa00a902aa00a9032e001e032e001e02aa003a0000ff730000ff9d0000
-fec80000ff230000ff720000ff720000fee70000ff9d0000ff530000ff53
-0000ff530556009504e3008b04b5000006350000071d006104eb000f0473
-0055049900910499001b0401008c03fa001802390093040f00490476008e
-039e000e05eb009b04eb008c04e300520473003404f1005204f1005204f1
-0021078d00540492004b04e3005304e3005304e9008c04abfffb04abfffb
-03eb001504a8007604e300510624005104e000510473000b063900090400
-002203df002203f2004b04ec0014035500880473001204d5008804e9008c
-060700760515001903e300000591000003a2003203a2000003a300320355
-00320355003204030032037c00320172005502de003203b00032031e0032
-04220032037700320378003204260032037a0032035b003203ac00320377
-0032037b00320514000003050032030500320321003204b6003203210032
-03210032030200320302003202cf003202cf0032032000320121003202ca
-00320484003402f2003203480032030a0032034900320349003203200032
-01bc000a02f20032034200320484003202e90000034c000a031b003202e9
-00000343003203da003203080000012100320204003202f2003202e90000
-031b003202e900000342003203da00320308000005ed00460a9800460613
-00460689ffba0541ffba01e9001e045400100000ff0d0000ff350000fece
-0000feb70000fec90000ffc70000ff4f0000ff9e0000fef002be006902be
-00690376000a0376000a03c0ffba039cffba03c0ffba039cffba05c80039
-05920032061600820519004b05240041060f008705580028068f002d04ac
-00550000fe3b0000fe660000fe680473fffc0400008403d5ffba01e0ffba
-01e0ffb101e0ffba01e0ffba06d0002e0984002304000000080000000400
-00000800000002ab000002000000015500000473000002390000019a0000
-00ab00000000000005e5fff705c7006106aa009105eb009b0760008d07a1
-005407a1005b05c7000005c700610473001404e3001104e3002c04730039
-0400002205290042000001010000ff420000fead0000ff3a0000ff5304f3
-000a05c7006905c7006105c70069048900a4035500880000ff430000ff01
-0000ffac0316007d0000ff370298ffba033d001e0000ff3a0000ff480000
-ff490000ff7e0000ff4f0000ff4a0000fe9e0532003905320039022cffb6
-022cffb60532003c0532003c022cffba022cffba0532003905320039022c
-ffba022cffba0532003905320039022cffba022cffba0532003905320039
-022cffba022cffba0532003905320039022cffba022cffba053200390532
-0039022cffba022cffba049e0034047800300430ffba0430ffba049e0034
-047800300430ffba0430ffba02be004f02be004f02be006902be00690376
-000a0376000a073200400732004004deffba04deffba0454003403c00046
-0454ffba02e2ffba0454003403c000460454ffba02e2ffba0454003403c0
-00460454ffba02e2ffba0610002f0610002f0270ffba0298ffba0610002f
-0610002f0270ffba0298ffba060e00290708002902e2ffba0456ffba060e
-00290708002902e2ffba0456ffba060e00290708002902e2ffba0456ffba
-02e2002102e200210352ffba0352ffba02e2002102e200210352ffba0352
-ffba0454003e0454003e022cffba022cffba0454003e0454003e022cffba
-022cffba0454003e0454003e022cffba022cffba039c0023039c002301e0
-ffba01e0ffba0376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba04e3ffc104e3005402aafff3071dffc104e3ffd504e3
-ffc5031dffc1031dffc10473ffff02aaffda0400002104e3008302f00032
-04dc004e06fb001f0239001b0239001b04e3001404a8001404f8001404e3
-008704e3005402aa0018062500540473008902390070071d007e04e30091
-04e3008b031d00660473003003baffc40473000b0473000c040000220473
-004904e3005404e300540473004103fa004f03fa0018053e005102390093
-0473003402aaffc404e3008d0436002203210032030a0032030a00060348
-003202cf003201f0000a01f000000320003202f100320174000a01210032
-012100320174000a02760000018e00320150003202490032048400340484
-0032035f0000035f003202fa003203480032040300320302003202390000
-01bc000a0340000a035e003202ea003202ea003202e9000002e4003202e4
-003203be0032030a003202e800320000fe920000fe920000ff730000fe9f
-02aa00c903050032030200320348003202ee0000030200320639006205c7
-00000556001e05c7006102aa004104eb004e04eb004e04eb004e04eb004e
-04eb004e04eb004e04eb004e04eb004e0239ffb60239ffb60239ffc40239
-ffc40239ffb60239ffb60239ffc40239ffc404a8007604a8007604a80076
-04a8007604a8007604a8007604a8007604a800760239ffc90239ffc90239
-ffc90239ffc904a8007604a8007604a8007604a8007603e400220454001a
-03df003005c7fffd05c70016055600000556009504730041047300230239
-ffa20633005904e3005b05c70000031d001b0556fffd0473000e04730034
-047300550473003402390093048900110355001b055600000473000c0556
-00000473000c0503006f03fa004f059d0020051500190000fec60000fed4
-0000fec60000fed40000fe5f0000fe5f0000ff720000ff730000fee70800
-00000401005d0473003404e300110239001b04e300060556fffd05c70096
-0473004902aaffcd05c7009604e3009205c700990473008904e300160400
-00220473002804540096037c008805b9004e0000ff530000ffbc0000fefe
-0000fefe0000fea40000fea402390093000000000000006c0000006c0000
-006c0000006c0000011a000001ba00000388000006300000079600000948
-000009a800000a3200000abc00000bf000000c6c00000cdc00000d2a0000
-0d6800000dbe00000ec200000f44000010ea000012420000135c000014ce
-00001602000016be0000185c000019a2000019fc00001a8800001b120000
-1b9400001c2200001d1000001ea40000201e00002186000022c0000023aa
-00002468000025040000264a0000271e000027a60000284400002a0e0000
-2a6a00002cbe00002ebc00002fc4000030940000322e00003392000035f2
-0000368800003768000038a200003ae400003c6000003d5600003ee80000
-3f5c00003fb000004018000040ca000040fe00004162000043700000446c
-000045a800004698000048a4000049a400004b8000004c8000004d220000
-4dfa00004f2600004f920000514600005230000053200000541c0000551e
-000056020000594800005a6800005b5000005ca400005f0a000060e00000
-625e000063ec000065140000657a000066b20000677a000067bc000067fc
-000068380000687e000068c6000069160000695a00006994000069c40000
-69f400006a3600006a7800006aaa00006aee00006b3a00006b8400006bb4
-00006bfa00006c3600006c7600006cb200006cea00006d3a00006d760000
-6db200006de200006e2400006e7400006ebe00006ef600006f3800006f6c
-00006fe40000706a000072160000738200007578000075c20000765c0000
-77aa0000799a00007b4e00007c6800007cca00007d2200007e0200007f34
-000080ac000081d40000829a0000837000008430000085d4000086900000
-877200008850000088b60000894a00008a0e00008b4a00008be200008d22
-00008fc40000914a00009250000092f00000934a0000942a000095d80000
-9744000097ee000098e2000099c800009a3c00009a7400009aba00009af8
-00009c7400009e8a00009ec400009efa00009fc20000a0960000a1060000
-a1240000a1c60000a2a00000a2dc0000a3160000a37c0000a5140000a5b2
-0000a6440000a7a00000a8ca0000a9b40000a9f20000aa020000aa200000
-ac2a0000ac6c0000acba0000acf60000ad360000ad840000adc20000ae00
-0000ae3a0000ae7c0000aeb40000aee40000af1e0000af620000af920000
-afda0000b03c0000b0a80000b1560000b18a0000b1fa0000b2400000b2f6
-0000b3900000b4240000b48c0000b4e80000b5bc0000b6880000b6b80000
-b6e80000b74c0000b7a20000b82a0000b9540000bacc0000bb020000bb32
-0000bc3a0000bd0e0000bd4a0000bee00000bf5e0000c06c0000c1a00000
-c34c0000c4da0000c7220000c7d80000c81c0000c85c0000c88e0000c8d2
-0000c90e0000c9520000c98c0000c9be0000c9f00000cb200000cb560000
-cb800000cbcc0000cc0e0000cc340000cc5a0000cc900000cdce0000cde6
-0000ce0c0000ce320000ce700000cea00000ced00000cf0e0000cfcc0000
-d07e0000d0b20000d0e80000d1240000d1620000d1b00000d1e20000d214
-0000d2500000d28c0000d2c80000d3040000d3360000d3660000d3960000
-d3bc0000d3e00000d41e0000d5920000d5d60000d60e0000d6460000d67c
-0000d6cc0000d70e0000d7540000d7a60000d7f20000d9040000da100000
-daf80000dbe80000dcee0000ddd80000de480000df720000dfc20000dff2
-0000e0ec0000e3200000e3600000e3a00000e3e00000e41e0000e47c0000
-e4da0000e5480000e5680000e6080000e6a20000e6d80000e73c0000e786
-0000e7d00000e7ec0000e8080000e8280000e8480000e8680000e8880000
-e8ae0000e8d40000e8fa0000e9200000e9500000e9780000e9a00000e9cc
-0000e9f80000ea2c0000ea560000ea820000eab80000eae20000eb0e0000
-eb440000eb6e0000eb980000ebcc0000ebfc0000ec300000ec740000eca4
-0000ecd80000ed1a0000ed4e0000ed800000edc20000edf60000ee260000
-ee680000eeac0000eef20000ef4e0000ef6a0000ef860000efa20000efbe
-0000efda0000f1480000f3f20000f6620000f67e0000f6980000f6b40000
-f6d00000f6ec0000f7080000f7640000f79e0000f8080000f8d20000f972
-0000fa480000fac80000fb500000fbc00000fc560000fcb40000fcfa0000
-fd580000fdba0000fdfa0000fe560000feba0000ff2c0000ff6a000100fc
-0001020c00010236000102520001027e000102b600010302000103320001
-036200010396000103c6000103f6000104260001045600010486000104b6
-000104e6000105160001054600010576000105a6000105d6000106060001
-07900001093e0001096e0001099e00010a8a00010ba200010bd200010c00
-00010c3000010c5e00010c8e00010cbc00010ce000010d0400010d3e0001
-0e1e00010e6e00010ed40001101a0001104c000110720001109a000110d8
-000111ae000112a6000112d6000113060001133600011366000113960001
-13c4000113f400011424000114e6000115fa0001162a0001165a0001168a
-000116ba000116ea0001171a000117400001176600011796000117c60001
-17f600011826000118c600011918000119e600011a1600011a4600011a76
-00011aa600011ad800011b0800011b3800011b6800011b9800011bcc0001
-1c0000011c3000011c6000011cbe00011ce800011e6e00011f560001210a
-0001235e0001259600012734000127940001281a0001282a000128ec0001
-2a9000012b6400012c3a00012cc600012dea00012efe00013070000130a6
-000130b6000130c6000131a0000131b0000131c0000131d0000131e00001
-31f0000132f60001330600013316000133c0000133d00001342200013432
-000135260001353600013546000135560001362800013742000137760001
-37aa000137da0001380a0001383a000138680001389c0001398600013a7c
-00013b5c00013c2600013ce600013d3800013e6a00013f7e000140420001
-40520001415e0001416e0001423800014316000143de000144fc000145c8
-000146c6000146f80001472c0001475c0001478c000147bc000147f00001
-48d20001490200014a2600014a3600014a4600014a7a00014a8a00014b90
-00014c7c00014d4a00014d7a00014daa00014e2a00014e3a00014ef00001
-4f0000014f5800014ff600015006000151e80001530c0001543200015462
-0001558c0001560400015614000156240001563400015688000156980001
-56a8000156b8000157b0000158ae000158be0001592a000159b800015a40
-00015ade00015b9c00015c8400015d3e00015e6800015f8e000160cc0001
-60dc00016202000162f00001634e0001641e0001642e0001661400016766
-0001684a0001687a0001699000016a1a00016bd400016c5a00016c6a0001
-6cd400016ce400016cf400016d5e00016d6e00016ec200016ed200016f5c
-00016fe80001707800017128000171e4000172e4000173a2000174a80001
-75b4000176e200017716000178520001788000017996000179a6000179b6
-000179e8000179f800017b0400017be800017ce600017d2000017d500001
-7df000017e4e00017ebe00017efa00018090000181140001819e000182e6
-000183a00001848a000184da000185620001862a00018668000186ba0001
-8716000188000001885400018892000188ca00018908000189560001899e
-000189e400018a4000018b9600018c3800018d4e00018dac00018e480001
-8e8600018f4000018fb6000190b4000190ee0001917800019234000192d6
-0001935c0001942800019466000194ee000195bc0001969a000197620001
-98700001992600019a3200019ae400019b6c00019c6c00019d5400019dac
-00019e0400019e5800019ea600019f3e0001a04a0001a08e0001a0cc0001
-a1140001a14a0001a1b40001a2940001a2cc0001a2fa0001a3320001a360
-0001a3920001a3c40001a43e0001a4940001a5f20001a6920001a7b00001
-a8600001a8ac0001aa020001aab20001aadc0001ab580001aba00001acd8
-0001add60001ae440001afc60001b1840001b2ea0001b3f80001b4220001
-b5b20001b6f00001b71c0001b7500001b77c0001b7ac0001b91a0001b944
-0001ba540001bb060001bbb60001bc4a0001bd180001be540001be640001
-be980001bf580001c1100001c1e80001c2520001c3780001c3d60001c4e8
-0001c5b60001c6420001c6c00001c79c0001c8dc0001c9d60001ca8c0001
-cb780001cc400001cd1e0001cdee0001cecc0001cf600001d18c0001d1b6
-0001d1e00001d1f00001d21a0001d3540001d4720001d5820001d5ac0001
-d5d60001d6000001d62a0001d6540001d8380001d8620001d88c0001d8b6
-0001d8e00001d90a0001d9340001d95e0001d9880001d9bc0001d9e60001
-da100001da3a0001dbd40001dbe40001dd1c0001dd2c0001dd560001dd80
-0001ddaa0001ddd40001df6e0001e1e80001e3460001e3560001e4c80001
-e4d80001e6360001e81a0001e91c0001eaa20001ec6c0001eec00001f02e
-0001f2220001f2320001f2420001f3a60001f3d00001f3fa0001f4240001
-f44e0001f4780001f4a20001f4cc0001f4f60001f5200001f54a0001f574
-0001f59e0001f5c80001f5f20001f61c0001f8d40001fab40001fc3e0001
-fe7e0001fff6000200200002004a0002007a000200aa000200fa0002014a
-0002018a000201fc00020250000202ae000203040002033a0002037c0002
-03c20002040c0002043c00020474000204a40002060a000209500002097a
-000209a4000209ce000209f800020a2200020a4c00020a7600020aa00002
-0aca00020af400020b1e00020b4800020b7200020b9c00020bc600020bf0
-00020c1a00020c4400020c6e00020c9800020cc200020cec00020d160002
-0d4000020d6a00020d9400020dbe00020de800020e8000020f1000020f3a
-000212c2000213cc00021544000216ca000218ac00021a8000021c9e0002
-1cae00021e5600021fee00022260000224a00002261800022628000226d4
-0002277e000228ba000228ca00022996000229a600022b4800022d300002
-2e9c00022eac00022fb400022fc40002313e0002314e0002327c0002328c
-000233c80002357c000236740002368400023776000238d4000239800002
-399000023ad200023c8000023d7600023d8600023e2a00023e3a00023f22
-00023f3200023ffc0002400c0002412200024132000242f8000243080002
-447600024486000246f800024708000249180002492800024aa400024ab4
-00024be600024bf600024db400024dc400024f3a00024f4a000250b80002
-50c8000250d8000250e8000252a8000252b8000252c8000252d800025428
-0002556000025678000257720002591400025aa600025c0e00025d5c0002
-5f2200025f3200026084000261e6000263cc000263dc0002656400026708
-0002694200026952000269620002697200026adc00026aec00026bbe0002
-6bce00026d0600026d1600026dfc00026e0c00026f4600026f5600027010
-0002702000027146000272aa00027418000275c6000276f6000277060002
-7880000279c200027be200027db400027ec400027ed40002815600028382
-0002864c000288a800028b6800028daa00028f68000290c2000290ec0002
-91160002912600029136000291600002918a000291b4000291c4000291d4
-000291fe000292280002923800029248000292720002929c000292c60002
-92d6000292e6000292f60002930600029316000293260002935000029360
-000293700002939a000293c4000293ee00029418000294420002946c0002
-9496000294c0000294ea000295140002953e0002956800029592000295bc
-000295e6000296100002963a000296640002968e000296b8000296e20002
-970c00029736000297600002978a000297b4000297de0002980800029832
-0002985c00029886000298b0000298da000299040002992e000299580002
-9982000299ac000299d600029a0000029a2a00029a5400029a7e00029aa8
-00029ad200029afc00029b2600029b5000029b7a00029ba400029bce0002
-9bf800029c2200029c4c00029cf400029d3800029dae00029dd800029e02
-00029e2c00029e5600029e8000029eaa00029ed400029efe00029f280002
-9f5200029f7c00029fa600029fd000029ffa0002a0240002a04e0002a078
-0002a0a20002a0cc0002a0f60002a1200002a14a0002a1740002a2260002
-a25a0002a28e0002a2c20002a4460002a5c60002a7320002a8800002a940
-0002aa020002aa740002ab460002ac180002ac8a0002ad4e0002ae400002
-af040002aff60002b09c0002b1a80002b23a0002b3820002b4c00002b524
-0002b64c0002b81a0002ba620002bace0002bb3a0002bba40002bc100002
-bcbe0002bd6c0002be120002beb80002bf5e0002bf8e0002bfbe0002bfee
-0002c0000002c0120002c0240002c0360002c0480002c0b80002c12a0002
-c15a0002c16c0002c17e0002c18e0002c19e0002c1b00002c1c20002c1d4
-0002c1e60002c1f80002c20a0002c3160002c3bc0002c4c80002c56e0002
-c5c60002c5ec0002c6120002c63c0002c66a0002c6b40002c7100002c74a
-0002c7a20002c7e20002c8320002c86a0002c8c00002c9020002c9420002
-c9940002ca060002ca500002cabc0002cafc0002cb680002cba80002cc10
-0002cc520002cca60002cccc0002ccf20002cd1c0002cd4c0002cd7c0002
-cdac0002cdfa0002ce560002ce940002ceee0002cf360002cf8c0002cfd0
-0002d0240002d06a0002d0ac0002d0d20002d1080002d12e0002d1540002
-d17a0002d1a00002d1ce0002d1f80002d2420002d29e0002d2d80002d330
-0002d3700002d3c40002d3fc0002d44c0002d48e0002d4ce0002d5080002
-d5440002d5800002d5bc0002d5ea0002d6140002d6520002d6820002d6a8
-0002d6ce0002d6f40002d71a0002d7440002d76e0002d7ae0002d7fa0002
-d8400002d8780002d8a20002d8cc0002d8fc0002d92c0002d9520002d978
-0002d9a20002d9cc0002d9fe0002da300002da600002da900002dac00002
-daf00002db200002db4e0002db7e0002dbae0002dbde0002dc0e0002dc42
-0002dca20002dcd60002dd3a0002dd6e0002ddce0002de020002de660002
-df0e0002dfde0002e0f40002e1c60002e2400002e2ae0002e4900002e65a
-0002e77a0002e88c0002e9d00002eae40002eb740002ebf40002ec880002
-ed0a0002edca0002ee6a0002ef360002f01c0002f0d40002f1a00002f21c
-0002f22c0002f2fa0002f3ba0002f4840002f5380002f62e0002f6a40002
-f7cc0002f8e60002fa6e0002faf00002fbe00002fcd60002fdce0002fe60
-0003007200030202000302880003040a00030476000304e00003054e0003
-0714000308dc0003096c000309b8000309f600030a3800030a8000030aac
-00030af200030b2800030b6400030ba200030be000030c6800030cf00003
-0d3200030d6a00030da400030dde00030e0600030e2e00030e7200030eb6
-00030ef400030f3200030f6200030f9200030fb800030fde000310200003
-1062000310a8000310ee000311460003119e000311fa00031256000312b2
-0003130e0003135c000313aa000313d2000313fa00031420000314460003
-148a000314ce0003151a00031566000315b0000315fa0003164800031696
-000316d6000317760003179c000317c20003180c0003187c000318a40003
-18cc0003191200031958000319ae00031a0400031a5200031b0c00031b34
-00031b5c00031bb000031c0400031c4400031c8400031caa00031cd00003
-1d3600031d9c00031dde00031e2000031e4600031e6c00031ec200031f18
-00031f7400031fd00003202400032078000320c6000321140003215e0003
-21a8000322020003225c000322b000032304000323460003238800032426
-000324c40003250e00032558000325aa000325fc00032662000326c80003
-272000032778000327a4000327d0000327fc000328280003285400032880
-000328ac000328d8000328fe00032924000329500003297c000329ca0003
-2a1800032a6400032ab000032b0000032b5000032bca00032c2c00032ca4
-00032cee00032e8000032eb400032ee800032f1e00032f4200032fac0003
-301600033098000331000003314800033190000331dc000332460003326e
-00033296000332bc000332e2000333320003338200033416000334680003
-34c6000335240003358a000335f0000336d6000337e6000338b4000339ae
-00033a1a00033a8000033ade00033b4000033bc600033c4c00033cb20003
-3d1800033d8400033df000033e4600033e9c00033ece00033f0000033f26
-00033f4c00033fb80003401e0003407c000340de000341f0000342fc0003
-440a0003450e000345340003455c00034580000345a4000345cc000345f4
-0003461a00034640000347620003489e000349cc00034af800034bb20003
-4c6c00034d2c00034dec00034ed000034fb4000350b0000351ac00035290
-000353740003544a000355200003556a000355b4000355da000356000003
-5650000356a0000356c4000356e8000357be000357ce0003582200035876
-000358d40003593200035972000359b2000359fc00035a4600035a960003
-5ae600035b3c00035b9200035be400035c2200035c9c00035cde00035d22
-00035db000035e3e00035ff0000360000003603a00036074000360a40003
-60d4000361080003613c00036176000361b00003620400036258000362ba
-0003631c000364cc0003665400036690000366c8000367120003675c0003
-67a2000367e80003683800036a5e00036a8400036aaa00036afe00036da8
-00036e7a00036f1600036f6400036fa200036fd4000371c20003747e0003
-7550000376b4000377ee0003789a00037a3000037c8400037ec000037f1a
-00037f600003802e000381200003813e000381e80003830e000383ea0003
-83fc0003855c000386e200038708000387c6000387e40003880a00038830
-000388560003887c000388a2000388c8000388ee00038914000389600003
-89c0000389e800038a0e00038b6c00038d4800038d5800038e2800038f38
-00038f96000390ae0003923c000392e2000394280003947a000394cc0003
-9504000395500003957c000395c2000395ee0003962a00039684000396ce
-0003971a0003978a00039850000398cc0003998c00039a0400039ade0003
-9b6e00039ba800039be400039d5c00039e4c00039e9600039edc0003a026
-0003a1360003a1460003a2500003a3360003a4480003a5140003a62a0003
-a7680003a7780003a8500003a9120003aa120003ab6c0003abcc0003ad50
-0003adc40003af180003b0800003b1640003b1b60003b21e0003b3a80003
-b51e0003b5a60003b74a0003b83a0003b95e0003ba000003baea0003bbd4
-0003bccc0003bdb40003bee60003c02c0003c1ce0003c38a0003c39a0003
-c49e0003c5d00003c67a0003c78e0003c81a0003c98a0003ca520003cb4c
-0003cc9a0003cdb20003cf580003d0980003d1ea0003d30e0003d4c00003
-d6480003d7420003d8180003d9740003da340003da6a0003dad20003dba6
-0003dbb60003dc160003dc720003dccc0003dd040003dd420003dd8c0003
-ddc80003de060003de500003df620003dfb40003e0100003e0bc0003e0e4
-0003e1540003e1840003e1b60003e3600003e4860003e4c00003e4f00003
-e53c0003e56e0003e5940003e5ba0003e5fc0003e63e0003e66e0003e69e
-0003e6e20003e7280003e7660003e7a00003e7da0003e80a0003e8c60003
-e9800003e9c20003e9f20003ea260003ea620003ea920003eac20003eafc
-0003eb340003eb640003eb980003ebcc0003ebf40003ec240003ec540003
-ec880003ecc00003ecf00003ed200003ed600003ed920003edce0003ee00
-0003ee400003ee7a0003eeaa0003eeda0003ef000003ef260003ef4c0003
-ef7c0003f0940003f1920003f1c20003f1f40003f2980003f43e0003f5a8
-0003f6960003f8000003f8300003f8600003f8980003f8d00003f9220003
-f97e0003fa700003fa980003fb060003fb360003fb660003fb8e0003fc00
-0003fc300003fc660003fdc60003fe880003ff6400040088000401800004
-02d0000403ec0004050a0004060e000407700004091600040aae00040cba
-00040df000040e8a00040ff800041008000410d6000412980004149a0004
-154c0004162a00041744000417f400041846000418980004196e00041a54
-00041ae400041c5c00041d5a00041e5c00041f900004206e000421540004
-21f4000422fe000424260004251a000426020004267e000426fa000427a6
-0004285800042936000429ac000429fe00042b7000042cf000042eee0004
-2fb2000430840004316a000432a00004336c000434740004358e00043692
-0004376200043840000439da00043af600043bd000043d4400043f380004
-404e000441fc0004428e00044330000443be0004445c0004456000044570
-000446ca000447da000447ea000448c4000449e800044a4800044b680004
-4c3600044d1800044f000004510e000453e40004561e000457ac000459d6
-00045b7e00045d6000045eba00046026000460a80004615c0004624a0004
-62f600046362000463e4000464bc00046600000467720004688000046890
-000468a00004690200046966000469c400046a5200046ade00046ba40004
-6c3e00046c4e00046c5e00046cf800046d9800046dde00046e5000046ec2
-00046f1000046f4400046fb6000470260004709a000470ea0004717e0004
-720e0004728c00047310000473ac000473d800047446000474f800047606
-000476520004781c00047908000479180004794e00047992000479d60004
-7a1a00047a5000047a8200047ac400047b1a00047b6600047c1400047c8c
-00047d1600047d8a00047df000047e7600047ed600047f4000047fb80004
-802c0004808a00048134000481d000048240000482d200048330000483a2
-00048450000484fa00048594000486080004868e000486f6000487a60004
-886800048918000489ae00048a1000048a8000048ad600048b5800048bda
-00048c6400048cf400048d4e00048dba00048e2a00048e9c00048f100004
-8f980004902c00049096000491100004919000049208000492b20004934e
-000493e200049444000494e600049566000495fc000496a4000497520004
-97ee0004984e000498a600049912000499bc00049a6a00049b3800049be2
-00049c4800049ca000049d0400049d9600049e2000049eb200049f160004
-9f7e00049fe80004a0500004a0bc0004a1380004a1c40004a25c0004a2c8
-0004a3300004a3940004a4440004a5080004a5ba0004a64c0004a6ae0004
-a71e0004a7920004a83a0004a8e40004a9ac0004aa520004aaba0004ab4e
-0004abc40004ac600004ace20004ad600004add00004ae620004aebe0004
-af200004afaa0004b02a0004b0920004b0fa0004b1520004b1c00004b228
-0004b2aa0004b3240004b3a20004b4260004b4820004b4e80004b5500004
-b5f40004b69a0004b75c0004b8100004b8700004b8ec0004b94e0004b9dc
-0004ba780004bb0a0004bb740004bbd60004bc680004bcde0004bd7c0004
-be140004be880004befc0004bf780004bfd60004c03a0004c0b80004c116
-0004c17a0004c1d80004c2380004c2a00004c2f40004c32a0004c3760004
-c3da0004c41a0004c4640004c50e0004c5b60004c60c0004c6440004c694
-0004c7440004c7f20004c8440004c8980004c8f00004c9400004c9980004
-c9fe0004ca5e0004cafe0004cba20004cbe00004cc460004cce40004cd78
-0004ce0a0004ceb00004cee20004cf4a0004cfb20004cffc0004d0ce0004
-d1500004d1f80004d2600004d29e0004d3080004d3ae0004d4040004d458
-0004d4c40004d5280004d5c80004d5fa0004d62a0004d6740004d70c0004
-d7360004d7600004d8280004d8820004d9240004d98e0004da0a0004daba
-0004db300004dba00004dbf80004dc5e0004dcc00004dd600004ddb80004
-de840004def00004df4a0004df940004dfea0004e08a0004e1500004e29c
-0004e3b80004e41c0004e4900004e7b60004e8460004e8c60004e9140004
-ea7c0004eba80004ebf00004ecec0004edb40004ee920004ef840004f03e
-0004f1180004f1820004f21a0004f2ec0004f3e00004f4520004f4c00004
-f5040004f6160004f74a0004f83c0004f8800004f8bc0004f9a60004faa8
-0004fc2a0004fd260004fe2a0004ff340005002000050082000500f80005
-02820005031400050444000505340005065c000507940005085800050940
-00050a0000050b5400050d0600050e9800050fd2000511380005120e0005
-12cc0005138a00051450000515a8000516f8000517080005171800051728
-000517c400051862000518b0000518ee000519340005196400051ac20005
-1c5e00051d7000051e980005202400052196000522a60005247a00052666
-000528c000052a2000052b4a00052cdc00052e4e00053064000532d20005
-33d200053508000536280005377a0005386e000539b4000539f600053a36
-00053c7800053ec600054026000541bc000543ec0005458c000546180005
-46480005469000054724000547be0005491e000549b000054a2000054a60
-00054a9e00054c5000054e8e0005503e000551680005525e000553640005
-553a000556f0000557f20005590800055ace00055cbc00055e6400055fe0
-00056166000562c60005635e000563fa000565180005663e000567960005
-694a00056a8600056bda00056c6000056cde00056d9200056e5800056f04
-00056fce00057100000572a0000572c6000572ec000572fc0005732c0005
-735c000574d00005764000057702000577c4000578a60005797e00057a32
-00057b0600057bb000057c7600057df800057fa800058012000580420005
-806a0005809e000580d2000580e2000580f2000581220005814800058184
-000581c0000581f4000582280005825c00058292000583b8000583c80005
-83f8000584280005845c00058494000584c8000584fc0005853000058564
-00058598000585ce000585fe0005863400058668000586a2000586f20005
-873c00058770000587a4000587da00058810000588c4000588d4000589de
-00058b4a00058cb400058e5400058f9a000590f2000591e4000592ee0005
-93d2000594d2000595f8000596e4000597a0000598620005994a00059a04
-00059ace00059b5600059c0400059c9600059d1400059e2e00059e9a0005
-9f620005a05e0005a0cc0005a13c0005a1f40005a3d80005a4e60005a56c
-0005a5b20005a67a0005a70a0005a7f40005a8a00005a90e0005aa160005
-ab020005abc20005ac080005ac9a0005ada80005ae440005aea00005af96
-0005b0900005b2120005b3760005b4740005b55e0005b62c0005b6540005
-b67c0005b6ac0005b6dc0005b7040005b72c0005b7540005b77c0005b7d6
-0005b8400005b8720005b8a20005b8c80005b8f00005b9180005b9420005
-b96c0005b9940005b9bc0005b9e20005ba0e0005ba980005bac00005bb42
-0005bb6a0005bb900005bbb60005bbdc0005bc2e0005bc820005bcb40005
-bce40005bd160005bd520005bd820005bdb80005bdde0005be040005be38
-0005be6c0005beac0005bef20005bf180005bf3e0005bf640005bf8a0005
-bfb40005c0180005c0640005c0960005c0c40005c0fa0005c1380005c160
-0005c1860005c1ac0005c1f60005c2380005c2600005c2860005c2b20005
-c2d80005c3340005c3640005c3940005c3c40005c3ea0005c4140005c444
-0005c4740005c49a0005c4c00005c4e60005c50c0005c5320005c5580005
-c5800005c5f80005c6220005c68c0005c6b40005c7580005c7800005c7fc
-0005c8300005c8720005c8a20005c8d20005c9020005c9320005c95e0005
-c9840005c9cc0005ca0e0005ca3a0005ca620005ca920005cac20005cae8
-0005cb0e0005cb3a0005cbee0005cc160005ccc60005cd080005cd4a0005
-cd7a0005cdae0005cdd40005cdfc0005ce220005ce4a0005ce700005ce98
-0005cec00005cee80005cf0e0005cf340005cf5a0005cf800005cfa80005
-d0300005d0640005d0ca0005d0fa0005d12a0005d1500005d1760005d1b0
-0005d1f40005d2260005d2620005d2920005d2c20005d2f60005d32a0005
-d35a0005d3900005d3c80005d3f80005d4260005d4500005d47e0005d4a4
-0005d4ca0005d4fe0005d5440005d57e0005d5ba0005d5ec0005d61c0005
-d6580005d6940005d6d00005d71a0005d7640005d79c0005d7da0005d816
-0005d8560005d8b20005d90e0005d96a0005d9c60005da300005da9a0005
-daca0005db020005db420005db860005dbca0005dc0e0005dc6a0005dcc6
-0005dd320005dd9e0005de0a0005de760005dea60005ded60005df0e0005
-df460005df860005dfc60005e0020005e03e0005e09a0005e0f60005e15a
-0005e1be0005e2220005e2860005e2e40005e3420005e3700005e39e0005
-e3d00005e4020005e4340005e4660005e4a40005e4e20005e5520005e5c4
-0005e6260005e6880005e6ea0005e74c0005e7a40005e7fc0005e82c0005
-e85c0005e8900005e8c40005e8f80005e92c0005e9860005e9f20005ea5c
-0005eac60005eb2e0005eb960005ebc60005ebf60005ec2a0005ec5e0005
-ec9e0005ecde0005ed1a0005ed560005edaa0005ee100005ee640005eeb2
-0005eee20005ef120005ef460005ef7a0005efae0005efe20005f01a0005
-f0520005f0ae0005f1040005f1640005f1c40005f21a0005f2700005f2ca
-0005f31e0005f3540005f3860005f3c40005f3f40005f4240005f46e0005
-f49c0005f4cc0005f5120005f54a0005f5860005f5ca0005f5fe0005f62e
-0005f6780005f6cc0005f7220005f7780005f7dc0005f8400005f8920005
-f8e80005f9340005f9860005f9f20005fa5e0005faca0005fb360005fbb2
-0005fc2e0005fc700005fcb20005fcfa0005fd420005fd940005fde60005
-fe340005fe820005fef00005ff5e0005ffd40006004a000600c000060136
-000601a600060216000602580006029a000602de00060322000603660006
-03aa000603f40006043e000604ac0006051400060586000605f800060660
-000606c80006073200060796000607cc0006080200060852000608800006
-08cc000609080006095e0006098e000609be000609ea00060a1600060a3c
-00060a9000060afe00060b5200060bee00060ce000060d2200060d480006
-0da400060dd400060e1600060e7c00060eea00060f5000060fba00060fe0
-00061088000611260006126600061294000612c2000613260006138a0006
-13b8000613ec0006141c0006144c000614bc00061532000615da00061678
-000617b4000617e4000618140006187a000618e000061910000619400006
-1970000619a6000619d600061a0600061a5200061ab200061b0e00061be8
-00061cc200061d3400061d7a00061da000061de200061e1200061e540006
-1e8800061ef200061f3800061fae00061fd40006204400062092000621b2
-00062444000625d800062730000628e200062bf000062e860006306e0006
-320c00063464000635a6000637bc0006382c000638940006390600063978
-00063a0000063a9e00063c7c00063e2a00063ff6000640f60006428a0006
-43ea000644ae000645a40006460c0006466e000646dc0006474000064814
-0006487c0006494600064a0400064aa000064b0200064b9800064c2a0006
-4cc600064d5e00064dc400064e2200064e8e00064ef600064f7200065020
-0006508a000650e80006514a000651fc0006527e00065300000653360006
-5368000653780006538800065494000655bc000657dc0006592e0006593e
-000659f800065aee00065b7800065b8800065c0800065c8000065ca20006
-5d6400065d7400065d8400065d9400065da400065ea000065fe6000661a6
-000663ba000664ac00066512000665760006663800066648000667e20006
-67f200066802000668c6000669e200066abe00066ace00066ade00066aee
-00066c4a00066e3a00066f4a00066f5a00066f6a00066f7a00066f8a0006
-704000067050000671a6000672e2000673d0000674e000067584000675f2
-000676620006777c000677e000067824000678b200067a7200067ab20006
-7ba600067c7200067d3e00067dc400067e9a00067f360006809e00068122
-000681b600068330000684a20006862a0006870e000688d8000689c20006
-8ab000068bdc00068d0200068e5c00068fc60006910800069180000692b6
-000693ae000694ac000695a80006968e00069718000697a2000698940006
-995000069a1200069abe00069bb400069c9000069d9400069ed400069fbc
-0006a13c0006a26a0006a36e0006a3b80006a4240006a4e40006a5c00006
-a6fe0006a7e60006a9320006aa600006ab6a0006ac0c0006ad580006ae14
-0006af3e0006b0000006b0480006b2420006b2f80006b4e60006b6420006
-b7e00006b8e20006b9480006ba900006bb080006bc980006bcce0006bd04
-0006bd560006bda80006bde00006be200006be580006be980006bfc60006
-c0280006c0e80006c19c0006c23e0006c2d60006c3520006c45e0006c4bc
-0006c5ea0006c69a0006c7680006c7a20006c7de0006c8660006c9260006
-ca220006caf80006cb1e0006cb440006cbdc0006cbec0006cbfc0006cc0c
-0006cc1c0006cc2c0006cc3c0006cc4c0006cc5c0006cc6c0006cc7c0006
-cc8c0006cc8c0006cdf00006ce000006ce740006cf0e0006d01c0006d176
-0006d2d60006d4900006d65e0006d8320006d8b60006d9d40006db1e0006
-dcc60006dd620006ddb20006de480006df660006dfb60006e0460006e170
-0006e1800006e2ae0006e3be0006e4340006e48c0006e5780006e5be0006
-e5fe0006e69a0006e6ee0006e8700006e94e0006e98e0006e9f80006ea62
-0006ea9a0006ebe20006ecd80006ede60006ee1e0006ee560006ee7c0006
-eea20006eed20006ef020006ef260006ef4a0006ef760006efa20006efe8
-0006f02e0006f05a0006f0860006f0cc0006f1120006f16e0006f1ca0006
-f1ee0006f2120006f26a0006f2c20006f3080006f34e0006f3840006f3ba
-0006f3f00006f4260006f4880006f4f20006f5520006f5b20006f5fe0006
-f6cc0006f6f40006f71c0006f7880006f7f40006f8420006f8900006f996
-0006f9a60006f9f00006fa3a0006fa820006faca0006fb280006fb8a0006
-fbe40006fc360006fcba0006fd220006fd960006fe080006fe8e0006fefc
-0006ff6e0006ffd40006fffa0007002000070044000700680007009c0007
-00d0000700f60007011c00070188000701f400070260000702c80007031a
-0007036c000703c2000704140007043c0007046400070496000704c40007
-051a00070570000705cc000706280007064e00070674000706a0000706cc
-0007072800070784000707a8000707cc000708820007093800070b0a0007
-0b1a00070b7e00070be200070c2e00070c7a00070e3e00070e4e00070f5c
-00070f6c00070fc60007102000071078000710d000071134000711980007
-11dc00071220000713b6000715480007169800071866000719e400071b9e
-00071ccc00071dc40007203e000721c2000723ea00072566000725f20007
-272a0007294e000729d6000729e600072b5600072c8200072dea00072f30
-00073066000731640007333a000734ee0007357e000736c2000737ae0007
-38fc000739ea00073bd600073cf200073e1400073fe800074152000742f6
-000743fc0007454c000746a40007489a00074a7600074bda00074c9e0007
-4dd200074e9c00074fa60007512000075214000752f80007549600075668
-0007567800075726000757f000075800000758c800075962000759ae0007
-59be00075a3800075b0c00075b6800075c1800075c5a00075d9000075e86
-00075f82000760820007612000076264000763ac000765cc000766620007
-676200076882000769ca00076a8600076b6000076c3c00076d0800076e0a
-00076fb6000770d6000771fc0007728a0007731a0007742c0007748c0007
-7578000776e40007781600077912000779fe00077b2400077cb400077e5a
-0007802600078156000781d800078258000782e200078362000783ec0007
-84a800078550000785fe000786a600078720000787a40007881e000788a2
-00078958000789fa00078a9a00078b3c00078bb800078c3e00078cba0007
-8d4000078df800078ea200078f4800078ff0000790e0000791d4000792b4
-0007939c0007948e0007958200079668000797540007991c00079a7e0007
-9b2200079c3200079cf800079d0800079dfc00079f5600079fea0007a094
-0007a15e0007a2300007a3120007a3ae0007a4980007a5be0007a5ce0007
-a6880007a7420007a7520007a7fa0007a8a00007a98e0007aa7c0007ab58
-0007ac2a0007adae0007af540007afee0007b08a0007b0c60007b1040007
-b1400007b17e0007b1d80007b2300007b28a0007b2ee0007b37a0007b578
-0007b5cc0007b5dc0007b6680007b6ec0007b7700007b8280007b9380007
-baf60007bc140007bca40007bd480007bdf80007beda0007bf5c0007bfea
-0007c1120007c15a0007c1b20007c28c0007c2c80007c3260007c3640007
-c3960007c3da0007c41c0007c44c000100000d3500f2003c008f00060002
-0010002f0055000006fa02c20005000200>
-<0000005303ea0000000300000000006a00000000000300000001000a006a
-00000003000000020008007400000003000000030058007c000000030000
-0004001400d40000000300000005001800e8000000030000000600180100
-000000030000000700ba01180000000300000008003001d2000000030000
-0009008a0202000000030000000d02aa028c000100000000000000350536
-00010000000000010005056b000100000000000200040570000100000000
-0003002c05740001000000000004000a05a00001000000000005000c05aa
-0001000000000006000c05b60001000000000007005d05c2000100000000
-00080018061f000100000000000900450637000100000000000d0155067c
-0003000104030002000e07d10003000104030004001a07df000300010405
-0002000a07f9000300010405000400160803000300010406000200060819
-00030001040600040012081f000300010407000200080831000300010407
-0004001408390003000104080002000c084d000300010408000400180859
-0003000104090000006a08710003000104090001000a08db000300010409
-0002000808e50003000104090003005808ed000300010409000400140945
-000300010409000500180959000300010409000600180971000300010409
-000700ba0989000300010409000800300a430003000104090009008a0a73
-000300010409000d02aa0afd00030001040a0002000e0da700030001040a
-0004001a0db500030001040b000200120dcf00030001040b0004001e0de1
-00030001040c000200080dff00030001040c000400140e0700030001040e
-000200100e1b00030001040e0004001c0e2b000300010410000200120e47
-0003000104100004001e0e59000300010413000200060e77000300010413
-000400120e7d0003000104140002000e0e8f0003000104140004001a0e9d
-000300010415000200140eb7000300010415000400200ecb000300010416
-0002000e0eeb0003000104160004001a0ef9000300010419000200140f13
-000300010419000400200f2700030001041b0002000a0f4700030001041b
-000400160f5100030001041d000200060f6700030001041d000400120f6d
-00030001041f0002000a0f7f00030001041f000400160f89000300010424
-0002000c0f9f000300010424000400180fab00030001042a000200080fc3
-00030001042a000400140fcb00030001042d0002000a0fdf00030001042d
-000400160fe900030001080a0002000e0fff00030001080a0004001a100d
-0003000108160002000e10270003000108160004001a1035000300010c0a
-0002000e104f000300010c0a0004001a105d000300010c0c000200081077
-000300010c0c00040014107f00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0042006f006c0064004d006f006e006f007400790070
-0065003a0041007200690061006c00200042006f006c0064003a00560065
-007200730069006f006e00200035002e0030003100200028004d00690063
-0072006f0073006f0066007400290041007200690061006c00200042006f
-006c006400560065007200730069006f006e00200035002e003000310041
-007200690061006c002d0042006f006c0064004d00540041007200690061
-006c00200069007300200061002000740072006100640065006d00610072
-006b0020006f006600200054006800650020004d006f006e006f00740079
-0070006500200043006f00720070006f0072006100740069006f006e0020
-0069006e002000740068006500200055006e006900740065006400200053
-0074006100740065007300200061006e0064002f006f00720020006f0074
-00680065007200200063006f0075006e00740072006900650073002e0054
-006800650020004d006f006e006f007400790070006500200043006f0072
-0070006f0072006100740069006f006e004d006f006e006f007400790070
-006500200054007900700065002000440072006100770069006e00670020
-004f006600660069006300650020002d00200052006f00620069006e0020
-004e006900630068006f006c00610073002c002000500061007400720069
-0063006900610020005300610075006e0064006500720073002000310039
-003800320059006f00750020006d00610079002000750073006500200074
-00680069007300200066006f006e007400200074006f0020006400690073
-0070006c0061007900200061006e00640020007000720069006e00740020
-0063006f006e00740065006e00740020006100730020007000650072006d
-0069007400740065006400200062007900200074006800650020006c0069
-00630065006e007300650020007400650072006d007300200066006f0072
-0020007400680065002000700072006f006400750063007400200069006e
-0020007700680069006300680020007400680069007300200066006f006e
-007400200069007300200069006e0063006c0075006400650064002e0020
-0059006f00750020006d006100790020006f006e006c0079002000280069
-002900200065006d0062006500640020007400680069007300200066006f
-006e007400200069006e00200063006f006e00740065006e007400200061
-00730020007000650072006d006900740074006500640020006200790020
-00740068006500200065006d00620065006400640069006e006700200072
-00650073007400720069006300740069006f006e007300200069006e0063
-006c007500640065006400200069006e0020007400680069007300200066
-006f006e0074003b00200061006e00640020002800690069002900200074
-0065006d0070006f0072006100720069006c007900200064006f0077006e
-006c006f006100640020007400680069007300200066006f006e00740020
-0074006f002000610020007000720069006e0074006500720020006f0072
-0020006f00740068006500720020006f0075007400700075007400200064
-0065007600690063006500200074006f002000680065006c007000200070
-00720069006e007400200063006f006e00740065006e0074002ea9203230
-303620546865204d6f6e6f7479706520436f72706f726174696f6e2e2041
-6c6c205269676874732052657365727665642e417269616c426f6c644d6f
-6e6f747970653a417269616c20426f6c643a56657273696f6e20352e3031
-20284d6963726f736f667429417269616c20426f6c6456657273696f6e20
-352e3031417269616c2d426f6c644d54417269616c206973206120747261
-64656d61726b206f6620546865204d6f6e6f7479706520436f72706f7261
-74696f6e20696e2074686520556e697465642053746174657320616e642f
-6f72206f7468657220636f756e74726965732e546865204d6f6e6f747970
-6520436f72706f726174696f6e4d6f6e6f74797065205479706520447261
-77696e67204f6666696365202d20526f62696e204e6963686f6c61732c20
-5061747269636961205361756e646572732031393832596f75206d617920
-757365207468697320666f6e7420746f20646973706c617920616e642070
-72696e7420636f6e74656e74206173207065726d69747465642062792074
-6865206c6963656e7365207465726d7320666f72207468652070726f6475
-637420696e207768696368207468697320666f6e7420697320696e636c75
-6465642e20596f75206d6179206f6e6c792028692920656d626564207468
-697320666f6e7420696e20636f6e74656e74206173207065726d69747465
-642062792074686520656d62656464696e67207265737472696374696f6e
-7320696e636c7564656420696e207468697320666f6e743b20616e642028
-6969292074656d706f726172696c7920646f776e6c6f6164207468697320
-666f6e7420746f2061207072696e746572206f72206f74686572206f7574
-7075742064657669636520746f2068656c70207072696e7420636f6e7465
-6e742e004e0065006700720065007400610041007200690061006c002000
-4e00650067007200650074006100740075010d006e00e900410072006900
-61006c002000740075010d006e00e9006600650064004100720069006100
-6c002000660065006400460065007400740041007200690061006c002000
-46006500740074038803bd03c403bf03bd03b10041007200690061006c00
-20038803bd03c403bf03bd03b100a9002000320030003000360020005400
-6800650020004d006f006e006f007400790070006500200043006f007200
-70006f0072006100740069006f006e002e00200041006c006c0020005200
-690067006800740073002000520065007300650072007600650064002e00
-41007200690061006c0042006f006c0064004d006f006e006f0074007900
-700065003a0041007200690061006c00200042006f006c0064003a005600
-65007200730069006f006e00200035002e0030003100200028004d006900
-630072006f0073006f0066007400290041007200690061006c0020004200
-6f006c006400560065007200730069006f006e00200035002e0030003100
-41007200690061006c002d0042006f006c0064004d005400410072006900
-61006c00200069007300200061002000740072006100640065006d006100
-72006b0020006f006600200054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-200069006e002000740068006500200055006e0069007400650064002000
-530074006100740065007300200061006e0064002f006f00720020006f00
-7400680065007200200063006f0075006e00740072006900650073002e00
-54006800650020004d006f006e006f007400790070006500200043006f00
-720070006f0072006100740069006f006e004d006f006e006f0074007900
-70006500200054007900700065002000440072006100770069006e006700
-20004f006600660069006300650020002d00200052006f00620069006e00
-20004e006900630068006f006c00610073002c0020005000610074007200
-690063006900610020005300610075006e00640065007200730020003100
-39003800320059006f00750020006d006100790020007500730065002000
-7400680069007300200066006f006e007400200074006f00200064006900
-730070006c0061007900200061006e00640020007000720069006e007400
-200063006f006e00740065006e0074002000610073002000700065007200
-6d0069007400740065006400200062007900200074006800650020006c00
-6900630065006e007300650020007400650072006d007300200066006f00
-720020007400680065002000700072006f00640075006300740020006900
-6e0020007700680069006300680020007400680069007300200066006f00
-6e007400200069007300200069006e0063006c0075006400650064002e00
-200059006f00750020006d006100790020006f006e006c00790020002800
-69002900200065006d006200650064002000740068006900730020006600
-6f006e007400200069006e00200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-2000740068006500200065006d00620065006400640069006e0067002000
-7200650073007400720069006300740069006f006e007300200069006e00
-63006c007500640065006400200069006e00200074006800690073002000
-66006f006e0074003b00200061006e006400200028006900690029002000
-740065006d0070006f0072006100720069006c007900200064006f007700
-6e006c006f006100640020007400680069007300200066006f006e007400
-200074006f002000610020007000720069006e0074006500720020006f00
-720020006f00740068006500720020006f00750074007000750074002000
-640065007600690063006500200074006f002000680065006c0070002000
-7000720069006e007400200063006f006e00740065006e0074002e004e00
-65006700720069007400610041007200690061006c0020004e0065006700
-72006900740061004c0069006800610076006f0069007400750041007200
-690061006c0020004c0069006800610076006f0069007400750047007200
-6100730041007200690061006c00200047007200610073004600e9006c00
-6b00f6007600e900720041007200690061006c0020004600e9006c006b00
-f6007600e9007200470072006100730073006500740074006f0041007200
-690061006c002000470072006100730073006500740074006f0056006500
-740041007200690061006c002000560065007400480061006c0076006600
-6500740041007200690061006c002000480061006c007600660065007400
-50006f00670072007500620069006f006e00790041007200690061006c00
-200050006f00670072007500620069006f006e0079004e00650067007200
-690074006f0041007200690061006c0020004e0065006700720069007400
-6f041f043e043b0443043604380440043d044b0439004100720069006100
-6c0020041f043e043b0443043604380440043d044b043900540075010d00
-6e00e90041007200690061006c002000540075010d006e00e90046006500
-740041007200690061006c0020004600650074004b0061006c0131006e00
-41007200690061006c0020004b0061006c0131006e004b00720065007000
-6b006f0041007200690061006c0020004b007200650070006b006f011100
-e20323006d0041007200690061006c0020011100e20323006d004c006f00
-64006900610041007200690061006c0020004c006f006400690061004e00
-65006700720069007400610041007200690061006c0020004e0065006700
-72006900740061004e00650067007200690074006f004100720069006100
-6c0020004e00650067007200690074006f004e0065006700720069007400
-610041007200690061006c0020004e006500670072006900740061004700
-72006100730041007200690061006c00200047007200610073000000b154
-80410d03ac00af03ac0002001003ac002003ac00a003ac0003004003acb3
-070d3240b803acb312143240b803acb2162b32b9ffc003acb23a3340b803
-acb32d943280bc03ab005f0033ffc003abb2553340b803abb340443240b8
-03abb3333b3240b803abb32f313240b803abb2083340b803abb30714321f
-411a03ab002f03ab0002000f03ab002f03ab004f03ab008f03ab009f03ab
-00bf03ab0006001003ab00df03ab00ff03ab000303a803a2b2461f40b803
-a5b208330f411403a50001004003a500cf03a500ff03a50003002003a500
-af03a500ef03a500ff03a50004ffc003a3b3090c3240b803a3b208330f41
-1b03a30001000f03a3001003a3008003a300af03a300cf03a30005006f03
-a3009f03a300ff03a30003009f03a200af03a2000203a203a1b2101f1041
-0a039e007f039e0002039a000f0101001fffc00398b310143240b80399b3
-0f1332404110039500500395000200b0034d00c0034d0002006f0391007f
-03910002ffc0034bb22d3132b9ffc0034bb30a0e32104110038b0020038b
-0080038b000300a0038b00010020038b0040038b0002ffc0038bb3131632
-40b80383b20f1132b9ffc0037bb2303432b9ffc0037bb310183250411403
-7800010365036e0023001f037e036e001e001f0363036e001d001f036203
-64000d001fffc00340b30f1032804110033f0001033f03150029001f0341
-03160032001f0344031a001b001fffc00375b20e1132b9ffc00375b2282a
-32410a034303180032001f030f030d0034001f03080307b2321f20bb0340
-000100400388b3090b3240b80388b2101532bd038503070014001f038003
-07b2171f0fbd030a002f030a0002ffc00354b3090d3290410c035400a003
-540002001f036e0001009f036e00010040036eb2090b3241110345031c00
-16001f036b031d0015001f0346031e0015001f03a703a10046001f039db3
-261c1fc0bb0393000100400392b3090d3240b8033eb2083340b8033eb30d
-0e32c04109033e000100b0038e00c0038e0002ffc00390b3263832004126
-03280030032800020020037f0030037f00020010038a0030038a0050038a
-006f038a007f038a009f038a000600000389003003890002002f037a0070
-037700900377009f037a0004ffc00315b20f1032b9ffc00315b2242832b9
-03190318b2321f10bb031a0001ffc0031ab3090e3240b80318b2121332b9
-ffc00318b30c0e323fbd0373004f0373000200400374b31718326fbb032a
-00010040032cb3181b3240b80370b2090c32bd031703160032001fffc003
-16b20e1132bd031c031e0016001f031d031eb2151fb0411f031e0001000f
-031f000102ca02d00015001f02d302d5000d001f02cf02d0000d001f02cb
-02d0000d001f02cd02d0000d001f02ce02d0000d001fffc002d0b3090c32
-40b802d2b3090c32e0411c02e50001005f02dd009f02e5000202bb02c300
-30001f02da02b80032001f02d902b9003f001f02d802b80064001f02b902
-b80033001f02bab221c81fb802b8b321c81f40b8039bb20d1632b9ffc002
-c3b22b2f32b9ffc002c3b21f2532b9ffc002c3b2171b32b9ffc002c3b212
-1632412502c202c1001c001f02d702c10024001f02c102c00022001f02bf
-02c00018001f02c0027400c8001f02b50235003b001f02b40235003b001f
-02c402bc001e001f02b702b60038001f02b3b20ec81fb802b0b207c81fb8
-02afb206c81fb802aeb200c81fb802afb2502f1fbc02ae02ab001a001f02
-adb2261a1fb802a8b326241f0fbb0235000102a50274b21d1f12410a02a1
-015801f4001f02a000d801f4001f001202a2b237c81fb80290b2bc201fb9
-029002904018374025402d40a6033025302d30a6032025202d203720a620
-4110028e0005009f028b0001028b028b0037002002890030028900400289
-00900289b20437b041fd027400c0027400020080027400a0027400020060
-0274007002740002000002740010027400020080027400f002740002003f
-0285004f028500020090027e0090027f009002800090028100040090027a
-0090027b0090027c0090027d000400900274009002750090027700030070
-027e0070027f007002800070028100040070027a0070027b0070027c0070
-027d000400700274007002750070027700030060027e0060027f00600280
-0060028100040060027a0060027b0060027c0060027d0004006002740060
-02750060027700030050027e0050027f005002800050028100040050027a
-0050027b0050027c0050027d000400500274005002750050027700030040
-027e0040027f004002800040028100040040027a0040027b0040027c0040
-027d000400400274004002750040027700030030027e0030027f00300280
-0030028100040030027a0030027b0030027c0030027d0004003002740030
-02750030027700030020027e0020027f002002800020028100040020027a
-0020027b0020027c0020027d000400200274002002750020027700030010
-027e0010027f001002800010028100040010027a0010027b0010027c0010
-027d0004001002740010027500100277000300e0027e00e0027f00e00280
-00e00281000400e0027a00e0027b00e0027c00e0027d000400e0027400e0
-027500e00277b103d041c5027e00d0027f00d0028000d00281000400d002
-7a00d0027b00d0027c00d0027d000400d0027400d0027500d00277000300
-30027400400274000200c0027e00c0027f00c0028000c00281000400c002
-7a00c0027b00c0027c00c0027d000400c0027400c0027500c00277000300
-b0027e00b0027f00b0028000b00281000400b0027a00b0027b00b0027c00
-b0027d000400b0027400b0027500b00277000300a0027e00a0027f00a002
-8000a00281000400a0027a00a0027b00a0027c00a0027d000400a0027400
-a0027500a0027700030090027e0090027f00900280009002810004009002
-7a0090027b0090027c0090027d0004009002740090027500900277000300
-20027e0020027f002002800020028100040020027a0020027b0020027c00
-20027d00040020027400200275002002770003028101580801001f028001
-290801001f027f00ec0801001f027e00d80801001f027d00b10801001f02
-7c00a60801001f027b00820801001f027a00370801001f02770026080100
-1f027500200801001f0274001f0801b21f370f41160235004f0235005f02
-35006f0235009f023500af023500bf0235000700af023500cf023500df02
-3500ff02354022040f074f079f07af07bf0705af07e007020f064f069f06
-af06bf0605af06e0060220411b020d0001005f02350001008f0235000100
-7f023500ef02350002002f0235003f02350002003f0234004f0234000202
-350235023402344011ed20ef2a01cf2a01bf2a01af2a018f2a0141090247
-0104001e001f022000370201001f0158400c263e1fd8263e1f3726273e1f
-b8028eb6ec171fb226361fb801bcb226361fb80129402b26361fec26361f
-b126361fa626361f8226361f3726361f3226361f2d26361f2526361f1f26
-361f37262a1fb801584022263e1fd8263e1fbc263e1f27263e1f21263e1f
-20263e1f3700161600000012110840b9020d01a6b3c50d0009b801bcb227
-281fb801bbb227301fb801b8b2274f1fb801b7b227621f410901b6002701
-01001f01b5002002ab001f01afb21fe41fb801adb21fe41fb801acb21fbb
-1fb801a8b21f341fb8015db2272e1fb8015bb227cd1f410d0155001f0401
-001f0154001f0401001f0153001f0201001f0152b21f561fb80151b21f29
-1fb8012bb227261f410d012a00270125001f0129015800e4001f0125001f
-0401001f0124b21fe41fb80123b21f3b1fb80122b21f391f410d01080027
-0801001f0106002d0101001f0105001f0101001f0103b31fbb1fefb90158
-0401400b1fed1f931fec1fe41feb1fb80201b21fd920b80401b21fcf25b8
-0156400a1fbc2d9e1fbb1f411fb2410a01580401001f00b101580401001f
-00b001580401b51fa625891f9bb901580125b61f991f2e1f8e2db80801b5
-1f8d1f291f89b901580401b21f8220b802ab40131f801f301f742de41f73
-1f4a1f611f521f5d25b802abb21f5c1fbc0801001f0059015802abb61f50
-25891f491fb80125b21f4725b80401400b1f461f791f401f271f3920bc02
-ab001f003801580401b21f372dbc0125001f003201580125b61f2c1f341f
-2a25b80801b21f5537b80111402a07f00790075b0742073b07230722071e
-071d071408120810080e080c080a080808060804080208000814b8ffe040
-2b0000010014061000000100060400000100041000000100100200000100
-0200000001000002010802004a00b013034b024b5342014bb0c063004b62
-20b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807ff52
-b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ffb101
-018e851bb0124358b10100858d1bb900010119858d5959001816763f183f
-123e113946443e113946443e113946443e113946443e11394660443e1139
-4660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b182b1db096
-4b5358b0aa1d59b0324b5358b0ff1d594bb08153205c58b9020f020d4544
-b9020e020d45445958b90470020f455258b9020f04704459594bb0e45320
-5c58b90020020e4544b90027020e45445958b908420020455258b9002008
-424459594bb8012553205c58b90026020f4544b90021020f45445958b90a
-0d0026455258b900260a0d4459594bb8040153205c58b1d8204544b12020
-45445958b9250000d8455258b900d825004459594bb8040153205c58b901
-5800264544b1262645445958b923200158455258b9015823204459594bb0
-2953205c58b11f1f4544b12d1f45445958b9010d001f455258b9001f010d
-4459594bb02f53205c58b11f1f4544b1251f45445958b90135001f455258
-b9001f01354459594bb8030153205c58b11f1f4544b11f1f45445958b914
-28001f455258b9001f14284459592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65422b01b331757ec3456523
-456023456560234560b08b766818b080622020b17e754565234520b00326
-6062636820b003266165b075236544b07e234420b131c34565234520b003
-266062636820b003266165b0c3236544b0312344b100c3455458b1c34065
-44b23140314523614459b33f3c5841456523456023456560234560b08976
-6818b080622020b1583c4565234520b003266062636820b003266165b03c
-236544b058234420b13f414565234520b003266062636820b003266165b0
-41236544b03f2344b10041455458b141406544b23f403f45236144594569
-5342014b5058b108004259435c58b108004259b3020b0a124358601b2159
-421610703eb0124358b93b21187e1bba040001a8000b2b59b00c2342b00d
-2342b0124358b92d412d411bba04000400000b2b59b00e2342b00f2342b0
-124358b9187e3b211bba01a80400000b2b59b0102342b0112342002b2b2b
-2b2b2b2b2b00b01243584bb035514bb021535a58b1262645b04061445959
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b737373737345b040614418
-004569444569447373737473737374737473742b2b2b2b2b2b2b2b2b2b2b
-2b0073737373737373737373737373737373737373737373747474747474
-7474747474747474747474747474747575757374757575752b7300004bb0
-2a534bb036515a58b1070745b040604459004bb02e534bb036515a58b103
-0345b0406044b1090945b8ffc06044592b4569440174007373732b456944
-2b012b435c58400a0006000702a006a00702b9ffc00274b31a1d326fbd02
-77007f02770002ffc00277b22f3132b9ffc00277b322253240b80274b32f
-353240b80274b3282a3240b80274b21a2132b8ffc0b3371a1d32b8ffc0b3
-251a1d32b8ffc040112d1a1d329025902d9037a025a02da03706b8ffc0b6
-a61a1d321fa61fb8028eb22fa60300742b732b2b2b2b2b2b2b2b742b7374
-59002b2b435c58b9ffc002a1b21c1d32b9ffc002a0b21c1d322b2b592b73
-012b2b2b2b002b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b012b2b2b2b2b
-2b2b73742b2b2b2b2b2b2b2b73732b2b2b2b2b2b732b732b2b2b742b2b2b
-73737373732b73732b2b2b732b2b002b2b2b2b7374732b732b2b2b2b752b
-2b2b2b2b2b2b2b752b2b2b2b2b732b2b2b2b7374752b2b7373732b2b2b73
-2b737374752b2b7374752b2b7374752b2b2b2b2b2b2b2b2b2b2b2b74752b
-000000>
-[16305 16261 16301 15993 16353 16361 16377 15773 16093 16113 15821 16109 16365
-15025 16197 16361 15857 16053 15881 16233 16301 15449 16065 16377 15477 15965
-16117 15425 15557 16353 16369 11749 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-
-2 0 3 <> Arial-BoldMT AddT42Char 
-2 13960 56 <00010093ffe7052405ba0019008a40380708070907101708160947084709
-07570956109610971198159b16a710b716d715e506f6060b0d0c0c010002
-072513090c0b200dcf0e010eb8028b4022401b501b601b03701b801b0220
-1b301ba01bc01b041b0102200020193019c0190319b8028bb31a3175182b
-4e10f45d3c4dfd3c4d105d7172f65d3c4dfd3c003fed3f3c3c103c313001
-5d71132111141716163332363635112111100e0223222626272635930128
-0b138f7c7e801a01283081d8aed2d97e141d05bafce6bd385a6d6796ae03
-2bfcfefef8da9659619b557ef600>Arial-BoldMT AddT42Char 
-3 1212 70 <00010055ffe8043f043e001900e14051580f59125916680f691269167d18
-79199702970cc610c618d710d618e906e908e913e915f80613381338154a
-124a164618590c690c073a1237163718037705770f8705860f8919a812a7
-16b912b616090eb8ffc0b3181b340eb8ffc0b51214340e330db8ffc0b319
-1e340db8ffc0b30f11340dba0104000a02744012110b0040181b34004012
-1434003390010101ba0101000402744020170701401214340121002f0d40
-1214340d214f0e010e1a1b072114191a5841182b4e10f44ded4e10f65d4d
-ed2bf4ed2b003ffdf45de42b2b3ffdf42b2be42b2b3130005d7101715d01
-052626232206151416333236370506062322001110003332160431feeb0e
-634f697d7f6b50661501142bf4cde9feeb0116edc2e502ec32535491aabd
-9c5b6f2fbec20126010401070125a700>Arial-BoldMT AddT42Char 
-3 1528 71 <00020054ffe8046105ba000f001c0090402d125906590a59125616561859
-1c98079909f80909701e801e023a03340c3a1534194a03440c4a15441999
-090914b80274b2050b1ab80274400e0b070e0f0001000a17290e0d2601b8
-0129400f0f001a8f1e011e102108191d583c182b4e10f44ded4e1071f63c
-4dedfd3ce6003f3c3f3c3fed3fed3130005d01715d4358400d6906690a69
-1266166618691c065d592121350606232200111012333217112101141716
-3332363534262322060461fefb41b15ab7fefbfec2b2820119fd122f447a
-6188846764879c5b5901270108010e0119940210fc70aa4c6ea5a4b7a19f
->Arial-BoldMT AddT42Char 
-3 1768 72 <00020041ffe80427043e0014001c01a3b90010fff840460b3999099a0d96
-10a805a70abb09bb0db81a0808140148024706460a4f1ea80db606b61ac7
-0ac80cd60ad80cf807f70d0d1c0f1c15401b1d3415400e11340f15bf15cf
-150315b8ffc0b30f1e3f15b8ffc0b30e173f15b8028d400c0f0e12500e60
-0e020e181201b8ffc0b6191b3401331200b8ffc0b31d203400b8ffc0b322
-293400b8ffc0b32b2d3400b8ffc0b3181c3400b8ffc0400f0e0f34a00001
-0000100002005f1212b80274b3040b1218b8027440240b070021012f1521
-4f0e010e1a2f1e5f1e6f1e9f1e041e0f2108400d0f3408191d6941182b4e
-10f42b4ded4e105df65d4dedf4ed003fed435c584014184028143f18401e
-0f3f18401b103f18401c113f2b2b2b2b593ffd435c58b90012ffc0b32814
-3f12b8ffc0b31e0f3f12b8ffc0b31b103f12b8ffc0b21c113f2b2b2b2b59
-f45d712b2b2b2b2b435c58b90000ffc0b2123900b8ffc0b2173900b8ffb0
-b3090a3e00b8ffc0b241213f2b002b2b2b59e42b1112395d435c5840140e
-400f1e3f0e401c113f0e401b103f0e400e173f002b2b2b2b592f3cfd2b2b
-722b2b3c0111333130015d71005d2b010506062320272635100033320003
-211616333236132626232207061702fa011836e9affeeb85690114d3ed01
-1206fd40038261425a270378565c3c3c0101522f9aa1b591dd0108012bfe
-c7febd7d8b48016c7a7f43437300>Arial-BoldMT AddT42Char 
-3 2292 73 <00010018000002e605d3001600b840323604012a04201020115904801805
-0804bf180215161102141216110e130f00100e13010010021409080f0b01
-5f0bff0b020bb80274400a0601110f1601ff160116b80274401e10000001
-f00001000613140a09333f084f085008030828102f115f110211b8010440
-0d0e132602145f00a016c0160216b8ffc0b6090c3416191778b902690018
-2b4e10f42b713c4dfc3cfd3cfc5d3cf45d19e400183f3c3f5d713cfd5d71
-3c3ffd5d7139320f0f0f0f313001715d005d133335343636333217072623
-2206151533152311211123189c399975787326433e3d35d2d2fee79c0426
-5086845324c41039514bddfcb7034900>Arial-BoldMT AddT42Char 
-3 3280 76 <00020093000001ac05ba000300070077b90009ffc0403f110a3f40095009
-028009b009c009d009ef09051f0960097f09a009b0090503060700050403
-0f00014000d000e00003005d02010006050607040a0207260104b8ffc040
-092124340419083f3c182b4e10f42b3c4dfd3c003f3c3f3c3f3cfd5d713c
-0305103c3c103c3c313001715d722b1311211101112111930119fee70119
-04b60104fefcfb4a0426fbda>Arial-BoldMT AddT42Char 
-3 3958 79 <00010093000001ac05ba00030053b90005ffc04029110a3f400550050280
-05b005c005d005ef05051f0560057f05a005b0050502010003000a020326
-0100b8ffc040092124340019043f3c182b4e10f42b3c4dfd3c003f3c3f3c
-313001715d722b3311211193011905bafa46>Arial-BoldMT AddT42Char 
-3 4736 82 <00020052ffe8049a043e000d001900974048e801e708f713f71504c702e8
-05021219051909025910561356165918970298069808970cb809d502db05
-dc09d50ce705e706e80d10a708cb02cc06c308c60c057508890684080311
-b80274b20a0b17b80274401404071439071a601b701b021b0e2100191a58
-41182b4e10f44ded4e1071f64ded003fed3fed313000715d015d71435840
-09691066126616691804015d59005d015d13341236333200151400232224
-26251416333236353426232206528afd9cf10134fec9ec92fef78a012096
-6e6e95956e6e9602228c01068afec7eff1fec384ffa89ea8a8a09ca8a800
->Arial-BoldMT AddT42Char 
-3 4976 83 <0002008bfe6c0497043e0010001c009a402e3813481302123403390d3913
-341b4403490d4913441bf91b095606560a591256165618591cf607f91b08
-0100061ab80274b2050714b8027440160b0b100f0e1721081a701e011e11
-290e0e0f26101001b80129400b700080000200191d3f41182b4e10f4714d
-ed3c10fd3c10e44e1071f64ded003f3c3fed3fed3f3c3130015d005d0143
-58400d6606660a691266166618691c065d59005d13211536363332001110
-002322262711210114163332363534262322068b010633ae6ab90102fefc
-b9588f4ffee701168e6662828663678804269c5064fedefefdfef6fed946
-55fde903b9b3ab9db3a7a29f>Arial-BoldMT AddT42Char 
-3 5486 85 <0001008700000337043e001000a84028970501090e01530566057505032f
-12580e680e7012040a090f0c1f0c028f0cff0c023f0c4f0c020cb8027740
-29070701000a0302060a28000910093009700904091a7f129f12025f127f
-12af12d01204121000260103b80129400b02028001a001020119113fb901
-1c00182b4e10f4713c4d10ed10fd3c4e105d71f65d194de400183f3c3f3c
-3fed5d717239323130015d005d71004bb017534bb035515a58b10a323859
-005d212111211536363332170726232206061101a0fee70105436b446059
-57473d3b522f0426976b4435f52e41aafef1>Arial-BoldMT AddT42Char 
-3 5714 86 <00010030ffe80410043e002a02c240c00611062308271711172398129814
-9727952a09071446140212bb0db90ec721e523f80df62206290d550d650d
-950b9712a722b90c07412340244426672264268712871486228324093726
-4506460b4a0d4f0f462142220722242726370c352135223523352407060a
-05110921180d270c22222223072422402c730c781479157629752a881584
-2a9a15952ab422b4230d80018f178c18992aa92ab02c0617211640212334
-16401c1f341f1601df16011633082150258f25022540181d34251a2cb8ff
-c04017110a3f502c01302c012f2c012c1e213010011033012100b8ffc0b3
-0f093f00b8ffc0b3110a3f00b8ffc04009090d3400192b78b8182b4e10fc
-2b2b2b4dedf471ed4e105d71722bf62b714dedf471722b2bed00b1060243
-54584035060101060116012622362146215401591764016917f6010a0117
-02041a21220228130d0c02281a5f04010446280b501a011a4613073ffd5d
-3ffd5d1112173911121739111217395d711bb90022ffcbb3282a3421b8ff
-cbb3282a3422b8ffe0b31e243421b8ffe0b31f243422b8ffe0b3191a3421
-b8ffe0401b191a346b0d0136224622980d9422c422d4220621220c0d0404
-1a00b8ffc0b5191b34003301b8ffc0b3172d3f01b8ffb0b3090a3e01b8ff
-c0b322253401b8ffc0401d1a1c3400013001400150010460018001f00103
-00011001500160010401b8ffc0b313163401b80101404d0004015f04f004
-020446280b1640191b3416331740172d3f1740090a3e174035373417402b
-2e34174025293417401a1c340f171f175f176f170417551a402224340f1a
-01501aff1a021a4613073ffd5d712bf45d2b2b2b2b2b2be42b3ffd5d71f4
-2b5d71722b2b2b2be42b111217395d712b2b2b2b2b2b59313001715d0071
-7171715d5d435c58b90024ffc940090b123f0f280b123f21b8ffecb60d39
-0c140c3921b8ffecb20c3922b8ffeab10b39002b2b2b2b012b2b5900715d
-132516163332373635342726272427263534363332161705262623220706
-1514171604171615140623222630011a126e636d3725141549feac5b7eda
-e5dad428fef7115f586f30201c2601c15958f4efd9fd012f2b5255281c2f
-201514114b3e56998abc8e8b313e421f16231e151c664a4b8692d2b0>Arial-BoldMT AddT42Char 
-3 6552 87 <0001001fffe80291059d001900cd402920002001230a290f3a0e4a0e590f
-07191500180316150017121314011712021401180309070a070c18b80101
-400f0017a017b017036017a017c0170317b80104b2150114b80274b30015
-0607b80274400e0c0b092f0a2f00002f015f010201b80104402818032617
-1255153f149f14af1403601480149014d014f01405001410142014301404
-14191a78a0182b4e10f45d71724bb037534bb03b515a58b90014ffc03859
-3c4dfc3cfd3cf45d3c10f419e400183fed3f3cfd3c10f45d71e411123911
-330f0f0f0f3130015d011523111416163332371706232226262726351123
-3533352511027ac00b271c274a18627c4c7a390b098181011a0426e0fe54
-822b1c1bda2a335145319501cfe0d3a4fe89>Arial-BoldMT AddT42Char 
-3 8496 92 <0001000efe510452042600130134b41228050113b8ffe040180c0f340816
-0d0f3407160d0f3406160d0f3405160c0f3402b8ffc0401f1a3a34050606
-040d0b0e061002001306041302040303010100061360100110b801af4012
-0b0f0d2f0e280020153015601503f0150115b8ffc0b322263415b8ffc040
-121c1e341517171a043903401819347f030103b80127400902401819347f
-020102b801274012013900401c36342000300002001914c4a0182b4e10f4
-5d2b4dfd19f45d2bf45d2b18fd4e456544e62b2b71724d10f4e4003fed5d
-2f3f3c103c103c0112391139001112391239391139070e103c3130002b01
-2b2b2b2b2b5d4bb010534bb03a515a58b2041000bafff00001fff0b10310
-013838383859435c58b90005ffe8400e0d113f131013193f131012183f05
-b8fff0b313193f05b8fff0b212183f012b2b2b2b2b59132113132101070e
-032322272716333236370e012bfef80123fe89432543577f50514e194235
-625e190426fd0e02f2fc02b95d623d2211dc0d735900>Arial-BoldMT AddT42Char 
-2 0 0 <00020100000005000500000300070042b40201fe0607b8023f4013000504
-fe03000a0704fe010019080605fe0203bc0126000901b0011800182b10f6
-3cfd3c4e10f43c4dfd3c003f3cfd3c10fc3cfd3c31302111211125211121
-01000400fc2003c0fc400500fb002004c000>Arial-BoldMT AddT42Char 
-Arial-BoldMT /CharStrings get begin
-/space 3 def
-/U 56 def
-/c 70 def
-/d 71 def
-/e 72 def
-/f 73 def
-/i 76 def
-/l 79 def
-/o 82 def
-/p 83 def
-/r 85 def
-/s 86 def
-/t 87 def
-/y 92 def
-end
-Arial-BoldMT /Encoding get
-dup 32 /space put
-dup 85 /U put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 105 /i put
-dup 108 /l put
-dup 111 /o put
-dup 112 /p put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 121 /y put
-pop
-end
-%ADOEndSubsetFont
-/KUDFOB+Arial-BoldMT /Arial-BoldMT findfont ct_VMDictPut
-/KUDFOB+Arial-BoldMT*1 
-[32{/.notdef}rp /space 52{/.notdef}rp /U 13{/.notdef}rp /c /d /e 
-/f 2{/.notdef}rp /i 2{/.notdef}rp /l 2{/.notdef}rp /o /p 
-/.notdef /r /s /t 4{/.notdef}rp /y 134{/.notdef}rp]
-KUDFOB+Arial-BoldMT nf
-KUDFOB+Arial-BoldMT*1 [9 0 0 -9 0 0 ]msf
-84 537.885 mo
-(User profile directory)
-[6.48 5.03999 5.04 3.48306 2.27701 5.51693 3.48307 5.51692 2.99693 2.52 2.52 5.03999 
-2.403 5.51692 2.52 3.48306 5.04001 5.03999 2.99693 5.51694 3.48306 0 ]xsh
-/KUDFOB+Arial-BoldMT*1 uf
-/KUDFOB+Arial-BoldMT uf
-/Arial-BoldMT uf
-grestore
-%ADOBeginSubsetFont: ArialMT Initial
-ct_T42Dict begin
--0.664 -0.324 2 1.004
- 256 array 0 1 255 {1 index exch /.notdef put} for  /ArialMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f3210325d73000000cc000000606376
-7420a11cd7eb0000012c000006546670676dcc79599a000007800000066e
-676c796607022dca000094e0000822cc68656164d6144b3e00000df00000
-003668686561123315fe00000e2800000024686d7478f65efffb00000e4c
-000034d46c6f6361361cd72000004320000034d86d617870124c05df0000
-77f8000000206e616d659617a74000007818000011057072657025d64dbf
-0000892000000bbe67646972000000000000000000000000000303880190
-00050008059a05330000011b059a0533000003d1006602120805020b0604
-020202020204e0002affc00078430000000900000000544d432000400020
-fffc05d3fe510133073e01b2400001ffffff0000042605bb000000200004
-05ba001905ba001a05a70019042600180000ffe70000ffe80000ffe7fe69
-ffe805ba0019fe69ffe802ea000000b8000000b80000000000a800ad0169
-00ad00bf00c201f0001800af00b900b400c800170044009c007c00940087
-0006005a00c80089005200520005004400940119ffb4002f00a1000300a1
-00cd00170057007e00ba00160118ffe9007f008503d300870085000d0022
-00410050006f008d014cff75005c00df04830037004c006e00700180ff58
-ff8eff92ffa400a500b903c8fffd000b001a0063006300cdffee05d8ffdc
-002d005c0095009900df019209b500400057008000b9039d0072009a035d
-0401ff67fffa00030021007700cd0004004d00cd01c0022b004c006500e7
-0118017c034305d8ffa3ffb0ffc40003001c005d0068009a00ba01350147
-0221055cff4dffcd0016002d00780080009900b200b600b600b800bd00da
-010c05f0ffa4fff00019002c0049007f00b400ce01c003fefd81fe3f0000
-00050018002900390049006f00be00c700d0012301c1026f050c05320540
-057affd4001400310055005700a700b400e601f7027e027e027f03c60446
-ff42000e0085009100bf00c200c500e1011a012f014f01560229026f029e
-03720008002c00310031006400690089009800c700de012b01b6020c02cf
-03a304ab04fb061dfee0ff0e00060026009b009d00c1010d011801200173
-018201d601e30243025f029b02e2039404a904d20761001c005e006d008d
-00ab00f7011201380151015b0168017c01870191019901cd01d001e80241
-0254026b02ef0368037103bd044204420453047304830586058b06e8fe58
-fec4fed1fef7ff32ff860051007c008100910095009e00b400b900cf00d9
-00d900df00e20105010b010e010e012001210155017b017b017e018d01a2
-01a801a901b401d001d001e201e901f201f501fb020002000206021b0221
-022202220223027202770294029c02cf02cf02d002ec02f903170322032b
-0335033c0359036f037103870390039003b503e1041a04cf04ff05320532
-0596059f05a805ab05c205f0060c0782080008ccfca3fd2afddefe00fe88
-fe96feb2feb4ffe100150019001a001c001f003c005100610061006a0078
-009600a500af00d3010c0118011a012a013e014c0151015f016a01710178
-01820184019a01a501a801a901ae01bc01cd01d701ef0200020d021c0221
-0222022e02350242024f024f025e026502710290029202b402d602fa0307
-030b030f0315032a0347035d036503740379039603b003cc03dd03e203f6
-03fc03fc03ff040a041f04220426042b0447045f0475049e04e704e7055c
-05cb05e5060a066d068606b806f10736073e07500751075d078f07b607d4
-086000b600c300b500b700000000000000000000000001e00381034503b5
-008e0233041902ce02ce002d005f0064034d023f000002a80188027d01b4
-02240578063b023b014e00f00426029402c6029f02f6023b034d014b0153
-006a0231000000000000061404aa0000003c04c300ed04bc026502ce03b5
-0078060c017e02ef060c00b201000239000001c50330042b03cb00da03df
-010704a100db040a011701ed02a70350010b01bd043e05580021039c00ae
-0371017d00b5024500000afb088c012b014e01aa00870054013201f803ff
-0003024e00b4003703e30083006b02d800ed00770088009701640467008e
-0033017c00e700a6029e0329056e062a061501c90269048a021301b40002
-04a9000002390124010305140084015d039a06ef02d9007500cf040a00de
-03ac04bc02cf02ae034d04f005520168006d007d00860071ff8100790558
-04d2016700030156002504e00094007c033204210094007f0072005c002f
-00b6001800ba00b80041034d00720018001f004c016a01550099009a009a
-009800b200040078006900140057006e00ce00b4065402b80067050e0165
-00e7000004cbfe52005affa60099ff67006eff92002dffd40087ff7c00b8
-00a800e5008f00a80185fe7b0070001e00d900de014c054602cf0546ff2d
-028a02d90253029600b700000000000000000000000000000125011800ea
-00ea00ae0000003e05bb008a04d70053003fff8cffd50015002800220099
-0062004a00e4006d00ee00e5004803c00033fe4e02b1ff460370007905df
-0051ffa7ff1f010a0068ff6c004f00bc00a507050061072b00ed04b001d2
-00b6007b00650252ff740365fe690094008f005c00400086007500890089
-4043555441403f3e3d3c3b3a3938373534333231302f2e2d2c2b2a292827
-262524232221201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09
-0807060504030201002c4523466020b02660b004262348482d2c45234623
-6120b02661b004262348482d2c45234660b0206120b04660b00426234848
-2d2c4523462361b0206020b02661b02061b004262348482d2c45234660b0
-406120b06660b004262348482d2c4523462361b0406020b02661b04061b0
-04262348482d2c0110203c003c2d2c20452320b0cd442320b8015a515823
-20b08d44235920b0ed51582320b04d44235920b09051582320b00d442359
-21212d2c20204518684420b001602045b04676688a4560442d2c01b10b0a
-432343650a2d2c00b10a0b4323430b2d2c00b0172370b101173e01b01723
-70b10217453ab10200080d2d2c45b01a234445b01923442d2c2045b00325
-456164b050515845441b2121592d2cb00143632362b0002342b00f2b2d2c
-2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b1
-2cc08a8cb8100062602b0c642364615c58b00361592d2c45b0112bb01723
-44b0177ae4182d2c45b0112bb01723442d2cb01243588745b0112bb01723
-44b0177ae41b038a45186920b01723448a8a8720b0a05158b0112bb01723
-44b0177ae41b21b0177ae45959182d2c2d2cb0022546608a46b040618c48
-2d2c4b53205c58b002855958b00185592d2c20b0032545b019234445b01a
-23444565234520b00325606a20b009234223688a6a606120b01a8ab00052
-7921b21a1a40b9ffe0001a45208a54582321b03f1b235961441cb114008a
-5279b31940201945208a54582321b03f1b235961442d2cb110114323430b
-2d2cb10e0f4323430b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2c
-b10e0f432343650b2d2cb11011432343650b2d2c4b525845441b2121592d
-2c0120b003252349b04060b0206320b000525823b002253823b002256538
-008a63381b212121212159012d2c4bb06451584569b00943608a103a1b21
-2121592d2c01b005251023208af500b0016023edec2d2c01b00525102320
-8af500b0016123edec2d2c01b0062510f500edec2d2c20b001600110203c
-003c2d2c20b001610110203c003c2d2cb02b2bb02a2a2d2c00b00743b006
-430b2d2c3eb02a2a2d2c352d2c76b8022323701020b802234520b0005058
-b00161593a2f182d2c21210c6423648bb84000622d2c21b08051580c6423
-648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb815
-55621bb200802f2b59b002602d2c0c6423648bb84000626023212d2cb400
-0100000015b00826b00826b00826b008260f10161345683ab001162d2cb4
-000100000015b00826b00826b00826b008260f1016134568653ab001162d
-2c4b53234b515a5820458a60441b2121592d2c4b545820458a60441b2121
-592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb01343
-58031b02592d2cb0134358021b03592d2c4b54b012435c5a58381b212159
-2d2cb012435c580cb00425b00425060c6423646164b807085158b00425b0
-0425012046b01060482046b0106048590a21211b2121592d2cb012435c58
-0cb00425b00425060c6423646164b807085158b00425b00425012046b8ff
-f060482046b8fff06048590a21211b2121592d2c4b53234b515a58b03a2b
-1b2121592d2c4b53234b515a58b03b2b1b2121592d2c4b53234b515ab012
-435c5a58381b2121592d2c0c8a034b54b00426024b545a8a8a0ab012435c
-5a58381b2121592d2c4b5258b00425b0042549b00425b00425496120b000
-5458212043b0005558b00325b00325b8ffc038b8ffc038591bb040545820
-43b0005458b00225b8ffc038591b2043b0005458b00325b00325b8ffc038
-b8ffc0381bb00325b8ffc03859595959212121212d2c462346608a8a4623
-20468a608a61b8ff8062232010238ab902c202c28a70456020b0005058b0
-0161b8ffba8b1bb0468c59b0106068013a2d2cb1020042b123018851b140
-0188535a58b910000020885458b202010243604259b12401885158b92000
-0040885458b2020202436042b12401885458b2022002436042004b014b52
-58b2020802436042591bb940000080885458b202040243604259b9400000
-8063b80100885458b202080243604259b94000010063b80200885458b202
-100243604259b94000020063b80400885458b20240024360425959595959
-2d2cb0024354584b53234b515a58381b2121591b21212121592d00000001
-00000005028fa58dc35f5f0f3cf5081b080000000000a2e3272a00000000
-c14fd713faaffd671000080c00000009000100010000000000010000073e
-fe4e00431000faaffa7a1000000100000000000000000000000000000d35
-06000100000000000239000002390000023900b002d7005e047300150473
-0049071d0077055600580187005a02aa007c02aa007c031d004004ac0072
-023900aa02aa0041023900ba0239000004730055047300df0473003c0473
-00560473001a047300550473004d047300610473005304730055023900b9
-023900aa04ac007004ac007204ac00700473005a081f006f0556fffd0556
-009605c7006605c7009e055600a204e300a80639006d05c700a4023900bf
-04000037055600960473009606aa009805c7009c063900630556009e0639
-005805c700a10556005c04e3003005c700a105560009078d001905560009
-0556000604e300290239008b023900000239002703c100360473ffe102aa
-00590473004a0473008604000050047300460473004b0239001304730042
-0473008701c7008801c7ffa20400008801c7008306aa0087047300870473
-0044047300870473004802aa00850400003f02390024047300830400001a
-05c700060400000f040000210400002802ac0039021400bc02ac002f04ac
-00570556fffd0556fffd05c70068055600a205c7009c0639006305c700a1
-0473004a0473004a0473004a0473004a0473004a0473004a040000500473
-004b0473004b0473004b0473004b023900bd023900230239ffe502390009
-047300870473004404730044047300440473004404730044047300830473
-0083047300830473008304730049033300800473006b0473001b04730051
-02cd006d044c000104e3009905e5000305e50003080000e102aa00de02aa
-003d0464004e080000010639005305b4009a0464004e0464004d0464004d
-0473fffd049c00a003f4003805b4007a069600a1046400000231000002f6
-002f02ec002d0625007f071d004404e3008104e3009e02aa00e804ac0072
-046400540473002e0464003304e5001a047300860473008c080000ef0556
-fffd0556fffd0639006308000081078d00520473fffc0800000002aa0053
-02aa004701c7008001c7006c0464004e03f4002f04000021055600060156
-fe390473ffe402aa005c02aa005c040000170400001704730049023900b9
-01c7006c02aa0047080000250556fffd055600a20556fffd055600a20556
-00a20239008d0239ffe00239000402390015063900630639006306390063
-05c700a105c700a105c700a1023900c602aa001902aa000602aa001d02aa
-002e02aa00e502aa00a202aa006b02aa003a02aa004b02aa002804730000
-01c700030556005c0400003f04e3002904000028021400bc05c7fffd0473
-004905560006040000210556009e0473008704ac007204ac00a102aa006b
-02aa001902aa002106ac006b06ac006b06ac0021047300000639006d0473
-0042023900b10556005c0400003f05c700660400005005c7006604000050
-04730046046bffe102aa00ee0556fffd0473004a0556fffd0473004a05c7
-009e04eb004705c7fffd055600a20473004b055600a20473004b04730096
-01c7004204730096025500880473009a02ac008305c7009c0473008705c7
-009c04730087063900630473004405c700a102aa008505c700a102aa003c
-0556005c0400003f04e300300239002404e300300300002305c700a10473
-008305c700a10473008304e300290400002804e3002904000028046800a4
-063900600662005504a00048047400480391006204f000440329002e0530
-0048046bffe1040000b002eb005208c000330800004f040000990800004f
-040000990800004f040000980400009807d5016a05c0009e04ab007204d5
-009d04ac007104d5022204d5010505abffe9050001c905ab027e05abffe9
-05ab027e05abffe905ab027e05abffe905abffe905abffe905abffe905ab
-ffe905ab01c005ab027e05ab01c005ab01c005abffe905abffe905abffe9
-05ab027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab
-01c005ab01c005abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905abffe905abffe905ab02d605ab006605abffea05d5ffff04d50092
-0800000007eb013007eb012007eb013007eb012004d500b204d5008004d5
-002a082b0198086b01b807550010060000f40600006f0440003a05400037
-04c0003f04150040040000250600005505e100bf038d008904d5ffd90180
-008002d50086071500610296000f04d5009202d6008302d6008304d500b2
-02d600700556fffd0473004a05c700660400005005c70066040000500556
-00a20473004b055600a20473004b055600a20473004b0639006d04730042
-0639006d047300420639006d0473004205c700a40473008705c7001f0473
-00060239ffce0239ffce0239ffe40239ffe40239fff60239fff50239004b
-01c700190400003701c7ffa20556009604000088040000860473009601c7
-fffa05c7009c0473008705c900a50473008b063900630473004406390063
-0473004405c700a102aa006b0556005c0400003f04e300300239000c05c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-078d001905c70006055600060400002101c700890556fffd0473004a0800
-0001071d00440639005304e30081023900b9078d001905c70006078d0019
-05c70006078d001905c70006055600060400002101c7008a02aaffe10473
-001b04cd005a06ac006b06ac002206ac002206ac004a02aa00e202aa006b
-02aa00de02aaffea0557ffff0646ffa706b4ffa80312ffa80632ffa706d8
-ffa70605ffa701c7ff780556fffd055600960558fffe055600a204e30029
-05c700a4023900bf055600960558000b06aa009805c7009c0533006d0639
-006305c700a40556009e04f2009404e30030055600060556000906af007f
-05fb0061023900040556000604a00048039100620473008b01c7006b0460
-0088049a008c04000019038700480473008b0473005c01c7008904000086
-04000018049c00a00400001a0395005c04730044048d008303db00560460
-00880433001105b4007a063f005701c7ffc9046000880473004804600088
-063f0057055700a206eb0032045500a105c000640556005c023900bf0239
-0004040000370875000d081500a406d5003104a900a10515000a05c000a0
-0556fffd054000a705560096045500a1056b0000055600a20763000704d5
-004e05c000a105c000a104a900a10540001206aa009805c700a406390063
-05c000a00556009e05c7006604e300300515000a061500520556000905eb
-009f05550057075500a1078000a106550000071500a8054000a505c00055
-081500a405c7001a0473004a0495005b0440008802eb008804ab00000473
-004b055afffb03ab003204780087047800870380008604ab00180580008c
-046b00880473004404550088047300870400005003aa0026040000210695
-004b0400000f0495008a042b0045066b008d0695008d0500002805c0008b
-042b008404150030060000890455001f0473004b0473000002eb00890415
-004b0400003f01c700880239000901c7ffa2074000130680008304730000
-0380008604000021046b008803e900a1034a008808000041089500a00585
-002d000001010000001e0000003100000031000001010000007e0000007e
-0000008c0000008c000001010000001000000101000001210310007d0000
-008c023300d20000030b0000ff04023900b9048100690456003203310019
-0411002d04d1009601f9009b030f005f04ca009b04b8008c01f9009b0413
-002803b0005003b4003c04ca009b04cf005001f9009b02d2003c0498005a
-043c00190488006e045f007303b1001903d4000a0466009604130028058e
-00640524002803f2009b03f2009b03f2009b01e3005a0356005a0686009b
-01f9ffac041300280413002803b4ff5703b4ff570448002d058e0064058e
-0064058e0064058e00640481006904810069048100690456003203310019
-0411002d04d10096024b0000034a000004b8008c024b00000413002803b0
-005003b4003c04cf005002d2003c0498005a0488006e045f007303d4000a
-0466009604130028058e00640524002801f9009b0456003203b00050045f
-0073049b003c0000ffdc0000ff250000ffdc0000fe51028d00ab028d00a0
-02da0043034d007901a8ffba000000460000004600000046000000460000
-00480000004600000046000000460435017c0435012e043500b704350081
-0435012c043500be043500af043500810435009a043500db04350085028d
-00c1043500b3060001000600010002420036060001000435009e04350098
-043500cb0600010006000100060001000600010006000100000000460600
-010006000100060001000600010006000100060001000600010006000100
-051bffba06000100060001000600010005b5003a05b5003a01f4ffba01f4
-ffba060001000600010006000100060001000481003604350036043dffba
-043dffba03e9004a03e9004a067f0014077600140327ffba041effba067f
-0014077600140327ffba041effba051b003204b500240300fff706000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010000000030
-0000004600000046000000400000004606000100060001000000ffdc0000
-fe510000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ff160000ff160000ffdc0000ff160000ffdc0000ff200000ffdc0473
-004a08000000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010006000100028d
-007f028d005d0600010004ee0015034d007901a8000e01d6ffdc01a80056
-01d60010037500320375003201a8002d01d60013051b003204b5002401f4
-ffba01f4ffba01a8009301d6001305b5003a05b5003a01f4ffba01f4ffba
-024200000300fff705b5003a05b5003a01f4ffba01f4ffba05b5003a05b5
-003a01f4ffba01f4ffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba02b3
-005f02b3005f02b3005f02b3005f03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba08c9003e08c9003e06c5ffba06c5ffba08c9003e08c9003e06c5ffba
-06c5ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7
-ffba04a7ffba045a002a039a00360435ffba0327ffba045a002a039a0036
-0435ffba0327ffba064f0027064f00270224ffba021affba04a7004604a7
-00460224ffba021affba04cf002d04cf002d0327ffba0327ffba040d0047
-040d004701a8ffba01a8ffba02b4002302b400230327ffba0327ffba0435
-00450435004501f4ffba01f4ffba024200360300fff7039affba0327ffba
-0375003203750032051b003204b50024051b003204b5002401f4ffba01f4
-ffba045a004004ce0049045a002604ce0039045a005304ce004a045a0053
-04ce004a0600010006000100000000460000004606000100060001000600
-010000000046000000460600010006000100000000480000004606000100
-060001000600010000000046000000460000004600000046000000400000
-003006000100000000460000004606000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d00ca028d00c7028d
-00c606000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000100ffba0800ffba1000ffba06dc0063053f004406d5
-00a1055b00830000fddc0000fc2f0000fca60000fe540000fcd70000fd73
-0000fe290000fe0d0000fd110000fc670000fd9d0000fbf50000fc720000
-fed50000fed50000ff02041b00a006ac006b06ac00190000feb60000fd73
-0000fe080000fca60000fe530000fd110000fbc80000faf40000faaf0000
-fc720000fbaa0000fb6a0000fcf10000fc7d0000fbdd0000fcc10000fb98
-0000fdea0000fe840000fdc20000fcf10000fd5f0000fe760000febc0000
-fceb0000fd6c0000fd580000fc900000fd150000fc2c0000fc130000fc12
-0000fb960000fb9601c700880556fffd0473004a0556fffd0473004a0556
-fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473004a
-0556fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473
-004a0556fffd0473004a0556fffd0473004a055600a20473004b055600a2
-0473004b055600a20473004b055600a20473004b055600a20473004b0556
-00a20473004b055600a20473004b055600a20473004b0239006301c7001f
-023900ba01c7007c06390063047300440639006304730044063900630473
-004406390063047300440639006304730044063900630473004406390063
-0473004406dc0063053f004406dc0063053f004406dc0063053f004406dc
-0063053f004406dc0063053f004405c700a10473008305c700a104730083
-06d500a1055b008306d500a1055b008306d500a1055b008306d500a1055b
-008306d500a1055b00830556000604000021055600060400002105560006
-040000210556fffd0473004a0239ffe201c7ffb0063900630473004405c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-05c700a1047300830000fefe0000fefe0000fefe0000fefe0455fffd02eb
-000c07630007055afffb04a900a10380008604a900a10380008605c700a4
-046b00880473fffd040000140473fffd04000014055600090400000f0555
-0057042b0045055500a10473008706050063047300550639006004730044
-05b5003a01f4ffba0224ffba021affba04a7004601f4009e01f4001001f4
-001b01f4001001f4006b01f4fff90227ffce0000000f0000fff502aa00a4
-02aa00a40000000e00000056000000560000ffcf01a8000f01d6ffbf01a8
-fff501d6ffcd01a8001d01d6fff501a8009301d600130375003203750032
-0375003203750032051b003204b5002405b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba
-01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4
-ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a
-01f4ffba01f4ffba0481003604350036043dffba043dffba048100360435
-0036043dffba043dffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba0481
-003604350036043dffba043dffba02b3003202b3003202b3005f02b3005f
-02b3005f02b3005f02b3003202b3003202b3005f02b3005f02b3005f02b3
-005f02b3005f02b3005f02b3003802b3003802b3004902b3004903e9004a
-03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9
-004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba0692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba08c9003e08c9003e06c5ffba06c5ffba04a7ffba04a7ffba045a
-002a039a00360435ffba0327ffba064f0027064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba064f0027064f00270224
-ffba021affba064f0027064f00270224ffba021affba064f0027064f0027
-0224ffba021affba04a7004604a7004604a7004604a70046093e0032093e
-00320740ffba0740ffba067f0014077600140327ffba041effba04cf002d
-04cf002d0327ffba0327ffba04cf002d04cf002d0327ffba0327ffba04cf
-002d04cf002d0327ffba0327ffba067f0014077600140327ffba041effba
-067f0014077600140327ffba041effba067f0014077600140327ffba041e
-ffba067f0014077600140327ffba041effba067f0014077600140327ffba
-041effba040d0047040d004701a8ffba01a8ffba040d0047040d004701a8
-ffba01a8ffba040d0047040d004701a8ffba01a8ffba040d0047040d0047
-01a8ffba01a8ffba043500450435004501f4ffba01f4ffba043500450435
-00450435004504350045043500450435004501f4ffba01f4ffba04350045
-043500450481003604350036043dffba043dffba024200360300fff7031a
-001a031a001a031a001a0375003203750032037500320375003203750032
-037500320375003203750032037500320375003203750032037500320375
-0032037500320375003203750032051bffba04b5ffba051b003204b50024
-01f4ffba01f4ffba0375003203750032051b003204b5002401f4ffba01f4
-ffba051b003204b50024067f0045067f0045067f0045067f004501a80028
-0000fe290000fea20000ff300000ff1d0000ff120000ff920000fe7e08fc
-003208ad00320000ffb50000ffb60000feed0000ff640000fe7e0000ff9f
-018d000002f6fffd0000fe820000ff1004cd00320000ff580000ff580000
-ff640692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba045a002a039a00360435ffba0327ffba034d007902b400230242
-003601f4ffba0290ffba01f4002f01f4003b01f4001201f400b101f4006d
-067f00140776001401f9009b0000fed902bc000003f2009b045afff504ce
-fff5045a005304ce004a045a005304ce004a045a005304ce004a045a0053
-04ce004a045a005304ce004a045a005304ce004a04350071043500ad045a
-000f04ce000f0473001406110014054000a7047300860540000a0473000a
-05c7005105c700660400005005c7fffd067a00140540004a047300460474
-00480556006e04d5005304e3ffc40639006d04fe000f070c008701c70083
-0239001f055600960400008801c7001504000018072000a405c7ffb80473
-008b0639006006f200630557004406090014047300860556009e0556006b
-0400004f04f20094030b00440239002404e300140239002404e3003005fb
-006105c700a1062e00140400002104e300290400002804e3002904e30031
-045c0044045c003f0473003c0473005503ab003203e50024047300870214
-00bc034e00bc04ac0072023900b00aaa009e09c7009e08640046087f0096
-06aa0096039c008309c7009c078e009c062b0087047300550556fffd0473
-004a0000fefe0556fffd0473004a08000001071d00440639006d0473001a
-0639006d0473004205560096040000880639006304730044063900630473
-004404e30029045c004c01c7ffa20aaa009e09c7009e086400460639006d
-04730042084600a404f2009e05c7009c047300870556fffd0473004a0556
-fffd0473004a055600a20473004b055600a20473004b0239ff8a0239ff64
-023900040239fff60639006304730044063900630473004405c700a102aa
-ffcc05c700a102aa006805c700a10473007605c700a1047300830556005c
-0400003f04e3003002390024045c0051037e001305c700a40473008705a6
-00a404d6005e0486005e04e30029040000280556fffd0473004a055600a2
-0473004b06390063047300440000fefd0639006304730044063900630473
-004406390063047300440556000604000021047300570473004804730086
-04730086040000130400005004730046047300460473005505e9005503ab
-004903ab0032050d0032040f00440239ffb9047300420473004204780050
-0402001904ef00190473008b047300870473008701c7001901c7008901c7
-0089029e0000026e001401c700830493008306aa008406aa008406aa0087
-0473ffa60473008b046c00870473004406530044063f00570466004402aa
-ffe402aaffe402aaffe402aa008502aa008502aa008502aaffe40455008a
-0455008a0400003f01c7ffa20214ffb901c7ff7202cb00000239000f0239
-002404730019048c0044046000880400001a05c700060400001804280019
-0400002804540028045c004c045c00790400002404000050040000240400
-00500639006304400088040f004904780050046b0088032e000004000008
-033b008804730048040000240400005007b7004607400046080b004605b3
-0024036f002405c00024061c0013054a0083050f008303e2001e04380063
-03110064031100640146ffce01eb006401eb000001eb000002ea006403d9
-0000029100000187005a02d7005e01c7008001c7006c01c7008a02aa00fb
-02aa00fb02ca003202ca003204ac007004ac007004ac006504ac006502aa
-012102aa00de02aa005902aa012102aa001d02aa005902aa00de023900b6
-023900b602aa00fb02aa00fb02aa00a602aa00a602aa00a602aa001d02aa
-ffe202aafffb029400000142006402b8003202a0000002ca003203100096
-0310009603100096031000960310009602aa006202aa006202aa002802aa
-001d02aa0047045700960457009604570096045700960457004304570043
-045700430457004304570043031000430457002f0457002f0457002f0457
-002f0457002f0310002f0457002504570025045700250457002504570025
-0310002f0457001a0457001a0457001a0457001a0457001a0310001a0457
-004204570042045700420457004204570042031000420457009604570096
-045700960457009604570042045700420457004204570042045700420310
-00420457002f0457002f0457002f0457002f0457002f0310002f0457002f
-0457002f0457002f0457002f0457002f0310002f04570026045700260457
-002604570026045700260310002604570042045700420457004204570042
-045700420310004204570096045700960457009604570096045700420457
-004204570042045700420457004203100042045700260457002604570026
-045700260457002603100026045700230457002304570023045700230457
-0023031000230457002f0457002f0457002f0457002f0457002f0310002f
-0457004b0457004b0457004b0457004b0457004b0310004b045700960457
-009604570096045700960457004204570042045700420457004204570042
-031000420457001a0457001a0457001a0457001a0457001a0310001a0457
-002404570024045700240457002404570024031000240457002f0457002f
-0457002f0457002f0457002f0310002f0457004e0457004e0457004e0457
-004e0457004e0310004e045700960457009604570096045700960000fec1
-0000fec60000fdac0000fed80000ff920000fee90000ff4c0000fea00000
-fec40000ffce0000ff660000fea00000fed80000fed80000ff970000ff98
-0000ff990000fff40000ff420000ff420000ff440000ff5f0000fe870000
-ffec0000ffa60000ff510000ff510000ff510000fec90000ff1c00000000
-0000fee90000ff4c0000ff930000ff2a0000ff560000ffce0000fe870000
-febb0000fec40000fec40000fed80000fed80000feb30000fec90000fdad
-0000fdac0000feb30000fec90000fdad0000fe160000fee60000ffa60000
-fe870000ff440000feba0000ff230000ff9a0000fdac0000fe8800000000
-0000feb00000ff980000fe930000ffa60000fe870000fdac0000ff660000
-ff440000feb00000feb00000feb00000ff030000ff520000fd1f0000ff53
-0000ff530000ff530000feb50000feb50000ffc30000feae0000fedc0000
-fec70000fec80000fedc0000fe1e0000ff420000ff510000feb70000feb0
-02aa00de02aa005902aa00fa049a008c04600088062e001407aa0000062e
-0014047b004c063f005704cf0044063900630473004405c7006604000050
-04e300a8033b008804ff0000043c0032060d000a049d0042072000a406aa
-0084056500630473008b056400a40400000a0556006b0556006b04e00005
-04c5001905e5005f046e004403b600140347002804cf00440495005b0400
-005001c7ffa2063900600389004d03890050055600a205c000a10473004b
-047800870ab4006d04fe00100639001404e70014079900bf05b500880558
-000b0400001a072e00bf0590008806a10078057b007a086d00bf06f00088
-04d5006603ab001f065f0039058200480639006004730044066d0009050c
-001a066d0009050c001a0b010063091c004406aa005c04e600440987006d
-06d000500000fe370ab4006d04fe001005c7006604000050040700140000
-fea60000febc0000feaa0000fead0000fc2b0000fc4c05c000a104780087
-05400004042b00140556009e04730087055d00a40464008804d5004e03ab
-003204a900040380000005ef002904490028070900a4052f0088091800a0
-06f6008806060066042b005005c700660400005004e3003003aa00260767
-00310587002605550057042b004506e4000a0554000a06e4000a0554000a
-023900bf07630007055afffb055700a1046800860540001204ab001805c7
-00a4046b008805c700a4046b008805550057042b004506aa00980580008c
-02aa002e0556fffd0473004a0556fffd0473004a08000001071d00440556
-00a20473004b060500630473005507630007055afffb04d5004e03ab0032
-04d5004e045c004c05c000a10478008705c000a104780087063900630473
-0044063900600473004405c0004a0415002b0515000a040000210515000a
-040000210515000a0400002105550057042b0045071500a805c0008b0540
-004a0473004607bf004a0703004607a6006606860053054d006604130053
-07c3001207470018084600a4070700880639006d0478005005f900300553
-00260000ff430000fec90000ff770000ffb00000ff470000ff560000ff74
-0000fed70000feac000000000000ff520000ff56000000000000feac0000
-fd9a000000000000ff6a0000ff7c0000ff690000ff560000feac0000ff7f
-0000ff560000fdef0000ff430000ff690000ff7c000000000000fdae0000
-ff8c000001020000fefe0000fefe0000fedf0000fedf0000ff580000ff20
-0000fefe0556fffd0473004a055600960473008605560096047300860556
-00960473008605c700660400005005c7009e0473004605c7009e04730046
-05c7009e0473004605c7009e0473004605c7009e04730046055600a20473
-004b055600a20473004b055600a20473004b055600a20473004b055600a2
-0473004b04e300a8023900130639006d0473004205c700a40473008705c7
-00a40473008705c700a40473008705c700930473006805c700a404730087
-0239ffdf01c7ff9202390020023900060556009604000088055600960400
-008805560096040000880473009601c7007e0473009601c7ffb904730096
-01c7ffa50473009601c7ffa306aa009806aa008706aa009806aa008706aa
-009806aa008705c7009c0473008705c7009c0473008705c7009c04730087
-05c7009c0473008706390063047300440639006304730044063900630473
-004406390063047300440556009e047300870556009e0473008705c700a1
-02aa008505c700a102aa008505c700a102aa005e05c700a102aa00260556
-005c0400003f0556005c0400003f0556005c0400003f0556005c0400003f
-0556005c0400003f04e300300239002404e300300239002404e300300239
-ffff04e300300239000e05c700a10473008305c700a10473008305c700a1
-0473008305c700a10473008305c700a104730083055600090400001a0556
-00090400001a078d001905c70006078d001905c70006055600090400000f
-055600090400000f055600060400002104e300290400002804e300290400
-002804e3002904000028047300870239000305c70006040000210473004a
-01c7008904a0004804a0004804a0004804a0004804a0004804a0004804a0
-004804a000480556fffd0556fffd06820013068200130682001306820013
-068200560682005603910062039100620391006203910062039100620391
-0062061e0000061e0000076c0000076c0000076c0000076c00000473008b
-0473008b0473008b0473008b0473008b0473008b0473008b0473008b068f
-0000068f0000081f0000081f0000081f0000081f0000081ffff3081ffff3
-01c7008101c7008101c7ff9b01c7ff9b01c7ffeb01c7ffeb01c7ffa201c7
-ffa20301000003010000049100000491000004910000049100000491fff3
-0491fff3047300440473004404730044047300440473004404730044069d
-0000069d0000082d0000082d000007c9000007c900000460008804600088
-0460008804600088046000880460008804600088046000880682000007ae
-00000812000007ae0006063f0057063f0057063f0057063f0057063f0057
-063f0057063f0057063f0057065f0000065f000007ef000007ef0000078b
-0000078b0000078bffff078bffff04a0004804a000480391006203910062
-0473008b0473008b01c7ffe601c700680473004404730044046000880460
-0088063f0057063f005704a0004804a0004804a0004804a0004804a00048
-04a0004804a0004804a000480556fffd0556fffd06820013068200130682
-00130682001306820056068200560473008b0473008b0473008b0473008b
-0473008b0473008b0473008b0473008b068f0000068f0000081f0000081f
-0000081f0000081f0000081ffff3081ffff3063f0057063f0057063f0057
-063f0057063f0057063f0057063f0057063f0057065f0000065f000007ef
-000007ef0000078b0000078b0000078bffff078bffff04a0004804a00048
-04a0004804a0004804a0004804a0004804a000480556fffd0556fffd0556
-fffd0556fffd0556fffd02aa00e502aa00fd02aa00e502aa000602aa0006
-0473008b0473008b0473008b0473008b0473008b068200000682000006f3
-000006f3000005c700a402aa001302aa001302aa000601c7ffbb01c7ffab
-01c7ffca01c7ffca01c7ff9301c7ff930239001a0239fff5036500000365
-000002aa001302aa001302aa000604600088046000880460008804600088
-048d0083048d00830460008804600088055600060556000606e600000718
-0000061e000002aaffea02aaffea02aa0059063f0057063f0057063f0057
-063f0057063f005707650000069d000007270000065f000005fb006102aa
-00de02aa00e50473000d05c7006605c7006606aa008705c70024095000a1
-078d00190556001f04e30030080000290400003004c100660000ff530000
-ff530000ff530000ff5301c7001901c7ffa2042b00050556001105740046
-02cbffa3057a008702f0ffc8057f000a057f000a02aa008402aa008402aa
-00c902aa00c902aa00a002aa005902aaffaf02aa003a02aa0006023900b9
-02aa00a902aa00a902aa00a902aa00a9032e001e032e001e02aa003a0000
-ff730000ffa50000fed80000ff230000ff720000ff720000fee70000ffa5
-0000ff530000ff530000ff530556009e0473008703f8001905fb0019071d
-00440440001904000050046900870469001903eb008703ab003201c70088
-0361004104000088033600100580008c04780087047300440400001304de
-004404de004404de000d078d005003a800440473004404730044042b0084
-0455001f0455001f03aa00260460008804c6004405de004404c600440400
-001a05c700060400002803ab0032036b003f04db001f02eb00880400001a
-04550088042b008405b4007a04ab001803a00000054f0000035100320351
-ffd103980032034800320348003203f80032036e0032015600690284002d
-0366003202d000320415003203710032036f003204180032030f00320359
-0032039c003203760031036f003204fb000002fa003202fa003203040032
-04cc0032030500640305003202f9003202f90032028c0032028c00320304
-00320142006402b6006404950064030f00640305003202d5003203050032
-030500320306006401c20032030f00640342003204950064029200000320
-00000315006402920000030600320385003202bf00000142006401eb0064
-030f0064029200000315006402920000030900320385003202bf000005ed
-00460a660046061300460689ffba0541ffba01e9003c045a00110000ff0d
-0000ff350000fece0000feb70000fec90000ffcf0000ff4f0000ff9e0000
-feca02b3005f02b3005f03e9004a03e9004a039affba0327ffba039affba
-0327ffba05ad0069053d002d05fd009604dc005004e0003c05f6009b053f
-00280650002804ac00720000fe3b0000fe660000fe660473fffc02aa0053
-02d5ffce01a8ffba01a8ffba01a8ffba01a8ffba0658001509c500470400
-000008000000040000000800000002ab0000020000000155000004730000
-02390000019a000000ab00000000000005e5000305c7006606aa00980580
-008c0744008307180046071800480556fffd05c70066040000140473000a
-04e300300400004f0400002804a5001d000001020000ff420000febf0000
-ff3a0000ff53048d000a05c7005105c7006605c70051045500a102eb0088
-0000ff430000ff040000ffac02d200960000ff37021affba0250001e0000
-ff3a0000ff5b0000ff5f0000ff7e0000ff940000ff4a0000fe9c05b5003a
-05b5003a01f4ff9601f4ff9605b5003a05b5003a01f4ffba01f4ffba05b5
-003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba
-05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba0481003604350036043dffba
-043dffba0481003604350036043dffba043dffba02b3003202b3003202b3
-005f02b3005f03e9004a03e9004a0692003e0692003e043fffba043fffba
-045a002a039a00360435ffba0327ffba045a002a039a00360435ffba0327
-ffba045a002a039a00360435ffba0327ffba064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba067f0014077600140327
-ffba041effba067f0014077600140327ffba041effba067f001407760014
-0327ffba041effba02b4002302b400230327ffba0327ffba02b4002302b4
-00230327ffba0327ffba043500450435004501f4ffba01f4ffba04350045
-0435004501f4ffba01f4ffba043500450435004501f4ffba01f4ffba040d
-0047040d004701a8ffba01a8ffba03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0473ff93047300460239ffbf06aa
-ffd50473ffb70473ff9102aaffa402aaffa40400ffff0239ffb904000028
-04730089030b0064047400480649002401c7001901c700190473001e0460
-001e048c000a04730086047300460239001305b400420400008801c7fffc
-06aa00870473008b0473008702aafffb0400003f0318ffa20400001a0400
-000f040000280473004a04730048047300460473004b03ab004903ab0032
-0534005501c700880400001301c7ffa204730083045c004c0304006402d5
-003202c9003302fc0032028c003201d5003201d500000304003203110064
-01420019014200640142006401420019022a000001420064014200090233
-00640493006404930064030fffc9030f0064030e00640305003203000032
-02b800320142ffca01c20032030f001d031a00320306006402d400640292
-000002de003202de003202de003202f4003202ea00320000febc0000febc
-0000ff730000fea9023900b902fa003202f900320305003202a0000002f9
-00320639006d0556fffd0473000f05c7006602aa004104a0004804a00048
-04a0004804a0004804a0004804a0004804a0004804a0004801c7ff9b01c7
-ffab01c7ff9b01c7ffab01c7ff9b01c7ffbb01c7ff9b01c7ffbb04600088
-0460008804600088046000880460008804600088046000880460008801c7
-ffab01c7ffab01c7ffbb01c7ffbb04600088046000880460008804600088
-045a005304ce004a03a000130556001105c700290558000b055600a20473
-004b0400003301c7ffa205e600630473004805c7000002aa000f05560006
-0400002104000013040000500400001301c700830455fffd02eb00010556
-00090400000f055600090400000f04d5005303ab00490540001204ab0018
-0000fec60000fed40000fec60000fed40000fe5f0000fe5f0000ff720000
-ff730000fee7078b000a03eb004c040000130473000a01c700150473fff4
-0556001105c700a1047300190239ff8b05c700a404730087055600960400
-008804e30029040000280400003b049e00a403670088053000480000ff53
-0000ffbc0000fefe0000fefe0000fea40000fea401c70088000000000000
-002a0000002a0000002a0000002a000000d60000017e00000320000005a6
-0000074e000009380000097e000009fe00000aa400000b8400000bec0000
-0c6400000caa00000ce600000d5600000f1200000fee00001218000013f2
-000015520000170c000018e20000198e00001c2200001e5600001eb20000
-1f7000001ff200002062000020e8000021da000023da000025840000271c
-000028560000299e00002a6200002b1800002ca800002dae00002e920000
-2f7a000031b00000323a000035640000370e000038420000394800003b3c
-00003da800004052000041000000422400004398000045d6000048e20000
-4a8800004bc800004c3200004c9c00004d0000004d8800004dbc00004e38
-0000510a000052e80000549c000056500000580e0000596200005b520000
-5cf600005dea00005f020000619a00006296000064c60000668c0000684e
-00006a1200006ba800006cae000070560000717a00007318000075360000
-79a000007bc400007e1c00008004000081020000814e00008250000082f0
-0000833c00008370000083ac000083ee000084540000849a000084ce0000
-85040000853a0000858a000085cc0000861e00008656000086a8000086de
-0000871e000087600000879e000087e800008828000088560000888e0000
-88de00008914000089540000898e000089d200008a1c00008a5800008a88
-00008acc00008b0400008b9400008c1a00008e2800008fbc0000916c0000
-91b80000924c00009470000096c4000098b4000099a000009a2200009a8c
-00009baa00009d0600009f4e0000a0b00000a13e0000a1e80000a2ac0000
-a3f40000a59e0000a68c0000a7520000a7b60000a8240000a94e0000aa72
-0000ab020000ace40000af3e0000b2900000b3860000b42c0000b47c0000
-b5320000b6520000b7f00000b88a0000b94e0000ba0e0000ba760000bab2
-0000bb0a0000bb580000bd700000bfb60000bfee0000c0200000c14a0000
-c2760000c3240000c3c80000c46a0000c53c0000c5900000c5c60000c61e
-0000c7700000c7e20000c83c0000c9b40000cb200000cc000000cc320000
-ccce0000cdf20000d0680000d0a20000d0e60000d1220000d1840000d1c6
-0000d20c0000d2580000d28a0000d2de0000d31c0000d34c0000d38a0000
-d3d00000d4120000d4500000d4d20000d5400000d6260000d6620000d6e2
-0000d7160000d7b80000d8400000d8ac0000d90e0000d97a0000da660000
-db580000db8c0000dbc00000dbf00000dc340000dcac0000de260000e040
-0000e0720000e0ac0000e1a60000e3340000e36a0000e4ce0000e54a0000
-e62a0000e7200000e8b00000ea1a0000ec080000ed040000ed4a0000ed7e
-0000edc00000edfa0000ee4e0000ee960000eee00000ef100000ef400000
-f1280000f1660000f18e0000f1be0000f1f20000f2180000f23e0000f286
-0000f43c0000f5b60000f5dc0000f6020000f6460000f6760000f6a60000
-f6fc0000f7da0000f8ec0000f9300000f9660000f9c00000f9fe0000fa32
-0000fa620000fa9e0000fade0000fb1c0000fb580000fb9a0000fbd00000
-fc0c0000fc4c0000fc720000fc960000fce60000fe420000fe980000fecc
-0000ff1a0000ff660000ffa80000ffe0000100160001005e000101000001
-029c00010464000105e6000107d80001092a00010aae00010b9000010d2a
-00010d9400010dbc00010e5a000110dc0001111c0001115c0001119c0001
-11da000112380001129600011304000113240001140e000114ae000114e4
-000115320001157c000115c6000115e2000115fe0001161e0001163e0001
-165e0001167e000116a4000116ca000116f000011716000117460001176e
-00011796000117c2000117ee000118220001184c00011878000118ae0001
-18d8000119040001193a000119640001198e000119c2000119f200011a26
-00011a6a00011a9a00011ace00011b1000011b4400011b7600011bb80001
-1bec00011c1c00011c5e00011ca200011ce800011d4400011d6000011d7c
-00011d9800011db400011dd000011f3e000121ea0001245a000124760001
-2490000124ac000124c8000124e4000125000001255c0001259600012600
-000126ca0001276a00012840000128c000012948000129b800012a4e0001
-2aac00012af200012b5000012bb200012c6a00012d2800012d5400012db0
-00012df400012f60000130540001307e0001309a000130c6000130fe0001
-314a0001318a000131be000131ee0001321e0001324e00013292000132c2
-000132f2000133320001336200013392000133c200013402000134320001
-346200013492000134b8000136bc000136ec0001371c0001386c00013a22
-00013a5200013a8000013ab000013ade00013b0e00013b3c00013b600001
-3b8400013bb400013d2400013d5c00013d8c00013f1e00013f4c00013f7a
-00013fa800013fd00001412e000142c6000142fe0001433e0001437a0001
-43aa000143d8000143f4000144240001445400014544000146ac000146dc
-000147160001475600014786000147b6000147f80001481e000148440001
-4884000148c4000148f40001493400014a1e00014a9e00014b8200014bb2
-00014be200014c1200014c4200014c7e00014cb000014ce200014d120001
-4d4200014d8800014dba00014dea00014e2000014e9200014ec600015094
-000151960001532600015556000157a6000159380001599c00015a260001
-5a3600015ac400015cc200015dee00015f5a0001604a000161ce000163e8
-000166140001670600016716000167260001683e0001684e0001685e0001
-686e0001687e0001688e000169ac000169bc000169cc00016a4000016a50
-00016b2000016b3000016c4200016c5200016c6200016c7200016dd00001
-6fae00016ff0000170260001705c0001708c000170bc0001711000017138
-000172c20001740a0001755e000176c60001784a000178ae00017a400001
-7b5c00017b6c00017b7c00017d0200017d1200017e7800017fd200018106
-00018264000183d200018598000185d800018610000186460001866c0001
-869c000186c200018838000188680001899e000189ae000189be00018a00
-00018a1000018ba400018d5000018eda00018f0200018f320001908e0001
-909e000191d6000191e600019280000193e0000193f000019656000197e0
-000199480001997800019aee00019c2000019c3000019c4000019c500001
-9d2a00019d3a00019d4a00019d5a00019e5200019fcc00019fdc0001a104
-0001a2380001a38a0001a51e0001a63c0001a7c80001a8da0001a9100001
-ab460001abe60001abf60001ad8c0001af2e0001afb20001b1340001b144
-0001b3ac0001b52c0001b6ac0001b6dc0001b87c0001ba020001bbc60001
-bcf20001bd020001be320001be420001be520001bf120001bf220001c108
-0001c1180001c24e0001c35c0001c5080001c6be0001c8000001c9700001
-cab80001cb0a0001ccec0001ce680001cea60001d04c0001d0700001d1b0
-0001d1c00001d1d00001d2080001d2180001d3a40001d50c0001d6800001
-d6a40001d6d40001d8420001d8f40001d9b20001d9e00001db960001dc8e
-0001dd1c0001de420001def00001dfc40001e00e0001e0860001e1460001
-e16e0001e1b20001e2080001e2e40001e32e0001e3620001e38a0001e3b2
-0001e3e60001e42a0001e46e0001e4ac0001e5ea0001e6a20001e7c20001
-e8380001e9060001e9580001e9ea0001ea9a0001eb8e0001ebe20001ec78
-0001ed360001ee200001eed20001eff20001f0440001f0ee0001f2240001
-f2fc0001f3e20001f4e80001f5ce0001f6b00001f7a40001f8420001f948
-0001fa420001faba0001fb320001fba80001fbde0001fc3a0001fd020001
-fd8e0001fdc60001fe0c0001fe3c0001fea60001ff660001ff9a0001ffca
-0001fffe0002002e0002005e0002008e0002022e00020266000202a60002
-02de00020316000203b2000204ac000204dc00020580000205ae000205ee
-0002063e0002066e000206ba00020852000209b800020b1800020b5e0002
-0bb200020bea00020d5c00020d9200020e2400020e6200020e9000020ece
-00020ffe0002102600021162000211f20002129c0002131e000213da0002
-14f20002160000021634000216ba0002181600021898000218e2000219ec
-00021a3400021b3800021bb400021c0c00021c9000021d7a00021e900002
-1f8c0002203600022126000221f8000222e2000223ca0002247a000224fc
-0002275a00022784000227ae0002286600022890000229d200022ad80002
-2bc200022bec00022c1600022c4000022c6a00022c9400022e1400022e3e
-00022e6800022e9200022ebc00022ee600022f1000022f3a00022f640002
-2f9800022fc200022fec0002301600023190000231a0000232ba000232ca
-000232f40002331e00023348000233720002351c00023738000238660002
-3876000239f200023a0200023b4800023d1400023e1a00023f9a0002413a
-0002435e000244b80002469a000247de0002490c000249fa00024a240002
-4a4e00024a7800024aa200024acc00024af600024b2000024b4a00024b74
-00024b9e00024bc800024bf200024c1c00024c4600024c7000024eac0002
-50280002516c000253540002549c000254c6000254f00002552000025550
-000255a0000255f000025630000256a2000256f600025754000257aa0002
-57e00002582200025868000258b2000258e20002591a0002594a00025a82
-00025dc800025df200025e1c00025e4600025e7000025e9a00025ec40002
-5eee00025f1800025f4200025f6c00025f9600025fc000025fea00026014
-0002603e0002606800026092000260bc000260e6000261100002613a0002
-61640002618e000261b8000261e20002620c0002623600026260000262fe
-000263140002633e0002661e0002662e000267480002686a000269a80002
-6aea00026c9000026ca000026de200026f3200027122000272f60002740e
-0002741e000274a00002752e0002762e0002763e000276de000276ee0002
-78040002795600027a8600027a9600027b6400027b7400027cea00027cfa
-00027e0e00027e1e00027f52000280e8000281a4000281b4000282b20002
-840c00028498000284a8000285d20002875e0002881a0002882a000288c6
-000288d6000289a4000289b400028a8c00028a9c00028ba400028bb40002
-8d7a00028d8a00028ee200028ef20002915c0002916c0002936600029376
-000294e0000294f0000295e0000295f00002978800029798000298b60002
-98c600029a0600029a1600029a2600029a3600029bae00029bbe00029bce
-00029bde00029d3000029e7e00029f4c0002a0300002a1b00002a3320002
-a4320002a5460002a68a0002a69a0002a7880002a8620002a9fe0002aa0e
-0002ab2c0002ac320002ae300002ae400002ae500002ae600002afaa0002
-afba0002b0720002b0820002b1900002b1a00002b28c0002b29c0002b3ba
-0002b3ca0002b4680002b4780002b4880002b5760002b6ea0002b8160002
-b9100002b9200002b9300002b9400002bade0002bc980002bd660002bd76
-0002bfd60002c21c0002c4a20002c7060002c98a0002cbfc0002cdcc0002
-cf820002cfac0002cfd60002cfe60002cff60002d0200002d04a0002d074
-0002d0840002d0940002d0be0002d0e80002d0f80002d1080002d1320002
-d15c0002d1860002d1960002d1a60002d1b60002d1c60002d1d60002d1e6
-0002d2100002d2200002d2300002d25a0002d2840002d2ae0002d2d80002
-d3020002d32c0002d3560002d3800002d3aa0002d3d40002d3fe0002d428
-0002d4520002d47c0002d4a60002d4d00002d4fa0002d5240002d54e0002
-d5780002d5a20002d5cc0002d5f60002d6200002d64a0002d6740002d69e
-0002d6c80002d6f20002d71c0002d7460002d7700002d79a0002d7c40002
-d7ee0002d8180002d8420002d86c0002d8960002d8c00002d8ea0002d914
-0002d93e0002d9680002d9920002d9bc0002d9e60002da100002da3a0002
-da640002da8e0002dab80002dae20002db0c0002dbac0002dbf00002dc66
-0002dc900002dcba0002dce40002dd0e0002dd380002dd620002dd8c0002
-ddb60002dde00002de0a0002de340002de5e0002de880002deb20002dedc
-0002df060002df300002df5a0002df840002dfae0002dfd80002e0020002
-e02c0002e0560002e08a0002e0be0002e0f20002e2840002e4200002e5bc
-0002e7480002e78e0002e7d40002e8420002e89e0002e8f00002e9600002
-ea380002eb040002ebdc0002eca80002ed480002ee620002ef160002ef98
-0002eff20002f0320002f1500002f29a0002f4320002f48e0002f4ec0002
-f5480002f5a40002f6580002f70e0002f7ba0002f8660002f9120002f9ca
-0002fa820002fb3a0002fb4c0002fb5e0002fb700002fb820002fb940002
-fc020002fc700002fd280002fd3a0002fd4c0002fd5e0002fd6e0002fd80
-0002fd920002fda40002fdb60002fdc80002fdda0002fe880002ff340002
-ffe20003008e00030126000301600003018a000301b4000302080003025a
-000302d6000303200003039c000303f000030474000304c60003053c0003
-0594000305fa00030650000306aa0003072800030774000307d200030836
-00030884000308d20003092a000309720003099c000309ca000309f00003
-0a2400030a5400030a8400030ad600030b4400030b9a00030c0e00030c62
-00030cd600030d1c00030d8400030dca00030e2600030e5600030e900003
-0eb600030ee600030f0c00030f3200030f6400030f9400030fe60003104c
-000310a2000311080003115c000311ca0003120c0003126c000312ae0003
-12fa0003133400031370000313aa000313e60003141a0003144c0003147c
-000314ac000314d6000314fc00031526000315540003157e000315ca0003
-160e0003164400031680000316b4000316e200031720000317500003178a
-000317b4000317e2000318080003182e0003185a000318b6000318e60003
-1916000319460003197e000319b2000319e000031a1000031a4000031a70
-00031aa000031ad400031b2a00031b5e00031bbe00031bf200031c4a0003
-1c7e00031cda00031d7800031e4600031f660003202e000320be00032154
-000323400003253c000326b400032830000329da00032b8c00032c740003
-2daa00032ea200032fb4000330d20003320800033372000334e000033676
-000337f2000339020003391200033a3e00033b7a00033cbc00033e400003
-3f1a00033f9000034046000340ec0003425c000342940003430e000343d0
-0003448a000344f2000345f80003472e000347fa00034958000349d20003
-4a4c00034b1800034bd200034c8600034ce200034d3c00034d8400034df4
-00034e7000034eba00034ef400034f3a00034f7e00034fd0000350220003
-50a40003512600035168000351a8000351de000352140003524200035270
-000352a4000352d80003531a0003535c00035398000353d40003540e0003
-54480003547a000354ac000354de000355100003554a00035584000355c6
-000356080003564a0003568c000356da000357280003576a000357ac0003
-57ec0003582c00035866000358a0000358ec0003593800035976000359b6
-000359fc00035a4200035a7e00035ad400035b1000035b4c00035b8c0003
-5bcc00035c0800035c4400035c8400035cc400035d0800035d4c00035da0
-00035e2e00035e7000035eb200035f1a00035f8200035fb400035fe60003
-601e00036056000360ec00036182000361cc00036216000362520003628e
-000362e40003633a00036384000363ce000364260003647e000364be0003
-64fe000365360003656e000365b800036602000366400003667e000366c0
-0003670200036756000367aa000367f0000368360003687c000368c20003
-69180003696e000369c400036a1a00036a6600036ab200036afe00036b4a
-00036bbe00036c3200036ca600036d1a00036d5800036d9600036dd40003
-6e1200036e5000036e8e00036ed200036f1600036f6200036fae0003700e
-0003705a00037098000370e6000371f60003724600037296000372ce0003
-73060003735c000373b2000374260003748a000374cc0003750e00037564
-000375b2000375fe0003764a0003768a000376ca000377120003775a0003
-77c6000378200003785800037890000378d000037910000379e000037adc
-00037b9c00037c8a00037ce000037d3600037d8800037ddc00037e400003
-7ea400037efa00037f5000037fc60003803c0003807e000380c000038102
-0003814400038186000381c80003821e00038274000382c60003831a0003
-83a200038424000384c400038566000385a4000385e2000386200003865c
-0003869a000386d80003871600038752000388360003892200038a380003
-8b5400038c1e00038ce800038de200038edc00038fda000390d8000391f6
-000393140003943a000395600003966200039764000397f6000398880003
-98c6000399040003995e000399b8000399f000039a2800039b3800039b48
-00039b9000039bd800039c3000039c8800039cba00039cec00039d2e0003
-9d7000039daa00039de400039e2800039e6c00039ee400039f5e00039fee
-0003a0320003a0720003a0f40003a1760003a2ce0003a2de0003a32c0003
-a37a0003a3b60003a3f20003a4380003a47e0003a4cc0003a51a0003a56a
-0003a5ba0003a6160003a6720003a7e80003a9500003a9880003a9c20003
-aa0e0003aa5a0003aaac0003aafe0003ab500003aba60003abe20003ac1e
-0003ac740003acc80003ae000003aea00003aeee0003af2e0003af680003
-b0fe0003b3820003b4460003b5dc0003b73a0003b8080003b9ae0003bc02
-0003be3a0003be800003beb20003bf5c0003c0800003c0a40003c13e0003
-c24a0003c35a0003c46a0003c5780003c6fe0003c7300003c7d20003c7fa
-0003c85c0003c8be0003c9200003c9820003c9c00003c9fe0003ca380003
-ca720003ca9e0003caea0003cb240003cb5e0003ccba0003ce0e0003ce1e
-0003cedc0003d0120003d0700003d1880003d3160003d3bc0003d5020003
-d5400003d57e0003d5bc0003d6100003d6380003d6920003d6f60003d73e
-0003d7a00003d8000003d8720003d8ee0003d96a0003d9ec0003da780003
-db040003db8e0003dc0e0003dc480003dc840003dde80003deb20003dee2
-0003df120003e04a0003e19a0003e1aa0003e2980003e36c0003e4640003
-e55a0003e6dc0003e8360003e8460003e95e0003ea0a0003eb4c0003eca2
-0003ecfe0003ee5c0003eeea0003f0900003f2020003f3160003f34e0003
-f3b20003f5620003f6cc0003f72e0003f8960003f99c0003fa520003fafe
-0003fc260003fd140003fdf40003ff34000400600004017a000402ea0004
-046400040474000405540004064a000406fa000407f6000408a2000409ac
-00040a9800040bc200040ce600040dea00040f1800041056000411c20004
-12f80004148c000416340004172c000418400004197200041a6400041a9c
-00041af200041ba000041bb000041c1200041c6e00041cd400041d200004
-1d6000041d9800041dc400041df200041e2c00041f6200041f960004201a
-000420d00004210000042184000421b4000421ec00042384000425100004
-255a00042594000425ea000426360004265c00042682000426c400042706
-0004274800042778000427b0000427e60004281c0004285e0004288e0004
-28be000429b400042ab800042aec00042b2400042b6a00042b9e00042bce
-00042c0600042c3a00042c6e00042c9e00042cce00042d0400042d3a0004
-2d6a00042d9a00042dce00042e0200042e3200042e6200042e9c00042ed0
-00042f0200042f3400042f6800042f9c00042fcc00042ffc0004302a0004
-305800043166000432d2000434060004353a0004356a000435a40004363e
-000437a800043904000439c800043adc00043b0c00043b4000043c380004
-3de800043e4000043eb800043ff400044032000440a4000440d400044104
-0004413e000441c6000441f600044226000443b6000445000004460c0004
-471a000448460004499c00044af800044c5800044d9200044f0400045064
-000450740004522a00045352000453ec0004557400045584000456800004
-58060004595e00045a1000045ae000045bec00045c9600045cce00045cde
-00045d8e00045e3400045eb000046000000460f4000461ea000462f60004
-63ce000464a80004653c0004664e000467de000468fc000469f200046a9c
-00046b4600046c1000046cb800046d8e00046e0a00046e6600046fc80004
-70fc000472980004735a0004745a00047532000476700004771c000477e6
-000478d6000479fc00047ad800047bde00047d1600047e0600047ea40004
-7f960004810600048250000484bc0004858e000486420004871000048804
-000489420004895200048a8600048b9800048ba800048cb400048de40004
-8e3800048fac000490d4000491e80004939a000495ae00049842000499fc
-00049b2800049d0800049eca0004a05c0004a1280004a2c40004a33a0004
-a3e80004a4c40004a5500004a5f20004a6940004a7780004a8b00004ab0c
-0004ac540004ac640004ac740004acd60004ad340004ad960004ae340004
-aecc0004afd00004b0be0004b0ce0004b0de0004b1780004b2120004b24e
-0004b2ca0004b33e0004b3940004b3c80004b44e0004b4da0004b5520004
-b5b00004b64a0004b6dc0004b75c0004b7de0004b8720004b8a60004b908
-0004b9ba0004bb800004bbb80004bd940004bea80004beb80004beee0004
-bf320004bf760004bfba0004bff00004c0220004c0640004c1000004c156
-0004c1fc0004c2740004c2fa0004c36a0004c3cc0004c4520004c4b20004
-c51c0004c5900004c6000004c65e0004c7040004c79c0004c8080004c898
-0004c8f60004c9640004ca0c0004cab80004cb4e0004cbb80004cc3a0004
-cc9e0004cd4a0004ce020004ceae0004cf3c0004cf980004d0040004d05a
-0004d0dc0004d15a0004d1e00004d26c0004d2c60004d3320004d3a20004
-d4120004d4820004d5060004d5960004d5fc0004d6760004d6f20004d76a
-0004d8100004d8ac0004d93c0004d99a0004da380004dab40004db460004
-dbe80004dc920004dd2a0004dd860004dddc0004de440004deea0004df92
-0004e05c0004e1020004e1640004e1bc0004e21c0004e2aa0004e3300004
-e3be0004e41e0004e4820004e4ec0004e5540004e5bc0004e63a0004e6c2
-0004e7560004e7c20004e82a0004e88e0004e9360004e9f00004ea9e0004
-eb2c0004eb8a0004ebf60004ec660004ed0c0004edb60004ee780004ef1a
-0004ef7e0004f00e0004f0800004f1100004f18e0004f20a0004f2760004
-f3040004f3600004f3be0004f4440004f4c00004f5280004f58c0004f5e0
-0004f64e0004f6b60004f7340004f7aa0004f8240004f8a40004f9000004
-f9660004f9ca0004fa6a0004fb0c0004fbc20004fc720004fcce0004fd46
-0004fda40004fe2e0004fec60004ff560004ffbc0005001a000500a80005
-011a000501ae00050246000502b6000503260005039e000503fc0005045c
-000504d60005053000050590000505ea00050646000506ae0005073c0005
-0772000507aa0005083600050860000508a20005093600050a2400050ab4
-00050aea00050b3a00050bac00050c5800050cea00050d4200050d9c0005
-0df400050e4e00050ed200050f5800050ffc000510a4000510e200051152
-000511e60005127e00051314000513be000513f000051440000514940005
-14da0005157e000516080005168e000516ee000517320005178000051820
-000518b000051950000519f600051a9c00051b6000051b9200051bbc0005
-1c4200051cf200051d2400051d4c00051e1a00051e7800051f1200051f60
-00051fc60005206e000520dc00052142000521ce00052240000522b60005
-236a000523c40005243400052470000524c200052548000525a80005264c
-0005272c00052854000529e400052a4000052a9600052dbc00052e560005
-2eb200052efa00053068000531ba000532000005330e000533a6000534b4
-000535be0005366000053748000537da000538760005396800053a680005
-3ae400053b6a00053bb200053d2400053e8000053f6400053fb400053fe8
-000540d6000541fe00054398000544c8000545de000547120005482e0005
-489c0005493000054a7000054b2600054c9000054dc000054ef20005501e
-000550ca0005519000055262000553bc0005553c0005566c000557880005
-594200055a9400055b8000055c5c00055d1e00055e8800055fd800055fe8
-00055ff800056008000560c000056176000561b2000561e8000562200005
-6256000563e2000565f6000566e0000567f80005697000056ade00056bc8
-00056cfa00056e4200056fc800057166000572ba000574a80005766e0005
-78a400057af200057bda00057cb600057dfe00057f800005806800058182
-000581c40005820e0005842a000586420005878e0005890400058b620005
-8d6400058de800058e1800058e6400058f2c00058ffc0005919000059218
-00059280000592c0000592fe000594b0000596e000059816000599f80005
-9ad400059bee00059d9a00059fa60005a0a80005a1940005a3860005a58e
-0005a6fa0005a87e0005a9de0005ab4c0005abda0005ac6a0005ad840005
-ae900005b0520005b1be0005b3ae0005b5780005b60c0005b6a80005b73e
-0005b7c60005b8ac0005b9840005bb1e0005bcb00005bcd60005bcfc0005
-bd0c0005bd3c0005bd6c0005bee60005c0880005c1320005c2140005c2d4
-0005c37e0005c4180005c4fa0005c5b80005c6940005c84a0005c9840005
-ca100005ca400005ca700005caa40005cad80005cae80005caf80005cb28
-0005cb580005cb8c0005cbc00005cbf40005cc280005cc5c0005cc900005
-ce0a0005ce1a0005ce4a0005ce7a0005ceb20005cee60005cf1a0005cf4e
-0005cf820005cfb60005cfea0005d0220005d0580005d0880005d0c80005
-d1000005d1480005d18e0005d1c20005d1f60005d2300005d2680005d308
-0005d3180005d46a0005d6320005d7d80005d9820005dace0005dbe40005
-dcf20005de080005df020005dfea0005e10c0005e2080005e2e00005e3d0
-0005e48c0005e53e0005e6080005e67a0005e7200005e7b00005e8140005
-e9220005e9880005ea360005eb2c0005eb940005ebfc0005ecac0005ee86
-0005ef8a0005f00a0005f0480005f0f40005f1820005f26a0005f3020005
-f3680005f4660005f5280005f5e20005f6200005f6b00005f7b20005f846
-0005f88a0005f9a80005fad20005fcb40005fe760005ffac000600da0006
-01da000602020006022a0006026000060292000602be000602e60006030e
-0006033c0006039a000604080006044000060478000604a8000604ce0006
-0502000605380006055e00060584000605b2000605e00006060c00060682
-000606aa0006070c00060732000607580006077e000607a4000607d40006
-0804000608340006086e0006089e000608d400060904000609360006095c
-00060982000609b6000609ec00060a1c00060a4c00060a7200060a980006
-0abe00060aec00060b2000060ba600060bea00060c2400060c5800060c9c
-00060cd600060d1000060d3600060d6000060dac00060dee00060e140006
-0e4200060e6800060e8e00060ece00060f0000060f3000060f6000060f86
-00060fac00060fdc0006100c00061032000610580006107e000610a40006
-10ca000610f000061118000611a0000611ca0006123e00061266000612dc
-000613040006136600061398000613ca000613fa00061432000614640006
-1492000614cc000614f40006155400061596000615c6000615f200061622
-000616520006167a000616a2000616ca0006172c00061754000617b20006
-17f60006183a0006186a000618a0000618c6000618ee000619140006193c
-000619620006198a000619b2000619dc00061a0200061a2800061a4e0006
-1a8000061aa800061b2e00061b5800061bc200061bf200061c2200061c48
-00061c6e00061cc600061cf600061d3200061d5c00061d8c00061dbc0006
-1df000061e2400061e5400061e9400061ece00061f1600061f3c00061f62
-00061f8800061fae00061fd4000620140006205400062090000620c00006
-20f0000621200006215000062188000621c000062200000622400006227a
-000622b4000622f00006232e00062378000623c2000624080006244e0006
-2490000624d20006250200062532000625660006259a000625d40006260e
-0006265a000626a6000626fe00062756000627ae0006280c0006283c0006
-286c000628a2000628d80006290e0006294a0006297e000629b200062a06
-00062a5a00062aae00062b0200062b5600062baa00062c0200062c5a0006
-2c8800062cb600062ce800062d1a00062d6000062da600062dd800062e0a
-00062e5c00062eb400062ef800062f3c00062f8000062fc4000630180006
-306c0006309c000630cc000631020006313800063176000631bc00063210
-0006325a000632ac000632fe0006335e000633be000633ee000634200006
-345a00063494000634e60006353a00063584000635cc0006360e00063678
-000636c6000637120006374400063776000637aa000637de000638140006
-384a00063888000638be000638f00006392c00063982000639d800063a36
-00063a9400063aea00063b4000063b7400063ba400063be800063c1e0006
-3c4e00063c9200063cd000063d0800063d4000063d7600063db200063de2
-00063e1e00063e5e00063ea400063eee00063f3a00063f8600063fdc0006
-403200064080000640ce0006411c0006416c000641c8000642240006427c
-000642d4000643280006437c000643be0006440000064448000644900006
-44d8000645260006456a000645ae000646140006467a000646e000064746
-000647ac000648120006487c000648e60006492e00064976000649be0006
-4a0600064a5200064a9e00064af200064b3e00064b8200064bd000064c38
-00064ca000064d1000064d8000064de800064e5000064e9000064ece0006
-4f1800064f4200064f8800064fc00006500e0006503e0006506e000650aa
-000650de000651040006515800065196000651ea000652d0000653f80006
-543a00065460000654b6000654e60006552800065570000655be00065608
-000656580006567e000657660006584a0006599c000659ca000659f80006
-5a8c00065b1200065b4000065bca00065bfa00065c2a00065c7800065cc6
-00065daa00065e8600065fca00065ffa0006602a000660c0000661480006
-6178000661a8000661d80006626800066298000662c80006631a00066362
-000663b80006644e000664e60006655a000665ac000665d60006662c0006
-6660000666aa000666e20006673200066770000667bc000667e20006685e
-000668b0000669c200066bcc00066d8000066f0200067074000673160006
-75e6000677a6000678ec00067b4600067c8800067e9e00067ef000067f40
-00067f9600067fec0006804e000680d600068324000684b6000686c20006
-87de0006899200068b1400068bd400068cb600068d1e00068d8000068df6
-00068e5e00068f0a00068f7a0006900a0006911e000691e20006922e0006
-92c40006937000069414000694be000695080006954a000695c000069628
-000696b800069766000697d0000698340006989a00069954000699ea0006
-9a4800069a7200069a9c00069aac00069abc00069b7e00069c8200069e8c
-00069fe200069ff20006a0a20006a1860006a1e60006a1f60006a2520006
-a2b00006a3d00006a4be0006a4ce0006a4de0006a4ee0006a4fe0006a5e4
-0006a6e40006a8bc0006aa780006ab7e0006abf80006ac720006ad240006
-ad340006ae420006ae520006ae620006af240006b0580006b1440006b154
-0006b1640006b1740006b2da0006b4460006b5720006b5820006b5920006
-b5a20006b5b20006b6940006b6a40006b8060006b9100006ba0e0006bb46
-0006bc180006bc960006bd140006be340006beb00006befc0006bf880006
-c09c0006c0f00006c2320006c2f20006c3be0006c4b40006c5be0006c670
-0006c7d60006c83c0006c9000006cb020006cc900006ce0e0006cf3e0006
-d1f00006d3320006d4600006d5d80006d7500006d8d00006da5e0006dc10
-0006dc7e0006dde20006df1a0006e01e0006e1540006e2860006e3560006
-e4260006e5820006e65c0006e6fc0006e8000006e92a0006ea280006eba8
-0006ed120006ee500006efc80006f1140006f1f60006f25e0006f3000006
-f3a00006f49e0006f6060006f7400006f8d40006fa1e0006fb020006fb60
-0006fc660006fcfc0006fdbe0006fe640006fea400070050000701220007
-01e800070310000704b0000705bc00070614000707ac0007083a0007084c
-0007087c000708ac000708e40007091c000709520007098e000709c40007
-0a0000070b6e00070bb800070c5200070cea00070d6400070de800070e4e
-00070efa00070f46000710660007111c000711f20007122a000712680007
-12dc000713d6000714f4000715f6000716380007167a000716e8000716f8
-000717080007171800071728000717380007174800071758000717680007
-17780007178800071798000717980007191c0007192c000719ec00071ab2
-00071be800071dde00071fe0000721dc00072412000726120007267e0007
-27900007292200072a7a00072b2c00072b7000072c0e00072d3e00072d8e
-00072e2400072f6000072f70000731260007325a000732aa000733000007
-33c20007340600073448000734ce0007352c0007361e000736ac000736e2
-0007375c000737d4000738240007393000073a2600073ad000073afa0007
-3b2400073b4e00073b7800073bb800073bf800073c3000073c6800073cb2
-00073cfc00073d3c00073d7c00073dc600073e1000073e5000073e900007
-3eea00073f4400073f7e00073fb800073ffc0007404000074084000740c8
-0007411c00074170000741bc00074208000742460007428a000742da0007
-432a00074384000743e20007440c00074436000744d00007456a000745ae
-000745f2000747080007471800074760000747a8000747fa0007484c0007
-48b60007490a00074956000749b400074a3e00074aa200074ae600074b30
-00074b9800074be200074c2200074c6a00074ca600074ce200074d1e0007
-4d5800074d9a00074ddc00074e1c00074e5c00074ea600074ef000074f46
-00074f9e00074fec0007503a0007507c000750ca0007510c000751560007
-5198000751dc0007523800075294000752e00007532c00075376000753c0
-000753fe0007543c000754ba0007553800075572000755ac000756460007
-56e0000757b400075888000758e400075940000759b400075a2800075b86
-00075b9600075c8000075c9000075cc600075cfc00075d3600075d700007
-5dac00075de800075e2e00075e7400075fda00076190000762dc0007649a
-00076610000767b8000768e8000769ee00076c0c00076d5000076ee60007
-706e000770ec0007723000077438000774cc00077560000776b4000777de
-0007795800077a9800077c0400077cf200077ebc00078050000780d20007
-8204000782ee0007845600078538000786ee000787e00007894200078a7e
-00078b7200078d3600078ebe00079062000791c600079362000795200007
-96a600079742000798b6000799a800079a9000079c1000079d6200079e82
-0007a01a0007a1f00007a37e0007a4280007a4de0007a6900007a7340007
-a7c20007a80e0007a85a0007a8d20007a9b00007aa2a0007aacc0007ab20
-0007ac840007adb00007aec20007afc40007b08c0007b2000007b3400007
-b5660007b6100007b73a0007b83e0007b9de0007baca0007bbc40007bcc2
-0007bda80007bec20007c07c0007c22a0007c3980007c4100007c4840007
-c5a20007c6260007c7280007c8b40007ca2c0007cb620007cc6c0007cde2
-0007cf5a0007d14c0007d33a0007d5000007d5740007d6240007d6da0007
-d78a0007d8480007d9420007da460007db400007dc4c0007dcd40007dd62
-0007ddea0007de7e0007df5a0007e0500007e1340007e22a0007e2be0007
-e37a0007e40e0007e4cc0007e5bc0007e6c40007e7c20007e8d60007e9f8
-0007eb0c0007ec4c0007ed860007eea80007efbc0007f1000007f2540007
-f4680007f61a0007f6ce0007f7ea0007f8c00007f9de0007fabc0007fc50
-0007fd0a0007fda60007fe980007ff800008006c000800ea000801e40008
-03220008044e00080482000804c6000804d600080576000806180008070e
-000807fa000808d4000809ac00080b0a00080c6a00080d0800080d9e0008
-0ddc00080e1c00080e5a00080e9a00080ef400080f4c00080fa60008100a
-0008109600081292000812e20008140e0008149400081514000815ee0008
-16c2000817c6000819b200081aca00081b3a00081bca00081c8c00081d5e
-00081dca00081e4800081f9c00081fe2000820280008210c000821480008
-21a6000821e4000822160008225a0008229c000822cc000100000d3500f2
-003c009d000700020010002f005600000468041d0005000200>
-<0000003a02be0000000300000000006a00000000000300000001000a006a
-0000000300000002000e00740000000300000003005e0082000000030000
-0004000a00e00000000300000005001800ea0000000300000006000e0102
-000000030000000700ba01100000000300000008003001ca000000030000
-0009008a01fa000000030000000d02aa028400010000000000000035052e
-000100000000000100050563000100000000000200070568000100000000
-0003002f056f00010000000000040005059e0001000000000005000c05a3
-0001000000000006000705af0001000000000007005d05b6000100000000
-00080018061300010000000000090045062b000100000000000d01550670
-0003000104030002000c07c50003000104050002001007d1000300010406
-0002000c07e10003000104070002001007ed0003000104080002001007fd
-0003000104090000006a080d0003000104090001000a0877000300010409
-0002000e08810003000104090003005e088f0003000104090004000a08ed
-0003000104090005001808f70003000104090006000e090f000300010409
-000700ba091d0003000104090008003009d70003000104090009008a0a07
-000300010409000d02aa0a9100030001040a0002000c0d3b00030001040b
-000200100d4700030001040c0002000c0d5700030001040e0002000c0d63
-0003000104100002000e0d6f000300010413000200120d7d000300010414
-0002000c0d8f000300010415000200100d9b0003000104160002000c0dab
-0003000104190002000e0db700030001041b000200100dc500030001041d
-0002000c0dd500030001041f0002000c0de10003000104240002000e0ded
-00030001042a0002000e0dfb00030001042d0002000e0e0900030001080a
-0002000c0e170003000108160002000c0e23000300010c0a0002000c0e2f
-000300010c0c0002000c0e3b00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0052006500670075006c00610072004d006f006e006f
-0074007900700065003a0041007200690061006c00200052006500670075
-006c00610072003a00560065007200730069006f006e00200035002e0030
-003100200028004d006900630072006f0073006f00660074002900410072
-00690061006c00560065007200730069006f006e00200035002e00300031
-0041007200690061006c004d00540041007200690061006c002000690073
-00200061002000740072006100640065006d00610072006b0020006f0066
-00200054006800650020004d006f006e006f007400790070006500200043
-006f00720070006f0072006100740069006f006e00200069006e00200074
-0068006500200055006e0069007400650064002000530074006100740065
-007300200061006e0064002f006f00720020006f00740068006500720020
-0063006f0075006e00740072006900650073002e0054006800650020004d
-006f006e006f007400790070006500200043006f00720070006f00720061
-00740069006f006e004d006f006e006f0074007900700065002000540079
-00700065002000440072006100770069006e00670020004f006600660069
-006300650020002d00200052006f00620069006e0020004e006900630068
-006f006c00610073002c0020005000610074007200690063006900610020
-005300610075006e0064006500720073002000310039003800320059006f
-00750020006d006100790020007500730065002000740068006900730020
-0066006f006e007400200074006f00200064006900730070006c00610079
-00200061006e00640020007000720069006e007400200063006f006e0074
-0065006e00740020006100730020007000650072006d0069007400740065
-006400200062007900200074006800650020006c006900630065006e0073
-00650020007400650072006d007300200066006f00720020007400680065
-002000700072006f006400750063007400200069006e0020007700680069
-006300680020007400680069007300200066006f006e0074002000690073
-00200069006e0063006c0075006400650064002e00200059006f00750020
-006d006100790020006f006e006c0079002000280069002900200065006d
-0062006500640020007400680069007300200066006f006e007400200069
-006e00200063006f006e00740065006e0074002000610073002000700065
-0072006d0069007400740065006400200062007900200074006800650020
-0065006d00620065006400640069006e0067002000720065007300740072
-0069006300740069006f006e007300200069006e0063006c007500640065
-006400200069006e0020007400680069007300200066006f006e0074003b
-00200061006e006400200028006900690029002000740065006d0070006f
-0072006100720069006c007900200064006f0077006e006c006f00610064
-0020007400680069007300200066006f006e007400200074006f00200061
-0020007000720069006e0074006500720020006f00720020006f00740068
-006500720020006f00750074007000750074002000640065007600690063
-006500200074006f002000680065006c00700020007000720069006e0074
-00200063006f006e00740065006e0074002ea9203230303620546865204d
-6f6e6f7479706520436f72706f726174696f6e2e20416c6c205269676874
-732052657365727665642e417269616c526567756c61724d6f6e6f747970
-653a417269616c20526567756c61723a56657273696f6e20352e30312028
-4d6963726f736f667429417269616c56657273696f6e20352e3031417269
-616c4d54417269616c20697320612074726164656d61726b206f66205468
-65204d6f6e6f7479706520436f72706f726174696f6e20696e2074686520
-556e697465642053746174657320616e642f6f72206f7468657220636f75
-6e74726965732e546865204d6f6e6f7479706520436f72706f726174696f
-6e4d6f6e6f7479706520547970652044726177696e67204f666669636520
-2d20526f62696e204e6963686f6c61732c20506174726963696120536175
-6e646572732031393832596f75206d617920757365207468697320666f6e
-7420746f20646973706c617920616e64207072696e7420636f6e74656e74
-206173207065726d697474656420627920746865206c6963656e73652074
-65726d7320666f72207468652070726f6475637420696e20776869636820
-7468697320666f6e7420697320696e636c756465642e20596f75206d6179
-206f6e6c792028692920656d626564207468697320666f6e7420696e2063
-6f6e74656e74206173207065726d69747465642062792074686520656d62
-656464696e67207265737472696374696f6e7320696e636c756465642069
-6e207468697320666f6e743b20616e6420286969292074656d706f726172
-696c7920646f776e6c6f6164207468697320666f6e7420746f2061207072
-696e746572206f72206f74686572206f7574707574206465766963652074
-6f2068656c70207072696e7420636f6e74656e742e004e006f0072006d00
-61006c006f00620079010d0065006a006e00e9006e006f0072006d006100
-6c005300740061006e0064006100720064039a03b103bd03bf03bd03b903
-ba03ac00a90020003200300030003600200054006800650020004d006f00
-6e006f007400790070006500200043006f00720070006f00720061007400
-69006f006e002e00200041006c006c002000520069006700680074007300
-2000520065007300650072007600650064002e0041007200690061006c00
-52006500670075006c00610072004d006f006e006f007400790070006500
-3a0041007200690061006c00200052006500670075006c00610072003a00
-560065007200730069006f006e00200035002e0030003100200028004d00
-6900630072006f0073006f0066007400290041007200690061006c005600
-65007200730069006f006e00200035002e00300031004100720069006100
-6c004d00540041007200690061006c002000690073002000610020007400
-72006100640065006d00610072006b0020006f0066002000540068006500
-20004d006f006e006f007400790070006500200043006f00720070006f00
-72006100740069006f006e00200069006e00200074006800650020005500
-6e0069007400650064002000530074006100740065007300200061006e00
-64002f006f00720020006f007400680065007200200063006f0075006e00
-740072006900650073002e0054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-4d006f006e006f0074007900700065002000540079007000650020004400
-72006100770069006e00670020004f006600660069006300650020002d00
-200052006f00620069006e0020004e006900630068006f006c0061007300
-2c0020005000610074007200690063006900610020005300610075006e00
-64006500720073002000310039003800320059006f00750020006d006100
-7900200075007300650020007400680069007300200066006f006e007400
-200074006f00200064006900730070006c0061007900200061006e006400
-20007000720069006e007400200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-200074006800650020006c006900630065006e0073006500200074006500
-72006d007300200066006f00720020007400680065002000700072006f00
-6400750063007400200069006e0020007700680069006300680020007400
-680069007300200066006f006e007400200069007300200069006e006300
-6c0075006400650064002e00200059006f00750020006d00610079002000
-6f006e006c0079002000280069002900200065006d006200650064002000
-7400680069007300200066006f006e007400200069006e00200063006f00
-6e00740065006e00740020006100730020007000650072006d0069007400
-7400650064002000620079002000740068006500200065006d0062006500
-6400640069006e0067002000720065007300740072006900630074006900
-6f006e007300200069006e0063006c007500640065006400200069006e00
-20007400680069007300200066006f006e0074003b00200061006e006400
-200028006900690029002000740065006d0070006f007200610072006900
-6c007900200064006f0077006e006c006f00610064002000740068006900
-7300200066006f006e007400200074006f00200061002000700072006900
-6e0074006500720020006f00720020006f00740068006500720020006f00
-750074007000750074002000640065007600690063006500200074006f00
-2000680065006c00700020007000720069006e007400200063006f006e00
-740065006e0074002e004e006f0072006d0061006c004e006f0072006d00
-610061006c0069004e006f0072006d0061006c004e006f0072006d00e100
-6c004e006f0072006d0061006c0065005300740061006e00640061006100
-720064004e006f0072006d0061006c004e006f0072006d0061006c006e00
-79004e006f0072006d0061006c041e0431044b0447043d044b0439004e00
-6f0072006d00e1006c006e0065004e006f0072006d0061006c004e006f00
-72006d0061006c004e0061007600610064006e006f0074006801b001a103
-00006e00670041007200720075006e00740061004e006f0072006d006100
-6c004e006f0072006d0061006c004e006f0072006d0061006c004e006f00
-72006d0061006c000000b900540328b326181fd0bc032900e00329000203
-29b22b1d1fb90327031db23b1f40b80323b31215320f412d03200001002f
-0320000100200320006f032000af032000bf03200004005f031e00010010
-031e007f031e0080031e00af031e00bf031e00d0031e00060000031e0010
-031e0020031e006f031e009f031e00e0031e0006031d031cb2201f104127
-0319007f03190002000f031700ef031700ff03170003001f0317002f0317
-004f0317005f0317008f0317009f03170006000f0317005f0317006f0317
-007f031700bf031700f00317000600400317b2923340b80317b28b3340b8
-0317b36a6c3240b80317b2613340b80317b35c5d3240b80317b357593240
-b80317b34d513240b80317b344493240b80317b23a3340b80317b3313432
-40b80317b32e423240b80317b3272c3240b80317b312253280b80317b30a
-0d32c04116031600d00316000200700316000102c4000f0101001f00a003
-1500b0031500020306000f0101001f00400312b32426329fbf0304000103
-0203010064001fffc00301b20d1132410a02ff02ef0012001f02ee02ed00
-64001fffc002edb30e11329f414a02e200af02e200bf02e2000302e202e2
-02e102e1007f02e00001001002e0003f02e0009f02e000bf02e000cf02e0
-00ef02e0000602e002e002df02df02de02de000f02dd002f02dd003f02dd
-005f02dd009f02dd00bf02dd00ef02dd000702dd02dd001002dc00010000
-02dc0001001002dc003f02dc000202dc02dc001002db000102db02db000f
-02da000102da02daffc002d3b2373932b9ffc002d3b22b2f32b9ffc002d3
-b21f2532b9ffc002d3b2171b32b9ffc002d3b2121632b802d2b2f9291fb9
-0326031cb23b1f40bb0322003e00330322b225311fb80318b23c691fb802
-e3b3202b1fa0413002d400b002d40002000002d4001002d4002002d40050
-02d4006002d4007002d40006006002d6007002d6008002d6009002d600a0
-02d600b002d60006000002d6001002d6002002ca002002cc002002d60030
-02d6004002d6005002d6000802d0b2202b1fb802cfb226421f411602ce02
-c70017001f02cd02c80017001f02cc02c60017001f02cb02c50017001f02
-c902c5001e001f02ca02c6b21e1f00410b02c6000002c7001002c6001002
-c7002f02c5000502c1b324121fff411102bf0001001f02bf002f02bf003f
-02bf004f02bf005f02bf008f02bf000602bf0222b2641f12410b02bb00ca
-0800001f02b200e90800001f02a600a20800406a1f402643493240204349
-3240263a3d3240203a3d329f209f26024026969932402096993240268e92
-3240208e92324026848c324020848c3240267a813240207a813240266c76
-3240206c76324026646a324020646a3240265a5f3240205a5f3240264f54
-3240204f5432b8029eb724271f374f6b0120410f02770030027700400277
-00500277000402770277027700f90400001f029bb22a2a1fb8029a402b29
-2a1f80ba0180bc0180520180a201806501807e01808101803c01805e0180
-2b01801c01801e0180400180bb0138000100800140b40180400180bb0138
-00010080013940180180ca0180ad01807301802601802501802401802001
-3740b80221b2493340b80221b2453340b80221b341423240b80221b33d3e
-320f410f0221003f0221007f0221000300bf022100cf022100ff02210003
-00400221b320223240b80221b3191e3240b80222b32a3f3240b80221b32e
-3a326f414802c3007f02c3008f02c300df02c30004002f02c3006002c300
-cf02c30003000f02c3003f02c3005f02c300c002c300ef02c300ff02c300
-0600df02220001008f02220001000f0222002f0222003f0222005f022200
-7f022200ef0222000600bf022100ef02210002006f0221007f022100af02
-210003002f0221003f0221004f0221000302c302c3022202220221022140
-1d101c102b1048038f1c010f1e014f1eff1e023700161600000012110811
-b8010db6f70df8f70d00094109028e028f001d001f0290028f001d001f02
-8fb2f91d1fb80198b226bb1f41150197001e0401001f013900260125001f
-013800730401001f0135001c0801001f0134001c02ab001f0132b21c561f
-b8010fb2262c1fba010e001e0401b61ff91ce41fe91cb80201b61fe81cbb
-1fd720b80401b21fd51cb802abb61fd41c891fc92fb80801b21fbc26b801
-01b21fba20b80201b61fb91c381fadcab80401b21f8126b8019ab21f7e26
-b8019ab61f7d1c471f6b1cb80401b21f6526b8019ab21f5e73b80401400f
-1f52265a1f481c891f441c621f4073b80801b61f3f1c5e1f3c26b8019ab2
-1f351cb80401b61f301cbb1f2b1cb80401b61f2a1c561f291cb80101b21f
-231eb80401b21f5537b80168402c07960758074f07360732072c0721071f
-071d071b071408120810080e080c080a080808060804080208000814b8ff
-e0402b000001001406100000010006040000010004100000010010020000
-01000200000001000002010802004a00b013034b024b5342014bb0c06300
-4b6220b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807
-ff52b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ff
-b101018e851bb0124358b900010111858d1bb900010128858d5959001816
-763f183f123e113946443e113946443e113946443e113946443e11394660
-443e11394660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b2b
-182b1db0964b5358b0aa1d59b0324b5358b0ff1d594bb09353205c58b901
-f201f04544b901f101f045445958b9033e01f2455258b901f2033e445959
-4bb8015653205c58b9002001f14544b9002601f145445958b9081e002045
-5258b90020081e4459594bb8019a53205c58b9002501f24544b9002401f2
-45445958b909090025455258b9002509094459594bb8040153205c58b173
-244544b1242445445958b917200073455258b9007317204459594bb80401
-53205c58b1ca254544b1252545445958b9168000ca455258b900ca168044
-59594bb03e53205c58b11c1c4544b11e1c45445958b9011a001c455258b9
-001c011a4459594bb05653205c58b11c1c4544b12f1c45445958b9018900
-1c455258b9001c01894459594bb8030153205c58b11c1c4544b11c1c4544
-5958b90de0001c455258b9001c0de04459592b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65
-422b2b01b33b59635c456523456023456560234560b08b766818b0806220
-20b163594565234520b003266062636820b003266165b059236544b06323
-4420b13b5c4565234520b003266062636820b003266165b05c236544b03b
-2344b1005c455458b15c406544b23b403b4523614459b347503437456523
-456023456560234560b089766818b080622020b134504565234520b00326
-6062636820b003266165b050236544b034234420b147374565234520b003
-266062636820b003266165b037236544b0472344b10037455458b1374065
-44b24740474523614459004b5342014b5058b108004259435c58b1080042
-59b3020b0a124358601b2159421610703eb0124358b93b21187e1bba0400
-01a8000b2b59b00c2342b00d2342b0124358b92d412d411bba0400040000
-0b2b59b00e2342b00f2342b0124358b9187e3b211bba01a80400000b2b59
-b0102342b0112342002b7475737500184569444569444569447373737374
-757374752b2b2b2b74752b2b2b2b2b737373737373737373737373737373
-737373737373737373732b2b2b45b0406144737400004bb02a534bb03f51
-5a58b1070745b040604459004bb03a534bb03f515a58b10b0b45b8ffc060
-4459004bb02e534bb03a515a58b1030345b040604459004bb02e534bb03c
-515a58b1090945b8ffc06044592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b752b2b2b2b2b2b2b435c58b9008002bbb301401e017400735903b01e4b
-5402b0124b545ab012435c5a58ba009f02220001007359002b7473012b01
-732b2b2b2b2b2b2b2b737373732b2b2b2b2b002b2b2b2b2b2b0045694473
-456944734569447374754569447345694445694445694473744569444569
-44732b2b2b2b2b732b002b732b74752b2b2b2b2b2b2b2b2b2b2b2b2b2b73
-7475732b7374757374752b2b2b742b2b000000>
-[15785 15901 16277 16325 16277 16273 15933 16169 16277 15721 16361 15561 15973
-16029 16305 15693 16345 16249 15893 15629 16365 15481 16245 16249 16357 16337
-15821 15749 16345 15937 16257 16033 19077 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-3 4064 66 <0001ffe1fe69048afeeb0003001a400c013f00021a050019044341182b4e
-10e410e6002f4ded3130033521151f04a9fe69828200>ArialMT AddT42Char 
-3 5440 70 <00010050ffe803ed043e001a015ab1020243545840340e7f0f010f0b0140
-0050007000030004121c0b07181c040b010e1507080e0e0255070c0d0d02
-55070c0c0c025507100b0b0255072f2b2b2b2bcdd4c6003fed3fed10c45d
-3210c45d3231301b4047090c011f1c4313431753135317601360179b029b
-039a0da410a41a0c080d190a6a0269036a05750c700d800da60cb509b60a
-b50c0c160c860ce302030e225f0f6f0f7f0f030f01b802aa407930004000
-5000600070009000a000e000f00009000f0f0b000004121c0b07181c040b
-1c0f010f240e080d0d06550e221b000100240b2b1f010100010101400b0b
-065501401010065501480c0c0655011a0d0d065501491c1524cf07011f07
-3f0702070e0b0b0655070a1010065507120c0c065507311b34c4182b10f6
-2b2b2b5d71ed10f62b2b2b2b5d724b53234b515a58b90001ffc03859ed72
-f42bed72003fed3fed12392f11392f105de4105de43130005d71015d7159
-011706062322001134123633321617072626232206151416333236033cb1
-1defaedafef772e989addc1faf197f5a88aaa4846a8e018517b7cf011d01
-0aac010281afa11b6b6cc3d3d6c28200>ArialMT AddT42Char 
-3 5876 71 <00020046ffe803df05ba0011001d015540a40a02040d250d340d440d0535
-14351c5702540a5214531c6702640565096314601cc01fd405d513dd19e5
-13e514ef17eb19e51de01fff1f161f1f2b1a3c163c1a4b1a701f901f072e
-02240d2e163a02350d4b02450d4614491c570a560d670de506e716fa01f4
-0e100115030e0b100f001b1c0b0711000a151c030b1833010025110f2510
-10d011011011401160118011041f400b0b02551f400d0d02551112101002
-5511b8fff440110f0f025511060e0e025511180d0d025511b8fff2400b0b
-0b0655110e1010065511b8ffeeb40c0c065511b8fff840420d0d06551174
-1224bf07cf07df07ff07041f073f074f0703071e0b0b025507180c0c0255
-071e0d0d0255070c0b0b0655070c0d0d0655071a0c0c065507191e345018
-2b4e10f42b2b2b2b2b2b5d714dedfd2b2b2b2b2b2b2b2b2b2b5d713c10ed
-10fd3ce4003fed3f3c3fed3f3c11391112393130005d01715d0071213506
-232226263534123633321617113311011416333236353426232206033865
-c47fd5756ad48360962fb3fd20ac7576a5a87b78a1869e8cfba39f01038a
-5141020efa460212cccac1c6daccc400>ArialMT AddT42Char 
-3 6312 72 <0002004bffe8041e043e0015001d015340171f001c150255035d055d0955
-0b65036b056f09650b0815b8ffe4b40d0d065511b8ffe440520d0d06551d
-1c0d0d06552712d905fa14f61a0431123a19311c41124d1a411c51125c19
-521c61126d1a611c78067815f602f618100016010f0d1717501660167016
-03161c0f9010a010021010041b1c0a0700ba02aa0001ffc0b41010025501
-b8ffc04010101006551001010195131c040b17400db8ffdcb40d0d02550d
-b8ffeeb40d0d06550db8ffeab40c0c06550db8ffc04009272a34b00d010d
-1a1fb8ffc0b32526341fb8ffc040411e2334301f011f163310240740242a
-341f073f074f070307200b0b025507180c0c0255071c0d0d0255070e0b0b
-0655071c0c0c065507160d0d065507191e3437182b4e10f42b2b2b2b2b2b
-5d2b4dfde44e10712b2bf6712b2b2b2b4ded003fedfd5d2b2be43fed1239
-2f5d3cfd713c011112393912393130015d005d2b2b2b0171720117060623
-22001110003332001114072116163332360121262726232206035eba2cee
-b9e9feef0114dcd5010e01fce80ab285638cfdda02510c3856897ca90156
-17a3b4011f0103010c0128fedefef91020afba680195864368a6>ArialMT AddT42Char 
-3 6758 73 <000100130000028005d30017010d401e1409010f192f193019401970199b
-0c9c0da90d081a0d280db019c0190419b8ffc040281a1f341d080d030c0f
-1c0a0115022b1413040306000a9f140114ff134004172504000302920101
-00b8ffc0b331383400b8ffc0402b1c1f3490000119400f0f025519400d0e
-025500141010025500280f0f025500220e0e0255002c0d0d025500b8fff2
-400b0c0c025500140b0b065500b8ffeab41010065500b8ffe6b40f0f0655
-00b8fffab70c0c065500a31819bc01ba002100f6010a00182b2bf62b2b2b
-2b2b2b2b2b2b2b2b5d2b2b3c10f43c103ced10eded5d003f3f3c3c3cfd3c
-3fed391139313043794014101106090706080602061009121b0011060f1b
-012b012b2a8181012b715d00723311233533353437363633321707262322
-06151533152311b29f9f131a83764c5c1b38325244cfcf039a8c716b3446
-57129d0a4660628cfc66>ArialMT AddT42Char 
-3 7098 74 <00020042fe5103ea043e001e002a016f40600b0b05142c0b25144c0b4514
-06091d191d2c0b26142c23390b36144a0b46145607580b680bfa0af5150e
-2e232c273e233e274c27902ca02c07362136293f2c460b46214529542154
-29690763216329602c802cda27e821ee23ef271117160615b802b1b4281c
-130701b802aa401020003000600070008000c000d0000700b8027d403205
-1c1c0f0a45221c0c0a16153325330a251818d01701101740176017801704
-2c400b0c02552c400d0d025517121010025517b8fff440110f0f02551706
-0e0e025517160d0d025517b8ffea400b0b0b065517121010065517b8ffee
-b40c0c065517b8fffc404a0d0d065517740f012500221f24bf0fcf0fdf0f
-ff0f041f0f3f0f4f0f030f200b0b02550f1a0c0c02550f220d0d02550f1c
-0b0b06550f0c0d0d06550f1a0c0c06550f192b2c74213450182b2b4ef42b
-2b2b2b2b2b5d714dedf4ed10fd2b2b2b2b2b2b2b2b2b2b5d713c10fde4f6
-3c003fede43fedfd5de43fede43f3c3130015d71005d7117171617163332
-363736270623220235341236333217353311140606232226131416333236
-35342623220666af0b3243747d88180e0176b0dbf06ed18dbc7aa665dba0
-beea99a67d7ca8ad7a78a8581a512532645a37b08b013cdd9801018c9880
-fc6af8cf78ab032ad1c0bfccc3c6c300>ArialMT AddT42Char 
-3 8014 76 <000200880000013c05ba0003000700cd405e09360b0b02554f099009a009
-b009c009df09f0090700091f09700980099f09b009c009df09e009ff090a
-1f09010001070402030906037e0100060506040a0607250500049f04a004
-b004c004e00406c004f0040200042004d004e0040404b8fff8b410100255
-04b8fffa40170e0e025504040c0c0255040a0b0b025504140b0b065504b8
-ffeab41010065504b8fffeb40d0d065504b8fffc400a0c0c0655044e0847
-50182b10f62b2b2b2b2b2b2b2b5d71723cfd3c003f3f3c3fed0111123939
-111239393130015d72712b133533150311331188b4b4b404ebcfcffb1504
-26fbda00>ArialMT AddT42Char 
-3 9202 79 <000100830000013705ba000300e3b605360b0b025505b8ffc0b337383405
-b8ffc0b334353405b8ffc0b330313405b8ffc0b322253405b8ffc0402515
-17340f051f059f05df05044f05df05f005031f0570058005ff0504010000
-0a0203250100b8ffc0b337383400b8ffc040153335349f0001c000f00002
-00002000d000e0000400b8fff8b41010025500b8fffa401d0e0e02550004
-0c0c0255000a0b0b025500140b0b065500081010065500b8fffeb40d0d06
-5500b8ffffb40c0c065500b8fffc400a0c0c0655004e044750182b10f62b
-2b2b2b2b2b2b2b2b5d71722b2b3cfd3c003f3f3130015d71722b2b2b2b2b
-2b3311331183b405bafa4600>ArialMT AddT42Char 
-3 10014 81 <00010087000003e6043e0016017d40130503061302a810b810e303e713f0
-03f6130604b8fff0403c0b0d347910019810d018e018ff18042008140e14
-16121c05070106160d0a0d0e0c0e2418401010025518400b0b02550b2810
-1002550b140e0e02550bb8ffec40110d0d02550b040c0c02550b220b0b02
-550bb8fff4400b0b0b06550b14101006550bb8fff9400b0d0d06550b0a0f
-0f06550bb8fff640120c0c06550b40333634ff0b01ff0b010b4e18b8ffc0
-401a343634b018f018027018a018b018c01804180302331516250100b8ff
-f6b41111025500b8fffab41010025500b8fffa40170e0e025500040c0c02
-55000a0b0b025500040b0b065500b8fffa40110f0f065500020c0c065500
-040d0d065500b8ffc04012333634f0000100002000d000e00004004e1710
-f65d712b2b2b2b2b2b2b2b2b2b3cfd3cf43c105d712bf65d712b2b2b2b2b
-2b2b2b2b2b2b2b2bed3c103c003f3c3f3fed113901123931304379401606
-11090a080a070a0306102611060e1b010f0a121b01002b012b2b2a81015d
-71002b5d71331133153633321616171615112311342626232206151187a2
-75dd60a150100ab42a6b4873a7042697af45704d327dfd7302866e6d4192
-ccfdbc00>ArialMT AddT42Char 
-3 10468 82 <00020044ffe80427043e000d0019016bb615180d0d065513b8ffe8b40d0d
-06550fb8ffe840730d0d065519180d0d065512070a190c47064808560659
-08670669080834103a123a16351845104b124b1645185c055c0952105d12
-5d1652186d056d0964106d126d1664187701150906050d5b035405540a5b
-0c6c036505650a6c0c0a171c0407111c0b0b14241b400d0d02551b400b0b
-025507b8ffea40110f0f025507180d0d025507100b0b025507b8fff0b40b
-0b065507b8fff0b40d0d065507b8fff0b40f0f065507b8fff0b40c0c0655
-07b8ffc04013242534300701000710072007030731df1b011bb8ffc04049
-1e2334301b011b0e24000c0e0f025500120d0d0255000c0c0c0255001c0b
-0b0255000e0b0b0655000e0d0d0655000c1010065500160c0c0655004024
-25341f003f000200311a3437182b10f65d2b2b2b2b2b2b2b2b2bed10712b
-5df65d5d2b2b2b2b2b2b2b2b2b2bed003fed3fed313001715d0071435c58
-4009530553096205620904015d59002b2b2b2b1310373633320015140606
-23220013141633323635342623220644a489c5db01167beb8bdffeedb9b2
-8786b2b38587b2021301278e76fee1fdcdeb82011e010dcccbccd1c5cbca
->ArialMT AddT42Char 
-3 10918 83 <00020087fe690421043e0012001e0162408e0c102d103d104b10043f20b0
-20021f20290c231d3215321d421d70209020083a173a1b4a174a1b59085b
-0c5c175c1b6a086b0c69106d176b1bc020d314dd18dd1ad31ee414e41ee0
-20ff201623042b102b1535043a1046044a105a10e50beb1dfe100b110e03
-161c1c06070106161c0e0b000e1924d00a01100a400a600a800a0420400b
-0b025520400d0d02550ab8ffe6400b0f0f02550a180d0d02550ab8fffab4
-0c0c02550ab8ffeeb40b0b06550ab8fff4b40f0f06550ab8ffe840230c0c
-06550a74011333023312250000c001019001a001b001f001041f013f014f
-010301b8fffc401d0e0e025501100d0d025501100c0c025501100b0b0255
-010c0b0b065501b8fff6b41010065501b8fffc40160f0f0655010c0c0c06
-5501120d0d065501191f473718012b4e10f42b2b2b2b2b2b2b2b2b5d7172
-3c4d10fdf4e410fd2b2b2b2b2b2b2b2b5d71ed003f3fed3f3fed11391239
-3130005d015d717200711311331536363332161615140206232226271103
-141633323635342623220687a43a926888d06a75df7b5a8f2e11a67678ab
-a77473b1fe6905bd8a51518cff98a3fefb8b4c3afdfb03a4cdc4cbd5cbca
-d700>ArialMT AddT42Char 
-3 11776 85 <00010085000002c6043e001100c9403b2f13011004012304340443045304
-66047404060911080908090d1311090d000308010b1c06070106000a0928
-900801082220130113022211250100b8ffc04010333634f0000100002000
-d000e0000400b8fff8b41010025500b8fff840110e0e025500040c0c0255
-00060b0b025500b8fffcb41010065500b8fff440160f0f065500060c0c06
-5500080d0d0655004e1247c4182b10f62b2b2b2b2b2b2b2b5d712b3cfde4
-105df472e4003f3f3fed11393911393901111239390010c9870e7dc43130
-005d72015d33113315363633321707262322060706151185a23e693f5b5e
-3e42423b5e141e0426a171483aa727473f6072fdd400>ArialMT AddT42Char 
-3 12038 86 <0001003fffe803b1043e00300317407b042214223a094a09442456226522
-7c098e098424a613ab2cc2030d09171a1817304b2cd617051b0255020210
-32010a185c085c095c0a5c0b5c0c5c0d6a086a096a0a6a0b6a0c6a0db426
-b4270f27262427242936245a0a590b64266428742374248024930a9c0c92
-28972c9530a40aa90ca327a428b326c5261628b8fff4b40d0d065522b8ff
-f4b40d0d065523b8fff4b40d0d065524b8fff4b40d0d065528b8fff4b40c
-0c065522b8fff4b40c0c065523b8fff4b40c0c065524b8fff4b40c0c0655
-1db8ffde40121e395a0827250c0a041a202615040b2e1d1ab802aa402219
-2c0b0b02551f193f194f195f19af19cf19060f191f196f19df19041f198f
-190219bd02550015000002aa0001ffc040140b0b025510014001021001d0
-0102000110010201b8ffc0b314163401b8ffc040100e113401012e5c1d6c
-1d021d1c150704b8fff4b40b0b025504b8ffe6b41010065504b8ffe64013
-0f0f0655041c2e0b1f1a011a24194013183432b8ffc0402f0f0f02551918
-0f0f025519180d0d025519160c0c025519201010065519200f0f06551910
-0c0c065519160d0d065519b8025bb207242ab8ffc0b51c39d02a012ab8ff
-e6b40c0c02552ab8ffe8b40f0f02552ab8ffe8b40c0c06552ab8ffeab60d
-0d06552a1a32b8ffc04021272a346032c032023f32803202321001010124
-00180d0d025500100d0d06550020b8fff4b40d0d025520b8fff4b4101006
-5520b8fff440190f0f065520240f100b0b02550f160c0c02550f200d0d02
-550fb8fffa40200f0f02550f0e0c0c06550f0c0d0d06550f22df00013f00
-4f00020019313437182b4e10f45d714df42b2b2b2b2b2bed2b2b2b102b2b
-ed724e105d712bf62b2b2b2b712b4dedf42b2b2b2b2b2b2b2b2bed72003f
-ed2b2b2b3fed7112392f2b2b5d71722be410fd5d71722be4111239111239
-0111121739313043794040272d1e2305142c261110121013100306220d20
-1b000928071b01052d071b011e14201b00210e231b0022230d0c08290a1b
-012827090a062b041b001f101d1b01002b2b103c103c2b103c103c2b012b
-2b2b2b2a2b818181002b2b2b2b2b2b2b2b2b5d71015d72715d1337161633
-323635342726272e02353436373636333216161707262623220615141716
-1716171e02151406062322263fb20f897b7c78352593c6994f41382a9153
-7dbd5a11b00c73697c6a16162f1b84bf975669c67dcfd9013d1c6b726544
-3d2318253249814e4779281f2b487b6718525c5237231c1d130a2433417c
-5c5a9f57ac00>ArialMT AddT42Char 
-3 12974 87 <00010024fff2022a0599001700d8b9000affc0b323263409b8ffc0404123
-263480190100010c0d0a0103001610092b0f0a06161c030b0f1022002201
-0d12250c01ff070845094560077007800790070400072007a007b007c007
-d0070607b8ffeeb41010025507b8fff4b40f0f025507b8fff2b40e0e0255
-07b8fff8b40d0d025507b8fff8b40c0c025507b8fffab41010065507b8ff
-f0400b0f0f065507060c0c065507b8ffe8b40d0d065507ba026a00180136
-b166182b10f62b2b2b2b2b2b2b2b2b5d71f4e410ed3cfd3c10e4f43c003f
-ed3f3cfd3c1139123911333310c93130015d2b2b25170623222626351123
-353311371133152311141616333202101a4c3c626c2c8484b3b5b5132b28
-1ea19f103e65a202638c01076cfe8d8cfd934d2c1a00>ArialMT AddT42Char 
-3 13680 89 <0001001a000003e80426000a01eab1020243545840170508000a08060106
-0a0005090805010205240f0f0255052f2bddcd10ddcd113333003f3f3f12
-3931301bb7350501002211390ab8ffde400d11390916121c340816121c34
-02b8ffeab3121c3401b8ffeab3121c340ab8ffd840091e213400281e2134
-0ab8ffe8400922253400162225340ab8ffda407e282e340020282e340f0c
-29002809260a3900350a4800470a56015602590858096601660269086909
-78007701770279087809770a870187028603890788088a099d009809910a
-ac00a20abd00b707b10ac900c50ada00d50aec00e30afb00f40a2c0a0005
-0a1800160a2800260a370a4f00400a09054012163405400b0d34b1060243
-5458400905010008060106000ab8fff4400f0d0d06550a000c0d0d065500
-050908b8fff440120d0d0655080501020c0d0d06550205050c0b1112392f
-dd2bcd10dd2bcd10cd2bcd2b002f3f3f11123931301b40370a0708082509
-0a1409090a0003020225010014010100050a0a000a09080802020106070a
-09030001052f0c010c22084040400980090209b8011bb5400580050205b8
-011b400920024001220bead2182b10f6ed1a19fd5dfd5d1a18ede45d1112
-3939123939003f3c103c103c3f3c113987052e2b877dc4872e182b877dc4
-593130002b2b01715d2b2b2b2b2b2b2b2b2b2b2b2b005d59210133131617
-363713330101aefe6cbee4251f182becb9fe6e0426fd84676f54760288fb
-da00>ArialMT AddT42Char 
-4 0 92 <00010021fe5103ee0426001a01f7b10202435458401d0a140f030b031c19
-0f12060b061340120f200b400c200f180f0f02550f192f2b1add1a18cd1a
-1910dd1a18cd003f3f3fed12173931301bb30f1c010fb8ffde406d1c3928
-14560faf0a03400d400f020f202830341020283034070c0912160d181227
-0b270c270d360c360d350e99110b28122813481659125913591569126913
-69157906760d79117a147a15850d8a118c128c138914980aa80bbc10bb11
-ba14ea0ae714f50dfd10f914ff1c1e12b106024354584016130b1c1b040f
-440f840f030f190b031c190f12060b06003f3f3fed1112395d0111123939
-1b40370f0f0c101112120a00031914131325120a1412120a0f0c0f110c25
-0b0a140b0b0a1312120c0c0b06031c190f001c101c022f1cbf1c021cb802
-3fb50f1340124014b80254400b3f124012025f12bf120212b80142b60f01
-2200451b0ab8025440120f200b4040200c300c4f0c03500cff0c020cb801
-42b32f0f010fb8023fb41b207c66182b1a1910fd71f45d711a18ed1a1910
-ed1810f4e41910e45d71ed1a1810ed1910e45d7100183fed3f3c103c103c
-87052e2b087d10c487052e182b0e7d10c400111239870e103c3c08c44bb0
-0e534bb018515a58bb000cffe8000bffe80138385959313001435c58b900
-14ffdeb637390a2237390eb8ffe8b51539112215392b2b2b2b595d712b2b
-00715d2b015d591327163332363736373637013313161736371333010607
-060623227f143b2c3c48171126050bfe6dc2dd2b221f2be3b4fe6c412430
-7c5634fe67a91028241b6b0f1d0428fd9975817c76026bfbc8af42595300
->ArialMT AddT42Char 
-2 0 0 <00020100000005000500000300070000211121112521112101000400fc20
-03c0fc400500fb002004c000>ArialMT AddT42Char 
-ArialMT /CharStrings get begin
-/underscore 66 def
-/c 70 def
-/d 71 def
-/e 72 def
-/f 73 def
-/g 74 def
-/i 76 def
-/l 79 def
-/n 81 def
-/o 82 def
-/p 83 def
-/r 85 def
-/s 86 def
-/t 87 def
-/v 89 def
-/y 92 def
-end
-ArialMT /Encoding get
-dup 95 /underscore put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 105 /i put
-dup 108 /l put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 118 /v put
-dup 121 /y put
-pop
-end
-%ADOEndSubsetFont
-/KUDFOC+ArialMT /ArialMT findfont ct_VMDictPut
-/KUDFOC+ArialMT*1 
-[95{/.notdef}rp /underscore 3{/.notdef}rp /c /d /e /f /g 
-/.notdef /i 2{/.notdef}rp /l /.notdef /n /o /p 
-/.notdef /r /s /t /.notdef /v 2{/.notdef}rp /y 
-134{/.notdef}rp]
-KUDFOC+ArialMT nf
-KUDFOC+ArialMT*1 [9 0 0 -9 0 0 ]msf
-114 392.76 mo
-(gsicc_set_icc_directory)
-[5.04 4.563 2.043 4.563 4.563 5.03999 4.563 5.03999 2.403 5.04001 2.043 4.437 
-4.563 4.92299 5.04001 2.043 2.99693 4.92299 4.563 2.51999 4.923 2.99693 0 ]xsh
-114 403.56 mo
-(gsicc_set_profile)
-[5.04 4.563 2.043 4.563 4.563 5.03999 4.563 5.03999 2.403 5.04001 5.03999 2.99693 
-4.923 2.51999 2.043 2.043 0 ]xsh
-114 414.36 mo
-(gsicc_init_device_profile)
-[5.04 4.563 2.043 4.563 4.563 5.03999 2.043 5.03999 1.91701 2.52 5.03999 5.03999 
-4.923 4.437 2.04301 4.56299 5.04001 4.923 5.03998 2.99695 5.03998 2.40302 2.043 2.043 
-0 ]xsh
-/KUDFOC+ArialMT*1 uf
-/KUDFOC+ArialMT uf
-/ArialMT uf
-%ADOBeginSubsetFont: Arial-BoldMT Initial
-ct_T42Dict begin
--0.625 -0.375 2 1.008
- 256 array 0 1 255 {1 index exch /.notdef put} for  /Arial-BoldMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f32115d5e9f000000cc000000606376
-7420fb3ea3da0000012c0000075a6670676d08e8ba2800000888000005d7
-676c79664fc39cd400009edc0007c44c68656164d65e5fe200000e600000
-003668686561127e15fe00000e9800000024686d7478d62bc37500000ebc
-000034d46c6f636132ab8c4800004390000034d86d61787014dc04760000
-7868000000206e616d65ae0c9081000078880000147d70726570f14ae516
-00008d08000011d267646972000000000000000000000000000303d402bc
-00050008059a05330000011b059a0533000003d1006602120805020b0704
-020202020204e0002affc00078430000000900000000544d432000200020
-fffc05d3fe510133073e01b2400001ffffff0000042605ba000000200004
-05ba001c05ba001c05a7001c0426001c0000ffe40000ffe40000ffe4fe69
-ffe405ba001cfe69ffe402ea0000011d0000011d000000000000000000b2
-00ac00d70128012000b301fa001700f8011901310049000400f7000300af
-00fd00950014005400960112002400160055004901040119012b008c019b
-ff76ffe9003d009200a2ffb70182ffaa0016008f00c600f8001c00de0401
-0037004e00550055006500e903e50059ff9a00080087000b003b00520116
-006100d600d600f500000093009400be017cfff80004001400820092003c
-00410041ffc1fffc002a008c049005d809b5009100bb0106ff63ff69001e
-0022008a022bffd6ffdf0026005900a300ac0104012b01c004480021006b
-00850098011903c6006b009500a400fe010c025d034305bf000000490056
-006e0077008a00aa00ca0112015005d805f0ff7bffe70006001300280061
-006900e90135014d02a5040cff3effda005b00b900c801190119011901c0
-045b04a7055bfe3fff9dffc2001500b7010a01bc01c10532058efd81ffa1
-ffae000c00260031003d004e00560062008300c100c900f100f2027fff7f
-00480053007700c5011d01200126012801d60219027e027e03d3002e0041
-005d006b0075009f00b000b200ba00bb00bd00d600db00e000e50114011b
-014a0162019101f2020c026402cf039b03b403d4040104a9001600230025
-002a007400a500b600cc00cd00cf0105012001300150016a016f0197019d
-01e002b002ec02f70408048304fb04fd0526fee0fefbff4efff50018001a
-004c007a007f009100a300b300b400ce00d500f200f300f6011001380168
-01a101b001e001ec02090222024f0270029602a502ad034e039103c10435
-0442046b04cd04da0586058b076107fefca6fe93feadfed1ffb7ffd10003
-000e00180026004600690081008f00a500bf00d300d500d900dd00e20119
-012b0138013b015a015e016801730188019401ad01c501d101ea01f20200
-020002000222023b0244024f026f0272027e02820293029402a502cf02cf
-02d002da02dd02eb02f5030503220336037103a103b003b803d003e60410
-0426042e0431044f045a04ff053205320547055305a805ab05c205f0063c
-0664067006e80782078408ccfd2afddefe00fe68feb0feb3ffaa00080059
-007a0091009e00a200af00b400bb00ca00cc00ce00d900e000f40114011a
-01210127012b01390146014b014d0157015c01650182018701920198019b
-01a201ae01c501c501d102070222022b024102530261026502840287028d
-02b402b402ba02c902d602d802ed02f503170323032b03310349035a035b
-036e03710374037e03840391039103aa03cf03d303e703e803ed04080417
-041e0475047a049904a704b404d1054c056d056d05a205bf05c005d105fc
-05fc0602061a061c062f066a06a806e2070607360750078907d407f30870
-011c012a011a01200000000000000000000000000219000b001e02aa0214
-047f01ed0000001d0104000f0091002b01880153011201f3003f03fe0168
-010e047f01ed036e03150219041300000000064004b00000027401bb0035
-01c5007f06020301000004e000b201dc02e004c3023d00d50160011904a7
-036e05ca022100ab0426009002bc02bb014200b4023c0256029c030001e5
-01a800e5006b00780094016b017300ab01ed013a017d0137017f00d40216
-03530184003cffa202040109014901f0006e031500810464005e00000000
-0000000000000000000000000000000000000000000000000000013900dc
-00e9fe9e040d047c012b00b80096005900ac00df01a900fa0105ffec0017
-0003005500610004008c00a3008500280120005d00d6007f012601190104
-016c06cf00b4010600000737063e047a00f000f900e905ba042604420000
-ffe7fe69049e04e3ff37ff2d01200105012000a800740068004700f200e5
-00d900bd00a800680047005c0048000a0028003200410050005a0064007d
-00870091ffb0ff9cff83ff79ff6f00cb012000fa012c01fa01a000d500b8
-005c003c00c800c8008f00d9018b00b30047000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000fe6400c000ea01180125013203b003ed0576
-059005aa05b405be05cd063100780084009b00cc00e200f4010a01200163
-00d100ea00f7010801420019002c00340041003800480058006c025903bd
-0043011a007000d30028003700420050005a0064007300780082008c009c
-00a500bd00ce00f00110015c00be00d801020117012c016300ea01080041
-004b0055005f007300a60109018301b300410064001e002a00eb00fa010e
-01380274002c00400082009600b600c000cc00dc00e600f000ff010a0120
-012c013b01440156016300f70057006401100136005001b10000ffb60039
-004e004403cc00e5002401100042012201a400f0006000e0000e001d0039
-05e30102002cfe4eff38026903bd011600ff000e00a00054001b003d0171
-0041000f005000fd0015014f0035fe52002c00d3010304b001d200b600c0
-00990265ff870377fe6c00cb00a9005c0040047607440000404154403f3e
-3d3c3b3a3938373534333231302f2e2d2c2b2a292827262524232221201f
-1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201
-002c4523466020b02660b004262348482d2c452346236120b02661b00426
-2348482d2c45234660b0206120b04660b004262348482d2c4523462361b0
-206020b02661b02061b004262348482d2c45234660b0406120b06660b004
-262348482d2c4523462361b0406020b02661b04061b004262348482d2c01
-10203c003c2d2c20452320b0cd442320b8015a51582320b08d44235920b0
-ed51582320b04d44235920b09051582320b00d44235921212d2c20204518
-684420b001602045b04676688a4560442d2c01b10b0a432343650a2d2c00
-b10a0b4323430b2d2c00b0172370b101173e01b0172370b10217453ab102
-00080d2d2c45b01a234445b01923442d2c2045b00325456164b050515845
-441b2121592d2cb00143632362b0002342b00f2b2d2c2045b0004360442d
-2c01b00643b00743650a2d2c2069b04061b0008b20b12cc08a8cb8100062
-602b0c642364615c58b00361592d2c45b0112bb0172344b0177ae4182d2c
-45b0112bb01723442d2cb01243588745b0112bb0172344b0177ae41b038a
-45186920b01723448a8a8720b0c05158b0112bb0172344b0177ae41b21b0
-177ae45959182d2c2d2cb0022546608a46b040618c482d2c4b53205c58b0
-02855958b00185592d2c20b0032545b019234445b01a23444565234520b0
-0325606a20b009234223688a6a606120b01a8ab000527921b21a1a40b9ff
-e0001a45208a54582321b03f1b235961441cb114008a5279b31940201945
-208a54582321b03f1b235961442d2cb110114323430b2d2cb10e0f432343
-0b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2cb10e0f432343650b
-2d2cb11011432343650b2d2c4b525845441b2121592d2c0120b003252349
-b04060b0206320b000525823b002253823b002256538008a63381b212121
-212159012d2c4bb06451584569b00943608a103a1b212121592d2c01b005
-251023208af500b0016023edec2d2c01b005251023208af500b0016123ed
-ec2d2c01b0062510f500edec2d2c20b001600110203c003c2d2c20b00161
-0110203c003c2d2cb02b2bb02a2a2d2c00b00743b006430b2d2c3eb02a2a
-2d2c352d2c76b8023623701020b802364520b0005058b00161593a2f182d
-2c21210c6423648bb84000622d2c21b08051580c6423648bb82000621bb2
-00402f2b59b002602d2c21b0c051580c6423648bb81555621bb200802f2b
-59b002602d2c0c6423648bb84000626023212d2cb4000100000015b00826
-b00826b00826b008260f10161345683ab001162d2cb4000100000015b008
-26b00826b00826b008260f1016134568653ab001162d2c4b53234b515a58
-20458a60441b2121592d2c4b545820458a60441b2121592d2c4b53234b51
-5a58381b2121592d2c4b5458381b2121592d2cb0134358031b02592d2cb0
-134358021b03592d2c4b54b012435c5a58381b2121592d2cb012435c580c
-b00425b00425060c6423646164b0035158b00425b00425012046b0106048
-2046b0106048590a21211b2121592d2cb012435c580cb00425b00425060c
-6423646164b807085158b00425b00425012046b8fff060482046b8fff060
-48590a21211b2121592d2c4b53234b515a58b03a2b1b2121592d2c4b5323
-4b515a58b03b2b1b2121592d2c4b53234b515ab012435c5a58381b212159
-2d2c0c8a034b54b00426024b545a8a8a0ab012435c5a58381b2121592d2c
-462346608a8a462320468a608a61b8ff8062232010238ab902a702a78a70
-456020b0005058b00161b8ffba8b1bb0468c59b0106068013a2d2cb10200
-42b123018851b1400188535a58b910000020885458b202010243604259b1
-2401885158b920000040885458b202020243604259b12401885458b20220
-02436042004b014b5258b2020802436042591bb940000080885458b20204
-0243604259b94000008063b80100885458b202080243604259b940000100
-63b80200885458b2021002436042595959592d00000100000005028f9f18
-7df95f0f3cf50819080000000000a2e33c1d00000000c14fd725fafafcfd
-1000081500010009000100010000000000010000073efe4e00431000fafa
-fa7a1000000100000000000000000000000000000d350600010000000000
-023900000239000002aa00b803cb00700473001204730046071d005905c7
-005a01e7005c02aa006b02aa0043031d001c04ac00550239007502aa0073
-023900930239fffd04730056047300a2047300330473004d047300260473
-005b0473005704730057047300530473004102aa00c902aa00aa04ac005f
-04ac005504ac005f04e3006a07cd003d05c7000005c7009605c7006105c7
-00940556009504e300970639006205c700960239008c0473002305c70099
-04e3009d06aa009105c7009806390059055600950639005905c700960556
-004a04e3002c05c700930556ffff078d0007055600000556fffd04e30016
-02aa00920239fffd02aa002604ac00730473ffed02aa002a0473004904e3
-00870473005504e300540473004102aa001804e3005404e3009202390093
-0239ffa20473008902390093071d007e04e3009104e3005204e3008b04e3
-005b031d00870473003002aa001f04e3008d0473000b063900090473000c
-0473000e04000022031d003c023d00b0031d002d04ac004305c7000005c7
-000005c700610556009505c700980639005905c700930473004904730049
-047300490473004904730049047300490473005504730041047300410473
-004104730041023900920239ffe90239ffcd0239ffd004e3009104e30052
-04e3005204e3005204e3005204e3005204e3008d04e3008d04e3008d04e3
-008d0473004403330056047300540473000d0473003b02cd00420473fffe
-04e3008b05e5fff705e5fff7080000d802aa00bb02aa0005046400310800
-ffaa0639003f05b40098046400320464003c0464003c04730001049c006f
-03f4002c05b4007a069600a1046400000231000002f6002502ec001a0625
-0037071d005804e3005704e3006502aa00c304ac0055046400540473ffec
-0464001f04e5001a047300600473006a080000c905c7000005c700000639
-005908000048078d00580473fffc08000000040000840400006902390098
-023900720464003103f4002f0473000e0556fff70156fea90473ffe002aa
-004b02aa004b04e3001f04e3001f04730044023900930239007504000071
-0800000105c700000556009505c7000005560095055600950239006a0239
-ffae0239ffbf0239ffc106390059063900590639005905c7009305c70093
-05c700930239009302aa000302aafff302aa001302aa001a02aa00cd02aa
-009102aa002602aa006002aa003902aa000304e3000a0239000a0556004a
-0473003004e3001604000022023d00b005c7fffd04e300530556fff70473
-000e0556009504e3008b04ac005504ac006d02aa005b02aa001902aa0028
-06ac005c06ac005c06ac0028047300000639006204e300540239008c0556
-004a0473003005c700610473005505c700610473005504e30054046bffed
-02aa00c805c700000473004905c700000473004905c7009405c0005105c7
-fffd0556009504730041055600950473004104e3009d0239007904e3009d
-0315009504e3009a03d5009005c7009804e3009105c7009804e300910639
-005904e3005205c70096031d008705c70096031d00500556004a04730030
-04e3002c02aa001f04e3002c03d5001e05c7009304e3008d05c7009304e3
-008d04e300160400002204e300160400002204cf009a0639005606910056
-04eb004e04da004e03cc004e0579004e0392003005b9004e046bffed04d5
-00b8032b004f08c000290800004f040000990800004f040000990800004f
-040000980400009807d5016a05c7008f04ab005504d5009d04ac005504d5
-022204d5010505abffe9050001c905ab027e05abffe905ab027e05abffe9
-05ab027e05abffe905abffe905abffe905abffe905abffe905ab01c005ab
-027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab01c0
-05ab01c005abffe905abffe905abffe905ab027e05ab01c005ab01c005ab
-ffe905abffe905abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905ab02d605ab006605abffea05d5ffff04d500920800000007eb0130
-07eb012007eb013007eb012004d500b204d5008004d5002a082b0198086b
-01b807550010060000f40600006f0440003a0540003704c0003f04150040
-04000025060000550647008c0473009005abffc701eb008d03d500860715
-002303e9001804d5009202d6005c02d6005c04d500b202d6004d05c70000
-0473004905c700610473005505c700610473005505560095047300410556
-00950473004105560095047300410639006204e300540639006204e30054
-0639006204e3005405c7009604e3009205c7000504e300190239ffba0239
-ffbb0239ffda0239ffda0239ffe10239ffe2023900480239004704730023
-0239ffa205c70099047300890473008d04e3009d0239ffed05c7009804e3
-009105c9009c04e3008e0639005904e300520639005904e3005205c70096
-031d002a0556004a0473003004e3002c02aa000705c7009304e3008d05c7
-009304e3008d05c7009304e3008d05c7009304e3008d078d000706390009
-0556fffd0473000e0239008d05c70000047300490800ffaa071d00580639
-003f04e3005702aa00c9078d000706390009078d000706390009078d0007
-063900090556fffd0473000e0239009502aaffd70473000d04cd005a06ac
-005c06ac002906ac003006ac002f02aa00bc02aa002602aa00bb03b8fff4
-05c7ffe806d3ffbb073fffbb03caffbb0699ffa6076bffc806b4ff9c0239
-ff2905c7000005c7009605c000000556009504e3001605c700960239008c
-05c700990556000006aa009105c70098052600660639005905c7009a0556
-009504cd005a04e3002c0556fffd0556000006790056066a00620239ffcc
-0556ffff04eb004e039c004e04e3008e0239008204a8006c04e200900473
-000f03af004e04e3008e0453004e023900930476008e0473000f04e50090
-0473000b0390004e04e3005204f300760429004e04a80076049b00110607
-007606c2004e0239ffcd04a8007604e3004e04a8007606c2004e055a0097
-0715002f048900a405b100580556004a0239008c0235ffca0473002308c0
-001a0880009d0700003704e2009a04fa000005c0009905c7000005c0009b
-05c70096048900a405b3fffa05560095073b00170503002c05c0009905c0
-009904e2009a059d002006aa009105c700960639005905c0009905560095
-05c7006104e3002c04fa000006d400590556000005d8009a059f007d080a
-009a0827009a06f5001a07d5009d05c0009b05b100570840009605c00004
-0473004904f1005c04eb0096035500880514fff90473004105acffff03fa
-001804eb008c04eb008c040100880515001905eb009b04d5008804e30052
-04d5008804e3008b0473005503eb00150473000e070000540473000c04eb
-008904a5007206ab008c06c0008d05d5002806d5009504eb0099046b0038
-06d5009104abfffb0473004504e3000003550088046b0051047300300239
-00930240ffd00239ffa207c000180740008c04e300000401008804730012
-04d5008803e50096039300880800004108eb00a306200030000001010000
-001e0000003100000031000001010000007f0000007e0000008c0000008c
-000001010000001000000101000001210393007d0000008c026500c80000
-03020000ff0102aa00c904a90059049b004103a7000a0466003204ea0082
-022f0087034e005a04ed00870503007d022f0087042c002803ed004b03f8
-004104e30087050a0037022f00870316004b04e800500459000a04c00064
-04b2006403ff000a0418000a04950082042c002805b8005a0563002d045e
-0087045e0087045e00870236005004090050068b0087022fffac042c0028
-042c002803f8ff1603f8ff160479003205b8005a05b8005a05b8005a05b8
-005a04a9005904a9005904a90059049b004103a2000a0466003204ea0082
-02950000038100000503007d02950000042c002803ed004b03f80041050a
-00370316004b04e8005004c0006404b200640418000a04950082042c0028
-05b8005a0563002d022f0087049b004103ed004b04b2006404db00410000
-ffdc0000ff250000ffdc0000fe51028d00ab028d00a002da004303c0007e
-0196ffba0000004600000046000000460000004600000048000000460000
-004600000046047e0188047e0150047e0104047e009e047e012d047e00ea
-047e00d5047e009c047e00bc047e00ee04350085028d00c1043500b30600
-01000600010002be005806000100047e00a5047e00bd047e00de06000100
-060001000600010006000100060001000000004606000100060001000600
-0100060001000600010006000100060001000600010004e6ffba06000100
-06000100060001000532003905320039022cffba022cffba060001000600
-01000600010006000100049e0034047800300430ffba0430ffba0376000a
-0376000a060e00290708002902e2ffba0456ffba060e00290708002902e2
-ffba0456ffba05280097046f000a03520003060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100000000300000004600000046
-000000400000004606000100060001000000ffdc0000fe510000ff160000
-ff160000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ffdc0000ff160000ffdc0000ff200000ffdc0473002d080000000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d007f028d00670600
-010005a0002e03c0007e01e800000207ffc301bc005e01e0fffa039c0006
-039c000601bc005e01e0001a05280097049e0011022cffba022cffba01bc
-008801e0001a0532003905320039022cffba022cffba02be003603520003
-0532003905320039022cffba022cffba0532003c0532003c022cffba022c
-ffba049e0034047800300430ffba0430ffba049e0034047800300430ffba
-0430ffba049e0034047800300430ffba0430ffba02be006902be006902be
-006902be00690376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba073200400732004004deffba04deffba088000400880
-0040062cffba062cffba0880004008800040062cffba062cffba0430ffba
-0430ffba0430ffba0430ffba0430ffba0430ffba0430ffba0430ffba0454
-003403c000460454ffba02e2ffba0454003403c000460454ffba02e2ffba
-0610002f0610002f0270ffba0298ffba04e6002704e600270270ffba0298
-ffba045400290454002902e2ffba02e2ffba039c0023039c002301e0ffba
-01e0ffba02e2002102e200210352ffba0352ffba0454003e0454003e022c
-ffba022cffba02be00580352000303c0ffba039cffba039c0006039c0006
-05280097046f000a05280097049e0011022cffba022cffba0454000004c4
-000003e400220454001a03e400220454001a03e400220454001a06000100
-060001000000004600000046060001000600010006000100000000460000
-004606000100060001000000004800000046060001000600010006000100
-000000460000004600000046000000460000004000000030060001000000
-004600000046060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100028d00ca028d00c7028d00c6060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010002be0069
-0100ffba0800ffba1000ffbb06d3005905b0005206a3009305cb008d0000
-fd880000fbc10000fc5f0000fe310000fcad0000fd550000fe260000fdf1
-0000fd180000fc690000fd950000fbe00000fc700000fed40000fecd0000
-fea0041b007806ac005c06ac00190000fe450000fd550000fda60000fc5f
-0000fe250000fd180000fbe00000fafa0000fb360000fc700000fb870000
-fb9b0000fcce0000fc540000fbc30000fc940000fbf50000fdb00000fe59
-0000fd7e0000fc820000fd340000fe500000fe460000fcd10000fd3e0000
-fd020000fc3a0000fce90000fc260000fc070000fc2f0000fb9e0000fb76
-0239009305c700000473004905c700000473004905c700000473004905c7
-00000473004905c700000473004905c700000473004905c7000004730049
-05c700000473004905c700000473004905c700000473004905c700000473
-004905c70000047300490556009504730041055600950473004105560095
-047300410556009504730041055600950473004105560095047300410556
-00950473004105560095047300410239006a0239005d0239008c02390093
-0639005904e300520639005904e300520639005904e300520639005904e3
-00520639005904e300520639005904e300520639005904e3005206d30059
-05b0005206d3005905b0005206d3005905b0005206d3005905b0005206d3
-005905b0005205c7009304e3008d05c7009304e3008d06a3009305cb008d
-06a3009305cb008d06a3009305cb008d06a3009305cb008d06a3009305cb
-008d0556fffd0473000e0556fffd0473000e0556fffd0473000e05c70000
-047300490239ffca0239ffca0639005904e3005205c7009304e3008d05c7
-009304e3008d05c7009304e3008d05c7009304e3008d05c7009304e3008d
-0000fef90000fef90000fef40000feef0489fffd03550007073b001705ac
-ffff04e2009a0401008804e2009a0401008805c7009604d5008804730001
-047300120473000104730012055600000473000c059f007d04a50072059f
-009c04e3009205cf00590473004c0639005604e3005205320039022cffba
-0270ffba0298ffba04e60027022c0065022c0016022c0016022c0011022c
-0043022cffd20000fef00000000f0000fff502aa009002aa009000000000
-0000005e0000005e0000ffcb01bc000f01e0ffbf01bcfff501e0ffcd01bc
-001d01e0000901bc008801e0001a039c0006039c0006039c0006039c0006
-05280097046f000a0532003905320039022cffba022cffba053200390532
-0039022cffba022cffba0532003905320039022cffba022cffba05320039
-05320039022cffba022cffba0532003905320039022cffba022cffba0532
-003905320039022cffba022cffba0532003905320039022cffba022cffba
-049e0034047800300430ffba0430ffba049e0034047800300430ffba0430
-ffba049e0034047800300430ffba0430ffba049e0034047800300430ffba
-0430ffba049e0034047800300430ffba0430ffba049e0034047800300430
-ffba0430ffba02be004f02be004f02be006902be006902be006902be0069
-02be004f02be004f02be006602be006602be006902be006902be006902be
-006902be002f02be002f02be002202be00220376000a0376000a0376000a
-0376000a0376000a0376000a0376000a0376000a0376000a0376000a0376
-000a0376000a0376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba073200400732004004deffba04deffba073200400732
-004004deffba04deffba0880004008800040062cffba062cffba08800040
-08800040062cffba062cffba0430ffba0430ffba0454003403c000460454
-ffba02e2ffba0610002f0610002f0610002f0270ffba0298ffba0610002f
-0610002f0270ffba0298ffba0610002f0610002f0270ffba0298ffba0610
-002f0610002f0270ffba0298ffba0610002f0610002f0270ffba0298ffba
-04e6002704e6002704e6002704e60027093e0032093e00320740ffba0740
-ffba060e00290708002902e2ffba0456ffba045400290454002902e2ffba
-02e2ffba045400290454002902e2ffba02e2ffba045400290454002902e2
-ffba02e2ffba060e00290708002902e2ffba0456ffba060e002907080029
-02e2ffba0456ffba060e00290708002902e2ffba0456ffba060e00290708
-002902e2ffba0456ffba060e00290708002902e2ffba0456ffba039c0023
-039c002301e0ffba01e0ffba039c0023039c002301e0ffb101e0ffb1039c
-0023039c002301e0ffba01e0ffba039c0023039c002301e0ffba01e0ffba
-0454003e0454003e022cffba022cffba0454003e0454003e0454003e0454
-003e0454003e0454003e022cffba022cffba0454003e0454003e049e0034
-047800300430ffba0430ffba02be005803520003031a001a031a001a031a
-001a039c0006039c0006039c0006039c0006039c0006039c0006039c0006
-039c0006039c0006039c0006039c0006039c0006039c0006039c0006039c
-0006039c000605280042046fffd905280097046f000a022cffba022cffba
-039c0006039c000605280097046f000a022cffba022cffba05280097046f
-000a067f0044067f0045067f0044067f004501a800280000fe290000fe8c
-0000ff250000ff230000fefa0000ff7a0000fe5908fc003208ad00320000
-ffb50000ffb60000fef00000ff590000fe590000ff8c01b4000002f70000
-0000fe850000ff0704cd00320000ff580000ff580000ff59073200400732
-004004deffba04deffba0880004008800040062cffba062cffba04540034
-03c000460454ffba02e2ffba03c0007e02e2002102be0058022cffba0290
-ffba01f4002f01f4003b01f4001201f400b101f4006d060e002907080029
-022f00870000fec803500000045e008703e4fff50454fff503e400220454
-001a03e400220454001a03e400220454001a03e400220454001a03e40022
-0454001a03e400220454001a047e0072047e00bd03e4000f0454000f04e3
-001b06b1001e05c0009b04e3008705c0000a04e3000a05c7006905c70061
-0473005505c7fffd06b3001e05c0005c04e3005404da004e055600660503
-006f04e3ffac063900620518000207720092023900930239000705c70099
-047300890239001b0473000f07ef009605c7ffad04e3008e063900560718
-005905f300550641001e04e3008b05560095055600640473006304cd005a
-02e1001e02aa001f04e3001802aa001f04e3002d066a006205c700930629
-00000473000e04e300160400002204e3003a04e300590436002a04360039
-047300330473005b03fa001e04a2001f04e3008b023d00b003fb00b004ad
-005602aa00b80aaa009409c7009408e300540956009d071c009d04720093
-0a3a009808000098071c00910473004c05c70000047300490000fefe05c7
-0000047300490800ffaa071d00580639006204e300240639006204e30054
-05c70099047300890639005904e300520639005904e3005204e3003a0436
-00220239ffa20aaa009409c7009408e300540639006204e3005408430096
-0552009505c7009804e3009105c700000473004905c70000047300490556
-00950473004105560095047300410239ff370239ff2d0239fff40239ffe6
-0639005904e300520639005904e3005205c70096031dffcd05c70096031d
-008005c7009304e3006705c7009304e3008d0556004a0473003004e3002c
-02aa001f049e002e0429004905c7009604e30092059f009c050c0052050c
-005204e300160400002205c7000004730049055600950473004106390059
-04e300520000fefd0639005904e300520639005904e300520639005904e3
-00520556fffd0473000e0473004504e3005404e3008204e3008704730034
-0473001404e3005404e300540473004c0641004c03fa004f03fa00180587
-0018048a005202aaffc404e3005404e3005404b000520473000f04ce000f
-04e3008a04e3009204e300920239001b023900930239009302a8000002d9
-00140239009304d40093071d0085071d0085071d007e04e3ffa604e30091
-04eb008c04e3005206ab005206c2004e05ff0052031dffe6031dffe6031d
-ffe6031d0087031d0087031d0087031dffe604ab008a04ab008a04730030
-02aaffc402aaffc402aaff9b0451001e02aa001902aa001f04e3001b04f8
-004904a8009104730012063900090473000f0491000f0400002205700022
-0436002204360022047300420473005504730042047300550639005904eb
-0096048a004f04b0005204d5008803ab001e04730014039e008804e3005b
-0473004204730055083f00540789005409af00540682001f0446001f0698
-001f06f4001806350093058a00930445001e0482008802f1003202f10032
-018effe202040032020400000204000003000032042f000002e2000001e7
-005c03cb007002390098023900750239009402aa00f302aa00f303000032
-0300003204ac005f04ac005f04ac002a04ac002a02aa012102aa00bb02aa
-002a02aa012102aa001302aa002a02aa00bb02aa00ca02aa00ca02aa00f3
-02aa00f302aa00a602aa00a602aa00a602aa001302aaffe102aafffb02ed
-0000012100320302003202ee000003000032031000960310009603100096
-031000960310009602aa006202aa006202aa000302aa001d040000690457
-009604570096045700960457009604570043045700430457004304570043
-04570043031000430457002f0457002f0457002f0457002f0457002f0310
-002f04570025045700250457002504570025045700250310002f0457001a
-0457001a0457001a0457001a0457001a0310001a04570042045700420457
-004204570042045700420310004204570096045700960457009604570096
-0457004204570042045700420457004204570042031000420457002f0457
-002f0457002f0457002f0457002f0310002f0457002f0457002f0457002f
-0457002f0457002f0310002f045700260457002604570026045700260457
-002603100026045700420457004204570042045700420457004203100042
-045700960457009604570096045700960457004204570042045700420457
-004204570042031000420457002604570026045700260457002604570026
-031000260457002304570023045700230457002304570023031000230457
-002f0457002f0457002f0457002f0457002f0310002f0457004b0457004b
-0457004b0457004b0457004b0310004b0457009604570096045700960457
-00960457004204570042045700420457004204570042031000420457001a
-0457001a0457001a0457001a0457001a0310001a04570024045700240457
-00240457002404570024031000240457002f0457002f0457002f0457002f
-0457002f0310002f0457004e0457004e0457004e0457004e0457004e0310
-004e045700960457009604570096045700960000feaf0000febf0000fdb5
-0000fec80000ff780000feb10000ff3d0000fe6f0000feae0000ffce0000
-ff660000fe6f0000fec80000fec80000ff680000ff680000ff6800000000
-0000ff1f0000ff1f0000ff440000ff5f0000fe870000ffec0000ff9c0000
-ff510000ff510000ff510000febf0000ff15000000000000feb10000ff3d
-0000ff6b0000fef20000ff470000ffce0000fe870000febb0000feae0000
-feae0000fec80000fec80000fea60000febf0000fdb70000fdb90000fea6
-0000febf0000fdb50000fe1f0000fee20000ff9c0000fe870000ff440000
-feba0000ff230000ff9a0000fdb90000fe3b000000000000fea70000ff68
-0000fe170000ff740000fe870000fdb90000ff660000ff440000fea70000
-fea70000fea70000ff030000ff520000fd1f0000ff530000ff530000ff53
-0000feb10000feb00000ffa10000fe8c0000feb80000feaf0000fea20000
-feba0000fdf40000ff190000ff2d0000fe8c0000fe8802aa00bb02aa002a
-02aa00c804e2009004a8007606290000080200000629000005ff005206c2
-004e056900140639005904e3005205c700610473005504e30097039e0088
-06030000043c001d066f000a04e2000a07ef0096071d0085059f007d04e3
-008a059f009c04d7000a05560064055600640524001404d4000a05e10055
-04a0004b040e0014038400280569001404f1005c047300550239ffa20639
-005603d4005103d400510556009505c000990473004104eb008c0a3d0059
-063a001406f4001a059f001b07ce008c065e0093055600000473000b0768
-008c066700930679005606070076089e008c07d800930503004603fa0043
-06790056060700760639005604e300520685ffff052c000b0685ffff052c
-000b0b3a005909bd005206840055051a004b0a3d0059073500550000fe37
-0a3d0059063a001405c700610473005504ac000f0000fea60000feb10000
-feaa0000fead0000fc2b0000fc4c05c0009904eb008c05c0001104eb001b
-0556009504e3008b059f009c04c900880503002c03fa001804e200110401
-000d0617001a04fc00280709009605b6008809020099075f008805c70061
-049f005505c700610473005504e3002d03eb001506d2002c05830015059f
-007d04a5007206da000a056d000a06da000a056d000a0239008c073b0017
-05acffff059d009a04c80088059d00200515001905c7009604d5008805c7
-009604d50088059f007d04a5007206aa009105eb009b02aa001a05c70000
-0473004905c70000047300490800ffaa071d0058055600950473004105cf
-00590473004c073b001705acffff0503002c03fa00180503002c04360022
-05c0009904eb008c05c0009904eb008c0639005904e300520639005604e3
-005205b10057046b003804fa00000473000e04fa00000473000e04fa0000
-0473000e059f007d04a5007207d5009d06d5009505c0005e04e30054083e
-005e077a005407ad004606c4004305430046044a0043081a002007a50019
-08430096076600880639006204b000520620002d059b00150000ff430000
-fec90000ff770000ffb00000ff470000ff560000ff740000fed70000feac
-000000000000ff520000ff56000000000000feac0000fd9a000000000000
-ff6a0000ff7c0000ff690000ff560000feac0000ff7f0000ff560000fdef
-0000ff430000ff690000ff7c000000000000fdae0000ff8c000001020000
-feef0000feef0000fefd0000fef90000ff530000fef80000fef905c70000
-0473004905c7009604e3008705c7009604e3008705c7009604e3008705c7
-00610473005505c7009404e3005405c7009404e3005405c7009404e30054
-05c7009404e3005405c7009404e300540556009504730041055600950473
-004105560095047300410556009504730041055600950473004104e30097
-02aa00180639006204e3005405c7009604e3009205c7009604e3009205c7
-009604e3009205c7004e04e3003b05c7009604e300920239ffd20239ffd2
-0239001b0239ffce05c700990473008905c700990473008905c700990473
-008904e3009d0239009304e3009d0239ffeb04e3009d0239ffdd04e3009d
-0239ffcb06aa0091071d007e06aa0091071d007e06aa0091071d007e05c7
-009804e3009105c7009804e3009105c7009804e3009105c7009804e30091
-0639005904e300520639005904e300520639005904e300520639005904e3
-00520556009504e3008b0556009504e3008b05c70096031d008705c70096
-031d008705c70096031d008705c70096031d00590556004a047300300556
-004a047300300556004a047300300556004a047300300556004a04730030
-04e3002c02aa001f04e3002c02aa001f04e3002c02aa001f04e3002c02aa
-001f05c7009304e3008d05c7009304e3008d05c7009304e3008d05c70093
-04e3008d05c7009304e3008d0556ffff0473000b0556ffff0473000b078d
-000706390009078d000706390009055600000473000c055600000473000c
-0556fffd0473000e04e300160400002204e300160400002204e300160400
-002204e3009202aaffde063900090473000e047300490239008d04eb004e
-04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e05c7
-000005c7000006f3fff206f3000006f3fff206f3000006f3004306f30043
-03cc004e03cc004e03cc004e03cc004e03cc004e03cc004e061efff2061e
-000007aefff207ae000007aefff207ae000004e3008e04e3008e04e3008e
-04e3008e04e3008e04e3008e04e3008e04e3008e068ffff2068f0000081f
-fff2081f0000081ffff2081f0000081f0014081f00140239009002390090
-0239ffb60239ffc40239ffde0239ffec0239ffb30239ffc00301fff20301
-00000491fff2049100000491fff204910000049100140491001404e30052
-04e3005204e3005204e3005204e3005204e30052069dfff2069d00000855
-fff20855000007c9fff207c9000004a8007604a8007604a8007604a80076
-04a8007604a8007604a8007604a800760682000007fe00000862000007ae
-fff306c2004e06c2004e06c2004e06c2004e06c2004e06c2004e06c2004e
-06c2004e06cefff206ce00000886fff20886000007fafff207fa000007fa
-fff307fafff304eb004e04eb004e03cc004e03cc004e04e3008e04e3008e
-0239ffe70239008d04e3005204e3005204a8007604a8007606c2004e06c2
-004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e
-04eb004e05c7000005c7000006f3fff206f3000006f3fff206f3000006f3
-004306f3004304e3008c04e3008c04e3008c04e3008c04e3008c04e3008c
-04e3008c04e3008c068ffff2068f0000081ffff2081f0000081ffff2081f
-0000081ffff3081ffff306c2004e06c2004e06c2004e06c2004e06c2004e
-06c2004e06c2004e06c2004e06cefff206ce00000886fff20886000007fa
-fff207fa000007fafff307fafff304eb004e04eb004e04eb004e04eb004e
-04eb004e04eb004e04eb004e05c7000005c7000005c7ffd105c7ffdd05c7
-000002aa00dc02aa00ca02aa00dc02aafff302aafff304e3008c04e3008c
-04e3008c04e3008e04e3008c06e6000006e60000075700000757000005c7
-009602aafff202aafff202aafff30239ffe50239ffdb0239ffce0239ffce
-0239ffc20239ffbb0239ffe80239ffde03c9000003c9000002aa000002aa
-000002aafff304a8007604a8007604a8007604a8007604f3007604f30076
-04a8007604a800760556fffd0556fffd06e6ffd8074affdd061e000003b8
-fff403b8fff402aa002a06c2004e06c2004e06c2004e06c2004e06c2004e
-0765ffd1069dffdd0796ffd106ceffdd066a006202aa00bb02aa00dc0473
-000a05c7006105c70061071d007e05c7002109cd0096078d000705c70020
-04e3002d08b000140400003004c100660000ff530000ff530000ff530000
-ff530239001b0239ffa2047300000556001206b3005403fe005706ab0091
-040c001f05d6ffe605d6ffe602aa008402aa008402aa00c902aa00c902aa
-009102aa002a02aaffc502aaffc302aafff302aa00c902aa00a902aa00a9
-02aa00a902aa00a9032e001e032e001e02aa003a0000ff730000ff9d0000
-fec80000ff230000ff720000ff720000fee70000ff9d0000ff530000ff53
-0000ff530556009504e3008b04b5000006350000071d006104eb000f0473
-0055049900910499001b0401008c03fa001802390093040f00490476008e
-039e000e05eb009b04eb008c04e300520473003404f1005204f1005204f1
-0021078d00540492004b04e3005304e3005304e9008c04abfffb04abfffb
-03eb001504a8007604e300510624005104e000510473000b063900090400
-002203df002203f2004b04ec0014035500880473001204d5008804e9008c
-060700760515001903e300000591000003a2003203a2000003a300320355
-00320355003204030032037c00320172005502de003203b00032031e0032
-04220032037700320378003204260032037a0032035b003203ac00320377
-0032037b00320514000003050032030500320321003204b6003203210032
-03210032030200320302003202cf003202cf0032032000320121003202ca
-00320484003402f2003203480032030a0032034900320349003203200032
-01bc000a02f20032034200320484003202e90000034c000a031b003202e9
-00000343003203da003203080000012100320204003202f2003202e90000
-031b003202e900000342003203da00320308000005ed00460a9800460613
-00460689ffba0541ffba01e9001e045400100000ff0d0000ff350000fece
-0000feb70000fec90000ffc70000ff4f0000ff9e0000fef002be006902be
-00690376000a0376000a03c0ffba039cffba03c0ffba039cffba05c80039
-05920032061600820519004b05240041060f008705580028068f002d04ac
-00550000fe3b0000fe660000fe680473fffc0400008403d5ffba01e0ffba
-01e0ffb101e0ffba01e0ffba06d0002e0984002304000000080000000400
-00000800000002ab000002000000015500000473000002390000019a0000
-00ab00000000000005e5fff705c7006106aa009105eb009b0760008d07a1
-005407a1005b05c7000005c700610473001404e3001104e3002c04730039
-0400002205290042000001010000ff420000fead0000ff3a0000ff5304f3
-000a05c7006905c7006105c70069048900a4035500880000ff430000ff01
-0000ffac0316007d0000ff370298ffba033d001e0000ff3a0000ff480000
-ff490000ff7e0000ff4f0000ff4a0000fe9e0532003905320039022cffb6
-022cffb60532003c0532003c022cffba022cffba0532003905320039022c
-ffba022cffba0532003905320039022cffba022cffba0532003905320039
-022cffba022cffba0532003905320039022cffba022cffba053200390532
-0039022cffba022cffba049e0034047800300430ffba0430ffba049e0034
-047800300430ffba0430ffba02be004f02be004f02be006902be00690376
-000a0376000a073200400732004004deffba04deffba0454003403c00046
-0454ffba02e2ffba0454003403c000460454ffba02e2ffba0454003403c0
-00460454ffba02e2ffba0610002f0610002f0270ffba0298ffba0610002f
-0610002f0270ffba0298ffba060e00290708002902e2ffba0456ffba060e
-00290708002902e2ffba0456ffba060e00290708002902e2ffba0456ffba
-02e2002102e200210352ffba0352ffba02e2002102e200210352ffba0352
-ffba0454003e0454003e022cffba022cffba0454003e0454003e022cffba
-022cffba0454003e0454003e022cffba022cffba039c0023039c002301e0
-ffba01e0ffba0376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba04e3ffc104e3005402aafff3071dffc104e3ffd504e3
-ffc5031dffc1031dffc10473ffff02aaffda0400002104e3008302f00032
-04dc004e06fb001f0239001b0239001b04e3001404a8001404f8001404e3
-008704e3005402aa0018062500540473008902390070071d007e04e30091
-04e3008b031d00660473003003baffc40473000b0473000c040000220473
-004904e3005404e300540473004103fa004f03fa0018053e005102390093
-0473003402aaffc404e3008d0436002203210032030a0032030a00060348
-003202cf003201f0000a01f000000320003202f100320174000a01210032
-012100320174000a02760000018e00320150003202490032048400340484
-0032035f0000035f003202fa003203480032040300320302003202390000
-01bc000a0340000a035e003202ea003202ea003202e9000002e4003202e4
-003203be0032030a003202e800320000fe920000fe920000ff730000fe9f
-02aa00c903050032030200320348003202ee0000030200320639006205c7
-00000556001e05c7006102aa004104eb004e04eb004e04eb004e04eb004e
-04eb004e04eb004e04eb004e04eb004e0239ffb60239ffb60239ffc40239
-ffc40239ffb60239ffb60239ffc40239ffc404a8007604a8007604a80076
-04a8007604a8007604a8007604a8007604a800760239ffc90239ffc90239
-ffc90239ffc904a8007604a8007604a8007604a8007603e400220454001a
-03df003005c7fffd05c70016055600000556009504730041047300230239
-ffa20633005904e3005b05c70000031d001b0556fffd0473000e04730034
-047300550473003402390093048900110355001b055600000473000c0556
-00000473000c0503006f03fa004f059d0020051500190000fec60000fed4
-0000fec60000fed40000fe5f0000fe5f0000ff720000ff730000fee70800
-00000401005d0473003404e300110239001b04e300060556fffd05c70096
-0473004902aaffcd05c7009604e3009205c700990473008904e300160400
-00220473002804540096037c008805b9004e0000ff530000ffbc0000fefe
-0000fefe0000fea40000fea402390093000000000000006c0000006c0000
-006c0000006c0000011a000001ba00000388000006300000079600000948
-000009a800000a3200000abc00000bf000000c6c00000cdc00000d2a0000
-0d6800000dbe00000ec200000f44000010ea000012420000135c000014ce
-00001602000016be0000185c000019a2000019fc00001a8800001b120000
-1b9400001c2200001d1000001ea40000201e00002186000022c0000023aa
-00002468000025040000264a0000271e000027a60000284400002a0e0000
-2a6a00002cbe00002ebc00002fc4000030940000322e00003392000035f2
-0000368800003768000038a200003ae400003c6000003d5600003ee80000
-3f5c00003fb000004018000040ca000040fe00004162000043700000446c
-000045a800004698000048a4000049a400004b8000004c8000004d220000
-4dfa00004f2600004f920000514600005230000053200000541c0000551e
-000056020000594800005a6800005b5000005ca400005f0a000060e00000
-625e000063ec000065140000657a000066b20000677a000067bc000067fc
-000068380000687e000068c6000069160000695a00006994000069c40000
-69f400006a3600006a7800006aaa00006aee00006b3a00006b8400006bb4
-00006bfa00006c3600006c7600006cb200006cea00006d3a00006d760000
-6db200006de200006e2400006e7400006ebe00006ef600006f3800006f6c
-00006fe40000706a000072160000738200007578000075c20000765c0000
-77aa0000799a00007b4e00007c6800007cca00007d2200007e0200007f34
-000080ac000081d40000829a0000837000008430000085d4000086900000
-877200008850000088b60000894a00008a0e00008b4a00008be200008d22
-00008fc40000914a00009250000092f00000934a0000942a000095d80000
-9744000097ee000098e2000099c800009a3c00009a7400009aba00009af8
-00009c7400009e8a00009ec400009efa00009fc20000a0960000a1060000
-a1240000a1c60000a2a00000a2dc0000a3160000a37c0000a5140000a5b2
-0000a6440000a7a00000a8ca0000a9b40000a9f20000aa020000aa200000
-ac2a0000ac6c0000acba0000acf60000ad360000ad840000adc20000ae00
-0000ae3a0000ae7c0000aeb40000aee40000af1e0000af620000af920000
-afda0000b03c0000b0a80000b1560000b18a0000b1fa0000b2400000b2f6
-0000b3900000b4240000b48c0000b4e80000b5bc0000b6880000b6b80000
-b6e80000b74c0000b7a20000b82a0000b9540000bacc0000bb020000bb32
-0000bc3a0000bd0e0000bd4a0000bee00000bf5e0000c06c0000c1a00000
-c34c0000c4da0000c7220000c7d80000c81c0000c85c0000c88e0000c8d2
-0000c90e0000c9520000c98c0000c9be0000c9f00000cb200000cb560000
-cb800000cbcc0000cc0e0000cc340000cc5a0000cc900000cdce0000cde6
-0000ce0c0000ce320000ce700000cea00000ced00000cf0e0000cfcc0000
-d07e0000d0b20000d0e80000d1240000d1620000d1b00000d1e20000d214
-0000d2500000d28c0000d2c80000d3040000d3360000d3660000d3960000
-d3bc0000d3e00000d41e0000d5920000d5d60000d60e0000d6460000d67c
-0000d6cc0000d70e0000d7540000d7a60000d7f20000d9040000da100000
-daf80000dbe80000dcee0000ddd80000de480000df720000dfc20000dff2
-0000e0ec0000e3200000e3600000e3a00000e3e00000e41e0000e47c0000
-e4da0000e5480000e5680000e6080000e6a20000e6d80000e73c0000e786
-0000e7d00000e7ec0000e8080000e8280000e8480000e8680000e8880000
-e8ae0000e8d40000e8fa0000e9200000e9500000e9780000e9a00000e9cc
-0000e9f80000ea2c0000ea560000ea820000eab80000eae20000eb0e0000
-eb440000eb6e0000eb980000ebcc0000ebfc0000ec300000ec740000eca4
-0000ecd80000ed1a0000ed4e0000ed800000edc20000edf60000ee260000
-ee680000eeac0000eef20000ef4e0000ef6a0000ef860000efa20000efbe
-0000efda0000f1480000f3f20000f6620000f67e0000f6980000f6b40000
-f6d00000f6ec0000f7080000f7640000f79e0000f8080000f8d20000f972
-0000fa480000fac80000fb500000fbc00000fc560000fcb40000fcfa0000
-fd580000fdba0000fdfa0000fe560000feba0000ff2c0000ff6a000100fc
-0001020c00010236000102520001027e000102b600010302000103320001
-036200010396000103c6000103f6000104260001045600010486000104b6
-000104e6000105160001054600010576000105a6000105d6000106060001
-07900001093e0001096e0001099e00010a8a00010ba200010bd200010c00
-00010c3000010c5e00010c8e00010cbc00010ce000010d0400010d3e0001
-0e1e00010e6e00010ed40001101a0001104c000110720001109a000110d8
-000111ae000112a6000112d6000113060001133600011366000113960001
-13c4000113f400011424000114e6000115fa0001162a0001165a0001168a
-000116ba000116ea0001171a000117400001176600011796000117c60001
-17f600011826000118c600011918000119e600011a1600011a4600011a76
-00011aa600011ad800011b0800011b3800011b6800011b9800011bcc0001
-1c0000011c3000011c6000011cbe00011ce800011e6e00011f560001210a
-0001235e0001259600012734000127940001281a0001282a000128ec0001
-2a9000012b6400012c3a00012cc600012dea00012efe00013070000130a6
-000130b6000130c6000131a0000131b0000131c0000131d0000131e00001
-31f0000132f60001330600013316000133c0000133d00001342200013432
-000135260001353600013546000135560001362800013742000137760001
-37aa000137da0001380a0001383a000138680001389c0001398600013a7c
-00013b5c00013c2600013ce600013d3800013e6a00013f7e000140420001
-40520001415e0001416e0001423800014316000143de000144fc000145c8
-000146c6000146f80001472c0001475c0001478c000147bc000147f00001
-48d20001490200014a2600014a3600014a4600014a7a00014a8a00014b90
-00014c7c00014d4a00014d7a00014daa00014e2a00014e3a00014ef00001
-4f0000014f5800014ff600015006000151e80001530c0001543200015462
-0001558c0001560400015614000156240001563400015688000156980001
-56a8000156b8000157b0000158ae000158be0001592a000159b800015a40
-00015ade00015b9c00015c8400015d3e00015e6800015f8e000160cc0001
-60dc00016202000162f00001634e0001641e0001642e0001661400016766
-0001684a0001687a0001699000016a1a00016bd400016c5a00016c6a0001
-6cd400016ce400016cf400016d5e00016d6e00016ec200016ed200016f5c
-00016fe80001707800017128000171e4000172e4000173a2000174a80001
-75b4000176e200017716000178520001788000017996000179a6000179b6
-000179e8000179f800017b0400017be800017ce600017d2000017d500001
-7df000017e4e00017ebe00017efa00018090000181140001819e000182e6
-000183a00001848a000184da000185620001862a00018668000186ba0001
-8716000188000001885400018892000188ca00018908000189560001899e
-000189e400018a4000018b9600018c3800018d4e00018dac00018e480001
-8e8600018f4000018fb6000190b4000190ee0001917800019234000192d6
-0001935c0001942800019466000194ee000195bc0001969a000197620001
-98700001992600019a3200019ae400019b6c00019c6c00019d5400019dac
-00019e0400019e5800019ea600019f3e0001a04a0001a08e0001a0cc0001
-a1140001a14a0001a1b40001a2940001a2cc0001a2fa0001a3320001a360
-0001a3920001a3c40001a43e0001a4940001a5f20001a6920001a7b00001
-a8600001a8ac0001aa020001aab20001aadc0001ab580001aba00001acd8
-0001add60001ae440001afc60001b1840001b2ea0001b3f80001b4220001
-b5b20001b6f00001b71c0001b7500001b77c0001b7ac0001b91a0001b944
-0001ba540001bb060001bbb60001bc4a0001bd180001be540001be640001
-be980001bf580001c1100001c1e80001c2520001c3780001c3d60001c4e8
-0001c5b60001c6420001c6c00001c79c0001c8dc0001c9d60001ca8c0001
-cb780001cc400001cd1e0001cdee0001cecc0001cf600001d18c0001d1b6
-0001d1e00001d1f00001d21a0001d3540001d4720001d5820001d5ac0001
-d5d60001d6000001d62a0001d6540001d8380001d8620001d88c0001d8b6
-0001d8e00001d90a0001d9340001d95e0001d9880001d9bc0001d9e60001
-da100001da3a0001dbd40001dbe40001dd1c0001dd2c0001dd560001dd80
-0001ddaa0001ddd40001df6e0001e1e80001e3460001e3560001e4c80001
-e4d80001e6360001e81a0001e91c0001eaa20001ec6c0001eec00001f02e
-0001f2220001f2320001f2420001f3a60001f3d00001f3fa0001f4240001
-f44e0001f4780001f4a20001f4cc0001f4f60001f5200001f54a0001f574
-0001f59e0001f5c80001f5f20001f61c0001f8d40001fab40001fc3e0001
-fe7e0001fff6000200200002004a0002007a000200aa000200fa0002014a
-0002018a000201fc00020250000202ae000203040002033a0002037c0002
-03c20002040c0002043c00020474000204a40002060a000209500002097a
-000209a4000209ce000209f800020a2200020a4c00020a7600020aa00002
-0aca00020af400020b1e00020b4800020b7200020b9c00020bc600020bf0
-00020c1a00020c4400020c6e00020c9800020cc200020cec00020d160002
-0d4000020d6a00020d9400020dbe00020de800020e8000020f1000020f3a
-000212c2000213cc00021544000216ca000218ac00021a8000021c9e0002
-1cae00021e5600021fee00022260000224a00002261800022628000226d4
-0002277e000228ba000228ca00022996000229a600022b4800022d300002
-2e9c00022eac00022fb400022fc40002313e0002314e0002327c0002328c
-000233c80002357c000236740002368400023776000238d4000239800002
-399000023ad200023c8000023d7600023d8600023e2a00023e3a00023f22
-00023f3200023ffc0002400c0002412200024132000242f8000243080002
-447600024486000246f800024708000249180002492800024aa400024ab4
-00024be600024bf600024db400024dc400024f3a00024f4a000250b80002
-50c8000250d8000250e8000252a8000252b8000252c8000252d800025428
-0002556000025678000257720002591400025aa600025c0e00025d5c0002
-5f2200025f3200026084000261e6000263cc000263dc0002656400026708
-0002694200026952000269620002697200026adc00026aec00026bbe0002
-6bce00026d0600026d1600026dfc00026e0c00026f4600026f5600027010
-0002702000027146000272aa00027418000275c6000276f6000277060002
-7880000279c200027be200027db400027ec400027ed40002815600028382
-0002864c000288a800028b6800028daa00028f68000290c2000290ec0002
-91160002912600029136000291600002918a000291b4000291c4000291d4
-000291fe000292280002923800029248000292720002929c000292c60002
-92d6000292e6000292f60002930600029316000293260002935000029360
-000293700002939a000293c4000293ee00029418000294420002946c0002
-9496000294c0000294ea000295140002953e0002956800029592000295bc
-000295e6000296100002963a000296640002968e000296b8000296e20002
-970c00029736000297600002978a000297b4000297de0002980800029832
-0002985c00029886000298b0000298da000299040002992e000299580002
-9982000299ac000299d600029a0000029a2a00029a5400029a7e00029aa8
-00029ad200029afc00029b2600029b5000029b7a00029ba400029bce0002
-9bf800029c2200029c4c00029cf400029d3800029dae00029dd800029e02
-00029e2c00029e5600029e8000029eaa00029ed400029efe00029f280002
-9f5200029f7c00029fa600029fd000029ffa0002a0240002a04e0002a078
-0002a0a20002a0cc0002a0f60002a1200002a14a0002a1740002a2260002
-a25a0002a28e0002a2c20002a4460002a5c60002a7320002a8800002a940
-0002aa020002aa740002ab460002ac180002ac8a0002ad4e0002ae400002
-af040002aff60002b09c0002b1a80002b23a0002b3820002b4c00002b524
-0002b64c0002b81a0002ba620002bace0002bb3a0002bba40002bc100002
-bcbe0002bd6c0002be120002beb80002bf5e0002bf8e0002bfbe0002bfee
-0002c0000002c0120002c0240002c0360002c0480002c0b80002c12a0002
-c15a0002c16c0002c17e0002c18e0002c19e0002c1b00002c1c20002c1d4
-0002c1e60002c1f80002c20a0002c3160002c3bc0002c4c80002c56e0002
-c5c60002c5ec0002c6120002c63c0002c66a0002c6b40002c7100002c74a
-0002c7a20002c7e20002c8320002c86a0002c8c00002c9020002c9420002
-c9940002ca060002ca500002cabc0002cafc0002cb680002cba80002cc10
-0002cc520002cca60002cccc0002ccf20002cd1c0002cd4c0002cd7c0002
-cdac0002cdfa0002ce560002ce940002ceee0002cf360002cf8c0002cfd0
-0002d0240002d06a0002d0ac0002d0d20002d1080002d12e0002d1540002
-d17a0002d1a00002d1ce0002d1f80002d2420002d29e0002d2d80002d330
-0002d3700002d3c40002d3fc0002d44c0002d48e0002d4ce0002d5080002
-d5440002d5800002d5bc0002d5ea0002d6140002d6520002d6820002d6a8
-0002d6ce0002d6f40002d71a0002d7440002d76e0002d7ae0002d7fa0002
-d8400002d8780002d8a20002d8cc0002d8fc0002d92c0002d9520002d978
-0002d9a20002d9cc0002d9fe0002da300002da600002da900002dac00002
-daf00002db200002db4e0002db7e0002dbae0002dbde0002dc0e0002dc42
-0002dca20002dcd60002dd3a0002dd6e0002ddce0002de020002de660002
-df0e0002dfde0002e0f40002e1c60002e2400002e2ae0002e4900002e65a
-0002e77a0002e88c0002e9d00002eae40002eb740002ebf40002ec880002
-ed0a0002edca0002ee6a0002ef360002f01c0002f0d40002f1a00002f21c
-0002f22c0002f2fa0002f3ba0002f4840002f5380002f62e0002f6a40002
-f7cc0002f8e60002fa6e0002faf00002fbe00002fcd60002fdce0002fe60
-0003007200030202000302880003040a00030476000304e00003054e0003
-0714000308dc0003096c000309b8000309f600030a3800030a8000030aac
-00030af200030b2800030b6400030ba200030be000030c6800030cf00003
-0d3200030d6a00030da400030dde00030e0600030e2e00030e7200030eb6
-00030ef400030f3200030f6200030f9200030fb800030fde000310200003
-1062000310a8000310ee000311460003119e000311fa00031256000312b2
-0003130e0003135c000313aa000313d2000313fa00031420000314460003
-148a000314ce0003151a00031566000315b0000315fa0003164800031696
-000316d6000317760003179c000317c20003180c0003187c000318a40003
-18cc0003191200031958000319ae00031a0400031a5200031b0c00031b34
-00031b5c00031bb000031c0400031c4400031c8400031caa00031cd00003
-1d3600031d9c00031dde00031e2000031e4600031e6c00031ec200031f18
-00031f7400031fd00003202400032078000320c6000321140003215e0003
-21a8000322020003225c000322b000032304000323460003238800032426
-000324c40003250e00032558000325aa000325fc00032662000326c80003
-272000032778000327a4000327d0000327fc000328280003285400032880
-000328ac000328d8000328fe00032924000329500003297c000329ca0003
-2a1800032a6400032ab000032b0000032b5000032bca00032c2c00032ca4
-00032cee00032e8000032eb400032ee800032f1e00032f4200032fac0003
-301600033098000331000003314800033190000331dc000332460003326e
-00033296000332bc000332e2000333320003338200033416000334680003
-34c6000335240003358a000335f0000336d6000337e6000338b4000339ae
-00033a1a00033a8000033ade00033b4000033bc600033c4c00033cb20003
-3d1800033d8400033df000033e4600033e9c00033ece00033f0000033f26
-00033f4c00033fb80003401e0003407c000340de000341f0000342fc0003
-440a0003450e000345340003455c00034580000345a4000345cc000345f4
-0003461a00034640000347620003489e000349cc00034af800034bb20003
-4c6c00034d2c00034dec00034ed000034fb4000350b0000351ac00035290
-000353740003544a000355200003556a000355b4000355da000356000003
-5650000356a0000356c4000356e8000357be000357ce0003582200035876
-000358d40003593200035972000359b2000359fc00035a4600035a960003
-5ae600035b3c00035b9200035be400035c2200035c9c00035cde00035d22
-00035db000035e3e00035ff0000360000003603a00036074000360a40003
-60d4000361080003613c00036176000361b00003620400036258000362ba
-0003631c000364cc0003665400036690000366c8000367120003675c0003
-67a2000367e80003683800036a5e00036a8400036aaa00036afe00036da8
-00036e7a00036f1600036f6400036fa200036fd4000371c20003747e0003
-7550000376b4000377ee0003789a00037a3000037c8400037ec000037f1a
-00037f600003802e000381200003813e000381e80003830e000383ea0003
-83fc0003855c000386e200038708000387c6000387e40003880a00038830
-000388560003887c000388a2000388c8000388ee00038914000389600003
-89c0000389e800038a0e00038b6c00038d4800038d5800038e2800038f38
-00038f96000390ae0003923c000392e2000394280003947a000394cc0003
-9504000395500003957c000395c2000395ee0003962a00039684000396ce
-0003971a0003978a00039850000398cc0003998c00039a0400039ade0003
-9b6e00039ba800039be400039d5c00039e4c00039e9600039edc0003a026
-0003a1360003a1460003a2500003a3360003a4480003a5140003a62a0003
-a7680003a7780003a8500003a9120003aa120003ab6c0003abcc0003ad50
-0003adc40003af180003b0800003b1640003b1b60003b21e0003b3a80003
-b51e0003b5a60003b74a0003b83a0003b95e0003ba000003baea0003bbd4
-0003bccc0003bdb40003bee60003c02c0003c1ce0003c38a0003c39a0003
-c49e0003c5d00003c67a0003c78e0003c81a0003c98a0003ca520003cb4c
-0003cc9a0003cdb20003cf580003d0980003d1ea0003d30e0003d4c00003
-d6480003d7420003d8180003d9740003da340003da6a0003dad20003dba6
-0003dbb60003dc160003dc720003dccc0003dd040003dd420003dd8c0003
-ddc80003de060003de500003df620003dfb40003e0100003e0bc0003e0e4
-0003e1540003e1840003e1b60003e3600003e4860003e4c00003e4f00003
-e53c0003e56e0003e5940003e5ba0003e5fc0003e63e0003e66e0003e69e
-0003e6e20003e7280003e7660003e7a00003e7da0003e80a0003e8c60003
-e9800003e9c20003e9f20003ea260003ea620003ea920003eac20003eafc
-0003eb340003eb640003eb980003ebcc0003ebf40003ec240003ec540003
-ec880003ecc00003ecf00003ed200003ed600003ed920003edce0003ee00
-0003ee400003ee7a0003eeaa0003eeda0003ef000003ef260003ef4c0003
-ef7c0003f0940003f1920003f1c20003f1f40003f2980003f43e0003f5a8
-0003f6960003f8000003f8300003f8600003f8980003f8d00003f9220003
-f97e0003fa700003fa980003fb060003fb360003fb660003fb8e0003fc00
-0003fc300003fc660003fdc60003fe880003ff6400040088000401800004
-02d0000403ec0004050a0004060e000407700004091600040aae00040cba
-00040df000040e8a00040ff800041008000410d6000412980004149a0004
-154c0004162a00041744000417f400041846000418980004196e00041a54
-00041ae400041c5c00041d5a00041e5c00041f900004206e000421540004
-21f4000422fe000424260004251a000426020004267e000426fa000427a6
-0004285800042936000429ac000429fe00042b7000042cf000042eee0004
-2fb2000430840004316a000432a00004336c000434740004358e00043692
-0004376200043840000439da00043af600043bd000043d4400043f380004
-404e000441fc0004428e00044330000443be0004445c0004456000044570
-000446ca000447da000447ea000448c4000449e800044a4800044b680004
-4c3600044d1800044f000004510e000453e40004561e000457ac000459d6
-00045b7e00045d6000045eba00046026000460a80004615c0004624a0004
-62f600046362000463e4000464bc00046600000467720004688000046890
-000468a00004690200046966000469c400046a5200046ade00046ba40004
-6c3e00046c4e00046c5e00046cf800046d9800046dde00046e5000046ec2
-00046f1000046f4400046fb6000470260004709a000470ea0004717e0004
-720e0004728c00047310000473ac000473d800047446000474f800047606
-000476520004781c00047908000479180004794e00047992000479d60004
-7a1a00047a5000047a8200047ac400047b1a00047b6600047c1400047c8c
-00047d1600047d8a00047df000047e7600047ed600047f4000047fb80004
-802c0004808a00048134000481d000048240000482d200048330000483a2
-00048450000484fa00048594000486080004868e000486f6000487a60004
-886800048918000489ae00048a1000048a8000048ad600048b5800048bda
-00048c6400048cf400048d4e00048dba00048e2a00048e9c00048f100004
-8f980004902c00049096000491100004919000049208000492b20004934e
-000493e200049444000494e600049566000495fc000496a4000497520004
-97ee0004984e000498a600049912000499bc00049a6a00049b3800049be2
-00049c4800049ca000049d0400049d9600049e2000049eb200049f160004
-9f7e00049fe80004a0500004a0bc0004a1380004a1c40004a25c0004a2c8
-0004a3300004a3940004a4440004a5080004a5ba0004a64c0004a6ae0004
-a71e0004a7920004a83a0004a8e40004a9ac0004aa520004aaba0004ab4e
-0004abc40004ac600004ace20004ad600004add00004ae620004aebe0004
-af200004afaa0004b02a0004b0920004b0fa0004b1520004b1c00004b228
-0004b2aa0004b3240004b3a20004b4260004b4820004b4e80004b5500004
-b5f40004b69a0004b75c0004b8100004b8700004b8ec0004b94e0004b9dc
-0004ba780004bb0a0004bb740004bbd60004bc680004bcde0004bd7c0004
-be140004be880004befc0004bf780004bfd60004c03a0004c0b80004c116
-0004c17a0004c1d80004c2380004c2a00004c2f40004c32a0004c3760004
-c3da0004c41a0004c4640004c50e0004c5b60004c60c0004c6440004c694
-0004c7440004c7f20004c8440004c8980004c8f00004c9400004c9980004
-c9fe0004ca5e0004cafe0004cba20004cbe00004cc460004cce40004cd78
-0004ce0a0004ceb00004cee20004cf4a0004cfb20004cffc0004d0ce0004
-d1500004d1f80004d2600004d29e0004d3080004d3ae0004d4040004d458
-0004d4c40004d5280004d5c80004d5fa0004d62a0004d6740004d70c0004
-d7360004d7600004d8280004d8820004d9240004d98e0004da0a0004daba
-0004db300004dba00004dbf80004dc5e0004dcc00004dd600004ddb80004
-de840004def00004df4a0004df940004dfea0004e08a0004e1500004e29c
-0004e3b80004e41c0004e4900004e7b60004e8460004e8c60004e9140004
-ea7c0004eba80004ebf00004ecec0004edb40004ee920004ef840004f03e
-0004f1180004f1820004f21a0004f2ec0004f3e00004f4520004f4c00004
-f5040004f6160004f74a0004f83c0004f8800004f8bc0004f9a60004faa8
-0004fc2a0004fd260004fe2a0004ff340005002000050082000500f80005
-02820005031400050444000505340005065c000507940005085800050940
-00050a0000050b5400050d0600050e9800050fd2000511380005120e0005
-12cc0005138a00051450000515a8000516f8000517080005171800051728
-000517c400051862000518b0000518ee000519340005196400051ac20005
-1c5e00051d7000051e980005202400052196000522a60005247a00052666
-000528c000052a2000052b4a00052cdc00052e4e00053064000532d20005
-33d200053508000536280005377a0005386e000539b4000539f600053a36
-00053c7800053ec600054026000541bc000543ec0005458c000546180005
-46480005469000054724000547be0005491e000549b000054a2000054a60
-00054a9e00054c5000054e8e0005503e000551680005525e000553640005
-553a000556f0000557f20005590800055ace00055cbc00055e6400055fe0
-00056166000562c60005635e000563fa000565180005663e000567960005
-694a00056a8600056bda00056c6000056cde00056d9200056e5800056f04
-00056fce00057100000572a0000572c6000572ec000572fc0005732c0005
-735c000574d00005764000057702000577c4000578a60005797e00057a32
-00057b0600057bb000057c7600057df800057fa800058012000580420005
-806a0005809e000580d2000580e2000580f2000581220005814800058184
-000581c0000581f4000582280005825c00058292000583b8000583c80005
-83f8000584280005845c00058494000584c8000584fc0005853000058564
-00058598000585ce000585fe0005863400058668000586a2000586f20005
-873c00058770000587a4000587da00058810000588c4000588d4000589de
-00058b4a00058cb400058e5400058f9a000590f2000591e4000592ee0005
-93d2000594d2000595f8000596e4000597a0000598620005994a00059a04
-00059ace00059b5600059c0400059c9600059d1400059e2e00059e9a0005
-9f620005a05e0005a0cc0005a13c0005a1f40005a3d80005a4e60005a56c
-0005a5b20005a67a0005a70a0005a7f40005a8a00005a90e0005aa160005
-ab020005abc20005ac080005ac9a0005ada80005ae440005aea00005af96
-0005b0900005b2120005b3760005b4740005b55e0005b62c0005b6540005
-b67c0005b6ac0005b6dc0005b7040005b72c0005b7540005b77c0005b7d6
-0005b8400005b8720005b8a20005b8c80005b8f00005b9180005b9420005
-b96c0005b9940005b9bc0005b9e20005ba0e0005ba980005bac00005bb42
-0005bb6a0005bb900005bbb60005bbdc0005bc2e0005bc820005bcb40005
-bce40005bd160005bd520005bd820005bdb80005bdde0005be040005be38
-0005be6c0005beac0005bef20005bf180005bf3e0005bf640005bf8a0005
-bfb40005c0180005c0640005c0960005c0c40005c0fa0005c1380005c160
-0005c1860005c1ac0005c1f60005c2380005c2600005c2860005c2b20005
-c2d80005c3340005c3640005c3940005c3c40005c3ea0005c4140005c444
-0005c4740005c49a0005c4c00005c4e60005c50c0005c5320005c5580005
-c5800005c5f80005c6220005c68c0005c6b40005c7580005c7800005c7fc
-0005c8300005c8720005c8a20005c8d20005c9020005c9320005c95e0005
-c9840005c9cc0005ca0e0005ca3a0005ca620005ca920005cac20005cae8
-0005cb0e0005cb3a0005cbee0005cc160005ccc60005cd080005cd4a0005
-cd7a0005cdae0005cdd40005cdfc0005ce220005ce4a0005ce700005ce98
-0005cec00005cee80005cf0e0005cf340005cf5a0005cf800005cfa80005
-d0300005d0640005d0ca0005d0fa0005d12a0005d1500005d1760005d1b0
-0005d1f40005d2260005d2620005d2920005d2c20005d2f60005d32a0005
-d35a0005d3900005d3c80005d3f80005d4260005d4500005d47e0005d4a4
-0005d4ca0005d4fe0005d5440005d57e0005d5ba0005d5ec0005d61c0005
-d6580005d6940005d6d00005d71a0005d7640005d79c0005d7da0005d816
-0005d8560005d8b20005d90e0005d96a0005d9c60005da300005da9a0005
-daca0005db020005db420005db860005dbca0005dc0e0005dc6a0005dcc6
-0005dd320005dd9e0005de0a0005de760005dea60005ded60005df0e0005
-df460005df860005dfc60005e0020005e03e0005e09a0005e0f60005e15a
-0005e1be0005e2220005e2860005e2e40005e3420005e3700005e39e0005
-e3d00005e4020005e4340005e4660005e4a40005e4e20005e5520005e5c4
-0005e6260005e6880005e6ea0005e74c0005e7a40005e7fc0005e82c0005
-e85c0005e8900005e8c40005e8f80005e92c0005e9860005e9f20005ea5c
-0005eac60005eb2e0005eb960005ebc60005ebf60005ec2a0005ec5e0005
-ec9e0005ecde0005ed1a0005ed560005edaa0005ee100005ee640005eeb2
-0005eee20005ef120005ef460005ef7a0005efae0005efe20005f01a0005
-f0520005f0ae0005f1040005f1640005f1c40005f21a0005f2700005f2ca
-0005f31e0005f3540005f3860005f3c40005f3f40005f4240005f46e0005
-f49c0005f4cc0005f5120005f54a0005f5860005f5ca0005f5fe0005f62e
-0005f6780005f6cc0005f7220005f7780005f7dc0005f8400005f8920005
-f8e80005f9340005f9860005f9f20005fa5e0005faca0005fb360005fbb2
-0005fc2e0005fc700005fcb20005fcfa0005fd420005fd940005fde60005
-fe340005fe820005fef00005ff5e0005ffd40006004a000600c000060136
-000601a600060216000602580006029a000602de00060322000603660006
-03aa000603f40006043e000604ac0006051400060586000605f800060660
-000606c80006073200060796000607cc0006080200060852000608800006
-08cc000609080006095e0006098e000609be000609ea00060a1600060a3c
-00060a9000060afe00060b5200060bee00060ce000060d2200060d480006
-0da400060dd400060e1600060e7c00060eea00060f5000060fba00060fe0
-00061088000611260006126600061294000612c2000613260006138a0006
-13b8000613ec0006141c0006144c000614bc00061532000615da00061678
-000617b4000617e4000618140006187a000618e000061910000619400006
-1970000619a6000619d600061a0600061a5200061ab200061b0e00061be8
-00061cc200061d3400061d7a00061da000061de200061e1200061e540006
-1e8800061ef200061f3800061fae00061fd40006204400062092000621b2
-00062444000625d800062730000628e200062bf000062e860006306e0006
-320c00063464000635a6000637bc0006382c000638940006390600063978
-00063a0000063a9e00063c7c00063e2a00063ff6000640f60006428a0006
-43ea000644ae000645a40006460c0006466e000646dc0006474000064814
-0006487c0006494600064a0400064aa000064b0200064b9800064c2a0006
-4cc600064d5e00064dc400064e2200064e8e00064ef600064f7200065020
-0006508a000650e80006514a000651fc0006527e00065300000653360006
-5368000653780006538800065494000655bc000657dc0006592e0006593e
-000659f800065aee00065b7800065b8800065c0800065c8000065ca20006
-5d6400065d7400065d8400065d9400065da400065ea000065fe6000661a6
-000663ba000664ac00066512000665760006663800066648000667e20006
-67f200066802000668c6000669e200066abe00066ace00066ade00066aee
-00066c4a00066e3a00066f4a00066f5a00066f6a00066f7a00066f8a0006
-704000067050000671a6000672e2000673d0000674e000067584000675f2
-000676620006777c000677e000067824000678b200067a7200067ab20006
-7ba600067c7200067d3e00067dc400067e9a00067f360006809e00068122
-000681b600068330000684a20006862a0006870e000688d8000689c20006
-8ab000068bdc00068d0200068e5c00068fc60006910800069180000692b6
-000693ae000694ac000695a80006968e00069718000697a2000698940006
-995000069a1200069abe00069bb400069c9000069d9400069ed400069fbc
-0006a13c0006a26a0006a36e0006a3b80006a4240006a4e40006a5c00006
-a6fe0006a7e60006a9320006aa600006ab6a0006ac0c0006ad580006ae14
-0006af3e0006b0000006b0480006b2420006b2f80006b4e60006b6420006
-b7e00006b8e20006b9480006ba900006bb080006bc980006bcce0006bd04
-0006bd560006bda80006bde00006be200006be580006be980006bfc60006
-c0280006c0e80006c19c0006c23e0006c2d60006c3520006c45e0006c4bc
-0006c5ea0006c69a0006c7680006c7a20006c7de0006c8660006c9260006
-ca220006caf80006cb1e0006cb440006cbdc0006cbec0006cbfc0006cc0c
-0006cc1c0006cc2c0006cc3c0006cc4c0006cc5c0006cc6c0006cc7c0006
-cc8c0006cc8c0006cdf00006ce000006ce740006cf0e0006d01c0006d176
-0006d2d60006d4900006d65e0006d8320006d8b60006d9d40006db1e0006
-dcc60006dd620006ddb20006de480006df660006dfb60006e0460006e170
-0006e1800006e2ae0006e3be0006e4340006e48c0006e5780006e5be0006
-e5fe0006e69a0006e6ee0006e8700006e94e0006e98e0006e9f80006ea62
-0006ea9a0006ebe20006ecd80006ede60006ee1e0006ee560006ee7c0006
-eea20006eed20006ef020006ef260006ef4a0006ef760006efa20006efe8
-0006f02e0006f05a0006f0860006f0cc0006f1120006f16e0006f1ca0006
-f1ee0006f2120006f26a0006f2c20006f3080006f34e0006f3840006f3ba
-0006f3f00006f4260006f4880006f4f20006f5520006f5b20006f5fe0006
-f6cc0006f6f40006f71c0006f7880006f7f40006f8420006f8900006f996
-0006f9a60006f9f00006fa3a0006fa820006faca0006fb280006fb8a0006
-fbe40006fc360006fcba0006fd220006fd960006fe080006fe8e0006fefc
-0006ff6e0006ffd40006fffa0007002000070044000700680007009c0007
-00d0000700f60007011c00070188000701f400070260000702c80007031a
-0007036c000703c2000704140007043c0007046400070496000704c40007
-051a00070570000705cc000706280007064e00070674000706a0000706cc
-0007072800070784000707a8000707cc000708820007093800070b0a0007
-0b1a00070b7e00070be200070c2e00070c7a00070e3e00070e4e00070f5c
-00070f6c00070fc60007102000071078000710d000071134000711980007
-11dc00071220000713b6000715480007169800071866000719e400071b9e
-00071ccc00071dc40007203e000721c2000723ea00072566000725f20007
-272a0007294e000729d6000729e600072b5600072c8200072dea00072f30
-00073066000731640007333a000734ee0007357e000736c2000737ae0007
-38fc000739ea00073bd600073cf200073e1400073fe800074152000742f6
-000743fc0007454c000746a40007489a00074a7600074bda00074c9e0007
-4dd200074e9c00074fa60007512000075214000752f80007549600075668
-0007567800075726000757f000075800000758c800075962000759ae0007
-59be00075a3800075b0c00075b6800075c1800075c5a00075d9000075e86
-00075f82000760820007612000076264000763ac000765cc000766620007
-676200076882000769ca00076a8600076b6000076c3c00076d0800076e0a
-00076fb6000770d6000771fc0007728a0007731a0007742c0007748c0007
-7578000776e40007781600077912000779fe00077b2400077cb400077e5a
-0007802600078156000781d800078258000782e200078362000783ec0007
-84a800078550000785fe000786a600078720000787a40007881e000788a2
-00078958000789fa00078a9a00078b3c00078bb800078c3e00078cba0007
-8d4000078df800078ea200078f4800078ff0000790e0000791d4000792b4
-0007939c0007948e0007958200079668000797540007991c00079a7e0007
-9b2200079c3200079cf800079d0800079dfc00079f5600079fea0007a094
-0007a15e0007a2300007a3120007a3ae0007a4980007a5be0007a5ce0007
-a6880007a7420007a7520007a7fa0007a8a00007a98e0007aa7c0007ab58
-0007ac2a0007adae0007af540007afee0007b08a0007b0c60007b1040007
-b1400007b17e0007b1d80007b2300007b28a0007b2ee0007b37a0007b578
-0007b5cc0007b5dc0007b6680007b6ec0007b7700007b8280007b9380007
-baf60007bc140007bca40007bd480007bdf80007beda0007bf5c0007bfea
-0007c1120007c15a0007c1b20007c28c0007c2c80007c3260007c3640007
-c3960007c3da0007c41c0007c44c000100000d3500f2003c008f00060002
-0010002f0055000006fa02c20005000200>
-<0000005303ea0000000300000000006a00000000000300000001000a006a
-00000003000000020008007400000003000000030058007c000000030000
-0004001400d40000000300000005001800e8000000030000000600180100
-000000030000000700ba01180000000300000008003001d2000000030000
-0009008a0202000000030000000d02aa028c000100000000000000350536
-00010000000000010005056b000100000000000200040570000100000000
-0003002c05740001000000000004000a05a00001000000000005000c05aa
-0001000000000006000c05b60001000000000007005d05c2000100000000
-00080018061f000100000000000900450637000100000000000d0155067c
-0003000104030002000e07d10003000104030004001a07df000300010405
-0002000a07f9000300010405000400160803000300010406000200060819
-00030001040600040012081f000300010407000200080831000300010407
-0004001408390003000104080002000c084d000300010408000400180859
-0003000104090000006a08710003000104090001000a08db000300010409
-0002000808e50003000104090003005808ed000300010409000400140945
-000300010409000500180959000300010409000600180971000300010409
-000700ba0989000300010409000800300a430003000104090009008a0a73
-000300010409000d02aa0afd00030001040a0002000e0da700030001040a
-0004001a0db500030001040b000200120dcf00030001040b0004001e0de1
-00030001040c000200080dff00030001040c000400140e0700030001040e
-000200100e1b00030001040e0004001c0e2b000300010410000200120e47
-0003000104100004001e0e59000300010413000200060e77000300010413
-000400120e7d0003000104140002000e0e8f0003000104140004001a0e9d
-000300010415000200140eb7000300010415000400200ecb000300010416
-0002000e0eeb0003000104160004001a0ef9000300010419000200140f13
-000300010419000400200f2700030001041b0002000a0f4700030001041b
-000400160f5100030001041d000200060f6700030001041d000400120f6d
-00030001041f0002000a0f7f00030001041f000400160f89000300010424
-0002000c0f9f000300010424000400180fab00030001042a000200080fc3
-00030001042a000400140fcb00030001042d0002000a0fdf00030001042d
-000400160fe900030001080a0002000e0fff00030001080a0004001a100d
-0003000108160002000e10270003000108160004001a1035000300010c0a
-0002000e104f000300010c0a0004001a105d000300010c0c000200081077
-000300010c0c00040014107f00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0042006f006c0064004d006f006e006f007400790070
-0065003a0041007200690061006c00200042006f006c0064003a00560065
-007200730069006f006e00200035002e0030003100200028004d00690063
-0072006f0073006f0066007400290041007200690061006c00200042006f
-006c006400560065007200730069006f006e00200035002e003000310041
-007200690061006c002d0042006f006c0064004d00540041007200690061
-006c00200069007300200061002000740072006100640065006d00610072
-006b0020006f006600200054006800650020004d006f006e006f00740079
-0070006500200043006f00720070006f0072006100740069006f006e0020
-0069006e002000740068006500200055006e006900740065006400200053
-0074006100740065007300200061006e0064002f006f00720020006f0074
-00680065007200200063006f0075006e00740072006900650073002e0054
-006800650020004d006f006e006f007400790070006500200043006f0072
-0070006f0072006100740069006f006e004d006f006e006f007400790070
-006500200054007900700065002000440072006100770069006e00670020
-004f006600660069006300650020002d00200052006f00620069006e0020
-004e006900630068006f006c00610073002c002000500061007400720069
-0063006900610020005300610075006e0064006500720073002000310039
-003800320059006f00750020006d00610079002000750073006500200074
-00680069007300200066006f006e007400200074006f0020006400690073
-0070006c0061007900200061006e00640020007000720069006e00740020
-0063006f006e00740065006e00740020006100730020007000650072006d
-0069007400740065006400200062007900200074006800650020006c0069
-00630065006e007300650020007400650072006d007300200066006f0072
-0020007400680065002000700072006f006400750063007400200069006e
-0020007700680069006300680020007400680069007300200066006f006e
-007400200069007300200069006e0063006c0075006400650064002e0020
-0059006f00750020006d006100790020006f006e006c0079002000280069
-002900200065006d0062006500640020007400680069007300200066006f
-006e007400200069006e00200063006f006e00740065006e007400200061
-00730020007000650072006d006900740074006500640020006200790020
-00740068006500200065006d00620065006400640069006e006700200072
-00650073007400720069006300740069006f006e007300200069006e0063
-006c007500640065006400200069006e0020007400680069007300200066
-006f006e0074003b00200061006e00640020002800690069002900200074
-0065006d0070006f0072006100720069006c007900200064006f0077006e
-006c006f006100640020007400680069007300200066006f006e00740020
-0074006f002000610020007000720069006e0074006500720020006f0072
-0020006f00740068006500720020006f0075007400700075007400200064
-0065007600690063006500200074006f002000680065006c007000200070
-00720069006e007400200063006f006e00740065006e0074002ea9203230
-303620546865204d6f6e6f7479706520436f72706f726174696f6e2e2041
-6c6c205269676874732052657365727665642e417269616c426f6c644d6f
-6e6f747970653a417269616c20426f6c643a56657273696f6e20352e3031
-20284d6963726f736f667429417269616c20426f6c6456657273696f6e20
-352e3031417269616c2d426f6c644d54417269616c206973206120747261
-64656d61726b206f6620546865204d6f6e6f7479706520436f72706f7261
-74696f6e20696e2074686520556e697465642053746174657320616e642f
-6f72206f7468657220636f756e74726965732e546865204d6f6e6f747970
-6520436f72706f726174696f6e4d6f6e6f74797065205479706520447261
-77696e67204f6666696365202d20526f62696e204e6963686f6c61732c20
-5061747269636961205361756e646572732031393832596f75206d617920
-757365207468697320666f6e7420746f20646973706c617920616e642070
-72696e7420636f6e74656e74206173207065726d69747465642062792074
-6865206c6963656e7365207465726d7320666f72207468652070726f6475
-637420696e207768696368207468697320666f6e7420697320696e636c75
-6465642e20596f75206d6179206f6e6c792028692920656d626564207468
-697320666f6e7420696e20636f6e74656e74206173207065726d69747465
-642062792074686520656d62656464696e67207265737472696374696f6e
-7320696e636c7564656420696e207468697320666f6e743b20616e642028
-6969292074656d706f726172696c7920646f776e6c6f6164207468697320
-666f6e7420746f2061207072696e746572206f72206f74686572206f7574
-7075742064657669636520746f2068656c70207072696e7420636f6e7465
-6e742e004e0065006700720065007400610041007200690061006c002000
-4e00650067007200650074006100740075010d006e00e900410072006900
-61006c002000740075010d006e00e9006600650064004100720069006100
-6c002000660065006400460065007400740041007200690061006c002000
-46006500740074038803bd03c403bf03bd03b10041007200690061006c00
-20038803bd03c403bf03bd03b100a9002000320030003000360020005400
-6800650020004d006f006e006f007400790070006500200043006f007200
-70006f0072006100740069006f006e002e00200041006c006c0020005200
-690067006800740073002000520065007300650072007600650064002e00
-41007200690061006c0042006f006c0064004d006f006e006f0074007900
-700065003a0041007200690061006c00200042006f006c0064003a005600
-65007200730069006f006e00200035002e0030003100200028004d006900
-630072006f0073006f0066007400290041007200690061006c0020004200
-6f006c006400560065007200730069006f006e00200035002e0030003100
-41007200690061006c002d0042006f006c0064004d005400410072006900
-61006c00200069007300200061002000740072006100640065006d006100
-72006b0020006f006600200054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-200069006e002000740068006500200055006e0069007400650064002000
-530074006100740065007300200061006e0064002f006f00720020006f00
-7400680065007200200063006f0075006e00740072006900650073002e00
-54006800650020004d006f006e006f007400790070006500200043006f00
-720070006f0072006100740069006f006e004d006f006e006f0074007900
-70006500200054007900700065002000440072006100770069006e006700
-20004f006600660069006300650020002d00200052006f00620069006e00
-20004e006900630068006f006c00610073002c0020005000610074007200
-690063006900610020005300610075006e00640065007200730020003100
-39003800320059006f00750020006d006100790020007500730065002000
-7400680069007300200066006f006e007400200074006f00200064006900
-730070006c0061007900200061006e00640020007000720069006e007400
-200063006f006e00740065006e0074002000610073002000700065007200
-6d0069007400740065006400200062007900200074006800650020006c00
-6900630065006e007300650020007400650072006d007300200066006f00
-720020007400680065002000700072006f00640075006300740020006900
-6e0020007700680069006300680020007400680069007300200066006f00
-6e007400200069007300200069006e0063006c0075006400650064002e00
-200059006f00750020006d006100790020006f006e006c00790020002800
-69002900200065006d006200650064002000740068006900730020006600
-6f006e007400200069006e00200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-2000740068006500200065006d00620065006400640069006e0067002000
-7200650073007400720069006300740069006f006e007300200069006e00
-63006c007500640065006400200069006e00200074006800690073002000
-66006f006e0074003b00200061006e006400200028006900690029002000
-740065006d0070006f0072006100720069006c007900200064006f007700
-6e006c006f006100640020007400680069007300200066006f006e007400
-200074006f002000610020007000720069006e0074006500720020006f00
-720020006f00740068006500720020006f00750074007000750074002000
-640065007600690063006500200074006f002000680065006c0070002000
-7000720069006e007400200063006f006e00740065006e0074002e004e00
-65006700720069007400610041007200690061006c0020004e0065006700
-72006900740061004c0069006800610076006f0069007400750041007200
-690061006c0020004c0069006800610076006f0069007400750047007200
-6100730041007200690061006c00200047007200610073004600e9006c00
-6b00f6007600e900720041007200690061006c0020004600e9006c006b00
-f6007600e9007200470072006100730073006500740074006f0041007200
-690061006c002000470072006100730073006500740074006f0056006500
-740041007200690061006c002000560065007400480061006c0076006600
-6500740041007200690061006c002000480061006c007600660065007400
-50006f00670072007500620069006f006e00790041007200690061006c00
-200050006f00670072007500620069006f006e0079004e00650067007200
-690074006f0041007200690061006c0020004e0065006700720069007400
-6f041f043e043b0443043604380440043d044b0439004100720069006100
-6c0020041f043e043b0443043604380440043d044b043900540075010d00
-6e00e90041007200690061006c002000540075010d006e00e90046006500
-740041007200690061006c0020004600650074004b0061006c0131006e00
-41007200690061006c0020004b0061006c0131006e004b00720065007000
-6b006f0041007200690061006c0020004b007200650070006b006f011100
-e20323006d0041007200690061006c0020011100e20323006d004c006f00
-64006900610041007200690061006c0020004c006f006400690061004e00
-65006700720069007400610041007200690061006c0020004e0065006700
-72006900740061004e00650067007200690074006f004100720069006100
-6c0020004e00650067007200690074006f004e0065006700720069007400
-610041007200690061006c0020004e006500670072006900740061004700
-72006100730041007200690061006c00200047007200610073000000b154
-80410d03ac00af03ac0002001003ac002003ac00a003ac0003004003acb3
-070d3240b803acb312143240b803acb2162b32b9ffc003acb23a3340b803
-acb32d943280bc03ab005f0033ffc003abb2553340b803abb340443240b8
-03abb3333b3240b803abb32f313240b803abb2083340b803abb30714321f
-411a03ab002f03ab0002000f03ab002f03ab004f03ab008f03ab009f03ab
-00bf03ab0006001003ab00df03ab00ff03ab000303a803a2b2461f40b803
-a5b208330f411403a50001004003a500cf03a500ff03a50003002003a500
-af03a500ef03a500ff03a50004ffc003a3b3090c3240b803a3b208330f41
-1b03a30001000f03a3001003a3008003a300af03a300cf03a30005006f03
-a3009f03a300ff03a30003009f03a200af03a2000203a203a1b2101f1041
-0a039e007f039e0002039a000f0101001fffc00398b310143240b80399b3
-0f1332404110039500500395000200b0034d00c0034d0002006f0391007f
-03910002ffc0034bb22d3132b9ffc0034bb30a0e32104110038b0020038b
-0080038b000300a0038b00010020038b0040038b0002ffc0038bb3131632
-40b80383b20f1132b9ffc0037bb2303432b9ffc0037bb310183250411403
-7800010365036e0023001f037e036e001e001f0363036e001d001f036203
-64000d001fffc00340b30f1032804110033f0001033f03150029001f0341
-03160032001f0344031a001b001fffc00375b20e1132b9ffc00375b2282a
-32410a034303180032001f030f030d0034001f03080307b2321f20bb0340
-000100400388b3090b3240b80388b2101532bd038503070014001f038003
-07b2171f0fbd030a002f030a0002ffc00354b3090d3290410c035400a003
-540002001f036e0001009f036e00010040036eb2090b3241110345031c00
-16001f036b031d0015001f0346031e0015001f03a703a10046001f039db3
-261c1fc0bb0393000100400392b3090d3240b8033eb2083340b8033eb30d
-0e32c04109033e000100b0038e00c0038e0002ffc00390b3263832004126
-03280030032800020020037f0030037f00020010038a0030038a0050038a
-006f038a007f038a009f038a000600000389003003890002002f037a0070
-037700900377009f037a0004ffc00315b20f1032b9ffc00315b2242832b9
-03190318b2321f10bb031a0001ffc0031ab3090e3240b80318b2121332b9
-ffc00318b30c0e323fbd0373004f0373000200400374b31718326fbb032a
-00010040032cb3181b3240b80370b2090c32bd031703160032001fffc003
-16b20e1132bd031c031e0016001f031d031eb2151fb0411f031e0001000f
-031f000102ca02d00015001f02d302d5000d001f02cf02d0000d001f02cb
-02d0000d001f02cd02d0000d001f02ce02d0000d001fffc002d0b3090c32
-40b802d2b3090c32e0411c02e50001005f02dd009f02e5000202bb02c300
-30001f02da02b80032001f02d902b9003f001f02d802b80064001f02b902
-b80033001f02bab221c81fb802b8b321c81f40b8039bb20d1632b9ffc002
-c3b22b2f32b9ffc002c3b21f2532b9ffc002c3b2171b32b9ffc002c3b212
-1632412502c202c1001c001f02d702c10024001f02c102c00022001f02bf
-02c00018001f02c0027400c8001f02b50235003b001f02b40235003b001f
-02c402bc001e001f02b702b60038001f02b3b20ec81fb802b0b207c81fb8
-02afb206c81fb802aeb200c81fb802afb2502f1fbc02ae02ab001a001f02
-adb2261a1fb802a8b326241f0fbb0235000102a50274b21d1f12410a02a1
-015801f4001f02a000d801f4001f001202a2b237c81fb80290b2bc201fb9
-029002904018374025402d40a6033025302d30a6032025202d203720a620
-4110028e0005009f028b0001028b028b0037002002890030028900400289
-00900289b20437b041fd027400c0027400020080027400a0027400020060
-0274007002740002000002740010027400020080027400f002740002003f
-0285004f028500020090027e0090027f009002800090028100040090027a
-0090027b0090027c0090027d000400900274009002750090027700030070
-027e0070027f007002800070028100040070027a0070027b0070027c0070
-027d000400700274007002750070027700030060027e0060027f00600280
-0060028100040060027a0060027b0060027c0060027d0004006002740060
-02750060027700030050027e0050027f005002800050028100040050027a
-0050027b0050027c0050027d000400500274005002750050027700030040
-027e0040027f004002800040028100040040027a0040027b0040027c0040
-027d000400400274004002750040027700030030027e0030027f00300280
-0030028100040030027a0030027b0030027c0030027d0004003002740030
-02750030027700030020027e0020027f002002800020028100040020027a
-0020027b0020027c0020027d000400200274002002750020027700030010
-027e0010027f001002800010028100040010027a0010027b0010027c0010
-027d0004001002740010027500100277000300e0027e00e0027f00e00280
-00e00281000400e0027a00e0027b00e0027c00e0027d000400e0027400e0
-027500e00277b103d041c5027e00d0027f00d0028000d00281000400d002
-7a00d0027b00d0027c00d0027d000400d0027400d0027500d00277000300
-30027400400274000200c0027e00c0027f00c0028000c00281000400c002
-7a00c0027b00c0027c00c0027d000400c0027400c0027500c00277000300
-b0027e00b0027f00b0028000b00281000400b0027a00b0027b00b0027c00
-b0027d000400b0027400b0027500b00277000300a0027e00a0027f00a002
-8000a00281000400a0027a00a0027b00a0027c00a0027d000400a0027400
-a0027500a0027700030090027e0090027f00900280009002810004009002
-7a0090027b0090027c0090027d0004009002740090027500900277000300
-20027e0020027f002002800020028100040020027a0020027b0020027c00
-20027d00040020027400200275002002770003028101580801001f028001
-290801001f027f00ec0801001f027e00d80801001f027d00b10801001f02
-7c00a60801001f027b00820801001f027a00370801001f02770026080100
-1f027500200801001f0274001f0801b21f370f41160235004f0235005f02
-35006f0235009f023500af023500bf0235000700af023500cf023500df02
-3500ff02354022040f074f079f07af07bf0705af07e007020f064f069f06
-af06bf0605af06e0060220411b020d0001005f02350001008f0235000100
-7f023500ef02350002002f0235003f02350002003f0234004f0234000202
-350235023402344011ed20ef2a01cf2a01bf2a01af2a018f2a0141090247
-0104001e001f022000370201001f0158400c263e1fd8263e1f3726273e1f
-b8028eb6ec171fb226361fb801bcb226361fb80129402b26361fec26361f
-b126361fa626361f8226361f3726361f3226361f2d26361f2526361f1f26
-361f37262a1fb801584022263e1fd8263e1fbc263e1f27263e1f21263e1f
-20263e1f3700161600000012110840b9020d01a6b3c50d0009b801bcb227
-281fb801bbb227301fb801b8b2274f1fb801b7b227621f410901b6002701
-01001f01b5002002ab001f01afb21fe41fb801adb21fe41fb801acb21fbb
-1fb801a8b21f341fb8015db2272e1fb8015bb227cd1f410d0155001f0401
-001f0154001f0401001f0153001f0201001f0152b21f561fb80151b21f29
-1fb8012bb227261f410d012a00270125001f0129015800e4001f0125001f
-0401001f0124b21fe41fb80123b21f3b1fb80122b21f391f410d01080027
-0801001f0106002d0101001f0105001f0101001f0103b31fbb1fefb90158
-0401400b1fed1f931fec1fe41feb1fb80201b21fd920b80401b21fcf25b8
-0156400a1fbc2d9e1fbb1f411fb2410a01580401001f00b101580401001f
-00b001580401b51fa625891f9bb901580125b61f991f2e1f8e2db80801b5
-1f8d1f291f89b901580401b21f8220b802ab40131f801f301f742de41f73
-1f4a1f611f521f5d25b802abb21f5c1fbc0801001f0059015802abb61f50
-25891f491fb80125b21f4725b80401400b1f461f791f401f271f3920bc02
-ab001f003801580401b21f372dbc0125001f003201580125b61f2c1f341f
-2a25b80801b21f5537b80111402a07f00790075b0742073b07230722071e
-071d071408120810080e080c080a080808060804080208000814b8ffe040
-2b0000010014061000000100060400000100041000000100100200000100
-0200000001000002010802004a00b013034b024b5342014bb0c063004b62
-20b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807ff52
-b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ffb101
-018e851bb0124358b10100858d1bb900010119858d5959001816763f183f
-123e113946443e113946443e113946443e113946443e11394660443e1139
-4660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b182b1db096
-4b5358b0aa1d59b0324b5358b0ff1d594bb08153205c58b9020f020d4544
-b9020e020d45445958b90470020f455258b9020f04704459594bb0e45320
-5c58b90020020e4544b90027020e45445958b908420020455258b9002008
-424459594bb8012553205c58b90026020f4544b90021020f45445958b90a
-0d0026455258b900260a0d4459594bb8040153205c58b1d8204544b12020
-45445958b9250000d8455258b900d825004459594bb8040153205c58b901
-5800264544b1262645445958b923200158455258b9015823204459594bb0
-2953205c58b11f1f4544b12d1f45445958b9010d001f455258b9001f010d
-4459594bb02f53205c58b11f1f4544b1251f45445958b90135001f455258
-b9001f01354459594bb8030153205c58b11f1f4544b11f1f45445958b914
-28001f455258b9001f14284459592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65422b01b331757ec3456523
-456023456560234560b08b766818b080622020b17e754565234520b00326
-6062636820b003266165b075236544b07e234420b131c34565234520b003
-266062636820b003266165b0c3236544b0312344b100c3455458b1c34065
-44b23140314523614459b33f3c5841456523456023456560234560b08976
-6818b080622020b1583c4565234520b003266062636820b003266165b03c
-236544b058234420b13f414565234520b003266062636820b003266165b0
-41236544b03f2344b10041455458b141406544b23f403f45236144594569
-5342014b5058b108004259435c58b108004259b3020b0a124358601b2159
-421610703eb0124358b93b21187e1bba040001a8000b2b59b00c2342b00d
-2342b0124358b92d412d411bba04000400000b2b59b00e2342b00f2342b0
-124358b9187e3b211bba01a80400000b2b59b0102342b0112342002b2b2b
-2b2b2b2b2b00b01243584bb035514bb021535a58b1262645b04061445959
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b737373737345b040614418
-004569444569447373737473737374737473742b2b2b2b2b2b2b2b2b2b2b
-2b0073737373737373737373737373737373737373737373747474747474
-7474747474747474747474747474747575757374757575752b7300004bb0
-2a534bb036515a58b1070745b040604459004bb02e534bb036515a58b103
-0345b0406044b1090945b8ffc06044592b4569440174007373732b456944
-2b012b435c58400a0006000702a006a00702b9ffc00274b31a1d326fbd02
-77007f02770002ffc00277b22f3132b9ffc00277b322253240b80274b32f
-353240b80274b3282a3240b80274b21a2132b8ffc0b3371a1d32b8ffc0b3
-251a1d32b8ffc040112d1a1d329025902d9037a025a02da03706b8ffc0b6
-a61a1d321fa61fb8028eb22fa60300742b732b2b2b2b2b2b2b2b742b7374
-59002b2b435c58b9ffc002a1b21c1d32b9ffc002a0b21c1d322b2b592b73
-012b2b2b2b002b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b012b2b2b2b2b
-2b2b73742b2b2b2b2b2b2b2b73732b2b2b2b2b2b732b732b2b2b742b2b2b
-73737373732b73732b2b2b732b2b002b2b2b2b7374732b732b2b2b2b752b
-2b2b2b2b2b2b2b752b2b2b2b2b732b2b2b2b7374752b2b7373732b2b2b73
-2b737374752b2b7374752b2b7374752b2b2b2b2b2b2b2b2b2b2b2b74752b
-000000>
-[16305 16261 16301 15993 16353 16361 16377 15773 16093 16113 15821 16109 16365
-15025 16197 16361 15857 16053 15881 16233 16301 15449 16065 16377 15477 15965
-16117 15425 15557 16353 16369 11749 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-
-2 0 3 <> Arial-BoldMT AddT42Char 
-2 8582 38 <00010061ffe7055e05d3001a00d6404e8609891489169f009806c709d403
-d40bf503092509280c280d29142916750575098605080713071717131717
-29022a03250507280599059709c903c50b053f014f01020152100001e000
-f0000200b8ffc0b311183400b8ffc0b30a0d3400b8015a4017182d04080e
-400e12340e4b5f0f014f0f010f401518340fb801284022122d0a030fef0e
-5600ef00014f0102011a301c011c1527a007010f071f0730070307b8028c
-b31b7e53182b4e10f45d714ded4e105df65d4dedf4ed003ffdf42b5d71e4
-2b3ffdf42b2b5d71e45d3130005d015d5d5d010506042320001110002120
-171617052626232206111016333236043f011f42fecdecfedcfe88017a01
-34010da86432fedb1aa576a3cbc8a076aa021b5bf0e9018f015a016e0195
-9f5eb0467284eafefafeeaec9600>Arial-BoldMT AddT42Char 
-2 10014 44 <0001008c000001b405ba0003006fb90005ffc0b332343405b8ffc0b32325
-3405b8ffc0403f1417340005400550058005e005051f0560057005f00504
-8005010201020300080203d9010000b000e00003c000f0000220003000d0
-00e00004006e04319f182b4e10f45d71723c4dfd3c003f3c3f3c3130015d
-71722b2b2b331121118c012805bafa46>Arial-BoldMT AddT42Char 
-2 10766 47 <0001009d000004a505ae0005003d401a5007010201020403250500080405
-1a0702032001200030000200b8028bb30631b9182b4e10f45d3c4dfd3c4e
-10fe3c003f3c4dfd3c3f3c3130015d3311211121159d012802e005aefb49
-f700>Arial-BoldMT AddT42Char 
-2 10858 48 <000100910000061905ba000c0218400b0b032608260b0304030103b8ff80
-40091c3a340a203a3b3409b8ffe0b33a3b3409b8ffe040a41c2e340a201c
-2e340609080ae309ec0a0404090a0a13021c0410091f0a23022c0420092f
-0a6702680465096a0a77027804a409aa0ab509ba0af609fa0a169f049009
-9f0ac609c90ad702d804d609d90ae702e804e509ea0a0d7709780a83028c
-0483098c0a900207580b65026a046709680a760279040744024b0444094b
-0a57085709580a07180a2f0e34023a0434093b0a3f0e0703020c04060909
-0a15021a04170907b10602435458401f0204030a09050c070732060e0c32
-0000031003020850080d340b50080d3403b8ff80400e0b0d3408400e2734
-0b400e273403b8ff9c40100e2734030b08030100040102070a0008003f3c
-3c3f3c111217392b2b2b2b2b2b5d012fed10d4ed111217391bb8ff3b402d
-030a09200408090932030414030304020b0a0a320302140303020b080303
-0c0402020c0a0a090907081f0e010eb8010db307060504ba02380005ffc0
-b35b5d3405b8ffc0401753543405320740077f080108bd7f030103bd0b20
-0b0c02b802384012010000405b5d34004053543400321f0c010cb8010db3
-0d3175182b10f471ed2b2b103cee103c1a1910fd71fd713c1a1810fd2b2b
-ee103c10e471003f3c103c103c3f3c12173987052e2b877dc4872e182b87
-7dc42b593130014bb0135358b90008ffe0b10b20383859015d5d5d5d5d5d
-71722b2b2b2b002b715d331121010121112111012101119101bb010a0107
-01bcfeedfeddfee3fede05bafc1803e8fa460482fb7e0482fb7e>Arial-BoldMT AddT42Char 
-3 434 68 <00020049ffe8042e043e0023003201714068071a081c051d161a4a1b481c
-4925db10df11093619461957266619672686269219931aa61ab91bc71ac8
-1b0c06060d151606191627062915591977028602a606b506c6060cbf34d9
-10021d243231112c0d24402b2e3424402228342440191d346f24fc240224
-461db8ffc040300e0f343d1d01001d101db01df91d041d1d2c013300400e
-0f340f001f0002005521401c113f21401b103f2140181a3421b80274b504
-070c0d0a2cb8ffc0b31c113f2cb8ffc0b31b103f2cb8ffc0b3181a342cb8
-02744040140b1e3126082909280d591f0c9f0c021f0c01ff0c010c400e16
-340c1a4f340134600001008e300101013329215f1701df17014f175f176f
-17031719336941182b4e10f45d71724dedf471ed5d4e105df62b5d71724d
-edf4e4fd3c003fed2b2b2b3f3c3ffd2b2b2bf45d2be412392f5d712bb106
-02435458b22f1d017159edb10602435458b90024ffc0b71b1d3454246424
-025d2b595d2b2b2b111239030e103c3c3c313001715d005d710127363633
-321616150314161721262726270606232226353436363736373534262322
-060106060706151416333237363736350165ff2bd2cfbcb84b031b25feea
-0b10070348a45da4bd569b92c54c506f4b54015e36ea243758444c453310
-0b02e22e9a945989b7feb88c854c1c3719084646b2885a8d4b1c25201c51
-453bfed2123218273c3b563226372465>Arial-BoldMT AddT42Char 
-3 1212 70 <00010055ffe8043f043e001900e14051580f59125916680f691269167d18
-79199702970cc610c618d710d618e906e908e913e915f80613381338154a
-124a164618590c690c073a1237163718037705770f8705860f8919a812a7
-16b912b616090eb8ffc0b3181b340eb8ffc0b51214340e330db8ffc0b319
-1e340db8ffc0b30f11340dba0104000a02744012110b0040181b34004012
-1434003390010101ba0101000402744020170701401214340121002f0d40
-1214340d214f0e010e1a1b072114191a5841182b4e10f44ded4e10f65d4d
-ed2bf4ed2b003ffdf45de42b2b3ffdf42b2be42b2b3130005d7101715d01
-052626232206151416333236370506062322001110003332160431feeb0e
-634f697d7f6b50661501142bf4cde9feeb0116edc2e502ec32535491aabd
-9c5b6f2fbec20126010401070125a700>Arial-BoldMT AddT42Char 
-3 1768 72 <00020041ffe80427043e0014001c01a3b90010fff840460b3999099a0d96
-10a805a70abb09bb0db81a0808140148024706460a4f1ea80db606b61ac7
-0ac80cd60ad80cf807f70d0d1c0f1c15401b1d3415400e11340f15bf15cf
-150315b8ffc0b30f1e3f15b8ffc0b30e173f15b8028d400c0f0e12500e60
-0e020e181201b8ffc0b6191b3401331200b8ffc0b31d203400b8ffc0b322
-293400b8ffc0b32b2d3400b8ffc0b3181c3400b8ffc0400f0e0f34a00001
-0000100002005f1212b80274b3040b1218b8027440240b070021012f1521
-4f0e010e1a2f1e5f1e6f1e9f1e041e0f2108400d0f3408191d6941182b4e
-10f42b4ded4e105df65d4dedf4ed003fed435c584014184028143f18401e
-0f3f18401b103f18401c113f2b2b2b2b593ffd435c58b90012ffc0b32814
-3f12b8ffc0b31e0f3f12b8ffc0b31b103f12b8ffc0b21c113f2b2b2b2b59
-f45d712b2b2b2b2b435c58b90000ffc0b2123900b8ffc0b2173900b8ffb0
-b3090a3e00b8ffc0b241213f2b002b2b2b59e42b1112395d435c5840140e
-400f1e3f0e401c113f0e401b103f0e400e173f002b2b2b2b592f3cfd2b2b
-722b2b3c0111333130015d71005d2b010506062320272635100033320003
-211616333236132626232207061702fa011836e9affeeb85690114d3ed01
-1206fd40038261425a270378565c3c3c0101522f9aa1b591dd0108012bfe
-c7febd7d8b48016c7a7f43437300>Arial-BoldMT AddT42Char 
-3 2548 74 <00020054fe510460043e0023002f014e4062771d871d02120c0d7031860d
-8031042001230223033001330233034001430243035b0f59145925562956
-2b592f6b0ff811f813123b0d33163b28332c4b0d44164b28442cf00cfd17
-0a8e0c010c0b0c0d0b2a0c0d270e1617152d0d0c171604182401b8ffc0b5
-191b34013300b8ffc0b30e113e00b8ffc0b30b0c3e00b8ffc0b3282a3400
-b8ffc0b323253400b8ffc0b331343400b8ffc04009151b34600001005f05
-b80274b21f0f27b80274b20e0a2db80274400b15071819062a290b261a18
-b80129400919191a1a8f31013101b801b8400a00332421121930583c182b
-4e10f44dedf4ed4e1071f63c4d10ed10fde4003f3c3fed3fed3ffdf4722b
-2b2b2b2b2bb10602435458b90000ffc0b30e113400b8ffc0b2090c342b2b
-59e42b01111217390011123939111239390708103c313000715d015d7143
-58400d690f691469256729662b692f065d59005d17051617163332373637
-3635350623222726351000333217352111140e0223202635341314163332
-36353426232206790141081d28566e3725130d7ec0d67d620101bfc58001
-073e70bb8ffef2e2fc8360678e88686583462738151e211631235e9bacb5
-8fd5010b011aad95fc47bcba6a3cb98e0e0283a99da19ea5a09d>Arial-BoldMT AddT42Char 
-3 3024 75 <000100920000045905ba001600b2402b0f011f0139013302331042014211
-de01f9010907051605240258116811050101021314111213031402010fb8
-0274401d0307090a0a14150a1600000b0a26080940202434af0901ff0901
-091a18b8ffc040162224349018a018027018f01802ef1801180014261615
-b8ffc0400f202434a01501f015011519173f3c182b4e10f471722b3c4dfd
-3c4e105d71722bf671722b3c4dfd3c003f3c3f3c3c103c3fed3939111739
-030e103c083c3130015d005d01113633321e021511211134262623220606
-1511211101ab88bd619c4f1dfee720513d466e33fee705bafde59f487088
-8ffd910231a75a35448986fdec05ba00>Arial-BoldMT AddT42Char 
-3 3280 76 <00020093000001ac05ba000300070077b90009ffc0403f110a3f40095009
-028009b009c009d009ef09051f0960097f09a009b0090503060700050403
-0f00014000d000e00003005d02010006050607040a0207260104b8ffc040
-092124340419083f3c182b4e10f42b3c4dfd3c003f3c3f3c3f3cfd5d713c
-0305103c3c103c3c313001715d722b1311211101112111930119fee70119
-04b60104fefcfb4a0426fbda>Arial-BoldMT AddT42Char 
-3 3658 78 <000100890000045f05ba000b00f3b90003ffddb30d113f03b8ffc0407d19
-2d3407031003130627096606af0abf0ac809cb0ada0a0a53036003020d07
-180946065708760605b609df04ed04fc04f506054e074e0866067d048c04
-9b049c059a069a079a080a1f0412062b042b052a062a072a082f0d4b044b
-050a060607090a09080a050a090306040b050406020100000b0b08070a03
-0a0a0b04b8026d401a052f08391f070107650d020b26018000011f000100
-190c3f7b182b4e10f45d713c4dfd3c1910f67118edf4ed103c103c003f3c
-3c103c3f3c3f3c12173987087d10c4083cb10602435458b90003ffc8b209
-2134002b593130015d5d5d7100725d2b2b33112111012101012101071189
-01190149015afe950185fed1fef58305bafcf60176fe7cfd5e01dd89feac
->Arial-BoldMT AddT42Char 
-3 4502 81 <0001009100000459043e0016009f4018071317135a08680804b804013408
-34104408440fe9100506b80274401d11070e0d060c0b0b01000a02012616
-0040202434af0001ff0001001a18b8ffc040162224349018a018027018f0
-1802ef1801180a0b260c0eb80129b20d0d0cb8ffc0400f202434a00c01f0
-0c010c19173f3c182b4e10f471722b3c4d10ed10fd3c4e105d71722bf671
-722b3c4dfd3c003f3c3c103c3f3c3fed3130005d01715d21211134262623
-2206061511211121153633321e02150459fee724513949742bfee701058b
-d35d9a4f1f021eac65385084b2fe1f04269cb44368847b00>Arial-BoldMT AddT42Char 
-3 5486 85 <0001008700000337043e001000a84028970501090e01530566057505032f
-12580e680e7012040a090f0c1f0c028f0cff0c023f0c4f0c020cb8027740
-29070701000a0302060a28000910093009700904091a7f129f12025f127f
-12af12d01204121000260103b80129400b02028001a001020119113fb901
-1c00182b4e10f4713c4d10ed10fd3c4e105d71f65d194de400183f3c3f3c
-3fed5d717239323130015d005d71004bb017534bb035515a58b10a323859
-005d212111211536363332170726232206061101a0fee70105436b446059
-57473d3b522f0426976b4435f52e41aafef1>Arial-BoldMT AddT42Char 
-2 0 0 <00020100000005000500000300070042b40201fe0607b8023f4013000504
-fe03000a0704fe010019080605fe0203bc0126000901b0011800182b10f6
-3cfd3c4e10f43c4dfd3c003f3cfd3c10fc3cfd3c31302111211125211121
-01000400fc2003c0fc400500fb002004c000>Arial-BoldMT AddT42Char 
-Arial-BoldMT /CharStrings get begin
-/space 3 def
-/C 38 def
-/I 44 def
-/L 47 def
-/M 48 def
-/a 68 def
-/c 70 def
-/e 72 def
-/g 74 def
-/h 75 def
-/i 76 def
-/k 78 def
-/n 81 def
-/r 85 def
-end
-Arial-BoldMT /Encoding get
-dup 32 /space put
-dup 67 /C put
-dup 73 /I put
-dup 76 /L put
-dup 77 /M put
-dup 97 /a put
-dup 99 /c put
-dup 101 /e put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 107 /k put
-dup 110 /n put
-dup 114 /r put
-pop
-end
-%ADOEndSubsetFont
-/KUDFOD+Arial-BoldMT /Arial-BoldMT findfont ct_VMDictPut
-/KUDFOD+Arial-BoldMT*1 
-[32{/.notdef}rp /space 34{/.notdef}rp /C 5{/.notdef}rp /I 2{/.notdef}rp /L 
-/M 19{/.notdef}rp /a /.notdef /c /.notdef /e /.notdef 
-/g /h /i /.notdef /k 2{/.notdef}rp /n 3{/.notdef}rp 
-/r 141{/.notdef}rp]
-KUDFOD+Arial-BoldMT nf
-KUDFOD+Arial-BoldMT*1 [11.04 0 0 -11.04 0 0 ]msf
-232.625 40.68 mo
-(ICC Manager)
-[3.12431 7.91568 7.9157 2.88144 9.24039 6.11615 6.7233 6.11615 6.72327 6.11618 0 ]xsh
-/KUDFOD+Arial-BoldMT*1 uf
-/KUDFOD+Arial-BoldMT uf
-/Arial-BoldMT uf
-%ADOBeginSubsetFont: Arial-BoldMT Initial
-ct_T42Dict begin
--0.625 -0.375 2 1.008
- 256 array 0 1 255 {1 index exch /.notdef put} for  /Arial-BoldMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f32115d5e9f000000cc000000606376
-7420fb3ea3da0000012c0000075a6670676d08e8ba2800000888000005d7
-676c79664fc39cd400009edc0007c44c68656164d65e5fe200000e600000
-003668686561127e15fe00000e9800000024686d7478d62bc37500000ebc
-000034d46c6f636132ab8c4800004390000034d86d61787014dc04760000
-7868000000206e616d65ae0c9081000078880000147d70726570f14ae516
-00008d08000011d267646972000000000000000000000000000303d402bc
-00050008059a05330000011b059a0533000003d1006602120805020b0704
-020202020204e0002affc00078430000000900000000544d432000200020
-fffc05d3fe510133073e01b2400001ffffff0000042605ba000000200004
-05ba001c05ba001c05a7001c0426001c0000ffe40000ffe40000ffe4fe69
-ffe405ba001cfe69ffe402ea0000011d0000011d000000000000000000b2
-00ac00d70128012000b301fa001700f8011901310049000400f7000300af
-00fd00950014005400960112002400160055004901040119012b008c019b
-ff76ffe9003d009200a2ffb70182ffaa0016008f00c600f8001c00de0401
-0037004e00550055006500e903e50059ff9a00080087000b003b00520116
-006100d600d600f500000093009400be017cfff80004001400820092003c
-00410041ffc1fffc002a008c049005d809b5009100bb0106ff63ff69001e
-0022008a022bffd6ffdf0026005900a300ac0104012b01c004480021006b
-00850098011903c6006b009500a400fe010c025d034305bf000000490056
-006e0077008a00aa00ca0112015005d805f0ff7bffe70006001300280061
-006900e90135014d02a5040cff3effda005b00b900c801190119011901c0
-045b04a7055bfe3fff9dffc2001500b7010a01bc01c10532058efd81ffa1
-ffae000c00260031003d004e00560062008300c100c900f100f2027fff7f
-00480053007700c5011d01200126012801d60219027e027e03d3002e0041
-005d006b0075009f00b000b200ba00bb00bd00d600db00e000e50114011b
-014a0162019101f2020c026402cf039b03b403d4040104a9001600230025
-002a007400a500b600cc00cd00cf0105012001300150016a016f0197019d
-01e002b002ec02f70408048304fb04fd0526fee0fefbff4efff50018001a
-004c007a007f009100a300b300b400ce00d500f200f300f6011001380168
-01a101b001e001ec02090222024f0270029602a502ad034e039103c10435
-0442046b04cd04da0586058b076107fefca6fe93feadfed1ffb7ffd10003
-000e00180026004600690081008f00a500bf00d300d500d900dd00e20119
-012b0138013b015a015e016801730188019401ad01c501d101ea01f20200
-020002000222023b0244024f026f0272027e02820293029402a502cf02cf
-02d002da02dd02eb02f5030503220336037103a103b003b803d003e60410
-0426042e0431044f045a04ff053205320547055305a805ab05c205f0063c
-0664067006e80782078408ccfd2afddefe00fe68feb0feb3ffaa00080059
-007a0091009e00a200af00b400bb00ca00cc00ce00d900e000f40114011a
-01210127012b01390146014b014d0157015c01650182018701920198019b
-01a201ae01c501c501d102070222022b024102530261026502840287028d
-02b402b402ba02c902d602d802ed02f503170323032b03310349035a035b
-036e03710374037e03840391039103aa03cf03d303e703e803ed04080417
-041e0475047a049904a704b404d1054c056d056d05a205bf05c005d105fc
-05fc0602061a061c062f066a06a806e2070607360750078907d407f30870
-011c012a011a01200000000000000000000000000219000b001e02aa0214
-047f01ed0000001d0104000f0091002b01880153011201f3003f03fe0168
-010e047f01ed036e03150219041300000000064004b00000027401bb0035
-01c5007f06020301000004e000b201dc02e004c3023d00d50160011904a7
-036e05ca022100ab0426009002bc02bb014200b4023c0256029c030001e5
-01a800e5006b00780094016b017300ab01ed013a017d0137017f00d40216
-03530184003cffa202040109014901f0006e031500810464005e00000000
-0000000000000000000000000000000000000000000000000000013900dc
-00e9fe9e040d047c012b00b80096005900ac00df01a900fa0105ffec0017
-0003005500610004008c00a3008500280120005d00d6007f012601190104
-016c06cf00b4010600000737063e047a00f000f900e905ba042604420000
-ffe7fe69049e04e3ff37ff2d01200105012000a800740068004700f200e5
-00d900bd00a800680047005c0048000a0028003200410050005a0064007d
-00870091ffb0ff9cff83ff79ff6f00cb012000fa012c01fa01a000d500b8
-005c003c00c800c8008f00d9018b00b30047000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000fe6400c000ea01180125013203b003ed0576
-059005aa05b405be05cd063100780084009b00cc00e200f4010a01200163
-00d100ea00f7010801420019002c00340041003800480058006c025903bd
-0043011a007000d30028003700420050005a0064007300780082008c009c
-00a500bd00ce00f00110015c00be00d801020117012c016300ea01080041
-004b0055005f007300a60109018301b300410064001e002a00eb00fa010e
-01380274002c00400082009600b600c000cc00dc00e600f000ff010a0120
-012c013b01440156016300f70057006401100136005001b10000ffb60039
-004e004403cc00e5002401100042012201a400f0006000e0000e001d0039
-05e30102002cfe4eff38026903bd011600ff000e00a00054001b003d0171
-0041000f005000fd0015014f0035fe52002c00d3010304b001d200b600c0
-00990265ff870377fe6c00cb00a9005c0040047607440000404154403f3e
-3d3c3b3a3938373534333231302f2e2d2c2b2a292827262524232221201f
-1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201
-002c4523466020b02660b004262348482d2c452346236120b02661b00426
-2348482d2c45234660b0206120b04660b004262348482d2c4523462361b0
-206020b02661b02061b004262348482d2c45234660b0406120b06660b004
-262348482d2c4523462361b0406020b02661b04061b004262348482d2c01
-10203c003c2d2c20452320b0cd442320b8015a51582320b08d44235920b0
-ed51582320b04d44235920b09051582320b00d44235921212d2c20204518
-684420b001602045b04676688a4560442d2c01b10b0a432343650a2d2c00
-b10a0b4323430b2d2c00b0172370b101173e01b0172370b10217453ab102
-00080d2d2c45b01a234445b01923442d2c2045b00325456164b050515845
-441b2121592d2cb00143632362b0002342b00f2b2d2c2045b0004360442d
-2c01b00643b00743650a2d2c2069b04061b0008b20b12cc08a8cb8100062
-602b0c642364615c58b00361592d2c45b0112bb0172344b0177ae4182d2c
-45b0112bb01723442d2cb01243588745b0112bb0172344b0177ae41b038a
-45186920b01723448a8a8720b0c05158b0112bb0172344b0177ae41b21b0
-177ae45959182d2c2d2cb0022546608a46b040618c482d2c4b53205c58b0
-02855958b00185592d2c20b0032545b019234445b01a23444565234520b0
-0325606a20b009234223688a6a606120b01a8ab000527921b21a1a40b9ff
-e0001a45208a54582321b03f1b235961441cb114008a5279b31940201945
-208a54582321b03f1b235961442d2cb110114323430b2d2cb10e0f432343
-0b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2cb10e0f432343650b
-2d2cb11011432343650b2d2c4b525845441b2121592d2c0120b003252349
-b04060b0206320b000525823b002253823b002256538008a63381b212121
-212159012d2c4bb06451584569b00943608a103a1b212121592d2c01b005
-251023208af500b0016023edec2d2c01b005251023208af500b0016123ed
-ec2d2c01b0062510f500edec2d2c20b001600110203c003c2d2c20b00161
-0110203c003c2d2cb02b2bb02a2a2d2c00b00743b006430b2d2c3eb02a2a
-2d2c352d2c76b8023623701020b802364520b0005058b00161593a2f182d
-2c21210c6423648bb84000622d2c21b08051580c6423648bb82000621bb2
-00402f2b59b002602d2c21b0c051580c6423648bb81555621bb200802f2b
-59b002602d2c0c6423648bb84000626023212d2cb4000100000015b00826
-b00826b00826b008260f10161345683ab001162d2cb4000100000015b008
-26b00826b00826b008260f1016134568653ab001162d2c4b53234b515a58
-20458a60441b2121592d2c4b545820458a60441b2121592d2c4b53234b51
-5a58381b2121592d2c4b5458381b2121592d2cb0134358031b02592d2cb0
-134358021b03592d2c4b54b012435c5a58381b2121592d2cb012435c580c
-b00425b00425060c6423646164b0035158b00425b00425012046b0106048
-2046b0106048590a21211b2121592d2cb012435c580cb00425b00425060c
-6423646164b807085158b00425b00425012046b8fff060482046b8fff060
-48590a21211b2121592d2c4b53234b515a58b03a2b1b2121592d2c4b5323
-4b515a58b03b2b1b2121592d2c4b53234b515ab012435c5a58381b212159
-2d2c0c8a034b54b00426024b545a8a8a0ab012435c5a58381b2121592d2c
-462346608a8a462320468a608a61b8ff8062232010238ab902a702a78a70
-456020b0005058b00161b8ffba8b1bb0468c59b0106068013a2d2cb10200
-42b123018851b1400188535a58b910000020885458b202010243604259b1
-2401885158b920000040885458b202020243604259b12401885458b20220
-02436042004b014b5258b2020802436042591bb940000080885458b20204
-0243604259b94000008063b80100885458b202080243604259b940000100
-63b80200885458b2021002436042595959592d00000100000005028f9f18
-7df95f0f3cf50819080000000000a2e33c1d00000000c14fd725fafafcfd
-1000081500010009000100010000000000010000073efe4e00431000fafa
-fa7a1000000100000000000000000000000000000d350600010000000000
-023900000239000002aa00b803cb00700473001204730046071d005905c7
-005a01e7005c02aa006b02aa0043031d001c04ac00550239007502aa0073
-023900930239fffd04730056047300a2047300330473004d047300260473
-005b0473005704730057047300530473004102aa00c902aa00aa04ac005f
-04ac005504ac005f04e3006a07cd003d05c7000005c7009605c7006105c7
-00940556009504e300970639006205c700960239008c0473002305c70099
-04e3009d06aa009105c7009806390059055600950639005905c700960556
-004a04e3002c05c700930556ffff078d0007055600000556fffd04e30016
-02aa00920239fffd02aa002604ac00730473ffed02aa002a0473004904e3
-00870473005504e300540473004102aa001804e3005404e3009202390093
-0239ffa20473008902390093071d007e04e3009104e3005204e3008b04e3
-005b031d00870473003002aa001f04e3008d0473000b063900090473000c
-0473000e04000022031d003c023d00b0031d002d04ac004305c7000005c7
-000005c700610556009505c700980639005905c700930473004904730049
-047300490473004904730049047300490473005504730041047300410473
-004104730041023900920239ffe90239ffcd0239ffd004e3009104e30052
-04e3005204e3005204e3005204e3005204e3008d04e3008d04e3008d04e3
-008d0473004403330056047300540473000d0473003b02cd00420473fffe
-04e3008b05e5fff705e5fff7080000d802aa00bb02aa0005046400310800
-ffaa0639003f05b40098046400320464003c0464003c04730001049c006f
-03f4002c05b4007a069600a1046400000231000002f6002502ec001a0625
-0037071d005804e3005704e3006502aa00c304ac0055046400540473ffec
-0464001f04e5001a047300600473006a080000c905c7000005c700000639
-005908000048078d00580473fffc08000000040000840400006902390098
-023900720464003103f4002f0473000e0556fff70156fea90473ffe002aa
-004b02aa004b04e3001f04e3001f04730044023900930239007504000071
-0800000105c700000556009505c7000005560095055600950239006a0239
-ffae0239ffbf0239ffc106390059063900590639005905c7009305c70093
-05c700930239009302aa000302aafff302aa001302aa001a02aa00cd02aa
-009102aa002602aa006002aa003902aa000304e3000a0239000a0556004a
-0473003004e3001604000022023d00b005c7fffd04e300530556fff70473
-000e0556009504e3008b04ac005504ac006d02aa005b02aa001902aa0028
-06ac005c06ac005c06ac0028047300000639006204e300540239008c0556
-004a0473003005c700610473005505c700610473005504e30054046bffed
-02aa00c805c700000473004905c700000473004905c7009405c0005105c7
-fffd0556009504730041055600950473004104e3009d0239007904e3009d
-0315009504e3009a03d5009005c7009804e3009105c7009804e300910639
-005904e3005205c70096031d008705c70096031d00500556004a04730030
-04e3002c02aa001f04e3002c03d5001e05c7009304e3008d05c7009304e3
-008d04e300160400002204e300160400002204cf009a0639005606910056
-04eb004e04da004e03cc004e0579004e0392003005b9004e046bffed04d5
-00b8032b004f08c000290800004f040000990800004f040000990800004f
-040000980400009807d5016a05c7008f04ab005504d5009d04ac005504d5
-022204d5010505abffe9050001c905ab027e05abffe905ab027e05abffe9
-05ab027e05abffe905abffe905abffe905abffe905abffe905ab01c005ab
-027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab01c0
-05ab01c005abffe905abffe905abffe905ab027e05ab01c005ab01c005ab
-ffe905abffe905abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905ab02d605ab006605abffea05d5ffff04d500920800000007eb0130
-07eb012007eb013007eb012004d500b204d5008004d5002a082b0198086b
-01b807550010060000f40600006f0440003a0540003704c0003f04150040
-04000025060000550647008c0473009005abffc701eb008d03d500860715
-002303e9001804d5009202d6005c02d6005c04d500b202d6004d05c70000
-0473004905c700610473005505c700610473005505560095047300410556
-00950473004105560095047300410639006204e300540639006204e30054
-0639006204e3005405c7009604e3009205c7000504e300190239ffba0239
-ffbb0239ffda0239ffda0239ffe10239ffe2023900480239004704730023
-0239ffa205c70099047300890473008d04e3009d0239ffed05c7009804e3
-009105c9009c04e3008e0639005904e300520639005904e3005205c70096
-031d002a0556004a0473003004e3002c02aa000705c7009304e3008d05c7
-009304e3008d05c7009304e3008d05c7009304e3008d078d000706390009
-0556fffd0473000e0239008d05c70000047300490800ffaa071d00580639
-003f04e3005702aa00c9078d000706390009078d000706390009078d0007
-063900090556fffd0473000e0239009502aaffd70473000d04cd005a06ac
-005c06ac002906ac003006ac002f02aa00bc02aa002602aa00bb03b8fff4
-05c7ffe806d3ffbb073fffbb03caffbb0699ffa6076bffc806b4ff9c0239
-ff2905c7000005c7009605c000000556009504e3001605c700960239008c
-05c700990556000006aa009105c70098052600660639005905c7009a0556
-009504cd005a04e3002c0556fffd0556000006790056066a00620239ffcc
-0556ffff04eb004e039c004e04e3008e0239008204a8006c04e200900473
-000f03af004e04e3008e0453004e023900930476008e0473000f04e50090
-0473000b0390004e04e3005204f300760429004e04a80076049b00110607
-007606c2004e0239ffcd04a8007604e3004e04a8007606c2004e055a0097
-0715002f048900a405b100580556004a0239008c0235ffca0473002308c0
-001a0880009d0700003704e2009a04fa000005c0009905c7000005c0009b
-05c70096048900a405b3fffa05560095073b00170503002c05c0009905c0
-009904e2009a059d002006aa009105c700960639005905c0009905560095
-05c7006104e3002c04fa000006d400590556000005d8009a059f007d080a
-009a0827009a06f5001a07d5009d05c0009b05b100570840009605c00004
-0473004904f1005c04eb0096035500880514fff90473004105acffff03fa
-001804eb008c04eb008c040100880515001905eb009b04d5008804e30052
-04d5008804e3008b0473005503eb00150473000e070000540473000c04eb
-008904a5007206ab008c06c0008d05d5002806d5009504eb0099046b0038
-06d5009104abfffb0473004504e3000003550088046b0051047300300239
-00930240ffd00239ffa207c000180740008c04e300000401008804730012
-04d5008803e50096039300880800004108eb00a306200030000001010000
-001e0000003100000031000001010000007f0000007e0000008c0000008c
-000001010000001000000101000001210393007d0000008c026500c80000
-03020000ff0102aa00c904a90059049b004103a7000a0466003204ea0082
-022f0087034e005a04ed00870503007d022f0087042c002803ed004b03f8
-004104e30087050a0037022f00870316004b04e800500459000a04c00064
-04b2006403ff000a0418000a04950082042c002805b8005a0563002d045e
-0087045e0087045e00870236005004090050068b0087022fffac042c0028
-042c002803f8ff1603f8ff160479003205b8005a05b8005a05b8005a05b8
-005a04a9005904a9005904a90059049b004103a2000a0466003204ea0082
-02950000038100000503007d02950000042c002803ed004b03f80041050a
-00370316004b04e8005004c0006404b200640418000a04950082042c0028
-05b8005a0563002d022f0087049b004103ed004b04b2006404db00410000
-ffdc0000ff250000ffdc0000fe51028d00ab028d00a002da004303c0007e
-0196ffba0000004600000046000000460000004600000048000000460000
-004600000046047e0188047e0150047e0104047e009e047e012d047e00ea
-047e00d5047e009c047e00bc047e00ee04350085028d00c1043500b30600
-01000600010002be005806000100047e00a5047e00bd047e00de06000100
-060001000600010006000100060001000000004606000100060001000600
-0100060001000600010006000100060001000600010004e6ffba06000100
-06000100060001000532003905320039022cffba022cffba060001000600
-01000600010006000100049e0034047800300430ffba0430ffba0376000a
-0376000a060e00290708002902e2ffba0456ffba060e00290708002902e2
-ffba0456ffba05280097046f000a03520003060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100000000300000004600000046
-000000400000004606000100060001000000ffdc0000fe510000ff160000
-ff160000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ffdc0000ff160000ffdc0000ff200000ffdc0473002d080000000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d007f028d00670600
-010005a0002e03c0007e01e800000207ffc301bc005e01e0fffa039c0006
-039c000601bc005e01e0001a05280097049e0011022cffba022cffba01bc
-008801e0001a0532003905320039022cffba022cffba02be003603520003
-0532003905320039022cffba022cffba0532003c0532003c022cffba022c
-ffba049e0034047800300430ffba0430ffba049e0034047800300430ffba
-0430ffba049e0034047800300430ffba0430ffba02be006902be006902be
-006902be00690376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba073200400732004004deffba04deffba088000400880
-0040062cffba062cffba0880004008800040062cffba062cffba0430ffba
-0430ffba0430ffba0430ffba0430ffba0430ffba0430ffba0430ffba0454
-003403c000460454ffba02e2ffba0454003403c000460454ffba02e2ffba
-0610002f0610002f0270ffba0298ffba04e6002704e600270270ffba0298
-ffba045400290454002902e2ffba02e2ffba039c0023039c002301e0ffba
-01e0ffba02e2002102e200210352ffba0352ffba0454003e0454003e022c
-ffba022cffba02be00580352000303c0ffba039cffba039c0006039c0006
-05280097046f000a05280097049e0011022cffba022cffba0454000004c4
-000003e400220454001a03e400220454001a03e400220454001a06000100
-060001000000004600000046060001000600010006000100000000460000
-004606000100060001000000004800000046060001000600010006000100
-000000460000004600000046000000460000004000000030060001000000
-004600000046060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100028d00ca028d00c7028d00c6060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010002be0069
-0100ffba0800ffba1000ffbb06d3005905b0005206a3009305cb008d0000
-fd880000fbc10000fc5f0000fe310000fcad0000fd550000fe260000fdf1
-0000fd180000fc690000fd950000fbe00000fc700000fed40000fecd0000
-fea0041b007806ac005c06ac00190000fe450000fd550000fda60000fc5f
-0000fe250000fd180000fbe00000fafa0000fb360000fc700000fb870000
-fb9b0000fcce0000fc540000fbc30000fc940000fbf50000fdb00000fe59
-0000fd7e0000fc820000fd340000fe500000fe460000fcd10000fd3e0000
-fd020000fc3a0000fce90000fc260000fc070000fc2f0000fb9e0000fb76
-0239009305c700000473004905c700000473004905c700000473004905c7
-00000473004905c700000473004905c700000473004905c7000004730049
-05c700000473004905c700000473004905c700000473004905c700000473
-004905c70000047300490556009504730041055600950473004105560095
-047300410556009504730041055600950473004105560095047300410556
-00950473004105560095047300410239006a0239005d0239008c02390093
-0639005904e300520639005904e300520639005904e300520639005904e3
-00520639005904e300520639005904e300520639005904e3005206d30059
-05b0005206d3005905b0005206d3005905b0005206d3005905b0005206d3
-005905b0005205c7009304e3008d05c7009304e3008d06a3009305cb008d
-06a3009305cb008d06a3009305cb008d06a3009305cb008d06a3009305cb
-008d0556fffd0473000e0556fffd0473000e0556fffd0473000e05c70000
-047300490239ffca0239ffca0639005904e3005205c7009304e3008d05c7
-009304e3008d05c7009304e3008d05c7009304e3008d05c7009304e3008d
-0000fef90000fef90000fef40000feef0489fffd03550007073b001705ac
-ffff04e2009a0401008804e2009a0401008805c7009604d5008804730001
-047300120473000104730012055600000473000c059f007d04a50072059f
-009c04e3009205cf00590473004c0639005604e3005205320039022cffba
-0270ffba0298ffba04e60027022c0065022c0016022c0016022c0011022c
-0043022cffd20000fef00000000f0000fff502aa009002aa009000000000
-0000005e0000005e0000ffcb01bc000f01e0ffbf01bcfff501e0ffcd01bc
-001d01e0000901bc008801e0001a039c0006039c0006039c0006039c0006
-05280097046f000a0532003905320039022cffba022cffba053200390532
-0039022cffba022cffba0532003905320039022cffba022cffba05320039
-05320039022cffba022cffba0532003905320039022cffba022cffba0532
-003905320039022cffba022cffba0532003905320039022cffba022cffba
-049e0034047800300430ffba0430ffba049e0034047800300430ffba0430
-ffba049e0034047800300430ffba0430ffba049e0034047800300430ffba
-0430ffba049e0034047800300430ffba0430ffba049e0034047800300430
-ffba0430ffba02be004f02be004f02be006902be006902be006902be0069
-02be004f02be004f02be006602be006602be006902be006902be006902be
-006902be002f02be002f02be002202be00220376000a0376000a0376000a
-0376000a0376000a0376000a0376000a0376000a0376000a0376000a0376
-000a0376000a0376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba073200400732004004deffba04deffba073200400732
-004004deffba04deffba0880004008800040062cffba062cffba08800040
-08800040062cffba062cffba0430ffba0430ffba0454003403c000460454
-ffba02e2ffba0610002f0610002f0610002f0270ffba0298ffba0610002f
-0610002f0270ffba0298ffba0610002f0610002f0270ffba0298ffba0610
-002f0610002f0270ffba0298ffba0610002f0610002f0270ffba0298ffba
-04e6002704e6002704e6002704e60027093e0032093e00320740ffba0740
-ffba060e00290708002902e2ffba0456ffba045400290454002902e2ffba
-02e2ffba045400290454002902e2ffba02e2ffba045400290454002902e2
-ffba02e2ffba060e00290708002902e2ffba0456ffba060e002907080029
-02e2ffba0456ffba060e00290708002902e2ffba0456ffba060e00290708
-002902e2ffba0456ffba060e00290708002902e2ffba0456ffba039c0023
-039c002301e0ffba01e0ffba039c0023039c002301e0ffb101e0ffb1039c
-0023039c002301e0ffba01e0ffba039c0023039c002301e0ffba01e0ffba
-0454003e0454003e022cffba022cffba0454003e0454003e0454003e0454
-003e0454003e0454003e022cffba022cffba0454003e0454003e049e0034
-047800300430ffba0430ffba02be005803520003031a001a031a001a031a
-001a039c0006039c0006039c0006039c0006039c0006039c0006039c0006
-039c0006039c0006039c0006039c0006039c0006039c0006039c0006039c
-0006039c000605280042046fffd905280097046f000a022cffba022cffba
-039c0006039c000605280097046f000a022cffba022cffba05280097046f
-000a067f0044067f0045067f0044067f004501a800280000fe290000fe8c
-0000ff250000ff230000fefa0000ff7a0000fe5908fc003208ad00320000
-ffb50000ffb60000fef00000ff590000fe590000ff8c01b4000002f70000
-0000fe850000ff0704cd00320000ff580000ff580000ff59073200400732
-004004deffba04deffba0880004008800040062cffba062cffba04540034
-03c000460454ffba02e2ffba03c0007e02e2002102be0058022cffba0290
-ffba01f4002f01f4003b01f4001201f400b101f4006d060e002907080029
-022f00870000fec803500000045e008703e4fff50454fff503e400220454
-001a03e400220454001a03e400220454001a03e400220454001a03e40022
-0454001a03e400220454001a047e0072047e00bd03e4000f0454000f04e3
-001b06b1001e05c0009b04e3008705c0000a04e3000a05c7006905c70061
-0473005505c7fffd06b3001e05c0005c04e3005404da004e055600660503
-006f04e3ffac063900620518000207720092023900930239000705c70099
-047300890239001b0473000f07ef009605c7ffad04e3008e063900560718
-005905f300550641001e04e3008b05560095055600640473006304cd005a
-02e1001e02aa001f04e3001802aa001f04e3002d066a006205c700930629
-00000473000e04e300160400002204e3003a04e300590436002a04360039
-047300330473005b03fa001e04a2001f04e3008b023d00b003fb00b004ad
-005602aa00b80aaa009409c7009408e300540956009d071c009d04720093
-0a3a009808000098071c00910473004c05c70000047300490000fefe05c7
-0000047300490800ffaa071d00580639006204e300240639006204e30054
-05c70099047300890639005904e300520639005904e3005204e3003a0436
-00220239ffa20aaa009409c7009408e300540639006204e3005408430096
-0552009505c7009804e3009105c700000473004905c70000047300490556
-00950473004105560095047300410239ff370239ff2d0239fff40239ffe6
-0639005904e300520639005904e3005205c70096031dffcd05c70096031d
-008005c7009304e3006705c7009304e3008d0556004a0473003004e3002c
-02aa001f049e002e0429004905c7009604e30092059f009c050c0052050c
-005204e300160400002205c7000004730049055600950473004106390059
-04e300520000fefd0639005904e300520639005904e300520639005904e3
-00520556fffd0473000e0473004504e3005404e3008204e3008704730034
-0473001404e3005404e300540473004c0641004c03fa004f03fa00180587
-0018048a005202aaffc404e3005404e3005404b000520473000f04ce000f
-04e3008a04e3009204e300920239001b023900930239009302a8000002d9
-00140239009304d40093071d0085071d0085071d007e04e3ffa604e30091
-04eb008c04e3005206ab005206c2004e05ff0052031dffe6031dffe6031d
-ffe6031d0087031d0087031d0087031dffe604ab008a04ab008a04730030
-02aaffc402aaffc402aaff9b0451001e02aa001902aa001f04e3001b04f8
-004904a8009104730012063900090473000f0491000f0400002205700022
-0436002204360022047300420473005504730042047300550639005904eb
-0096048a004f04b0005204d5008803ab001e04730014039e008804e3005b
-0473004204730055083f00540789005409af00540682001f0446001f0698
-001f06f4001806350093058a00930445001e0482008802f1003202f10032
-018effe202040032020400000204000003000032042f000002e2000001e7
-005c03cb007002390098023900750239009402aa00f302aa00f303000032
-0300003204ac005f04ac005f04ac002a04ac002a02aa012102aa00bb02aa
-002a02aa012102aa001302aa002a02aa00bb02aa00ca02aa00ca02aa00f3
-02aa00f302aa00a602aa00a602aa00a602aa001302aaffe102aafffb02ed
-0000012100320302003202ee000003000032031000960310009603100096
-031000960310009602aa006202aa006202aa000302aa001d040000690457
-009604570096045700960457009604570043045700430457004304570043
-04570043031000430457002f0457002f0457002f0457002f0457002f0310
-002f04570025045700250457002504570025045700250310002f0457001a
-0457001a0457001a0457001a0457001a0310001a04570042045700420457
-004204570042045700420310004204570096045700960457009604570096
-0457004204570042045700420457004204570042031000420457002f0457
-002f0457002f0457002f0457002f0310002f0457002f0457002f0457002f
-0457002f0457002f0310002f045700260457002604570026045700260457
-002603100026045700420457004204570042045700420457004203100042
-045700960457009604570096045700960457004204570042045700420457
-004204570042031000420457002604570026045700260457002604570026
-031000260457002304570023045700230457002304570023031000230457
-002f0457002f0457002f0457002f0457002f0310002f0457004b0457004b
-0457004b0457004b0457004b0310004b0457009604570096045700960457
-00960457004204570042045700420457004204570042031000420457001a
-0457001a0457001a0457001a0457001a0310001a04570024045700240457
-00240457002404570024031000240457002f0457002f0457002f0457002f
-0457002f0310002f0457004e0457004e0457004e0457004e0457004e0310
-004e045700960457009604570096045700960000feaf0000febf0000fdb5
-0000fec80000ff780000feb10000ff3d0000fe6f0000feae0000ffce0000
-ff660000fe6f0000fec80000fec80000ff680000ff680000ff6800000000
-0000ff1f0000ff1f0000ff440000ff5f0000fe870000ffec0000ff9c0000
-ff510000ff510000ff510000febf0000ff15000000000000feb10000ff3d
-0000ff6b0000fef20000ff470000ffce0000fe870000febb0000feae0000
-feae0000fec80000fec80000fea60000febf0000fdb70000fdb90000fea6
-0000febf0000fdb50000fe1f0000fee20000ff9c0000fe870000ff440000
-feba0000ff230000ff9a0000fdb90000fe3b000000000000fea70000ff68
-0000fe170000ff740000fe870000fdb90000ff660000ff440000fea70000
-fea70000fea70000ff030000ff520000fd1f0000ff530000ff530000ff53
-0000feb10000feb00000ffa10000fe8c0000feb80000feaf0000fea20000
-feba0000fdf40000ff190000ff2d0000fe8c0000fe8802aa00bb02aa002a
-02aa00c804e2009004a8007606290000080200000629000005ff005206c2
-004e056900140639005904e3005205c700610473005504e30097039e0088
-06030000043c001d066f000a04e2000a07ef0096071d0085059f007d04e3
-008a059f009c04d7000a05560064055600640524001404d4000a05e10055
-04a0004b040e0014038400280569001404f1005c047300550239ffa20639
-005603d4005103d400510556009505c000990473004104eb008c0a3d0059
-063a001406f4001a059f001b07ce008c065e0093055600000473000b0768
-008c066700930679005606070076089e008c07d800930503004603fa0043
-06790056060700760639005604e300520685ffff052c000b0685ffff052c
-000b0b3a005909bd005206840055051a004b0a3d0059073500550000fe37
-0a3d0059063a001405c700610473005504ac000f0000fea60000feb10000
-feaa0000fead0000fc2b0000fc4c05c0009904eb008c05c0001104eb001b
-0556009504e3008b059f009c04c900880503002c03fa001804e200110401
-000d0617001a04fc00280709009605b6008809020099075f008805c70061
-049f005505c700610473005504e3002d03eb001506d2002c05830015059f
-007d04a5007206da000a056d000a06da000a056d000a0239008c073b0017
-05acffff059d009a04c80088059d00200515001905c7009604d5008805c7
-009604d50088059f007d04a5007206aa009105eb009b02aa001a05c70000
-0473004905c70000047300490800ffaa071d0058055600950473004105cf
-00590473004c073b001705acffff0503002c03fa00180503002c04360022
-05c0009904eb008c05c0009904eb008c0639005904e300520639005604e3
-005205b10057046b003804fa00000473000e04fa00000473000e04fa0000
-0473000e059f007d04a5007207d5009d06d5009505c0005e04e30054083e
-005e077a005407ad004606c4004305430046044a0043081a002007a50019
-08430096076600880639006204b000520620002d059b00150000ff430000
-fec90000ff770000ffb00000ff470000ff560000ff740000fed70000feac
-000000000000ff520000ff56000000000000feac0000fd9a000000000000
-ff6a0000ff7c0000ff690000ff560000feac0000ff7f0000ff560000fdef
-0000ff430000ff690000ff7c000000000000fdae0000ff8c000001020000
-feef0000feef0000fefd0000fef90000ff530000fef80000fef905c70000
-0473004905c7009604e3008705c7009604e3008705c7009604e3008705c7
-00610473005505c7009404e3005405c7009404e3005405c7009404e30054
-05c7009404e3005405c7009404e300540556009504730041055600950473
-004105560095047300410556009504730041055600950473004104e30097
-02aa00180639006204e3005405c7009604e3009205c7009604e3009205c7
-009604e3009205c7004e04e3003b05c7009604e300920239ffd20239ffd2
-0239001b0239ffce05c700990473008905c700990473008905c700990473
-008904e3009d0239009304e3009d0239ffeb04e3009d0239ffdd04e3009d
-0239ffcb06aa0091071d007e06aa0091071d007e06aa0091071d007e05c7
-009804e3009105c7009804e3009105c7009804e3009105c7009804e30091
-0639005904e300520639005904e300520639005904e300520639005904e3
-00520556009504e3008b0556009504e3008b05c70096031d008705c70096
-031d008705c70096031d008705c70096031d00590556004a047300300556
-004a047300300556004a047300300556004a047300300556004a04730030
-04e3002c02aa001f04e3002c02aa001f04e3002c02aa001f04e3002c02aa
-001f05c7009304e3008d05c7009304e3008d05c7009304e3008d05c70093
-04e3008d05c7009304e3008d0556ffff0473000b0556ffff0473000b078d
-000706390009078d000706390009055600000473000c055600000473000c
-0556fffd0473000e04e300160400002204e300160400002204e300160400
-002204e3009202aaffde063900090473000e047300490239008d04eb004e
-04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e05c7
-000005c7000006f3fff206f3000006f3fff206f3000006f3004306f30043
-03cc004e03cc004e03cc004e03cc004e03cc004e03cc004e061efff2061e
-000007aefff207ae000007aefff207ae000004e3008e04e3008e04e3008e
-04e3008e04e3008e04e3008e04e3008e04e3008e068ffff2068f0000081f
-fff2081f0000081ffff2081f0000081f0014081f00140239009002390090
-0239ffb60239ffc40239ffde0239ffec0239ffb30239ffc00301fff20301
-00000491fff2049100000491fff204910000049100140491001404e30052
-04e3005204e3005204e3005204e3005204e30052069dfff2069d00000855
-fff20855000007c9fff207c9000004a8007604a8007604a8007604a80076
-04a8007604a8007604a8007604a800760682000007fe00000862000007ae
-fff306c2004e06c2004e06c2004e06c2004e06c2004e06c2004e06c2004e
-06c2004e06cefff206ce00000886fff20886000007fafff207fa000007fa
-fff307fafff304eb004e04eb004e03cc004e03cc004e04e3008e04e3008e
-0239ffe70239008d04e3005204e3005204a8007604a8007606c2004e06c2
-004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e
-04eb004e05c7000005c7000006f3fff206f3000006f3fff206f3000006f3
-004306f3004304e3008c04e3008c04e3008c04e3008c04e3008c04e3008c
-04e3008c04e3008c068ffff2068f0000081ffff2081f0000081ffff2081f
-0000081ffff3081ffff306c2004e06c2004e06c2004e06c2004e06c2004e
-06c2004e06c2004e06c2004e06cefff206ce00000886fff20886000007fa
-fff207fa000007fafff307fafff304eb004e04eb004e04eb004e04eb004e
-04eb004e04eb004e04eb004e05c7000005c7000005c7ffd105c7ffdd05c7
-000002aa00dc02aa00ca02aa00dc02aafff302aafff304e3008c04e3008c
-04e3008c04e3008e04e3008c06e6000006e60000075700000757000005c7
-009602aafff202aafff202aafff30239ffe50239ffdb0239ffce0239ffce
-0239ffc20239ffbb0239ffe80239ffde03c9000003c9000002aa000002aa
-000002aafff304a8007604a8007604a8007604a8007604f3007604f30076
-04a8007604a800760556fffd0556fffd06e6ffd8074affdd061e000003b8
-fff403b8fff402aa002a06c2004e06c2004e06c2004e06c2004e06c2004e
-0765ffd1069dffdd0796ffd106ceffdd066a006202aa00bb02aa00dc0473
-000a05c7006105c70061071d007e05c7002109cd0096078d000705c70020
-04e3002d08b000140400003004c100660000ff530000ff530000ff530000
-ff530239001b0239ffa2047300000556001206b3005403fe005706ab0091
-040c001f05d6ffe605d6ffe602aa008402aa008402aa00c902aa00c902aa
-009102aa002a02aaffc502aaffc302aafff302aa00c902aa00a902aa00a9
-02aa00a902aa00a9032e001e032e001e02aa003a0000ff730000ff9d0000
-fec80000ff230000ff720000ff720000fee70000ff9d0000ff530000ff53
-0000ff530556009504e3008b04b5000006350000071d006104eb000f0473
-0055049900910499001b0401008c03fa001802390093040f00490476008e
-039e000e05eb009b04eb008c04e300520473003404f1005204f1005204f1
-0021078d00540492004b04e3005304e3005304e9008c04abfffb04abfffb
-03eb001504a8007604e300510624005104e000510473000b063900090400
-002203df002203f2004b04ec0014035500880473001204d5008804e9008c
-060700760515001903e300000591000003a2003203a2000003a300320355
-00320355003204030032037c00320172005502de003203b00032031e0032
-04220032037700320378003204260032037a0032035b003203ac00320377
-0032037b00320514000003050032030500320321003204b6003203210032
-03210032030200320302003202cf003202cf0032032000320121003202ca
-00320484003402f2003203480032030a0032034900320349003203200032
-01bc000a02f20032034200320484003202e90000034c000a031b003202e9
-00000343003203da003203080000012100320204003202f2003202e90000
-031b003202e900000342003203da00320308000005ed00460a9800460613
-00460689ffba0541ffba01e9001e045400100000ff0d0000ff350000fece
-0000feb70000fec90000ffc70000ff4f0000ff9e0000fef002be006902be
-00690376000a0376000a03c0ffba039cffba03c0ffba039cffba05c80039
-05920032061600820519004b05240041060f008705580028068f002d04ac
-00550000fe3b0000fe660000fe680473fffc0400008403d5ffba01e0ffba
-01e0ffb101e0ffba01e0ffba06d0002e0984002304000000080000000400
-00000800000002ab000002000000015500000473000002390000019a0000
-00ab00000000000005e5fff705c7006106aa009105eb009b0760008d07a1
-005407a1005b05c7000005c700610473001404e3001104e3002c04730039
-0400002205290042000001010000ff420000fead0000ff3a0000ff5304f3
-000a05c7006905c7006105c70069048900a4035500880000ff430000ff01
-0000ffac0316007d0000ff370298ffba033d001e0000ff3a0000ff480000
-ff490000ff7e0000ff4f0000ff4a0000fe9e0532003905320039022cffb6
-022cffb60532003c0532003c022cffba022cffba0532003905320039022c
-ffba022cffba0532003905320039022cffba022cffba0532003905320039
-022cffba022cffba0532003905320039022cffba022cffba053200390532
-0039022cffba022cffba049e0034047800300430ffba0430ffba049e0034
-047800300430ffba0430ffba02be004f02be004f02be006902be00690376
-000a0376000a073200400732004004deffba04deffba0454003403c00046
-0454ffba02e2ffba0454003403c000460454ffba02e2ffba0454003403c0
-00460454ffba02e2ffba0610002f0610002f0270ffba0298ffba0610002f
-0610002f0270ffba0298ffba060e00290708002902e2ffba0456ffba060e
-00290708002902e2ffba0456ffba060e00290708002902e2ffba0456ffba
-02e2002102e200210352ffba0352ffba02e2002102e200210352ffba0352
-ffba0454003e0454003e022cffba022cffba0454003e0454003e022cffba
-022cffba0454003e0454003e022cffba022cffba039c0023039c002301e0
-ffba01e0ffba0376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba04e3ffc104e3005402aafff3071dffc104e3ffd504e3
-ffc5031dffc1031dffc10473ffff02aaffda0400002104e3008302f00032
-04dc004e06fb001f0239001b0239001b04e3001404a8001404f8001404e3
-008704e3005402aa0018062500540473008902390070071d007e04e30091
-04e3008b031d00660473003003baffc40473000b0473000c040000220473
-004904e3005404e300540473004103fa004f03fa0018053e005102390093
-0473003402aaffc404e3008d0436002203210032030a0032030a00060348
-003202cf003201f0000a01f000000320003202f100320174000a01210032
-012100320174000a02760000018e00320150003202490032048400340484
-0032035f0000035f003202fa003203480032040300320302003202390000
-01bc000a0340000a035e003202ea003202ea003202e9000002e4003202e4
-003203be0032030a003202e800320000fe920000fe920000ff730000fe9f
-02aa00c903050032030200320348003202ee0000030200320639006205c7
-00000556001e05c7006102aa004104eb004e04eb004e04eb004e04eb004e
-04eb004e04eb004e04eb004e04eb004e0239ffb60239ffb60239ffc40239
-ffc40239ffb60239ffb60239ffc40239ffc404a8007604a8007604a80076
-04a8007604a8007604a8007604a8007604a800760239ffc90239ffc90239
-ffc90239ffc904a8007604a8007604a8007604a8007603e400220454001a
-03df003005c7fffd05c70016055600000556009504730041047300230239
-ffa20633005904e3005b05c70000031d001b0556fffd0473000e04730034
-047300550473003402390093048900110355001b055600000473000c0556
-00000473000c0503006f03fa004f059d0020051500190000fec60000fed4
-0000fec60000fed40000fe5f0000fe5f0000ff720000ff730000fee70800
-00000401005d0473003404e300110239001b04e300060556fffd05c70096
-0473004902aaffcd05c7009604e3009205c700990473008904e300160400
-00220473002804540096037c008805b9004e0000ff530000ffbc0000fefe
-0000fefe0000fea40000fea402390093000000000000006c0000006c0000
-006c0000006c0000011a000001ba00000388000006300000079600000948
-000009a800000a3200000abc00000bf000000c6c00000cdc00000d2a0000
-0d6800000dbe00000ec200000f44000010ea000012420000135c000014ce
-00001602000016be0000185c000019a2000019fc00001a8800001b120000
-1b9400001c2200001d1000001ea40000201e00002186000022c0000023aa
-00002468000025040000264a0000271e000027a60000284400002a0e0000
-2a6a00002cbe00002ebc00002fc4000030940000322e00003392000035f2
-0000368800003768000038a200003ae400003c6000003d5600003ee80000
-3f5c00003fb000004018000040ca000040fe00004162000043700000446c
-000045a800004698000048a4000049a400004b8000004c8000004d220000
-4dfa00004f2600004f920000514600005230000053200000541c0000551e
-000056020000594800005a6800005b5000005ca400005f0a000060e00000
-625e000063ec000065140000657a000066b20000677a000067bc000067fc
-000068380000687e000068c6000069160000695a00006994000069c40000
-69f400006a3600006a7800006aaa00006aee00006b3a00006b8400006bb4
-00006bfa00006c3600006c7600006cb200006cea00006d3a00006d760000
-6db200006de200006e2400006e7400006ebe00006ef600006f3800006f6c
-00006fe40000706a000072160000738200007578000075c20000765c0000
-77aa0000799a00007b4e00007c6800007cca00007d2200007e0200007f34
-000080ac000081d40000829a0000837000008430000085d4000086900000
-877200008850000088b60000894a00008a0e00008b4a00008be200008d22
-00008fc40000914a00009250000092f00000934a0000942a000095d80000
-9744000097ee000098e2000099c800009a3c00009a7400009aba00009af8
-00009c7400009e8a00009ec400009efa00009fc20000a0960000a1060000
-a1240000a1c60000a2a00000a2dc0000a3160000a37c0000a5140000a5b2
-0000a6440000a7a00000a8ca0000a9b40000a9f20000aa020000aa200000
-ac2a0000ac6c0000acba0000acf60000ad360000ad840000adc20000ae00
-0000ae3a0000ae7c0000aeb40000aee40000af1e0000af620000af920000
-afda0000b03c0000b0a80000b1560000b18a0000b1fa0000b2400000b2f6
-0000b3900000b4240000b48c0000b4e80000b5bc0000b6880000b6b80000
-b6e80000b74c0000b7a20000b82a0000b9540000bacc0000bb020000bb32
-0000bc3a0000bd0e0000bd4a0000bee00000bf5e0000c06c0000c1a00000
-c34c0000c4da0000c7220000c7d80000c81c0000c85c0000c88e0000c8d2
-0000c90e0000c9520000c98c0000c9be0000c9f00000cb200000cb560000
-cb800000cbcc0000cc0e0000cc340000cc5a0000cc900000cdce0000cde6
-0000ce0c0000ce320000ce700000cea00000ced00000cf0e0000cfcc0000
-d07e0000d0b20000d0e80000d1240000d1620000d1b00000d1e20000d214
-0000d2500000d28c0000d2c80000d3040000d3360000d3660000d3960000
-d3bc0000d3e00000d41e0000d5920000d5d60000d60e0000d6460000d67c
-0000d6cc0000d70e0000d7540000d7a60000d7f20000d9040000da100000
-daf80000dbe80000dcee0000ddd80000de480000df720000dfc20000dff2
-0000e0ec0000e3200000e3600000e3a00000e3e00000e41e0000e47c0000
-e4da0000e5480000e5680000e6080000e6a20000e6d80000e73c0000e786
-0000e7d00000e7ec0000e8080000e8280000e8480000e8680000e8880000
-e8ae0000e8d40000e8fa0000e9200000e9500000e9780000e9a00000e9cc
-0000e9f80000ea2c0000ea560000ea820000eab80000eae20000eb0e0000
-eb440000eb6e0000eb980000ebcc0000ebfc0000ec300000ec740000eca4
-0000ecd80000ed1a0000ed4e0000ed800000edc20000edf60000ee260000
-ee680000eeac0000eef20000ef4e0000ef6a0000ef860000efa20000efbe
-0000efda0000f1480000f3f20000f6620000f67e0000f6980000f6b40000
-f6d00000f6ec0000f7080000f7640000f79e0000f8080000f8d20000f972
-0000fa480000fac80000fb500000fbc00000fc560000fcb40000fcfa0000
-fd580000fdba0000fdfa0000fe560000feba0000ff2c0000ff6a000100fc
-0001020c00010236000102520001027e000102b600010302000103320001
-036200010396000103c6000103f6000104260001045600010486000104b6
-000104e6000105160001054600010576000105a6000105d6000106060001
-07900001093e0001096e0001099e00010a8a00010ba200010bd200010c00
-00010c3000010c5e00010c8e00010cbc00010ce000010d0400010d3e0001
-0e1e00010e6e00010ed40001101a0001104c000110720001109a000110d8
-000111ae000112a6000112d6000113060001133600011366000113960001
-13c4000113f400011424000114e6000115fa0001162a0001165a0001168a
-000116ba000116ea0001171a000117400001176600011796000117c60001
-17f600011826000118c600011918000119e600011a1600011a4600011a76
-00011aa600011ad800011b0800011b3800011b6800011b9800011bcc0001
-1c0000011c3000011c6000011cbe00011ce800011e6e00011f560001210a
-0001235e0001259600012734000127940001281a0001282a000128ec0001
-2a9000012b6400012c3a00012cc600012dea00012efe00013070000130a6
-000130b6000130c6000131a0000131b0000131c0000131d0000131e00001
-31f0000132f60001330600013316000133c0000133d00001342200013432
-000135260001353600013546000135560001362800013742000137760001
-37aa000137da0001380a0001383a000138680001389c0001398600013a7c
-00013b5c00013c2600013ce600013d3800013e6a00013f7e000140420001
-40520001415e0001416e0001423800014316000143de000144fc000145c8
-000146c6000146f80001472c0001475c0001478c000147bc000147f00001
-48d20001490200014a2600014a3600014a4600014a7a00014a8a00014b90
-00014c7c00014d4a00014d7a00014daa00014e2a00014e3a00014ef00001
-4f0000014f5800014ff600015006000151e80001530c0001543200015462
-0001558c0001560400015614000156240001563400015688000156980001
-56a8000156b8000157b0000158ae000158be0001592a000159b800015a40
-00015ade00015b9c00015c8400015d3e00015e6800015f8e000160cc0001
-60dc00016202000162f00001634e0001641e0001642e0001661400016766
-0001684a0001687a0001699000016a1a00016bd400016c5a00016c6a0001
-6cd400016ce400016cf400016d5e00016d6e00016ec200016ed200016f5c
-00016fe80001707800017128000171e4000172e4000173a2000174a80001
-75b4000176e200017716000178520001788000017996000179a6000179b6
-000179e8000179f800017b0400017be800017ce600017d2000017d500001
-7df000017e4e00017ebe00017efa00018090000181140001819e000182e6
-000183a00001848a000184da000185620001862a00018668000186ba0001
-8716000188000001885400018892000188ca00018908000189560001899e
-000189e400018a4000018b9600018c3800018d4e00018dac00018e480001
-8e8600018f4000018fb6000190b4000190ee0001917800019234000192d6
-0001935c0001942800019466000194ee000195bc0001969a000197620001
-98700001992600019a3200019ae400019b6c00019c6c00019d5400019dac
-00019e0400019e5800019ea600019f3e0001a04a0001a08e0001a0cc0001
-a1140001a14a0001a1b40001a2940001a2cc0001a2fa0001a3320001a360
-0001a3920001a3c40001a43e0001a4940001a5f20001a6920001a7b00001
-a8600001a8ac0001aa020001aab20001aadc0001ab580001aba00001acd8
-0001add60001ae440001afc60001b1840001b2ea0001b3f80001b4220001
-b5b20001b6f00001b71c0001b7500001b77c0001b7ac0001b91a0001b944
-0001ba540001bb060001bbb60001bc4a0001bd180001be540001be640001
-be980001bf580001c1100001c1e80001c2520001c3780001c3d60001c4e8
-0001c5b60001c6420001c6c00001c79c0001c8dc0001c9d60001ca8c0001
-cb780001cc400001cd1e0001cdee0001cecc0001cf600001d18c0001d1b6
-0001d1e00001d1f00001d21a0001d3540001d4720001d5820001d5ac0001
-d5d60001d6000001d62a0001d6540001d8380001d8620001d88c0001d8b6
-0001d8e00001d90a0001d9340001d95e0001d9880001d9bc0001d9e60001
-da100001da3a0001dbd40001dbe40001dd1c0001dd2c0001dd560001dd80
-0001ddaa0001ddd40001df6e0001e1e80001e3460001e3560001e4c80001
-e4d80001e6360001e81a0001e91c0001eaa20001ec6c0001eec00001f02e
-0001f2220001f2320001f2420001f3a60001f3d00001f3fa0001f4240001
-f44e0001f4780001f4a20001f4cc0001f4f60001f5200001f54a0001f574
-0001f59e0001f5c80001f5f20001f61c0001f8d40001fab40001fc3e0001
-fe7e0001fff6000200200002004a0002007a000200aa000200fa0002014a
-0002018a000201fc00020250000202ae000203040002033a0002037c0002
-03c20002040c0002043c00020474000204a40002060a000209500002097a
-000209a4000209ce000209f800020a2200020a4c00020a7600020aa00002
-0aca00020af400020b1e00020b4800020b7200020b9c00020bc600020bf0
-00020c1a00020c4400020c6e00020c9800020cc200020cec00020d160002
-0d4000020d6a00020d9400020dbe00020de800020e8000020f1000020f3a
-000212c2000213cc00021544000216ca000218ac00021a8000021c9e0002
-1cae00021e5600021fee00022260000224a00002261800022628000226d4
-0002277e000228ba000228ca00022996000229a600022b4800022d300002
-2e9c00022eac00022fb400022fc40002313e0002314e0002327c0002328c
-000233c80002357c000236740002368400023776000238d4000239800002
-399000023ad200023c8000023d7600023d8600023e2a00023e3a00023f22
-00023f3200023ffc0002400c0002412200024132000242f8000243080002
-447600024486000246f800024708000249180002492800024aa400024ab4
-00024be600024bf600024db400024dc400024f3a00024f4a000250b80002
-50c8000250d8000250e8000252a8000252b8000252c8000252d800025428
-0002556000025678000257720002591400025aa600025c0e00025d5c0002
-5f2200025f3200026084000261e6000263cc000263dc0002656400026708
-0002694200026952000269620002697200026adc00026aec00026bbe0002
-6bce00026d0600026d1600026dfc00026e0c00026f4600026f5600027010
-0002702000027146000272aa00027418000275c6000276f6000277060002
-7880000279c200027be200027db400027ec400027ed40002815600028382
-0002864c000288a800028b6800028daa00028f68000290c2000290ec0002
-91160002912600029136000291600002918a000291b4000291c4000291d4
-000291fe000292280002923800029248000292720002929c000292c60002
-92d6000292e6000292f60002930600029316000293260002935000029360
-000293700002939a000293c4000293ee00029418000294420002946c0002
-9496000294c0000294ea000295140002953e0002956800029592000295bc
-000295e6000296100002963a000296640002968e000296b8000296e20002
-970c00029736000297600002978a000297b4000297de0002980800029832
-0002985c00029886000298b0000298da000299040002992e000299580002
-9982000299ac000299d600029a0000029a2a00029a5400029a7e00029aa8
-00029ad200029afc00029b2600029b5000029b7a00029ba400029bce0002
-9bf800029c2200029c4c00029cf400029d3800029dae00029dd800029e02
-00029e2c00029e5600029e8000029eaa00029ed400029efe00029f280002
-9f5200029f7c00029fa600029fd000029ffa0002a0240002a04e0002a078
-0002a0a20002a0cc0002a0f60002a1200002a14a0002a1740002a2260002
-a25a0002a28e0002a2c20002a4460002a5c60002a7320002a8800002a940
-0002aa020002aa740002ab460002ac180002ac8a0002ad4e0002ae400002
-af040002aff60002b09c0002b1a80002b23a0002b3820002b4c00002b524
-0002b64c0002b81a0002ba620002bace0002bb3a0002bba40002bc100002
-bcbe0002bd6c0002be120002beb80002bf5e0002bf8e0002bfbe0002bfee
-0002c0000002c0120002c0240002c0360002c0480002c0b80002c12a0002
-c15a0002c16c0002c17e0002c18e0002c19e0002c1b00002c1c20002c1d4
-0002c1e60002c1f80002c20a0002c3160002c3bc0002c4c80002c56e0002
-c5c60002c5ec0002c6120002c63c0002c66a0002c6b40002c7100002c74a
-0002c7a20002c7e20002c8320002c86a0002c8c00002c9020002c9420002
-c9940002ca060002ca500002cabc0002cafc0002cb680002cba80002cc10
-0002cc520002cca60002cccc0002ccf20002cd1c0002cd4c0002cd7c0002
-cdac0002cdfa0002ce560002ce940002ceee0002cf360002cf8c0002cfd0
-0002d0240002d06a0002d0ac0002d0d20002d1080002d12e0002d1540002
-d17a0002d1a00002d1ce0002d1f80002d2420002d29e0002d2d80002d330
-0002d3700002d3c40002d3fc0002d44c0002d48e0002d4ce0002d5080002
-d5440002d5800002d5bc0002d5ea0002d6140002d6520002d6820002d6a8
-0002d6ce0002d6f40002d71a0002d7440002d76e0002d7ae0002d7fa0002
-d8400002d8780002d8a20002d8cc0002d8fc0002d92c0002d9520002d978
-0002d9a20002d9cc0002d9fe0002da300002da600002da900002dac00002
-daf00002db200002db4e0002db7e0002dbae0002dbde0002dc0e0002dc42
-0002dca20002dcd60002dd3a0002dd6e0002ddce0002de020002de660002
-df0e0002dfde0002e0f40002e1c60002e2400002e2ae0002e4900002e65a
-0002e77a0002e88c0002e9d00002eae40002eb740002ebf40002ec880002
-ed0a0002edca0002ee6a0002ef360002f01c0002f0d40002f1a00002f21c
-0002f22c0002f2fa0002f3ba0002f4840002f5380002f62e0002f6a40002
-f7cc0002f8e60002fa6e0002faf00002fbe00002fcd60002fdce0002fe60
-0003007200030202000302880003040a00030476000304e00003054e0003
-0714000308dc0003096c000309b8000309f600030a3800030a8000030aac
-00030af200030b2800030b6400030ba200030be000030c6800030cf00003
-0d3200030d6a00030da400030dde00030e0600030e2e00030e7200030eb6
-00030ef400030f3200030f6200030f9200030fb800030fde000310200003
-1062000310a8000310ee000311460003119e000311fa00031256000312b2
-0003130e0003135c000313aa000313d2000313fa00031420000314460003
-148a000314ce0003151a00031566000315b0000315fa0003164800031696
-000316d6000317760003179c000317c20003180c0003187c000318a40003
-18cc0003191200031958000319ae00031a0400031a5200031b0c00031b34
-00031b5c00031bb000031c0400031c4400031c8400031caa00031cd00003
-1d3600031d9c00031dde00031e2000031e4600031e6c00031ec200031f18
-00031f7400031fd00003202400032078000320c6000321140003215e0003
-21a8000322020003225c000322b000032304000323460003238800032426
-000324c40003250e00032558000325aa000325fc00032662000326c80003
-272000032778000327a4000327d0000327fc000328280003285400032880
-000328ac000328d8000328fe00032924000329500003297c000329ca0003
-2a1800032a6400032ab000032b0000032b5000032bca00032c2c00032ca4
-00032cee00032e8000032eb400032ee800032f1e00032f4200032fac0003
-301600033098000331000003314800033190000331dc000332460003326e
-00033296000332bc000332e2000333320003338200033416000334680003
-34c6000335240003358a000335f0000336d6000337e6000338b4000339ae
-00033a1a00033a8000033ade00033b4000033bc600033c4c00033cb20003
-3d1800033d8400033df000033e4600033e9c00033ece00033f0000033f26
-00033f4c00033fb80003401e0003407c000340de000341f0000342fc0003
-440a0003450e000345340003455c00034580000345a4000345cc000345f4
-0003461a00034640000347620003489e000349cc00034af800034bb20003
-4c6c00034d2c00034dec00034ed000034fb4000350b0000351ac00035290
-000353740003544a000355200003556a000355b4000355da000356000003
-5650000356a0000356c4000356e8000357be000357ce0003582200035876
-000358d40003593200035972000359b2000359fc00035a4600035a960003
-5ae600035b3c00035b9200035be400035c2200035c9c00035cde00035d22
-00035db000035e3e00035ff0000360000003603a00036074000360a40003
-60d4000361080003613c00036176000361b00003620400036258000362ba
-0003631c000364cc0003665400036690000366c8000367120003675c0003
-67a2000367e80003683800036a5e00036a8400036aaa00036afe00036da8
-00036e7a00036f1600036f6400036fa200036fd4000371c20003747e0003
-7550000376b4000377ee0003789a00037a3000037c8400037ec000037f1a
-00037f600003802e000381200003813e000381e80003830e000383ea0003
-83fc0003855c000386e200038708000387c6000387e40003880a00038830
-000388560003887c000388a2000388c8000388ee00038914000389600003
-89c0000389e800038a0e00038b6c00038d4800038d5800038e2800038f38
-00038f96000390ae0003923c000392e2000394280003947a000394cc0003
-9504000395500003957c000395c2000395ee0003962a00039684000396ce
-0003971a0003978a00039850000398cc0003998c00039a0400039ade0003
-9b6e00039ba800039be400039d5c00039e4c00039e9600039edc0003a026
-0003a1360003a1460003a2500003a3360003a4480003a5140003a62a0003
-a7680003a7780003a8500003a9120003aa120003ab6c0003abcc0003ad50
-0003adc40003af180003b0800003b1640003b1b60003b21e0003b3a80003
-b51e0003b5a60003b74a0003b83a0003b95e0003ba000003baea0003bbd4
-0003bccc0003bdb40003bee60003c02c0003c1ce0003c38a0003c39a0003
-c49e0003c5d00003c67a0003c78e0003c81a0003c98a0003ca520003cb4c
-0003cc9a0003cdb20003cf580003d0980003d1ea0003d30e0003d4c00003
-d6480003d7420003d8180003d9740003da340003da6a0003dad20003dba6
-0003dbb60003dc160003dc720003dccc0003dd040003dd420003dd8c0003
-ddc80003de060003de500003df620003dfb40003e0100003e0bc0003e0e4
-0003e1540003e1840003e1b60003e3600003e4860003e4c00003e4f00003
-e53c0003e56e0003e5940003e5ba0003e5fc0003e63e0003e66e0003e69e
-0003e6e20003e7280003e7660003e7a00003e7da0003e80a0003e8c60003
-e9800003e9c20003e9f20003ea260003ea620003ea920003eac20003eafc
-0003eb340003eb640003eb980003ebcc0003ebf40003ec240003ec540003
-ec880003ecc00003ecf00003ed200003ed600003ed920003edce0003ee00
-0003ee400003ee7a0003eeaa0003eeda0003ef000003ef260003ef4c0003
-ef7c0003f0940003f1920003f1c20003f1f40003f2980003f43e0003f5a8
-0003f6960003f8000003f8300003f8600003f8980003f8d00003f9220003
-f97e0003fa700003fa980003fb060003fb360003fb660003fb8e0003fc00
-0003fc300003fc660003fdc60003fe880003ff6400040088000401800004
-02d0000403ec0004050a0004060e000407700004091600040aae00040cba
-00040df000040e8a00040ff800041008000410d6000412980004149a0004
-154c0004162a00041744000417f400041846000418980004196e00041a54
-00041ae400041c5c00041d5a00041e5c00041f900004206e000421540004
-21f4000422fe000424260004251a000426020004267e000426fa000427a6
-0004285800042936000429ac000429fe00042b7000042cf000042eee0004
-2fb2000430840004316a000432a00004336c000434740004358e00043692
-0004376200043840000439da00043af600043bd000043d4400043f380004
-404e000441fc0004428e00044330000443be0004445c0004456000044570
-000446ca000447da000447ea000448c4000449e800044a4800044b680004
-4c3600044d1800044f000004510e000453e40004561e000457ac000459d6
-00045b7e00045d6000045eba00046026000460a80004615c0004624a0004
-62f600046362000463e4000464bc00046600000467720004688000046890
-000468a00004690200046966000469c400046a5200046ade00046ba40004
-6c3e00046c4e00046c5e00046cf800046d9800046dde00046e5000046ec2
-00046f1000046f4400046fb6000470260004709a000470ea0004717e0004
-720e0004728c00047310000473ac000473d800047446000474f800047606
-000476520004781c00047908000479180004794e00047992000479d60004
-7a1a00047a5000047a8200047ac400047b1a00047b6600047c1400047c8c
-00047d1600047d8a00047df000047e7600047ed600047f4000047fb80004
-802c0004808a00048134000481d000048240000482d200048330000483a2
-00048450000484fa00048594000486080004868e000486f6000487a60004
-886800048918000489ae00048a1000048a8000048ad600048b5800048bda
-00048c6400048cf400048d4e00048dba00048e2a00048e9c00048f100004
-8f980004902c00049096000491100004919000049208000492b20004934e
-000493e200049444000494e600049566000495fc000496a4000497520004
-97ee0004984e000498a600049912000499bc00049a6a00049b3800049be2
-00049c4800049ca000049d0400049d9600049e2000049eb200049f160004
-9f7e00049fe80004a0500004a0bc0004a1380004a1c40004a25c0004a2c8
-0004a3300004a3940004a4440004a5080004a5ba0004a64c0004a6ae0004
-a71e0004a7920004a83a0004a8e40004a9ac0004aa520004aaba0004ab4e
-0004abc40004ac600004ace20004ad600004add00004ae620004aebe0004
-af200004afaa0004b02a0004b0920004b0fa0004b1520004b1c00004b228
-0004b2aa0004b3240004b3a20004b4260004b4820004b4e80004b5500004
-b5f40004b69a0004b75c0004b8100004b8700004b8ec0004b94e0004b9dc
-0004ba780004bb0a0004bb740004bbd60004bc680004bcde0004bd7c0004
-be140004be880004befc0004bf780004bfd60004c03a0004c0b80004c116
-0004c17a0004c1d80004c2380004c2a00004c2f40004c32a0004c3760004
-c3da0004c41a0004c4640004c50e0004c5b60004c60c0004c6440004c694
-0004c7440004c7f20004c8440004c8980004c8f00004c9400004c9980004
-c9fe0004ca5e0004cafe0004cba20004cbe00004cc460004cce40004cd78
-0004ce0a0004ceb00004cee20004cf4a0004cfb20004cffc0004d0ce0004
-d1500004d1f80004d2600004d29e0004d3080004d3ae0004d4040004d458
-0004d4c40004d5280004d5c80004d5fa0004d62a0004d6740004d70c0004
-d7360004d7600004d8280004d8820004d9240004d98e0004da0a0004daba
-0004db300004dba00004dbf80004dc5e0004dcc00004dd600004ddb80004
-de840004def00004df4a0004df940004dfea0004e08a0004e1500004e29c
-0004e3b80004e41c0004e4900004e7b60004e8460004e8c60004e9140004
-ea7c0004eba80004ebf00004ecec0004edb40004ee920004ef840004f03e
-0004f1180004f1820004f21a0004f2ec0004f3e00004f4520004f4c00004
-f5040004f6160004f74a0004f83c0004f8800004f8bc0004f9a60004faa8
-0004fc2a0004fd260004fe2a0004ff340005002000050082000500f80005
-02820005031400050444000505340005065c000507940005085800050940
-00050a0000050b5400050d0600050e9800050fd2000511380005120e0005
-12cc0005138a00051450000515a8000516f8000517080005171800051728
-000517c400051862000518b0000518ee000519340005196400051ac20005
-1c5e00051d7000051e980005202400052196000522a60005247a00052666
-000528c000052a2000052b4a00052cdc00052e4e00053064000532d20005
-33d200053508000536280005377a0005386e000539b4000539f600053a36
-00053c7800053ec600054026000541bc000543ec0005458c000546180005
-46480005469000054724000547be0005491e000549b000054a2000054a60
-00054a9e00054c5000054e8e0005503e000551680005525e000553640005
-553a000556f0000557f20005590800055ace00055cbc00055e6400055fe0
-00056166000562c60005635e000563fa000565180005663e000567960005
-694a00056a8600056bda00056c6000056cde00056d9200056e5800056f04
-00056fce00057100000572a0000572c6000572ec000572fc0005732c0005
-735c000574d00005764000057702000577c4000578a60005797e00057a32
-00057b0600057bb000057c7600057df800057fa800058012000580420005
-806a0005809e000580d2000580e2000580f2000581220005814800058184
-000581c0000581f4000582280005825c00058292000583b8000583c80005
-83f8000584280005845c00058494000584c8000584fc0005853000058564
-00058598000585ce000585fe0005863400058668000586a2000586f20005
-873c00058770000587a4000587da00058810000588c4000588d4000589de
-00058b4a00058cb400058e5400058f9a000590f2000591e4000592ee0005
-93d2000594d2000595f8000596e4000597a0000598620005994a00059a04
-00059ace00059b5600059c0400059c9600059d1400059e2e00059e9a0005
-9f620005a05e0005a0cc0005a13c0005a1f40005a3d80005a4e60005a56c
-0005a5b20005a67a0005a70a0005a7f40005a8a00005a90e0005aa160005
-ab020005abc20005ac080005ac9a0005ada80005ae440005aea00005af96
-0005b0900005b2120005b3760005b4740005b55e0005b62c0005b6540005
-b67c0005b6ac0005b6dc0005b7040005b72c0005b7540005b77c0005b7d6
-0005b8400005b8720005b8a20005b8c80005b8f00005b9180005b9420005
-b96c0005b9940005b9bc0005b9e20005ba0e0005ba980005bac00005bb42
-0005bb6a0005bb900005bbb60005bbdc0005bc2e0005bc820005bcb40005
-bce40005bd160005bd520005bd820005bdb80005bdde0005be040005be38
-0005be6c0005beac0005bef20005bf180005bf3e0005bf640005bf8a0005
-bfb40005c0180005c0640005c0960005c0c40005c0fa0005c1380005c160
-0005c1860005c1ac0005c1f60005c2380005c2600005c2860005c2b20005
-c2d80005c3340005c3640005c3940005c3c40005c3ea0005c4140005c444
-0005c4740005c49a0005c4c00005c4e60005c50c0005c5320005c5580005
-c5800005c5f80005c6220005c68c0005c6b40005c7580005c7800005c7fc
-0005c8300005c8720005c8a20005c8d20005c9020005c9320005c95e0005
-c9840005c9cc0005ca0e0005ca3a0005ca620005ca920005cac20005cae8
-0005cb0e0005cb3a0005cbee0005cc160005ccc60005cd080005cd4a0005
-cd7a0005cdae0005cdd40005cdfc0005ce220005ce4a0005ce700005ce98
-0005cec00005cee80005cf0e0005cf340005cf5a0005cf800005cfa80005
-d0300005d0640005d0ca0005d0fa0005d12a0005d1500005d1760005d1b0
-0005d1f40005d2260005d2620005d2920005d2c20005d2f60005d32a0005
-d35a0005d3900005d3c80005d3f80005d4260005d4500005d47e0005d4a4
-0005d4ca0005d4fe0005d5440005d57e0005d5ba0005d5ec0005d61c0005
-d6580005d6940005d6d00005d71a0005d7640005d79c0005d7da0005d816
-0005d8560005d8b20005d90e0005d96a0005d9c60005da300005da9a0005
-daca0005db020005db420005db860005dbca0005dc0e0005dc6a0005dcc6
-0005dd320005dd9e0005de0a0005de760005dea60005ded60005df0e0005
-df460005df860005dfc60005e0020005e03e0005e09a0005e0f60005e15a
-0005e1be0005e2220005e2860005e2e40005e3420005e3700005e39e0005
-e3d00005e4020005e4340005e4660005e4a40005e4e20005e5520005e5c4
-0005e6260005e6880005e6ea0005e74c0005e7a40005e7fc0005e82c0005
-e85c0005e8900005e8c40005e8f80005e92c0005e9860005e9f20005ea5c
-0005eac60005eb2e0005eb960005ebc60005ebf60005ec2a0005ec5e0005
-ec9e0005ecde0005ed1a0005ed560005edaa0005ee100005ee640005eeb2
-0005eee20005ef120005ef460005ef7a0005efae0005efe20005f01a0005
-f0520005f0ae0005f1040005f1640005f1c40005f21a0005f2700005f2ca
-0005f31e0005f3540005f3860005f3c40005f3f40005f4240005f46e0005
-f49c0005f4cc0005f5120005f54a0005f5860005f5ca0005f5fe0005f62e
-0005f6780005f6cc0005f7220005f7780005f7dc0005f8400005f8920005
-f8e80005f9340005f9860005f9f20005fa5e0005faca0005fb360005fbb2
-0005fc2e0005fc700005fcb20005fcfa0005fd420005fd940005fde60005
-fe340005fe820005fef00005ff5e0005ffd40006004a000600c000060136
-000601a600060216000602580006029a000602de00060322000603660006
-03aa000603f40006043e000604ac0006051400060586000605f800060660
-000606c80006073200060796000607cc0006080200060852000608800006
-08cc000609080006095e0006098e000609be000609ea00060a1600060a3c
-00060a9000060afe00060b5200060bee00060ce000060d2200060d480006
-0da400060dd400060e1600060e7c00060eea00060f5000060fba00060fe0
-00061088000611260006126600061294000612c2000613260006138a0006
-13b8000613ec0006141c0006144c000614bc00061532000615da00061678
-000617b4000617e4000618140006187a000618e000061910000619400006
-1970000619a6000619d600061a0600061a5200061ab200061b0e00061be8
-00061cc200061d3400061d7a00061da000061de200061e1200061e540006
-1e8800061ef200061f3800061fae00061fd40006204400062092000621b2
-00062444000625d800062730000628e200062bf000062e860006306e0006
-320c00063464000635a6000637bc0006382c000638940006390600063978
-00063a0000063a9e00063c7c00063e2a00063ff6000640f60006428a0006
-43ea000644ae000645a40006460c0006466e000646dc0006474000064814
-0006487c0006494600064a0400064aa000064b0200064b9800064c2a0006
-4cc600064d5e00064dc400064e2200064e8e00064ef600064f7200065020
-0006508a000650e80006514a000651fc0006527e00065300000653360006
-5368000653780006538800065494000655bc000657dc0006592e0006593e
-000659f800065aee00065b7800065b8800065c0800065c8000065ca20006
-5d6400065d7400065d8400065d9400065da400065ea000065fe6000661a6
-000663ba000664ac00066512000665760006663800066648000667e20006
-67f200066802000668c6000669e200066abe00066ace00066ade00066aee
-00066c4a00066e3a00066f4a00066f5a00066f6a00066f7a00066f8a0006
-704000067050000671a6000672e2000673d0000674e000067584000675f2
-000676620006777c000677e000067824000678b200067a7200067ab20006
-7ba600067c7200067d3e00067dc400067e9a00067f360006809e00068122
-000681b600068330000684a20006862a0006870e000688d8000689c20006
-8ab000068bdc00068d0200068e5c00068fc60006910800069180000692b6
-000693ae000694ac000695a80006968e00069718000697a2000698940006
-995000069a1200069abe00069bb400069c9000069d9400069ed400069fbc
-0006a13c0006a26a0006a36e0006a3b80006a4240006a4e40006a5c00006
-a6fe0006a7e60006a9320006aa600006ab6a0006ac0c0006ad580006ae14
-0006af3e0006b0000006b0480006b2420006b2f80006b4e60006b6420006
-b7e00006b8e20006b9480006ba900006bb080006bc980006bcce0006bd04
-0006bd560006bda80006bde00006be200006be580006be980006bfc60006
-c0280006c0e80006c19c0006c23e0006c2d60006c3520006c45e0006c4bc
-0006c5ea0006c69a0006c7680006c7a20006c7de0006c8660006c9260006
-ca220006caf80006cb1e0006cb440006cbdc0006cbec0006cbfc0006cc0c
-0006cc1c0006cc2c0006cc3c0006cc4c0006cc5c0006cc6c0006cc7c0006
-cc8c0006cc8c0006cdf00006ce000006ce740006cf0e0006d01c0006d176
-0006d2d60006d4900006d65e0006d8320006d8b60006d9d40006db1e0006
-dcc60006dd620006ddb20006de480006df660006dfb60006e0460006e170
-0006e1800006e2ae0006e3be0006e4340006e48c0006e5780006e5be0006
-e5fe0006e69a0006e6ee0006e8700006e94e0006e98e0006e9f80006ea62
-0006ea9a0006ebe20006ecd80006ede60006ee1e0006ee560006ee7c0006
-eea20006eed20006ef020006ef260006ef4a0006ef760006efa20006efe8
-0006f02e0006f05a0006f0860006f0cc0006f1120006f16e0006f1ca0006
-f1ee0006f2120006f26a0006f2c20006f3080006f34e0006f3840006f3ba
-0006f3f00006f4260006f4880006f4f20006f5520006f5b20006f5fe0006
-f6cc0006f6f40006f71c0006f7880006f7f40006f8420006f8900006f996
-0006f9a60006f9f00006fa3a0006fa820006faca0006fb280006fb8a0006
-fbe40006fc360006fcba0006fd220006fd960006fe080006fe8e0006fefc
-0006ff6e0006ffd40006fffa0007002000070044000700680007009c0007
-00d0000700f60007011c00070188000701f400070260000702c80007031a
-0007036c000703c2000704140007043c0007046400070496000704c40007
-051a00070570000705cc000706280007064e00070674000706a0000706cc
-0007072800070784000707a8000707cc000708820007093800070b0a0007
-0b1a00070b7e00070be200070c2e00070c7a00070e3e00070e4e00070f5c
-00070f6c00070fc60007102000071078000710d000071134000711980007
-11dc00071220000713b6000715480007169800071866000719e400071b9e
-00071ccc00071dc40007203e000721c2000723ea00072566000725f20007
-272a0007294e000729d6000729e600072b5600072c8200072dea00072f30
-00073066000731640007333a000734ee0007357e000736c2000737ae0007
-38fc000739ea00073bd600073cf200073e1400073fe800074152000742f6
-000743fc0007454c000746a40007489a00074a7600074bda00074c9e0007
-4dd200074e9c00074fa60007512000075214000752f80007549600075668
-0007567800075726000757f000075800000758c800075962000759ae0007
-59be00075a3800075b0c00075b6800075c1800075c5a00075d9000075e86
-00075f82000760820007612000076264000763ac000765cc000766620007
-676200076882000769ca00076a8600076b6000076c3c00076d0800076e0a
-00076fb6000770d6000771fc0007728a0007731a0007742c0007748c0007
-7578000776e40007781600077912000779fe00077b2400077cb400077e5a
-0007802600078156000781d800078258000782e200078362000783ec0007
-84a800078550000785fe000786a600078720000787a40007881e000788a2
-00078958000789fa00078a9a00078b3c00078bb800078c3e00078cba0007
-8d4000078df800078ea200078f4800078ff0000790e0000791d4000792b4
-0007939c0007948e0007958200079668000797540007991c00079a7e0007
-9b2200079c3200079cf800079d0800079dfc00079f5600079fea0007a094
-0007a15e0007a2300007a3120007a3ae0007a4980007a5be0007a5ce0007
-a6880007a7420007a7520007a7fa0007a8a00007a98e0007aa7c0007ab58
-0007ac2a0007adae0007af540007afee0007b08a0007b0c60007b1040007
-b1400007b17e0007b1d80007b2300007b28a0007b2ee0007b37a0007b578
-0007b5cc0007b5dc0007b6680007b6ec0007b7700007b8280007b9380007
-baf60007bc140007bca40007bd480007bdf80007beda0007bf5c0007bfea
-0007c1120007c15a0007c1b20007c28c0007c2c80007c3260007c3640007
-c3960007c3da0007c41c0007c44c000100000d3500f2003c008f00060002
-0010002f0055000006fa02c20005000200>
-<0000005303ea0000000300000000006a00000000000300000001000a006a
-00000003000000020008007400000003000000030058007c000000030000
-0004001400d40000000300000005001800e8000000030000000600180100
-000000030000000700ba01180000000300000008003001d2000000030000
-0009008a0202000000030000000d02aa028c000100000000000000350536
-00010000000000010005056b000100000000000200040570000100000000
-0003002c05740001000000000004000a05a00001000000000005000c05aa
-0001000000000006000c05b60001000000000007005d05c2000100000000
-00080018061f000100000000000900450637000100000000000d0155067c
-0003000104030002000e07d10003000104030004001a07df000300010405
-0002000a07f9000300010405000400160803000300010406000200060819
-00030001040600040012081f000300010407000200080831000300010407
-0004001408390003000104080002000c084d000300010408000400180859
-0003000104090000006a08710003000104090001000a08db000300010409
-0002000808e50003000104090003005808ed000300010409000400140945
-000300010409000500180959000300010409000600180971000300010409
-000700ba0989000300010409000800300a430003000104090009008a0a73
-000300010409000d02aa0afd00030001040a0002000e0da700030001040a
-0004001a0db500030001040b000200120dcf00030001040b0004001e0de1
-00030001040c000200080dff00030001040c000400140e0700030001040e
-000200100e1b00030001040e0004001c0e2b000300010410000200120e47
-0003000104100004001e0e59000300010413000200060e77000300010413
-000400120e7d0003000104140002000e0e8f0003000104140004001a0e9d
-000300010415000200140eb7000300010415000400200ecb000300010416
-0002000e0eeb0003000104160004001a0ef9000300010419000200140f13
-000300010419000400200f2700030001041b0002000a0f4700030001041b
-000400160f5100030001041d000200060f6700030001041d000400120f6d
-00030001041f0002000a0f7f00030001041f000400160f89000300010424
-0002000c0f9f000300010424000400180fab00030001042a000200080fc3
-00030001042a000400140fcb00030001042d0002000a0fdf00030001042d
-000400160fe900030001080a0002000e0fff00030001080a0004001a100d
-0003000108160002000e10270003000108160004001a1035000300010c0a
-0002000e104f000300010c0a0004001a105d000300010c0c000200081077
-000300010c0c00040014107f00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0042006f006c0064004d006f006e006f007400790070
-0065003a0041007200690061006c00200042006f006c0064003a00560065
-007200730069006f006e00200035002e0030003100200028004d00690063
-0072006f0073006f0066007400290041007200690061006c00200042006f
-006c006400560065007200730069006f006e00200035002e003000310041
-007200690061006c002d0042006f006c0064004d00540041007200690061
-006c00200069007300200061002000740072006100640065006d00610072
-006b0020006f006600200054006800650020004d006f006e006f00740079
-0070006500200043006f00720070006f0072006100740069006f006e0020
-0069006e002000740068006500200055006e006900740065006400200053
-0074006100740065007300200061006e0064002f006f00720020006f0074
-00680065007200200063006f0075006e00740072006900650073002e0054
-006800650020004d006f006e006f007400790070006500200043006f0072
-0070006f0072006100740069006f006e004d006f006e006f007400790070
-006500200054007900700065002000440072006100770069006e00670020
-004f006600660069006300650020002d00200052006f00620069006e0020
-004e006900630068006f006c00610073002c002000500061007400720069
-0063006900610020005300610075006e0064006500720073002000310039
-003800320059006f00750020006d00610079002000750073006500200074
-00680069007300200066006f006e007400200074006f0020006400690073
-0070006c0061007900200061006e00640020007000720069006e00740020
-0063006f006e00740065006e00740020006100730020007000650072006d
-0069007400740065006400200062007900200074006800650020006c0069
-00630065006e007300650020007400650072006d007300200066006f0072
-0020007400680065002000700072006f006400750063007400200069006e
-0020007700680069006300680020007400680069007300200066006f006e
-007400200069007300200069006e0063006c0075006400650064002e0020
-0059006f00750020006d006100790020006f006e006c0079002000280069
-002900200065006d0062006500640020007400680069007300200066006f
-006e007400200069006e00200063006f006e00740065006e007400200061
-00730020007000650072006d006900740074006500640020006200790020
-00740068006500200065006d00620065006400640069006e006700200072
-00650073007400720069006300740069006f006e007300200069006e0063
-006c007500640065006400200069006e0020007400680069007300200066
-006f006e0074003b00200061006e00640020002800690069002900200074
-0065006d0070006f0072006100720069006c007900200064006f0077006e
-006c006f006100640020007400680069007300200066006f006e00740020
-0074006f002000610020007000720069006e0074006500720020006f0072
-0020006f00740068006500720020006f0075007400700075007400200064
-0065007600690063006500200074006f002000680065006c007000200070
-00720069006e007400200063006f006e00740065006e0074002ea9203230
-303620546865204d6f6e6f7479706520436f72706f726174696f6e2e2041
-6c6c205269676874732052657365727665642e417269616c426f6c644d6f
-6e6f747970653a417269616c20426f6c643a56657273696f6e20352e3031
-20284d6963726f736f667429417269616c20426f6c6456657273696f6e20
-352e3031417269616c2d426f6c644d54417269616c206973206120747261
-64656d61726b206f6620546865204d6f6e6f7479706520436f72706f7261
-74696f6e20696e2074686520556e697465642053746174657320616e642f
-6f72206f7468657220636f756e74726965732e546865204d6f6e6f747970
-6520436f72706f726174696f6e4d6f6e6f74797065205479706520447261
-77696e67204f6666696365202d20526f62696e204e6963686f6c61732c20
-5061747269636961205361756e646572732031393832596f75206d617920
-757365207468697320666f6e7420746f20646973706c617920616e642070
-72696e7420636f6e74656e74206173207065726d69747465642062792074
-6865206c6963656e7365207465726d7320666f72207468652070726f6475
-637420696e207768696368207468697320666f6e7420697320696e636c75
-6465642e20596f75206d6179206f6e6c792028692920656d626564207468
-697320666f6e7420696e20636f6e74656e74206173207065726d69747465
-642062792074686520656d62656464696e67207265737472696374696f6e
-7320696e636c7564656420696e207468697320666f6e743b20616e642028
-6969292074656d706f726172696c7920646f776e6c6f6164207468697320
-666f6e7420746f2061207072696e746572206f72206f74686572206f7574
-7075742064657669636520746f2068656c70207072696e7420636f6e7465
-6e742e004e0065006700720065007400610041007200690061006c002000
-4e00650067007200650074006100740075010d006e00e900410072006900
-61006c002000740075010d006e00e9006600650064004100720069006100
-6c002000660065006400460065007400740041007200690061006c002000
-46006500740074038803bd03c403bf03bd03b10041007200690061006c00
-20038803bd03c403bf03bd03b100a9002000320030003000360020005400
-6800650020004d006f006e006f007400790070006500200043006f007200
-70006f0072006100740069006f006e002e00200041006c006c0020005200
-690067006800740073002000520065007300650072007600650064002e00
-41007200690061006c0042006f006c0064004d006f006e006f0074007900
-700065003a0041007200690061006c00200042006f006c0064003a005600
-65007200730069006f006e00200035002e0030003100200028004d006900
-630072006f0073006f0066007400290041007200690061006c0020004200
-6f006c006400560065007200730069006f006e00200035002e0030003100
-41007200690061006c002d0042006f006c0064004d005400410072006900
-61006c00200069007300200061002000740072006100640065006d006100
-72006b0020006f006600200054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-200069006e002000740068006500200055006e0069007400650064002000
-530074006100740065007300200061006e0064002f006f00720020006f00
-7400680065007200200063006f0075006e00740072006900650073002e00
-54006800650020004d006f006e006f007400790070006500200043006f00
-720070006f0072006100740069006f006e004d006f006e006f0074007900
-70006500200054007900700065002000440072006100770069006e006700
-20004f006600660069006300650020002d00200052006f00620069006e00
-20004e006900630068006f006c00610073002c0020005000610074007200
-690063006900610020005300610075006e00640065007200730020003100
-39003800320059006f00750020006d006100790020007500730065002000
-7400680069007300200066006f006e007400200074006f00200064006900
-730070006c0061007900200061006e00640020007000720069006e007400
-200063006f006e00740065006e0074002000610073002000700065007200
-6d0069007400740065006400200062007900200074006800650020006c00
-6900630065006e007300650020007400650072006d007300200066006f00
-720020007400680065002000700072006f00640075006300740020006900
-6e0020007700680069006300680020007400680069007300200066006f00
-6e007400200069007300200069006e0063006c0075006400650064002e00
-200059006f00750020006d006100790020006f006e006c00790020002800
-69002900200065006d006200650064002000740068006900730020006600
-6f006e007400200069006e00200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-2000740068006500200065006d00620065006400640069006e0067002000
-7200650073007400720069006300740069006f006e007300200069006e00
-63006c007500640065006400200069006e00200074006800690073002000
-66006f006e0074003b00200061006e006400200028006900690029002000
-740065006d0070006f0072006100720069006c007900200064006f007700
-6e006c006f006100640020007400680069007300200066006f006e007400
-200074006f002000610020007000720069006e0074006500720020006f00
-720020006f00740068006500720020006f00750074007000750074002000
-640065007600690063006500200074006f002000680065006c0070002000
-7000720069006e007400200063006f006e00740065006e0074002e004e00
-65006700720069007400610041007200690061006c0020004e0065006700
-72006900740061004c0069006800610076006f0069007400750041007200
-690061006c0020004c0069006800610076006f0069007400750047007200
-6100730041007200690061006c00200047007200610073004600e9006c00
-6b00f6007600e900720041007200690061006c0020004600e9006c006b00
-f6007600e9007200470072006100730073006500740074006f0041007200
-690061006c002000470072006100730073006500740074006f0056006500
-740041007200690061006c002000560065007400480061006c0076006600
-6500740041007200690061006c002000480061006c007600660065007400
-50006f00670072007500620069006f006e00790041007200690061006c00
-200050006f00670072007500620069006f006e0079004e00650067007200
-690074006f0041007200690061006c0020004e0065006700720069007400
-6f041f043e043b0443043604380440043d044b0439004100720069006100
-6c0020041f043e043b0443043604380440043d044b043900540075010d00
-6e00e90041007200690061006c002000540075010d006e00e90046006500
-740041007200690061006c0020004600650074004b0061006c0131006e00
-41007200690061006c0020004b0061006c0131006e004b00720065007000
-6b006f0041007200690061006c0020004b007200650070006b006f011100
-e20323006d0041007200690061006c0020011100e20323006d004c006f00
-64006900610041007200690061006c0020004c006f006400690061004e00
-65006700720069007400610041007200690061006c0020004e0065006700
-72006900740061004e00650067007200690074006f004100720069006100
-6c0020004e00650067007200690074006f004e0065006700720069007400
-610041007200690061006c0020004e006500670072006900740061004700
-72006100730041007200690061006c00200047007200610073000000b154
-80410d03ac00af03ac0002001003ac002003ac00a003ac0003004003acb3
-070d3240b803acb312143240b803acb2162b32b9ffc003acb23a3340b803
-acb32d943280bc03ab005f0033ffc003abb2553340b803abb340443240b8
-03abb3333b3240b803abb32f313240b803abb2083340b803abb30714321f
-411a03ab002f03ab0002000f03ab002f03ab004f03ab008f03ab009f03ab
-00bf03ab0006001003ab00df03ab00ff03ab000303a803a2b2461f40b803
-a5b208330f411403a50001004003a500cf03a500ff03a50003002003a500
-af03a500ef03a500ff03a50004ffc003a3b3090c3240b803a3b208330f41
-1b03a30001000f03a3001003a3008003a300af03a300cf03a30005006f03
-a3009f03a300ff03a30003009f03a200af03a2000203a203a1b2101f1041
-0a039e007f039e0002039a000f0101001fffc00398b310143240b80399b3
-0f1332404110039500500395000200b0034d00c0034d0002006f0391007f
-03910002ffc0034bb22d3132b9ffc0034bb30a0e32104110038b0020038b
-0080038b000300a0038b00010020038b0040038b0002ffc0038bb3131632
-40b80383b20f1132b9ffc0037bb2303432b9ffc0037bb310183250411403
-7800010365036e0023001f037e036e001e001f0363036e001d001f036203
-64000d001fffc00340b30f1032804110033f0001033f03150029001f0341
-03160032001f0344031a001b001fffc00375b20e1132b9ffc00375b2282a
-32410a034303180032001f030f030d0034001f03080307b2321f20bb0340
-000100400388b3090b3240b80388b2101532bd038503070014001f038003
-07b2171f0fbd030a002f030a0002ffc00354b3090d3290410c035400a003
-540002001f036e0001009f036e00010040036eb2090b3241110345031c00
-16001f036b031d0015001f0346031e0015001f03a703a10046001f039db3
-261c1fc0bb0393000100400392b3090d3240b8033eb2083340b8033eb30d
-0e32c04109033e000100b0038e00c0038e0002ffc00390b3263832004126
-03280030032800020020037f0030037f00020010038a0030038a0050038a
-006f038a007f038a009f038a000600000389003003890002002f037a0070
-037700900377009f037a0004ffc00315b20f1032b9ffc00315b2242832b9
-03190318b2321f10bb031a0001ffc0031ab3090e3240b80318b2121332b9
-ffc00318b30c0e323fbd0373004f0373000200400374b31718326fbb032a
-00010040032cb3181b3240b80370b2090c32bd031703160032001fffc003
-16b20e1132bd031c031e0016001f031d031eb2151fb0411f031e0001000f
-031f000102ca02d00015001f02d302d5000d001f02cf02d0000d001f02cb
-02d0000d001f02cd02d0000d001f02ce02d0000d001fffc002d0b3090c32
-40b802d2b3090c32e0411c02e50001005f02dd009f02e5000202bb02c300
-30001f02da02b80032001f02d902b9003f001f02d802b80064001f02b902
-b80033001f02bab221c81fb802b8b321c81f40b8039bb20d1632b9ffc002
-c3b22b2f32b9ffc002c3b21f2532b9ffc002c3b2171b32b9ffc002c3b212
-1632412502c202c1001c001f02d702c10024001f02c102c00022001f02bf
-02c00018001f02c0027400c8001f02b50235003b001f02b40235003b001f
-02c402bc001e001f02b702b60038001f02b3b20ec81fb802b0b207c81fb8
-02afb206c81fb802aeb200c81fb802afb2502f1fbc02ae02ab001a001f02
-adb2261a1fb802a8b326241f0fbb0235000102a50274b21d1f12410a02a1
-015801f4001f02a000d801f4001f001202a2b237c81fb80290b2bc201fb9
-029002904018374025402d40a6033025302d30a6032025202d203720a620
-4110028e0005009f028b0001028b028b0037002002890030028900400289
-00900289b20437b041fd027400c0027400020080027400a0027400020060
-0274007002740002000002740010027400020080027400f002740002003f
-0285004f028500020090027e0090027f009002800090028100040090027a
-0090027b0090027c0090027d000400900274009002750090027700030070
-027e0070027f007002800070028100040070027a0070027b0070027c0070
-027d000400700274007002750070027700030060027e0060027f00600280
-0060028100040060027a0060027b0060027c0060027d0004006002740060
-02750060027700030050027e0050027f005002800050028100040050027a
-0050027b0050027c0050027d000400500274005002750050027700030040
-027e0040027f004002800040028100040040027a0040027b0040027c0040
-027d000400400274004002750040027700030030027e0030027f00300280
-0030028100040030027a0030027b0030027c0030027d0004003002740030
-02750030027700030020027e0020027f002002800020028100040020027a
-0020027b0020027c0020027d000400200274002002750020027700030010
-027e0010027f001002800010028100040010027a0010027b0010027c0010
-027d0004001002740010027500100277000300e0027e00e0027f00e00280
-00e00281000400e0027a00e0027b00e0027c00e0027d000400e0027400e0
-027500e00277b103d041c5027e00d0027f00d0028000d00281000400d002
-7a00d0027b00d0027c00d0027d000400d0027400d0027500d00277000300
-30027400400274000200c0027e00c0027f00c0028000c00281000400c002
-7a00c0027b00c0027c00c0027d000400c0027400c0027500c00277000300
-b0027e00b0027f00b0028000b00281000400b0027a00b0027b00b0027c00
-b0027d000400b0027400b0027500b00277000300a0027e00a0027f00a002
-8000a00281000400a0027a00a0027b00a0027c00a0027d000400a0027400
-a0027500a0027700030090027e0090027f00900280009002810004009002
-7a0090027b0090027c0090027d0004009002740090027500900277000300
-20027e0020027f002002800020028100040020027a0020027b0020027c00
-20027d00040020027400200275002002770003028101580801001f028001
-290801001f027f00ec0801001f027e00d80801001f027d00b10801001f02
-7c00a60801001f027b00820801001f027a00370801001f02770026080100
-1f027500200801001f0274001f0801b21f370f41160235004f0235005f02
-35006f0235009f023500af023500bf0235000700af023500cf023500df02
-3500ff02354022040f074f079f07af07bf0705af07e007020f064f069f06
-af06bf0605af06e0060220411b020d0001005f02350001008f0235000100
-7f023500ef02350002002f0235003f02350002003f0234004f0234000202
-350235023402344011ed20ef2a01cf2a01bf2a01af2a018f2a0141090247
-0104001e001f022000370201001f0158400c263e1fd8263e1f3726273e1f
-b8028eb6ec171fb226361fb801bcb226361fb80129402b26361fec26361f
-b126361fa626361f8226361f3726361f3226361f2d26361f2526361f1f26
-361f37262a1fb801584022263e1fd8263e1fbc263e1f27263e1f21263e1f
-20263e1f3700161600000012110840b9020d01a6b3c50d0009b801bcb227
-281fb801bbb227301fb801b8b2274f1fb801b7b227621f410901b6002701
-01001f01b5002002ab001f01afb21fe41fb801adb21fe41fb801acb21fbb
-1fb801a8b21f341fb8015db2272e1fb8015bb227cd1f410d0155001f0401
-001f0154001f0401001f0153001f0201001f0152b21f561fb80151b21f29
-1fb8012bb227261f410d012a00270125001f0129015800e4001f0125001f
-0401001f0124b21fe41fb80123b21f3b1fb80122b21f391f410d01080027
-0801001f0106002d0101001f0105001f0101001f0103b31fbb1fefb90158
-0401400b1fed1f931fec1fe41feb1fb80201b21fd920b80401b21fcf25b8
-0156400a1fbc2d9e1fbb1f411fb2410a01580401001f00b101580401001f
-00b001580401b51fa625891f9bb901580125b61f991f2e1f8e2db80801b5
-1f8d1f291f89b901580401b21f8220b802ab40131f801f301f742de41f73
-1f4a1f611f521f5d25b802abb21f5c1fbc0801001f0059015802abb61f50
-25891f491fb80125b21f4725b80401400b1f461f791f401f271f3920bc02
-ab001f003801580401b21f372dbc0125001f003201580125b61f2c1f341f
-2a25b80801b21f5537b80111402a07f00790075b0742073b07230722071e
-071d071408120810080e080c080a080808060804080208000814b8ffe040
-2b0000010014061000000100060400000100041000000100100200000100
-0200000001000002010802004a00b013034b024b5342014bb0c063004b62
-20b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807ff52
-b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ffb101
-018e851bb0124358b10100858d1bb900010119858d5959001816763f183f
-123e113946443e113946443e113946443e113946443e11394660443e1139
-4660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b182b1db096
-4b5358b0aa1d59b0324b5358b0ff1d594bb08153205c58b9020f020d4544
-b9020e020d45445958b90470020f455258b9020f04704459594bb0e45320
-5c58b90020020e4544b90027020e45445958b908420020455258b9002008
-424459594bb8012553205c58b90026020f4544b90021020f45445958b90a
-0d0026455258b900260a0d4459594bb8040153205c58b1d8204544b12020
-45445958b9250000d8455258b900d825004459594bb8040153205c58b901
-5800264544b1262645445958b923200158455258b9015823204459594bb0
-2953205c58b11f1f4544b12d1f45445958b9010d001f455258b9001f010d
-4459594bb02f53205c58b11f1f4544b1251f45445958b90135001f455258
-b9001f01354459594bb8030153205c58b11f1f4544b11f1f45445958b914
-28001f455258b9001f14284459592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65422b01b331757ec3456523
-456023456560234560b08b766818b080622020b17e754565234520b00326
-6062636820b003266165b075236544b07e234420b131c34565234520b003
-266062636820b003266165b0c3236544b0312344b100c3455458b1c34065
-44b23140314523614459b33f3c5841456523456023456560234560b08976
-6818b080622020b1583c4565234520b003266062636820b003266165b03c
-236544b058234420b13f414565234520b003266062636820b003266165b0
-41236544b03f2344b10041455458b141406544b23f403f45236144594569
-5342014b5058b108004259435c58b108004259b3020b0a124358601b2159
-421610703eb0124358b93b21187e1bba040001a8000b2b59b00c2342b00d
-2342b0124358b92d412d411bba04000400000b2b59b00e2342b00f2342b0
-124358b9187e3b211bba01a80400000b2b59b0102342b0112342002b2b2b
-2b2b2b2b2b00b01243584bb035514bb021535a58b1262645b04061445959
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b737373737345b040614418
-004569444569447373737473737374737473742b2b2b2b2b2b2b2b2b2b2b
-2b0073737373737373737373737373737373737373737373747474747474
-7474747474747474747474747474747575757374757575752b7300004bb0
-2a534bb036515a58b1070745b040604459004bb02e534bb036515a58b103
-0345b0406044b1090945b8ffc06044592b4569440174007373732b456944
-2b012b435c58400a0006000702a006a00702b9ffc00274b31a1d326fbd02
-77007f02770002ffc00277b22f3132b9ffc00277b322253240b80274b32f
-353240b80274b3282a3240b80274b21a2132b8ffc0b3371a1d32b8ffc0b3
-251a1d32b8ffc040112d1a1d329025902d9037a025a02da03706b8ffc0b6
-a61a1d321fa61fb8028eb22fa60300742b732b2b2b2b2b2b2b2b742b7374
-59002b2b435c58b9ffc002a1b21c1d32b9ffc002a0b21c1d322b2b592b73
-012b2b2b2b002b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b012b2b2b2b2b
-2b2b73742b2b2b2b2b2b2b2b73732b2b2b2b2b2b732b732b2b2b742b2b2b
-73737373732b73732b2b2b732b2b002b2b2b2b7374732b732b2b2b2b752b
-2b2b2b2b2b2b2b752b2b2b2b2b732b2b2b2b7374752b2b7373732b2b2b73
-2b737374752b2b7374752b2b7374752b2b2b2b2b2b2b2b2b2b2b2b74752b
-000000>
-[16305 16261 16301 15993 16353 16361 16377 15773 16093 16113 15821 16109 16365
-15025 16197 16361 15857 16053 15881 16233 16301 15449 16065 16377 15477 15965
-16117 15425 15557 16353 16369 11749 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-
-2 0 3 <> Arial-BoldMT AddT42Char 
-2 8582 38 <00010061ffe7055e05d3001a00d6404e8609891489169f009806c709d403
-d40bf503092509280c280d29142916750575098605080713071717131717
-29022a03250507280599059709c903c50b053f014f01020152100001e000
-f0000200b8ffc0b311183400b8ffc0b30a0d3400b8015a4017182d04080e
-400e12340e4b5f0f014f0f010f401518340fb801284022122d0a030fef0e
-5600ef00014f0102011a301c011c1527a007010f071f0730070307b8028c
-b31b7e53182b4e10f45d714ded4e105df65d4dedf4ed003ffdf42b5d71e4
-2b3ffdf42b2b5d71e45d3130005d015d5d5d010506042320001110002120
-171617052626232206111016333236043f011f42fecdecfedcfe88017a01
-34010da86432fedb1aa576a3cbc8a076aa021b5bf0e9018f015a016e0195
-9f5eb0467284eafefafeeaec9600>Arial-BoldMT AddT42Char 
-2 10766 47 <0001009d000004a505ae0005003d401a5007010201020403250500080405
-1a0702032001200030000200b8028bb30631b9182b4e10f45d3c4dfd3c4e
-10fe3c003f3c4dfd3c3f3c3130015d3311211121159d012802e005aefb49
-f700>Arial-BoldMT AddT42Char 
-3 434 68 <00020049ffe8042e043e0023003201714068071a081c051d161a4a1b481c
-4925db10df11093619461957266619672686269219931aa61ab91bc71ac8
-1b0c06060d151606191627062915591977028602a606b506c6060cbf34d9
-10021d243231112c0d24402b2e3424402228342440191d346f24fc240224
-461db8ffc040300e0f343d1d01001d101db01df91d041d1d2c013300400e
-0f340f001f0002005521401c113f21401b103f2140181a3421b80274b504
-070c0d0a2cb8ffc0b31c113f2cb8ffc0b31b103f2cb8ffc0b3181a342cb8
-02744040140b1e3126082909280d591f0c9f0c021f0c01ff0c010c400e16
-340c1a4f340134600001008e300101013329215f1701df17014f175f176f
-17031719336941182b4e10f45d71724dedf471ed5d4e105df62b5d71724d
-edf4e4fd3c003fed2b2b2b3f3c3ffd2b2b2bf45d2be412392f5d712bb106
-02435458b22f1d017159edb10602435458b90024ffc0b71b1d3454246424
-025d2b595d2b2b2b111239030e103c3c3c313001715d005d710127363633
-321616150314161721262726270606232226353436363736373534262322
-060106060706151416333237363736350165ff2bd2cfbcb84b031b25feea
-0b10070348a45da4bd569b92c54c506f4b54015e36ea243758444c453310
-0b02e22e9a945989b7feb88c854c1c3719084646b2885a8d4b1c25201c51
-453bfed2123218273c3b563226372465>Arial-BoldMT AddT42Char 
-3 1212 70 <00010055ffe8043f043e001900e14051580f59125916680f691269167d18
-79199702970cc610c618d710d618e906e908e913e915f80613381338154a
-124a164618590c690c073a1237163718037705770f8705860f8919a812a7
-16b912b616090eb8ffc0b3181b340eb8ffc0b51214340e330db8ffc0b319
-1e340db8ffc0b30f11340dba0104000a02744012110b0040181b34004012
-1434003390010101ba0101000402744020170701401214340121002f0d40
-1214340d214f0e010e1a1b072114191a5841182b4e10f44ded4e10f65d4d
-ed2bf4ed2b003ffdf45de42b2b3ffdf42b2be42b2b3130005d7101715d01
-052626232206151416333236370506062322001110003332160431feeb0e
-634f697d7f6b50661501142bf4cde9feeb0116edc2e502ec32535491aabd
-9c5b6f2fbec20126010401070125a700>Arial-BoldMT AddT42Char 
-3 1768 72 <00020041ffe80427043e0014001c01a3b90010fff840460b3999099a0d96
-10a805a70abb09bb0db81a0808140148024706460a4f1ea80db606b61ac7
-0ac80cd60ad80cf807f70d0d1c0f1c15401b1d3415400e11340f15bf15cf
-150315b8ffc0b30f1e3f15b8ffc0b30e173f15b8028d400c0f0e12500e60
-0e020e181201b8ffc0b6191b3401331200b8ffc0b31d203400b8ffc0b322
-293400b8ffc0b32b2d3400b8ffc0b3181c3400b8ffc0400f0e0f34a00001
-0000100002005f1212b80274b3040b1218b8027440240b070021012f1521
-4f0e010e1a2f1e5f1e6f1e9f1e041e0f2108400d0f3408191d6941182b4e
-10f42b4ded4e105df65d4dedf4ed003fed435c584014184028143f18401e
-0f3f18401b103f18401c113f2b2b2b2b593ffd435c58b90012ffc0b32814
-3f12b8ffc0b31e0f3f12b8ffc0b31b103f12b8ffc0b21c113f2b2b2b2b59
-f45d712b2b2b2b2b435c58b90000ffc0b2123900b8ffc0b2173900b8ffb0
-b3090a3e00b8ffc0b241213f2b002b2b2b59e42b1112395d435c5840140e
-400f1e3f0e401c113f0e401b103f0e400e173f002b2b2b2b592f3cfd2b2b
-722b2b3c0111333130015d71005d2b010506062320272635100033320003
-211616333236132626232207061702fa011836e9affeeb85690114d3ed01
-1206fd40038261425a270378565c3c3c0101522f9aa1b591dd0108012bfe
-c7febd7d8b48016c7a7f43437300>Arial-BoldMT AddT42Char 
-3 3024 75 <000100920000045905ba001600b2402b0f011f0139013302331042014211
-de01f9010907051605240258116811050101021314111213031402010fb8
-0274401d0307090a0a14150a1600000b0a26080940202434af0901ff0901
-091a18b8ffc040162224349018a018027018f01802ef1801180014261615
-b8ffc0400f202434a01501f015011519173f3c182b4e10f471722b3c4dfd
-3c4e105d71722bf671722b3c4dfd3c003f3c3f3c3c103c3fed3939111739
-030e103c083c3130015d005d01113633321e021511211134262623220606
-1511211101ab88bd619c4f1dfee720513d466e33fee705bafde59f487088
-8ffd910231a75a35448986fdec05ba00>Arial-BoldMT AddT42Char 
-3 3280 76 <00020093000001ac05ba000300070077b90009ffc0403f110a3f40095009
-028009b009c009d009ef09051f0960097f09a009b0090503060700050403
-0f00014000d000e00003005d02010006050607040a0207260104b8ffc040
-092124340419083f3c182b4e10f42b3c4dfd3c003f3c3f3c3f3cfd5d713c
-0305103c3c103c3c313001715d722b1311211101112111930119fee70119
-04b60104fefcfb4a0426fbda>Arial-BoldMT AddT42Char 
-3 3658 78 <000100890000045f05ba000b00f3b90003ffddb30d113f03b8ffc0407d19
-2d3407031003130627096606af0abf0ac809cb0ada0a0a53036003020d07
-180946065708760605b609df04ed04fc04f506054e074e0866067d048c04
-9b049c059a069a079a080a1f0412062b042b052a062a072a082f0d4b044b
-050a060607090a09080a050a090306040b050406020100000b0b08070a03
-0a0a0b04b8026d401a052f08391f070107650d020b26018000011f000100
-190c3f7b182b4e10f45d713c4dfd3c1910f67118edf4ed103c103c003f3c
-3c103c3f3c3f3c12173987087d10c4083cb10602435458b90003ffc8b209
-2134002b593130015d5d5d7100725d2b2b33112111012101012101071189
-01190149015afe950185fed1fef58305bafcf60176fe7cfd5e01dd89feac
->Arial-BoldMT AddT42Char 
-3 4502 81 <0001009100000459043e0016009f4018071317135a08680804b804013408
-34104408440fe9100506b80274401d11070e0d060c0b0b01000a02012616
-0040202434af0001ff0001001a18b8ffc040162224349018a018027018f0
-1802ef1801180a0b260c0eb80129b20d0d0cb8ffc0400f202434a00c01f0
-0c010c19173f3c182b4e10f471722b3c4d10ed10fd3c4e105d71722bf671
-722b3c4dfd3c003f3c3c103c3f3c3fed3130005d01715d21211134262623
-2206061511211121153633321e02150459fee724513949742bfee701058b
-d35d9a4f1f021eac65385084b2fe1f04269cb44368847b00>Arial-BoldMT AddT42Char 
-2 0 0 <00020100000005000500000300070042b40201fe0607b8023f4013000504
-fe03000a0704fe010019080605fe0203bc0126000901b0011800182b10f6
-3cfd3c4e10f43c4dfd3c003f3cfd3c10fc3cfd3c31302111211125211121
-01000400fc2003c0fc400500fb002004c000>Arial-BoldMT AddT42Char 
-Arial-BoldMT /CharStrings get begin
-/space 3 def
-/C 38 def
-/L 47 def
-/a 68 def
-/c 70 def
-/e 72 def
-/h 75 def
-/i 76 def
-/k 78 def
-/n 81 def
-end
-Arial-BoldMT /Encoding get
-dup 32 /space put
-dup 67 /C put
-dup 76 /L put
-dup 97 /a put
-dup 99 /c put
-dup 101 /e put
-dup 104 /h put
-dup 105 /i put
-dup 107 /k put
-dup 110 /n put
-pop
-end
-%ADOEndSubsetFont
-/KUDFOE+Arial-BoldMT /Arial-BoldMT findfont ct_VMDictPut
-/KUDFOE+Arial-BoldMT*1 
-[32{/.notdef}rp /space 34{/.notdef}rp /C 8{/.notdef}rp /L 20{/.notdef}rp /a 
-/.notdef /c /.notdef /e 2{/.notdef}rp /h /i /.notdef 
-/k 2{/.notdef}rp /n 145{/.notdef}rp]
-KUDFOE+Arial-BoldMT nf
-KUDFOE+Arial-BoldMT*1 [9 0 0 -9 0 0 ]msf
-240 206.76 mo
-(Link Cache)
-[5.51694 2.51999 5.51694 5.04001 2.27698 6.48001 5.04001 5.03998 5.51694 0 ]xsh
-/KUDFOE+Arial-BoldMT*1 uf
-/KUDFOE+Arial-BoldMT uf
-/Arial-BoldMT uf
-222 111.125 mo
-311.375 111.125 li
-311.375 128.25 li
-222 128.25 li
-cp
-@
-%ADOBeginSubsetFont: ArialMT Initial
-ct_T42Dict begin
--0.664 -0.324 2 1.004
- 256 array 0 1 255 {1 index exch /.notdef put} for  /ArialMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f3210325d73000000cc000000606376
-7420a11cd7eb0000012c000006546670676dcc79599a000007800000066e
-676c796607022dca000094e0000822cc68656164d6144b3e00000df00000
-003668686561123315fe00000e2800000024686d7478f65efffb00000e4c
-000034d46c6f6361361cd72000004320000034d86d617870124c05df0000
-77f8000000206e616d659617a74000007818000011057072657025d64dbf
-0000892000000bbe67646972000000000000000000000000000303880190
-00050008059a05330000011b059a0533000003d1006602120805020b0604
-020202020204e0002affc00078430000000900000000544d432000400020
-fffc05d3fe510133073e01b2400001ffffff0000042605bb000000200004
-05ba001905ba001a05a70019042600180000ffe70000ffe80000ffe7fe69
-ffe805ba0019fe69ffe802ea000000b8000000b80000000000a800ad0169
-00ad00bf00c201f0001800af00b900b400c800170044009c007c00940087
-0006005a00c80089005200520005004400940119ffb4002f00a1000300a1
-00cd00170057007e00ba00160118ffe9007f008503d300870085000d0022
-00410050006f008d014cff75005c00df04830037004c006e00700180ff58
-ff8eff92ffa400a500b903c8fffd000b001a0063006300cdffee05d8ffdc
-002d005c0095009900df019209b500400057008000b9039d0072009a035d
-0401ff67fffa00030021007700cd0004004d00cd01c0022b004c006500e7
-0118017c034305d8ffa3ffb0ffc40003001c005d0068009a00ba01350147
-0221055cff4dffcd0016002d00780080009900b200b600b600b800bd00da
-010c05f0ffa4fff00019002c0049007f00b400ce01c003fefd81fe3f0000
-00050018002900390049006f00be00c700d0012301c1026f050c05320540
-057affd4001400310055005700a700b400e601f7027e027e027f03c60446
-ff42000e0085009100bf00c200c500e1011a012f014f01560229026f029e
-03720008002c00310031006400690089009800c700de012b01b6020c02cf
-03a304ab04fb061dfee0ff0e00060026009b009d00c1010d011801200173
-018201d601e30243025f029b02e2039404a904d20761001c005e006d008d
-00ab00f7011201380151015b0168017c01870191019901cd01d001e80241
-0254026b02ef0368037103bd044204420453047304830586058b06e8fe58
-fec4fed1fef7ff32ff860051007c008100910095009e00b400b900cf00d9
-00d900df00e20105010b010e010e012001210155017b017b017e018d01a2
-01a801a901b401d001d001e201e901f201f501fb020002000206021b0221
-022202220223027202770294029c02cf02cf02d002ec02f903170322032b
-0335033c0359036f037103870390039003b503e1041a04cf04ff05320532
-0596059f05a805ab05c205f0060c0782080008ccfca3fd2afddefe00fe88
-fe96feb2feb4ffe100150019001a001c001f003c005100610061006a0078
-009600a500af00d3010c0118011a012a013e014c0151015f016a01710178
-01820184019a01a501a801a901ae01bc01cd01d701ef0200020d021c0221
-0222022e02350242024f024f025e026502710290029202b402d602fa0307
-030b030f0315032a0347035d036503740379039603b003cc03dd03e203f6
-03fc03fc03ff040a041f04220426042b0447045f0475049e04e704e7055c
-05cb05e5060a066d068606b806f10736073e07500751075d078f07b607d4
-086000b600c300b500b700000000000000000000000001e00381034503b5
-008e0233041902ce02ce002d005f0064034d023f000002a80188027d01b4
-02240578063b023b014e00f00426029402c6029f02f6023b034d014b0153
-006a0231000000000000061404aa0000003c04c300ed04bc026502ce03b5
-0078060c017e02ef060c00b201000239000001c50330042b03cb00da03df
-010704a100db040a011701ed02a70350010b01bd043e05580021039c00ae
-0371017d00b5024500000afb088c012b014e01aa00870054013201f803ff
-0003024e00b4003703e30083006b02d800ed00770088009701640467008e
-0033017c00e700a6029e0329056e062a061501c90269048a021301b40002
-04a9000002390124010305140084015d039a06ef02d9007500cf040a00de
-03ac04bc02cf02ae034d04f005520168006d007d00860071ff8100790558
-04d2016700030156002504e00094007c033204210094007f0072005c002f
-00b6001800ba00b80041034d00720018001f004c016a01550099009a009a
-009800b200040078006900140057006e00ce00b4065402b80067050e0165
-00e7000004cbfe52005affa60099ff67006eff92002dffd40087ff7c00b8
-00a800e5008f00a80185fe7b0070001e00d900de014c054602cf0546ff2d
-028a02d90253029600b700000000000000000000000000000125011800ea
-00ea00ae0000003e05bb008a04d70053003fff8cffd50015002800220099
-0062004a00e4006d00ee00e5004803c00033fe4e02b1ff460370007905df
-0051ffa7ff1f010a0068ff6c004f00bc00a507050061072b00ed04b001d2
-00b6007b00650252ff740365fe690094008f005c00400086007500890089
-4043555441403f3e3d3c3b3a3938373534333231302f2e2d2c2b2a292827
-262524232221201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09
-0807060504030201002c4523466020b02660b004262348482d2c45234623
-6120b02661b004262348482d2c45234660b0206120b04660b00426234848
-2d2c4523462361b0206020b02661b02061b004262348482d2c45234660b0
-406120b06660b004262348482d2c4523462361b0406020b02661b04061b0
-04262348482d2c0110203c003c2d2c20452320b0cd442320b8015a515823
-20b08d44235920b0ed51582320b04d44235920b09051582320b00d442359
-21212d2c20204518684420b001602045b04676688a4560442d2c01b10b0a
-432343650a2d2c00b10a0b4323430b2d2c00b0172370b101173e01b01723
-70b10217453ab10200080d2d2c45b01a234445b01923442d2c2045b00325
-456164b050515845441b2121592d2cb00143632362b0002342b00f2b2d2c
-2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b1
-2cc08a8cb8100062602b0c642364615c58b00361592d2c45b0112bb01723
-44b0177ae4182d2c45b0112bb01723442d2cb01243588745b0112bb01723
-44b0177ae41b038a45186920b01723448a8a8720b0a05158b0112bb01723
-44b0177ae41b21b0177ae45959182d2c2d2cb0022546608a46b040618c48
-2d2c4b53205c58b002855958b00185592d2c20b0032545b019234445b01a
-23444565234520b00325606a20b009234223688a6a606120b01a8ab00052
-7921b21a1a40b9ffe0001a45208a54582321b03f1b235961441cb114008a
-5279b31940201945208a54582321b03f1b235961442d2cb110114323430b
-2d2cb10e0f4323430b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2c
-b10e0f432343650b2d2cb11011432343650b2d2c4b525845441b2121592d
-2c0120b003252349b04060b0206320b000525823b002253823b002256538
-008a63381b212121212159012d2c4bb06451584569b00943608a103a1b21
-2121592d2c01b005251023208af500b0016023edec2d2c01b00525102320
-8af500b0016123edec2d2c01b0062510f500edec2d2c20b001600110203c
-003c2d2c20b001610110203c003c2d2cb02b2bb02a2a2d2c00b00743b006
-430b2d2c3eb02a2a2d2c352d2c76b8022323701020b802234520b0005058
-b00161593a2f182d2c21210c6423648bb84000622d2c21b08051580c6423
-648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb815
-55621bb200802f2b59b002602d2c0c6423648bb84000626023212d2cb400
-0100000015b00826b00826b00826b008260f10161345683ab001162d2cb4
-000100000015b00826b00826b00826b008260f1016134568653ab001162d
-2c4b53234b515a5820458a60441b2121592d2c4b545820458a60441b2121
-592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb01343
-58031b02592d2cb0134358021b03592d2c4b54b012435c5a58381b212159
-2d2cb012435c580cb00425b00425060c6423646164b807085158b00425b0
-0425012046b01060482046b0106048590a21211b2121592d2cb012435c58
-0cb00425b00425060c6423646164b807085158b00425b00425012046b8ff
-f060482046b8fff06048590a21211b2121592d2c4b53234b515a58b03a2b
-1b2121592d2c4b53234b515a58b03b2b1b2121592d2c4b53234b515ab012
-435c5a58381b2121592d2c0c8a034b54b00426024b545a8a8a0ab012435c
-5a58381b2121592d2c4b5258b00425b0042549b00425b00425496120b000
-5458212043b0005558b00325b00325b8ffc038b8ffc038591bb040545820
-43b0005458b00225b8ffc038591b2043b0005458b00325b00325b8ffc038
-b8ffc0381bb00325b8ffc03859595959212121212d2c462346608a8a4623
-20468a608a61b8ff8062232010238ab902c202c28a70456020b0005058b0
-0161b8ffba8b1bb0468c59b0106068013a2d2cb1020042b123018851b140
-0188535a58b910000020885458b202010243604259b12401885158b92000
-0040885458b2020202436042b12401885458b2022002436042004b014b52
-58b2020802436042591bb940000080885458b202040243604259b9400000
-8063b80100885458b202080243604259b94000010063b80200885458b202
-100243604259b94000020063b80400885458b20240024360425959595959
-2d2cb0024354584b53234b515a58381b2121591b21212121592d00000001
-00000005028fa58dc35f5f0f3cf5081b080000000000a2e3272a00000000
-c14fd713faaffd671000080c00000009000100010000000000010000073e
-fe4e00431000faaffa7a1000000100000000000000000000000000000d35
-06000100000000000239000002390000023900b002d7005e047300150473
-0049071d0077055600580187005a02aa007c02aa007c031d004004ac0072
-023900aa02aa0041023900ba0239000004730055047300df0473003c0473
-00560473001a047300550473004d047300610473005304730055023900b9
-023900aa04ac007004ac007204ac00700473005a081f006f0556fffd0556
-009605c7006605c7009e055600a204e300a80639006d05c700a4023900bf
-04000037055600960473009606aa009805c7009c063900630556009e0639
-005805c700a10556005c04e3003005c700a105560009078d001905560009
-0556000604e300290239008b023900000239002703c100360473ffe102aa
-00590473004a0473008604000050047300460473004b0239001304730042
-0473008701c7008801c7ffa20400008801c7008306aa0087047300870473
-0044047300870473004802aa00850400003f02390024047300830400001a
-05c700060400000f040000210400002802ac0039021400bc02ac002f04ac
-00570556fffd0556fffd05c70068055600a205c7009c0639006305c700a1
-0473004a0473004a0473004a0473004a0473004a0473004a040000500473
-004b0473004b0473004b0473004b023900bd023900230239ffe502390009
-047300870473004404730044047300440473004404730044047300830473
-0083047300830473008304730049033300800473006b0473001b04730051
-02cd006d044c000104e3009905e5000305e50003080000e102aa00de02aa
-003d0464004e080000010639005305b4009a0464004e0464004d0464004d
-0473fffd049c00a003f4003805b4007a069600a1046400000231000002f6
-002f02ec002d0625007f071d004404e3008104e3009e02aa00e804ac0072
-046400540473002e0464003304e5001a047300860473008c080000ef0556
-fffd0556fffd0639006308000081078d00520473fffc0800000002aa0053
-02aa004701c7008001c7006c0464004e03f4002f04000021055600060156
-fe390473ffe402aa005c02aa005c040000170400001704730049023900b9
-01c7006c02aa0047080000250556fffd055600a20556fffd055600a20556
-00a20239008d0239ffe00239000402390015063900630639006306390063
-05c700a105c700a105c700a1023900c602aa001902aa000602aa001d02aa
-002e02aa00e502aa00a202aa006b02aa003a02aa004b02aa002804730000
-01c700030556005c0400003f04e3002904000028021400bc05c7fffd0473
-004905560006040000210556009e0473008704ac007204ac00a102aa006b
-02aa001902aa002106ac006b06ac006b06ac0021047300000639006d0473
-0042023900b10556005c0400003f05c700660400005005c7006604000050
-04730046046bffe102aa00ee0556fffd0473004a0556fffd0473004a05c7
-009e04eb004705c7fffd055600a20473004b055600a20473004b04730096
-01c7004204730096025500880473009a02ac008305c7009c0473008705c7
-009c04730087063900630473004405c700a102aa008505c700a102aa003c
-0556005c0400003f04e300300239002404e300300300002305c700a10473
-008305c700a10473008304e300290400002804e3002904000028046800a4
-063900600662005504a00048047400480391006204f000440329002e0530
-0048046bffe1040000b002eb005208c000330800004f040000990800004f
-040000990800004f040000980400009807d5016a05c0009e04ab007204d5
-009d04ac007104d5022204d5010505abffe9050001c905ab027e05abffe9
-05ab027e05abffe905ab027e05abffe905abffe905abffe905abffe905ab
-ffe905ab01c005ab027e05ab01c005ab01c005abffe905abffe905abffe9
-05ab027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab
-01c005ab01c005abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905abffe905abffe905ab02d605ab006605abffea05d5ffff04d50092
-0800000007eb013007eb012007eb013007eb012004d500b204d5008004d5
-002a082b0198086b01b807550010060000f40600006f0440003a05400037
-04c0003f04150040040000250600005505e100bf038d008904d5ffd90180
-008002d50086071500610296000f04d5009202d6008302d6008304d500b2
-02d600700556fffd0473004a05c700660400005005c70066040000500556
-00a20473004b055600a20473004b055600a20473004b0639006d04730042
-0639006d047300420639006d0473004205c700a40473008705c7001f0473
-00060239ffce0239ffce0239ffe40239ffe40239fff60239fff50239004b
-01c700190400003701c7ffa20556009604000088040000860473009601c7
-fffa05c7009c0473008705c900a50473008b063900630473004406390063
-0473004405c700a102aa006b0556005c0400003f04e300300239000c05c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-078d001905c70006055600060400002101c700890556fffd0473004a0800
-0001071d00440639005304e30081023900b9078d001905c70006078d0019
-05c70006078d001905c70006055600060400002101c7008a02aaffe10473
-001b04cd005a06ac006b06ac002206ac002206ac004a02aa00e202aa006b
-02aa00de02aaffea0557ffff0646ffa706b4ffa80312ffa80632ffa706d8
-ffa70605ffa701c7ff780556fffd055600960558fffe055600a204e30029
-05c700a4023900bf055600960558000b06aa009805c7009c0533006d0639
-006305c700a40556009e04f2009404e30030055600060556000906af007f
-05fb0061023900040556000604a00048039100620473008b01c7006b0460
-0088049a008c04000019038700480473008b0473005c01c7008904000086
-04000018049c00a00400001a0395005c04730044048d008303db00560460
-00880433001105b4007a063f005701c7ffc9046000880473004804600088
-063f0057055700a206eb0032045500a105c000640556005c023900bf0239
-0004040000370875000d081500a406d5003104a900a10515000a05c000a0
-0556fffd054000a705560096045500a1056b0000055600a20763000704d5
-004e05c000a105c000a104a900a10540001206aa009805c700a406390063
-05c000a00556009e05c7006604e300300515000a061500520556000905eb
-009f05550057075500a1078000a106550000071500a8054000a505c00055
-081500a405c7001a0473004a0495005b0440008802eb008804ab00000473
-004b055afffb03ab003204780087047800870380008604ab00180580008c
-046b00880473004404550088047300870400005003aa0026040000210695
-004b0400000f0495008a042b0045066b008d0695008d0500002805c0008b
-042b008404150030060000890455001f0473004b0473000002eb00890415
-004b0400003f01c700880239000901c7ffa2074000130680008304730000
-0380008604000021046b008803e900a1034a008808000041089500a00585
-002d000001010000001e0000003100000031000001010000007e0000007e
-0000008c0000008c000001010000001000000101000001210310007d0000
-008c023300d20000030b0000ff04023900b9048100690456003203310019
-0411002d04d1009601f9009b030f005f04ca009b04b8008c01f9009b0413
-002803b0005003b4003c04ca009b04cf005001f9009b02d2003c0498005a
-043c00190488006e045f007303b1001903d4000a0466009604130028058e
-00640524002803f2009b03f2009b03f2009b01e3005a0356005a0686009b
-01f9ffac041300280413002803b4ff5703b4ff570448002d058e0064058e
-0064058e0064058e00640481006904810069048100690456003203310019
-0411002d04d10096024b0000034a000004b8008c024b00000413002803b0
-005003b4003c04cf005002d2003c0498005a0488006e045f007303d4000a
-0466009604130028058e00640524002801f9009b0456003203b00050045f
-0073049b003c0000ffdc0000ff250000ffdc0000fe51028d00ab028d00a0
-02da0043034d007901a8ffba000000460000004600000046000000460000
-00480000004600000046000000460435017c0435012e043500b704350081
-0435012c043500be043500af043500810435009a043500db04350085028d
-00c1043500b3060001000600010002420036060001000435009e04350098
-043500cb0600010006000100060001000600010006000100000000460600
-010006000100060001000600010006000100060001000600010006000100
-051bffba06000100060001000600010005b5003a05b5003a01f4ffba01f4
-ffba060001000600010006000100060001000481003604350036043dffba
-043dffba03e9004a03e9004a067f0014077600140327ffba041effba067f
-0014077600140327ffba041effba051b003204b500240300fff706000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010000000030
-0000004600000046000000400000004606000100060001000000ffdc0000
-fe510000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ff160000ff160000ffdc0000ff160000ffdc0000ff200000ffdc0473
-004a08000000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010006000100028d
-007f028d005d0600010004ee0015034d007901a8000e01d6ffdc01a80056
-01d60010037500320375003201a8002d01d60013051b003204b5002401f4
-ffba01f4ffba01a8009301d6001305b5003a05b5003a01f4ffba01f4ffba
-024200000300fff705b5003a05b5003a01f4ffba01f4ffba05b5003a05b5
-003a01f4ffba01f4ffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba02b3
-005f02b3005f02b3005f02b3005f03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba08c9003e08c9003e06c5ffba06c5ffba08c9003e08c9003e06c5ffba
-06c5ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7
-ffba04a7ffba045a002a039a00360435ffba0327ffba045a002a039a0036
-0435ffba0327ffba064f0027064f00270224ffba021affba04a7004604a7
-00460224ffba021affba04cf002d04cf002d0327ffba0327ffba040d0047
-040d004701a8ffba01a8ffba02b4002302b400230327ffba0327ffba0435
-00450435004501f4ffba01f4ffba024200360300fff7039affba0327ffba
-0375003203750032051b003204b50024051b003204b5002401f4ffba01f4
-ffba045a004004ce0049045a002604ce0039045a005304ce004a045a0053
-04ce004a0600010006000100000000460000004606000100060001000600
-010000000046000000460600010006000100000000480000004606000100
-060001000600010000000046000000460000004600000046000000400000
-003006000100000000460000004606000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d00ca028d00c7028d
-00c606000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000100ffba0800ffba1000ffba06dc0063053f004406d5
-00a1055b00830000fddc0000fc2f0000fca60000fe540000fcd70000fd73
-0000fe290000fe0d0000fd110000fc670000fd9d0000fbf50000fc720000
-fed50000fed50000ff02041b00a006ac006b06ac00190000feb60000fd73
-0000fe080000fca60000fe530000fd110000fbc80000faf40000faaf0000
-fc720000fbaa0000fb6a0000fcf10000fc7d0000fbdd0000fcc10000fb98
-0000fdea0000fe840000fdc20000fcf10000fd5f0000fe760000febc0000
-fceb0000fd6c0000fd580000fc900000fd150000fc2c0000fc130000fc12
-0000fb960000fb9601c700880556fffd0473004a0556fffd0473004a0556
-fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473004a
-0556fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473
-004a0556fffd0473004a0556fffd0473004a055600a20473004b055600a2
-0473004b055600a20473004b055600a20473004b055600a20473004b0556
-00a20473004b055600a20473004b055600a20473004b0239006301c7001f
-023900ba01c7007c06390063047300440639006304730044063900630473
-004406390063047300440639006304730044063900630473004406390063
-0473004406dc0063053f004406dc0063053f004406dc0063053f004406dc
-0063053f004406dc0063053f004405c700a10473008305c700a104730083
-06d500a1055b008306d500a1055b008306d500a1055b008306d500a1055b
-008306d500a1055b00830556000604000021055600060400002105560006
-040000210556fffd0473004a0239ffe201c7ffb0063900630473004405c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-05c700a1047300830000fefe0000fefe0000fefe0000fefe0455fffd02eb
-000c07630007055afffb04a900a10380008604a900a10380008605c700a4
-046b00880473fffd040000140473fffd04000014055600090400000f0555
-0057042b0045055500a10473008706050063047300550639006004730044
-05b5003a01f4ffba0224ffba021affba04a7004601f4009e01f4001001f4
-001b01f4001001f4006b01f4fff90227ffce0000000f0000fff502aa00a4
-02aa00a40000000e00000056000000560000ffcf01a8000f01d6ffbf01a8
-fff501d6ffcd01a8001d01d6fff501a8009301d600130375003203750032
-0375003203750032051b003204b5002405b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba
-01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4
-ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a
-01f4ffba01f4ffba0481003604350036043dffba043dffba048100360435
-0036043dffba043dffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba0481
-003604350036043dffba043dffba02b3003202b3003202b3005f02b3005f
-02b3005f02b3005f02b3003202b3003202b3005f02b3005f02b3005f02b3
-005f02b3005f02b3005f02b3003802b3003802b3004902b3004903e9004a
-03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9
-004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba0692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba08c9003e08c9003e06c5ffba06c5ffba04a7ffba04a7ffba045a
-002a039a00360435ffba0327ffba064f0027064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba064f0027064f00270224
-ffba021affba064f0027064f00270224ffba021affba064f0027064f0027
-0224ffba021affba04a7004604a7004604a7004604a70046093e0032093e
-00320740ffba0740ffba067f0014077600140327ffba041effba04cf002d
-04cf002d0327ffba0327ffba04cf002d04cf002d0327ffba0327ffba04cf
-002d04cf002d0327ffba0327ffba067f0014077600140327ffba041effba
-067f0014077600140327ffba041effba067f0014077600140327ffba041e
-ffba067f0014077600140327ffba041effba067f0014077600140327ffba
-041effba040d0047040d004701a8ffba01a8ffba040d0047040d004701a8
-ffba01a8ffba040d0047040d004701a8ffba01a8ffba040d0047040d0047
-01a8ffba01a8ffba043500450435004501f4ffba01f4ffba043500450435
-00450435004504350045043500450435004501f4ffba01f4ffba04350045
-043500450481003604350036043dffba043dffba024200360300fff7031a
-001a031a001a031a001a0375003203750032037500320375003203750032
-037500320375003203750032037500320375003203750032037500320375
-0032037500320375003203750032051bffba04b5ffba051b003204b50024
-01f4ffba01f4ffba0375003203750032051b003204b5002401f4ffba01f4
-ffba051b003204b50024067f0045067f0045067f0045067f004501a80028
-0000fe290000fea20000ff300000ff1d0000ff120000ff920000fe7e08fc
-003208ad00320000ffb50000ffb60000feed0000ff640000fe7e0000ff9f
-018d000002f6fffd0000fe820000ff1004cd00320000ff580000ff580000
-ff640692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba045a002a039a00360435ffba0327ffba034d007902b400230242
-003601f4ffba0290ffba01f4002f01f4003b01f4001201f400b101f4006d
-067f00140776001401f9009b0000fed902bc000003f2009b045afff504ce
-fff5045a005304ce004a045a005304ce004a045a005304ce004a045a0053
-04ce004a045a005304ce004a045a005304ce004a04350071043500ad045a
-000f04ce000f0473001406110014054000a7047300860540000a0473000a
-05c7005105c700660400005005c7fffd067a00140540004a047300460474
-00480556006e04d5005304e3ffc40639006d04fe000f070c008701c70083
-0239001f055600960400008801c7001504000018072000a405c7ffb80473
-008b0639006006f200630557004406090014047300860556009e0556006b
-0400004f04f20094030b00440239002404e300140239002404e3003005fb
-006105c700a1062e00140400002104e300290400002804e3002904e30031
-045c0044045c003f0473003c0473005503ab003203e50024047300870214
-00bc034e00bc04ac0072023900b00aaa009e09c7009e08640046087f0096
-06aa0096039c008309c7009c078e009c062b0087047300550556fffd0473
-004a0000fefe0556fffd0473004a08000001071d00440639006d0473001a
-0639006d0473004205560096040000880639006304730044063900630473
-004404e30029045c004c01c7ffa20aaa009e09c7009e086400460639006d
-04730042084600a404f2009e05c7009c047300870556fffd0473004a0556
-fffd0473004a055600a20473004b055600a20473004b0239ff8a0239ff64
-023900040239fff60639006304730044063900630473004405c700a102aa
-ffcc05c700a102aa006805c700a10473007605c700a1047300830556005c
-0400003f04e3003002390024045c0051037e001305c700a40473008705a6
-00a404d6005e0486005e04e30029040000280556fffd0473004a055600a2
-0473004b06390063047300440000fefd0639006304730044063900630473
-004406390063047300440556000604000021047300570473004804730086
-04730086040000130400005004730046047300460473005505e9005503ab
-004903ab0032050d0032040f00440239ffb9047300420473004204780050
-0402001904ef00190473008b047300870473008701c7001901c7008901c7
-0089029e0000026e001401c700830493008306aa008406aa008406aa0087
-0473ffa60473008b046c00870473004406530044063f00570466004402aa
-ffe402aaffe402aaffe402aa008502aa008502aa008502aaffe40455008a
-0455008a0400003f01c7ffa20214ffb901c7ff7202cb00000239000f0239
-002404730019048c0044046000880400001a05c700060400001804280019
-0400002804540028045c004c045c00790400002404000050040000240400
-00500639006304400088040f004904780050046b0088032e000004000008
-033b008804730048040000240400005007b7004607400046080b004605b3
-0024036f002405c00024061c0013054a0083050f008303e2001e04380063
-03110064031100640146ffce01eb006401eb000001eb000002ea006403d9
-0000029100000187005a02d7005e01c7008001c7006c01c7008a02aa00fb
-02aa00fb02ca003202ca003204ac007004ac007004ac006504ac006502aa
-012102aa00de02aa005902aa012102aa001d02aa005902aa00de023900b6
-023900b602aa00fb02aa00fb02aa00a602aa00a602aa00a602aa001d02aa
-ffe202aafffb029400000142006402b8003202a0000002ca003203100096
-0310009603100096031000960310009602aa006202aa006202aa002802aa
-001d02aa0047045700960457009604570096045700960457004304570043
-045700430457004304570043031000430457002f0457002f0457002f0457
-002f0457002f0310002f0457002504570025045700250457002504570025
-0310002f0457001a0457001a0457001a0457001a0457001a0310001a0457
-004204570042045700420457004204570042031000420457009604570096
-045700960457009604570042045700420457004204570042045700420310
-00420457002f0457002f0457002f0457002f0457002f0310002f0457002f
-0457002f0457002f0457002f0457002f0310002f04570026045700260457
-002604570026045700260310002604570042045700420457004204570042
-045700420310004204570096045700960457009604570096045700420457
-004204570042045700420457004203100042045700260457002604570026
-045700260457002603100026045700230457002304570023045700230457
-0023031000230457002f0457002f0457002f0457002f0457002f0310002f
-0457004b0457004b0457004b0457004b0457004b0310004b045700960457
-009604570096045700960457004204570042045700420457004204570042
-031000420457001a0457001a0457001a0457001a0457001a0310001a0457
-002404570024045700240457002404570024031000240457002f0457002f
-0457002f0457002f0457002f0310002f0457004e0457004e0457004e0457
-004e0457004e0310004e045700960457009604570096045700960000fec1
-0000fec60000fdac0000fed80000ff920000fee90000ff4c0000fea00000
-fec40000ffce0000ff660000fea00000fed80000fed80000ff970000ff98
-0000ff990000fff40000ff420000ff420000ff440000ff5f0000fe870000
-ffec0000ffa60000ff510000ff510000ff510000fec90000ff1c00000000
-0000fee90000ff4c0000ff930000ff2a0000ff560000ffce0000fe870000
-febb0000fec40000fec40000fed80000fed80000feb30000fec90000fdad
-0000fdac0000feb30000fec90000fdad0000fe160000fee60000ffa60000
-fe870000ff440000feba0000ff230000ff9a0000fdac0000fe8800000000
-0000feb00000ff980000fe930000ffa60000fe870000fdac0000ff660000
-ff440000feb00000feb00000feb00000ff030000ff520000fd1f0000ff53
-0000ff530000ff530000feb50000feb50000ffc30000feae0000fedc0000
-fec70000fec80000fedc0000fe1e0000ff420000ff510000feb70000feb0
-02aa00de02aa005902aa00fa049a008c04600088062e001407aa0000062e
-0014047b004c063f005704cf0044063900630473004405c7006604000050
-04e300a8033b008804ff0000043c0032060d000a049d0042072000a406aa
-0084056500630473008b056400a40400000a0556006b0556006b04e00005
-04c5001905e5005f046e004403b600140347002804cf00440495005b0400
-005001c7ffa2063900600389004d03890050055600a205c000a10473004b
-047800870ab4006d04fe00100639001404e70014079900bf05b500880558
-000b0400001a072e00bf0590008806a10078057b007a086d00bf06f00088
-04d5006603ab001f065f0039058200480639006004730044066d0009050c
-001a066d0009050c001a0b010063091c004406aa005c04e600440987006d
-06d000500000fe370ab4006d04fe001005c7006604000050040700140000
-fea60000febc0000feaa0000fead0000fc2b0000fc4c05c000a104780087
-05400004042b00140556009e04730087055d00a40464008804d5004e03ab
-003204a900040380000005ef002904490028070900a4052f0088091800a0
-06f6008806060066042b005005c700660400005004e3003003aa00260767
-00310587002605550057042b004506e4000a0554000a06e4000a0554000a
-023900bf07630007055afffb055700a1046800860540001204ab001805c7
-00a4046b008805c700a4046b008805550057042b004506aa00980580008c
-02aa002e0556fffd0473004a0556fffd0473004a08000001071d00440556
-00a20473004b060500630473005507630007055afffb04d5004e03ab0032
-04d5004e045c004c05c000a10478008705c000a104780087063900630473
-0044063900600473004405c0004a0415002b0515000a040000210515000a
-040000210515000a0400002105550057042b0045071500a805c0008b0540
-004a0473004607bf004a0703004607a6006606860053054d006604130053
-07c3001207470018084600a4070700880639006d0478005005f900300553
-00260000ff430000fec90000ff770000ffb00000ff470000ff560000ff74
-0000fed70000feac000000000000ff520000ff56000000000000feac0000
-fd9a000000000000ff6a0000ff7c0000ff690000ff560000feac0000ff7f
-0000ff560000fdef0000ff430000ff690000ff7c000000000000fdae0000
-ff8c000001020000fefe0000fefe0000fedf0000fedf0000ff580000ff20
-0000fefe0556fffd0473004a055600960473008605560096047300860556
-00960473008605c700660400005005c7009e0473004605c7009e04730046
-05c7009e0473004605c7009e0473004605c7009e04730046055600a20473
-004b055600a20473004b055600a20473004b055600a20473004b055600a2
-0473004b04e300a8023900130639006d0473004205c700a40473008705c7
-00a40473008705c700a40473008705c700930473006805c700a404730087
-0239ffdf01c7ff9202390020023900060556009604000088055600960400
-008805560096040000880473009601c7007e0473009601c7ffb904730096
-01c7ffa50473009601c7ffa306aa009806aa008706aa009806aa008706aa
-009806aa008705c7009c0473008705c7009c0473008705c7009c04730087
-05c7009c0473008706390063047300440639006304730044063900630473
-004406390063047300440556009e047300870556009e0473008705c700a1
-02aa008505c700a102aa008505c700a102aa005e05c700a102aa00260556
-005c0400003f0556005c0400003f0556005c0400003f0556005c0400003f
-0556005c0400003f04e300300239002404e300300239002404e300300239
-ffff04e300300239000e05c700a10473008305c700a10473008305c700a1
-0473008305c700a10473008305c700a104730083055600090400001a0556
-00090400001a078d001905c70006078d001905c70006055600090400000f
-055600090400000f055600060400002104e300290400002804e300290400
-002804e3002904000028047300870239000305c70006040000210473004a
-01c7008904a0004804a0004804a0004804a0004804a0004804a0004804a0
-004804a000480556fffd0556fffd06820013068200130682001306820013
-068200560682005603910062039100620391006203910062039100620391
-0062061e0000061e0000076c0000076c0000076c0000076c00000473008b
-0473008b0473008b0473008b0473008b0473008b0473008b0473008b068f
-0000068f0000081f0000081f0000081f0000081f0000081ffff3081ffff3
-01c7008101c7008101c7ff9b01c7ff9b01c7ffeb01c7ffeb01c7ffa201c7
-ffa20301000003010000049100000491000004910000049100000491fff3
-0491fff3047300440473004404730044047300440473004404730044069d
-0000069d0000082d0000082d000007c9000007c900000460008804600088
-0460008804600088046000880460008804600088046000880682000007ae
-00000812000007ae0006063f0057063f0057063f0057063f0057063f0057
-063f0057063f0057063f0057065f0000065f000007ef000007ef0000078b
-0000078b0000078bffff078bffff04a0004804a000480391006203910062
-0473008b0473008b01c7ffe601c700680473004404730044046000880460
-0088063f0057063f005704a0004804a0004804a0004804a0004804a00048
-04a0004804a0004804a000480556fffd0556fffd06820013068200130682
-00130682001306820056068200560473008b0473008b0473008b0473008b
-0473008b0473008b0473008b0473008b068f0000068f0000081f0000081f
-0000081f0000081f0000081ffff3081ffff3063f0057063f0057063f0057
-063f0057063f0057063f0057063f0057063f0057065f0000065f000007ef
-000007ef0000078b0000078b0000078bffff078bffff04a0004804a00048
-04a0004804a0004804a0004804a0004804a000480556fffd0556fffd0556
-fffd0556fffd0556fffd02aa00e502aa00fd02aa00e502aa000602aa0006
-0473008b0473008b0473008b0473008b0473008b068200000682000006f3
-000006f3000005c700a402aa001302aa001302aa000601c7ffbb01c7ffab
-01c7ffca01c7ffca01c7ff9301c7ff930239001a0239fff5036500000365
-000002aa001302aa001302aa000604600088046000880460008804600088
-048d0083048d00830460008804600088055600060556000606e600000718
-0000061e000002aaffea02aaffea02aa0059063f0057063f0057063f0057
-063f0057063f005707650000069d000007270000065f000005fb006102aa
-00de02aa00e50473000d05c7006605c7006606aa008705c70024095000a1
-078d00190556001f04e30030080000290400003004c100660000ff530000
-ff530000ff530000ff5301c7001901c7ffa2042b00050556001105740046
-02cbffa3057a008702f0ffc8057f000a057f000a02aa008402aa008402aa
-00c902aa00c902aa00a002aa005902aaffaf02aa003a02aa0006023900b9
-02aa00a902aa00a902aa00a902aa00a9032e001e032e001e02aa003a0000
-ff730000ffa50000fed80000ff230000ff720000ff720000fee70000ffa5
-0000ff530000ff530000ff530556009e0473008703f8001905fb0019071d
-00440440001904000050046900870469001903eb008703ab003201c70088
-0361004104000088033600100580008c04780087047300440400001304de
-004404de004404de000d078d005003a800440473004404730044042b0084
-0455001f0455001f03aa00260460008804c6004405de004404c600440400
-001a05c700060400002803ab0032036b003f04db001f02eb00880400001a
-04550088042b008405b4007a04ab001803a00000054f0000035100320351
-ffd103980032034800320348003203f80032036e0032015600690284002d
-0366003202d000320415003203710032036f003204180032030f00320359
-0032039c003203760031036f003204fb000002fa003202fa003203040032
-04cc0032030500640305003202f9003202f90032028c0032028c00320304
-00320142006402b6006404950064030f00640305003202d5003203050032
-030500320306006401c20032030f00640342003204950064029200000320
-00000315006402920000030600320385003202bf00000142006401eb0064
-030f0064029200000315006402920000030900320385003202bf000005ed
-00460a660046061300460689ffba0541ffba01e9003c045a00110000ff0d
-0000ff350000fece0000feb70000fec90000ffcf0000ff4f0000ff9e0000
-feca02b3005f02b3005f03e9004a03e9004a039affba0327ffba039affba
-0327ffba05ad0069053d002d05fd009604dc005004e0003c05f6009b053f
-00280650002804ac00720000fe3b0000fe660000fe660473fffc02aa0053
-02d5ffce01a8ffba01a8ffba01a8ffba01a8ffba0658001509c500470400
-000008000000040000000800000002ab0000020000000155000004730000
-02390000019a000000ab00000000000005e5000305c7006606aa00980580
-008c0744008307180046071800480556fffd05c70066040000140473000a
-04e300300400004f0400002804a5001d000001020000ff420000febf0000
-ff3a0000ff53048d000a05c7005105c7006605c70051045500a102eb0088
-0000ff430000ff040000ffac02d200960000ff37021affba0250001e0000
-ff3a0000ff5b0000ff5f0000ff7e0000ff940000ff4a0000fe9c05b5003a
-05b5003a01f4ff9601f4ff9605b5003a05b5003a01f4ffba01f4ffba05b5
-003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba
-05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba0481003604350036043dffba
-043dffba0481003604350036043dffba043dffba02b3003202b3003202b3
-005f02b3005f03e9004a03e9004a0692003e0692003e043fffba043fffba
-045a002a039a00360435ffba0327ffba045a002a039a00360435ffba0327
-ffba045a002a039a00360435ffba0327ffba064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba067f0014077600140327
-ffba041effba067f0014077600140327ffba041effba067f001407760014
-0327ffba041effba02b4002302b400230327ffba0327ffba02b4002302b4
-00230327ffba0327ffba043500450435004501f4ffba01f4ffba04350045
-0435004501f4ffba01f4ffba043500450435004501f4ffba01f4ffba040d
-0047040d004701a8ffba01a8ffba03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0473ff93047300460239ffbf06aa
-ffd50473ffb70473ff9102aaffa402aaffa40400ffff0239ffb904000028
-04730089030b0064047400480649002401c7001901c700190473001e0460
-001e048c000a04730086047300460239001305b400420400008801c7fffc
-06aa00870473008b0473008702aafffb0400003f0318ffa20400001a0400
-000f040000280473004a04730048047300460473004b03ab004903ab0032
-0534005501c700880400001301c7ffa204730083045c004c0304006402d5
-003202c9003302fc0032028c003201d5003201d500000304003203110064
-01420019014200640142006401420019022a000001420064014200090233
-00640493006404930064030fffc9030f0064030e00640305003203000032
-02b800320142ffca01c20032030f001d031a00320306006402d400640292
-000002de003202de003202de003202f4003202ea00320000febc0000febc
-0000ff730000fea9023900b902fa003202f900320305003202a0000002f9
-00320639006d0556fffd0473000f05c7006602aa004104a0004804a00048
-04a0004804a0004804a0004804a0004804a0004804a0004801c7ff9b01c7
-ffab01c7ff9b01c7ffab01c7ff9b01c7ffbb01c7ff9b01c7ffbb04600088
-0460008804600088046000880460008804600088046000880460008801c7
-ffab01c7ffab01c7ffbb01c7ffbb04600088046000880460008804600088
-045a005304ce004a03a000130556001105c700290558000b055600a20473
-004b0400003301c7ffa205e600630473004805c7000002aa000f05560006
-0400002104000013040000500400001301c700830455fffd02eb00010556
-00090400000f055600090400000f04d5005303ab00490540001204ab0018
-0000fec60000fed40000fec60000fed40000fe5f0000fe5f0000ff720000
-ff730000fee7078b000a03eb004c040000130473000a01c700150473fff4
-0556001105c700a1047300190239ff8b05c700a404730087055600960400
-008804e30029040000280400003b049e00a403670088053000480000ff53
-0000ffbc0000fefe0000fefe0000fea40000fea401c70088000000000000
-002a0000002a0000002a0000002a000000d60000017e00000320000005a6
-0000074e000009380000097e000009fe00000aa400000b8400000bec0000
-0c6400000caa00000ce600000d5600000f1200000fee00001218000013f2
-000015520000170c000018e20000198e00001c2200001e5600001eb20000
-1f7000001ff200002062000020e8000021da000023da000025840000271c
-000028560000299e00002a6200002b1800002ca800002dae00002e920000
-2f7a000031b00000323a000035640000370e000038420000394800003b3c
-00003da800004052000041000000422400004398000045d6000048e20000
-4a8800004bc800004c3200004c9c00004d0000004d8800004dbc00004e38
-0000510a000052e80000549c000056500000580e0000596200005b520000
-5cf600005dea00005f020000619a00006296000064c60000668c0000684e
-00006a1200006ba800006cae000070560000717a00007318000075360000
-79a000007bc400007e1c00008004000081020000814e00008250000082f0
-0000833c00008370000083ac000083ee000084540000849a000084ce0000
-85040000853a0000858a000085cc0000861e00008656000086a8000086de
-0000871e000087600000879e000087e800008828000088560000888e0000
-88de00008914000089540000898e000089d200008a1c00008a5800008a88
-00008acc00008b0400008b9400008c1a00008e2800008fbc0000916c0000
-91b80000924c00009470000096c4000098b4000099a000009a2200009a8c
-00009baa00009d0600009f4e0000a0b00000a13e0000a1e80000a2ac0000
-a3f40000a59e0000a68c0000a7520000a7b60000a8240000a94e0000aa72
-0000ab020000ace40000af3e0000b2900000b3860000b42c0000b47c0000
-b5320000b6520000b7f00000b88a0000b94e0000ba0e0000ba760000bab2
-0000bb0a0000bb580000bd700000bfb60000bfee0000c0200000c14a0000
-c2760000c3240000c3c80000c46a0000c53c0000c5900000c5c60000c61e
-0000c7700000c7e20000c83c0000c9b40000cb200000cc000000cc320000
-ccce0000cdf20000d0680000d0a20000d0e60000d1220000d1840000d1c6
-0000d20c0000d2580000d28a0000d2de0000d31c0000d34c0000d38a0000
-d3d00000d4120000d4500000d4d20000d5400000d6260000d6620000d6e2
-0000d7160000d7b80000d8400000d8ac0000d90e0000d97a0000da660000
-db580000db8c0000dbc00000dbf00000dc340000dcac0000de260000e040
-0000e0720000e0ac0000e1a60000e3340000e36a0000e4ce0000e54a0000
-e62a0000e7200000e8b00000ea1a0000ec080000ed040000ed4a0000ed7e
-0000edc00000edfa0000ee4e0000ee960000eee00000ef100000ef400000
-f1280000f1660000f18e0000f1be0000f1f20000f2180000f23e0000f286
-0000f43c0000f5b60000f5dc0000f6020000f6460000f6760000f6a60000
-f6fc0000f7da0000f8ec0000f9300000f9660000f9c00000f9fe0000fa32
-0000fa620000fa9e0000fade0000fb1c0000fb580000fb9a0000fbd00000
-fc0c0000fc4c0000fc720000fc960000fce60000fe420000fe980000fecc
-0000ff1a0000ff660000ffa80000ffe0000100160001005e000101000001
-029c00010464000105e6000107d80001092a00010aae00010b9000010d2a
-00010d9400010dbc00010e5a000110dc0001111c0001115c0001119c0001
-11da000112380001129600011304000113240001140e000114ae000114e4
-000115320001157c000115c6000115e2000115fe0001161e0001163e0001
-165e0001167e000116a4000116ca000116f000011716000117460001176e
-00011796000117c2000117ee000118220001184c00011878000118ae0001
-18d8000119040001193a000119640001198e000119c2000119f200011a26
-00011a6a00011a9a00011ace00011b1000011b4400011b7600011bb80001
-1bec00011c1c00011c5e00011ca200011ce800011d4400011d6000011d7c
-00011d9800011db400011dd000011f3e000121ea0001245a000124760001
-2490000124ac000124c8000124e4000125000001255c0001259600012600
-000126ca0001276a00012840000128c000012948000129b800012a4e0001
-2aac00012af200012b5000012bb200012c6a00012d2800012d5400012db0
-00012df400012f60000130540001307e0001309a000130c6000130fe0001
-314a0001318a000131be000131ee0001321e0001324e00013292000132c2
-000132f2000133320001336200013392000133c200013402000134320001
-346200013492000134b8000136bc000136ec0001371c0001386c00013a22
-00013a5200013a8000013ab000013ade00013b0e00013b3c00013b600001
-3b8400013bb400013d2400013d5c00013d8c00013f1e00013f4c00013f7a
-00013fa800013fd00001412e000142c6000142fe0001433e0001437a0001
-43aa000143d8000143f4000144240001445400014544000146ac000146dc
-000147160001475600014786000147b6000147f80001481e000148440001
-4884000148c4000148f40001493400014a1e00014a9e00014b8200014bb2
-00014be200014c1200014c4200014c7e00014cb000014ce200014d120001
-4d4200014d8800014dba00014dea00014e2000014e9200014ec600015094
-000151960001532600015556000157a6000159380001599c00015a260001
-5a3600015ac400015cc200015dee00015f5a0001604a000161ce000163e8
-000166140001670600016716000167260001683e0001684e0001685e0001
-686e0001687e0001688e000169ac000169bc000169cc00016a4000016a50
-00016b2000016b3000016c4200016c5200016c6200016c7200016dd00001
-6fae00016ff0000170260001705c0001708c000170bc0001711000017138
-000172c20001740a0001755e000176c60001784a000178ae00017a400001
-7b5c00017b6c00017b7c00017d0200017d1200017e7800017fd200018106
-00018264000183d200018598000185d800018610000186460001866c0001
-869c000186c200018838000188680001899e000189ae000189be00018a00
-00018a1000018ba400018d5000018eda00018f0200018f320001908e0001
-909e000191d6000191e600019280000193e0000193f000019656000197e0
-000199480001997800019aee00019c2000019c3000019c4000019c500001
-9d2a00019d3a00019d4a00019d5a00019e5200019fcc00019fdc0001a104
-0001a2380001a38a0001a51e0001a63c0001a7c80001a8da0001a9100001
-ab460001abe60001abf60001ad8c0001af2e0001afb20001b1340001b144
-0001b3ac0001b52c0001b6ac0001b6dc0001b87c0001ba020001bbc60001
-bcf20001bd020001be320001be420001be520001bf120001bf220001c108
-0001c1180001c24e0001c35c0001c5080001c6be0001c8000001c9700001
-cab80001cb0a0001ccec0001ce680001cea60001d04c0001d0700001d1b0
-0001d1c00001d1d00001d2080001d2180001d3a40001d50c0001d6800001
-d6a40001d6d40001d8420001d8f40001d9b20001d9e00001db960001dc8e
-0001dd1c0001de420001def00001dfc40001e00e0001e0860001e1460001
-e16e0001e1b20001e2080001e2e40001e32e0001e3620001e38a0001e3b2
-0001e3e60001e42a0001e46e0001e4ac0001e5ea0001e6a20001e7c20001
-e8380001e9060001e9580001e9ea0001ea9a0001eb8e0001ebe20001ec78
-0001ed360001ee200001eed20001eff20001f0440001f0ee0001f2240001
-f2fc0001f3e20001f4e80001f5ce0001f6b00001f7a40001f8420001f948
-0001fa420001faba0001fb320001fba80001fbde0001fc3a0001fd020001
-fd8e0001fdc60001fe0c0001fe3c0001fea60001ff660001ff9a0001ffca
-0001fffe0002002e0002005e0002008e0002022e00020266000202a60002
-02de00020316000203b2000204ac000204dc00020580000205ae000205ee
-0002063e0002066e000206ba00020852000209b800020b1800020b5e0002
-0bb200020bea00020d5c00020d9200020e2400020e6200020e9000020ece
-00020ffe0002102600021162000211f20002129c0002131e000213da0002
-14f20002160000021634000216ba0002181600021898000218e2000219ec
-00021a3400021b3800021bb400021c0c00021c9000021d7a00021e900002
-1f8c0002203600022126000221f8000222e2000223ca0002247a000224fc
-0002275a00022784000227ae0002286600022890000229d200022ad80002
-2bc200022bec00022c1600022c4000022c6a00022c9400022e1400022e3e
-00022e6800022e9200022ebc00022ee600022f1000022f3a00022f640002
-2f9800022fc200022fec0002301600023190000231a0000232ba000232ca
-000232f40002331e00023348000233720002351c00023738000238660002
-3876000239f200023a0200023b4800023d1400023e1a00023f9a0002413a
-0002435e000244b80002469a000247de0002490c000249fa00024a240002
-4a4e00024a7800024aa200024acc00024af600024b2000024b4a00024b74
-00024b9e00024bc800024bf200024c1c00024c4600024c7000024eac0002
-50280002516c000253540002549c000254c6000254f00002552000025550
-000255a0000255f000025630000256a2000256f600025754000257aa0002
-57e00002582200025868000258b2000258e20002591a0002594a00025a82
-00025dc800025df200025e1c00025e4600025e7000025e9a00025ec40002
-5eee00025f1800025f4200025f6c00025f9600025fc000025fea00026014
-0002603e0002606800026092000260bc000260e6000261100002613a0002
-61640002618e000261b8000261e20002620c0002623600026260000262fe
-000263140002633e0002661e0002662e000267480002686a000269a80002
-6aea00026c9000026ca000026de200026f3200027122000272f60002740e
-0002741e000274a00002752e0002762e0002763e000276de000276ee0002
-78040002795600027a8600027a9600027b6400027b7400027cea00027cfa
-00027e0e00027e1e00027f52000280e8000281a4000281b4000282b20002
-840c00028498000284a8000285d20002875e0002881a0002882a000288c6
-000288d6000289a4000289b400028a8c00028a9c00028ba400028bb40002
-8d7a00028d8a00028ee200028ef20002915c0002916c0002936600029376
-000294e0000294f0000295e0000295f00002978800029798000298b60002
-98c600029a0600029a1600029a2600029a3600029bae00029bbe00029bce
-00029bde00029d3000029e7e00029f4c0002a0300002a1b00002a3320002
-a4320002a5460002a68a0002a69a0002a7880002a8620002a9fe0002aa0e
-0002ab2c0002ac320002ae300002ae400002ae500002ae600002afaa0002
-afba0002b0720002b0820002b1900002b1a00002b28c0002b29c0002b3ba
-0002b3ca0002b4680002b4780002b4880002b5760002b6ea0002b8160002
-b9100002b9200002b9300002b9400002bade0002bc980002bd660002bd76
-0002bfd60002c21c0002c4a20002c7060002c98a0002cbfc0002cdcc0002
-cf820002cfac0002cfd60002cfe60002cff60002d0200002d04a0002d074
-0002d0840002d0940002d0be0002d0e80002d0f80002d1080002d1320002
-d15c0002d1860002d1960002d1a60002d1b60002d1c60002d1d60002d1e6
-0002d2100002d2200002d2300002d25a0002d2840002d2ae0002d2d80002
-d3020002d32c0002d3560002d3800002d3aa0002d3d40002d3fe0002d428
-0002d4520002d47c0002d4a60002d4d00002d4fa0002d5240002d54e0002
-d5780002d5a20002d5cc0002d5f60002d6200002d64a0002d6740002d69e
-0002d6c80002d6f20002d71c0002d7460002d7700002d79a0002d7c40002
-d7ee0002d8180002d8420002d86c0002d8960002d8c00002d8ea0002d914
-0002d93e0002d9680002d9920002d9bc0002d9e60002da100002da3a0002
-da640002da8e0002dab80002dae20002db0c0002dbac0002dbf00002dc66
-0002dc900002dcba0002dce40002dd0e0002dd380002dd620002dd8c0002
-ddb60002dde00002de0a0002de340002de5e0002de880002deb20002dedc
-0002df060002df300002df5a0002df840002dfae0002dfd80002e0020002
-e02c0002e0560002e08a0002e0be0002e0f20002e2840002e4200002e5bc
-0002e7480002e78e0002e7d40002e8420002e89e0002e8f00002e9600002
-ea380002eb040002ebdc0002eca80002ed480002ee620002ef160002ef98
-0002eff20002f0320002f1500002f29a0002f4320002f48e0002f4ec0002
-f5480002f5a40002f6580002f70e0002f7ba0002f8660002f9120002f9ca
-0002fa820002fb3a0002fb4c0002fb5e0002fb700002fb820002fb940002
-fc020002fc700002fd280002fd3a0002fd4c0002fd5e0002fd6e0002fd80
-0002fd920002fda40002fdb60002fdc80002fdda0002fe880002ff340002
-ffe20003008e00030126000301600003018a000301b4000302080003025a
-000302d6000303200003039c000303f000030474000304c60003053c0003
-0594000305fa00030650000306aa0003072800030774000307d200030836
-00030884000308d20003092a000309720003099c000309ca000309f00003
-0a2400030a5400030a8400030ad600030b4400030b9a00030c0e00030c62
-00030cd600030d1c00030d8400030dca00030e2600030e5600030e900003
-0eb600030ee600030f0c00030f3200030f6400030f9400030fe60003104c
-000310a2000311080003115c000311ca0003120c0003126c000312ae0003
-12fa0003133400031370000313aa000313e60003141a0003144c0003147c
-000314ac000314d6000314fc00031526000315540003157e000315ca0003
-160e0003164400031680000316b4000316e200031720000317500003178a
-000317b4000317e2000318080003182e0003185a000318b6000318e60003
-1916000319460003197e000319b2000319e000031a1000031a4000031a70
-00031aa000031ad400031b2a00031b5e00031bbe00031bf200031c4a0003
-1c7e00031cda00031d7800031e4600031f660003202e000320be00032154
-000323400003253c000326b400032830000329da00032b8c00032c740003
-2daa00032ea200032fb4000330d20003320800033372000334e000033676
-000337f2000339020003391200033a3e00033b7a00033cbc00033e400003
-3f1a00033f9000034046000340ec0003425c000342940003430e000343d0
-0003448a000344f2000345f80003472e000347fa00034958000349d20003
-4a4c00034b1800034bd200034c8600034ce200034d3c00034d8400034df4
-00034e7000034eba00034ef400034f3a00034f7e00034fd0000350220003
-50a40003512600035168000351a8000351de000352140003524200035270
-000352a4000352d80003531a0003535c00035398000353d40003540e0003
-54480003547a000354ac000354de000355100003554a00035584000355c6
-000356080003564a0003568c000356da000357280003576a000357ac0003
-57ec0003582c00035866000358a0000358ec0003593800035976000359b6
-000359fc00035a4200035a7e00035ad400035b1000035b4c00035b8c0003
-5bcc00035c0800035c4400035c8400035cc400035d0800035d4c00035da0
-00035e2e00035e7000035eb200035f1a00035f8200035fb400035fe60003
-601e00036056000360ec00036182000361cc00036216000362520003628e
-000362e40003633a00036384000363ce000364260003647e000364be0003
-64fe000365360003656e000365b800036602000366400003667e000366c0
-0003670200036756000367aa000367f0000368360003687c000368c20003
-69180003696e000369c400036a1a00036a6600036ab200036afe00036b4a
-00036bbe00036c3200036ca600036d1a00036d5800036d9600036dd40003
-6e1200036e5000036e8e00036ed200036f1600036f6200036fae0003700e
-0003705a00037098000370e6000371f60003724600037296000372ce0003
-73060003735c000373b2000374260003748a000374cc0003750e00037564
-000375b2000375fe0003764a0003768a000376ca000377120003775a0003
-77c6000378200003785800037890000378d000037910000379e000037adc
-00037b9c00037c8a00037ce000037d3600037d8800037ddc00037e400003
-7ea400037efa00037f5000037fc60003803c0003807e000380c000038102
-0003814400038186000381c80003821e00038274000382c60003831a0003
-83a200038424000384c400038566000385a4000385e2000386200003865c
-0003869a000386d80003871600038752000388360003892200038a380003
-8b5400038c1e00038ce800038de200038edc00038fda000390d8000391f6
-000393140003943a000395600003966200039764000397f6000398880003
-98c6000399040003995e000399b8000399f000039a2800039b3800039b48
-00039b9000039bd800039c3000039c8800039cba00039cec00039d2e0003
-9d7000039daa00039de400039e2800039e6c00039ee400039f5e00039fee
-0003a0320003a0720003a0f40003a1760003a2ce0003a2de0003a32c0003
-a37a0003a3b60003a3f20003a4380003a47e0003a4cc0003a51a0003a56a
-0003a5ba0003a6160003a6720003a7e80003a9500003a9880003a9c20003
-aa0e0003aa5a0003aaac0003aafe0003ab500003aba60003abe20003ac1e
-0003ac740003acc80003ae000003aea00003aeee0003af2e0003af680003
-b0fe0003b3820003b4460003b5dc0003b73a0003b8080003b9ae0003bc02
-0003be3a0003be800003beb20003bf5c0003c0800003c0a40003c13e0003
-c24a0003c35a0003c46a0003c5780003c6fe0003c7300003c7d20003c7fa
-0003c85c0003c8be0003c9200003c9820003c9c00003c9fe0003ca380003
-ca720003ca9e0003caea0003cb240003cb5e0003ccba0003ce0e0003ce1e
-0003cedc0003d0120003d0700003d1880003d3160003d3bc0003d5020003
-d5400003d57e0003d5bc0003d6100003d6380003d6920003d6f60003d73e
-0003d7a00003d8000003d8720003d8ee0003d96a0003d9ec0003da780003
-db040003db8e0003dc0e0003dc480003dc840003dde80003deb20003dee2
-0003df120003e04a0003e19a0003e1aa0003e2980003e36c0003e4640003
-e55a0003e6dc0003e8360003e8460003e95e0003ea0a0003eb4c0003eca2
-0003ecfe0003ee5c0003eeea0003f0900003f2020003f3160003f34e0003
-f3b20003f5620003f6cc0003f72e0003f8960003f99c0003fa520003fafe
-0003fc260003fd140003fdf40003ff34000400600004017a000402ea0004
-046400040474000405540004064a000406fa000407f6000408a2000409ac
-00040a9800040bc200040ce600040dea00040f1800041056000411c20004
-12f80004148c000416340004172c000418400004197200041a6400041a9c
-00041af200041ba000041bb000041c1200041c6e00041cd400041d200004
-1d6000041d9800041dc400041df200041e2c00041f6200041f960004201a
-000420d00004210000042184000421b4000421ec00042384000425100004
-255a00042594000425ea000426360004265c00042682000426c400042706
-0004274800042778000427b0000427e60004281c0004285e0004288e0004
-28be000429b400042ab800042aec00042b2400042b6a00042b9e00042bce
-00042c0600042c3a00042c6e00042c9e00042cce00042d0400042d3a0004
-2d6a00042d9a00042dce00042e0200042e3200042e6200042e9c00042ed0
-00042f0200042f3400042f6800042f9c00042fcc00042ffc0004302a0004
-305800043166000432d2000434060004353a0004356a000435a40004363e
-000437a800043904000439c800043adc00043b0c00043b4000043c380004
-3de800043e4000043eb800043ff400044032000440a4000440d400044104
-0004413e000441c6000441f600044226000443b6000445000004460c0004
-471a000448460004499c00044af800044c5800044d9200044f0400045064
-000450740004522a00045352000453ec0004557400045584000456800004
-58060004595e00045a1000045ae000045bec00045c9600045cce00045cde
-00045d8e00045e3400045eb000046000000460f4000461ea000462f60004
-63ce000464a80004653c0004664e000467de000468fc000469f200046a9c
-00046b4600046c1000046cb800046d8e00046e0a00046e6600046fc80004
-70fc000472980004735a0004745a00047532000476700004771c000477e6
-000478d6000479fc00047ad800047bde00047d1600047e0600047ea40004
-7f960004810600048250000484bc0004858e000486420004871000048804
-000489420004895200048a8600048b9800048ba800048cb400048de40004
-8e3800048fac000490d4000491e80004939a000495ae00049842000499fc
-00049b2800049d0800049eca0004a05c0004a1280004a2c40004a33a0004
-a3e80004a4c40004a5500004a5f20004a6940004a7780004a8b00004ab0c
-0004ac540004ac640004ac740004acd60004ad340004ad960004ae340004
-aecc0004afd00004b0be0004b0ce0004b0de0004b1780004b2120004b24e
-0004b2ca0004b33e0004b3940004b3c80004b44e0004b4da0004b5520004
-b5b00004b64a0004b6dc0004b75c0004b7de0004b8720004b8a60004b908
-0004b9ba0004bb800004bbb80004bd940004bea80004beb80004beee0004
-bf320004bf760004bfba0004bff00004c0220004c0640004c1000004c156
-0004c1fc0004c2740004c2fa0004c36a0004c3cc0004c4520004c4b20004
-c51c0004c5900004c6000004c65e0004c7040004c79c0004c8080004c898
-0004c8f60004c9640004ca0c0004cab80004cb4e0004cbb80004cc3a0004
-cc9e0004cd4a0004ce020004ceae0004cf3c0004cf980004d0040004d05a
-0004d0dc0004d15a0004d1e00004d26c0004d2c60004d3320004d3a20004
-d4120004d4820004d5060004d5960004d5fc0004d6760004d6f20004d76a
-0004d8100004d8ac0004d93c0004d99a0004da380004dab40004db460004
-dbe80004dc920004dd2a0004dd860004dddc0004de440004deea0004df92
-0004e05c0004e1020004e1640004e1bc0004e21c0004e2aa0004e3300004
-e3be0004e41e0004e4820004e4ec0004e5540004e5bc0004e63a0004e6c2
-0004e7560004e7c20004e82a0004e88e0004e9360004e9f00004ea9e0004
-eb2c0004eb8a0004ebf60004ec660004ed0c0004edb60004ee780004ef1a
-0004ef7e0004f00e0004f0800004f1100004f18e0004f20a0004f2760004
-f3040004f3600004f3be0004f4440004f4c00004f5280004f58c0004f5e0
-0004f64e0004f6b60004f7340004f7aa0004f8240004f8a40004f9000004
-f9660004f9ca0004fa6a0004fb0c0004fbc20004fc720004fcce0004fd46
-0004fda40004fe2e0004fec60004ff560004ffbc0005001a000500a80005
-011a000501ae00050246000502b6000503260005039e000503fc0005045c
-000504d60005053000050590000505ea00050646000506ae0005073c0005
-0772000507aa0005083600050860000508a20005093600050a2400050ab4
-00050aea00050b3a00050bac00050c5800050cea00050d4200050d9c0005
-0df400050e4e00050ed200050f5800050ffc000510a4000510e200051152
-000511e60005127e00051314000513be000513f000051440000514940005
-14da0005157e000516080005168e000516ee000517320005178000051820
-000518b000051950000519f600051a9c00051b6000051b9200051bbc0005
-1c4200051cf200051d2400051d4c00051e1a00051e7800051f1200051f60
-00051fc60005206e000520dc00052142000521ce00052240000522b60005
-236a000523c40005243400052470000524c200052548000525a80005264c
-0005272c00052854000529e400052a4000052a9600052dbc00052e560005
-2eb200052efa00053068000531ba000532000005330e000533a6000534b4
-000535be0005366000053748000537da000538760005396800053a680005
-3ae400053b6a00053bb200053d2400053e8000053f6400053fb400053fe8
-000540d6000541fe00054398000544c8000545de000547120005482e0005
-489c0005493000054a7000054b2600054c9000054dc000054ef20005501e
-000550ca0005519000055262000553bc0005553c0005566c000557880005
-594200055a9400055b8000055c5c00055d1e00055e8800055fd800055fe8
-00055ff800056008000560c000056176000561b2000561e8000562200005
-6256000563e2000565f6000566e0000567f80005697000056ade00056bc8
-00056cfa00056e4200056fc800057166000572ba000574a80005766e0005
-78a400057af200057bda00057cb600057dfe00057f800005806800058182
-000581c40005820e0005842a000586420005878e0005890400058b620005
-8d6400058de800058e1800058e6400058f2c00058ffc0005919000059218
-00059280000592c0000592fe000594b0000596e000059816000599f80005
-9ad400059bee00059d9a00059fa60005a0a80005a1940005a3860005a58e
-0005a6fa0005a87e0005a9de0005ab4c0005abda0005ac6a0005ad840005
-ae900005b0520005b1be0005b3ae0005b5780005b60c0005b6a80005b73e
-0005b7c60005b8ac0005b9840005bb1e0005bcb00005bcd60005bcfc0005
-bd0c0005bd3c0005bd6c0005bee60005c0880005c1320005c2140005c2d4
-0005c37e0005c4180005c4fa0005c5b80005c6940005c84a0005c9840005
-ca100005ca400005ca700005caa40005cad80005cae80005caf80005cb28
-0005cb580005cb8c0005cbc00005cbf40005cc280005cc5c0005cc900005
-ce0a0005ce1a0005ce4a0005ce7a0005ceb20005cee60005cf1a0005cf4e
-0005cf820005cfb60005cfea0005d0220005d0580005d0880005d0c80005
-d1000005d1480005d18e0005d1c20005d1f60005d2300005d2680005d308
-0005d3180005d46a0005d6320005d7d80005d9820005dace0005dbe40005
-dcf20005de080005df020005dfea0005e10c0005e2080005e2e00005e3d0
-0005e48c0005e53e0005e6080005e67a0005e7200005e7b00005e8140005
-e9220005e9880005ea360005eb2c0005eb940005ebfc0005ecac0005ee86
-0005ef8a0005f00a0005f0480005f0f40005f1820005f26a0005f3020005
-f3680005f4660005f5280005f5e20005f6200005f6b00005f7b20005f846
-0005f88a0005f9a80005fad20005fcb40005fe760005ffac000600da0006
-01da000602020006022a0006026000060292000602be000602e60006030e
-0006033c0006039a000604080006044000060478000604a8000604ce0006
-0502000605380006055e00060584000605b2000605e00006060c00060682
-000606aa0006070c00060732000607580006077e000607a4000607d40006
-0804000608340006086e0006089e000608d400060904000609360006095c
-00060982000609b6000609ec00060a1c00060a4c00060a7200060a980006
-0abe00060aec00060b2000060ba600060bea00060c2400060c5800060c9c
-00060cd600060d1000060d3600060d6000060dac00060dee00060e140006
-0e4200060e6800060e8e00060ece00060f0000060f3000060f6000060f86
-00060fac00060fdc0006100c00061032000610580006107e000610a40006
-10ca000610f000061118000611a0000611ca0006123e00061266000612dc
-000613040006136600061398000613ca000613fa00061432000614640006
-1492000614cc000614f40006155400061596000615c6000615f200061622
-000616520006167a000616a2000616ca0006172c00061754000617b20006
-17f60006183a0006186a000618a0000618c6000618ee000619140006193c
-000619620006198a000619b2000619dc00061a0200061a2800061a4e0006
-1a8000061aa800061b2e00061b5800061bc200061bf200061c2200061c48
-00061c6e00061cc600061cf600061d3200061d5c00061d8c00061dbc0006
-1df000061e2400061e5400061e9400061ece00061f1600061f3c00061f62
-00061f8800061fae00061fd4000620140006205400062090000620c00006
-20f0000621200006215000062188000621c000062200000622400006227a
-000622b4000622f00006232e00062378000623c2000624080006244e0006
-2490000624d20006250200062532000625660006259a000625d40006260e
-0006265a000626a6000626fe00062756000627ae0006280c0006283c0006
-286c000628a2000628d80006290e0006294a0006297e000629b200062a06
-00062a5a00062aae00062b0200062b5600062baa00062c0200062c5a0006
-2c8800062cb600062ce800062d1a00062d6000062da600062dd800062e0a
-00062e5c00062eb400062ef800062f3c00062f8000062fc4000630180006
-306c0006309c000630cc000631020006313800063176000631bc00063210
-0006325a000632ac000632fe0006335e000633be000633ee000634200006
-345a00063494000634e60006353a00063584000635cc0006360e00063678
-000636c6000637120006374400063776000637aa000637de000638140006
-384a00063888000638be000638f00006392c00063982000639d800063a36
-00063a9400063aea00063b4000063b7400063ba400063be800063c1e0006
-3c4e00063c9200063cd000063d0800063d4000063d7600063db200063de2
-00063e1e00063e5e00063ea400063eee00063f3a00063f8600063fdc0006
-403200064080000640ce0006411c0006416c000641c8000642240006427c
-000642d4000643280006437c000643be0006440000064448000644900006
-44d8000645260006456a000645ae000646140006467a000646e000064746
-000647ac000648120006487c000648e60006492e00064976000649be0006
-4a0600064a5200064a9e00064af200064b3e00064b8200064bd000064c38
-00064ca000064d1000064d8000064de800064e5000064e9000064ece0006
-4f1800064f4200064f8800064fc00006500e0006503e0006506e000650aa
-000650de000651040006515800065196000651ea000652d0000653f80006
-543a00065460000654b6000654e60006552800065570000655be00065608
-000656580006567e000657660006584a0006599c000659ca000659f80006
-5a8c00065b1200065b4000065bca00065bfa00065c2a00065c7800065cc6
-00065daa00065e8600065fca00065ffa0006602a000660c0000661480006
-6178000661a8000661d80006626800066298000662c80006631a00066362
-000663b80006644e000664e60006655a000665ac000665d60006662c0006
-6660000666aa000666e20006673200066770000667bc000667e20006685e
-000668b0000669c200066bcc00066d8000066f0200067074000673160006
-75e6000677a6000678ec00067b4600067c8800067e9e00067ef000067f40
-00067f9600067fec0006804e000680d600068324000684b6000686c20006
-87de0006899200068b1400068bd400068cb600068d1e00068d8000068df6
-00068e5e00068f0a00068f7a0006900a0006911e000691e20006922e0006
-92c40006937000069414000694be000695080006954a000695c000069628
-000696b800069766000697d0000698340006989a00069954000699ea0006
-9a4800069a7200069a9c00069aac00069abc00069b7e00069c8200069e8c
-00069fe200069ff20006a0a20006a1860006a1e60006a1f60006a2520006
-a2b00006a3d00006a4be0006a4ce0006a4de0006a4ee0006a4fe0006a5e4
-0006a6e40006a8bc0006aa780006ab7e0006abf80006ac720006ad240006
-ad340006ae420006ae520006ae620006af240006b0580006b1440006b154
-0006b1640006b1740006b2da0006b4460006b5720006b5820006b5920006
-b5a20006b5b20006b6940006b6a40006b8060006b9100006ba0e0006bb46
-0006bc180006bc960006bd140006be340006beb00006befc0006bf880006
-c09c0006c0f00006c2320006c2f20006c3be0006c4b40006c5be0006c670
-0006c7d60006c83c0006c9000006cb020006cc900006ce0e0006cf3e0006
-d1f00006d3320006d4600006d5d80006d7500006d8d00006da5e0006dc10
-0006dc7e0006dde20006df1a0006e01e0006e1540006e2860006e3560006
-e4260006e5820006e65c0006e6fc0006e8000006e92a0006ea280006eba8
-0006ed120006ee500006efc80006f1140006f1f60006f25e0006f3000006
-f3a00006f49e0006f6060006f7400006f8d40006fa1e0006fb020006fb60
-0006fc660006fcfc0006fdbe0006fe640006fea400070050000701220007
-01e800070310000704b0000705bc00070614000707ac0007083a0007084c
-0007087c000708ac000708e40007091c000709520007098e000709c40007
-0a0000070b6e00070bb800070c5200070cea00070d6400070de800070e4e
-00070efa00070f46000710660007111c000711f20007122a000712680007
-12dc000713d6000714f4000715f6000716380007167a000716e8000716f8
-000717080007171800071728000717380007174800071758000717680007
-17780007178800071798000717980007191c0007192c000719ec00071ab2
-00071be800071dde00071fe0000721dc00072412000726120007267e0007
-27900007292200072a7a00072b2c00072b7000072c0e00072d3e00072d8e
-00072e2400072f6000072f70000731260007325a000732aa000733000007
-33c20007340600073448000734ce0007352c0007361e000736ac000736e2
-0007375c000737d4000738240007393000073a2600073ad000073afa0007
-3b2400073b4e00073b7800073bb800073bf800073c3000073c6800073cb2
-00073cfc00073d3c00073d7c00073dc600073e1000073e5000073e900007
-3eea00073f4400073f7e00073fb800073ffc0007404000074084000740c8
-0007411c00074170000741bc00074208000742460007428a000742da0007
-432a00074384000743e20007440c00074436000744d00007456a000745ae
-000745f2000747080007471800074760000747a8000747fa0007484c0007
-48b60007490a00074956000749b400074a3e00074aa200074ae600074b30
-00074b9800074be200074c2200074c6a00074ca600074ce200074d1e0007
-4d5800074d9a00074ddc00074e1c00074e5c00074ea600074ef000074f46
-00074f9e00074fec0007503a0007507c000750ca0007510c000751560007
-5198000751dc0007523800075294000752e00007532c00075376000753c0
-000753fe0007543c000754ba0007553800075572000755ac000756460007
-56e0000757b400075888000758e400075940000759b400075a2800075b86
-00075b9600075c8000075c9000075cc600075cfc00075d3600075d700007
-5dac00075de800075e2e00075e7400075fda00076190000762dc0007649a
-00076610000767b8000768e8000769ee00076c0c00076d5000076ee60007
-706e000770ec0007723000077438000774cc00077560000776b4000777de
-0007795800077a9800077c0400077cf200077ebc00078050000780d20007
-8204000782ee0007845600078538000786ee000787e00007894200078a7e
-00078b7200078d3600078ebe00079062000791c600079362000795200007
-96a600079742000798b6000799a800079a9000079c1000079d6200079e82
-0007a01a0007a1f00007a37e0007a4280007a4de0007a6900007a7340007
-a7c20007a80e0007a85a0007a8d20007a9b00007aa2a0007aacc0007ab20
-0007ac840007adb00007aec20007afc40007b08c0007b2000007b3400007
-b5660007b6100007b73a0007b83e0007b9de0007baca0007bbc40007bcc2
-0007bda80007bec20007c07c0007c22a0007c3980007c4100007c4840007
-c5a20007c6260007c7280007c8b40007ca2c0007cb620007cc6c0007cde2
-0007cf5a0007d14c0007d33a0007d5000007d5740007d6240007d6da0007
-d78a0007d8480007d9420007da460007db400007dc4c0007dcd40007dd62
-0007ddea0007de7e0007df5a0007e0500007e1340007e22a0007e2be0007
-e37a0007e40e0007e4cc0007e5bc0007e6c40007e7c20007e8d60007e9f8
-0007eb0c0007ec4c0007ed860007eea80007efbc0007f1000007f2540007
-f4680007f61a0007f6ce0007f7ea0007f8c00007f9de0007fabc0007fc50
-0007fd0a0007fda60007fe980007ff800008006c000800ea000801e40008
-03220008044e00080482000804c6000804d600080576000806180008070e
-000807fa000808d4000809ac00080b0a00080c6a00080d0800080d9e0008
-0ddc00080e1c00080e5a00080e9a00080ef400080f4c00080fa60008100a
-0008109600081292000812e20008140e0008149400081514000815ee0008
-16c2000817c6000819b200081aca00081b3a00081bca00081c8c00081d5e
-00081dca00081e4800081f9c00081fe2000820280008210c000821480008
-21a6000821e4000822160008225a0008229c000822cc000100000d3500f2
-003c009d000700020010002f005600000468041d0005000200>
-<0000003a02be0000000300000000006a00000000000300000001000a006a
-0000000300000002000e00740000000300000003005e0082000000030000
-0004000a00e00000000300000005001800ea0000000300000006000e0102
-000000030000000700ba01100000000300000008003001ca000000030000
-0009008a01fa000000030000000d02aa028400010000000000000035052e
-000100000000000100050563000100000000000200070568000100000000
-0003002f056f00010000000000040005059e0001000000000005000c05a3
-0001000000000006000705af0001000000000007005d05b6000100000000
-00080018061300010000000000090045062b000100000000000d01550670
-0003000104030002000c07c50003000104050002001007d1000300010406
-0002000c07e10003000104070002001007ed0003000104080002001007fd
-0003000104090000006a080d0003000104090001000a0877000300010409
-0002000e08810003000104090003005e088f0003000104090004000a08ed
-0003000104090005001808f70003000104090006000e090f000300010409
-000700ba091d0003000104090008003009d70003000104090009008a0a07
-000300010409000d02aa0a9100030001040a0002000c0d3b00030001040b
-000200100d4700030001040c0002000c0d5700030001040e0002000c0d63
-0003000104100002000e0d6f000300010413000200120d7d000300010414
-0002000c0d8f000300010415000200100d9b0003000104160002000c0dab
-0003000104190002000e0db700030001041b000200100dc500030001041d
-0002000c0dd500030001041f0002000c0de10003000104240002000e0ded
-00030001042a0002000e0dfb00030001042d0002000e0e0900030001080a
-0002000c0e170003000108160002000c0e23000300010c0a0002000c0e2f
-000300010c0c0002000c0e3b00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0052006500670075006c00610072004d006f006e006f
-0074007900700065003a0041007200690061006c00200052006500670075
-006c00610072003a00560065007200730069006f006e00200035002e0030
-003100200028004d006900630072006f0073006f00660074002900410072
-00690061006c00560065007200730069006f006e00200035002e00300031
-0041007200690061006c004d00540041007200690061006c002000690073
-00200061002000740072006100640065006d00610072006b0020006f0066
-00200054006800650020004d006f006e006f007400790070006500200043
-006f00720070006f0072006100740069006f006e00200069006e00200074
-0068006500200055006e0069007400650064002000530074006100740065
-007300200061006e0064002f006f00720020006f00740068006500720020
-0063006f0075006e00740072006900650073002e0054006800650020004d
-006f006e006f007400790070006500200043006f00720070006f00720061
-00740069006f006e004d006f006e006f0074007900700065002000540079
-00700065002000440072006100770069006e00670020004f006600660069
-006300650020002d00200052006f00620069006e0020004e006900630068
-006f006c00610073002c0020005000610074007200690063006900610020
-005300610075006e0064006500720073002000310039003800320059006f
-00750020006d006100790020007500730065002000740068006900730020
-0066006f006e007400200074006f00200064006900730070006c00610079
-00200061006e00640020007000720069006e007400200063006f006e0074
-0065006e00740020006100730020007000650072006d0069007400740065
-006400200062007900200074006800650020006c006900630065006e0073
-00650020007400650072006d007300200066006f00720020007400680065
-002000700072006f006400750063007400200069006e0020007700680069
-006300680020007400680069007300200066006f006e0074002000690073
-00200069006e0063006c0075006400650064002e00200059006f00750020
-006d006100790020006f006e006c0079002000280069002900200065006d
-0062006500640020007400680069007300200066006f006e007400200069
-006e00200063006f006e00740065006e0074002000610073002000700065
-0072006d0069007400740065006400200062007900200074006800650020
-0065006d00620065006400640069006e0067002000720065007300740072
-0069006300740069006f006e007300200069006e0063006c007500640065
-006400200069006e0020007400680069007300200066006f006e0074003b
-00200061006e006400200028006900690029002000740065006d0070006f
-0072006100720069006c007900200064006f0077006e006c006f00610064
-0020007400680069007300200066006f006e007400200074006f00200061
-0020007000720069006e0074006500720020006f00720020006f00740068
-006500720020006f00750074007000750074002000640065007600690063
-006500200074006f002000680065006c00700020007000720069006e0074
-00200063006f006e00740065006e0074002ea9203230303620546865204d
-6f6e6f7479706520436f72706f726174696f6e2e20416c6c205269676874
-732052657365727665642e417269616c526567756c61724d6f6e6f747970
-653a417269616c20526567756c61723a56657273696f6e20352e30312028
-4d6963726f736f667429417269616c56657273696f6e20352e3031417269
-616c4d54417269616c20697320612074726164656d61726b206f66205468
-65204d6f6e6f7479706520436f72706f726174696f6e20696e2074686520
-556e697465642053746174657320616e642f6f72206f7468657220636f75
-6e74726965732e546865204d6f6e6f7479706520436f72706f726174696f
-6e4d6f6e6f7479706520547970652044726177696e67204f666669636520
-2d20526f62696e204e6963686f6c61732c20506174726963696120536175
-6e646572732031393832596f75206d617920757365207468697320666f6e
-7420746f20646973706c617920616e64207072696e7420636f6e74656e74
-206173207065726d697474656420627920746865206c6963656e73652074
-65726d7320666f72207468652070726f6475637420696e20776869636820
-7468697320666f6e7420697320696e636c756465642e20596f75206d6179
-206f6e6c792028692920656d626564207468697320666f6e7420696e2063
-6f6e74656e74206173207065726d69747465642062792074686520656d62
-656464696e67207265737472696374696f6e7320696e636c756465642069
-6e207468697320666f6e743b20616e6420286969292074656d706f726172
-696c7920646f776e6c6f6164207468697320666f6e7420746f2061207072
-696e746572206f72206f74686572206f7574707574206465766963652074
-6f2068656c70207072696e7420636f6e74656e742e004e006f0072006d00
-61006c006f00620079010d0065006a006e00e9006e006f0072006d006100
-6c005300740061006e0064006100720064039a03b103bd03bf03bd03b903
-ba03ac00a90020003200300030003600200054006800650020004d006f00
-6e006f007400790070006500200043006f00720070006f00720061007400
-69006f006e002e00200041006c006c002000520069006700680074007300
-2000520065007300650072007600650064002e0041007200690061006c00
-52006500670075006c00610072004d006f006e006f007400790070006500
-3a0041007200690061006c00200052006500670075006c00610072003a00
-560065007200730069006f006e00200035002e0030003100200028004d00
-6900630072006f0073006f0066007400290041007200690061006c005600
-65007200730069006f006e00200035002e00300031004100720069006100
-6c004d00540041007200690061006c002000690073002000610020007400
-72006100640065006d00610072006b0020006f0066002000540068006500
-20004d006f006e006f007400790070006500200043006f00720070006f00
-72006100740069006f006e00200069006e00200074006800650020005500
-6e0069007400650064002000530074006100740065007300200061006e00
-64002f006f00720020006f007400680065007200200063006f0075006e00
-740072006900650073002e0054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-4d006f006e006f0074007900700065002000540079007000650020004400
-72006100770069006e00670020004f006600660069006300650020002d00
-200052006f00620069006e0020004e006900630068006f006c0061007300
-2c0020005000610074007200690063006900610020005300610075006e00
-64006500720073002000310039003800320059006f00750020006d006100
-7900200075007300650020007400680069007300200066006f006e007400
-200074006f00200064006900730070006c0061007900200061006e006400
-20007000720069006e007400200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-200074006800650020006c006900630065006e0073006500200074006500
-72006d007300200066006f00720020007400680065002000700072006f00
-6400750063007400200069006e0020007700680069006300680020007400
-680069007300200066006f006e007400200069007300200069006e006300
-6c0075006400650064002e00200059006f00750020006d00610079002000
-6f006e006c0079002000280069002900200065006d006200650064002000
-7400680069007300200066006f006e007400200069006e00200063006f00
-6e00740065006e00740020006100730020007000650072006d0069007400
-7400650064002000620079002000740068006500200065006d0062006500
-6400640069006e0067002000720065007300740072006900630074006900
-6f006e007300200069006e0063006c007500640065006400200069006e00
-20007400680069007300200066006f006e0074003b00200061006e006400
-200028006900690029002000740065006d0070006f007200610072006900
-6c007900200064006f0077006e006c006f00610064002000740068006900
-7300200066006f006e007400200074006f00200061002000700072006900
-6e0074006500720020006f00720020006f00740068006500720020006f00
-750074007000750074002000640065007600690063006500200074006f00
-2000680065006c00700020007000720069006e007400200063006f006e00
-740065006e0074002e004e006f0072006d0061006c004e006f0072006d00
-610061006c0069004e006f0072006d0061006c004e006f0072006d00e100
-6c004e006f0072006d0061006c0065005300740061006e00640061006100
-720064004e006f0072006d0061006c004e006f0072006d0061006c006e00
-79004e006f0072006d0061006c041e0431044b0447043d044b0439004e00
-6f0072006d00e1006c006e0065004e006f0072006d0061006c004e006f00
-72006d0061006c004e0061007600610064006e006f0074006801b001a103
-00006e00670041007200720075006e00740061004e006f0072006d006100
-6c004e006f0072006d0061006c004e006f0072006d0061006c004e006f00
-72006d0061006c000000b900540328b326181fd0bc032900e00329000203
-29b22b1d1fb90327031db23b1f40b80323b31215320f412d03200001002f
-0320000100200320006f032000af032000bf03200004005f031e00010010
-031e007f031e0080031e00af031e00bf031e00d0031e00060000031e0010
-031e0020031e006f031e009f031e00e0031e0006031d031cb2201f104127
-0319007f03190002000f031700ef031700ff03170003001f0317002f0317
-004f0317005f0317008f0317009f03170006000f0317005f0317006f0317
-007f031700bf031700f00317000600400317b2923340b80317b28b3340b8
-0317b36a6c3240b80317b2613340b80317b35c5d3240b80317b357593240
-b80317b34d513240b80317b344493240b80317b23a3340b80317b3313432
-40b80317b32e423240b80317b3272c3240b80317b312253280b80317b30a
-0d32c04116031600d00316000200700316000102c4000f0101001f00a003
-1500b0031500020306000f0101001f00400312b32426329fbf0304000103
-0203010064001fffc00301b20d1132410a02ff02ef0012001f02ee02ed00
-64001fffc002edb30e11329f414a02e200af02e200bf02e2000302e202e2
-02e102e1007f02e00001001002e0003f02e0009f02e000bf02e000cf02e0
-00ef02e0000602e002e002df02df02de02de000f02dd002f02dd003f02dd
-005f02dd009f02dd00bf02dd00ef02dd000702dd02dd001002dc00010000
-02dc0001001002dc003f02dc000202dc02dc001002db000102db02db000f
-02da000102da02daffc002d3b2373932b9ffc002d3b22b2f32b9ffc002d3
-b21f2532b9ffc002d3b2171b32b9ffc002d3b2121632b802d2b2f9291fb9
-0326031cb23b1f40bb0322003e00330322b225311fb80318b23c691fb802
-e3b3202b1fa0413002d400b002d40002000002d4001002d4002002d40050
-02d4006002d4007002d40006006002d6007002d6008002d6009002d600a0
-02d600b002d60006000002d6001002d6002002ca002002cc002002d60030
-02d6004002d6005002d6000802d0b2202b1fb802cfb226421f411602ce02
-c70017001f02cd02c80017001f02cc02c60017001f02cb02c50017001f02
-c902c5001e001f02ca02c6b21e1f00410b02c6000002c7001002c6001002
-c7002f02c5000502c1b324121fff411102bf0001001f02bf002f02bf003f
-02bf004f02bf005f02bf008f02bf000602bf0222b2641f12410b02bb00ca
-0800001f02b200e90800001f02a600a20800406a1f402643493240204349
-3240263a3d3240203a3d329f209f26024026969932402096993240268e92
-3240208e92324026848c324020848c3240267a813240207a813240266c76
-3240206c76324026646a324020646a3240265a5f3240205a5f3240264f54
-3240204f5432b8029eb724271f374f6b0120410f02770030027700400277
-00500277000402770277027700f90400001f029bb22a2a1fb8029a402b29
-2a1f80ba0180bc0180520180a201806501807e01808101803c01805e0180
-2b01801c01801e0180400180bb0138000100800140b40180400180bb0138
-00010080013940180180ca0180ad01807301802601802501802401802001
-3740b80221b2493340b80221b2453340b80221b341423240b80221b33d3e
-320f410f0221003f0221007f0221000300bf022100cf022100ff02210003
-00400221b320223240b80221b3191e3240b80222b32a3f3240b80221b32e
-3a326f414802c3007f02c3008f02c300df02c30004002f02c3006002c300
-cf02c30003000f02c3003f02c3005f02c300c002c300ef02c300ff02c300
-0600df02220001008f02220001000f0222002f0222003f0222005f022200
-7f022200ef0222000600bf022100ef02210002006f0221007f022100af02
-210003002f0221003f0221004f0221000302c302c3022202220221022140
-1d101c102b1048038f1c010f1e014f1eff1e023700161600000012110811
-b8010db6f70df8f70d00094109028e028f001d001f0290028f001d001f02
-8fb2f91d1fb80198b226bb1f41150197001e0401001f013900260125001f
-013800730401001f0135001c0801001f0134001c02ab001f0132b21c561f
-b8010fb2262c1fba010e001e0401b61ff91ce41fe91cb80201b61fe81cbb
-1fd720b80401b21fd51cb802abb61fd41c891fc92fb80801b21fbc26b801
-01b21fba20b80201b61fb91c381fadcab80401b21f8126b8019ab21f7e26
-b8019ab61f7d1c471f6b1cb80401b21f6526b8019ab21f5e73b80401400f
-1f52265a1f481c891f441c621f4073b80801b61f3f1c5e1f3c26b8019ab2
-1f351cb80401b61f301cbb1f2b1cb80401b61f2a1c561f291cb80101b21f
-231eb80401b21f5537b80168402c07960758074f07360732072c0721071f
-071d071b071408120810080e080c080a080808060804080208000814b8ff
-e0402b000001001406100000010006040000010004100000010010020000
-01000200000001000002010802004a00b013034b024b5342014bb0c06300
-4b6220b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807
-ff52b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ff
-b101018e851bb0124358b900010111858d1bb900010128858d5959001816
-763f183f123e113946443e113946443e113946443e113946443e11394660
-443e11394660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b2b
-182b1db0964b5358b0aa1d59b0324b5358b0ff1d594bb09353205c58b901
-f201f04544b901f101f045445958b9033e01f2455258b901f2033e445959
-4bb8015653205c58b9002001f14544b9002601f145445958b9081e002045
-5258b90020081e4459594bb8019a53205c58b9002501f24544b9002401f2
-45445958b909090025455258b9002509094459594bb8040153205c58b173
-244544b1242445445958b917200073455258b9007317204459594bb80401
-53205c58b1ca254544b1252545445958b9168000ca455258b900ca168044
-59594bb03e53205c58b11c1c4544b11e1c45445958b9011a001c455258b9
-001c011a4459594bb05653205c58b11c1c4544b12f1c45445958b9018900
-1c455258b9001c01894459594bb8030153205c58b11c1c4544b11c1c4544
-5958b90de0001c455258b9001c0de04459592b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65
-422b2b01b33b59635c456523456023456560234560b08b766818b0806220
-20b163594565234520b003266062636820b003266165b059236544b06323
-4420b13b5c4565234520b003266062636820b003266165b05c236544b03b
-2344b1005c455458b15c406544b23b403b4523614459b347503437456523
-456023456560234560b089766818b080622020b134504565234520b00326
-6062636820b003266165b050236544b034234420b147374565234520b003
-266062636820b003266165b037236544b0472344b10037455458b1374065
-44b24740474523614459004b5342014b5058b108004259435c58b1080042
-59b3020b0a124358601b2159421610703eb0124358b93b21187e1bba0400
-01a8000b2b59b00c2342b00d2342b0124358b92d412d411bba0400040000
-0b2b59b00e2342b00f2342b0124358b9187e3b211bba01a80400000b2b59
-b0102342b0112342002b7475737500184569444569444569447373737374
-757374752b2b2b2b74752b2b2b2b2b737373737373737373737373737373
-737373737373737373732b2b2b45b0406144737400004bb02a534bb03f51
-5a58b1070745b040604459004bb03a534bb03f515a58b10b0b45b8ffc060
-4459004bb02e534bb03a515a58b1030345b040604459004bb02e534bb03c
-515a58b1090945b8ffc06044592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b752b2b2b2b2b2b2b435c58b9008002bbb301401e017400735903b01e4b
-5402b0124b545ab012435c5a58ba009f02220001007359002b7473012b01
-732b2b2b2b2b2b2b2b737373732b2b2b2b2b002b2b2b2b2b2b0045694473
-456944734569447374754569447345694445694445694473744569444569
-44732b2b2b2b2b732b002b732b74752b2b2b2b2b2b2b2b2b2b2b2b2b2b73
-7475732b7374757374752b2b2b742b2b000000>
-[15785 15901 16277 16325 16277 16273 15933 16169 16277 15721 16361 15561 15973
-16029 16305 15693 16345 16249 15893 15629 16365 15481 16245 16249 16357 16337
-15821 15749 16345 15937 16257 16033 19077 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-
-2 0 3 <> ArialMT AddT42Char 
-2 9604 37 <00030096000004e905ba0011001d002a0113b90004fff440470b0b065504
-044623562366237309840906691a75057009730b8305830b062716090318
-272a1e161d090913121e2a2a2929001c1d1e0201021f1e1e110008182606
-0c1010025506b8ffe640330f0f025506120d0d025506060c0c025506080b
-0b0655060c0c0c065506140d0d0655065425260c1c101002550c0a0d0d02
-550cb8fff440150b0b06550c1a2c1d1e200120000100201010025500b8ff
-f6b40f0f025500b8fff6b40d0d025500b8fffab40c0c025500b8fffab40c
-0c065500b8fff0400a0d0d0655005d2b3b5c182b10f62b2b2b2b2b2b5d3c
-fd3c4e10f62b2b2b4dedf42b2b2b2b2b2b2bed003f3cfd3c3f3cfd3c1239
-2f3c10fd3c392f1139111239011217393130015d005d2b33112132161615
-140607161615140e0223012132373636353426262321112132373e023534
-26262321960226a8cb736667858f5780c18cfe93013d81384a4b46829efe
-db016d5e26435a3a54958cfead05ba59b9655ea63327bc8067b160310352
-1116664d496f29fba0070c386b4652793100>ArialMT AddT42Char 
-2 10012 38 <00010066ffe7057605d3001d00d3b563026a1d0201b8ffe8b40b0b065500
-b8ffe8405f0b0b06552000320d63007000741d8000841d90009a05ab03a5
-0db903b40dc70dd000e41df31d110e121d111d1d032a0628112a1c201f47
-0d56145715561968056b1d7b128b129a03990e9a1ca801a402a811d50e13
-0014001a1014101a0402b8ffdeb2283901b8ffc0402d2839100f0001041b
-131e0c031b1e040910260f4a0026200101011a1f1726200801080c0b0b06
-5508191e635c182b4e10f42b5d4ded4e10f65d4dedf4ed003fed3fed1117
-393130012b2b5d5d71005d2b2b0172011706042322240235341224333204
-17072626232206021514121633323604b4c23dfec3e5edfed79baf0143c2
-dc012c3bbf33c293a9e35c6de686a3e2020231effbc1016ed2e50155b1e0
-cb2da092a2feef91bbfee98abc00>ArialMT AddT42Char 
-2 10326 39 <0002009e0000055a05ba000f001d00e5402f201f0143081c1d1e02010211
-101e0f000817262009011f400d0d0255092010100255090a0f0f02550918
-0d0d025509b8fff440150c0c0655091a1f1d102001200001002010100255
-00b8fff6b40f0f025500b8fff6b40d0d025500b8fffab40c0c025500b8ff
-f7b40c0c065500b8fff8400a0d0d0655005d1e3b5c182b10f62b2b2b2b2b
-2b5d3cfd3c10f62b2b2b2b2b5ded003f3cfd3c3f3cfd3c31304379403603
-1b0708060805080408040619181a1802060b0a0c0a0d0a03061516141613
-1603061b03172101120e17210118081c2101160a1121002b2b012b2b2a2a
-2a2a81015d3311213217161716121514020e022325213236373636353426
-272623219e01f9ab5a7e5974734e7a91cd85feb1013991a531454d976c4e
-adfecc05ba151d4c62fecfc4a7fefea96132ad363145e9a6e6f72a1e>ArialMT AddT42Char 
-2 11032 42 <0001006dffe705b905d300250113401a1b141b15026027015e0813011203
-2424002112170225001e0201b8ffc040200c0c0655010106171e0e03211e
-06090101262725242003032002202760020302b8ffe4b40f0f025502b8ff
-f2b40d0d025502b8ffdab40c0c025502b8fff4401b0c0c06550272802701
-271d26200a010a100c0c06550a1926635b182b4e10f42b5d4ded4d105df6
-2b2b2b2b5d3c4d10fd3c1112392f003fed3fed12392f2b3cfd3c11123911
-123901111239123931304379404404231b1c1a1c191c03060c2610251526
-1f26082504262325180d1d2100160f1321011112141320071d2100220525
-21011c0b17210114111721011e092121002403212100002b2b2b2b012b2b
-103c103c2b2b2b2b2b2b2b2b2b2a81015d005d0135251106042322240235
-3412243332041617072e02232206060706151412043332363711034c026d
-8ffed0a0d8fe9fb4b30150db9f01019226af2162b66f85c2772138870102
-917ef03e023fac01fde07273b9015ed8d60173b467b8943070804d51844f
-889fc4fef88061370111>ArialMT AddT42Char 
-2 12154 46 <000100960000055205ba000b01fe401e0322373908093a270a3506360a47
-0a57038603d70307760ad903d90a0306b8fff440180d0d025528058c048a
-05aa04ea08050a04013504d6040209b8ffe04009122134032012213403b8
-ffdeb30c391209b8ffe0b312213408b8ffe0b312213404b8ffe0b31d2134
-04b8ffc0b312163408b8ffde403d1939080925253d080919193d06060709
-0a09080a0503040420050a1405050a090808200706140707060a0a000502
-040102070b0800080a03020b010004b8023a400f300501a005b005c005e0
-0504054a08b8023a400b30070120078007b0070307b80286400c0b202000
-0100201010025500b8fff6b40f0f025500b8fff6b40d0d025500b8fffab4
-0c0c025500b8fffab40c0c065500b8fff2400a0d0d0655005d0c3ba8182b
-10f42b2b2b2b2b2b5dedfd5d71edf45d71ed103c103c3c3c003f3c3c3c3f
-3c3c3c12392f87052e2b0e7d10c487052e182b047d10c40708103c083c01
-4bb018534bb01b515a58b90004ffd83859b10602435458b90004fff0b30c
-113403b8fff040170c113406100e113408100e103409100e11340a100d10
-34002b2b2b2b2b2b593130012b2b2b2b2b2b2b435c58401109221939082c
-1939042c193904221b3905b8ffdeb616390422163906b8ffde400b123908
-2214390440143908b8ffdeb52539044015392b2b2b2b2b2b2b2b2b2b2b59
-002b2b2b0171725d2b00715d2b2b33113311012101012101071196c202d8
-0107fd990282ff00fdf6f005bafd2902d7fdaefc9802e6eafe04>ArialMT AddT42Char 
-2 12858 48 <000100980000060f05ba001002e4b10202435458b90008fff6400b0c0c02
-55080e0d11025502b8ffeeb40d11025505b8ffee40280d1102550c120c0c
-0255050f0c030900010208090b0e000809020a0b06101002550b100d0d02
-550bb8fffab60c0c02550b1000b8ffe6b41010025500b8fff8b40f0f0255
-00b8fffcb40d0d0255002f2b2b2bcd2f2b2b2bcd003f3fc0c010d0d0c011
-1217392b2b3130012b2b2b001bb10602435458401f07200b0b065506200b
-0b065503200b0b065504200b0b065505200b0b065508b8fff240230b0b06
-55020c0b0b065503060c0c0655020e0c0c0655090c0c0c06550a0c0c0c06
-5507b8fff8b40d0d065508b8fff8401f0d0d06552605010c200a12340f20
-0a12340f050c0300010e0b00080801020ab8ffeeb40b0b06550ab8ffeeb4
-0c0c06550abb0256001200100256400d000c0b0b065500060c0c065500b8
-fff8b40d0d065500012f2b2b2bf42ff42b2b003f3c3f3c3c111217392b2b
-5d3130012b2b2b2b2b2b2b2b002b2b2b2b2b1b407f00020f0814021b0804
-760c860cc80c03090c490c490f032904250d2c0e58035b04760d780e870d
-080b020508390d360e4f024b03440740084d0d420e0a9802990396079608
-a803a7070612020f0e0e30050214050502080c0d0d300508140505080c52
-0f5201400102020808090a0b0b0d0d0e0e1000080902601280120212ba02
-a8000d0131b2052008b80131400a0c090a20400c7f0b010bba0256000e01
-0bb2052002b8010b40090f0100200f70100110b80256b720056005800503
-05b802a8b3113b59182b1910f45df45d3c18fd3c10ed1a1910edf45d3c1a
-18fd3c10ed1a1910ede45d00183f3f3c3c103c103c103c103c103c103c1a
-10eded87052e2b877dc4872e182b877dc43130004bb00b534bb01e515a58
-bd000cfffb0008ffd60002ffd638383859014bb00c534bb028515a58b900
-0dfff8b10e0a38385901435c58b9000dffd4b621390e2c21390db8ffd4b6
-37390e3237390db8ffd4b52d390e2c2d392b2b2b2b2b2b5972715d00715d
-015d59593311210116173637012111231101230111980124015b30161935
-015f0105bbfe56affe5805bafbf29148509b03fcfa4604cbfb3504e0fb20
->ArialMT AddT42Char 
-2 13668 49 <0001009c0000051f05ba0009017db1120bb8ffc0400a13153408180c1602
-5503b8ffe840210c16025508020303200708140707080207030308090402
-02090708040320060605b8ffecb40f0f025505b8fff2400b0d0d02550512
-0c0c025505b8fff7401a0b0b0655055d200b01200b500b600b700b800b05
-0b0809200100b8ffc0400d13153420000100201010025500b8fff6b40f0f
-025500b8fff6b40d0d025500b8fffa400b0c0c025500040b0b065500b8ff
-f7b40c0c065500b8fff8400a0d0d0655005d0a3b59182b10f62b2b2b2b2b
-2b2b5d2b3cfd3c105d71f42b2b2b2b3c10fd3c003f3c3f3c123939011139
-3987042e2b877dc4b10602435458b90003ffe0b70c113408200c1134002b
-2b5931302b2b012b435c58b40840463903b8ffc0b646390840323903b8ff
-c0b632390722193902b8ffdeb619390722323902b8ffdeb6323907222339
-02b8ffde400b2339070e1439070e133902b8fff4b61339070e1d3902b8ff
-f4b61d39070e153902b8fff8b115392b2b2b2b2b2b2b012b2b2b2b2b2b00
-2b2b2b2b59331133011133112301119cc70302bac7fcfe05bafb81047ffa
-460480fb8000>ArialMT AddT42Char 
-2 14402 51 <0002009e000004fd05ba000d001800b2402c65116b14024b104b145b105b
-14040b0c1e0f0e0e0017181e02010200081226080a0d0d025508100b0b06
-5508b8fff4401b0c0c0655081a201a01201a011a180d2001200001002010
-10025500b8fff6b40f0f025500b8fff6b40d0d025500b8fffa400b0c0c02
-55000c0b0b065500b8fffab40c0c065500b8fff0400a0d0d0655005d193b
-5c182b10f62b2b2b2b2b2b2b5d3cfd3c4e10715df62b2b2b4ded003f3f3c
-fd3c12392f3cfd3c3130015d005d33112132171e02151402212111112132
-36353426272623219e0229924d6c9259eefec9fe88017bbc9e5d4c3184fe
-8905ba0e1265b66dbbfefdfdac03018c7f5c83150d00>ArialMT AddT42Char 
-2 15164 53 <000200a1000005ad05ba0018002201fc4021120b0e0112361c5a1f66086d
-1f0409100d0d065508100d0d065507100d0d065524b8ffc0b40c0c02550d
-b8fff4b40c0c02550cb8fff4b40c0c02550bb8fff4b40c0c025512b8ffe2
-b3121a3412b8fff0b322273411b8ffe2b31d273410b8ffe2b31d27340fb8
-ffe2b31d273412b8ffd8b31d263411b8ffe2b3121a3410b8ffe2b3121a34
-0fb8ffe24049121a34250e4a1c4a20530b5c1c6d1c7209780e790f850a88
-0f970da90fb80fe80ee70f100e0c0c20110f1411110f110f0c09121b0221
-1a160a061211100d0c0518090916171a191e17b8ffc040190b0b06551717
-0021221e0201020018180f0f0e081e260e9c06b8ffe8b40f0f025506b8ff
-f6b40d0d025506b8ffe040220c0c025506060d0d0655065d202470248024
-03242218200120000100201010025500b8fff6b40f0f025500b8fff6b40d
-0d025500b8fffa400b0c0c025500060b0b065500b8fff7b40c0c065500b8
-fff8400a0d0d0655005d233ba8182b4e10f42b2b2b2b2b2b2b5d3c4dfd3c
-105df62b2b2b2b19e418ed003f3c103c103c3f3cfd3c12392f2bfd3c103c
-392f12173901111739870e2e2b057d10c43130015d2b2b2b2b2b2b2b2b2b
-2b2b2b2b002b2b2b5d435c58400a08400f390f103a11123a2b2b2b590171
-435c58b9000effde401a193911221939122219390e401c39102214391022
-1f39102215392b2b2b2b2b2b2b5933112132161615140607161716171323
-032e02272623231111213236363534262321a1028ac4cc7acad34d28554c
-fff4c2556e572d214be101a185964e97a3fe3005ba4fc8799cd61d25244e
-75fe710131848c380b07fd750333377947688600>ArialMT AddT42Char 
-3 2874 60 <000100060000054605ba000c016ab608093a03043b09b8ffe7b312173408
-b8ffe7400e1217340419121734031912173409b8ffd8b318213408b8ffd8
-403b182134042818213412260429082a0a2f0e0468016806680bde060405
-040303060807090606090603090a0c10025509200a0b140a0a0b06030609
-03b8fff640160c1002550320020114020201060c0b0601030200010bb802
-1940090a0a0903020200080eb8021840090c0952400a800a020ab801b540
-0d0b0b0c200003524f028f020202b801b54009010100141010025500b8ff
-f6400b0f0f0255000c0d0d025500b8ffe2b40c0c025500b80218b60d0ec2
-2160a8182b2bf62b2b2b2b3c10f45ded10fd3c10f45ded10e6003f3f3c3c
-3c10f43c11121739011239872e2b2b087d10c405872e182b2b087d10c487
-0ec4c487100ec4c44bb017534bb01c515a58b4080c090c04bafff40003ff
-f40138383838593130005d015d435c584009092219390822193904b8ffde
-b119392b2b2b592b2b2b2b2b2b2b2b2b2111013301161736370133011102
-3bfdcbec01215045425e011ce2fdb7026d034dfe467c7c739001affcb3fd
-9300>ArialMT AddT42Char 
-3 3616 62 <0001008bfe69021805ba00070046402b04032b01021005062b0007120302
-020706ae0405250100060c0c025500080909025520000100ac089d68182b
-10f65d2b2b3cfd3cf43c3c103c003f3cfd3c3f3cfd3c3130131121152311
-33158b018dd9d9fe69075195f9d99500>ArialMT AddT42Char 
-3 3828 64 <00010027fe6901b405ba0007003f401704052b07061003022b0001120605
-050102ae0403250700b8ffec400a0c0c025500ac099b5a182b10f42b3cfd
-3cf43c3c103c003f3cfd3c3f3cfd3c3130012135331123352101b4fe73d9
-d9018dfe699506279500>ArialMT AddT42Char 
-3 4240 68 <0002004affe8041c043e00280037022d402c090d092a190d1a2a290d2a2a
-390d3615371b3a2a492a5d0d5d2a6a0d692a60308a0d86299a169b1aa90d
-1528b8ffe8b40b0b065527b8ffe840190b0b0655a619aa28b619bb28c419
-cf28d215dd28084416011eb8fff440110c0c065512120c0c0655050c0c0c
-065535b8ffe040550c0c06551f171f182b2c2a343904392c4904482c5608
-592b6608692b760c870cc90cf90df92b1137340e0104102f243417322114
-185f296f2902291c2f0e3f0e8f0e9f0eff0e059f0eaf0eef0e030e0c0f0f
-02550eb8ffeab4101002550eb8fff44015101006550e0c0d0d06550e060f
-0f06550e0e1c0317b802aab61895141c1c0700b8fff4401a0c0c06550045
-270a321c030b2961106100060d0d025500252124b8ffecb41010025524b8
-ffec400b0d0d025524040c0c025524b8ffe4b40b0b025524b8fff4b40b0b
-065524b8ffdc400b1010065524060f0f065524b8fffcb40c0c065524b802
-5b400e27400026102620263026af260539b8ffc0b40e0e025526b8ffd6b6
-0e0e0255263139b8ffc0400d1e23343039c03902a039013917b8fff44041
-10100655172518222f24bf06cf06021f063f0602060e0f0f0255060c0d0d
-025506180c0c0255060c0b0b0255060c0b0b0655060e0d0d065506100c0c
-065506313810f62b2b2b2b2b2b2b5d71edf4ed2b105d712bf62b2b5dedf4
-2b2b2b2b2b2b2b2b3cfd2be5e5003fed3fe42b3fedfde41112392f2b2b2b
-2b2b5d71ed711112391112393901111217393130005d2b2b2b2b01715d2b
-2b0071250606232226353436363736373637363534272623220607273e02
-333216161716151514161723260306070e02151416333236373635033c64
-b96aafbc477348356bda67013345887f791db0186ed08988aa5010091722
-bc1c1762c46f5c326d6968a2261d835546ab854e814e140e0d1a24250a6e
-2d3d597118718b4b40614a2e78f0fb853d3801dd281c10284d2f48605b4f
-3d77>ArialMT AddT42Char 
-3 5440 70 <00010050ffe803ed043e001a015ab1020243545840340e7f0f010f0b0140
-0050007000030004121c0b07181c040b010e1507080e0e0255070c0d0d02
-55070c0c0c025507100b0b0255072f2b2b2b2bcdd4c6003fed3fed10c45d
-3210c45d3231301b4047090c011f1c4313431753135317601360179b029b
-039a0da410a41a0c080d190a6a0269036a05750c700d800da60cb509b60a
-b50c0c160c860ce302030e225f0f6f0f7f0f030f01b802aa407930004000
-5000600070009000a000e000f00009000f0f0b000004121c0b07181c040b
-1c0f010f240e080d0d06550e221b000100240b2b1f010100010101400b0b
-065501401010065501480c0c0655011a0d0d065501491c1524cf07011f07
-3f0702070e0b0b0655070a1010065507120c0c065507311b34c4182b10f6
-2b2b2b5d71ed10f62b2b2b2b5d724b53234b515a58b90001ffc03859ed72
-f42bed72003fed3fed12392f11392f105de4105de43130005d71015d7159
-011706062322001134123633321617072626232206151416333236033cb1
-1defaedafef772e989addc1faf197f5a88aaa4846a8e018517b7cf011d01
-0aac010281afa11b6b6cc3d3d6c28200>ArialMT AddT42Char 
-3 5876 71 <00020046ffe803df05ba0011001d015540a40a02040d250d340d440d0535
-14351c5702540a5214531c6702640565096314601cc01fd405d513dd19e5
-13e514ef17eb19e51de01fff1f161f1f2b1a3c163c1a4b1a701f901f072e
-02240d2e163a02350d4b02450d4614491c570a560d670de506e716fa01f4
-0e100115030e0b100f001b1c0b0711000a151c030b1833010025110f2510
-10d011011011401160118011041f400b0b02551f400d0d02551112101002
-5511b8fff440110f0f025511060e0e025511180d0d025511b8fff2400b0b
-0b0655110e1010065511b8ffeeb40c0c065511b8fff840420d0d06551174
-1224bf07cf07df07ff07041f073f074f0703071e0b0b025507180c0c0255
-071e0d0d0255070c0b0b0655070c0d0d0655071a0c0c065507191e345018
-2b4e10f42b2b2b2b2b2b5d714dedfd2b2b2b2b2b2b2b2b2b2b5d713c10ed
-10fd3ce4003fed3f3c3fed3f3c11391112393130005d01715d0071213506
-232226263534123633321617113311011416333236353426232206033865
-c47fd5756ad48360962fb3fd20ac7576a5a87b78a1869e8cfba39f01038a
-5141020efa460212cccac1c6daccc400>ArialMT AddT42Char 
-3 6312 72 <0002004bffe8041e043e0015001d015340171f001c150255035d055d0955
-0b65036b056f09650b0815b8ffe4b40d0d065511b8ffe440520d0d06551d
-1c0d0d06552712d905fa14f61a0431123a19311c41124d1a411c51125c19
-521c61126d1a611c78067815f602f618100016010f0d1717501660167016
-03161c0f9010a010021010041b1c0a0700ba02aa0001ffc0b41010025501
-b8ffc04010101006551001010195131c040b17400db8ffdcb40d0d02550d
-b8ffeeb40d0d06550db8ffeab40c0c06550db8ffc04009272a34b00d010d
-1a1fb8ffc0b32526341fb8ffc040411e2334301f011f163310240740242a
-341f073f074f070307200b0b025507180c0c0255071c0d0d0255070e0b0b
-0655071c0c0c065507160d0d065507191e3437182b4e10f42b2b2b2b2b2b
-5d2b4dfde44e10712b2bf6712b2b2b2b4ded003fedfd5d2b2be43fed1239
-2f5d3cfd713c011112393912393130015d005d2b2b2b0171720117060623
-22001110003332001114072116163332360121262726232206035eba2cee
-b9e9feef0114dcd5010e01fce80ab285638cfdda02510c3856897ca90156
-17a3b4011f0103010c0128fedefef91020afba680195864368a6>ArialMT AddT42Char 
-3 6758 73 <000100130000028005d30017010d401e1409010f192f193019401970199b
-0c9c0da90d081a0d280db019c0190419b8ffc040281a1f341d080d030c0f
-1c0a0115022b1413040306000a9f140114ff134004172504000302920101
-00b8ffc0b331383400b8ffc0402b1c1f3490000119400f0f025519400d0e
-025500141010025500280f0f025500220e0e0255002c0d0d025500b8fff2
-400b0c0c025500140b0b065500b8ffeab41010065500b8ffe6b40f0f0655
-00b8fffab70c0c065500a31819bc01ba002100f6010a00182b2bf62b2b2b
-2b2b2b2b2b2b2b2b5d2b2b3c10f43c103ced10eded5d003f3f3c3c3cfd3c
-3fed391139313043794014101106090706080602061009121b0011060f1b
-012b012b2a8181012b715d00723311233533353437363633321707262322
-06151533152311b29f9f131a83764c5c1b38325244cfcf039a8c716b3446
-57129d0a4660628cfc66>ArialMT AddT42Char 
-3 7098 74 <00020042fe5103ea043e001e002a016f40600b0b05142c0b25144c0b4514
-06091d191d2c0b26142c23390b36144a0b46145607580b680bfa0af5150e
-2e232c273e233e274c27902ca02c07362136293f2c460b46214529542154
-29690763216329602c802cda27e821ee23ef271117160615b802b1b4281c
-130701b802aa401020003000600070008000c000d0000700b8027d403205
-1c1c0f0a45221c0c0a16153325330a251818d01701101740176017801704
-2c400b0c02552c400d0d025517121010025517b8fff440110f0f02551706
-0e0e025517160d0d025517b8ffea400b0b0b065517121010065517b8ffee
-b40c0c065517b8fffc404a0d0d065517740f012500221f24bf0fcf0fdf0f
-ff0f041f0f3f0f4f0f030f200b0b02550f1a0c0c02550f220d0d02550f1c
-0b0b06550f0c0d0d06550f1a0c0c06550f192b2c74213450182b2b4ef42b
-2b2b2b2b2b5d714dedf4ed10fd2b2b2b2b2b2b2b2b2b2b5d713c10fde4f6
-3c003fede43fedfd5de43fede43f3c3130015d71005d7117171617163332
-363736270623220235341236333217353311140606232226131416333236
-35342623220666af0b3243747d88180e0176b0dbf06ed18dbc7aa665dba0
-beea99a67d7ca8ad7a78a8581a512532645a37b08b013cdd9801018c9880
-fc6af8cf78ab032ad1c0bfccc3c6c300>ArialMT AddT42Char 
-3 8014 76 <000200880000013c05ba0003000700cd405e09360b0b02554f099009a009
-b009c009df09f0090700091f09700980099f09b009c009df09e009ff090a
-1f09010001070402030906037e0100060506040a0607250500049f04a004
-b004c004e00406c004f0040200042004d004e0040404b8fff8b410100255
-04b8fffa40170e0e025504040c0c0255040a0b0b025504140b0b065504b8
-ffeab41010065504b8fffeb40d0d065504b8fffc400a0c0c0655044e0847
-50182b10f62b2b2b2b2b2b2b2b5d71723cfd3c003f3f3c3fed0111123939
-111239393130015d72712b133533150311331188b4b4b404ebcfcffb1504
-26fbda00>ArialMT AddT42Char 
-3 9202 79 <000100830000013705ba000300e3b605360b0b025505b8ffc0b337383405
-b8ffc0b334353405b8ffc0b330313405b8ffc0b322253405b8ffc0402515
-17340f051f059f05df05044f05df05f005031f0570058005ff0504010000
-0a0203250100b8ffc0b337383400b8ffc040153335349f0001c000f00002
-00002000d000e0000400b8fff8b41010025500b8fffa401d0e0e02550004
-0c0c0255000a0b0b025500140b0b065500081010065500b8fffeb40d0d06
-5500b8ffffb40c0c065500b8fffc400a0c0c0655004e044750182b10f62b
-2b2b2b2b2b2b2b2b5d71722b2b3cfd3c003f3f3130015d71722b2b2b2b2b
-2b3311331183b405bafa4600>ArialMT AddT42Char 
-3 9454 80 <0001008700000626043e002301c7b9000dfff4b40d0d065508b8fff4b40d
-0d065509b8ffd8404d0b0d342504e404e409e117e52005d505f620021708
-202309181b20090303231e1c06151c0b0b06070106231a19100ad0250190
-25a025022517171a0e2590110111041010025511180f0f025511b8ffec40
-0b0e0e025511140c0c025511b8ffe840170b0b025511020b0b0655110c10
-10065511060f0f065511b8fffab40c0c065511b8fff8b40d0d065511b801
-5d400c1825901b011b180f0f02551bb8ffec400b0e0e02551b140c0c0255
-1bb8ffee40110b0b02551b040b0b06551b0a101006551bb8fffe400b0d0d
-06551b0c0f0f06551bb8fffcb40c0c06551bb8015d4016000233232501d0
-00019000a000021f003f004f000300b8fffe401d0e0e025500100d0d0255
-00100c0c0255000c0b0b025500160b0b065500b8fffcb41010065500b8ff
-f440140f0f0655000a0c0c0655000e0d0d065500192425b80178b3214750
-182b2b4ef42b2b2b2b2b2b2b2b2b5d71723c4dfde410f42b2b2b2b2b2b2b
-2b2b5dedf42b2b2b2b2b2b2b2b2b2b5dfd4e456544e67172003f3c3c3c3f
-3f3c4d10ed10ed11173901111239123931304379400e0c141326140c111b
-01120d151b01002b012b2b81015d005d2b2b2b3311331536363332161736
-3332161511231134262623220615112311342623220606151187a132a66a
-76971f7eca9eaab3235c3e7094b458644c813a0426954e5f6258baafb6fd
-27029d6c5f3a95a4fd9702b27878509a91fdd900>ArialMT AddT42Char 
-3 10014 81 <00010087000003e6043e0016017d40130503061302a810b810e303e713f0
-03f6130604b8fff0403c0b0d347910019810d018e018ff18042008140e14
-16121c05070106160d0a0d0e0c0e2418401010025518400b0b02550b2810
-1002550b140e0e02550bb8ffec40110d0d02550b040c0c02550b220b0b02
-550bb8fff4400b0b0b06550b14101006550bb8fff9400b0d0d06550b0a0f
-0f06550bb8fff640120c0c06550b40333634ff0b01ff0b010b4e18b8ffc0
-401a343634b018f018027018a018b018c01804180302331516250100b8ff
-f6b41111025500b8fffab41010025500b8fffa40170e0e025500040c0c02
-55000a0b0b025500040b0b065500b8fffa40110f0f065500020c0c065500
-040d0d065500b8ffc04012333634f0000100002000d000e00004004e1710
-f65d712b2b2b2b2b2b2b2b2b2b3cfd3cf43c105d712bf65d712b2b2b2b2b
-2b2b2b2b2b2b2b2bed3c103c003f3c3f3fed113901123931304379401606
-11090a080a070a0306102611060e1b010f0a121b01002b012b2b2a81015d
-71002b5d71331133153633321616171615112311342626232206151187a2
-75dd60a150100ab42a6b4873a7042697af45704d327dfd7302866e6d4192
-ccfdbc00>ArialMT AddT42Char 
-3 10468 82 <00020044ffe80427043e000d0019016bb615180d0d065513b8ffe8b40d0d
-06550fb8ffe840730d0d065519180d0d065512070a190c47064808560659
-08670669080834103a123a16351845104b124b1645185c055c0952105d12
-5d1652186d056d0964106d126d1664187701150906050d5b035405540a5b
-0c6c036505650a6c0c0a171c0407111c0b0b14241b400d0d02551b400b0b
-025507b8ffea40110f0f025507180d0d025507100b0b025507b8fff0b40b
-0b065507b8fff0b40d0d065507b8fff0b40f0f065507b8fff0b40c0c0655
-07b8ffc04013242534300701000710072007030731df1b011bb8ffc04049
-1e2334301b011b0e24000c0e0f025500120d0d0255000c0c0c0255001c0b
-0b0255000e0b0b0655000e0d0d0655000c1010065500160c0c0655004024
-25341f003f000200311a3437182b10f65d2b2b2b2b2b2b2b2b2bed10712b
-5df65d5d2b2b2b2b2b2b2b2b2b2bed003fed3fed313001715d0071435c58
-4009530553096205620904015d59002b2b2b2b1310373633320015140606
-23220013141633323635342623220644a489c5db01167beb8bdffeedb9b2
-8786b2b38587b2021301278e76fee1fdcdeb82011e010dcccbccd1c5cbca
->ArialMT AddT42Char 
-3 11776 85 <00010085000002c6043e001100c9403b2f13011004012304340443045304
-66047404060911080908090d1311090d000308010b1c06070106000a0928
-900801082220130113022211250100b8ffc04010333634f0000100002000
-d000e0000400b8fff8b41010025500b8fff840110e0e025500040c0c0255
-00060b0b025500b8fffcb41010065500b8fff440160f0f065500060c0c06
-5500080d0d0655004e1247c4182b10f62b2b2b2b2b2b2b2b5d712b3cfde4
-105df472e4003f3f3fed11393911393901111239390010c9870e7dc43130
-005d72015d33113315363633321707262322060706151185a23e693f5b5e
-3e42423b5e141e0426a171483aa727473f6072fdd400>ArialMT AddT42Char 
-3 12038 86 <0001003fffe803b1043e00300317407b042214223a094a09442456226522
-7c098e098424a613ab2cc2030d09171a1817304b2cd617051b0255020210
-32010a185c085c095c0a5c0b5c0c5c0d6a086a096a0a6a0b6a0c6a0db426
-b4270f27262427242936245a0a590b64266428742374248024930a9c0c92
-28972c9530a40aa90ca327a428b326c5261628b8fff4b40d0d065522b8ff
-f4b40d0d065523b8fff4b40d0d065524b8fff4b40d0d065528b8fff4b40c
-0c065522b8fff4b40c0c065523b8fff4b40c0c065524b8fff4b40c0c0655
-1db8ffde40121e395a0827250c0a041a202615040b2e1d1ab802aa402219
-2c0b0b02551f193f194f195f19af19cf19060f191f196f19df19041f198f
-190219bd02550015000002aa0001ffc040140b0b025510014001021001d0
-0102000110010201b8ffc0b314163401b8ffc040100e113401012e5c1d6c
-1d021d1c150704b8fff4b40b0b025504b8ffe6b41010065504b8ffe64013
-0f0f0655041c2e0b1f1a011a24194013183432b8ffc0402f0f0f02551918
-0f0f025519180d0d025519160c0c025519201010065519200f0f06551910
-0c0c065519160d0d065519b8025bb207242ab8ffc0b51c39d02a012ab8ff
-e6b40c0c02552ab8ffe8b40f0f02552ab8ffe8b40c0c06552ab8ffeab60d
-0d06552a1a32b8ffc04021272a346032c032023f32803202321001010124
-00180d0d025500100d0d06550020b8fff4b40d0d025520b8fff4b4101006
-5520b8fff440190f0f065520240f100b0b02550f160c0c02550f200d0d02
-550fb8fffa40200f0f02550f0e0c0c06550f0c0d0d06550f22df00013f00
-4f00020019313437182b4e10f45d714df42b2b2b2b2b2bed2b2b2b102b2b
-ed724e105d712bf62b2b2b2b712b4dedf42b2b2b2b2b2b2b2b2bed72003f
-ed2b2b2b3fed7112392f2b2b5d71722be410fd5d71722be4111239111239
-0111121739313043794040272d1e2305142c261110121013100306220d20
-1b000928071b01052d071b011e14201b00210e231b0022230d0c08290a1b
-012827090a062b041b001f101d1b01002b2b103c103c2b103c103c2b012b
-2b2b2b2a2b818181002b2b2b2b2b2b2b2b2b5d71015d72715d1337161633
-323635342726272e02353436373636333216161707262623220615141716
-1716171e02151406062322263fb20f897b7c78352593c6994f41382a9153
-7dbd5a11b00c73697c6a16162f1b84bf975669c67dcfd9013d1c6b726544
-3d2318253249814e4779281f2b487b6718525c5237231c1d130a2433417c
-5c5a9f57ac00>ArialMT AddT42Char 
-3 12974 87 <00010024fff2022a0599001700d8b9000affc0b323263409b8ffc0404123
-263480190100010c0d0a0103001610092b0f0a06161c030b0f1022002201
-0d12250c01ff070845094560077007800790070400072007a007b007c007
-d0070607b8ffeeb41010025507b8fff4b40f0f025507b8fff2b40e0e0255
-07b8fff8b40d0d025507b8fff8b40c0c025507b8fffab41010065507b8ff
-f0400b0f0f065507060c0c065507b8ffe8b40d0d065507ba026a00180136
-b166182b10f62b2b2b2b2b2b2b2b2b5d71f4e410ed3cfd3c10e4f43c003f
-ed3f3cfd3c1139123911333310c93130015d2b2b25170623222626351123
-353311371133152311141616333202101a4c3c626c2c8484b3b5b5132b28
-1ea19f103e65a202638c01076cfe8d8cfd934d2c1a00>ArialMT AddT42Char 
-3 13266 88 <00010083ffe803e004260018014fb9001affc0400915173402201316340f
-b8fff040331214342b1301240813160c0113160b06000a111c030b003316
-251817403336341a401010025517281010025517120e0e025517b8ffec40
-0b0d0d025517040c0c025517b8fff4400b0b0b065517141010065517b8ff
-f8400b0d0d0655170c0f0f065517b8fff6400d0c0c0655ff1701c0170117
-4e1ab8ffc04015343634b01af01a02701aa01ab01aff1a041a0c2509b8ff
-c04010333634f0090100092009d009e0090409b8fff8b41010025509b8ff
-f840110e0e025509040c0c0255090a0b0b065509b8fff640160f0f065509
-020c0c065509020d0d0655094e194750182b10f62b2b2b2b2b2b2b5d712b
-ed105d712bf65d712b2b2b2b2b2b2b2b2b2b2b3cfde4003fed3f3f3c3939
-0111123931304379401a04100e0d0f0d0206070806080508030610040c1b
-000d08111b00002b012b2a2a81005d012b2b2b2135062322262627263511
-3311141716163332363635113311033f7cd55ea34f100bb40b116e51518e
-3bb49cb4486d4f35730292fdb38d314751538f880239fbda>ArialMT AddT42Char 
-3 13680 89 <0001001a000003e80426000a01eab1020243545840170508000a08060106
-0a0005090805010205240f0f0255052f2bddcd10ddcd113333003f3f3f12
-3931301bb7350501002211390ab8ffde400d11390916121c340816121c34
-02b8ffeab3121c3401b8ffeab3121c340ab8ffd840091e213400281e2134
-0ab8ffe8400922253400162225340ab8ffda407e282e340020282e340f0c
-29002809260a3900350a4800470a56015602590858096601660269086909
-78007701770279087809770a870187028603890788088a099d009809910a
-ac00a20abd00b707b10ac900c50ada00d50aec00e30afb00f40a2c0a0005
-0a1800160a2800260a370a4f00400a09054012163405400b0d34b1060243
-5458400905010008060106000ab8fff4400f0d0d06550a000c0d0d065500
-050908b8fff440120d0d0655080501020c0d0d06550205050c0b1112392f
-dd2bcd10dd2bcd10cd2bcd2b002f3f3f11123931301b40370a0708082509
-0a1409090a0003020225010014010100050a0a000a09080802020106070a
-09030001052f0c010c22084040400980090209b8011bb5400580050205b8
-011b400920024001220bead2182b10f6ed1a19fd5dfd5d1a18ede45d1112
-3939123939003f3c103c103c3f3c113987052e2b877dc4872e182b877dc4
-593130002b2b01715d2b2b2b2b2b2b2b2b2b2b2b2b005d59210133131617
-363713330101aefe6cbee4251f182becb9fe6e0426fd84676f54760288fb
-da00>ArialMT AddT42Char 
-4 0 92 <00010021fe5103ee0426001a01f7b10202435458401d0a140f030b031c19
-0f12060b061340120f200b400c200f180f0f02550f192f2b1add1a18cd1a
-1910dd1a18cd003f3f3fed12173931301bb30f1c010fb8ffde406d1c3928
-14560faf0a03400d400f020f202830341020283034070c0912160d181227
-0b270c270d360c360d350e99110b28122813481659125913591569126913
-69157906760d79117a147a15850d8a118c128c138914980aa80bbc10bb11
-ba14ea0ae714f50dfd10f914ff1c1e12b106024354584016130b1c1b040f
-440f840f030f190b031c190f12060b06003f3f3fed1112395d0111123939
-1b40370f0f0c101112120a00031914131325120a1412120a0f0c0f110c25
-0b0a140b0b0a1312120c0c0b06031c190f001c101c022f1cbf1c021cb802
-3fb50f1340124014b80254400b3f124012025f12bf120212b80142b60f01
-2200451b0ab8025440120f200b4040200c300c4f0c03500cff0c020cb801
-42b32f0f010fb8023fb41b207c66182b1a1910fd71f45d711a18ed1a1910
-ed1810f4e41910e45d71ed1a1810ed1910e45d7100183fed3f3c103c103c
-87052e2b087d10c487052e182b0e7d10c400111239870e103c3c08c44bb0
-0e534bb018515a58bb000cffe8000bffe80138385959313001435c58b900
-14ffdeb637390a2237390eb8ffe8b51539112215392b2b2b2b595d712b2b
-00715d2b015d591327163332363736373637013313161736371333010607
-060623227f143b2c3c48171126050bfe6dc2dd2b221f2be3b4fe6c412430
-7c5634fe67a91028241b6b0f1d0428fd9975817c76026bfbc8af42595300
->ArialMT AddT42Char 
-2 0 0 <00020100000005000500000300070000211121112521112101000400fc20
-03c0fc400500fb002004c000>ArialMT AddT42Char 
-ArialMT /CharStrings get begin
-/space 3 def
-/B 37 def
-/C 38 def
-/D 39 def
-/G 42 def
-/K 46 def
-/M 48 def
-/N 49 def
-/P 51 def
-/R 53 def
-/Y 60 def
-/bracketleft 62 def
-/bracketright 64 def
-/a 68 def
-/c 70 def
-/d 71 def
-/e 72 def
-/f 73 def
-/g 74 def
-/i 76 def
-/l 79 def
-/m 80 def
-/n 81 def
-/o 82 def
-/r 85 def
-/s 86 def
-/t 87 def
-/u 88 def
-/v 89 def
-/y 92 def
-end
-ArialMT /Encoding get
-dup 32 /space put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 71 /G put
-dup 75 /K put
-dup 77 /M put
-dup 78 /N put
-dup 80 /P put
-dup 82 /R put
-dup 89 /Y put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 97 /a put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 105 /i put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 121 /y put
-pop
-end
-%ADOEndSubsetFont
-/KUDFOF+ArialMT /ArialMT findfont ct_VMDictPut
-/KUDFOF+ArialMT*1 
-[32{/.notdef}rp /space 33{/.notdef}rp /B /C /D 2{/.notdef}rp /G 
-3{/.notdef}rp /K /.notdef /M /N /.notdef /P /.notdef 
-/R 6{/.notdef}rp /Y /.notdef /bracketleft /.notdef /bracketright 3{/.notdef}rp 
-/a /.notdef /c /d /e /f /g /.notdef 
-/i 2{/.notdef}rp /l /m /n /o 2{/.notdef}rp /r 
-/s /t /u /v 2{/.notdef}rp /y 134{/.notdef}rp]
-KUDFOF+ArialMT nf
-KUDFOF+ArialMT*1 [9 0 0 -9 0 0 ]msf
-236.625 56.135 mo
-(Device Profile)
-[6.48 5.04001 4.437 2.043 4.56299 5.04001 2.27701 6.00305 2.99695 5.03998 2.52002 2.043 
-2.043 0 ]xsh
-224.124 90.506 mo
-(Named Color Profile)
-[6.48 5.04001 7.55992 5.04001 5.03999 2.16 6.48 5.04001 2.043 5.04001 2.99692 2.40298 
-6.00308 2.99692 5.04001 2.51999 2.04303 2.043 0 ]xsh
-228.003 106.256 mo
-(DeviceN Profiles [ ])
-[6.48 5.04001 4.437 2.043 4.563 5.03999 6.48001 2.27698 6.00308 2.99692 5.04001 2.51999 
-2.043 2.043 5.04001 4.56302 2.27698 2.52002 2.51999 0 ]xsh
-227.13 123.635 mo
-(DefaultGray Profile)
-[6.48 5.04001 2.51999 5.04001 5.03999 2.043 2.52 6.957 2.99692 5.04001 4.43701 2.27698 
-6.00308 2.99692 5.04001 2.52002 2.04297 2.04303 0 ]xsh
-228.003 140.384 mo
-(DefaultRGB Profile)
-[6.48 5.04001 2.51999 5.04001 5.03999 2.043 2.51999 6.48001 6.957 6.00305 2.27701 6.00308 
-2.99692 5.04001 2.51999 2.043 2.043 0 ]xsh
-225.375 157.007 mo
-(DefaultCMYK)
-[6.48 5.04001 2.51999 5.04001 5.03999 2.043 2.52 6.47998 7.31696 5.87708 0 ]xsh
-282.255 157.007 mo
-(Profile)
-[6.00308 2.99692 5.04001 2.51999 2.043 2.043 0 ]xsh
-232.872 73.253 mo
-(Proofing Profile)
-[6.00307 2.99693 5.03999 5.03999 2.52 2.04301 5.03998 5.04001 2.16 6.00305 2.99695 5.03998 
-2.52002 2.043 2.043 0 ]xsh
-/KUDFOF+ArialMT*1 uf
-/KUDFOF+ArialMT uf
-/ArialMT uf
-222 43.5 mo
-311.375 43.5 li
-311.375 60.5 li
-222 60.5 li
-cp
-@
-222 145.5 mo
-311.375 145.5 li
-311.375 162.625 li
-222 162.625 li
-cp
-@
-222 128.25 mo
-311.375 128.25 li
-311.375 145 li
-222 145 li
-cp
-@
-222 94.375 mo
-311.375 94.375 li
-311.375 111.125 li
-222 111.125 li
-cp
-@
-222 77.375 mo
-311.375 77.375 li
-311.375 94.375 li
-222 94.375 li
-cp
-@
-222 60.5 mo
-311.375 60.5 li
-311.375 77.375 li
-222 77.375 li
-cp
-@
-%ADOBeginSubsetFont: Arial-BoldMT Initial
-ct_T42Dict begin
--0.625 -0.375 2 1.008
- 256 array 0 1 255 {1 index exch /.notdef put} for  /Arial-BoldMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f32115d5e9f000000cc000000606376
-7420fb3ea3da0000012c0000075a6670676d08e8ba2800000888000005d7
-676c79664fc39cd400009edc0007c44c68656164d65e5fe200000e600000
-003668686561127e15fe00000e9800000024686d7478d62bc37500000ebc
-000034d46c6f636132ab8c4800004390000034d86d61787014dc04760000
-7868000000206e616d65ae0c9081000078880000147d70726570f14ae516
-00008d08000011d267646972000000000000000000000000000303d402bc
-00050008059a05330000011b059a0533000003d1006602120805020b0704
-020202020204e0002affc00078430000000900000000544d432000200020
-fffc05d3fe510133073e01b2400001ffffff0000042605ba000000200004
-05ba001c05ba001c05a7001c0426001c0000ffe40000ffe40000ffe4fe69
-ffe405ba001cfe69ffe402ea0000011d0000011d000000000000000000b2
-00ac00d70128012000b301fa001700f8011901310049000400f7000300af
-00fd00950014005400960112002400160055004901040119012b008c019b
-ff76ffe9003d009200a2ffb70182ffaa0016008f00c600f8001c00de0401
-0037004e00550055006500e903e50059ff9a00080087000b003b00520116
-006100d600d600f500000093009400be017cfff80004001400820092003c
-00410041ffc1fffc002a008c049005d809b5009100bb0106ff63ff69001e
-0022008a022bffd6ffdf0026005900a300ac0104012b01c004480021006b
-00850098011903c6006b009500a400fe010c025d034305bf000000490056
-006e0077008a00aa00ca0112015005d805f0ff7bffe70006001300280061
-006900e90135014d02a5040cff3effda005b00b900c801190119011901c0
-045b04a7055bfe3fff9dffc2001500b7010a01bc01c10532058efd81ffa1
-ffae000c00260031003d004e00560062008300c100c900f100f2027fff7f
-00480053007700c5011d01200126012801d60219027e027e03d3002e0041
-005d006b0075009f00b000b200ba00bb00bd00d600db00e000e50114011b
-014a0162019101f2020c026402cf039b03b403d4040104a9001600230025
-002a007400a500b600cc00cd00cf0105012001300150016a016f0197019d
-01e002b002ec02f70408048304fb04fd0526fee0fefbff4efff50018001a
-004c007a007f009100a300b300b400ce00d500f200f300f6011001380168
-01a101b001e001ec02090222024f0270029602a502ad034e039103c10435
-0442046b04cd04da0586058b076107fefca6fe93feadfed1ffb7ffd10003
-000e00180026004600690081008f00a500bf00d300d500d900dd00e20119
-012b0138013b015a015e016801730188019401ad01c501d101ea01f20200
-020002000222023b0244024f026f0272027e02820293029402a502cf02cf
-02d002da02dd02eb02f5030503220336037103a103b003b803d003e60410
-0426042e0431044f045a04ff053205320547055305a805ab05c205f0063c
-0664067006e80782078408ccfd2afddefe00fe68feb0feb3ffaa00080059
-007a0091009e00a200af00b400bb00ca00cc00ce00d900e000f40114011a
-01210127012b01390146014b014d0157015c01650182018701920198019b
-01a201ae01c501c501d102070222022b024102530261026502840287028d
-02b402b402ba02c902d602d802ed02f503170323032b03310349035a035b
-036e03710374037e03840391039103aa03cf03d303e703e803ed04080417
-041e0475047a049904a704b404d1054c056d056d05a205bf05c005d105fc
-05fc0602061a061c062f066a06a806e2070607360750078907d407f30870
-011c012a011a01200000000000000000000000000219000b001e02aa0214
-047f01ed0000001d0104000f0091002b01880153011201f3003f03fe0168
-010e047f01ed036e03150219041300000000064004b00000027401bb0035
-01c5007f06020301000004e000b201dc02e004c3023d00d50160011904a7
-036e05ca022100ab0426009002bc02bb014200b4023c0256029c030001e5
-01a800e5006b00780094016b017300ab01ed013a017d0137017f00d40216
-03530184003cffa202040109014901f0006e031500810464005e00000000
-0000000000000000000000000000000000000000000000000000013900dc
-00e9fe9e040d047c012b00b80096005900ac00df01a900fa0105ffec0017
-0003005500610004008c00a3008500280120005d00d6007f012601190104
-016c06cf00b4010600000737063e047a00f000f900e905ba042604420000
-ffe7fe69049e04e3ff37ff2d01200105012000a800740068004700f200e5
-00d900bd00a800680047005c0048000a0028003200410050005a0064007d
-00870091ffb0ff9cff83ff79ff6f00cb012000fa012c01fa01a000d500b8
-005c003c00c800c8008f00d9018b00b30047000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000fe6400c000ea01180125013203b003ed0576
-059005aa05b405be05cd063100780084009b00cc00e200f4010a01200163
-00d100ea00f7010801420019002c00340041003800480058006c025903bd
-0043011a007000d30028003700420050005a0064007300780082008c009c
-00a500bd00ce00f00110015c00be00d801020117012c016300ea01080041
-004b0055005f007300a60109018301b300410064001e002a00eb00fa010e
-01380274002c00400082009600b600c000cc00dc00e600f000ff010a0120
-012c013b01440156016300f70057006401100136005001b10000ffb60039
-004e004403cc00e5002401100042012201a400f0006000e0000e001d0039
-05e30102002cfe4eff38026903bd011600ff000e00a00054001b003d0171
-0041000f005000fd0015014f0035fe52002c00d3010304b001d200b600c0
-00990265ff870377fe6c00cb00a9005c0040047607440000404154403f3e
-3d3c3b3a3938373534333231302f2e2d2c2b2a292827262524232221201f
-1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201
-002c4523466020b02660b004262348482d2c452346236120b02661b00426
-2348482d2c45234660b0206120b04660b004262348482d2c4523462361b0
-206020b02661b02061b004262348482d2c45234660b0406120b06660b004
-262348482d2c4523462361b0406020b02661b04061b004262348482d2c01
-10203c003c2d2c20452320b0cd442320b8015a51582320b08d44235920b0
-ed51582320b04d44235920b09051582320b00d44235921212d2c20204518
-684420b001602045b04676688a4560442d2c01b10b0a432343650a2d2c00
-b10a0b4323430b2d2c00b0172370b101173e01b0172370b10217453ab102
-00080d2d2c45b01a234445b01923442d2c2045b00325456164b050515845
-441b2121592d2cb00143632362b0002342b00f2b2d2c2045b0004360442d
-2c01b00643b00743650a2d2c2069b04061b0008b20b12cc08a8cb8100062
-602b0c642364615c58b00361592d2c45b0112bb0172344b0177ae4182d2c
-45b0112bb01723442d2cb01243588745b0112bb0172344b0177ae41b038a
-45186920b01723448a8a8720b0c05158b0112bb0172344b0177ae41b21b0
-177ae45959182d2c2d2cb0022546608a46b040618c482d2c4b53205c58b0
-02855958b00185592d2c20b0032545b019234445b01a23444565234520b0
-0325606a20b009234223688a6a606120b01a8ab000527921b21a1a40b9ff
-e0001a45208a54582321b03f1b235961441cb114008a5279b31940201945
-208a54582321b03f1b235961442d2cb110114323430b2d2cb10e0f432343
-0b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2cb10e0f432343650b
-2d2cb11011432343650b2d2c4b525845441b2121592d2c0120b003252349
-b04060b0206320b000525823b002253823b002256538008a63381b212121
-212159012d2c4bb06451584569b00943608a103a1b212121592d2c01b005
-251023208af500b0016023edec2d2c01b005251023208af500b0016123ed
-ec2d2c01b0062510f500edec2d2c20b001600110203c003c2d2c20b00161
-0110203c003c2d2cb02b2bb02a2a2d2c00b00743b006430b2d2c3eb02a2a
-2d2c352d2c76b8023623701020b802364520b0005058b00161593a2f182d
-2c21210c6423648bb84000622d2c21b08051580c6423648bb82000621bb2
-00402f2b59b002602d2c21b0c051580c6423648bb81555621bb200802f2b
-59b002602d2c0c6423648bb84000626023212d2cb4000100000015b00826
-b00826b00826b008260f10161345683ab001162d2cb4000100000015b008
-26b00826b00826b008260f1016134568653ab001162d2c4b53234b515a58
-20458a60441b2121592d2c4b545820458a60441b2121592d2c4b53234b51
-5a58381b2121592d2c4b5458381b2121592d2cb0134358031b02592d2cb0
-134358021b03592d2c4b54b012435c5a58381b2121592d2cb012435c580c
-b00425b00425060c6423646164b0035158b00425b00425012046b0106048
-2046b0106048590a21211b2121592d2cb012435c580cb00425b00425060c
-6423646164b807085158b00425b00425012046b8fff060482046b8fff060
-48590a21211b2121592d2c4b53234b515a58b03a2b1b2121592d2c4b5323
-4b515a58b03b2b1b2121592d2c4b53234b515ab012435c5a58381b212159
-2d2c0c8a034b54b00426024b545a8a8a0ab012435c5a58381b2121592d2c
-462346608a8a462320468a608a61b8ff8062232010238ab902a702a78a70
-456020b0005058b00161b8ffba8b1bb0468c59b0106068013a2d2cb10200
-42b123018851b1400188535a58b910000020885458b202010243604259b1
-2401885158b920000040885458b202020243604259b12401885458b20220
-02436042004b014b5258b2020802436042591bb940000080885458b20204
-0243604259b94000008063b80100885458b202080243604259b940000100
-63b80200885458b2021002436042595959592d00000100000005028f9f18
-7df95f0f3cf50819080000000000a2e33c1d00000000c14fd725fafafcfd
-1000081500010009000100010000000000010000073efe4e00431000fafa
-fa7a1000000100000000000000000000000000000d350600010000000000
-023900000239000002aa00b803cb00700473001204730046071d005905c7
-005a01e7005c02aa006b02aa0043031d001c04ac00550239007502aa0073
-023900930239fffd04730056047300a2047300330473004d047300260473
-005b0473005704730057047300530473004102aa00c902aa00aa04ac005f
-04ac005504ac005f04e3006a07cd003d05c7000005c7009605c7006105c7
-00940556009504e300970639006205c700960239008c0473002305c70099
-04e3009d06aa009105c7009806390059055600950639005905c700960556
-004a04e3002c05c700930556ffff078d0007055600000556fffd04e30016
-02aa00920239fffd02aa002604ac00730473ffed02aa002a0473004904e3
-00870473005504e300540473004102aa001804e3005404e3009202390093
-0239ffa20473008902390093071d007e04e3009104e3005204e3008b04e3
-005b031d00870473003002aa001f04e3008d0473000b063900090473000c
-0473000e04000022031d003c023d00b0031d002d04ac004305c7000005c7
-000005c700610556009505c700980639005905c700930473004904730049
-047300490473004904730049047300490473005504730041047300410473
-004104730041023900920239ffe90239ffcd0239ffd004e3009104e30052
-04e3005204e3005204e3005204e3005204e3008d04e3008d04e3008d04e3
-008d0473004403330056047300540473000d0473003b02cd00420473fffe
-04e3008b05e5fff705e5fff7080000d802aa00bb02aa0005046400310800
-ffaa0639003f05b40098046400320464003c0464003c04730001049c006f
-03f4002c05b4007a069600a1046400000231000002f6002502ec001a0625
-0037071d005804e3005704e3006502aa00c304ac0055046400540473ffec
-0464001f04e5001a047300600473006a080000c905c7000005c700000639
-005908000048078d00580473fffc08000000040000840400006902390098
-023900720464003103f4002f0473000e0556fff70156fea90473ffe002aa
-004b02aa004b04e3001f04e3001f04730044023900930239007504000071
-0800000105c700000556009505c7000005560095055600950239006a0239
-ffae0239ffbf0239ffc106390059063900590639005905c7009305c70093
-05c700930239009302aa000302aafff302aa001302aa001a02aa00cd02aa
-009102aa002602aa006002aa003902aa000304e3000a0239000a0556004a
-0473003004e3001604000022023d00b005c7fffd04e300530556fff70473
-000e0556009504e3008b04ac005504ac006d02aa005b02aa001902aa0028
-06ac005c06ac005c06ac0028047300000639006204e300540239008c0556
-004a0473003005c700610473005505c700610473005504e30054046bffed
-02aa00c805c700000473004905c700000473004905c7009405c0005105c7
-fffd0556009504730041055600950473004104e3009d0239007904e3009d
-0315009504e3009a03d5009005c7009804e3009105c7009804e300910639
-005904e3005205c70096031d008705c70096031d00500556004a04730030
-04e3002c02aa001f04e3002c03d5001e05c7009304e3008d05c7009304e3
-008d04e300160400002204e300160400002204cf009a0639005606910056
-04eb004e04da004e03cc004e0579004e0392003005b9004e046bffed04d5
-00b8032b004f08c000290800004f040000990800004f040000990800004f
-040000980400009807d5016a05c7008f04ab005504d5009d04ac005504d5
-022204d5010505abffe9050001c905ab027e05abffe905ab027e05abffe9
-05ab027e05abffe905abffe905abffe905abffe905abffe905ab01c005ab
-027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab01c0
-05ab01c005abffe905abffe905abffe905ab027e05ab01c005ab01c005ab
-ffe905abffe905abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905ab02d605ab006605abffea05d5ffff04d500920800000007eb0130
-07eb012007eb013007eb012004d500b204d5008004d5002a082b0198086b
-01b807550010060000f40600006f0440003a0540003704c0003f04150040
-04000025060000550647008c0473009005abffc701eb008d03d500860715
-002303e9001804d5009202d6005c02d6005c04d500b202d6004d05c70000
-0473004905c700610473005505c700610473005505560095047300410556
-00950473004105560095047300410639006204e300540639006204e30054
-0639006204e3005405c7009604e3009205c7000504e300190239ffba0239
-ffbb0239ffda0239ffda0239ffe10239ffe2023900480239004704730023
-0239ffa205c70099047300890473008d04e3009d0239ffed05c7009804e3
-009105c9009c04e3008e0639005904e300520639005904e3005205c70096
-031d002a0556004a0473003004e3002c02aa000705c7009304e3008d05c7
-009304e3008d05c7009304e3008d05c7009304e3008d078d000706390009
-0556fffd0473000e0239008d05c70000047300490800ffaa071d00580639
-003f04e3005702aa00c9078d000706390009078d000706390009078d0007
-063900090556fffd0473000e0239009502aaffd70473000d04cd005a06ac
-005c06ac002906ac003006ac002f02aa00bc02aa002602aa00bb03b8fff4
-05c7ffe806d3ffbb073fffbb03caffbb0699ffa6076bffc806b4ff9c0239
-ff2905c7000005c7009605c000000556009504e3001605c700960239008c
-05c700990556000006aa009105c70098052600660639005905c7009a0556
-009504cd005a04e3002c0556fffd0556000006790056066a00620239ffcc
-0556ffff04eb004e039c004e04e3008e0239008204a8006c04e200900473
-000f03af004e04e3008e0453004e023900930476008e0473000f04e50090
-0473000b0390004e04e3005204f300760429004e04a80076049b00110607
-007606c2004e0239ffcd04a8007604e3004e04a8007606c2004e055a0097
-0715002f048900a405b100580556004a0239008c0235ffca0473002308c0
-001a0880009d0700003704e2009a04fa000005c0009905c7000005c0009b
-05c70096048900a405b3fffa05560095073b00170503002c05c0009905c0
-009904e2009a059d002006aa009105c700960639005905c0009905560095
-05c7006104e3002c04fa000006d400590556000005d8009a059f007d080a
-009a0827009a06f5001a07d5009d05c0009b05b100570840009605c00004
-0473004904f1005c04eb0096035500880514fff90473004105acffff03fa
-001804eb008c04eb008c040100880515001905eb009b04d5008804e30052
-04d5008804e3008b0473005503eb00150473000e070000540473000c04eb
-008904a5007206ab008c06c0008d05d5002806d5009504eb0099046b0038
-06d5009104abfffb0473004504e3000003550088046b0051047300300239
-00930240ffd00239ffa207c000180740008c04e300000401008804730012
-04d5008803e50096039300880800004108eb00a306200030000001010000
-001e0000003100000031000001010000007f0000007e0000008c0000008c
-000001010000001000000101000001210393007d0000008c026500c80000
-03020000ff0102aa00c904a90059049b004103a7000a0466003204ea0082
-022f0087034e005a04ed00870503007d022f0087042c002803ed004b03f8
-004104e30087050a0037022f00870316004b04e800500459000a04c00064
-04b2006403ff000a0418000a04950082042c002805b8005a0563002d045e
-0087045e0087045e00870236005004090050068b0087022fffac042c0028
-042c002803f8ff1603f8ff160479003205b8005a05b8005a05b8005a05b8
-005a04a9005904a9005904a90059049b004103a2000a0466003204ea0082
-02950000038100000503007d02950000042c002803ed004b03f80041050a
-00370316004b04e8005004c0006404b200640418000a04950082042c0028
-05b8005a0563002d022f0087049b004103ed004b04b2006404db00410000
-ffdc0000ff250000ffdc0000fe51028d00ab028d00a002da004303c0007e
-0196ffba0000004600000046000000460000004600000048000000460000
-004600000046047e0188047e0150047e0104047e009e047e012d047e00ea
-047e00d5047e009c047e00bc047e00ee04350085028d00c1043500b30600
-01000600010002be005806000100047e00a5047e00bd047e00de06000100
-060001000600010006000100060001000000004606000100060001000600
-0100060001000600010006000100060001000600010004e6ffba06000100
-06000100060001000532003905320039022cffba022cffba060001000600
-01000600010006000100049e0034047800300430ffba0430ffba0376000a
-0376000a060e00290708002902e2ffba0456ffba060e00290708002902e2
-ffba0456ffba05280097046f000a03520003060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100000000300000004600000046
-000000400000004606000100060001000000ffdc0000fe510000ff160000
-ff160000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ffdc0000ff160000ffdc0000ff200000ffdc0473002d080000000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d007f028d00670600
-010005a0002e03c0007e01e800000207ffc301bc005e01e0fffa039c0006
-039c000601bc005e01e0001a05280097049e0011022cffba022cffba01bc
-008801e0001a0532003905320039022cffba022cffba02be003603520003
-0532003905320039022cffba022cffba0532003c0532003c022cffba022c
-ffba049e0034047800300430ffba0430ffba049e0034047800300430ffba
-0430ffba049e0034047800300430ffba0430ffba02be006902be006902be
-006902be00690376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba073200400732004004deffba04deffba088000400880
-0040062cffba062cffba0880004008800040062cffba062cffba0430ffba
-0430ffba0430ffba0430ffba0430ffba0430ffba0430ffba0430ffba0454
-003403c000460454ffba02e2ffba0454003403c000460454ffba02e2ffba
-0610002f0610002f0270ffba0298ffba04e6002704e600270270ffba0298
-ffba045400290454002902e2ffba02e2ffba039c0023039c002301e0ffba
-01e0ffba02e2002102e200210352ffba0352ffba0454003e0454003e022c
-ffba022cffba02be00580352000303c0ffba039cffba039c0006039c0006
-05280097046f000a05280097049e0011022cffba022cffba0454000004c4
-000003e400220454001a03e400220454001a03e400220454001a06000100
-060001000000004600000046060001000600010006000100000000460000
-004606000100060001000000004800000046060001000600010006000100
-000000460000004600000046000000460000004000000030060001000000
-004600000046060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100028d00ca028d00c7028d00c6060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010002be0069
-0100ffba0800ffba1000ffbb06d3005905b0005206a3009305cb008d0000
-fd880000fbc10000fc5f0000fe310000fcad0000fd550000fe260000fdf1
-0000fd180000fc690000fd950000fbe00000fc700000fed40000fecd0000
-fea0041b007806ac005c06ac00190000fe450000fd550000fda60000fc5f
-0000fe250000fd180000fbe00000fafa0000fb360000fc700000fb870000
-fb9b0000fcce0000fc540000fbc30000fc940000fbf50000fdb00000fe59
-0000fd7e0000fc820000fd340000fe500000fe460000fcd10000fd3e0000
-fd020000fc3a0000fce90000fc260000fc070000fc2f0000fb9e0000fb76
-0239009305c700000473004905c700000473004905c700000473004905c7
-00000473004905c700000473004905c700000473004905c7000004730049
-05c700000473004905c700000473004905c700000473004905c700000473
-004905c70000047300490556009504730041055600950473004105560095
-047300410556009504730041055600950473004105560095047300410556
-00950473004105560095047300410239006a0239005d0239008c02390093
-0639005904e300520639005904e300520639005904e300520639005904e3
-00520639005904e300520639005904e300520639005904e3005206d30059
-05b0005206d3005905b0005206d3005905b0005206d3005905b0005206d3
-005905b0005205c7009304e3008d05c7009304e3008d06a3009305cb008d
-06a3009305cb008d06a3009305cb008d06a3009305cb008d06a3009305cb
-008d0556fffd0473000e0556fffd0473000e0556fffd0473000e05c70000
-047300490239ffca0239ffca0639005904e3005205c7009304e3008d05c7
-009304e3008d05c7009304e3008d05c7009304e3008d05c7009304e3008d
-0000fef90000fef90000fef40000feef0489fffd03550007073b001705ac
-ffff04e2009a0401008804e2009a0401008805c7009604d5008804730001
-047300120473000104730012055600000473000c059f007d04a50072059f
-009c04e3009205cf00590473004c0639005604e3005205320039022cffba
-0270ffba0298ffba04e60027022c0065022c0016022c0016022c0011022c
-0043022cffd20000fef00000000f0000fff502aa009002aa009000000000
-0000005e0000005e0000ffcb01bc000f01e0ffbf01bcfff501e0ffcd01bc
-001d01e0000901bc008801e0001a039c0006039c0006039c0006039c0006
-05280097046f000a0532003905320039022cffba022cffba053200390532
-0039022cffba022cffba0532003905320039022cffba022cffba05320039
-05320039022cffba022cffba0532003905320039022cffba022cffba0532
-003905320039022cffba022cffba0532003905320039022cffba022cffba
-049e0034047800300430ffba0430ffba049e0034047800300430ffba0430
-ffba049e0034047800300430ffba0430ffba049e0034047800300430ffba
-0430ffba049e0034047800300430ffba0430ffba049e0034047800300430
-ffba0430ffba02be004f02be004f02be006902be006902be006902be0069
-02be004f02be004f02be006602be006602be006902be006902be006902be
-006902be002f02be002f02be002202be00220376000a0376000a0376000a
-0376000a0376000a0376000a0376000a0376000a0376000a0376000a0376
-000a0376000a0376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba073200400732004004deffba04deffba073200400732
-004004deffba04deffba0880004008800040062cffba062cffba08800040
-08800040062cffba062cffba0430ffba0430ffba0454003403c000460454
-ffba02e2ffba0610002f0610002f0610002f0270ffba0298ffba0610002f
-0610002f0270ffba0298ffba0610002f0610002f0270ffba0298ffba0610
-002f0610002f0270ffba0298ffba0610002f0610002f0270ffba0298ffba
-04e6002704e6002704e6002704e60027093e0032093e00320740ffba0740
-ffba060e00290708002902e2ffba0456ffba045400290454002902e2ffba
-02e2ffba045400290454002902e2ffba02e2ffba045400290454002902e2
-ffba02e2ffba060e00290708002902e2ffba0456ffba060e002907080029
-02e2ffba0456ffba060e00290708002902e2ffba0456ffba060e00290708
-002902e2ffba0456ffba060e00290708002902e2ffba0456ffba039c0023
-039c002301e0ffba01e0ffba039c0023039c002301e0ffb101e0ffb1039c
-0023039c002301e0ffba01e0ffba039c0023039c002301e0ffba01e0ffba
-0454003e0454003e022cffba022cffba0454003e0454003e0454003e0454
-003e0454003e0454003e022cffba022cffba0454003e0454003e049e0034
-047800300430ffba0430ffba02be005803520003031a001a031a001a031a
-001a039c0006039c0006039c0006039c0006039c0006039c0006039c0006
-039c0006039c0006039c0006039c0006039c0006039c0006039c0006039c
-0006039c000605280042046fffd905280097046f000a022cffba022cffba
-039c0006039c000605280097046f000a022cffba022cffba05280097046f
-000a067f0044067f0045067f0044067f004501a800280000fe290000fe8c
-0000ff250000ff230000fefa0000ff7a0000fe5908fc003208ad00320000
-ffb50000ffb60000fef00000ff590000fe590000ff8c01b4000002f70000
-0000fe850000ff0704cd00320000ff580000ff580000ff59073200400732
-004004deffba04deffba0880004008800040062cffba062cffba04540034
-03c000460454ffba02e2ffba03c0007e02e2002102be0058022cffba0290
-ffba01f4002f01f4003b01f4001201f400b101f4006d060e002907080029
-022f00870000fec803500000045e008703e4fff50454fff503e400220454
-001a03e400220454001a03e400220454001a03e400220454001a03e40022
-0454001a03e400220454001a047e0072047e00bd03e4000f0454000f04e3
-001b06b1001e05c0009b04e3008705c0000a04e3000a05c7006905c70061
-0473005505c7fffd06b3001e05c0005c04e3005404da004e055600660503
-006f04e3ffac063900620518000207720092023900930239000705c70099
-047300890239001b0473000f07ef009605c7ffad04e3008e063900560718
-005905f300550641001e04e3008b05560095055600640473006304cd005a
-02e1001e02aa001f04e3001802aa001f04e3002d066a006205c700930629
-00000473000e04e300160400002204e3003a04e300590436002a04360039
-047300330473005b03fa001e04a2001f04e3008b023d00b003fb00b004ad
-005602aa00b80aaa009409c7009408e300540956009d071c009d04720093
-0a3a009808000098071c00910473004c05c70000047300490000fefe05c7
-0000047300490800ffaa071d00580639006204e300240639006204e30054
-05c70099047300890639005904e300520639005904e3005204e3003a0436
-00220239ffa20aaa009409c7009408e300540639006204e3005408430096
-0552009505c7009804e3009105c700000473004905c70000047300490556
-00950473004105560095047300410239ff370239ff2d0239fff40239ffe6
-0639005904e300520639005904e3005205c70096031dffcd05c70096031d
-008005c7009304e3006705c7009304e3008d0556004a0473003004e3002c
-02aa001f049e002e0429004905c7009604e30092059f009c050c0052050c
-005204e300160400002205c7000004730049055600950473004106390059
-04e300520000fefd0639005904e300520639005904e300520639005904e3
-00520556fffd0473000e0473004504e3005404e3008204e3008704730034
-0473001404e3005404e300540473004c0641004c03fa004f03fa00180587
-0018048a005202aaffc404e3005404e3005404b000520473000f04ce000f
-04e3008a04e3009204e300920239001b023900930239009302a8000002d9
-00140239009304d40093071d0085071d0085071d007e04e3ffa604e30091
-04eb008c04e3005206ab005206c2004e05ff0052031dffe6031dffe6031d
-ffe6031d0087031d0087031d0087031dffe604ab008a04ab008a04730030
-02aaffc402aaffc402aaff9b0451001e02aa001902aa001f04e3001b04f8
-004904a8009104730012063900090473000f0491000f0400002205700022
-0436002204360022047300420473005504730042047300550639005904eb
-0096048a004f04b0005204d5008803ab001e04730014039e008804e3005b
-0473004204730055083f00540789005409af00540682001f0446001f0698
-001f06f4001806350093058a00930445001e0482008802f1003202f10032
-018effe202040032020400000204000003000032042f000002e2000001e7
-005c03cb007002390098023900750239009402aa00f302aa00f303000032
-0300003204ac005f04ac005f04ac002a04ac002a02aa012102aa00bb02aa
-002a02aa012102aa001302aa002a02aa00bb02aa00ca02aa00ca02aa00f3
-02aa00f302aa00a602aa00a602aa00a602aa001302aaffe102aafffb02ed
-0000012100320302003202ee000003000032031000960310009603100096
-031000960310009602aa006202aa006202aa000302aa001d040000690457
-009604570096045700960457009604570043045700430457004304570043
-04570043031000430457002f0457002f0457002f0457002f0457002f0310
-002f04570025045700250457002504570025045700250310002f0457001a
-0457001a0457001a0457001a0457001a0310001a04570042045700420457
-004204570042045700420310004204570096045700960457009604570096
-0457004204570042045700420457004204570042031000420457002f0457
-002f0457002f0457002f0457002f0310002f0457002f0457002f0457002f
-0457002f0457002f0310002f045700260457002604570026045700260457
-002603100026045700420457004204570042045700420457004203100042
-045700960457009604570096045700960457004204570042045700420457
-004204570042031000420457002604570026045700260457002604570026
-031000260457002304570023045700230457002304570023031000230457
-002f0457002f0457002f0457002f0457002f0310002f0457004b0457004b
-0457004b0457004b0457004b0310004b0457009604570096045700960457
-00960457004204570042045700420457004204570042031000420457001a
-0457001a0457001a0457001a0457001a0310001a04570024045700240457
-00240457002404570024031000240457002f0457002f0457002f0457002f
-0457002f0310002f0457004e0457004e0457004e0457004e0457004e0310
-004e045700960457009604570096045700960000feaf0000febf0000fdb5
-0000fec80000ff780000feb10000ff3d0000fe6f0000feae0000ffce0000
-ff660000fe6f0000fec80000fec80000ff680000ff680000ff6800000000
-0000ff1f0000ff1f0000ff440000ff5f0000fe870000ffec0000ff9c0000
-ff510000ff510000ff510000febf0000ff15000000000000feb10000ff3d
-0000ff6b0000fef20000ff470000ffce0000fe870000febb0000feae0000
-feae0000fec80000fec80000fea60000febf0000fdb70000fdb90000fea6
-0000febf0000fdb50000fe1f0000fee20000ff9c0000fe870000ff440000
-feba0000ff230000ff9a0000fdb90000fe3b000000000000fea70000ff68
-0000fe170000ff740000fe870000fdb90000ff660000ff440000fea70000
-fea70000fea70000ff030000ff520000fd1f0000ff530000ff530000ff53
-0000feb10000feb00000ffa10000fe8c0000feb80000feaf0000fea20000
-feba0000fdf40000ff190000ff2d0000fe8c0000fe8802aa00bb02aa002a
-02aa00c804e2009004a8007606290000080200000629000005ff005206c2
-004e056900140639005904e3005205c700610473005504e30097039e0088
-06030000043c001d066f000a04e2000a07ef0096071d0085059f007d04e3
-008a059f009c04d7000a05560064055600640524001404d4000a05e10055
-04a0004b040e0014038400280569001404f1005c047300550239ffa20639
-005603d4005103d400510556009505c000990473004104eb008c0a3d0059
-063a001406f4001a059f001b07ce008c065e0093055600000473000b0768
-008c066700930679005606070076089e008c07d800930503004603fa0043
-06790056060700760639005604e300520685ffff052c000b0685ffff052c
-000b0b3a005909bd005206840055051a004b0a3d0059073500550000fe37
-0a3d0059063a001405c700610473005504ac000f0000fea60000feb10000
-feaa0000fead0000fc2b0000fc4c05c0009904eb008c05c0001104eb001b
-0556009504e3008b059f009c04c900880503002c03fa001804e200110401
-000d0617001a04fc00280709009605b6008809020099075f008805c70061
-049f005505c700610473005504e3002d03eb001506d2002c05830015059f
-007d04a5007206da000a056d000a06da000a056d000a0239008c073b0017
-05acffff059d009a04c80088059d00200515001905c7009604d5008805c7
-009604d50088059f007d04a5007206aa009105eb009b02aa001a05c70000
-0473004905c70000047300490800ffaa071d0058055600950473004105cf
-00590473004c073b001705acffff0503002c03fa00180503002c04360022
-05c0009904eb008c05c0009904eb008c0639005904e300520639005604e3
-005205b10057046b003804fa00000473000e04fa00000473000e04fa0000
-0473000e059f007d04a5007207d5009d06d5009505c0005e04e30054083e
-005e077a005407ad004606c4004305430046044a0043081a002007a50019
-08430096076600880639006204b000520620002d059b00150000ff430000
-fec90000ff770000ffb00000ff470000ff560000ff740000fed70000feac
-000000000000ff520000ff56000000000000feac0000fd9a000000000000
-ff6a0000ff7c0000ff690000ff560000feac0000ff7f0000ff560000fdef
-0000ff430000ff690000ff7c000000000000fdae0000ff8c000001020000
-feef0000feef0000fefd0000fef90000ff530000fef80000fef905c70000
-0473004905c7009604e3008705c7009604e3008705c7009604e3008705c7
-00610473005505c7009404e3005405c7009404e3005405c7009404e30054
-05c7009404e3005405c7009404e300540556009504730041055600950473
-004105560095047300410556009504730041055600950473004104e30097
-02aa00180639006204e3005405c7009604e3009205c7009604e3009205c7
-009604e3009205c7004e04e3003b05c7009604e300920239ffd20239ffd2
-0239001b0239ffce05c700990473008905c700990473008905c700990473
-008904e3009d0239009304e3009d0239ffeb04e3009d0239ffdd04e3009d
-0239ffcb06aa0091071d007e06aa0091071d007e06aa0091071d007e05c7
-009804e3009105c7009804e3009105c7009804e3009105c7009804e30091
-0639005904e300520639005904e300520639005904e300520639005904e3
-00520556009504e3008b0556009504e3008b05c70096031d008705c70096
-031d008705c70096031d008705c70096031d00590556004a047300300556
-004a047300300556004a047300300556004a047300300556004a04730030
-04e3002c02aa001f04e3002c02aa001f04e3002c02aa001f04e3002c02aa
-001f05c7009304e3008d05c7009304e3008d05c7009304e3008d05c70093
-04e3008d05c7009304e3008d0556ffff0473000b0556ffff0473000b078d
-000706390009078d000706390009055600000473000c055600000473000c
-0556fffd0473000e04e300160400002204e300160400002204e300160400
-002204e3009202aaffde063900090473000e047300490239008d04eb004e
-04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e05c7
-000005c7000006f3fff206f3000006f3fff206f3000006f3004306f30043
-03cc004e03cc004e03cc004e03cc004e03cc004e03cc004e061efff2061e
-000007aefff207ae000007aefff207ae000004e3008e04e3008e04e3008e
-04e3008e04e3008e04e3008e04e3008e04e3008e068ffff2068f0000081f
-fff2081f0000081ffff2081f0000081f0014081f00140239009002390090
-0239ffb60239ffc40239ffde0239ffec0239ffb30239ffc00301fff20301
-00000491fff2049100000491fff204910000049100140491001404e30052
-04e3005204e3005204e3005204e3005204e30052069dfff2069d00000855
-fff20855000007c9fff207c9000004a8007604a8007604a8007604a80076
-04a8007604a8007604a8007604a800760682000007fe00000862000007ae
-fff306c2004e06c2004e06c2004e06c2004e06c2004e06c2004e06c2004e
-06c2004e06cefff206ce00000886fff20886000007fafff207fa000007fa
-fff307fafff304eb004e04eb004e03cc004e03cc004e04e3008e04e3008e
-0239ffe70239008d04e3005204e3005204a8007604a8007606c2004e06c2
-004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e
-04eb004e05c7000005c7000006f3fff206f3000006f3fff206f3000006f3
-004306f3004304e3008c04e3008c04e3008c04e3008c04e3008c04e3008c
-04e3008c04e3008c068ffff2068f0000081ffff2081f0000081ffff2081f
-0000081ffff3081ffff306c2004e06c2004e06c2004e06c2004e06c2004e
-06c2004e06c2004e06c2004e06cefff206ce00000886fff20886000007fa
-fff207fa000007fafff307fafff304eb004e04eb004e04eb004e04eb004e
-04eb004e04eb004e04eb004e05c7000005c7000005c7ffd105c7ffdd05c7
-000002aa00dc02aa00ca02aa00dc02aafff302aafff304e3008c04e3008c
-04e3008c04e3008e04e3008c06e6000006e60000075700000757000005c7
-009602aafff202aafff202aafff30239ffe50239ffdb0239ffce0239ffce
-0239ffc20239ffbb0239ffe80239ffde03c9000003c9000002aa000002aa
-000002aafff304a8007604a8007604a8007604a8007604f3007604f30076
-04a8007604a800760556fffd0556fffd06e6ffd8074affdd061e000003b8
-fff403b8fff402aa002a06c2004e06c2004e06c2004e06c2004e06c2004e
-0765ffd1069dffdd0796ffd106ceffdd066a006202aa00bb02aa00dc0473
-000a05c7006105c70061071d007e05c7002109cd0096078d000705c70020
-04e3002d08b000140400003004c100660000ff530000ff530000ff530000
-ff530239001b0239ffa2047300000556001206b3005403fe005706ab0091
-040c001f05d6ffe605d6ffe602aa008402aa008402aa00c902aa00c902aa
-009102aa002a02aaffc502aaffc302aafff302aa00c902aa00a902aa00a9
-02aa00a902aa00a9032e001e032e001e02aa003a0000ff730000ff9d0000
-fec80000ff230000ff720000ff720000fee70000ff9d0000ff530000ff53
-0000ff530556009504e3008b04b5000006350000071d006104eb000f0473
-0055049900910499001b0401008c03fa001802390093040f00490476008e
-039e000e05eb009b04eb008c04e300520473003404f1005204f1005204f1
-0021078d00540492004b04e3005304e3005304e9008c04abfffb04abfffb
-03eb001504a8007604e300510624005104e000510473000b063900090400
-002203df002203f2004b04ec0014035500880473001204d5008804e9008c
-060700760515001903e300000591000003a2003203a2000003a300320355
-00320355003204030032037c00320172005502de003203b00032031e0032
-04220032037700320378003204260032037a0032035b003203ac00320377
-0032037b00320514000003050032030500320321003204b6003203210032
-03210032030200320302003202cf003202cf0032032000320121003202ca
-00320484003402f2003203480032030a0032034900320349003203200032
-01bc000a02f20032034200320484003202e90000034c000a031b003202e9
-00000343003203da003203080000012100320204003202f2003202e90000
-031b003202e900000342003203da00320308000005ed00460a9800460613
-00460689ffba0541ffba01e9001e045400100000ff0d0000ff350000fece
-0000feb70000fec90000ffc70000ff4f0000ff9e0000fef002be006902be
-00690376000a0376000a03c0ffba039cffba03c0ffba039cffba05c80039
-05920032061600820519004b05240041060f008705580028068f002d04ac
-00550000fe3b0000fe660000fe680473fffc0400008403d5ffba01e0ffba
-01e0ffb101e0ffba01e0ffba06d0002e0984002304000000080000000400
-00000800000002ab000002000000015500000473000002390000019a0000
-00ab00000000000005e5fff705c7006106aa009105eb009b0760008d07a1
-005407a1005b05c7000005c700610473001404e3001104e3002c04730039
-0400002205290042000001010000ff420000fead0000ff3a0000ff5304f3
-000a05c7006905c7006105c70069048900a4035500880000ff430000ff01
-0000ffac0316007d0000ff370298ffba033d001e0000ff3a0000ff480000
-ff490000ff7e0000ff4f0000ff4a0000fe9e0532003905320039022cffb6
-022cffb60532003c0532003c022cffba022cffba0532003905320039022c
-ffba022cffba0532003905320039022cffba022cffba0532003905320039
-022cffba022cffba0532003905320039022cffba022cffba053200390532
-0039022cffba022cffba049e0034047800300430ffba0430ffba049e0034
-047800300430ffba0430ffba02be004f02be004f02be006902be00690376
-000a0376000a073200400732004004deffba04deffba0454003403c00046
-0454ffba02e2ffba0454003403c000460454ffba02e2ffba0454003403c0
-00460454ffba02e2ffba0610002f0610002f0270ffba0298ffba0610002f
-0610002f0270ffba0298ffba060e00290708002902e2ffba0456ffba060e
-00290708002902e2ffba0456ffba060e00290708002902e2ffba0456ffba
-02e2002102e200210352ffba0352ffba02e2002102e200210352ffba0352
-ffba0454003e0454003e022cffba022cffba0454003e0454003e022cffba
-022cffba0454003e0454003e022cffba022cffba039c0023039c002301e0
-ffba01e0ffba0376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba04e3ffc104e3005402aafff3071dffc104e3ffd504e3
-ffc5031dffc1031dffc10473ffff02aaffda0400002104e3008302f00032
-04dc004e06fb001f0239001b0239001b04e3001404a8001404f8001404e3
-008704e3005402aa0018062500540473008902390070071d007e04e30091
-04e3008b031d00660473003003baffc40473000b0473000c040000220473
-004904e3005404e300540473004103fa004f03fa0018053e005102390093
-0473003402aaffc404e3008d0436002203210032030a0032030a00060348
-003202cf003201f0000a01f000000320003202f100320174000a01210032
-012100320174000a02760000018e00320150003202490032048400340484
-0032035f0000035f003202fa003203480032040300320302003202390000
-01bc000a0340000a035e003202ea003202ea003202e9000002e4003202e4
-003203be0032030a003202e800320000fe920000fe920000ff730000fe9f
-02aa00c903050032030200320348003202ee0000030200320639006205c7
-00000556001e05c7006102aa004104eb004e04eb004e04eb004e04eb004e
-04eb004e04eb004e04eb004e04eb004e0239ffb60239ffb60239ffc40239
-ffc40239ffb60239ffb60239ffc40239ffc404a8007604a8007604a80076
-04a8007604a8007604a8007604a8007604a800760239ffc90239ffc90239
-ffc90239ffc904a8007604a8007604a8007604a8007603e400220454001a
-03df003005c7fffd05c70016055600000556009504730041047300230239
-ffa20633005904e3005b05c70000031d001b0556fffd0473000e04730034
-047300550473003402390093048900110355001b055600000473000c0556
-00000473000c0503006f03fa004f059d0020051500190000fec60000fed4
-0000fec60000fed40000fe5f0000fe5f0000ff720000ff730000fee70800
-00000401005d0473003404e300110239001b04e300060556fffd05c70096
-0473004902aaffcd05c7009604e3009205c700990473008904e300160400
-00220473002804540096037c008805b9004e0000ff530000ffbc0000fefe
-0000fefe0000fea40000fea402390093000000000000006c0000006c0000
-006c0000006c0000011a000001ba00000388000006300000079600000948
-000009a800000a3200000abc00000bf000000c6c00000cdc00000d2a0000
-0d6800000dbe00000ec200000f44000010ea000012420000135c000014ce
-00001602000016be0000185c000019a2000019fc00001a8800001b120000
-1b9400001c2200001d1000001ea40000201e00002186000022c0000023aa
-00002468000025040000264a0000271e000027a60000284400002a0e0000
-2a6a00002cbe00002ebc00002fc4000030940000322e00003392000035f2
-0000368800003768000038a200003ae400003c6000003d5600003ee80000
-3f5c00003fb000004018000040ca000040fe00004162000043700000446c
-000045a800004698000048a4000049a400004b8000004c8000004d220000
-4dfa00004f2600004f920000514600005230000053200000541c0000551e
-000056020000594800005a6800005b5000005ca400005f0a000060e00000
-625e000063ec000065140000657a000066b20000677a000067bc000067fc
-000068380000687e000068c6000069160000695a00006994000069c40000
-69f400006a3600006a7800006aaa00006aee00006b3a00006b8400006bb4
-00006bfa00006c3600006c7600006cb200006cea00006d3a00006d760000
-6db200006de200006e2400006e7400006ebe00006ef600006f3800006f6c
-00006fe40000706a000072160000738200007578000075c20000765c0000
-77aa0000799a00007b4e00007c6800007cca00007d2200007e0200007f34
-000080ac000081d40000829a0000837000008430000085d4000086900000
-877200008850000088b60000894a00008a0e00008b4a00008be200008d22
-00008fc40000914a00009250000092f00000934a0000942a000095d80000
-9744000097ee000098e2000099c800009a3c00009a7400009aba00009af8
-00009c7400009e8a00009ec400009efa00009fc20000a0960000a1060000
-a1240000a1c60000a2a00000a2dc0000a3160000a37c0000a5140000a5b2
-0000a6440000a7a00000a8ca0000a9b40000a9f20000aa020000aa200000
-ac2a0000ac6c0000acba0000acf60000ad360000ad840000adc20000ae00
-0000ae3a0000ae7c0000aeb40000aee40000af1e0000af620000af920000
-afda0000b03c0000b0a80000b1560000b18a0000b1fa0000b2400000b2f6
-0000b3900000b4240000b48c0000b4e80000b5bc0000b6880000b6b80000
-b6e80000b74c0000b7a20000b82a0000b9540000bacc0000bb020000bb32
-0000bc3a0000bd0e0000bd4a0000bee00000bf5e0000c06c0000c1a00000
-c34c0000c4da0000c7220000c7d80000c81c0000c85c0000c88e0000c8d2
-0000c90e0000c9520000c98c0000c9be0000c9f00000cb200000cb560000
-cb800000cbcc0000cc0e0000cc340000cc5a0000cc900000cdce0000cde6
-0000ce0c0000ce320000ce700000cea00000ced00000cf0e0000cfcc0000
-d07e0000d0b20000d0e80000d1240000d1620000d1b00000d1e20000d214
-0000d2500000d28c0000d2c80000d3040000d3360000d3660000d3960000
-d3bc0000d3e00000d41e0000d5920000d5d60000d60e0000d6460000d67c
-0000d6cc0000d70e0000d7540000d7a60000d7f20000d9040000da100000
-daf80000dbe80000dcee0000ddd80000de480000df720000dfc20000dff2
-0000e0ec0000e3200000e3600000e3a00000e3e00000e41e0000e47c0000
-e4da0000e5480000e5680000e6080000e6a20000e6d80000e73c0000e786
-0000e7d00000e7ec0000e8080000e8280000e8480000e8680000e8880000
-e8ae0000e8d40000e8fa0000e9200000e9500000e9780000e9a00000e9cc
-0000e9f80000ea2c0000ea560000ea820000eab80000eae20000eb0e0000
-eb440000eb6e0000eb980000ebcc0000ebfc0000ec300000ec740000eca4
-0000ecd80000ed1a0000ed4e0000ed800000edc20000edf60000ee260000
-ee680000eeac0000eef20000ef4e0000ef6a0000ef860000efa20000efbe
-0000efda0000f1480000f3f20000f6620000f67e0000f6980000f6b40000
-f6d00000f6ec0000f7080000f7640000f79e0000f8080000f8d20000f972
-0000fa480000fac80000fb500000fbc00000fc560000fcb40000fcfa0000
-fd580000fdba0000fdfa0000fe560000feba0000ff2c0000ff6a000100fc
-0001020c00010236000102520001027e000102b600010302000103320001
-036200010396000103c6000103f6000104260001045600010486000104b6
-000104e6000105160001054600010576000105a6000105d6000106060001
-07900001093e0001096e0001099e00010a8a00010ba200010bd200010c00
-00010c3000010c5e00010c8e00010cbc00010ce000010d0400010d3e0001
-0e1e00010e6e00010ed40001101a0001104c000110720001109a000110d8
-000111ae000112a6000112d6000113060001133600011366000113960001
-13c4000113f400011424000114e6000115fa0001162a0001165a0001168a
-000116ba000116ea0001171a000117400001176600011796000117c60001
-17f600011826000118c600011918000119e600011a1600011a4600011a76
-00011aa600011ad800011b0800011b3800011b6800011b9800011bcc0001
-1c0000011c3000011c6000011cbe00011ce800011e6e00011f560001210a
-0001235e0001259600012734000127940001281a0001282a000128ec0001
-2a9000012b6400012c3a00012cc600012dea00012efe00013070000130a6
-000130b6000130c6000131a0000131b0000131c0000131d0000131e00001
-31f0000132f60001330600013316000133c0000133d00001342200013432
-000135260001353600013546000135560001362800013742000137760001
-37aa000137da0001380a0001383a000138680001389c0001398600013a7c
-00013b5c00013c2600013ce600013d3800013e6a00013f7e000140420001
-40520001415e0001416e0001423800014316000143de000144fc000145c8
-000146c6000146f80001472c0001475c0001478c000147bc000147f00001
-48d20001490200014a2600014a3600014a4600014a7a00014a8a00014b90
-00014c7c00014d4a00014d7a00014daa00014e2a00014e3a00014ef00001
-4f0000014f5800014ff600015006000151e80001530c0001543200015462
-0001558c0001560400015614000156240001563400015688000156980001
-56a8000156b8000157b0000158ae000158be0001592a000159b800015a40
-00015ade00015b9c00015c8400015d3e00015e6800015f8e000160cc0001
-60dc00016202000162f00001634e0001641e0001642e0001661400016766
-0001684a0001687a0001699000016a1a00016bd400016c5a00016c6a0001
-6cd400016ce400016cf400016d5e00016d6e00016ec200016ed200016f5c
-00016fe80001707800017128000171e4000172e4000173a2000174a80001
-75b4000176e200017716000178520001788000017996000179a6000179b6
-000179e8000179f800017b0400017be800017ce600017d2000017d500001
-7df000017e4e00017ebe00017efa00018090000181140001819e000182e6
-000183a00001848a000184da000185620001862a00018668000186ba0001
-8716000188000001885400018892000188ca00018908000189560001899e
-000189e400018a4000018b9600018c3800018d4e00018dac00018e480001
-8e8600018f4000018fb6000190b4000190ee0001917800019234000192d6
-0001935c0001942800019466000194ee000195bc0001969a000197620001
-98700001992600019a3200019ae400019b6c00019c6c00019d5400019dac
-00019e0400019e5800019ea600019f3e0001a04a0001a08e0001a0cc0001
-a1140001a14a0001a1b40001a2940001a2cc0001a2fa0001a3320001a360
-0001a3920001a3c40001a43e0001a4940001a5f20001a6920001a7b00001
-a8600001a8ac0001aa020001aab20001aadc0001ab580001aba00001acd8
-0001add60001ae440001afc60001b1840001b2ea0001b3f80001b4220001
-b5b20001b6f00001b71c0001b7500001b77c0001b7ac0001b91a0001b944
-0001ba540001bb060001bbb60001bc4a0001bd180001be540001be640001
-be980001bf580001c1100001c1e80001c2520001c3780001c3d60001c4e8
-0001c5b60001c6420001c6c00001c79c0001c8dc0001c9d60001ca8c0001
-cb780001cc400001cd1e0001cdee0001cecc0001cf600001d18c0001d1b6
-0001d1e00001d1f00001d21a0001d3540001d4720001d5820001d5ac0001
-d5d60001d6000001d62a0001d6540001d8380001d8620001d88c0001d8b6
-0001d8e00001d90a0001d9340001d95e0001d9880001d9bc0001d9e60001
-da100001da3a0001dbd40001dbe40001dd1c0001dd2c0001dd560001dd80
-0001ddaa0001ddd40001df6e0001e1e80001e3460001e3560001e4c80001
-e4d80001e6360001e81a0001e91c0001eaa20001ec6c0001eec00001f02e
-0001f2220001f2320001f2420001f3a60001f3d00001f3fa0001f4240001
-f44e0001f4780001f4a20001f4cc0001f4f60001f5200001f54a0001f574
-0001f59e0001f5c80001f5f20001f61c0001f8d40001fab40001fc3e0001
-fe7e0001fff6000200200002004a0002007a000200aa000200fa0002014a
-0002018a000201fc00020250000202ae000203040002033a0002037c0002
-03c20002040c0002043c00020474000204a40002060a000209500002097a
-000209a4000209ce000209f800020a2200020a4c00020a7600020aa00002
-0aca00020af400020b1e00020b4800020b7200020b9c00020bc600020bf0
-00020c1a00020c4400020c6e00020c9800020cc200020cec00020d160002
-0d4000020d6a00020d9400020dbe00020de800020e8000020f1000020f3a
-000212c2000213cc00021544000216ca000218ac00021a8000021c9e0002
-1cae00021e5600021fee00022260000224a00002261800022628000226d4
-0002277e000228ba000228ca00022996000229a600022b4800022d300002
-2e9c00022eac00022fb400022fc40002313e0002314e0002327c0002328c
-000233c80002357c000236740002368400023776000238d4000239800002
-399000023ad200023c8000023d7600023d8600023e2a00023e3a00023f22
-00023f3200023ffc0002400c0002412200024132000242f8000243080002
-447600024486000246f800024708000249180002492800024aa400024ab4
-00024be600024bf600024db400024dc400024f3a00024f4a000250b80002
-50c8000250d8000250e8000252a8000252b8000252c8000252d800025428
-0002556000025678000257720002591400025aa600025c0e00025d5c0002
-5f2200025f3200026084000261e6000263cc000263dc0002656400026708
-0002694200026952000269620002697200026adc00026aec00026bbe0002
-6bce00026d0600026d1600026dfc00026e0c00026f4600026f5600027010
-0002702000027146000272aa00027418000275c6000276f6000277060002
-7880000279c200027be200027db400027ec400027ed40002815600028382
-0002864c000288a800028b6800028daa00028f68000290c2000290ec0002
-91160002912600029136000291600002918a000291b4000291c4000291d4
-000291fe000292280002923800029248000292720002929c000292c60002
-92d6000292e6000292f60002930600029316000293260002935000029360
-000293700002939a000293c4000293ee00029418000294420002946c0002
-9496000294c0000294ea000295140002953e0002956800029592000295bc
-000295e6000296100002963a000296640002968e000296b8000296e20002
-970c00029736000297600002978a000297b4000297de0002980800029832
-0002985c00029886000298b0000298da000299040002992e000299580002
-9982000299ac000299d600029a0000029a2a00029a5400029a7e00029aa8
-00029ad200029afc00029b2600029b5000029b7a00029ba400029bce0002
-9bf800029c2200029c4c00029cf400029d3800029dae00029dd800029e02
-00029e2c00029e5600029e8000029eaa00029ed400029efe00029f280002
-9f5200029f7c00029fa600029fd000029ffa0002a0240002a04e0002a078
-0002a0a20002a0cc0002a0f60002a1200002a14a0002a1740002a2260002
-a25a0002a28e0002a2c20002a4460002a5c60002a7320002a8800002a940
-0002aa020002aa740002ab460002ac180002ac8a0002ad4e0002ae400002
-af040002aff60002b09c0002b1a80002b23a0002b3820002b4c00002b524
-0002b64c0002b81a0002ba620002bace0002bb3a0002bba40002bc100002
-bcbe0002bd6c0002be120002beb80002bf5e0002bf8e0002bfbe0002bfee
-0002c0000002c0120002c0240002c0360002c0480002c0b80002c12a0002
-c15a0002c16c0002c17e0002c18e0002c19e0002c1b00002c1c20002c1d4
-0002c1e60002c1f80002c20a0002c3160002c3bc0002c4c80002c56e0002
-c5c60002c5ec0002c6120002c63c0002c66a0002c6b40002c7100002c74a
-0002c7a20002c7e20002c8320002c86a0002c8c00002c9020002c9420002
-c9940002ca060002ca500002cabc0002cafc0002cb680002cba80002cc10
-0002cc520002cca60002cccc0002ccf20002cd1c0002cd4c0002cd7c0002
-cdac0002cdfa0002ce560002ce940002ceee0002cf360002cf8c0002cfd0
-0002d0240002d06a0002d0ac0002d0d20002d1080002d12e0002d1540002
-d17a0002d1a00002d1ce0002d1f80002d2420002d29e0002d2d80002d330
-0002d3700002d3c40002d3fc0002d44c0002d48e0002d4ce0002d5080002
-d5440002d5800002d5bc0002d5ea0002d6140002d6520002d6820002d6a8
-0002d6ce0002d6f40002d71a0002d7440002d76e0002d7ae0002d7fa0002
-d8400002d8780002d8a20002d8cc0002d8fc0002d92c0002d9520002d978
-0002d9a20002d9cc0002d9fe0002da300002da600002da900002dac00002
-daf00002db200002db4e0002db7e0002dbae0002dbde0002dc0e0002dc42
-0002dca20002dcd60002dd3a0002dd6e0002ddce0002de020002de660002
-df0e0002dfde0002e0f40002e1c60002e2400002e2ae0002e4900002e65a
-0002e77a0002e88c0002e9d00002eae40002eb740002ebf40002ec880002
-ed0a0002edca0002ee6a0002ef360002f01c0002f0d40002f1a00002f21c
-0002f22c0002f2fa0002f3ba0002f4840002f5380002f62e0002f6a40002
-f7cc0002f8e60002fa6e0002faf00002fbe00002fcd60002fdce0002fe60
-0003007200030202000302880003040a00030476000304e00003054e0003
-0714000308dc0003096c000309b8000309f600030a3800030a8000030aac
-00030af200030b2800030b6400030ba200030be000030c6800030cf00003
-0d3200030d6a00030da400030dde00030e0600030e2e00030e7200030eb6
-00030ef400030f3200030f6200030f9200030fb800030fde000310200003
-1062000310a8000310ee000311460003119e000311fa00031256000312b2
-0003130e0003135c000313aa000313d2000313fa00031420000314460003
-148a000314ce0003151a00031566000315b0000315fa0003164800031696
-000316d6000317760003179c000317c20003180c0003187c000318a40003
-18cc0003191200031958000319ae00031a0400031a5200031b0c00031b34
-00031b5c00031bb000031c0400031c4400031c8400031caa00031cd00003
-1d3600031d9c00031dde00031e2000031e4600031e6c00031ec200031f18
-00031f7400031fd00003202400032078000320c6000321140003215e0003
-21a8000322020003225c000322b000032304000323460003238800032426
-000324c40003250e00032558000325aa000325fc00032662000326c80003
-272000032778000327a4000327d0000327fc000328280003285400032880
-000328ac000328d8000328fe00032924000329500003297c000329ca0003
-2a1800032a6400032ab000032b0000032b5000032bca00032c2c00032ca4
-00032cee00032e8000032eb400032ee800032f1e00032f4200032fac0003
-301600033098000331000003314800033190000331dc000332460003326e
-00033296000332bc000332e2000333320003338200033416000334680003
-34c6000335240003358a000335f0000336d6000337e6000338b4000339ae
-00033a1a00033a8000033ade00033b4000033bc600033c4c00033cb20003
-3d1800033d8400033df000033e4600033e9c00033ece00033f0000033f26
-00033f4c00033fb80003401e0003407c000340de000341f0000342fc0003
-440a0003450e000345340003455c00034580000345a4000345cc000345f4
-0003461a00034640000347620003489e000349cc00034af800034bb20003
-4c6c00034d2c00034dec00034ed000034fb4000350b0000351ac00035290
-000353740003544a000355200003556a000355b4000355da000356000003
-5650000356a0000356c4000356e8000357be000357ce0003582200035876
-000358d40003593200035972000359b2000359fc00035a4600035a960003
-5ae600035b3c00035b9200035be400035c2200035c9c00035cde00035d22
-00035db000035e3e00035ff0000360000003603a00036074000360a40003
-60d4000361080003613c00036176000361b00003620400036258000362ba
-0003631c000364cc0003665400036690000366c8000367120003675c0003
-67a2000367e80003683800036a5e00036a8400036aaa00036afe00036da8
-00036e7a00036f1600036f6400036fa200036fd4000371c20003747e0003
-7550000376b4000377ee0003789a00037a3000037c8400037ec000037f1a
-00037f600003802e000381200003813e000381e80003830e000383ea0003
-83fc0003855c000386e200038708000387c6000387e40003880a00038830
-000388560003887c000388a2000388c8000388ee00038914000389600003
-89c0000389e800038a0e00038b6c00038d4800038d5800038e2800038f38
-00038f96000390ae0003923c000392e2000394280003947a000394cc0003
-9504000395500003957c000395c2000395ee0003962a00039684000396ce
-0003971a0003978a00039850000398cc0003998c00039a0400039ade0003
-9b6e00039ba800039be400039d5c00039e4c00039e9600039edc0003a026
-0003a1360003a1460003a2500003a3360003a4480003a5140003a62a0003
-a7680003a7780003a8500003a9120003aa120003ab6c0003abcc0003ad50
-0003adc40003af180003b0800003b1640003b1b60003b21e0003b3a80003
-b51e0003b5a60003b74a0003b83a0003b95e0003ba000003baea0003bbd4
-0003bccc0003bdb40003bee60003c02c0003c1ce0003c38a0003c39a0003
-c49e0003c5d00003c67a0003c78e0003c81a0003c98a0003ca520003cb4c
-0003cc9a0003cdb20003cf580003d0980003d1ea0003d30e0003d4c00003
-d6480003d7420003d8180003d9740003da340003da6a0003dad20003dba6
-0003dbb60003dc160003dc720003dccc0003dd040003dd420003dd8c0003
-ddc80003de060003de500003df620003dfb40003e0100003e0bc0003e0e4
-0003e1540003e1840003e1b60003e3600003e4860003e4c00003e4f00003
-e53c0003e56e0003e5940003e5ba0003e5fc0003e63e0003e66e0003e69e
-0003e6e20003e7280003e7660003e7a00003e7da0003e80a0003e8c60003
-e9800003e9c20003e9f20003ea260003ea620003ea920003eac20003eafc
-0003eb340003eb640003eb980003ebcc0003ebf40003ec240003ec540003
-ec880003ecc00003ecf00003ed200003ed600003ed920003edce0003ee00
-0003ee400003ee7a0003eeaa0003eeda0003ef000003ef260003ef4c0003
-ef7c0003f0940003f1920003f1c20003f1f40003f2980003f43e0003f5a8
-0003f6960003f8000003f8300003f8600003f8980003f8d00003f9220003
-f97e0003fa700003fa980003fb060003fb360003fb660003fb8e0003fc00
-0003fc300003fc660003fdc60003fe880003ff6400040088000401800004
-02d0000403ec0004050a0004060e000407700004091600040aae00040cba
-00040df000040e8a00040ff800041008000410d6000412980004149a0004
-154c0004162a00041744000417f400041846000418980004196e00041a54
-00041ae400041c5c00041d5a00041e5c00041f900004206e000421540004
-21f4000422fe000424260004251a000426020004267e000426fa000427a6
-0004285800042936000429ac000429fe00042b7000042cf000042eee0004
-2fb2000430840004316a000432a00004336c000434740004358e00043692
-0004376200043840000439da00043af600043bd000043d4400043f380004
-404e000441fc0004428e00044330000443be0004445c0004456000044570
-000446ca000447da000447ea000448c4000449e800044a4800044b680004
-4c3600044d1800044f000004510e000453e40004561e000457ac000459d6
-00045b7e00045d6000045eba00046026000460a80004615c0004624a0004
-62f600046362000463e4000464bc00046600000467720004688000046890
-000468a00004690200046966000469c400046a5200046ade00046ba40004
-6c3e00046c4e00046c5e00046cf800046d9800046dde00046e5000046ec2
-00046f1000046f4400046fb6000470260004709a000470ea0004717e0004
-720e0004728c00047310000473ac000473d800047446000474f800047606
-000476520004781c00047908000479180004794e00047992000479d60004
-7a1a00047a5000047a8200047ac400047b1a00047b6600047c1400047c8c
-00047d1600047d8a00047df000047e7600047ed600047f4000047fb80004
-802c0004808a00048134000481d000048240000482d200048330000483a2
-00048450000484fa00048594000486080004868e000486f6000487a60004
-886800048918000489ae00048a1000048a8000048ad600048b5800048bda
-00048c6400048cf400048d4e00048dba00048e2a00048e9c00048f100004
-8f980004902c00049096000491100004919000049208000492b20004934e
-000493e200049444000494e600049566000495fc000496a4000497520004
-97ee0004984e000498a600049912000499bc00049a6a00049b3800049be2
-00049c4800049ca000049d0400049d9600049e2000049eb200049f160004
-9f7e00049fe80004a0500004a0bc0004a1380004a1c40004a25c0004a2c8
-0004a3300004a3940004a4440004a5080004a5ba0004a64c0004a6ae0004
-a71e0004a7920004a83a0004a8e40004a9ac0004aa520004aaba0004ab4e
-0004abc40004ac600004ace20004ad600004add00004ae620004aebe0004
-af200004afaa0004b02a0004b0920004b0fa0004b1520004b1c00004b228
-0004b2aa0004b3240004b3a20004b4260004b4820004b4e80004b5500004
-b5f40004b69a0004b75c0004b8100004b8700004b8ec0004b94e0004b9dc
-0004ba780004bb0a0004bb740004bbd60004bc680004bcde0004bd7c0004
-be140004be880004befc0004bf780004bfd60004c03a0004c0b80004c116
-0004c17a0004c1d80004c2380004c2a00004c2f40004c32a0004c3760004
-c3da0004c41a0004c4640004c50e0004c5b60004c60c0004c6440004c694
-0004c7440004c7f20004c8440004c8980004c8f00004c9400004c9980004
-c9fe0004ca5e0004cafe0004cba20004cbe00004cc460004cce40004cd78
-0004ce0a0004ceb00004cee20004cf4a0004cfb20004cffc0004d0ce0004
-d1500004d1f80004d2600004d29e0004d3080004d3ae0004d4040004d458
-0004d4c40004d5280004d5c80004d5fa0004d62a0004d6740004d70c0004
-d7360004d7600004d8280004d8820004d9240004d98e0004da0a0004daba
-0004db300004dba00004dbf80004dc5e0004dcc00004dd600004ddb80004
-de840004def00004df4a0004df940004dfea0004e08a0004e1500004e29c
-0004e3b80004e41c0004e4900004e7b60004e8460004e8c60004e9140004
-ea7c0004eba80004ebf00004ecec0004edb40004ee920004ef840004f03e
-0004f1180004f1820004f21a0004f2ec0004f3e00004f4520004f4c00004
-f5040004f6160004f74a0004f83c0004f8800004f8bc0004f9a60004faa8
-0004fc2a0004fd260004fe2a0004ff340005002000050082000500f80005
-02820005031400050444000505340005065c000507940005085800050940
-00050a0000050b5400050d0600050e9800050fd2000511380005120e0005
-12cc0005138a00051450000515a8000516f8000517080005171800051728
-000517c400051862000518b0000518ee000519340005196400051ac20005
-1c5e00051d7000051e980005202400052196000522a60005247a00052666
-000528c000052a2000052b4a00052cdc00052e4e00053064000532d20005
-33d200053508000536280005377a0005386e000539b4000539f600053a36
-00053c7800053ec600054026000541bc000543ec0005458c000546180005
-46480005469000054724000547be0005491e000549b000054a2000054a60
-00054a9e00054c5000054e8e0005503e000551680005525e000553640005
-553a000556f0000557f20005590800055ace00055cbc00055e6400055fe0
-00056166000562c60005635e000563fa000565180005663e000567960005
-694a00056a8600056bda00056c6000056cde00056d9200056e5800056f04
-00056fce00057100000572a0000572c6000572ec000572fc0005732c0005
-735c000574d00005764000057702000577c4000578a60005797e00057a32
-00057b0600057bb000057c7600057df800057fa800058012000580420005
-806a0005809e000580d2000580e2000580f2000581220005814800058184
-000581c0000581f4000582280005825c00058292000583b8000583c80005
-83f8000584280005845c00058494000584c8000584fc0005853000058564
-00058598000585ce000585fe0005863400058668000586a2000586f20005
-873c00058770000587a4000587da00058810000588c4000588d4000589de
-00058b4a00058cb400058e5400058f9a000590f2000591e4000592ee0005
-93d2000594d2000595f8000596e4000597a0000598620005994a00059a04
-00059ace00059b5600059c0400059c9600059d1400059e2e00059e9a0005
-9f620005a05e0005a0cc0005a13c0005a1f40005a3d80005a4e60005a56c
-0005a5b20005a67a0005a70a0005a7f40005a8a00005a90e0005aa160005
-ab020005abc20005ac080005ac9a0005ada80005ae440005aea00005af96
-0005b0900005b2120005b3760005b4740005b55e0005b62c0005b6540005
-b67c0005b6ac0005b6dc0005b7040005b72c0005b7540005b77c0005b7d6
-0005b8400005b8720005b8a20005b8c80005b8f00005b9180005b9420005
-b96c0005b9940005b9bc0005b9e20005ba0e0005ba980005bac00005bb42
-0005bb6a0005bb900005bbb60005bbdc0005bc2e0005bc820005bcb40005
-bce40005bd160005bd520005bd820005bdb80005bdde0005be040005be38
-0005be6c0005beac0005bef20005bf180005bf3e0005bf640005bf8a0005
-bfb40005c0180005c0640005c0960005c0c40005c0fa0005c1380005c160
-0005c1860005c1ac0005c1f60005c2380005c2600005c2860005c2b20005
-c2d80005c3340005c3640005c3940005c3c40005c3ea0005c4140005c444
-0005c4740005c49a0005c4c00005c4e60005c50c0005c5320005c5580005
-c5800005c5f80005c6220005c68c0005c6b40005c7580005c7800005c7fc
-0005c8300005c8720005c8a20005c8d20005c9020005c9320005c95e0005
-c9840005c9cc0005ca0e0005ca3a0005ca620005ca920005cac20005cae8
-0005cb0e0005cb3a0005cbee0005cc160005ccc60005cd080005cd4a0005
-cd7a0005cdae0005cdd40005cdfc0005ce220005ce4a0005ce700005ce98
-0005cec00005cee80005cf0e0005cf340005cf5a0005cf800005cfa80005
-d0300005d0640005d0ca0005d0fa0005d12a0005d1500005d1760005d1b0
-0005d1f40005d2260005d2620005d2920005d2c20005d2f60005d32a0005
-d35a0005d3900005d3c80005d3f80005d4260005d4500005d47e0005d4a4
-0005d4ca0005d4fe0005d5440005d57e0005d5ba0005d5ec0005d61c0005
-d6580005d6940005d6d00005d71a0005d7640005d79c0005d7da0005d816
-0005d8560005d8b20005d90e0005d96a0005d9c60005da300005da9a0005
-daca0005db020005db420005db860005dbca0005dc0e0005dc6a0005dcc6
-0005dd320005dd9e0005de0a0005de760005dea60005ded60005df0e0005
-df460005df860005dfc60005e0020005e03e0005e09a0005e0f60005e15a
-0005e1be0005e2220005e2860005e2e40005e3420005e3700005e39e0005
-e3d00005e4020005e4340005e4660005e4a40005e4e20005e5520005e5c4
-0005e6260005e6880005e6ea0005e74c0005e7a40005e7fc0005e82c0005
-e85c0005e8900005e8c40005e8f80005e92c0005e9860005e9f20005ea5c
-0005eac60005eb2e0005eb960005ebc60005ebf60005ec2a0005ec5e0005
-ec9e0005ecde0005ed1a0005ed560005edaa0005ee100005ee640005eeb2
-0005eee20005ef120005ef460005ef7a0005efae0005efe20005f01a0005
-f0520005f0ae0005f1040005f1640005f1c40005f21a0005f2700005f2ca
-0005f31e0005f3540005f3860005f3c40005f3f40005f4240005f46e0005
-f49c0005f4cc0005f5120005f54a0005f5860005f5ca0005f5fe0005f62e
-0005f6780005f6cc0005f7220005f7780005f7dc0005f8400005f8920005
-f8e80005f9340005f9860005f9f20005fa5e0005faca0005fb360005fbb2
-0005fc2e0005fc700005fcb20005fcfa0005fd420005fd940005fde60005
-fe340005fe820005fef00005ff5e0005ffd40006004a000600c000060136
-000601a600060216000602580006029a000602de00060322000603660006
-03aa000603f40006043e000604ac0006051400060586000605f800060660
-000606c80006073200060796000607cc0006080200060852000608800006
-08cc000609080006095e0006098e000609be000609ea00060a1600060a3c
-00060a9000060afe00060b5200060bee00060ce000060d2200060d480006
-0da400060dd400060e1600060e7c00060eea00060f5000060fba00060fe0
-00061088000611260006126600061294000612c2000613260006138a0006
-13b8000613ec0006141c0006144c000614bc00061532000615da00061678
-000617b4000617e4000618140006187a000618e000061910000619400006
-1970000619a6000619d600061a0600061a5200061ab200061b0e00061be8
-00061cc200061d3400061d7a00061da000061de200061e1200061e540006
-1e8800061ef200061f3800061fae00061fd40006204400062092000621b2
-00062444000625d800062730000628e200062bf000062e860006306e0006
-320c00063464000635a6000637bc0006382c000638940006390600063978
-00063a0000063a9e00063c7c00063e2a00063ff6000640f60006428a0006
-43ea000644ae000645a40006460c0006466e000646dc0006474000064814
-0006487c0006494600064a0400064aa000064b0200064b9800064c2a0006
-4cc600064d5e00064dc400064e2200064e8e00064ef600064f7200065020
-0006508a000650e80006514a000651fc0006527e00065300000653360006
-5368000653780006538800065494000655bc000657dc0006592e0006593e
-000659f800065aee00065b7800065b8800065c0800065c8000065ca20006
-5d6400065d7400065d8400065d9400065da400065ea000065fe6000661a6
-000663ba000664ac00066512000665760006663800066648000667e20006
-67f200066802000668c6000669e200066abe00066ace00066ade00066aee
-00066c4a00066e3a00066f4a00066f5a00066f6a00066f7a00066f8a0006
-704000067050000671a6000672e2000673d0000674e000067584000675f2
-000676620006777c000677e000067824000678b200067a7200067ab20006
-7ba600067c7200067d3e00067dc400067e9a00067f360006809e00068122
-000681b600068330000684a20006862a0006870e000688d8000689c20006
-8ab000068bdc00068d0200068e5c00068fc60006910800069180000692b6
-000693ae000694ac000695a80006968e00069718000697a2000698940006
-995000069a1200069abe00069bb400069c9000069d9400069ed400069fbc
-0006a13c0006a26a0006a36e0006a3b80006a4240006a4e40006a5c00006
-a6fe0006a7e60006a9320006aa600006ab6a0006ac0c0006ad580006ae14
-0006af3e0006b0000006b0480006b2420006b2f80006b4e60006b6420006
-b7e00006b8e20006b9480006ba900006bb080006bc980006bcce0006bd04
-0006bd560006bda80006bde00006be200006be580006be980006bfc60006
-c0280006c0e80006c19c0006c23e0006c2d60006c3520006c45e0006c4bc
-0006c5ea0006c69a0006c7680006c7a20006c7de0006c8660006c9260006
-ca220006caf80006cb1e0006cb440006cbdc0006cbec0006cbfc0006cc0c
-0006cc1c0006cc2c0006cc3c0006cc4c0006cc5c0006cc6c0006cc7c0006
-cc8c0006cc8c0006cdf00006ce000006ce740006cf0e0006d01c0006d176
-0006d2d60006d4900006d65e0006d8320006d8b60006d9d40006db1e0006
-dcc60006dd620006ddb20006de480006df660006dfb60006e0460006e170
-0006e1800006e2ae0006e3be0006e4340006e48c0006e5780006e5be0006
-e5fe0006e69a0006e6ee0006e8700006e94e0006e98e0006e9f80006ea62
-0006ea9a0006ebe20006ecd80006ede60006ee1e0006ee560006ee7c0006
-eea20006eed20006ef020006ef260006ef4a0006ef760006efa20006efe8
-0006f02e0006f05a0006f0860006f0cc0006f1120006f16e0006f1ca0006
-f1ee0006f2120006f26a0006f2c20006f3080006f34e0006f3840006f3ba
-0006f3f00006f4260006f4880006f4f20006f5520006f5b20006f5fe0006
-f6cc0006f6f40006f71c0006f7880006f7f40006f8420006f8900006f996
-0006f9a60006f9f00006fa3a0006fa820006faca0006fb280006fb8a0006
-fbe40006fc360006fcba0006fd220006fd960006fe080006fe8e0006fefc
-0006ff6e0006ffd40006fffa0007002000070044000700680007009c0007
-00d0000700f60007011c00070188000701f400070260000702c80007031a
-0007036c000703c2000704140007043c0007046400070496000704c40007
-051a00070570000705cc000706280007064e00070674000706a0000706cc
-0007072800070784000707a8000707cc000708820007093800070b0a0007
-0b1a00070b7e00070be200070c2e00070c7a00070e3e00070e4e00070f5c
-00070f6c00070fc60007102000071078000710d000071134000711980007
-11dc00071220000713b6000715480007169800071866000719e400071b9e
-00071ccc00071dc40007203e000721c2000723ea00072566000725f20007
-272a0007294e000729d6000729e600072b5600072c8200072dea00072f30
-00073066000731640007333a000734ee0007357e000736c2000737ae0007
-38fc000739ea00073bd600073cf200073e1400073fe800074152000742f6
-000743fc0007454c000746a40007489a00074a7600074bda00074c9e0007
-4dd200074e9c00074fa60007512000075214000752f80007549600075668
-0007567800075726000757f000075800000758c800075962000759ae0007
-59be00075a3800075b0c00075b6800075c1800075c5a00075d9000075e86
-00075f82000760820007612000076264000763ac000765cc000766620007
-676200076882000769ca00076a8600076b6000076c3c00076d0800076e0a
-00076fb6000770d6000771fc0007728a0007731a0007742c0007748c0007
-7578000776e40007781600077912000779fe00077b2400077cb400077e5a
-0007802600078156000781d800078258000782e200078362000783ec0007
-84a800078550000785fe000786a600078720000787a40007881e000788a2
-00078958000789fa00078a9a00078b3c00078bb800078c3e00078cba0007
-8d4000078df800078ea200078f4800078ff0000790e0000791d4000792b4
-0007939c0007948e0007958200079668000797540007991c00079a7e0007
-9b2200079c3200079cf800079d0800079dfc00079f5600079fea0007a094
-0007a15e0007a2300007a3120007a3ae0007a4980007a5be0007a5ce0007
-a6880007a7420007a7520007a7fa0007a8a00007a98e0007aa7c0007ab58
-0007ac2a0007adae0007af540007afee0007b08a0007b0c60007b1040007
-b1400007b17e0007b1d80007b2300007b28a0007b2ee0007b37a0007b578
-0007b5cc0007b5dc0007b6680007b6ec0007b7700007b8280007b9380007
-baf60007bc140007bca40007bd480007bdf80007beda0007bf5c0007bfea
-0007c1120007c15a0007c1b20007c28c0007c2c80007c3260007c3640007
-c3960007c3da0007c41c0007c44c000100000d3500f2003c008f00060002
-0010002f0055000006fa02c20005000200>
-<0000005303ea0000000300000000006a00000000000300000001000a006a
-00000003000000020008007400000003000000030058007c000000030000
-0004001400d40000000300000005001800e8000000030000000600180100
-000000030000000700ba01180000000300000008003001d2000000030000
-0009008a0202000000030000000d02aa028c000100000000000000350536
-00010000000000010005056b000100000000000200040570000100000000
-0003002c05740001000000000004000a05a00001000000000005000c05aa
-0001000000000006000c05b60001000000000007005d05c2000100000000
-00080018061f000100000000000900450637000100000000000d0155067c
-0003000104030002000e07d10003000104030004001a07df000300010405
-0002000a07f9000300010405000400160803000300010406000200060819
-00030001040600040012081f000300010407000200080831000300010407
-0004001408390003000104080002000c084d000300010408000400180859
-0003000104090000006a08710003000104090001000a08db000300010409
-0002000808e50003000104090003005808ed000300010409000400140945
-000300010409000500180959000300010409000600180971000300010409
-000700ba0989000300010409000800300a430003000104090009008a0a73
-000300010409000d02aa0afd00030001040a0002000e0da700030001040a
-0004001a0db500030001040b000200120dcf00030001040b0004001e0de1
-00030001040c000200080dff00030001040c000400140e0700030001040e
-000200100e1b00030001040e0004001c0e2b000300010410000200120e47
-0003000104100004001e0e59000300010413000200060e77000300010413
-000400120e7d0003000104140002000e0e8f0003000104140004001a0e9d
-000300010415000200140eb7000300010415000400200ecb000300010416
-0002000e0eeb0003000104160004001a0ef9000300010419000200140f13
-000300010419000400200f2700030001041b0002000a0f4700030001041b
-000400160f5100030001041d000200060f6700030001041d000400120f6d
-00030001041f0002000a0f7f00030001041f000400160f89000300010424
-0002000c0f9f000300010424000400180fab00030001042a000200080fc3
-00030001042a000400140fcb00030001042d0002000a0fdf00030001042d
-000400160fe900030001080a0002000e0fff00030001080a0004001a100d
-0003000108160002000e10270003000108160004001a1035000300010c0a
-0002000e104f000300010c0a0004001a105d000300010c0c000200081077
-000300010c0c00040014107f00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0042006f006c0064004d006f006e006f007400790070
-0065003a0041007200690061006c00200042006f006c0064003a00560065
-007200730069006f006e00200035002e0030003100200028004d00690063
-0072006f0073006f0066007400290041007200690061006c00200042006f
-006c006400560065007200730069006f006e00200035002e003000310041
-007200690061006c002d0042006f006c0064004d00540041007200690061
-006c00200069007300200061002000740072006100640065006d00610072
-006b0020006f006600200054006800650020004d006f006e006f00740079
-0070006500200043006f00720070006f0072006100740069006f006e0020
-0069006e002000740068006500200055006e006900740065006400200053
-0074006100740065007300200061006e0064002f006f00720020006f0074
-00680065007200200063006f0075006e00740072006900650073002e0054
-006800650020004d006f006e006f007400790070006500200043006f0072
-0070006f0072006100740069006f006e004d006f006e006f007400790070
-006500200054007900700065002000440072006100770069006e00670020
-004f006600660069006300650020002d00200052006f00620069006e0020
-004e006900630068006f006c00610073002c002000500061007400720069
-0063006900610020005300610075006e0064006500720073002000310039
-003800320059006f00750020006d00610079002000750073006500200074
-00680069007300200066006f006e007400200074006f0020006400690073
-0070006c0061007900200061006e00640020007000720069006e00740020
-0063006f006e00740065006e00740020006100730020007000650072006d
-0069007400740065006400200062007900200074006800650020006c0069
-00630065006e007300650020007400650072006d007300200066006f0072
-0020007400680065002000700072006f006400750063007400200069006e
-0020007700680069006300680020007400680069007300200066006f006e
-007400200069007300200069006e0063006c0075006400650064002e0020
-0059006f00750020006d006100790020006f006e006c0079002000280069
-002900200065006d0062006500640020007400680069007300200066006f
-006e007400200069006e00200063006f006e00740065006e007400200061
-00730020007000650072006d006900740074006500640020006200790020
-00740068006500200065006d00620065006400640069006e006700200072
-00650073007400720069006300740069006f006e007300200069006e0063
-006c007500640065006400200069006e0020007400680069007300200066
-006f006e0074003b00200061006e00640020002800690069002900200074
-0065006d0070006f0072006100720069006c007900200064006f0077006e
-006c006f006100640020007400680069007300200066006f006e00740020
-0074006f002000610020007000720069006e0074006500720020006f0072
-0020006f00740068006500720020006f0075007400700075007400200064
-0065007600690063006500200074006f002000680065006c007000200070
-00720069006e007400200063006f006e00740065006e0074002ea9203230
-303620546865204d6f6e6f7479706520436f72706f726174696f6e2e2041
-6c6c205269676874732052657365727665642e417269616c426f6c644d6f
-6e6f747970653a417269616c20426f6c643a56657273696f6e20352e3031
-20284d6963726f736f667429417269616c20426f6c6456657273696f6e20
-352e3031417269616c2d426f6c644d54417269616c206973206120747261
-64656d61726b206f6620546865204d6f6e6f7479706520436f72706f7261
-74696f6e20696e2074686520556e697465642053746174657320616e642f
-6f72206f7468657220636f756e74726965732e546865204d6f6e6f747970
-6520436f72706f726174696f6e4d6f6e6f74797065205479706520447261
-77696e67204f6666696365202d20526f62696e204e6963686f6c61732c20
-5061747269636961205361756e646572732031393832596f75206d617920
-757365207468697320666f6e7420746f20646973706c617920616e642070
-72696e7420636f6e74656e74206173207065726d69747465642062792074
-6865206c6963656e7365207465726d7320666f72207468652070726f6475
-637420696e207768696368207468697320666f6e7420697320696e636c75
-6465642e20596f75206d6179206f6e6c792028692920656d626564207468
-697320666f6e7420696e20636f6e74656e74206173207065726d69747465
-642062792074686520656d62656464696e67207265737472696374696f6e
-7320696e636c7564656420696e207468697320666f6e743b20616e642028
-6969292074656d706f726172696c7920646f776e6c6f6164207468697320
-666f6e7420746f2061207072696e746572206f72206f74686572206f7574
-7075742064657669636520746f2068656c70207072696e7420636f6e7465
-6e742e004e0065006700720065007400610041007200690061006c002000
-4e00650067007200650074006100740075010d006e00e900410072006900
-61006c002000740075010d006e00e9006600650064004100720069006100
-6c002000660065006400460065007400740041007200690061006c002000
-46006500740074038803bd03c403bf03bd03b10041007200690061006c00
-20038803bd03c403bf03bd03b100a9002000320030003000360020005400
-6800650020004d006f006e006f007400790070006500200043006f007200
-70006f0072006100740069006f006e002e00200041006c006c0020005200
-690067006800740073002000520065007300650072007600650064002e00
-41007200690061006c0042006f006c0064004d006f006e006f0074007900
-700065003a0041007200690061006c00200042006f006c0064003a005600
-65007200730069006f006e00200035002e0030003100200028004d006900
-630072006f0073006f0066007400290041007200690061006c0020004200
-6f006c006400560065007200730069006f006e00200035002e0030003100
-41007200690061006c002d0042006f006c0064004d005400410072006900
-61006c00200069007300200061002000740072006100640065006d006100
-72006b0020006f006600200054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-200069006e002000740068006500200055006e0069007400650064002000
-530074006100740065007300200061006e0064002f006f00720020006f00
-7400680065007200200063006f0075006e00740072006900650073002e00
-54006800650020004d006f006e006f007400790070006500200043006f00
-720070006f0072006100740069006f006e004d006f006e006f0074007900
-70006500200054007900700065002000440072006100770069006e006700
-20004f006600660069006300650020002d00200052006f00620069006e00
-20004e006900630068006f006c00610073002c0020005000610074007200
-690063006900610020005300610075006e00640065007200730020003100
-39003800320059006f00750020006d006100790020007500730065002000
-7400680069007300200066006f006e007400200074006f00200064006900
-730070006c0061007900200061006e00640020007000720069006e007400
-200063006f006e00740065006e0074002000610073002000700065007200
-6d0069007400740065006400200062007900200074006800650020006c00
-6900630065006e007300650020007400650072006d007300200066006f00
-720020007400680065002000700072006f00640075006300740020006900
-6e0020007700680069006300680020007400680069007300200066006f00
-6e007400200069007300200069006e0063006c0075006400650064002e00
-200059006f00750020006d006100790020006f006e006c00790020002800
-69002900200065006d006200650064002000740068006900730020006600
-6f006e007400200069006e00200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-2000740068006500200065006d00620065006400640069006e0067002000
-7200650073007400720069006300740069006f006e007300200069006e00
-63006c007500640065006400200069006e00200074006800690073002000
-66006f006e0074003b00200061006e006400200028006900690029002000
-740065006d0070006f0072006100720069006c007900200064006f007700
-6e006c006f006100640020007400680069007300200066006f006e007400
-200074006f002000610020007000720069006e0074006500720020006f00
-720020006f00740068006500720020006f00750074007000750074002000
-640065007600690063006500200074006f002000680065006c0070002000
-7000720069006e007400200063006f006e00740065006e0074002e004e00
-65006700720069007400610041007200690061006c0020004e0065006700
-72006900740061004c0069006800610076006f0069007400750041007200
-690061006c0020004c0069006800610076006f0069007400750047007200
-6100730041007200690061006c00200047007200610073004600e9006c00
-6b00f6007600e900720041007200690061006c0020004600e9006c006b00
-f6007600e9007200470072006100730073006500740074006f0041007200
-690061006c002000470072006100730073006500740074006f0056006500
-740041007200690061006c002000560065007400480061006c0076006600
-6500740041007200690061006c002000480061006c007600660065007400
-50006f00670072007500620069006f006e00790041007200690061006c00
-200050006f00670072007500620069006f006e0079004e00650067007200
-690074006f0041007200690061006c0020004e0065006700720069007400
-6f041f043e043b0443043604380440043d044b0439004100720069006100
-6c0020041f043e043b0443043604380440043d044b043900540075010d00
-6e00e90041007200690061006c002000540075010d006e00e90046006500
-740041007200690061006c0020004600650074004b0061006c0131006e00
-41007200690061006c0020004b0061006c0131006e004b00720065007000
-6b006f0041007200690061006c0020004b007200650070006b006f011100
-e20323006d0041007200690061006c0020011100e20323006d004c006f00
-64006900610041007200690061006c0020004c006f006400690061004e00
-65006700720069007400610041007200690061006c0020004e0065006700
-72006900740061004e00650067007200690074006f004100720069006100
-6c0020004e00650067007200690074006f004e0065006700720069007400
-610041007200690061006c0020004e006500670072006900740061004700
-72006100730041007200690061006c00200047007200610073000000b154
-80410d03ac00af03ac0002001003ac002003ac00a003ac0003004003acb3
-070d3240b803acb312143240b803acb2162b32b9ffc003acb23a3340b803
-acb32d943280bc03ab005f0033ffc003abb2553340b803abb340443240b8
-03abb3333b3240b803abb32f313240b803abb2083340b803abb30714321f
-411a03ab002f03ab0002000f03ab002f03ab004f03ab008f03ab009f03ab
-00bf03ab0006001003ab00df03ab00ff03ab000303a803a2b2461f40b803
-a5b208330f411403a50001004003a500cf03a500ff03a50003002003a500
-af03a500ef03a500ff03a50004ffc003a3b3090c3240b803a3b208330f41
-1b03a30001000f03a3001003a3008003a300af03a300cf03a30005006f03
-a3009f03a300ff03a30003009f03a200af03a2000203a203a1b2101f1041
-0a039e007f039e0002039a000f0101001fffc00398b310143240b80399b3
-0f1332404110039500500395000200b0034d00c0034d0002006f0391007f
-03910002ffc0034bb22d3132b9ffc0034bb30a0e32104110038b0020038b
-0080038b000300a0038b00010020038b0040038b0002ffc0038bb3131632
-40b80383b20f1132b9ffc0037bb2303432b9ffc0037bb310183250411403
-7800010365036e0023001f037e036e001e001f0363036e001d001f036203
-64000d001fffc00340b30f1032804110033f0001033f03150029001f0341
-03160032001f0344031a001b001fffc00375b20e1132b9ffc00375b2282a
-32410a034303180032001f030f030d0034001f03080307b2321f20bb0340
-000100400388b3090b3240b80388b2101532bd038503070014001f038003
-07b2171f0fbd030a002f030a0002ffc00354b3090d3290410c035400a003
-540002001f036e0001009f036e00010040036eb2090b3241110345031c00
-16001f036b031d0015001f0346031e0015001f03a703a10046001f039db3
-261c1fc0bb0393000100400392b3090d3240b8033eb2083340b8033eb30d
-0e32c04109033e000100b0038e00c0038e0002ffc00390b3263832004126
-03280030032800020020037f0030037f00020010038a0030038a0050038a
-006f038a007f038a009f038a000600000389003003890002002f037a0070
-037700900377009f037a0004ffc00315b20f1032b9ffc00315b2242832b9
-03190318b2321f10bb031a0001ffc0031ab3090e3240b80318b2121332b9
-ffc00318b30c0e323fbd0373004f0373000200400374b31718326fbb032a
-00010040032cb3181b3240b80370b2090c32bd031703160032001fffc003
-16b20e1132bd031c031e0016001f031d031eb2151fb0411f031e0001000f
-031f000102ca02d00015001f02d302d5000d001f02cf02d0000d001f02cb
-02d0000d001f02cd02d0000d001f02ce02d0000d001fffc002d0b3090c32
-40b802d2b3090c32e0411c02e50001005f02dd009f02e5000202bb02c300
-30001f02da02b80032001f02d902b9003f001f02d802b80064001f02b902
-b80033001f02bab221c81fb802b8b321c81f40b8039bb20d1632b9ffc002
-c3b22b2f32b9ffc002c3b21f2532b9ffc002c3b2171b32b9ffc002c3b212
-1632412502c202c1001c001f02d702c10024001f02c102c00022001f02bf
-02c00018001f02c0027400c8001f02b50235003b001f02b40235003b001f
-02c402bc001e001f02b702b60038001f02b3b20ec81fb802b0b207c81fb8
-02afb206c81fb802aeb200c81fb802afb2502f1fbc02ae02ab001a001f02
-adb2261a1fb802a8b326241f0fbb0235000102a50274b21d1f12410a02a1
-015801f4001f02a000d801f4001f001202a2b237c81fb80290b2bc201fb9
-029002904018374025402d40a6033025302d30a6032025202d203720a620
-4110028e0005009f028b0001028b028b0037002002890030028900400289
-00900289b20437b041fd027400c0027400020080027400a0027400020060
-0274007002740002000002740010027400020080027400f002740002003f
-0285004f028500020090027e0090027f009002800090028100040090027a
-0090027b0090027c0090027d000400900274009002750090027700030070
-027e0070027f007002800070028100040070027a0070027b0070027c0070
-027d000400700274007002750070027700030060027e0060027f00600280
-0060028100040060027a0060027b0060027c0060027d0004006002740060
-02750060027700030050027e0050027f005002800050028100040050027a
-0050027b0050027c0050027d000400500274005002750050027700030040
-027e0040027f004002800040028100040040027a0040027b0040027c0040
-027d000400400274004002750040027700030030027e0030027f00300280
-0030028100040030027a0030027b0030027c0030027d0004003002740030
-02750030027700030020027e0020027f002002800020028100040020027a
-0020027b0020027c0020027d000400200274002002750020027700030010
-027e0010027f001002800010028100040010027a0010027b0010027c0010
-027d0004001002740010027500100277000300e0027e00e0027f00e00280
-00e00281000400e0027a00e0027b00e0027c00e0027d000400e0027400e0
-027500e00277b103d041c5027e00d0027f00d0028000d00281000400d002
-7a00d0027b00d0027c00d0027d000400d0027400d0027500d00277000300
-30027400400274000200c0027e00c0027f00c0028000c00281000400c002
-7a00c0027b00c0027c00c0027d000400c0027400c0027500c00277000300
-b0027e00b0027f00b0028000b00281000400b0027a00b0027b00b0027c00
-b0027d000400b0027400b0027500b00277000300a0027e00a0027f00a002
-8000a00281000400a0027a00a0027b00a0027c00a0027d000400a0027400
-a0027500a0027700030090027e0090027f00900280009002810004009002
-7a0090027b0090027c0090027d0004009002740090027500900277000300
-20027e0020027f002002800020028100040020027a0020027b0020027c00
-20027d00040020027400200275002002770003028101580801001f028001
-290801001f027f00ec0801001f027e00d80801001f027d00b10801001f02
-7c00a60801001f027b00820801001f027a00370801001f02770026080100
-1f027500200801001f0274001f0801b21f370f41160235004f0235005f02
-35006f0235009f023500af023500bf0235000700af023500cf023500df02
-3500ff02354022040f074f079f07af07bf0705af07e007020f064f069f06
-af06bf0605af06e0060220411b020d0001005f02350001008f0235000100
-7f023500ef02350002002f0235003f02350002003f0234004f0234000202
-350235023402344011ed20ef2a01cf2a01bf2a01af2a018f2a0141090247
-0104001e001f022000370201001f0158400c263e1fd8263e1f3726273e1f
-b8028eb6ec171fb226361fb801bcb226361fb80129402b26361fec26361f
-b126361fa626361f8226361f3726361f3226361f2d26361f2526361f1f26
-361f37262a1fb801584022263e1fd8263e1fbc263e1f27263e1f21263e1f
-20263e1f3700161600000012110840b9020d01a6b3c50d0009b801bcb227
-281fb801bbb227301fb801b8b2274f1fb801b7b227621f410901b6002701
-01001f01b5002002ab001f01afb21fe41fb801adb21fe41fb801acb21fbb
-1fb801a8b21f341fb8015db2272e1fb8015bb227cd1f410d0155001f0401
-001f0154001f0401001f0153001f0201001f0152b21f561fb80151b21f29
-1fb8012bb227261f410d012a00270125001f0129015800e4001f0125001f
-0401001f0124b21fe41fb80123b21f3b1fb80122b21f391f410d01080027
-0801001f0106002d0101001f0105001f0101001f0103b31fbb1fefb90158
-0401400b1fed1f931fec1fe41feb1fb80201b21fd920b80401b21fcf25b8
-0156400a1fbc2d9e1fbb1f411fb2410a01580401001f00b101580401001f
-00b001580401b51fa625891f9bb901580125b61f991f2e1f8e2db80801b5
-1f8d1f291f89b901580401b21f8220b802ab40131f801f301f742de41f73
-1f4a1f611f521f5d25b802abb21f5c1fbc0801001f0059015802abb61f50
-25891f491fb80125b21f4725b80401400b1f461f791f401f271f3920bc02
-ab001f003801580401b21f372dbc0125001f003201580125b61f2c1f341f
-2a25b80801b21f5537b80111402a07f00790075b0742073b07230722071e
-071d071408120810080e080c080a080808060804080208000814b8ffe040
-2b0000010014061000000100060400000100041000000100100200000100
-0200000001000002010802004a00b013034b024b5342014bb0c063004b62
-20b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807ff52
-b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ffb101
-018e851bb0124358b10100858d1bb900010119858d5959001816763f183f
-123e113946443e113946443e113946443e113946443e11394660443e1139
-4660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b182b1db096
-4b5358b0aa1d59b0324b5358b0ff1d594bb08153205c58b9020f020d4544
-b9020e020d45445958b90470020f455258b9020f04704459594bb0e45320
-5c58b90020020e4544b90027020e45445958b908420020455258b9002008
-424459594bb8012553205c58b90026020f4544b90021020f45445958b90a
-0d0026455258b900260a0d4459594bb8040153205c58b1d8204544b12020
-45445958b9250000d8455258b900d825004459594bb8040153205c58b901
-5800264544b1262645445958b923200158455258b9015823204459594bb0
-2953205c58b11f1f4544b12d1f45445958b9010d001f455258b9001f010d
-4459594bb02f53205c58b11f1f4544b1251f45445958b90135001f455258
-b9001f01354459594bb8030153205c58b11f1f4544b11f1f45445958b914
-28001f455258b9001f14284459592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65422b01b331757ec3456523
-456023456560234560b08b766818b080622020b17e754565234520b00326
-6062636820b003266165b075236544b07e234420b131c34565234520b003
-266062636820b003266165b0c3236544b0312344b100c3455458b1c34065
-44b23140314523614459b33f3c5841456523456023456560234560b08976
-6818b080622020b1583c4565234520b003266062636820b003266165b03c
-236544b058234420b13f414565234520b003266062636820b003266165b0
-41236544b03f2344b10041455458b141406544b23f403f45236144594569
-5342014b5058b108004259435c58b108004259b3020b0a124358601b2159
-421610703eb0124358b93b21187e1bba040001a8000b2b59b00c2342b00d
-2342b0124358b92d412d411bba04000400000b2b59b00e2342b00f2342b0
-124358b9187e3b211bba01a80400000b2b59b0102342b0112342002b2b2b
-2b2b2b2b2b00b01243584bb035514bb021535a58b1262645b04061445959
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b737373737345b040614418
-004569444569447373737473737374737473742b2b2b2b2b2b2b2b2b2b2b
-2b0073737373737373737373737373737373737373737373747474747474
-7474747474747474747474747474747575757374757575752b7300004bb0
-2a534bb036515a58b1070745b040604459004bb02e534bb036515a58b103
-0345b0406044b1090945b8ffc06044592b4569440174007373732b456944
-2b012b435c58400a0006000702a006a00702b9ffc00274b31a1d326fbd02
-77007f02770002ffc00277b22f3132b9ffc00277b322253240b80274b32f
-353240b80274b3282a3240b80274b21a2132b8ffc0b3371a1d32b8ffc0b3
-251a1d32b8ffc040112d1a1d329025902d9037a025a02da03706b8ffc0b6
-a61a1d321fa61fb8028eb22fa60300742b732b2b2b2b2b2b2b2b742b7374
-59002b2b435c58b9ffc002a1b21c1d32b9ffc002a0b21c1d322b2b592b73
-012b2b2b2b002b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b012b2b2b2b2b
-2b2b73742b2b2b2b2b2b2b2b73732b2b2b2b2b2b732b732b2b2b742b2b2b
-73737373732b73732b2b2b732b2b002b2b2b2b7374732b732b2b2b2b752b
-2b2b2b2b2b2b2b752b2b2b2b2b732b2b2b2b7374752b2b7373732b2b2b73
-2b737374752b2b7374752b2b7374752b2b2b2b2b2b2b2b2b2b2b2b74752b
-000000>
-[16305 16261 16301 15993 16353 16361 16377 15773 16093 16113 15821 16109 16365
-15025 16197 16361 15857 16053 15881 16233 16301 15449 16065 16377 15477 15965
-16117 15425 15557 16353 16369 11749 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-2 8896 39 <000200940000056105ba0010001f007f40332805280a47176504650c052a
-173917481659166816053917361b871b9905960b051f1125010002131225
-0f10081927af070107b8ffc0b3090b3407b8028c40138021012021302102
-2111122000201030100210b8028bb3203153182b4e10f45d3c4dfd3c4d10
-5d71f62b714ded003f3cfd3c3f3cfd3c3130005d71015d13213217161612
-1514070607060706232101113332373e023534262627262394021db76081
-b8602d37664d8362a4fdd30128dd7c37485f3c3c6c533eb505ba1c26c2fe
-e7ceb583a0634b2a1f04c2fc350e1256c5aaaab666120e00>Arial-BoldMT AddT42Char 
-3 1212 70 <00010055ffe8043f043e001900e14051580f59125916680f691269167d18
-79199702970cc610c618d710d618e906e908e913e915f80613381338154a
-124a164618590c690c073a1237163718037705770f8705860f8919a812a7
-16b912b616090eb8ffc0b3181b340eb8ffc0b51214340e330db8ffc0b319
-1e340db8ffc0b30f11340dba0104000a02744012110b0040181b34004012
-1434003390010101ba0101000402744020170701401214340121002f0d40
-1214340d214f0e010e1a1b072114191a5841182b4e10f44ded4e10f65d4d
-ed2bf4ed2b003ffdf45de42b2b3ffdf42b2be42b2b3130005d7101715d01
-052626232206151416333236370506062322001110003332160431feeb0e
-634f697d7f6b50661501142bf4cde9feeb0116edc2e502ec32535491aabd
-9c5b6f2fbec20126010401070125a700>Arial-BoldMT AddT42Char 
-3 1768 72 <00020041ffe80427043e0014001c01a3b90010fff840460b3999099a0d96
-10a805a70abb09bb0db81a0808140148024706460a4f1ea80db606b61ac7
-0ac80cd60ad80cf807f70d0d1c0f1c15401b1d3415400e11340f15bf15cf
-150315b8ffc0b30f1e3f15b8ffc0b30e173f15b8028d400c0f0e12500e60
-0e020e181201b8ffc0b6191b3401331200b8ffc0b31d203400b8ffc0b322
-293400b8ffc0b32b2d3400b8ffc0b3181c3400b8ffc0400f0e0f34a00001
-0000100002005f1212b80274b3040b1218b8027440240b070021012f1521
-4f0e010e1a2f1e5f1e6f1e9f1e041e0f2108400d0f3408191d6941182b4e
-10f42b4ded4e105df65d4dedf4ed003fed435c584014184028143f18401e
-0f3f18401b103f18401c113f2b2b2b2b593ffd435c58b90012ffc0b32814
-3f12b8ffc0b31e0f3f12b8ffc0b31b103f12b8ffc0b21c113f2b2b2b2b59
-f45d712b2b2b2b2b435c58b90000ffc0b2123900b8ffc0b2173900b8ffb0
-b3090a3e00b8ffc0b241213f2b002b2b2b59e42b1112395d435c5840140e
-400f1e3f0e401c113f0e401b103f0e400e173f002b2b2b2b592f3cfd2b2b
-722b2b3c0111333130015d71005d2b010506062320272635100033320003
-211616333236132626232207061702fa011836e9affeeb85690114d3ed01
-1206fd40038261425a270378565c3c3c0101522f9aa1b591dd0108012bfe
-c7febd7d8b48016c7a7f43437300>Arial-BoldMT AddT42Char 
-3 3280 76 <00020093000001ac05ba000300070077b90009ffc0403f110a3f40095009
-028009b009c009d009ef09051f0960097f09a009b0090503060700050403
-0f00014000d000e00003005d02010006050607040a0207260104b8ffc040
-092124340419083f3c182b4e10f42b3c4dfd3c003f3c3f3c3f3cfd5d713c
-0305103c3c103c3c313001715d722b1311211101112111930119fee70119
-04b60104fefcfb4a0426fbda>Arial-BoldMT AddT42Char 
-3 7072 89 <0001000b0000045a0426000b011b401505281a2f3407281a2f3406281a2f
-3408281a2f3403b8ffd8b31a2f3404b8ffc040201a3a349a040106030b08
-080a0c0b1501150212031a091a0a22002d0bc70b0c00b8fff040161d2034
-0a00050b1400190b25002a0b34003a0b870009b10602435458b40a010d0c
-04b8ffc0400b091734040100090106000a003f3f3c1112392b0111123939
-1b40120b000a040b0a0909020201060b000a09390db8ffc040181c28340b
-0d1f0d300d400d040d17171a100a3f0a4f0a030ab80230400b0402390b04
-3f044f040304ba02300001ff80400f0c350001200140010301190cc4a018
-2b194e10f45d2b184ded5ded10fd5d194e456544e65d2b184ded003f3c3f
-3c103c103c12390112393959313001712b5d005d2b012b2b2b2b2b210121
-13173637363713210101b7fe540127c83a17060e10ca0121fe5a0426fde2
-b545162d2d021efbda00>Arial-BoldMT AddT42Char 
-2 0 0 <00020100000005000500000300070042b40201fe0607b8023f4013000504
-fe03000a0704fe010019080605fe0203bc0126000901b0011800182b10f6
-3cfd3c4e10f43c4dfd3c003f3cfd3c10fc3cfd3c31302111211125211121
-01000400fc2003c0fc400500fb002004c000>Arial-BoldMT AddT42Char 
-Arial-BoldMT /CharStrings get begin
-/D 39 def
-/c 70 def
-/e 72 def
-/i 76 def
-/v 89 def
-end
-Arial-BoldMT /Encoding get
-dup 68 /D put
-dup 99 /c put
-dup 101 /e put
-dup 105 /i put
-dup 118 /v put
-pop
-end
-%ADOEndSubsetFont
-/KUDFOG+Arial-BoldMT /Arial-BoldMT findfont ct_VMDictPut
-/KUDFOG+Arial-BoldMT*1 
-[68{/.notdef}rp /D 30{/.notdef}rp /c /.notdef /e 3{/.notdef}rp /i 
-12{/.notdef}rp /v 137{/.notdef}rp]
-KUDFOG+Arial-BoldMT nf
-KUDFOG+Arial-BoldMT*1 [14.04 0 0 -14.04 0 0 ]msf
-438 79.56 mo
-(Device)
-[10.0807 7.79221 7.67987 3.95929 7.80621 0 ]xsh
-/KUDFOG+Arial-BoldMT*1 uf
-/KUDFOG+Arial-BoldMT uf
-/Arial-BoldMT uf
-222 228 mo
-312.5 228 li
-312.5 252 li
-222 252 li
-cp
-@
-%ADOBeginSubsetFont: Arial-BoldMT Initial
-ct_T42Dict begin
--0.625 -0.375 2 1.008
- 256 array 0 1 255 {1 index exch /.notdef put} for  /Arial-BoldMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f32115d5e9f000000cc000000606376
-7420fb3ea3da0000012c0000075a6670676d08e8ba2800000888000005d7
-676c79664fc39cd400009edc0007c44c68656164d65e5fe200000e600000
-003668686561127e15fe00000e9800000024686d7478d62bc37500000ebc
-000034d46c6f636132ab8c4800004390000034d86d61787014dc04760000
-7868000000206e616d65ae0c9081000078880000147d70726570f14ae516
-00008d08000011d267646972000000000000000000000000000303d402bc
-00050008059a05330000011b059a0533000003d1006602120805020b0704
-020202020204e0002affc00078430000000900000000544d432000200020
-fffc05d3fe510133073e01b2400001ffffff0000042605ba000000200004
-05ba001c05ba001c05a7001c0426001c0000ffe40000ffe40000ffe4fe69
-ffe405ba001cfe69ffe402ea0000011d0000011d000000000000000000b2
-00ac00d70128012000b301fa001700f8011901310049000400f7000300af
-00fd00950014005400960112002400160055004901040119012b008c019b
-ff76ffe9003d009200a2ffb70182ffaa0016008f00c600f8001c00de0401
-0037004e00550055006500e903e50059ff9a00080087000b003b00520116
-006100d600d600f500000093009400be017cfff80004001400820092003c
-00410041ffc1fffc002a008c049005d809b5009100bb0106ff63ff69001e
-0022008a022bffd6ffdf0026005900a300ac0104012b01c004480021006b
-00850098011903c6006b009500a400fe010c025d034305bf000000490056
-006e0077008a00aa00ca0112015005d805f0ff7bffe70006001300280061
-006900e90135014d02a5040cff3effda005b00b900c801190119011901c0
-045b04a7055bfe3fff9dffc2001500b7010a01bc01c10532058efd81ffa1
-ffae000c00260031003d004e00560062008300c100c900f100f2027fff7f
-00480053007700c5011d01200126012801d60219027e027e03d3002e0041
-005d006b0075009f00b000b200ba00bb00bd00d600db00e000e50114011b
-014a0162019101f2020c026402cf039b03b403d4040104a9001600230025
-002a007400a500b600cc00cd00cf0105012001300150016a016f0197019d
-01e002b002ec02f70408048304fb04fd0526fee0fefbff4efff50018001a
-004c007a007f009100a300b300b400ce00d500f200f300f6011001380168
-01a101b001e001ec02090222024f0270029602a502ad034e039103c10435
-0442046b04cd04da0586058b076107fefca6fe93feadfed1ffb7ffd10003
-000e00180026004600690081008f00a500bf00d300d500d900dd00e20119
-012b0138013b015a015e016801730188019401ad01c501d101ea01f20200
-020002000222023b0244024f026f0272027e02820293029402a502cf02cf
-02d002da02dd02eb02f5030503220336037103a103b003b803d003e60410
-0426042e0431044f045a04ff053205320547055305a805ab05c205f0063c
-0664067006e80782078408ccfd2afddefe00fe68feb0feb3ffaa00080059
-007a0091009e00a200af00b400bb00ca00cc00ce00d900e000f40114011a
-01210127012b01390146014b014d0157015c01650182018701920198019b
-01a201ae01c501c501d102070222022b024102530261026502840287028d
-02b402b402ba02c902d602d802ed02f503170323032b03310349035a035b
-036e03710374037e03840391039103aa03cf03d303e703e803ed04080417
-041e0475047a049904a704b404d1054c056d056d05a205bf05c005d105fc
-05fc0602061a061c062f066a06a806e2070607360750078907d407f30870
-011c012a011a01200000000000000000000000000219000b001e02aa0214
-047f01ed0000001d0104000f0091002b01880153011201f3003f03fe0168
-010e047f01ed036e03150219041300000000064004b00000027401bb0035
-01c5007f06020301000004e000b201dc02e004c3023d00d50160011904a7
-036e05ca022100ab0426009002bc02bb014200b4023c0256029c030001e5
-01a800e5006b00780094016b017300ab01ed013a017d0137017f00d40216
-03530184003cffa202040109014901f0006e031500810464005e00000000
-0000000000000000000000000000000000000000000000000000013900dc
-00e9fe9e040d047c012b00b80096005900ac00df01a900fa0105ffec0017
-0003005500610004008c00a3008500280120005d00d6007f012601190104
-016c06cf00b4010600000737063e047a00f000f900e905ba042604420000
-ffe7fe69049e04e3ff37ff2d01200105012000a800740068004700f200e5
-00d900bd00a800680047005c0048000a0028003200410050005a0064007d
-00870091ffb0ff9cff83ff79ff6f00cb012000fa012c01fa01a000d500b8
-005c003c00c800c8008f00d9018b00b30047000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000fe6400c000ea01180125013203b003ed0576
-059005aa05b405be05cd063100780084009b00cc00e200f4010a01200163
-00d100ea00f7010801420019002c00340041003800480058006c025903bd
-0043011a007000d30028003700420050005a0064007300780082008c009c
-00a500bd00ce00f00110015c00be00d801020117012c016300ea01080041
-004b0055005f007300a60109018301b300410064001e002a00eb00fa010e
-01380274002c00400082009600b600c000cc00dc00e600f000ff010a0120
-012c013b01440156016300f70057006401100136005001b10000ffb60039
-004e004403cc00e5002401100042012201a400f0006000e0000e001d0039
-05e30102002cfe4eff38026903bd011600ff000e00a00054001b003d0171
-0041000f005000fd0015014f0035fe52002c00d3010304b001d200b600c0
-00990265ff870377fe6c00cb00a9005c0040047607440000404154403f3e
-3d3c3b3a3938373534333231302f2e2d2c2b2a292827262524232221201f
-1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201
-002c4523466020b02660b004262348482d2c452346236120b02661b00426
-2348482d2c45234660b0206120b04660b004262348482d2c4523462361b0
-206020b02661b02061b004262348482d2c45234660b0406120b06660b004
-262348482d2c4523462361b0406020b02661b04061b004262348482d2c01
-10203c003c2d2c20452320b0cd442320b8015a51582320b08d44235920b0
-ed51582320b04d44235920b09051582320b00d44235921212d2c20204518
-684420b001602045b04676688a4560442d2c01b10b0a432343650a2d2c00
-b10a0b4323430b2d2c00b0172370b101173e01b0172370b10217453ab102
-00080d2d2c45b01a234445b01923442d2c2045b00325456164b050515845
-441b2121592d2cb00143632362b0002342b00f2b2d2c2045b0004360442d
-2c01b00643b00743650a2d2c2069b04061b0008b20b12cc08a8cb8100062
-602b0c642364615c58b00361592d2c45b0112bb0172344b0177ae4182d2c
-45b0112bb01723442d2cb01243588745b0112bb0172344b0177ae41b038a
-45186920b01723448a8a8720b0c05158b0112bb0172344b0177ae41b21b0
-177ae45959182d2c2d2cb0022546608a46b040618c482d2c4b53205c58b0
-02855958b00185592d2c20b0032545b019234445b01a23444565234520b0
-0325606a20b009234223688a6a606120b01a8ab000527921b21a1a40b9ff
-e0001a45208a54582321b03f1b235961441cb114008a5279b31940201945
-208a54582321b03f1b235961442d2cb110114323430b2d2cb10e0f432343
-0b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2cb10e0f432343650b
-2d2cb11011432343650b2d2c4b525845441b2121592d2c0120b003252349
-b04060b0206320b000525823b002253823b002256538008a63381b212121
-212159012d2c4bb06451584569b00943608a103a1b212121592d2c01b005
-251023208af500b0016023edec2d2c01b005251023208af500b0016123ed
-ec2d2c01b0062510f500edec2d2c20b001600110203c003c2d2c20b00161
-0110203c003c2d2cb02b2bb02a2a2d2c00b00743b006430b2d2c3eb02a2a
-2d2c352d2c76b8023623701020b802364520b0005058b00161593a2f182d
-2c21210c6423648bb84000622d2c21b08051580c6423648bb82000621bb2
-00402f2b59b002602d2c21b0c051580c6423648bb81555621bb200802f2b
-59b002602d2c0c6423648bb84000626023212d2cb4000100000015b00826
-b00826b00826b008260f10161345683ab001162d2cb4000100000015b008
-26b00826b00826b008260f1016134568653ab001162d2c4b53234b515a58
-20458a60441b2121592d2c4b545820458a60441b2121592d2c4b53234b51
-5a58381b2121592d2c4b5458381b2121592d2cb0134358031b02592d2cb0
-134358021b03592d2c4b54b012435c5a58381b2121592d2cb012435c580c
-b00425b00425060c6423646164b0035158b00425b00425012046b0106048
-2046b0106048590a21211b2121592d2cb012435c580cb00425b00425060c
-6423646164b807085158b00425b00425012046b8fff060482046b8fff060
-48590a21211b2121592d2c4b53234b515a58b03a2b1b2121592d2c4b5323
-4b515a58b03b2b1b2121592d2c4b53234b515ab012435c5a58381b212159
-2d2c0c8a034b54b00426024b545a8a8a0ab012435c5a58381b2121592d2c
-462346608a8a462320468a608a61b8ff8062232010238ab902a702a78a70
-456020b0005058b00161b8ffba8b1bb0468c59b0106068013a2d2cb10200
-42b123018851b1400188535a58b910000020885458b202010243604259b1
-2401885158b920000040885458b202020243604259b12401885458b20220
-02436042004b014b5258b2020802436042591bb940000080885458b20204
-0243604259b94000008063b80100885458b202080243604259b940000100
-63b80200885458b2021002436042595959592d00000100000005028f9f18
-7df95f0f3cf50819080000000000a2e33c1d00000000c14fd725fafafcfd
-1000081500010009000100010000000000010000073efe4e00431000fafa
-fa7a1000000100000000000000000000000000000d350600010000000000
-023900000239000002aa00b803cb00700473001204730046071d005905c7
-005a01e7005c02aa006b02aa0043031d001c04ac00550239007502aa0073
-023900930239fffd04730056047300a2047300330473004d047300260473
-005b0473005704730057047300530473004102aa00c902aa00aa04ac005f
-04ac005504ac005f04e3006a07cd003d05c7000005c7009605c7006105c7
-00940556009504e300970639006205c700960239008c0473002305c70099
-04e3009d06aa009105c7009806390059055600950639005905c700960556
-004a04e3002c05c700930556ffff078d0007055600000556fffd04e30016
-02aa00920239fffd02aa002604ac00730473ffed02aa002a0473004904e3
-00870473005504e300540473004102aa001804e3005404e3009202390093
-0239ffa20473008902390093071d007e04e3009104e3005204e3008b04e3
-005b031d00870473003002aa001f04e3008d0473000b063900090473000c
-0473000e04000022031d003c023d00b0031d002d04ac004305c7000005c7
-000005c700610556009505c700980639005905c700930473004904730049
-047300490473004904730049047300490473005504730041047300410473
-004104730041023900920239ffe90239ffcd0239ffd004e3009104e30052
-04e3005204e3005204e3005204e3005204e3008d04e3008d04e3008d04e3
-008d0473004403330056047300540473000d0473003b02cd00420473fffe
-04e3008b05e5fff705e5fff7080000d802aa00bb02aa0005046400310800
-ffaa0639003f05b40098046400320464003c0464003c04730001049c006f
-03f4002c05b4007a069600a1046400000231000002f6002502ec001a0625
-0037071d005804e3005704e3006502aa00c304ac0055046400540473ffec
-0464001f04e5001a047300600473006a080000c905c7000005c700000639
-005908000048078d00580473fffc08000000040000840400006902390098
-023900720464003103f4002f0473000e0556fff70156fea90473ffe002aa
-004b02aa004b04e3001f04e3001f04730044023900930239007504000071
-0800000105c700000556009505c7000005560095055600950239006a0239
-ffae0239ffbf0239ffc106390059063900590639005905c7009305c70093
-05c700930239009302aa000302aafff302aa001302aa001a02aa00cd02aa
-009102aa002602aa006002aa003902aa000304e3000a0239000a0556004a
-0473003004e3001604000022023d00b005c7fffd04e300530556fff70473
-000e0556009504e3008b04ac005504ac006d02aa005b02aa001902aa0028
-06ac005c06ac005c06ac0028047300000639006204e300540239008c0556
-004a0473003005c700610473005505c700610473005504e30054046bffed
-02aa00c805c700000473004905c700000473004905c7009405c0005105c7
-fffd0556009504730041055600950473004104e3009d0239007904e3009d
-0315009504e3009a03d5009005c7009804e3009105c7009804e300910639
-005904e3005205c70096031d008705c70096031d00500556004a04730030
-04e3002c02aa001f04e3002c03d5001e05c7009304e3008d05c7009304e3
-008d04e300160400002204e300160400002204cf009a0639005606910056
-04eb004e04da004e03cc004e0579004e0392003005b9004e046bffed04d5
-00b8032b004f08c000290800004f040000990800004f040000990800004f
-040000980400009807d5016a05c7008f04ab005504d5009d04ac005504d5
-022204d5010505abffe9050001c905ab027e05abffe905ab027e05abffe9
-05ab027e05abffe905abffe905abffe905abffe905abffe905ab01c005ab
-027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab01c0
-05ab01c005abffe905abffe905abffe905ab027e05ab01c005ab01c005ab
-ffe905abffe905abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905ab02d605ab006605abffea05d5ffff04d500920800000007eb0130
-07eb012007eb013007eb012004d500b204d5008004d5002a082b0198086b
-01b807550010060000f40600006f0440003a0540003704c0003f04150040
-04000025060000550647008c0473009005abffc701eb008d03d500860715
-002303e9001804d5009202d6005c02d6005c04d500b202d6004d05c70000
-0473004905c700610473005505c700610473005505560095047300410556
-00950473004105560095047300410639006204e300540639006204e30054
-0639006204e3005405c7009604e3009205c7000504e300190239ffba0239
-ffbb0239ffda0239ffda0239ffe10239ffe2023900480239004704730023
-0239ffa205c70099047300890473008d04e3009d0239ffed05c7009804e3
-009105c9009c04e3008e0639005904e300520639005904e3005205c70096
-031d002a0556004a0473003004e3002c02aa000705c7009304e3008d05c7
-009304e3008d05c7009304e3008d05c7009304e3008d078d000706390009
-0556fffd0473000e0239008d05c70000047300490800ffaa071d00580639
-003f04e3005702aa00c9078d000706390009078d000706390009078d0007
-063900090556fffd0473000e0239009502aaffd70473000d04cd005a06ac
-005c06ac002906ac003006ac002f02aa00bc02aa002602aa00bb03b8fff4
-05c7ffe806d3ffbb073fffbb03caffbb0699ffa6076bffc806b4ff9c0239
-ff2905c7000005c7009605c000000556009504e3001605c700960239008c
-05c700990556000006aa009105c70098052600660639005905c7009a0556
-009504cd005a04e3002c0556fffd0556000006790056066a00620239ffcc
-0556ffff04eb004e039c004e04e3008e0239008204a8006c04e200900473
-000f03af004e04e3008e0453004e023900930476008e0473000f04e50090
-0473000b0390004e04e3005204f300760429004e04a80076049b00110607
-007606c2004e0239ffcd04a8007604e3004e04a8007606c2004e055a0097
-0715002f048900a405b100580556004a0239008c0235ffca0473002308c0
-001a0880009d0700003704e2009a04fa000005c0009905c7000005c0009b
-05c70096048900a405b3fffa05560095073b00170503002c05c0009905c0
-009904e2009a059d002006aa009105c700960639005905c0009905560095
-05c7006104e3002c04fa000006d400590556000005d8009a059f007d080a
-009a0827009a06f5001a07d5009d05c0009b05b100570840009605c00004
-0473004904f1005c04eb0096035500880514fff90473004105acffff03fa
-001804eb008c04eb008c040100880515001905eb009b04d5008804e30052
-04d5008804e3008b0473005503eb00150473000e070000540473000c04eb
-008904a5007206ab008c06c0008d05d5002806d5009504eb0099046b0038
-06d5009104abfffb0473004504e3000003550088046b0051047300300239
-00930240ffd00239ffa207c000180740008c04e300000401008804730012
-04d5008803e50096039300880800004108eb00a306200030000001010000
-001e0000003100000031000001010000007f0000007e0000008c0000008c
-000001010000001000000101000001210393007d0000008c026500c80000
-03020000ff0102aa00c904a90059049b004103a7000a0466003204ea0082
-022f0087034e005a04ed00870503007d022f0087042c002803ed004b03f8
-004104e30087050a0037022f00870316004b04e800500459000a04c00064
-04b2006403ff000a0418000a04950082042c002805b8005a0563002d045e
-0087045e0087045e00870236005004090050068b0087022fffac042c0028
-042c002803f8ff1603f8ff160479003205b8005a05b8005a05b8005a05b8
-005a04a9005904a9005904a90059049b004103a2000a0466003204ea0082
-02950000038100000503007d02950000042c002803ed004b03f80041050a
-00370316004b04e8005004c0006404b200640418000a04950082042c0028
-05b8005a0563002d022f0087049b004103ed004b04b2006404db00410000
-ffdc0000ff250000ffdc0000fe51028d00ab028d00a002da004303c0007e
-0196ffba0000004600000046000000460000004600000048000000460000
-004600000046047e0188047e0150047e0104047e009e047e012d047e00ea
-047e00d5047e009c047e00bc047e00ee04350085028d00c1043500b30600
-01000600010002be005806000100047e00a5047e00bd047e00de06000100
-060001000600010006000100060001000000004606000100060001000600
-0100060001000600010006000100060001000600010004e6ffba06000100
-06000100060001000532003905320039022cffba022cffba060001000600
-01000600010006000100049e0034047800300430ffba0430ffba0376000a
-0376000a060e00290708002902e2ffba0456ffba060e00290708002902e2
-ffba0456ffba05280097046f000a03520003060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100000000300000004600000046
-000000400000004606000100060001000000ffdc0000fe510000ff160000
-ff160000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ffdc0000ff160000ffdc0000ff200000ffdc0473002d080000000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d007f028d00670600
-010005a0002e03c0007e01e800000207ffc301bc005e01e0fffa039c0006
-039c000601bc005e01e0001a05280097049e0011022cffba022cffba01bc
-008801e0001a0532003905320039022cffba022cffba02be003603520003
-0532003905320039022cffba022cffba0532003c0532003c022cffba022c
-ffba049e0034047800300430ffba0430ffba049e0034047800300430ffba
-0430ffba049e0034047800300430ffba0430ffba02be006902be006902be
-006902be00690376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba073200400732004004deffba04deffba088000400880
-0040062cffba062cffba0880004008800040062cffba062cffba0430ffba
-0430ffba0430ffba0430ffba0430ffba0430ffba0430ffba0430ffba0454
-003403c000460454ffba02e2ffba0454003403c000460454ffba02e2ffba
-0610002f0610002f0270ffba0298ffba04e6002704e600270270ffba0298
-ffba045400290454002902e2ffba02e2ffba039c0023039c002301e0ffba
-01e0ffba02e2002102e200210352ffba0352ffba0454003e0454003e022c
-ffba022cffba02be00580352000303c0ffba039cffba039c0006039c0006
-05280097046f000a05280097049e0011022cffba022cffba0454000004c4
-000003e400220454001a03e400220454001a03e400220454001a06000100
-060001000000004600000046060001000600010006000100000000460000
-004606000100060001000000004800000046060001000600010006000100
-000000460000004600000046000000460000004000000030060001000000
-004600000046060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100028d00ca028d00c7028d00c6060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010002be0069
-0100ffba0800ffba1000ffbb06d3005905b0005206a3009305cb008d0000
-fd880000fbc10000fc5f0000fe310000fcad0000fd550000fe260000fdf1
-0000fd180000fc690000fd950000fbe00000fc700000fed40000fecd0000
-fea0041b007806ac005c06ac00190000fe450000fd550000fda60000fc5f
-0000fe250000fd180000fbe00000fafa0000fb360000fc700000fb870000
-fb9b0000fcce0000fc540000fbc30000fc940000fbf50000fdb00000fe59
-0000fd7e0000fc820000fd340000fe500000fe460000fcd10000fd3e0000
-fd020000fc3a0000fce90000fc260000fc070000fc2f0000fb9e0000fb76
-0239009305c700000473004905c700000473004905c700000473004905c7
-00000473004905c700000473004905c700000473004905c7000004730049
-05c700000473004905c700000473004905c700000473004905c700000473
-004905c70000047300490556009504730041055600950473004105560095
-047300410556009504730041055600950473004105560095047300410556
-00950473004105560095047300410239006a0239005d0239008c02390093
-0639005904e300520639005904e300520639005904e300520639005904e3
-00520639005904e300520639005904e300520639005904e3005206d30059
-05b0005206d3005905b0005206d3005905b0005206d3005905b0005206d3
-005905b0005205c7009304e3008d05c7009304e3008d06a3009305cb008d
-06a3009305cb008d06a3009305cb008d06a3009305cb008d06a3009305cb
-008d0556fffd0473000e0556fffd0473000e0556fffd0473000e05c70000
-047300490239ffca0239ffca0639005904e3005205c7009304e3008d05c7
-009304e3008d05c7009304e3008d05c7009304e3008d05c7009304e3008d
-0000fef90000fef90000fef40000feef0489fffd03550007073b001705ac
-ffff04e2009a0401008804e2009a0401008805c7009604d5008804730001
-047300120473000104730012055600000473000c059f007d04a50072059f
-009c04e3009205cf00590473004c0639005604e3005205320039022cffba
-0270ffba0298ffba04e60027022c0065022c0016022c0016022c0011022c
-0043022cffd20000fef00000000f0000fff502aa009002aa009000000000
-0000005e0000005e0000ffcb01bc000f01e0ffbf01bcfff501e0ffcd01bc
-001d01e0000901bc008801e0001a039c0006039c0006039c0006039c0006
-05280097046f000a0532003905320039022cffba022cffba053200390532
-0039022cffba022cffba0532003905320039022cffba022cffba05320039
-05320039022cffba022cffba0532003905320039022cffba022cffba0532
-003905320039022cffba022cffba0532003905320039022cffba022cffba
-049e0034047800300430ffba0430ffba049e0034047800300430ffba0430
-ffba049e0034047800300430ffba0430ffba049e0034047800300430ffba
-0430ffba049e0034047800300430ffba0430ffba049e0034047800300430
-ffba0430ffba02be004f02be004f02be006902be006902be006902be0069
-02be004f02be004f02be006602be006602be006902be006902be006902be
-006902be002f02be002f02be002202be00220376000a0376000a0376000a
-0376000a0376000a0376000a0376000a0376000a0376000a0376000a0376
-000a0376000a0376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba073200400732004004deffba04deffba073200400732
-004004deffba04deffba0880004008800040062cffba062cffba08800040
-08800040062cffba062cffba0430ffba0430ffba0454003403c000460454
-ffba02e2ffba0610002f0610002f0610002f0270ffba0298ffba0610002f
-0610002f0270ffba0298ffba0610002f0610002f0270ffba0298ffba0610
-002f0610002f0270ffba0298ffba0610002f0610002f0270ffba0298ffba
-04e6002704e6002704e6002704e60027093e0032093e00320740ffba0740
-ffba060e00290708002902e2ffba0456ffba045400290454002902e2ffba
-02e2ffba045400290454002902e2ffba02e2ffba045400290454002902e2
-ffba02e2ffba060e00290708002902e2ffba0456ffba060e002907080029
-02e2ffba0456ffba060e00290708002902e2ffba0456ffba060e00290708
-002902e2ffba0456ffba060e00290708002902e2ffba0456ffba039c0023
-039c002301e0ffba01e0ffba039c0023039c002301e0ffb101e0ffb1039c
-0023039c002301e0ffba01e0ffba039c0023039c002301e0ffba01e0ffba
-0454003e0454003e022cffba022cffba0454003e0454003e0454003e0454
-003e0454003e0454003e022cffba022cffba0454003e0454003e049e0034
-047800300430ffba0430ffba02be005803520003031a001a031a001a031a
-001a039c0006039c0006039c0006039c0006039c0006039c0006039c0006
-039c0006039c0006039c0006039c0006039c0006039c0006039c0006039c
-0006039c000605280042046fffd905280097046f000a022cffba022cffba
-039c0006039c000605280097046f000a022cffba022cffba05280097046f
-000a067f0044067f0045067f0044067f004501a800280000fe290000fe8c
-0000ff250000ff230000fefa0000ff7a0000fe5908fc003208ad00320000
-ffb50000ffb60000fef00000ff590000fe590000ff8c01b4000002f70000
-0000fe850000ff0704cd00320000ff580000ff580000ff59073200400732
-004004deffba04deffba0880004008800040062cffba062cffba04540034
-03c000460454ffba02e2ffba03c0007e02e2002102be0058022cffba0290
-ffba01f4002f01f4003b01f4001201f400b101f4006d060e002907080029
-022f00870000fec803500000045e008703e4fff50454fff503e400220454
-001a03e400220454001a03e400220454001a03e400220454001a03e40022
-0454001a03e400220454001a047e0072047e00bd03e4000f0454000f04e3
-001b06b1001e05c0009b04e3008705c0000a04e3000a05c7006905c70061
-0473005505c7fffd06b3001e05c0005c04e3005404da004e055600660503
-006f04e3ffac063900620518000207720092023900930239000705c70099
-047300890239001b0473000f07ef009605c7ffad04e3008e063900560718
-005905f300550641001e04e3008b05560095055600640473006304cd005a
-02e1001e02aa001f04e3001802aa001f04e3002d066a006205c700930629
-00000473000e04e300160400002204e3003a04e300590436002a04360039
-047300330473005b03fa001e04a2001f04e3008b023d00b003fb00b004ad
-005602aa00b80aaa009409c7009408e300540956009d071c009d04720093
-0a3a009808000098071c00910473004c05c70000047300490000fefe05c7
-0000047300490800ffaa071d00580639006204e300240639006204e30054
-05c70099047300890639005904e300520639005904e3005204e3003a0436
-00220239ffa20aaa009409c7009408e300540639006204e3005408430096
-0552009505c7009804e3009105c700000473004905c70000047300490556
-00950473004105560095047300410239ff370239ff2d0239fff40239ffe6
-0639005904e300520639005904e3005205c70096031dffcd05c70096031d
-008005c7009304e3006705c7009304e3008d0556004a0473003004e3002c
-02aa001f049e002e0429004905c7009604e30092059f009c050c0052050c
-005204e300160400002205c7000004730049055600950473004106390059
-04e300520000fefd0639005904e300520639005904e300520639005904e3
-00520556fffd0473000e0473004504e3005404e3008204e3008704730034
-0473001404e3005404e300540473004c0641004c03fa004f03fa00180587
-0018048a005202aaffc404e3005404e3005404b000520473000f04ce000f
-04e3008a04e3009204e300920239001b023900930239009302a8000002d9
-00140239009304d40093071d0085071d0085071d007e04e3ffa604e30091
-04eb008c04e3005206ab005206c2004e05ff0052031dffe6031dffe6031d
-ffe6031d0087031d0087031d0087031dffe604ab008a04ab008a04730030
-02aaffc402aaffc402aaff9b0451001e02aa001902aa001f04e3001b04f8
-004904a8009104730012063900090473000f0491000f0400002205700022
-0436002204360022047300420473005504730042047300550639005904eb
-0096048a004f04b0005204d5008803ab001e04730014039e008804e3005b
-0473004204730055083f00540789005409af00540682001f0446001f0698
-001f06f4001806350093058a00930445001e0482008802f1003202f10032
-018effe202040032020400000204000003000032042f000002e2000001e7
-005c03cb007002390098023900750239009402aa00f302aa00f303000032
-0300003204ac005f04ac005f04ac002a04ac002a02aa012102aa00bb02aa
-002a02aa012102aa001302aa002a02aa00bb02aa00ca02aa00ca02aa00f3
-02aa00f302aa00a602aa00a602aa00a602aa001302aaffe102aafffb02ed
-0000012100320302003202ee000003000032031000960310009603100096
-031000960310009602aa006202aa006202aa000302aa001d040000690457
-009604570096045700960457009604570043045700430457004304570043
-04570043031000430457002f0457002f0457002f0457002f0457002f0310
-002f04570025045700250457002504570025045700250310002f0457001a
-0457001a0457001a0457001a0457001a0310001a04570042045700420457
-004204570042045700420310004204570096045700960457009604570096
-0457004204570042045700420457004204570042031000420457002f0457
-002f0457002f0457002f0457002f0310002f0457002f0457002f0457002f
-0457002f0457002f0310002f045700260457002604570026045700260457
-002603100026045700420457004204570042045700420457004203100042
-045700960457009604570096045700960457004204570042045700420457
-004204570042031000420457002604570026045700260457002604570026
-031000260457002304570023045700230457002304570023031000230457
-002f0457002f0457002f0457002f0457002f0310002f0457004b0457004b
-0457004b0457004b0457004b0310004b0457009604570096045700960457
-00960457004204570042045700420457004204570042031000420457001a
-0457001a0457001a0457001a0457001a0310001a04570024045700240457
-00240457002404570024031000240457002f0457002f0457002f0457002f
-0457002f0310002f0457004e0457004e0457004e0457004e0457004e0310
-004e045700960457009604570096045700960000feaf0000febf0000fdb5
-0000fec80000ff780000feb10000ff3d0000fe6f0000feae0000ffce0000
-ff660000fe6f0000fec80000fec80000ff680000ff680000ff6800000000
-0000ff1f0000ff1f0000ff440000ff5f0000fe870000ffec0000ff9c0000
-ff510000ff510000ff510000febf0000ff15000000000000feb10000ff3d
-0000ff6b0000fef20000ff470000ffce0000fe870000febb0000feae0000
-feae0000fec80000fec80000fea60000febf0000fdb70000fdb90000fea6
-0000febf0000fdb50000fe1f0000fee20000ff9c0000fe870000ff440000
-feba0000ff230000ff9a0000fdb90000fe3b000000000000fea70000ff68
-0000fe170000ff740000fe870000fdb90000ff660000ff440000fea70000
-fea70000fea70000ff030000ff520000fd1f0000ff530000ff530000ff53
-0000feb10000feb00000ffa10000fe8c0000feb80000feaf0000fea20000
-feba0000fdf40000ff190000ff2d0000fe8c0000fe8802aa00bb02aa002a
-02aa00c804e2009004a8007606290000080200000629000005ff005206c2
-004e056900140639005904e3005205c700610473005504e30097039e0088
-06030000043c001d066f000a04e2000a07ef0096071d0085059f007d04e3
-008a059f009c04d7000a05560064055600640524001404d4000a05e10055
-04a0004b040e0014038400280569001404f1005c047300550239ffa20639
-005603d4005103d400510556009505c000990473004104eb008c0a3d0059
-063a001406f4001a059f001b07ce008c065e0093055600000473000b0768
-008c066700930679005606070076089e008c07d800930503004603fa0043
-06790056060700760639005604e300520685ffff052c000b0685ffff052c
-000b0b3a005909bd005206840055051a004b0a3d0059073500550000fe37
-0a3d0059063a001405c700610473005504ac000f0000fea60000feb10000
-feaa0000fead0000fc2b0000fc4c05c0009904eb008c05c0001104eb001b
-0556009504e3008b059f009c04c900880503002c03fa001804e200110401
-000d0617001a04fc00280709009605b6008809020099075f008805c70061
-049f005505c700610473005504e3002d03eb001506d2002c05830015059f
-007d04a5007206da000a056d000a06da000a056d000a0239008c073b0017
-05acffff059d009a04c80088059d00200515001905c7009604d5008805c7
-009604d50088059f007d04a5007206aa009105eb009b02aa001a05c70000
-0473004905c70000047300490800ffaa071d0058055600950473004105cf
-00590473004c073b001705acffff0503002c03fa00180503002c04360022
-05c0009904eb008c05c0009904eb008c0639005904e300520639005604e3
-005205b10057046b003804fa00000473000e04fa00000473000e04fa0000
-0473000e059f007d04a5007207d5009d06d5009505c0005e04e30054083e
-005e077a005407ad004606c4004305430046044a0043081a002007a50019
-08430096076600880639006204b000520620002d059b00150000ff430000
-fec90000ff770000ffb00000ff470000ff560000ff740000fed70000feac
-000000000000ff520000ff56000000000000feac0000fd9a000000000000
-ff6a0000ff7c0000ff690000ff560000feac0000ff7f0000ff560000fdef
-0000ff430000ff690000ff7c000000000000fdae0000ff8c000001020000
-feef0000feef0000fefd0000fef90000ff530000fef80000fef905c70000
-0473004905c7009604e3008705c7009604e3008705c7009604e3008705c7
-00610473005505c7009404e3005405c7009404e3005405c7009404e30054
-05c7009404e3005405c7009404e300540556009504730041055600950473
-004105560095047300410556009504730041055600950473004104e30097
-02aa00180639006204e3005405c7009604e3009205c7009604e3009205c7
-009604e3009205c7004e04e3003b05c7009604e300920239ffd20239ffd2
-0239001b0239ffce05c700990473008905c700990473008905c700990473
-008904e3009d0239009304e3009d0239ffeb04e3009d0239ffdd04e3009d
-0239ffcb06aa0091071d007e06aa0091071d007e06aa0091071d007e05c7
-009804e3009105c7009804e3009105c7009804e3009105c7009804e30091
-0639005904e300520639005904e300520639005904e300520639005904e3
-00520556009504e3008b0556009504e3008b05c70096031d008705c70096
-031d008705c70096031d008705c70096031d00590556004a047300300556
-004a047300300556004a047300300556004a047300300556004a04730030
-04e3002c02aa001f04e3002c02aa001f04e3002c02aa001f04e3002c02aa
-001f05c7009304e3008d05c7009304e3008d05c7009304e3008d05c70093
-04e3008d05c7009304e3008d0556ffff0473000b0556ffff0473000b078d
-000706390009078d000706390009055600000473000c055600000473000c
-0556fffd0473000e04e300160400002204e300160400002204e300160400
-002204e3009202aaffde063900090473000e047300490239008d04eb004e
-04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e05c7
-000005c7000006f3fff206f3000006f3fff206f3000006f3004306f30043
-03cc004e03cc004e03cc004e03cc004e03cc004e03cc004e061efff2061e
-000007aefff207ae000007aefff207ae000004e3008e04e3008e04e3008e
-04e3008e04e3008e04e3008e04e3008e04e3008e068ffff2068f0000081f
-fff2081f0000081ffff2081f0000081f0014081f00140239009002390090
-0239ffb60239ffc40239ffde0239ffec0239ffb30239ffc00301fff20301
-00000491fff2049100000491fff204910000049100140491001404e30052
-04e3005204e3005204e3005204e3005204e30052069dfff2069d00000855
-fff20855000007c9fff207c9000004a8007604a8007604a8007604a80076
-04a8007604a8007604a8007604a800760682000007fe00000862000007ae
-fff306c2004e06c2004e06c2004e06c2004e06c2004e06c2004e06c2004e
-06c2004e06cefff206ce00000886fff20886000007fafff207fa000007fa
-fff307fafff304eb004e04eb004e03cc004e03cc004e04e3008e04e3008e
-0239ffe70239008d04e3005204e3005204a8007604a8007606c2004e06c2
-004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e04eb004e
-04eb004e05c7000005c7000006f3fff206f3000006f3fff206f3000006f3
-004306f3004304e3008c04e3008c04e3008c04e3008c04e3008c04e3008c
-04e3008c04e3008c068ffff2068f0000081ffff2081f0000081ffff2081f
-0000081ffff3081ffff306c2004e06c2004e06c2004e06c2004e06c2004e
-06c2004e06c2004e06c2004e06cefff206ce00000886fff20886000007fa
-fff207fa000007fafff307fafff304eb004e04eb004e04eb004e04eb004e
-04eb004e04eb004e04eb004e05c7000005c7000005c7ffd105c7ffdd05c7
-000002aa00dc02aa00ca02aa00dc02aafff302aafff304e3008c04e3008c
-04e3008c04e3008e04e3008c06e6000006e60000075700000757000005c7
-009602aafff202aafff202aafff30239ffe50239ffdb0239ffce0239ffce
-0239ffc20239ffbb0239ffe80239ffde03c9000003c9000002aa000002aa
-000002aafff304a8007604a8007604a8007604a8007604f3007604f30076
-04a8007604a800760556fffd0556fffd06e6ffd8074affdd061e000003b8
-fff403b8fff402aa002a06c2004e06c2004e06c2004e06c2004e06c2004e
-0765ffd1069dffdd0796ffd106ceffdd066a006202aa00bb02aa00dc0473
-000a05c7006105c70061071d007e05c7002109cd0096078d000705c70020
-04e3002d08b000140400003004c100660000ff530000ff530000ff530000
-ff530239001b0239ffa2047300000556001206b3005403fe005706ab0091
-040c001f05d6ffe605d6ffe602aa008402aa008402aa00c902aa00c902aa
-009102aa002a02aaffc502aaffc302aafff302aa00c902aa00a902aa00a9
-02aa00a902aa00a9032e001e032e001e02aa003a0000ff730000ff9d0000
-fec80000ff230000ff720000ff720000fee70000ff9d0000ff530000ff53
-0000ff530556009504e3008b04b5000006350000071d006104eb000f0473
-0055049900910499001b0401008c03fa001802390093040f00490476008e
-039e000e05eb009b04eb008c04e300520473003404f1005204f1005204f1
-0021078d00540492004b04e3005304e3005304e9008c04abfffb04abfffb
-03eb001504a8007604e300510624005104e000510473000b063900090400
-002203df002203f2004b04ec0014035500880473001204d5008804e9008c
-060700760515001903e300000591000003a2003203a2000003a300320355
-00320355003204030032037c00320172005502de003203b00032031e0032
-04220032037700320378003204260032037a0032035b003203ac00320377
-0032037b00320514000003050032030500320321003204b6003203210032
-03210032030200320302003202cf003202cf0032032000320121003202ca
-00320484003402f2003203480032030a0032034900320349003203200032
-01bc000a02f20032034200320484003202e90000034c000a031b003202e9
-00000343003203da003203080000012100320204003202f2003202e90000
-031b003202e900000342003203da00320308000005ed00460a9800460613
-00460689ffba0541ffba01e9001e045400100000ff0d0000ff350000fece
-0000feb70000fec90000ffc70000ff4f0000ff9e0000fef002be006902be
-00690376000a0376000a03c0ffba039cffba03c0ffba039cffba05c80039
-05920032061600820519004b05240041060f008705580028068f002d04ac
-00550000fe3b0000fe660000fe680473fffc0400008403d5ffba01e0ffba
-01e0ffb101e0ffba01e0ffba06d0002e0984002304000000080000000400
-00000800000002ab000002000000015500000473000002390000019a0000
-00ab00000000000005e5fff705c7006106aa009105eb009b0760008d07a1
-005407a1005b05c7000005c700610473001404e3001104e3002c04730039
-0400002205290042000001010000ff420000fead0000ff3a0000ff5304f3
-000a05c7006905c7006105c70069048900a4035500880000ff430000ff01
-0000ffac0316007d0000ff370298ffba033d001e0000ff3a0000ff480000
-ff490000ff7e0000ff4f0000ff4a0000fe9e0532003905320039022cffb6
-022cffb60532003c0532003c022cffba022cffba0532003905320039022c
-ffba022cffba0532003905320039022cffba022cffba0532003905320039
-022cffba022cffba0532003905320039022cffba022cffba053200390532
-0039022cffba022cffba049e0034047800300430ffba0430ffba049e0034
-047800300430ffba0430ffba02be004f02be004f02be006902be00690376
-000a0376000a073200400732004004deffba04deffba0454003403c00046
-0454ffba02e2ffba0454003403c000460454ffba02e2ffba0454003403c0
-00460454ffba02e2ffba0610002f0610002f0270ffba0298ffba0610002f
-0610002f0270ffba0298ffba060e00290708002902e2ffba0456ffba060e
-00290708002902e2ffba0456ffba060e00290708002902e2ffba0456ffba
-02e2002102e200210352ffba0352ffba02e2002102e200210352ffba0352
-ffba0454003e0454003e022cffba022cffba0454003e0454003e022cffba
-022cffba0454003e0454003e022cffba022cffba039c0023039c002301e0
-ffba01e0ffba0376000a0376000a0376000a0376000a0732004007320040
-04deffba04deffba04e3ffc104e3005402aafff3071dffc104e3ffd504e3
-ffc5031dffc1031dffc10473ffff02aaffda0400002104e3008302f00032
-04dc004e06fb001f0239001b0239001b04e3001404a8001404f8001404e3
-008704e3005402aa0018062500540473008902390070071d007e04e30091
-04e3008b031d00660473003003baffc40473000b0473000c040000220473
-004904e3005404e300540473004103fa004f03fa0018053e005102390093
-0473003402aaffc404e3008d0436002203210032030a0032030a00060348
-003202cf003201f0000a01f000000320003202f100320174000a01210032
-012100320174000a02760000018e00320150003202490032048400340484
-0032035f0000035f003202fa003203480032040300320302003202390000
-01bc000a0340000a035e003202ea003202ea003202e9000002e4003202e4
-003203be0032030a003202e800320000fe920000fe920000ff730000fe9f
-02aa00c903050032030200320348003202ee0000030200320639006205c7
-00000556001e05c7006102aa004104eb004e04eb004e04eb004e04eb004e
-04eb004e04eb004e04eb004e04eb004e0239ffb60239ffb60239ffc40239
-ffc40239ffb60239ffb60239ffc40239ffc404a8007604a8007604a80076
-04a8007604a8007604a8007604a8007604a800760239ffc90239ffc90239
-ffc90239ffc904a8007604a8007604a8007604a8007603e400220454001a
-03df003005c7fffd05c70016055600000556009504730041047300230239
-ffa20633005904e3005b05c70000031d001b0556fffd0473000e04730034
-047300550473003402390093048900110355001b055600000473000c0556
-00000473000c0503006f03fa004f059d0020051500190000fec60000fed4
-0000fec60000fed40000fe5f0000fe5f0000ff720000ff730000fee70800
-00000401005d0473003404e300110239001b04e300060556fffd05c70096
-0473004902aaffcd05c7009604e3009205c700990473008904e300160400
-00220473002804540096037c008805b9004e0000ff530000ffbc0000fefe
-0000fefe0000fea40000fea402390093000000000000006c0000006c0000
-006c0000006c0000011a000001ba00000388000006300000079600000948
-000009a800000a3200000abc00000bf000000c6c00000cdc00000d2a0000
-0d6800000dbe00000ec200000f44000010ea000012420000135c000014ce
-00001602000016be0000185c000019a2000019fc00001a8800001b120000
-1b9400001c2200001d1000001ea40000201e00002186000022c0000023aa
-00002468000025040000264a0000271e000027a60000284400002a0e0000
-2a6a00002cbe00002ebc00002fc4000030940000322e00003392000035f2
-0000368800003768000038a200003ae400003c6000003d5600003ee80000
-3f5c00003fb000004018000040ca000040fe00004162000043700000446c
-000045a800004698000048a4000049a400004b8000004c8000004d220000
-4dfa00004f2600004f920000514600005230000053200000541c0000551e
-000056020000594800005a6800005b5000005ca400005f0a000060e00000
-625e000063ec000065140000657a000066b20000677a000067bc000067fc
-000068380000687e000068c6000069160000695a00006994000069c40000
-69f400006a3600006a7800006aaa00006aee00006b3a00006b8400006bb4
-00006bfa00006c3600006c7600006cb200006cea00006d3a00006d760000
-6db200006de200006e2400006e7400006ebe00006ef600006f3800006f6c
-00006fe40000706a000072160000738200007578000075c20000765c0000
-77aa0000799a00007b4e00007c6800007cca00007d2200007e0200007f34
-000080ac000081d40000829a0000837000008430000085d4000086900000
-877200008850000088b60000894a00008a0e00008b4a00008be200008d22
-00008fc40000914a00009250000092f00000934a0000942a000095d80000
-9744000097ee000098e2000099c800009a3c00009a7400009aba00009af8
-00009c7400009e8a00009ec400009efa00009fc20000a0960000a1060000
-a1240000a1c60000a2a00000a2dc0000a3160000a37c0000a5140000a5b2
-0000a6440000a7a00000a8ca0000a9b40000a9f20000aa020000aa200000
-ac2a0000ac6c0000acba0000acf60000ad360000ad840000adc20000ae00
-0000ae3a0000ae7c0000aeb40000aee40000af1e0000af620000af920000
-afda0000b03c0000b0a80000b1560000b18a0000b1fa0000b2400000b2f6
-0000b3900000b4240000b48c0000b4e80000b5bc0000b6880000b6b80000
-b6e80000b74c0000b7a20000b82a0000b9540000bacc0000bb020000bb32
-0000bc3a0000bd0e0000bd4a0000bee00000bf5e0000c06c0000c1a00000
-c34c0000c4da0000c7220000c7d80000c81c0000c85c0000c88e0000c8d2
-0000c90e0000c9520000c98c0000c9be0000c9f00000cb200000cb560000
-cb800000cbcc0000cc0e0000cc340000cc5a0000cc900000cdce0000cde6
-0000ce0c0000ce320000ce700000cea00000ced00000cf0e0000cfcc0000
-d07e0000d0b20000d0e80000d1240000d1620000d1b00000d1e20000d214
-0000d2500000d28c0000d2c80000d3040000d3360000d3660000d3960000
-d3bc0000d3e00000d41e0000d5920000d5d60000d60e0000d6460000d67c
-0000d6cc0000d70e0000d7540000d7a60000d7f20000d9040000da100000
-daf80000dbe80000dcee0000ddd80000de480000df720000dfc20000dff2
-0000e0ec0000e3200000e3600000e3a00000e3e00000e41e0000e47c0000
-e4da0000e5480000e5680000e6080000e6a20000e6d80000e73c0000e786
-0000e7d00000e7ec0000e8080000e8280000e8480000e8680000e8880000
-e8ae0000e8d40000e8fa0000e9200000e9500000e9780000e9a00000e9cc
-0000e9f80000ea2c0000ea560000ea820000eab80000eae20000eb0e0000
-eb440000eb6e0000eb980000ebcc0000ebfc0000ec300000ec740000eca4
-0000ecd80000ed1a0000ed4e0000ed800000edc20000edf60000ee260000
-ee680000eeac0000eef20000ef4e0000ef6a0000ef860000efa20000efbe
-0000efda0000f1480000f3f20000f6620000f67e0000f6980000f6b40000
-f6d00000f6ec0000f7080000f7640000f79e0000f8080000f8d20000f972
-0000fa480000fac80000fb500000fbc00000fc560000fcb40000fcfa0000
-fd580000fdba0000fdfa0000fe560000feba0000ff2c0000ff6a000100fc
-0001020c00010236000102520001027e000102b600010302000103320001
-036200010396000103c6000103f6000104260001045600010486000104b6
-000104e6000105160001054600010576000105a6000105d6000106060001
-07900001093e0001096e0001099e00010a8a00010ba200010bd200010c00
-00010c3000010c5e00010c8e00010cbc00010ce000010d0400010d3e0001
-0e1e00010e6e00010ed40001101a0001104c000110720001109a000110d8
-000111ae000112a6000112d6000113060001133600011366000113960001
-13c4000113f400011424000114e6000115fa0001162a0001165a0001168a
-000116ba000116ea0001171a000117400001176600011796000117c60001
-17f600011826000118c600011918000119e600011a1600011a4600011a76
-00011aa600011ad800011b0800011b3800011b6800011b9800011bcc0001
-1c0000011c3000011c6000011cbe00011ce800011e6e00011f560001210a
-0001235e0001259600012734000127940001281a0001282a000128ec0001
-2a9000012b6400012c3a00012cc600012dea00012efe00013070000130a6
-000130b6000130c6000131a0000131b0000131c0000131d0000131e00001
-31f0000132f60001330600013316000133c0000133d00001342200013432
-000135260001353600013546000135560001362800013742000137760001
-37aa000137da0001380a0001383a000138680001389c0001398600013a7c
-00013b5c00013c2600013ce600013d3800013e6a00013f7e000140420001
-40520001415e0001416e0001423800014316000143de000144fc000145c8
-000146c6000146f80001472c0001475c0001478c000147bc000147f00001
-48d20001490200014a2600014a3600014a4600014a7a00014a8a00014b90
-00014c7c00014d4a00014d7a00014daa00014e2a00014e3a00014ef00001
-4f0000014f5800014ff600015006000151e80001530c0001543200015462
-0001558c0001560400015614000156240001563400015688000156980001
-56a8000156b8000157b0000158ae000158be0001592a000159b800015a40
-00015ade00015b9c00015c8400015d3e00015e6800015f8e000160cc0001
-60dc00016202000162f00001634e0001641e0001642e0001661400016766
-0001684a0001687a0001699000016a1a00016bd400016c5a00016c6a0001
-6cd400016ce400016cf400016d5e00016d6e00016ec200016ed200016f5c
-00016fe80001707800017128000171e4000172e4000173a2000174a80001
-75b4000176e200017716000178520001788000017996000179a6000179b6
-000179e8000179f800017b0400017be800017ce600017d2000017d500001
-7df000017e4e00017ebe00017efa00018090000181140001819e000182e6
-000183a00001848a000184da000185620001862a00018668000186ba0001
-8716000188000001885400018892000188ca00018908000189560001899e
-000189e400018a4000018b9600018c3800018d4e00018dac00018e480001
-8e8600018f4000018fb6000190b4000190ee0001917800019234000192d6
-0001935c0001942800019466000194ee000195bc0001969a000197620001
-98700001992600019a3200019ae400019b6c00019c6c00019d5400019dac
-00019e0400019e5800019ea600019f3e0001a04a0001a08e0001a0cc0001
-a1140001a14a0001a1b40001a2940001a2cc0001a2fa0001a3320001a360
-0001a3920001a3c40001a43e0001a4940001a5f20001a6920001a7b00001
-a8600001a8ac0001aa020001aab20001aadc0001ab580001aba00001acd8
-0001add60001ae440001afc60001b1840001b2ea0001b3f80001b4220001
-b5b20001b6f00001b71c0001b7500001b77c0001b7ac0001b91a0001b944
-0001ba540001bb060001bbb60001bc4a0001bd180001be540001be640001
-be980001bf580001c1100001c1e80001c2520001c3780001c3d60001c4e8
-0001c5b60001c6420001c6c00001c79c0001c8dc0001c9d60001ca8c0001
-cb780001cc400001cd1e0001cdee0001cecc0001cf600001d18c0001d1b6
-0001d1e00001d1f00001d21a0001d3540001d4720001d5820001d5ac0001
-d5d60001d6000001d62a0001d6540001d8380001d8620001d88c0001d8b6
-0001d8e00001d90a0001d9340001d95e0001d9880001d9bc0001d9e60001
-da100001da3a0001dbd40001dbe40001dd1c0001dd2c0001dd560001dd80
-0001ddaa0001ddd40001df6e0001e1e80001e3460001e3560001e4c80001
-e4d80001e6360001e81a0001e91c0001eaa20001ec6c0001eec00001f02e
-0001f2220001f2320001f2420001f3a60001f3d00001f3fa0001f4240001
-f44e0001f4780001f4a20001f4cc0001f4f60001f5200001f54a0001f574
-0001f59e0001f5c80001f5f20001f61c0001f8d40001fab40001fc3e0001
-fe7e0001fff6000200200002004a0002007a000200aa000200fa0002014a
-0002018a000201fc00020250000202ae000203040002033a0002037c0002
-03c20002040c0002043c00020474000204a40002060a000209500002097a
-000209a4000209ce000209f800020a2200020a4c00020a7600020aa00002
-0aca00020af400020b1e00020b4800020b7200020b9c00020bc600020bf0
-00020c1a00020c4400020c6e00020c9800020cc200020cec00020d160002
-0d4000020d6a00020d9400020dbe00020de800020e8000020f1000020f3a
-000212c2000213cc00021544000216ca000218ac00021a8000021c9e0002
-1cae00021e5600021fee00022260000224a00002261800022628000226d4
-0002277e000228ba000228ca00022996000229a600022b4800022d300002
-2e9c00022eac00022fb400022fc40002313e0002314e0002327c0002328c
-000233c80002357c000236740002368400023776000238d4000239800002
-399000023ad200023c8000023d7600023d8600023e2a00023e3a00023f22
-00023f3200023ffc0002400c0002412200024132000242f8000243080002
-447600024486000246f800024708000249180002492800024aa400024ab4
-00024be600024bf600024db400024dc400024f3a00024f4a000250b80002
-50c8000250d8000250e8000252a8000252b8000252c8000252d800025428
-0002556000025678000257720002591400025aa600025c0e00025d5c0002
-5f2200025f3200026084000261e6000263cc000263dc0002656400026708
-0002694200026952000269620002697200026adc00026aec00026bbe0002
-6bce00026d0600026d1600026dfc00026e0c00026f4600026f5600027010
-0002702000027146000272aa00027418000275c6000276f6000277060002
-7880000279c200027be200027db400027ec400027ed40002815600028382
-0002864c000288a800028b6800028daa00028f68000290c2000290ec0002
-91160002912600029136000291600002918a000291b4000291c4000291d4
-000291fe000292280002923800029248000292720002929c000292c60002
-92d6000292e6000292f60002930600029316000293260002935000029360
-000293700002939a000293c4000293ee00029418000294420002946c0002
-9496000294c0000294ea000295140002953e0002956800029592000295bc
-000295e6000296100002963a000296640002968e000296b8000296e20002
-970c00029736000297600002978a000297b4000297de0002980800029832
-0002985c00029886000298b0000298da000299040002992e000299580002
-9982000299ac000299d600029a0000029a2a00029a5400029a7e00029aa8
-00029ad200029afc00029b2600029b5000029b7a00029ba400029bce0002
-9bf800029c2200029c4c00029cf400029d3800029dae00029dd800029e02
-00029e2c00029e5600029e8000029eaa00029ed400029efe00029f280002
-9f5200029f7c00029fa600029fd000029ffa0002a0240002a04e0002a078
-0002a0a20002a0cc0002a0f60002a1200002a14a0002a1740002a2260002
-a25a0002a28e0002a2c20002a4460002a5c60002a7320002a8800002a940
-0002aa020002aa740002ab460002ac180002ac8a0002ad4e0002ae400002
-af040002aff60002b09c0002b1a80002b23a0002b3820002b4c00002b524
-0002b64c0002b81a0002ba620002bace0002bb3a0002bba40002bc100002
-bcbe0002bd6c0002be120002beb80002bf5e0002bf8e0002bfbe0002bfee
-0002c0000002c0120002c0240002c0360002c0480002c0b80002c12a0002
-c15a0002c16c0002c17e0002c18e0002c19e0002c1b00002c1c20002c1d4
-0002c1e60002c1f80002c20a0002c3160002c3bc0002c4c80002c56e0002
-c5c60002c5ec0002c6120002c63c0002c66a0002c6b40002c7100002c74a
-0002c7a20002c7e20002c8320002c86a0002c8c00002c9020002c9420002
-c9940002ca060002ca500002cabc0002cafc0002cb680002cba80002cc10
-0002cc520002cca60002cccc0002ccf20002cd1c0002cd4c0002cd7c0002
-cdac0002cdfa0002ce560002ce940002ceee0002cf360002cf8c0002cfd0
-0002d0240002d06a0002d0ac0002d0d20002d1080002d12e0002d1540002
-d17a0002d1a00002d1ce0002d1f80002d2420002d29e0002d2d80002d330
-0002d3700002d3c40002d3fc0002d44c0002d48e0002d4ce0002d5080002
-d5440002d5800002d5bc0002d5ea0002d6140002d6520002d6820002d6a8
-0002d6ce0002d6f40002d71a0002d7440002d76e0002d7ae0002d7fa0002
-d8400002d8780002d8a20002d8cc0002d8fc0002d92c0002d9520002d978
-0002d9a20002d9cc0002d9fe0002da300002da600002da900002dac00002
-daf00002db200002db4e0002db7e0002dbae0002dbde0002dc0e0002dc42
-0002dca20002dcd60002dd3a0002dd6e0002ddce0002de020002de660002
-df0e0002dfde0002e0f40002e1c60002e2400002e2ae0002e4900002e65a
-0002e77a0002e88c0002e9d00002eae40002eb740002ebf40002ec880002
-ed0a0002edca0002ee6a0002ef360002f01c0002f0d40002f1a00002f21c
-0002f22c0002f2fa0002f3ba0002f4840002f5380002f62e0002f6a40002
-f7cc0002f8e60002fa6e0002faf00002fbe00002fcd60002fdce0002fe60
-0003007200030202000302880003040a00030476000304e00003054e0003
-0714000308dc0003096c000309b8000309f600030a3800030a8000030aac
-00030af200030b2800030b6400030ba200030be000030c6800030cf00003
-0d3200030d6a00030da400030dde00030e0600030e2e00030e7200030eb6
-00030ef400030f3200030f6200030f9200030fb800030fde000310200003
-1062000310a8000310ee000311460003119e000311fa00031256000312b2
-0003130e0003135c000313aa000313d2000313fa00031420000314460003
-148a000314ce0003151a00031566000315b0000315fa0003164800031696
-000316d6000317760003179c000317c20003180c0003187c000318a40003
-18cc0003191200031958000319ae00031a0400031a5200031b0c00031b34
-00031b5c00031bb000031c0400031c4400031c8400031caa00031cd00003
-1d3600031d9c00031dde00031e2000031e4600031e6c00031ec200031f18
-00031f7400031fd00003202400032078000320c6000321140003215e0003
-21a8000322020003225c000322b000032304000323460003238800032426
-000324c40003250e00032558000325aa000325fc00032662000326c80003
-272000032778000327a4000327d0000327fc000328280003285400032880
-000328ac000328d8000328fe00032924000329500003297c000329ca0003
-2a1800032a6400032ab000032b0000032b5000032bca00032c2c00032ca4
-00032cee00032e8000032eb400032ee800032f1e00032f4200032fac0003
-301600033098000331000003314800033190000331dc000332460003326e
-00033296000332bc000332e2000333320003338200033416000334680003
-34c6000335240003358a000335f0000336d6000337e6000338b4000339ae
-00033a1a00033a8000033ade00033b4000033bc600033c4c00033cb20003
-3d1800033d8400033df000033e4600033e9c00033ece00033f0000033f26
-00033f4c00033fb80003401e0003407c000340de000341f0000342fc0003
-440a0003450e000345340003455c00034580000345a4000345cc000345f4
-0003461a00034640000347620003489e000349cc00034af800034bb20003
-4c6c00034d2c00034dec00034ed000034fb4000350b0000351ac00035290
-000353740003544a000355200003556a000355b4000355da000356000003
-5650000356a0000356c4000356e8000357be000357ce0003582200035876
-000358d40003593200035972000359b2000359fc00035a4600035a960003
-5ae600035b3c00035b9200035be400035c2200035c9c00035cde00035d22
-00035db000035e3e00035ff0000360000003603a00036074000360a40003
-60d4000361080003613c00036176000361b00003620400036258000362ba
-0003631c000364cc0003665400036690000366c8000367120003675c0003
-67a2000367e80003683800036a5e00036a8400036aaa00036afe00036da8
-00036e7a00036f1600036f6400036fa200036fd4000371c20003747e0003
-7550000376b4000377ee0003789a00037a3000037c8400037ec000037f1a
-00037f600003802e000381200003813e000381e80003830e000383ea0003
-83fc0003855c000386e200038708000387c6000387e40003880a00038830
-000388560003887c000388a2000388c8000388ee00038914000389600003
-89c0000389e800038a0e00038b6c00038d4800038d5800038e2800038f38
-00038f96000390ae0003923c000392e2000394280003947a000394cc0003
-9504000395500003957c000395c2000395ee0003962a00039684000396ce
-0003971a0003978a00039850000398cc0003998c00039a0400039ade0003
-9b6e00039ba800039be400039d5c00039e4c00039e9600039edc0003a026
-0003a1360003a1460003a2500003a3360003a4480003a5140003a62a0003
-a7680003a7780003a8500003a9120003aa120003ab6c0003abcc0003ad50
-0003adc40003af180003b0800003b1640003b1b60003b21e0003b3a80003
-b51e0003b5a60003b74a0003b83a0003b95e0003ba000003baea0003bbd4
-0003bccc0003bdb40003bee60003c02c0003c1ce0003c38a0003c39a0003
-c49e0003c5d00003c67a0003c78e0003c81a0003c98a0003ca520003cb4c
-0003cc9a0003cdb20003cf580003d0980003d1ea0003d30e0003d4c00003
-d6480003d7420003d8180003d9740003da340003da6a0003dad20003dba6
-0003dbb60003dc160003dc720003dccc0003dd040003dd420003dd8c0003
-ddc80003de060003de500003df620003dfb40003e0100003e0bc0003e0e4
-0003e1540003e1840003e1b60003e3600003e4860003e4c00003e4f00003
-e53c0003e56e0003e5940003e5ba0003e5fc0003e63e0003e66e0003e69e
-0003e6e20003e7280003e7660003e7a00003e7da0003e80a0003e8c60003
-e9800003e9c20003e9f20003ea260003ea620003ea920003eac20003eafc
-0003eb340003eb640003eb980003ebcc0003ebf40003ec240003ec540003
-ec880003ecc00003ecf00003ed200003ed600003ed920003edce0003ee00
-0003ee400003ee7a0003eeaa0003eeda0003ef000003ef260003ef4c0003
-ef7c0003f0940003f1920003f1c20003f1f40003f2980003f43e0003f5a8
-0003f6960003f8000003f8300003f8600003f8980003f8d00003f9220003
-f97e0003fa700003fa980003fb060003fb360003fb660003fb8e0003fc00
-0003fc300003fc660003fdc60003fe880003ff6400040088000401800004
-02d0000403ec0004050a0004060e000407700004091600040aae00040cba
-00040df000040e8a00040ff800041008000410d6000412980004149a0004
-154c0004162a00041744000417f400041846000418980004196e00041a54
-00041ae400041c5c00041d5a00041e5c00041f900004206e000421540004
-21f4000422fe000424260004251a000426020004267e000426fa000427a6
-0004285800042936000429ac000429fe00042b7000042cf000042eee0004
-2fb2000430840004316a000432a00004336c000434740004358e00043692
-0004376200043840000439da00043af600043bd000043d4400043f380004
-404e000441fc0004428e00044330000443be0004445c0004456000044570
-000446ca000447da000447ea000448c4000449e800044a4800044b680004
-4c3600044d1800044f000004510e000453e40004561e000457ac000459d6
-00045b7e00045d6000045eba00046026000460a80004615c0004624a0004
-62f600046362000463e4000464bc00046600000467720004688000046890
-000468a00004690200046966000469c400046a5200046ade00046ba40004
-6c3e00046c4e00046c5e00046cf800046d9800046dde00046e5000046ec2
-00046f1000046f4400046fb6000470260004709a000470ea0004717e0004
-720e0004728c00047310000473ac000473d800047446000474f800047606
-000476520004781c00047908000479180004794e00047992000479d60004
-7a1a00047a5000047a8200047ac400047b1a00047b6600047c1400047c8c
-00047d1600047d8a00047df000047e7600047ed600047f4000047fb80004
-802c0004808a00048134000481d000048240000482d200048330000483a2
-00048450000484fa00048594000486080004868e000486f6000487a60004
-886800048918000489ae00048a1000048a8000048ad600048b5800048bda
-00048c6400048cf400048d4e00048dba00048e2a00048e9c00048f100004
-8f980004902c00049096000491100004919000049208000492b20004934e
-000493e200049444000494e600049566000495fc000496a4000497520004
-97ee0004984e000498a600049912000499bc00049a6a00049b3800049be2
-00049c4800049ca000049d0400049d9600049e2000049eb200049f160004
-9f7e00049fe80004a0500004a0bc0004a1380004a1c40004a25c0004a2c8
-0004a3300004a3940004a4440004a5080004a5ba0004a64c0004a6ae0004
-a71e0004a7920004a83a0004a8e40004a9ac0004aa520004aaba0004ab4e
-0004abc40004ac600004ace20004ad600004add00004ae620004aebe0004
-af200004afaa0004b02a0004b0920004b0fa0004b1520004b1c00004b228
-0004b2aa0004b3240004b3a20004b4260004b4820004b4e80004b5500004
-b5f40004b69a0004b75c0004b8100004b8700004b8ec0004b94e0004b9dc
-0004ba780004bb0a0004bb740004bbd60004bc680004bcde0004bd7c0004
-be140004be880004befc0004bf780004bfd60004c03a0004c0b80004c116
-0004c17a0004c1d80004c2380004c2a00004c2f40004c32a0004c3760004
-c3da0004c41a0004c4640004c50e0004c5b60004c60c0004c6440004c694
-0004c7440004c7f20004c8440004c8980004c8f00004c9400004c9980004
-c9fe0004ca5e0004cafe0004cba20004cbe00004cc460004cce40004cd78
-0004ce0a0004ceb00004cee20004cf4a0004cfb20004cffc0004d0ce0004
-d1500004d1f80004d2600004d29e0004d3080004d3ae0004d4040004d458
-0004d4c40004d5280004d5c80004d5fa0004d62a0004d6740004d70c0004
-d7360004d7600004d8280004d8820004d9240004d98e0004da0a0004daba
-0004db300004dba00004dbf80004dc5e0004dcc00004dd600004ddb80004
-de840004def00004df4a0004df940004dfea0004e08a0004e1500004e29c
-0004e3b80004e41c0004e4900004e7b60004e8460004e8c60004e9140004
-ea7c0004eba80004ebf00004ecec0004edb40004ee920004ef840004f03e
-0004f1180004f1820004f21a0004f2ec0004f3e00004f4520004f4c00004
-f5040004f6160004f74a0004f83c0004f8800004f8bc0004f9a60004faa8
-0004fc2a0004fd260004fe2a0004ff340005002000050082000500f80005
-02820005031400050444000505340005065c000507940005085800050940
-00050a0000050b5400050d0600050e9800050fd2000511380005120e0005
-12cc0005138a00051450000515a8000516f8000517080005171800051728
-000517c400051862000518b0000518ee000519340005196400051ac20005
-1c5e00051d7000051e980005202400052196000522a60005247a00052666
-000528c000052a2000052b4a00052cdc00052e4e00053064000532d20005
-33d200053508000536280005377a0005386e000539b4000539f600053a36
-00053c7800053ec600054026000541bc000543ec0005458c000546180005
-46480005469000054724000547be0005491e000549b000054a2000054a60
-00054a9e00054c5000054e8e0005503e000551680005525e000553640005
-553a000556f0000557f20005590800055ace00055cbc00055e6400055fe0
-00056166000562c60005635e000563fa000565180005663e000567960005
-694a00056a8600056bda00056c6000056cde00056d9200056e5800056f04
-00056fce00057100000572a0000572c6000572ec000572fc0005732c0005
-735c000574d00005764000057702000577c4000578a60005797e00057a32
-00057b0600057bb000057c7600057df800057fa800058012000580420005
-806a0005809e000580d2000580e2000580f2000581220005814800058184
-000581c0000581f4000582280005825c00058292000583b8000583c80005
-83f8000584280005845c00058494000584c8000584fc0005853000058564
-00058598000585ce000585fe0005863400058668000586a2000586f20005
-873c00058770000587a4000587da00058810000588c4000588d4000589de
-00058b4a00058cb400058e5400058f9a000590f2000591e4000592ee0005
-93d2000594d2000595f8000596e4000597a0000598620005994a00059a04
-00059ace00059b5600059c0400059c9600059d1400059e2e00059e9a0005
-9f620005a05e0005a0cc0005a13c0005a1f40005a3d80005a4e60005a56c
-0005a5b20005a67a0005a70a0005a7f40005a8a00005a90e0005aa160005
-ab020005abc20005ac080005ac9a0005ada80005ae440005aea00005af96
-0005b0900005b2120005b3760005b4740005b55e0005b62c0005b6540005
-b67c0005b6ac0005b6dc0005b7040005b72c0005b7540005b77c0005b7d6
-0005b8400005b8720005b8a20005b8c80005b8f00005b9180005b9420005
-b96c0005b9940005b9bc0005b9e20005ba0e0005ba980005bac00005bb42
-0005bb6a0005bb900005bbb60005bbdc0005bc2e0005bc820005bcb40005
-bce40005bd160005bd520005bd820005bdb80005bdde0005be040005be38
-0005be6c0005beac0005bef20005bf180005bf3e0005bf640005bf8a0005
-bfb40005c0180005c0640005c0960005c0c40005c0fa0005c1380005c160
-0005c1860005c1ac0005c1f60005c2380005c2600005c2860005c2b20005
-c2d80005c3340005c3640005c3940005c3c40005c3ea0005c4140005c444
-0005c4740005c49a0005c4c00005c4e60005c50c0005c5320005c5580005
-c5800005c5f80005c6220005c68c0005c6b40005c7580005c7800005c7fc
-0005c8300005c8720005c8a20005c8d20005c9020005c9320005c95e0005
-c9840005c9cc0005ca0e0005ca3a0005ca620005ca920005cac20005cae8
-0005cb0e0005cb3a0005cbee0005cc160005ccc60005cd080005cd4a0005
-cd7a0005cdae0005cdd40005cdfc0005ce220005ce4a0005ce700005ce98
-0005cec00005cee80005cf0e0005cf340005cf5a0005cf800005cfa80005
-d0300005d0640005d0ca0005d0fa0005d12a0005d1500005d1760005d1b0
-0005d1f40005d2260005d2620005d2920005d2c20005d2f60005d32a0005
-d35a0005d3900005d3c80005d3f80005d4260005d4500005d47e0005d4a4
-0005d4ca0005d4fe0005d5440005d57e0005d5ba0005d5ec0005d61c0005
-d6580005d6940005d6d00005d71a0005d7640005d79c0005d7da0005d816
-0005d8560005d8b20005d90e0005d96a0005d9c60005da300005da9a0005
-daca0005db020005db420005db860005dbca0005dc0e0005dc6a0005dcc6
-0005dd320005dd9e0005de0a0005de760005dea60005ded60005df0e0005
-df460005df860005dfc60005e0020005e03e0005e09a0005e0f60005e15a
-0005e1be0005e2220005e2860005e2e40005e3420005e3700005e39e0005
-e3d00005e4020005e4340005e4660005e4a40005e4e20005e5520005e5c4
-0005e6260005e6880005e6ea0005e74c0005e7a40005e7fc0005e82c0005
-e85c0005e8900005e8c40005e8f80005e92c0005e9860005e9f20005ea5c
-0005eac60005eb2e0005eb960005ebc60005ebf60005ec2a0005ec5e0005
-ec9e0005ecde0005ed1a0005ed560005edaa0005ee100005ee640005eeb2
-0005eee20005ef120005ef460005ef7a0005efae0005efe20005f01a0005
-f0520005f0ae0005f1040005f1640005f1c40005f21a0005f2700005f2ca
-0005f31e0005f3540005f3860005f3c40005f3f40005f4240005f46e0005
-f49c0005f4cc0005f5120005f54a0005f5860005f5ca0005f5fe0005f62e
-0005f6780005f6cc0005f7220005f7780005f7dc0005f8400005f8920005
-f8e80005f9340005f9860005f9f20005fa5e0005faca0005fb360005fbb2
-0005fc2e0005fc700005fcb20005fcfa0005fd420005fd940005fde60005
-fe340005fe820005fef00005ff5e0005ffd40006004a000600c000060136
-000601a600060216000602580006029a000602de00060322000603660006
-03aa000603f40006043e000604ac0006051400060586000605f800060660
-000606c80006073200060796000607cc0006080200060852000608800006
-08cc000609080006095e0006098e000609be000609ea00060a1600060a3c
-00060a9000060afe00060b5200060bee00060ce000060d2200060d480006
-0da400060dd400060e1600060e7c00060eea00060f5000060fba00060fe0
-00061088000611260006126600061294000612c2000613260006138a0006
-13b8000613ec0006141c0006144c000614bc00061532000615da00061678
-000617b4000617e4000618140006187a000618e000061910000619400006
-1970000619a6000619d600061a0600061a5200061ab200061b0e00061be8
-00061cc200061d3400061d7a00061da000061de200061e1200061e540006
-1e8800061ef200061f3800061fae00061fd40006204400062092000621b2
-00062444000625d800062730000628e200062bf000062e860006306e0006
-320c00063464000635a6000637bc0006382c000638940006390600063978
-00063a0000063a9e00063c7c00063e2a00063ff6000640f60006428a0006
-43ea000644ae000645a40006460c0006466e000646dc0006474000064814
-0006487c0006494600064a0400064aa000064b0200064b9800064c2a0006
-4cc600064d5e00064dc400064e2200064e8e00064ef600064f7200065020
-0006508a000650e80006514a000651fc0006527e00065300000653360006
-5368000653780006538800065494000655bc000657dc0006592e0006593e
-000659f800065aee00065b7800065b8800065c0800065c8000065ca20006
-5d6400065d7400065d8400065d9400065da400065ea000065fe6000661a6
-000663ba000664ac00066512000665760006663800066648000667e20006
-67f200066802000668c6000669e200066abe00066ace00066ade00066aee
-00066c4a00066e3a00066f4a00066f5a00066f6a00066f7a00066f8a0006
-704000067050000671a6000672e2000673d0000674e000067584000675f2
-000676620006777c000677e000067824000678b200067a7200067ab20006
-7ba600067c7200067d3e00067dc400067e9a00067f360006809e00068122
-000681b600068330000684a20006862a0006870e000688d8000689c20006
-8ab000068bdc00068d0200068e5c00068fc60006910800069180000692b6
-000693ae000694ac000695a80006968e00069718000697a2000698940006
-995000069a1200069abe00069bb400069c9000069d9400069ed400069fbc
-0006a13c0006a26a0006a36e0006a3b80006a4240006a4e40006a5c00006
-a6fe0006a7e60006a9320006aa600006ab6a0006ac0c0006ad580006ae14
-0006af3e0006b0000006b0480006b2420006b2f80006b4e60006b6420006
-b7e00006b8e20006b9480006ba900006bb080006bc980006bcce0006bd04
-0006bd560006bda80006bde00006be200006be580006be980006bfc60006
-c0280006c0e80006c19c0006c23e0006c2d60006c3520006c45e0006c4bc
-0006c5ea0006c69a0006c7680006c7a20006c7de0006c8660006c9260006
-ca220006caf80006cb1e0006cb440006cbdc0006cbec0006cbfc0006cc0c
-0006cc1c0006cc2c0006cc3c0006cc4c0006cc5c0006cc6c0006cc7c0006
-cc8c0006cc8c0006cdf00006ce000006ce740006cf0e0006d01c0006d176
-0006d2d60006d4900006d65e0006d8320006d8b60006d9d40006db1e0006
-dcc60006dd620006ddb20006de480006df660006dfb60006e0460006e170
-0006e1800006e2ae0006e3be0006e4340006e48c0006e5780006e5be0006
-e5fe0006e69a0006e6ee0006e8700006e94e0006e98e0006e9f80006ea62
-0006ea9a0006ebe20006ecd80006ede60006ee1e0006ee560006ee7c0006
-eea20006eed20006ef020006ef260006ef4a0006ef760006efa20006efe8
-0006f02e0006f05a0006f0860006f0cc0006f1120006f16e0006f1ca0006
-f1ee0006f2120006f26a0006f2c20006f3080006f34e0006f3840006f3ba
-0006f3f00006f4260006f4880006f4f20006f5520006f5b20006f5fe0006
-f6cc0006f6f40006f71c0006f7880006f7f40006f8420006f8900006f996
-0006f9a60006f9f00006fa3a0006fa820006faca0006fb280006fb8a0006
-fbe40006fc360006fcba0006fd220006fd960006fe080006fe8e0006fefc
-0006ff6e0006ffd40006fffa0007002000070044000700680007009c0007
-00d0000700f60007011c00070188000701f400070260000702c80007031a
-0007036c000703c2000704140007043c0007046400070496000704c40007
-051a00070570000705cc000706280007064e00070674000706a0000706cc
-0007072800070784000707a8000707cc000708820007093800070b0a0007
-0b1a00070b7e00070be200070c2e00070c7a00070e3e00070e4e00070f5c
-00070f6c00070fc60007102000071078000710d000071134000711980007
-11dc00071220000713b6000715480007169800071866000719e400071b9e
-00071ccc00071dc40007203e000721c2000723ea00072566000725f20007
-272a0007294e000729d6000729e600072b5600072c8200072dea00072f30
-00073066000731640007333a000734ee0007357e000736c2000737ae0007
-38fc000739ea00073bd600073cf200073e1400073fe800074152000742f6
-000743fc0007454c000746a40007489a00074a7600074bda00074c9e0007
-4dd200074e9c00074fa60007512000075214000752f80007549600075668
-0007567800075726000757f000075800000758c800075962000759ae0007
-59be00075a3800075b0c00075b6800075c1800075c5a00075d9000075e86
-00075f82000760820007612000076264000763ac000765cc000766620007
-676200076882000769ca00076a8600076b6000076c3c00076d0800076e0a
-00076fb6000770d6000771fc0007728a0007731a0007742c0007748c0007
-7578000776e40007781600077912000779fe00077b2400077cb400077e5a
-0007802600078156000781d800078258000782e200078362000783ec0007
-84a800078550000785fe000786a600078720000787a40007881e000788a2
-00078958000789fa00078a9a00078b3c00078bb800078c3e00078cba0007
-8d4000078df800078ea200078f4800078ff0000790e0000791d4000792b4
-0007939c0007948e0007958200079668000797540007991c00079a7e0007
-9b2200079c3200079cf800079d0800079dfc00079f5600079fea0007a094
-0007a15e0007a2300007a3120007a3ae0007a4980007a5be0007a5ce0007
-a6880007a7420007a7520007a7fa0007a8a00007a98e0007aa7c0007ab58
-0007ac2a0007adae0007af540007afee0007b08a0007b0c60007b1040007
-b1400007b17e0007b1d80007b2300007b28a0007b2ee0007b37a0007b578
-0007b5cc0007b5dc0007b6680007b6ec0007b7700007b8280007b9380007
-baf60007bc140007bca40007bd480007bdf80007beda0007bf5c0007bfea
-0007c1120007c15a0007c1b20007c28c0007c2c80007c3260007c3640007
-c3960007c3da0007c41c0007c44c000100000d3500f2003c008f00060002
-0010002f0055000006fa02c20005000200>
-<0000005303ea0000000300000000006a00000000000300000001000a006a
-00000003000000020008007400000003000000030058007c000000030000
-0004001400d40000000300000005001800e8000000030000000600180100
-000000030000000700ba01180000000300000008003001d2000000030000
-0009008a0202000000030000000d02aa028c000100000000000000350536
-00010000000000010005056b000100000000000200040570000100000000
-0003002c05740001000000000004000a05a00001000000000005000c05aa
-0001000000000006000c05b60001000000000007005d05c2000100000000
-00080018061f000100000000000900450637000100000000000d0155067c
-0003000104030002000e07d10003000104030004001a07df000300010405
-0002000a07f9000300010405000400160803000300010406000200060819
-00030001040600040012081f000300010407000200080831000300010407
-0004001408390003000104080002000c084d000300010408000400180859
-0003000104090000006a08710003000104090001000a08db000300010409
-0002000808e50003000104090003005808ed000300010409000400140945
-000300010409000500180959000300010409000600180971000300010409
-000700ba0989000300010409000800300a430003000104090009008a0a73
-000300010409000d02aa0afd00030001040a0002000e0da700030001040a
-0004001a0db500030001040b000200120dcf00030001040b0004001e0de1
-00030001040c000200080dff00030001040c000400140e0700030001040e
-000200100e1b00030001040e0004001c0e2b000300010410000200120e47
-0003000104100004001e0e59000300010413000200060e77000300010413
-000400120e7d0003000104140002000e0e8f0003000104140004001a0e9d
-000300010415000200140eb7000300010415000400200ecb000300010416
-0002000e0eeb0003000104160004001a0ef9000300010419000200140f13
-000300010419000400200f2700030001041b0002000a0f4700030001041b
-000400160f5100030001041d000200060f6700030001041d000400120f6d
-00030001041f0002000a0f7f00030001041f000400160f89000300010424
-0002000c0f9f000300010424000400180fab00030001042a000200080fc3
-00030001042a000400140fcb00030001042d0002000a0fdf00030001042d
-000400160fe900030001080a0002000e0fff00030001080a0004001a100d
-0003000108160002000e10270003000108160004001a1035000300010c0a
-0002000e104f000300010c0a0004001a105d000300010c0c000200081077
-000300010c0c00040014107f00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0042006f006c0064004d006f006e006f007400790070
-0065003a0041007200690061006c00200042006f006c0064003a00560065
-007200730069006f006e00200035002e0030003100200028004d00690063
-0072006f0073006f0066007400290041007200690061006c00200042006f
-006c006400560065007200730069006f006e00200035002e003000310041
-007200690061006c002d0042006f006c0064004d00540041007200690061
-006c00200069007300200061002000740072006100640065006d00610072
-006b0020006f006600200054006800650020004d006f006e006f00740079
-0070006500200043006f00720070006f0072006100740069006f006e0020
-0069006e002000740068006500200055006e006900740065006400200053
-0074006100740065007300200061006e0064002f006f00720020006f0074
-00680065007200200063006f0075006e00740072006900650073002e0054
-006800650020004d006f006e006f007400790070006500200043006f0072
-0070006f0072006100740069006f006e004d006f006e006f007400790070
-006500200054007900700065002000440072006100770069006e00670020
-004f006600660069006300650020002d00200052006f00620069006e0020
-004e006900630068006f006c00610073002c002000500061007400720069
-0063006900610020005300610075006e0064006500720073002000310039
-003800320059006f00750020006d00610079002000750073006500200074
-00680069007300200066006f006e007400200074006f0020006400690073
-0070006c0061007900200061006e00640020007000720069006e00740020
-0063006f006e00740065006e00740020006100730020007000650072006d
-0069007400740065006400200062007900200074006800650020006c0069
-00630065006e007300650020007400650072006d007300200066006f0072
-0020007400680065002000700072006f006400750063007400200069006e
-0020007700680069006300680020007400680069007300200066006f006e
-007400200069007300200069006e0063006c0075006400650064002e0020
-0059006f00750020006d006100790020006f006e006c0079002000280069
-002900200065006d0062006500640020007400680069007300200066006f
-006e007400200069006e00200063006f006e00740065006e007400200061
-00730020007000650072006d006900740074006500640020006200790020
-00740068006500200065006d00620065006400640069006e006700200072
-00650073007400720069006300740069006f006e007300200069006e0063
-006c007500640065006400200069006e0020007400680069007300200066
-006f006e0074003b00200061006e00640020002800690069002900200074
-0065006d0070006f0072006100720069006c007900200064006f0077006e
-006c006f006100640020007400680069007300200066006f006e00740020
-0074006f002000610020007000720069006e0074006500720020006f0072
-0020006f00740068006500720020006f0075007400700075007400200064
-0065007600690063006500200074006f002000680065006c007000200070
-00720069006e007400200063006f006e00740065006e0074002ea9203230
-303620546865204d6f6e6f7479706520436f72706f726174696f6e2e2041
-6c6c205269676874732052657365727665642e417269616c426f6c644d6f
-6e6f747970653a417269616c20426f6c643a56657273696f6e20352e3031
-20284d6963726f736f667429417269616c20426f6c6456657273696f6e20
-352e3031417269616c2d426f6c644d54417269616c206973206120747261
-64656d61726b206f6620546865204d6f6e6f7479706520436f72706f7261
-74696f6e20696e2074686520556e697465642053746174657320616e642f
-6f72206f7468657220636f756e74726965732e546865204d6f6e6f747970
-6520436f72706f726174696f6e4d6f6e6f74797065205479706520447261
-77696e67204f6666696365202d20526f62696e204e6963686f6c61732c20
-5061747269636961205361756e646572732031393832596f75206d617920
-757365207468697320666f6e7420746f20646973706c617920616e642070
-72696e7420636f6e74656e74206173207065726d69747465642062792074
-6865206c6963656e7365207465726d7320666f72207468652070726f6475
-637420696e207768696368207468697320666f6e7420697320696e636c75
-6465642e20596f75206d6179206f6e6c792028692920656d626564207468
-697320666f6e7420696e20636f6e74656e74206173207065726d69747465
-642062792074686520656d62656464696e67207265737472696374696f6e
-7320696e636c7564656420696e207468697320666f6e743b20616e642028
-6969292074656d706f726172696c7920646f776e6c6f6164207468697320
-666f6e7420746f2061207072696e746572206f72206f74686572206f7574
-7075742064657669636520746f2068656c70207072696e7420636f6e7465
-6e742e004e0065006700720065007400610041007200690061006c002000
-4e00650067007200650074006100740075010d006e00e900410072006900
-61006c002000740075010d006e00e9006600650064004100720069006100
-6c002000660065006400460065007400740041007200690061006c002000
-46006500740074038803bd03c403bf03bd03b10041007200690061006c00
-20038803bd03c403bf03bd03b100a9002000320030003000360020005400
-6800650020004d006f006e006f007400790070006500200043006f007200
-70006f0072006100740069006f006e002e00200041006c006c0020005200
-690067006800740073002000520065007300650072007600650064002e00
-41007200690061006c0042006f006c0064004d006f006e006f0074007900
-700065003a0041007200690061006c00200042006f006c0064003a005600
-65007200730069006f006e00200035002e0030003100200028004d006900
-630072006f0073006f0066007400290041007200690061006c0020004200
-6f006c006400560065007200730069006f006e00200035002e0030003100
-41007200690061006c002d0042006f006c0064004d005400410072006900
-61006c00200069007300200061002000740072006100640065006d006100
-72006b0020006f006600200054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-200069006e002000740068006500200055006e0069007400650064002000
-530074006100740065007300200061006e0064002f006f00720020006f00
-7400680065007200200063006f0075006e00740072006900650073002e00
-54006800650020004d006f006e006f007400790070006500200043006f00
-720070006f0072006100740069006f006e004d006f006e006f0074007900
-70006500200054007900700065002000440072006100770069006e006700
-20004f006600660069006300650020002d00200052006f00620069006e00
-20004e006900630068006f006c00610073002c0020005000610074007200
-690063006900610020005300610075006e00640065007200730020003100
-39003800320059006f00750020006d006100790020007500730065002000
-7400680069007300200066006f006e007400200074006f00200064006900
-730070006c0061007900200061006e00640020007000720069006e007400
-200063006f006e00740065006e0074002000610073002000700065007200
-6d0069007400740065006400200062007900200074006800650020006c00
-6900630065006e007300650020007400650072006d007300200066006f00
-720020007400680065002000700072006f00640075006300740020006900
-6e0020007700680069006300680020007400680069007300200066006f00
-6e007400200069007300200069006e0063006c0075006400650064002e00
-200059006f00750020006d006100790020006f006e006c00790020002800
-69002900200065006d006200650064002000740068006900730020006600
-6f006e007400200069006e00200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-2000740068006500200065006d00620065006400640069006e0067002000
-7200650073007400720069006300740069006f006e007300200069006e00
-63006c007500640065006400200069006e00200074006800690073002000
-66006f006e0074003b00200061006e006400200028006900690029002000
-740065006d0070006f0072006100720069006c007900200064006f007700
-6e006c006f006100640020007400680069007300200066006f006e007400
-200074006f002000610020007000720069006e0074006500720020006f00
-720020006f00740068006500720020006f00750074007000750074002000
-640065007600690063006500200074006f002000680065006c0070002000
-7000720069006e007400200063006f006e00740065006e0074002e004e00
-65006700720069007400610041007200690061006c0020004e0065006700
-72006900740061004c0069006800610076006f0069007400750041007200
-690061006c0020004c0069006800610076006f0069007400750047007200
-6100730041007200690061006c00200047007200610073004600e9006c00
-6b00f6007600e900720041007200690061006c0020004600e9006c006b00
-f6007600e9007200470072006100730073006500740074006f0041007200
-690061006c002000470072006100730073006500740074006f0056006500
-740041007200690061006c002000560065007400480061006c0076006600
-6500740041007200690061006c002000480061006c007600660065007400
-50006f00670072007500620069006f006e00790041007200690061006c00
-200050006f00670072007500620069006f006e0079004e00650067007200
-690074006f0041007200690061006c0020004e0065006700720069007400
-6f041f043e043b0443043604380440043d044b0439004100720069006100
-6c0020041f043e043b0443043604380440043d044b043900540075010d00
-6e00e90041007200690061006c002000540075010d006e00e90046006500
-740041007200690061006c0020004600650074004b0061006c0131006e00
-41007200690061006c0020004b0061006c0131006e004b00720065007000
-6b006f0041007200690061006c0020004b007200650070006b006f011100
-e20323006d0041007200690061006c0020011100e20323006d004c006f00
-64006900610041007200690061006c0020004c006f006400690061004e00
-65006700720069007400610041007200690061006c0020004e0065006700
-72006900740061004e00650067007200690074006f004100720069006100
-6c0020004e00650067007200690074006f004e0065006700720069007400
-610041007200690061006c0020004e006500670072006900740061004700
-72006100730041007200690061006c00200047007200610073000000b154
-80410d03ac00af03ac0002001003ac002003ac00a003ac0003004003acb3
-070d3240b803acb312143240b803acb2162b32b9ffc003acb23a3340b803
-acb32d943280bc03ab005f0033ffc003abb2553340b803abb340443240b8
-03abb3333b3240b803abb32f313240b803abb2083340b803abb30714321f
-411a03ab002f03ab0002000f03ab002f03ab004f03ab008f03ab009f03ab
-00bf03ab0006001003ab00df03ab00ff03ab000303a803a2b2461f40b803
-a5b208330f411403a50001004003a500cf03a500ff03a50003002003a500
-af03a500ef03a500ff03a50004ffc003a3b3090c3240b803a3b208330f41
-1b03a30001000f03a3001003a3008003a300af03a300cf03a30005006f03
-a3009f03a300ff03a30003009f03a200af03a2000203a203a1b2101f1041
-0a039e007f039e0002039a000f0101001fffc00398b310143240b80399b3
-0f1332404110039500500395000200b0034d00c0034d0002006f0391007f
-03910002ffc0034bb22d3132b9ffc0034bb30a0e32104110038b0020038b
-0080038b000300a0038b00010020038b0040038b0002ffc0038bb3131632
-40b80383b20f1132b9ffc0037bb2303432b9ffc0037bb310183250411403
-7800010365036e0023001f037e036e001e001f0363036e001d001f036203
-64000d001fffc00340b30f1032804110033f0001033f03150029001f0341
-03160032001f0344031a001b001fffc00375b20e1132b9ffc00375b2282a
-32410a034303180032001f030f030d0034001f03080307b2321f20bb0340
-000100400388b3090b3240b80388b2101532bd038503070014001f038003
-07b2171f0fbd030a002f030a0002ffc00354b3090d3290410c035400a003
-540002001f036e0001009f036e00010040036eb2090b3241110345031c00
-16001f036b031d0015001f0346031e0015001f03a703a10046001f039db3
-261c1fc0bb0393000100400392b3090d3240b8033eb2083340b8033eb30d
-0e32c04109033e000100b0038e00c0038e0002ffc00390b3263832004126
-03280030032800020020037f0030037f00020010038a0030038a0050038a
-006f038a007f038a009f038a000600000389003003890002002f037a0070
-037700900377009f037a0004ffc00315b20f1032b9ffc00315b2242832b9
-03190318b2321f10bb031a0001ffc0031ab3090e3240b80318b2121332b9
-ffc00318b30c0e323fbd0373004f0373000200400374b31718326fbb032a
-00010040032cb3181b3240b80370b2090c32bd031703160032001fffc003
-16b20e1132bd031c031e0016001f031d031eb2151fb0411f031e0001000f
-031f000102ca02d00015001f02d302d5000d001f02cf02d0000d001f02cb
-02d0000d001f02cd02d0000d001f02ce02d0000d001fffc002d0b3090c32
-40b802d2b3090c32e0411c02e50001005f02dd009f02e5000202bb02c300
-30001f02da02b80032001f02d902b9003f001f02d802b80064001f02b902
-b80033001f02bab221c81fb802b8b321c81f40b8039bb20d1632b9ffc002
-c3b22b2f32b9ffc002c3b21f2532b9ffc002c3b2171b32b9ffc002c3b212
-1632412502c202c1001c001f02d702c10024001f02c102c00022001f02bf
-02c00018001f02c0027400c8001f02b50235003b001f02b40235003b001f
-02c402bc001e001f02b702b60038001f02b3b20ec81fb802b0b207c81fb8
-02afb206c81fb802aeb200c81fb802afb2502f1fbc02ae02ab001a001f02
-adb2261a1fb802a8b326241f0fbb0235000102a50274b21d1f12410a02a1
-015801f4001f02a000d801f4001f001202a2b237c81fb80290b2bc201fb9
-029002904018374025402d40a6033025302d30a6032025202d203720a620
-4110028e0005009f028b0001028b028b0037002002890030028900400289
-00900289b20437b041fd027400c0027400020080027400a0027400020060
-0274007002740002000002740010027400020080027400f002740002003f
-0285004f028500020090027e0090027f009002800090028100040090027a
-0090027b0090027c0090027d000400900274009002750090027700030070
-027e0070027f007002800070028100040070027a0070027b0070027c0070
-027d000400700274007002750070027700030060027e0060027f00600280
-0060028100040060027a0060027b0060027c0060027d0004006002740060
-02750060027700030050027e0050027f005002800050028100040050027a
-0050027b0050027c0050027d000400500274005002750050027700030040
-027e0040027f004002800040028100040040027a0040027b0040027c0040
-027d000400400274004002750040027700030030027e0030027f00300280
-0030028100040030027a0030027b0030027c0030027d0004003002740030
-02750030027700030020027e0020027f002002800020028100040020027a
-0020027b0020027c0020027d000400200274002002750020027700030010
-027e0010027f001002800010028100040010027a0010027b0010027c0010
-027d0004001002740010027500100277000300e0027e00e0027f00e00280
-00e00281000400e0027a00e0027b00e0027c00e0027d000400e0027400e0
-027500e00277b103d041c5027e00d0027f00d0028000d00281000400d002
-7a00d0027b00d0027c00d0027d000400d0027400d0027500d00277000300
-30027400400274000200c0027e00c0027f00c0028000c00281000400c002
-7a00c0027b00c0027c00c0027d000400c0027400c0027500c00277000300
-b0027e00b0027f00b0028000b00281000400b0027a00b0027b00b0027c00
-b0027d000400b0027400b0027500b00277000300a0027e00a0027f00a002
-8000a00281000400a0027a00a0027b00a0027c00a0027d000400a0027400
-a0027500a0027700030090027e0090027f00900280009002810004009002
-7a0090027b0090027c0090027d0004009002740090027500900277000300
-20027e0020027f002002800020028100040020027a0020027b0020027c00
-20027d00040020027400200275002002770003028101580801001f028001
-290801001f027f00ec0801001f027e00d80801001f027d00b10801001f02
-7c00a60801001f027b00820801001f027a00370801001f02770026080100
-1f027500200801001f0274001f0801b21f370f41160235004f0235005f02
-35006f0235009f023500af023500bf0235000700af023500cf023500df02
-3500ff02354022040f074f079f07af07bf0705af07e007020f064f069f06
-af06bf0605af06e0060220411b020d0001005f02350001008f0235000100
-7f023500ef02350002002f0235003f02350002003f0234004f0234000202
-350235023402344011ed20ef2a01cf2a01bf2a01af2a018f2a0141090247
-0104001e001f022000370201001f0158400c263e1fd8263e1f3726273e1f
-b8028eb6ec171fb226361fb801bcb226361fb80129402b26361fec26361f
-b126361fa626361f8226361f3726361f3226361f2d26361f2526361f1f26
-361f37262a1fb801584022263e1fd8263e1fbc263e1f27263e1f21263e1f
-20263e1f3700161600000012110840b9020d01a6b3c50d0009b801bcb227
-281fb801bbb227301fb801b8b2274f1fb801b7b227621f410901b6002701
-01001f01b5002002ab001f01afb21fe41fb801adb21fe41fb801acb21fbb
-1fb801a8b21f341fb8015db2272e1fb8015bb227cd1f410d0155001f0401
-001f0154001f0401001f0153001f0201001f0152b21f561fb80151b21f29
-1fb8012bb227261f410d012a00270125001f0129015800e4001f0125001f
-0401001f0124b21fe41fb80123b21f3b1fb80122b21f391f410d01080027
-0801001f0106002d0101001f0105001f0101001f0103b31fbb1fefb90158
-0401400b1fed1f931fec1fe41feb1fb80201b21fd920b80401b21fcf25b8
-0156400a1fbc2d9e1fbb1f411fb2410a01580401001f00b101580401001f
-00b001580401b51fa625891f9bb901580125b61f991f2e1f8e2db80801b5
-1f8d1f291f89b901580401b21f8220b802ab40131f801f301f742de41f73
-1f4a1f611f521f5d25b802abb21f5c1fbc0801001f0059015802abb61f50
-25891f491fb80125b21f4725b80401400b1f461f791f401f271f3920bc02
-ab001f003801580401b21f372dbc0125001f003201580125b61f2c1f341f
-2a25b80801b21f5537b80111402a07f00790075b0742073b07230722071e
-071d071408120810080e080c080a080808060804080208000814b8ffe040
-2b0000010014061000000100060400000100041000000100100200000100
-0200000001000002010802004a00b013034b024b5342014bb0c063004b62
-20b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807ff52
-b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ffb101
-018e851bb0124358b10100858d1bb900010119858d5959001816763f183f
-123e113946443e113946443e113946443e113946443e11394660443e1139
-4660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b182b1db096
-4b5358b0aa1d59b0324b5358b0ff1d594bb08153205c58b9020f020d4544
-b9020e020d45445958b90470020f455258b9020f04704459594bb0e45320
-5c58b90020020e4544b90027020e45445958b908420020455258b9002008
-424459594bb8012553205c58b90026020f4544b90021020f45445958b90a
-0d0026455258b900260a0d4459594bb8040153205c58b1d8204544b12020
-45445958b9250000d8455258b900d825004459594bb8040153205c58b901
-5800264544b1262645445958b923200158455258b9015823204459594bb0
-2953205c58b11f1f4544b12d1f45445958b9010d001f455258b9001f010d
-4459594bb02f53205c58b11f1f4544b1251f45445958b90135001f455258
-b9001f01354459594bb8030153205c58b11f1f4544b11f1f45445958b914
-28001f455258b9001f14284459592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65422b01b331757ec3456523
-456023456560234560b08b766818b080622020b17e754565234520b00326
-6062636820b003266165b075236544b07e234420b131c34565234520b003
-266062636820b003266165b0c3236544b0312344b100c3455458b1c34065
-44b23140314523614459b33f3c5841456523456023456560234560b08976
-6818b080622020b1583c4565234520b003266062636820b003266165b03c
-236544b058234420b13f414565234520b003266062636820b003266165b0
-41236544b03f2344b10041455458b141406544b23f403f45236144594569
-5342014b5058b108004259435c58b108004259b3020b0a124358601b2159
-421610703eb0124358b93b21187e1bba040001a8000b2b59b00c2342b00d
-2342b0124358b92d412d411bba04000400000b2b59b00e2342b00f2342b0
-124358b9187e3b211bba01a80400000b2b59b0102342b0112342002b2b2b
-2b2b2b2b2b00b01243584bb035514bb021535a58b1262645b04061445959
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b737373737345b040614418
-004569444569447373737473737374737473742b2b2b2b2b2b2b2b2b2b2b
-2b0073737373737373737373737373737373737373737373747474747474
-7474747474747474747474747474747575757374757575752b7300004bb0
-2a534bb036515a58b1070745b040604459004bb02e534bb036515a58b103
-0345b0406044b1090945b8ffc06044592b4569440174007373732b456944
-2b012b435c58400a0006000702a006a00702b9ffc00274b31a1d326fbd02
-77007f02770002ffc00277b22f3132b9ffc00277b322253240b80274b32f
-353240b80274b3282a3240b80274b21a2132b8ffc0b3371a1d32b8ffc0b3
-251a1d32b8ffc040112d1a1d329025902d9037a025a02da03706b8ffc0b6
-a61a1d321fa61fb8028eb22fa60300742b732b2b2b2b2b2b2b2b742b7374
-59002b2b435c58b9ffc002a1b21c1d32b9ffc002a0b21c1d322b2b592b73
-012b2b2b2b002b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b012b2b2b2b2b
-2b2b73742b2b2b2b2b2b2b2b73732b2b2b2b2b2b732b732b2b2b742b2b2b
-73737373732b73732b2b2b732b2b002b2b2b2b7374732b732b2b2b2b752b
-2b2b2b2b2b2b2b752b2b2b2b2b732b2b2b2b7374752b2b7373732b2b2b73
-2b737374752b2b7374752b2b7374752b2b2b2b2b2b2b2b2b2b2b2b74752b
-000000>
-[16305 16261 16301 15993 16353 16361 16377 15773 16093 16113 15821 16109 16365
-15025 16197 16361 15857 16053 15881 16233 16301 15449 16065 16377 15477 15965
-16117 15425 15557 16353 16369 11749 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-
-2 0 3 <> Arial-BoldMT AddT42Char 
-2 8582 38 <00010061ffe7055e05d3001a00d6404e8609891489169f009806c709d403
-d40bf503092509280c280d29142916750575098605080713071717131717
-29022a03250507280599059709c903c50b053f014f01020152100001e000
-f0000200b8ffc0b311183400b8ffc0b30a0d3400b8015a4017182d04080e
-400e12340e4b5f0f014f0f010f401518340fb801284022122d0a030fef0e
-5600ef00014f0102011a301c011c1527a007010f071f0730070307b8028c
-b31b7e53182b4e10f45d714ded4e105df65d4dedf4ed003ffdf42b5d71e4
-2b3ffdf42b2b5d71e45d3130005d015d5d5d010506042320001110002120
-171617052626232206111016333236043f011f42fecdecfedcfe88017a01
-34010da86432fedb1aa576a3cbc8a076aa021b5bf0e9018f015a016e0195
-9f5eb0467284eafefafeeaec9600>Arial-BoldMT AddT42Char 
-2 12228 51 <00020095000004f805ba000f001b007740250605b914b918034705016705
-d605021211250d0e0e001b10250201020f00081627af070107b8ffc0b309
-0b3407b8028c40161f1d301d601d701d801d051d100f2001200030000200
-b8028bb31c3153182b4e10f45d3c4dfd3c4d1071f62b714ded003f3c3f3c
-fd3c12392f3cfd3c3130005d71015d331121201716161514060607062323
-1902333236363534262726239501db010e527eaa62974e6ac9c1a2af7643
-5e4835a005ba1621ddaf87b8691115fdd704c2fe602e624150680d0a>Arial-BoldMT AddT42Char 
-3 434 68 <00020049ffe8042e043e0023003201714068071a081c051d161a4a1b481c
-4925db10df11093619461957266619672686269219931aa61ab91bc71ac8
-1b0c06060d151606191627062915591977028602a606b506c6060cbf34d9
-10021d243231112c0d24402b2e3424402228342440191d346f24fc240224
-461db8ffc040300e0f343d1d01001d101db01df91d041d1d2c013300400e
-0f340f001f0002005521401c113f21401b103f2140181a3421b80274b504
-070c0d0a2cb8ffc0b31c113f2cb8ffc0b31b103f2cb8ffc0b3181a342cb8
-02744040140b1e3126082909280d591f0c9f0c021f0c01ff0c010c400e16
-340c1a4f340134600001008e300101013329215f1701df17014f175f176f
-17031719336941182b4e10f45d71724dedf471ed5d4e105df62b5d71724d
-edf4e4fd3c003fed2b2b2b3f3c3ffd2b2b2bf45d2be412392f5d712bb106
-02435458b22f1d017159edb10602435458b90024ffc0b71b1d3454246424
-025d2b595d2b2b2b111239030e103c3c3c313001715d005d710127363633
-321616150314161721262726270606232226353436363736373534262322
-060106060706151416333237363736350165ff2bd2cfbcb84b031b25feea
-0b10070348a45da4bd569b92c54c506f4b54015e36ea243758444c453310
-0b02e22e9a945989b7feb88c854c1c3719084646b2885a8d4b1c25201c51
-453bfed2123218273c3b563226372465>Arial-BoldMT AddT42Char 
-3 1212 70 <00010055ffe8043f043e001900e14051580f59125916680f691269167d18
-79199702970cc610c618d710d618e906e908e913e915f80613381338154a
-124a164618590c690c073a1237163718037705770f8705860f8919a812a7
-16b912b616090eb8ffc0b3181b340eb8ffc0b51214340e330db8ffc0b319
-1e340db8ffc0b30f11340dba0104000a02744012110b0040181b34004012
-1434003390010101ba0101000402744020170701401214340121002f0d40
-1214340d214f0e010e1a1b072114191a5841182b4e10f44ded4e10f65d4d
-ed2bf4ed2b003ffdf45de42b2b3ffdf42b2be42b2b3130005d7101715d01
-052626232206151416333236370506062322001110003332160431feeb0e
-634f697d7f6b50661501142bf4cde9feeb0116edc2e502ec32535491aabd
-9c5b6f2fbec20126010401070125a700>Arial-BoldMT AddT42Char 
-3 1768 72 <00020041ffe80427043e0014001c01a3b90010fff840460b3999099a0d96
-10a805a70abb09bb0db81a0808140148024706460a4f1ea80db606b61ac7
-0ac80cd60ad80cf807f70d0d1c0f1c15401b1d3415400e11340f15bf15cf
-150315b8ffc0b30f1e3f15b8ffc0b30e173f15b8028d400c0f0e12500e60
-0e020e181201b8ffc0b6191b3401331200b8ffc0b31d203400b8ffc0b322
-293400b8ffc0b32b2d3400b8ffc0b3181c3400b8ffc0400f0e0f34a00001
-0000100002005f1212b80274b3040b1218b8027440240b070021012f1521
-4f0e010e1a2f1e5f1e6f1e9f1e041e0f2108400d0f3408191d6941182b4e
-10f42b4ded4e105df65d4dedf4ed003fed435c584014184028143f18401e
-0f3f18401b103f18401c113f2b2b2b2b593ffd435c58b90012ffc0b32814
-3f12b8ffc0b31e0f3f12b8ffc0b31b103f12b8ffc0b21c113f2b2b2b2b59
-f45d712b2b2b2b2b435c58b90000ffc0b2123900b8ffc0b2173900b8ffb0
-b3090a3e00b8ffc0b241213f2b002b2b2b59e42b1112395d435c5840140e
-400f1e3f0e401c113f0e401b103f0e400e173f002b2b2b2b592f3cfd2b2b
-722b2b3c0111333130015d71005d2b010506062320272635100033320003
-211616333236132626232207061702fa011836e9affeeb85690114d3ed01
-1206fd40038261425a270378565c3c3c0101522f9aa1b591dd0108012bfe
-c7febd7d8b48016c7a7f43437300>Arial-BoldMT AddT42Char 
-3 2292 73 <00010018000002e605d3001600b840323604012a04201020115904801805
-0804bf180215161102141216110e130f00100e13010010021409080f0b01
-5f0bff0b020bb80274400a0601110f1601ff160116b80274401e10000001
-f00001000613140a09333f084f085008030828102f115f110211b8010440
-0d0e132602145f00a016c0160216b8ffc0b6090c3416191778b902690018
-2b4e10f42b713c4dfc3cfd3cfc5d3cf45d19e400183f3c3f5d713cfd5d71
-3c3ffd5d7139320f0f0f0f313001715d005d133335343636333217072623
-2206151533152311211123189c399975787326433e3d35d2d2fee79c0426
-5086845324c41039514bddfcb7034900>Arial-BoldMT AddT42Char 
-3 3024 75 <000100920000045905ba001600b2402b0f011f0139013302331042014211
-de01f9010907051605240258116811050101021314111213031402010fb8
-0274401d0307090a0a14150a1600000b0a26080940202434af0901ff0901
-091a18b8ffc040162224349018a018027018f01802ef1801180014261615
-b8ffc0400f202434a01501f015011519173f3c182b4e10f471722b3c4dfd
-3c4e105d71722bf671722b3c4dfd3c003f3c3f3c3c103c3fed3939111739
-030e103c083c3130015d005d01113633321e021511211134262623220606
-1511211101ab88bd619c4f1dfee720513d466e33fee705bafde59f487088
-8ffd910231a75a35448986fdec05ba00>Arial-BoldMT AddT42Char 
-3 3280 76 <00020093000001ac05ba000300070077b90009ffc0403f110a3f40095009
-028009b009c009d009ef09051f0960097f09a009b0090503060700050403
-0f00014000d000e00003005d02010006050607040a0207260104b8ffc040
-092124340419083f3c182b4e10f42b3c4dfd3c003f3c3f3c3f3cfd5d713c
-0305103c3c103c3c313001715d722b1311211101112111930119fee70119
-04b60104fefcfb4a0426fbda>Arial-BoldMT AddT42Char 
-3 3958 79 <00010093000001ac05ba00030053b90005ffc04029110a3f400550050280
-05b005c005d005ef05051f0560057f05a005b0050502010003000a020326
-0100b8ffc040092124340019043f3c182b4e10f42b3c4dfd3c003f3c3f3c
-313001715d722b3311211193011905bafa46>Arial-BoldMT AddT42Char 
-3 4736 82 <00020052ffe8049a043e000d001900974048e801e708f713f71504c702e8
-05021219051909025910561356165918970298069808970cb809d502db05
-dc09d50ce705e706e80d10a708cb02cc06c308c60c057508890684080311
-b80274b20a0b17b80274401404071439071a601b701b021b0e2100191a58
-41182b4e10f44ded4e1071f64ded003fed3fed313000715d015d71435840
-09691066126616691804015d59005d015d13341236333200151400232224
-26251416333236353426232206528afd9cf10134fec9ec92fef78a012096
-6e6e95956e6e9602228c01068afec7eff1fec384ffa89ea8a8a09ca8a800
->Arial-BoldMT AddT42Char 
-3 5486 85 <0001008700000337043e001000a84028970501090e01530566057505032f
-12580e680e7012040a090f0c1f0c028f0cff0c023f0c4f0c020cb8027740
-29070701000a0302060a28000910093009700904091a7f129f12025f127f
-12af12d01204121000260103b80129400b02028001a001020119113fb901
-1c00182b4e10f4713c4d10ed10fd3c4e105d71f65d194de400183f3c3f3c
-3fed5d717239323130015d005d71004bb017534bb035515a58b10a323859
-005d212111211536363332170726232206061101a0fee70105436b446059
-57473d3b522f0426976b4435f52e41aafef1>Arial-BoldMT AddT42Char 
-2 0 0 <00020100000005000500000300070042b40201fe0607b8023f4013000504
-fe03000a0704fe010019080605fe0203bc0126000901b0011800182b10f6
-3cfd3c4e10f43c4dfd3c003f3cfd3c10fc3cfd3c31302111211125211121
-01000400fc2003c0fc400500fb002004c000>Arial-BoldMT AddT42Char 
-Arial-BoldMT /CharStrings get begin
-/space 3 def
-/C 38 def
-/P 51 def
-/a 68 def
-/c 70 def
-/e 72 def
-/f 73 def
-/h 75 def
-/i 76 def
-/l 79 def
-/o 82 def
-/r 85 def
-end
-Arial-BoldMT /Encoding get
-dup 32 /space put
-dup 67 /C put
-dup 80 /P put
-dup 97 /a put
-dup 99 /c put
-dup 101 /e put
-dup 102 /f put
-dup 104 /h put
-dup 105 /i put
-dup 108 /l put
-dup 111 /o put
-dup 114 /r put
-pop
-end
-%ADOEndSubsetFont
-/KUDFOH+Arial-BoldMT /Arial-BoldMT findfont ct_VMDictPut
-/KUDFOH+Arial-BoldMT*1 
-[32{/.notdef}rp /space 34{/.notdef}rp /C 12{/.notdef}rp /P 16{/.notdef}rp /a 
-/.notdef /c /.notdef /e /f /.notdef /h /i 
-2{/.notdef}rp /l 2{/.notdef}rp /o 2{/.notdef}rp /r 141{/.notdef}rp]
-KUDFOH+Arial-BoldMT nf
-KUDFOH+Arial-BoldMT*1 [9 0 0 -9 0 0 ]msf
-234 242.76 mo
-(Profile Cache)
-[6.00307 3.48306 5.51694 2.99693 2.52 2.52 5.03998 2.27701 6.48001 5.04001 5.03998 5.51694 
-0 ]xsh
-/KUDFOH+Arial-BoldMT*1 uf
-/KUDFOH+Arial-BoldMT uf
-/Arial-BoldMT uf
-%ADOBeginSubsetFont: ArialMT Initial
-ct_T42Dict begin
--0.664 -0.324 2 1.004
- 256 array 0 1 255 {1 index exch /.notdef put} for  /ArialMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f3210325d73000000cc000000606376
-7420a11cd7eb0000012c000006546670676dcc79599a000007800000066e
-676c796607022dca000094e0000822cc68656164d6144b3e00000df00000
-003668686561123315fe00000e2800000024686d7478f65efffb00000e4c
-000034d46c6f6361361cd72000004320000034d86d617870124c05df0000
-77f8000000206e616d659617a74000007818000011057072657025d64dbf
-0000892000000bbe67646972000000000000000000000000000303880190
-00050008059a05330000011b059a0533000003d1006602120805020b0604
-020202020204e0002affc00078430000000900000000544d432000400020
-fffc05d3fe510133073e01b2400001ffffff0000042605bb000000200004
-05ba001905ba001a05a70019042600180000ffe70000ffe80000ffe7fe69
-ffe805ba0019fe69ffe802ea000000b8000000b80000000000a800ad0169
-00ad00bf00c201f0001800af00b900b400c800170044009c007c00940087
-0006005a00c80089005200520005004400940119ffb4002f00a1000300a1
-00cd00170057007e00ba00160118ffe9007f008503d300870085000d0022
-00410050006f008d014cff75005c00df04830037004c006e00700180ff58
-ff8eff92ffa400a500b903c8fffd000b001a0063006300cdffee05d8ffdc
-002d005c0095009900df019209b500400057008000b9039d0072009a035d
-0401ff67fffa00030021007700cd0004004d00cd01c0022b004c006500e7
-0118017c034305d8ffa3ffb0ffc40003001c005d0068009a00ba01350147
-0221055cff4dffcd0016002d00780080009900b200b600b600b800bd00da
-010c05f0ffa4fff00019002c0049007f00b400ce01c003fefd81fe3f0000
-00050018002900390049006f00be00c700d0012301c1026f050c05320540
-057affd4001400310055005700a700b400e601f7027e027e027f03c60446
-ff42000e0085009100bf00c200c500e1011a012f014f01560229026f029e
-03720008002c00310031006400690089009800c700de012b01b6020c02cf
-03a304ab04fb061dfee0ff0e00060026009b009d00c1010d011801200173
-018201d601e30243025f029b02e2039404a904d20761001c005e006d008d
-00ab00f7011201380151015b0168017c01870191019901cd01d001e80241
-0254026b02ef0368037103bd044204420453047304830586058b06e8fe58
-fec4fed1fef7ff32ff860051007c008100910095009e00b400b900cf00d9
-00d900df00e20105010b010e010e012001210155017b017b017e018d01a2
-01a801a901b401d001d001e201e901f201f501fb020002000206021b0221
-022202220223027202770294029c02cf02cf02d002ec02f903170322032b
-0335033c0359036f037103870390039003b503e1041a04cf04ff05320532
-0596059f05a805ab05c205f0060c0782080008ccfca3fd2afddefe00fe88
-fe96feb2feb4ffe100150019001a001c001f003c005100610061006a0078
-009600a500af00d3010c0118011a012a013e014c0151015f016a01710178
-01820184019a01a501a801a901ae01bc01cd01d701ef0200020d021c0221
-0222022e02350242024f024f025e026502710290029202b402d602fa0307
-030b030f0315032a0347035d036503740379039603b003cc03dd03e203f6
-03fc03fc03ff040a041f04220426042b0447045f0475049e04e704e7055c
-05cb05e5060a066d068606b806f10736073e07500751075d078f07b607d4
-086000b600c300b500b700000000000000000000000001e00381034503b5
-008e0233041902ce02ce002d005f0064034d023f000002a80188027d01b4
-02240578063b023b014e00f00426029402c6029f02f6023b034d014b0153
-006a0231000000000000061404aa0000003c04c300ed04bc026502ce03b5
-0078060c017e02ef060c00b201000239000001c50330042b03cb00da03df
-010704a100db040a011701ed02a70350010b01bd043e05580021039c00ae
-0371017d00b5024500000afb088c012b014e01aa00870054013201f803ff
-0003024e00b4003703e30083006b02d800ed00770088009701640467008e
-0033017c00e700a6029e0329056e062a061501c90269048a021301b40002
-04a9000002390124010305140084015d039a06ef02d9007500cf040a00de
-03ac04bc02cf02ae034d04f005520168006d007d00860071ff8100790558
-04d2016700030156002504e00094007c033204210094007f0072005c002f
-00b6001800ba00b80041034d00720018001f004c016a01550099009a009a
-009800b200040078006900140057006e00ce00b4065402b80067050e0165
-00e7000004cbfe52005affa60099ff67006eff92002dffd40087ff7c00b8
-00a800e5008f00a80185fe7b0070001e00d900de014c054602cf0546ff2d
-028a02d90253029600b700000000000000000000000000000125011800ea
-00ea00ae0000003e05bb008a04d70053003fff8cffd50015002800220099
-0062004a00e4006d00ee00e5004803c00033fe4e02b1ff460370007905df
-0051ffa7ff1f010a0068ff6c004f00bc00a507050061072b00ed04b001d2
-00b6007b00650252ff740365fe690094008f005c00400086007500890089
-4043555441403f3e3d3c3b3a3938373534333231302f2e2d2c2b2a292827
-262524232221201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09
-0807060504030201002c4523466020b02660b004262348482d2c45234623
-6120b02661b004262348482d2c45234660b0206120b04660b00426234848
-2d2c4523462361b0206020b02661b02061b004262348482d2c45234660b0
-406120b06660b004262348482d2c4523462361b0406020b02661b04061b0
-04262348482d2c0110203c003c2d2c20452320b0cd442320b8015a515823
-20b08d44235920b0ed51582320b04d44235920b09051582320b00d442359
-21212d2c20204518684420b001602045b04676688a4560442d2c01b10b0a
-432343650a2d2c00b10a0b4323430b2d2c00b0172370b101173e01b01723
-70b10217453ab10200080d2d2c45b01a234445b01923442d2c2045b00325
-456164b050515845441b2121592d2cb00143632362b0002342b00f2b2d2c
-2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b1
-2cc08a8cb8100062602b0c642364615c58b00361592d2c45b0112bb01723
-44b0177ae4182d2c45b0112bb01723442d2cb01243588745b0112bb01723
-44b0177ae41b038a45186920b01723448a8a8720b0a05158b0112bb01723
-44b0177ae41b21b0177ae45959182d2c2d2cb0022546608a46b040618c48
-2d2c4b53205c58b002855958b00185592d2c20b0032545b019234445b01a
-23444565234520b00325606a20b009234223688a6a606120b01a8ab00052
-7921b21a1a40b9ffe0001a45208a54582321b03f1b235961441cb114008a
-5279b31940201945208a54582321b03f1b235961442d2cb110114323430b
-2d2cb10e0f4323430b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2c
-b10e0f432343650b2d2cb11011432343650b2d2c4b525845441b2121592d
-2c0120b003252349b04060b0206320b000525823b002253823b002256538
-008a63381b212121212159012d2c4bb06451584569b00943608a103a1b21
-2121592d2c01b005251023208af500b0016023edec2d2c01b00525102320
-8af500b0016123edec2d2c01b0062510f500edec2d2c20b001600110203c
-003c2d2c20b001610110203c003c2d2cb02b2bb02a2a2d2c00b00743b006
-430b2d2c3eb02a2a2d2c352d2c76b8022323701020b802234520b0005058
-b00161593a2f182d2c21210c6423648bb84000622d2c21b08051580c6423
-648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb815
-55621bb200802f2b59b002602d2c0c6423648bb84000626023212d2cb400
-0100000015b00826b00826b00826b008260f10161345683ab001162d2cb4
-000100000015b00826b00826b00826b008260f1016134568653ab001162d
-2c4b53234b515a5820458a60441b2121592d2c4b545820458a60441b2121
-592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb01343
-58031b02592d2cb0134358021b03592d2c4b54b012435c5a58381b212159
-2d2cb012435c580cb00425b00425060c6423646164b807085158b00425b0
-0425012046b01060482046b0106048590a21211b2121592d2cb012435c58
-0cb00425b00425060c6423646164b807085158b00425b00425012046b8ff
-f060482046b8fff06048590a21211b2121592d2c4b53234b515a58b03a2b
-1b2121592d2c4b53234b515a58b03b2b1b2121592d2c4b53234b515ab012
-435c5a58381b2121592d2c0c8a034b54b00426024b545a8a8a0ab012435c
-5a58381b2121592d2c4b5258b00425b0042549b00425b00425496120b000
-5458212043b0005558b00325b00325b8ffc038b8ffc038591bb040545820
-43b0005458b00225b8ffc038591b2043b0005458b00325b00325b8ffc038
-b8ffc0381bb00325b8ffc03859595959212121212d2c462346608a8a4623
-20468a608a61b8ff8062232010238ab902c202c28a70456020b0005058b0
-0161b8ffba8b1bb0468c59b0106068013a2d2cb1020042b123018851b140
-0188535a58b910000020885458b202010243604259b12401885158b92000
-0040885458b2020202436042b12401885458b2022002436042004b014b52
-58b2020802436042591bb940000080885458b202040243604259b9400000
-8063b80100885458b202080243604259b94000010063b80200885458b202
-100243604259b94000020063b80400885458b20240024360425959595959
-2d2cb0024354584b53234b515a58381b2121591b21212121592d00000001
-00000005028fa58dc35f5f0f3cf5081b080000000000a2e3272a00000000
-c14fd713faaffd671000080c00000009000100010000000000010000073e
-fe4e00431000faaffa7a1000000100000000000000000000000000000d35
-06000100000000000239000002390000023900b002d7005e047300150473
-0049071d0077055600580187005a02aa007c02aa007c031d004004ac0072
-023900aa02aa0041023900ba0239000004730055047300df0473003c0473
-00560473001a047300550473004d047300610473005304730055023900b9
-023900aa04ac007004ac007204ac00700473005a081f006f0556fffd0556
-009605c7006605c7009e055600a204e300a80639006d05c700a4023900bf
-04000037055600960473009606aa009805c7009c063900630556009e0639
-005805c700a10556005c04e3003005c700a105560009078d001905560009
-0556000604e300290239008b023900000239002703c100360473ffe102aa
-00590473004a0473008604000050047300460473004b0239001304730042
-0473008701c7008801c7ffa20400008801c7008306aa0087047300870473
-0044047300870473004802aa00850400003f02390024047300830400001a
-05c700060400000f040000210400002802ac0039021400bc02ac002f04ac
-00570556fffd0556fffd05c70068055600a205c7009c0639006305c700a1
-0473004a0473004a0473004a0473004a0473004a0473004a040000500473
-004b0473004b0473004b0473004b023900bd023900230239ffe502390009
-047300870473004404730044047300440473004404730044047300830473
-0083047300830473008304730049033300800473006b0473001b04730051
-02cd006d044c000104e3009905e5000305e50003080000e102aa00de02aa
-003d0464004e080000010639005305b4009a0464004e0464004d0464004d
-0473fffd049c00a003f4003805b4007a069600a1046400000231000002f6
-002f02ec002d0625007f071d004404e3008104e3009e02aa00e804ac0072
-046400540473002e0464003304e5001a047300860473008c080000ef0556
-fffd0556fffd0639006308000081078d00520473fffc0800000002aa0053
-02aa004701c7008001c7006c0464004e03f4002f04000021055600060156
-fe390473ffe402aa005c02aa005c040000170400001704730049023900b9
-01c7006c02aa0047080000250556fffd055600a20556fffd055600a20556
-00a20239008d0239ffe00239000402390015063900630639006306390063
-05c700a105c700a105c700a1023900c602aa001902aa000602aa001d02aa
-002e02aa00e502aa00a202aa006b02aa003a02aa004b02aa002804730000
-01c700030556005c0400003f04e3002904000028021400bc05c7fffd0473
-004905560006040000210556009e0473008704ac007204ac00a102aa006b
-02aa001902aa002106ac006b06ac006b06ac0021047300000639006d0473
-0042023900b10556005c0400003f05c700660400005005c7006604000050
-04730046046bffe102aa00ee0556fffd0473004a0556fffd0473004a05c7
-009e04eb004705c7fffd055600a20473004b055600a20473004b04730096
-01c7004204730096025500880473009a02ac008305c7009c0473008705c7
-009c04730087063900630473004405c700a102aa008505c700a102aa003c
-0556005c0400003f04e300300239002404e300300300002305c700a10473
-008305c700a10473008304e300290400002804e3002904000028046800a4
-063900600662005504a00048047400480391006204f000440329002e0530
-0048046bffe1040000b002eb005208c000330800004f040000990800004f
-040000990800004f040000980400009807d5016a05c0009e04ab007204d5
-009d04ac007104d5022204d5010505abffe9050001c905ab027e05abffe9
-05ab027e05abffe905ab027e05abffe905abffe905abffe905abffe905ab
-ffe905ab01c005ab027e05ab01c005ab01c005abffe905abffe905abffe9
-05ab027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab
-01c005ab01c005abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905abffe905abffe905ab02d605ab006605abffea05d5ffff04d50092
-0800000007eb013007eb012007eb013007eb012004d500b204d5008004d5
-002a082b0198086b01b807550010060000f40600006f0440003a05400037
-04c0003f04150040040000250600005505e100bf038d008904d5ffd90180
-008002d50086071500610296000f04d5009202d6008302d6008304d500b2
-02d600700556fffd0473004a05c700660400005005c70066040000500556
-00a20473004b055600a20473004b055600a20473004b0639006d04730042
-0639006d047300420639006d0473004205c700a40473008705c7001f0473
-00060239ffce0239ffce0239ffe40239ffe40239fff60239fff50239004b
-01c700190400003701c7ffa20556009604000088040000860473009601c7
-fffa05c7009c0473008705c900a50473008b063900630473004406390063
-0473004405c700a102aa006b0556005c0400003f04e300300239000c05c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-078d001905c70006055600060400002101c700890556fffd0473004a0800
-0001071d00440639005304e30081023900b9078d001905c70006078d0019
-05c70006078d001905c70006055600060400002101c7008a02aaffe10473
-001b04cd005a06ac006b06ac002206ac002206ac004a02aa00e202aa006b
-02aa00de02aaffea0557ffff0646ffa706b4ffa80312ffa80632ffa706d8
-ffa70605ffa701c7ff780556fffd055600960558fffe055600a204e30029
-05c700a4023900bf055600960558000b06aa009805c7009c0533006d0639
-006305c700a40556009e04f2009404e30030055600060556000906af007f
-05fb0061023900040556000604a00048039100620473008b01c7006b0460
-0088049a008c04000019038700480473008b0473005c01c7008904000086
-04000018049c00a00400001a0395005c04730044048d008303db00560460
-00880433001105b4007a063f005701c7ffc9046000880473004804600088
-063f0057055700a206eb0032045500a105c000640556005c023900bf0239
-0004040000370875000d081500a406d5003104a900a10515000a05c000a0
-0556fffd054000a705560096045500a1056b0000055600a20763000704d5
-004e05c000a105c000a104a900a10540001206aa009805c700a406390063
-05c000a00556009e05c7006604e300300515000a061500520556000905eb
-009f05550057075500a1078000a106550000071500a8054000a505c00055
-081500a405c7001a0473004a0495005b0440008802eb008804ab00000473
-004b055afffb03ab003204780087047800870380008604ab00180580008c
-046b00880473004404550088047300870400005003aa0026040000210695
-004b0400000f0495008a042b0045066b008d0695008d0500002805c0008b
-042b008404150030060000890455001f0473004b0473000002eb00890415
-004b0400003f01c700880239000901c7ffa2074000130680008304730000
-0380008604000021046b008803e900a1034a008808000041089500a00585
-002d000001010000001e0000003100000031000001010000007e0000007e
-0000008c0000008c000001010000001000000101000001210310007d0000
-008c023300d20000030b0000ff04023900b9048100690456003203310019
-0411002d04d1009601f9009b030f005f04ca009b04b8008c01f9009b0413
-002803b0005003b4003c04ca009b04cf005001f9009b02d2003c0498005a
-043c00190488006e045f007303b1001903d4000a0466009604130028058e
-00640524002803f2009b03f2009b03f2009b01e3005a0356005a0686009b
-01f9ffac041300280413002803b4ff5703b4ff570448002d058e0064058e
-0064058e0064058e00640481006904810069048100690456003203310019
-0411002d04d10096024b0000034a000004b8008c024b00000413002803b0
-005003b4003c04cf005002d2003c0498005a0488006e045f007303d4000a
-0466009604130028058e00640524002801f9009b0456003203b00050045f
-0073049b003c0000ffdc0000ff250000ffdc0000fe51028d00ab028d00a0
-02da0043034d007901a8ffba000000460000004600000046000000460000
-00480000004600000046000000460435017c0435012e043500b704350081
-0435012c043500be043500af043500810435009a043500db04350085028d
-00c1043500b3060001000600010002420036060001000435009e04350098
-043500cb0600010006000100060001000600010006000100000000460600
-010006000100060001000600010006000100060001000600010006000100
-051bffba06000100060001000600010005b5003a05b5003a01f4ffba01f4
-ffba060001000600010006000100060001000481003604350036043dffba
-043dffba03e9004a03e9004a067f0014077600140327ffba041effba067f
-0014077600140327ffba041effba051b003204b500240300fff706000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010000000030
-0000004600000046000000400000004606000100060001000000ffdc0000
-fe510000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ff160000ff160000ffdc0000ff160000ffdc0000ff200000ffdc0473
-004a08000000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010006000100028d
-007f028d005d0600010004ee0015034d007901a8000e01d6ffdc01a80056
-01d60010037500320375003201a8002d01d60013051b003204b5002401f4
-ffba01f4ffba01a8009301d6001305b5003a05b5003a01f4ffba01f4ffba
-024200000300fff705b5003a05b5003a01f4ffba01f4ffba05b5003a05b5
-003a01f4ffba01f4ffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba02b3
-005f02b3005f02b3005f02b3005f03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba08c9003e08c9003e06c5ffba06c5ffba08c9003e08c9003e06c5ffba
-06c5ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7
-ffba04a7ffba045a002a039a00360435ffba0327ffba045a002a039a0036
-0435ffba0327ffba064f0027064f00270224ffba021affba04a7004604a7
-00460224ffba021affba04cf002d04cf002d0327ffba0327ffba040d0047
-040d004701a8ffba01a8ffba02b4002302b400230327ffba0327ffba0435
-00450435004501f4ffba01f4ffba024200360300fff7039affba0327ffba
-0375003203750032051b003204b50024051b003204b5002401f4ffba01f4
-ffba045a004004ce0049045a002604ce0039045a005304ce004a045a0053
-04ce004a0600010006000100000000460000004606000100060001000600
-010000000046000000460600010006000100000000480000004606000100
-060001000600010000000046000000460000004600000046000000400000
-003006000100000000460000004606000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d00ca028d00c7028d
-00c606000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000100ffba0800ffba1000ffba06dc0063053f004406d5
-00a1055b00830000fddc0000fc2f0000fca60000fe540000fcd70000fd73
-0000fe290000fe0d0000fd110000fc670000fd9d0000fbf50000fc720000
-fed50000fed50000ff02041b00a006ac006b06ac00190000feb60000fd73
-0000fe080000fca60000fe530000fd110000fbc80000faf40000faaf0000
-fc720000fbaa0000fb6a0000fcf10000fc7d0000fbdd0000fcc10000fb98
-0000fdea0000fe840000fdc20000fcf10000fd5f0000fe760000febc0000
-fceb0000fd6c0000fd580000fc900000fd150000fc2c0000fc130000fc12
-0000fb960000fb9601c700880556fffd0473004a0556fffd0473004a0556
-fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473004a
-0556fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473
-004a0556fffd0473004a0556fffd0473004a055600a20473004b055600a2
-0473004b055600a20473004b055600a20473004b055600a20473004b0556
-00a20473004b055600a20473004b055600a20473004b0239006301c7001f
-023900ba01c7007c06390063047300440639006304730044063900630473
-004406390063047300440639006304730044063900630473004406390063
-0473004406dc0063053f004406dc0063053f004406dc0063053f004406dc
-0063053f004406dc0063053f004405c700a10473008305c700a104730083
-06d500a1055b008306d500a1055b008306d500a1055b008306d500a1055b
-008306d500a1055b00830556000604000021055600060400002105560006
-040000210556fffd0473004a0239ffe201c7ffb0063900630473004405c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-05c700a1047300830000fefe0000fefe0000fefe0000fefe0455fffd02eb
-000c07630007055afffb04a900a10380008604a900a10380008605c700a4
-046b00880473fffd040000140473fffd04000014055600090400000f0555
-0057042b0045055500a10473008706050063047300550639006004730044
-05b5003a01f4ffba0224ffba021affba04a7004601f4009e01f4001001f4
-001b01f4001001f4006b01f4fff90227ffce0000000f0000fff502aa00a4
-02aa00a40000000e00000056000000560000ffcf01a8000f01d6ffbf01a8
-fff501d6ffcd01a8001d01d6fff501a8009301d600130375003203750032
-0375003203750032051b003204b5002405b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba
-01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4
-ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a
-01f4ffba01f4ffba0481003604350036043dffba043dffba048100360435
-0036043dffba043dffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba0481
-003604350036043dffba043dffba02b3003202b3003202b3005f02b3005f
-02b3005f02b3005f02b3003202b3003202b3005f02b3005f02b3005f02b3
-005f02b3005f02b3005f02b3003802b3003802b3004902b3004903e9004a
-03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9
-004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba0692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba08c9003e08c9003e06c5ffba06c5ffba04a7ffba04a7ffba045a
-002a039a00360435ffba0327ffba064f0027064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba064f0027064f00270224
-ffba021affba064f0027064f00270224ffba021affba064f0027064f0027
-0224ffba021affba04a7004604a7004604a7004604a70046093e0032093e
-00320740ffba0740ffba067f0014077600140327ffba041effba04cf002d
-04cf002d0327ffba0327ffba04cf002d04cf002d0327ffba0327ffba04cf
-002d04cf002d0327ffba0327ffba067f0014077600140327ffba041effba
-067f0014077600140327ffba041effba067f0014077600140327ffba041e
-ffba067f0014077600140327ffba041effba067f0014077600140327ffba
-041effba040d0047040d004701a8ffba01a8ffba040d0047040d004701a8
-ffba01a8ffba040d0047040d004701a8ffba01a8ffba040d0047040d0047
-01a8ffba01a8ffba043500450435004501f4ffba01f4ffba043500450435
-00450435004504350045043500450435004501f4ffba01f4ffba04350045
-043500450481003604350036043dffba043dffba024200360300fff7031a
-001a031a001a031a001a0375003203750032037500320375003203750032
-037500320375003203750032037500320375003203750032037500320375
-0032037500320375003203750032051bffba04b5ffba051b003204b50024
-01f4ffba01f4ffba0375003203750032051b003204b5002401f4ffba01f4
-ffba051b003204b50024067f0045067f0045067f0045067f004501a80028
-0000fe290000fea20000ff300000ff1d0000ff120000ff920000fe7e08fc
-003208ad00320000ffb50000ffb60000feed0000ff640000fe7e0000ff9f
-018d000002f6fffd0000fe820000ff1004cd00320000ff580000ff580000
-ff640692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba045a002a039a00360435ffba0327ffba034d007902b400230242
-003601f4ffba0290ffba01f4002f01f4003b01f4001201f400b101f4006d
-067f00140776001401f9009b0000fed902bc000003f2009b045afff504ce
-fff5045a005304ce004a045a005304ce004a045a005304ce004a045a0053
-04ce004a045a005304ce004a045a005304ce004a04350071043500ad045a
-000f04ce000f0473001406110014054000a7047300860540000a0473000a
-05c7005105c700660400005005c7fffd067a00140540004a047300460474
-00480556006e04d5005304e3ffc40639006d04fe000f070c008701c70083
-0239001f055600960400008801c7001504000018072000a405c7ffb80473
-008b0639006006f200630557004406090014047300860556009e0556006b
-0400004f04f20094030b00440239002404e300140239002404e3003005fb
-006105c700a1062e00140400002104e300290400002804e3002904e30031
-045c0044045c003f0473003c0473005503ab003203e50024047300870214
-00bc034e00bc04ac0072023900b00aaa009e09c7009e08640046087f0096
-06aa0096039c008309c7009c078e009c062b0087047300550556fffd0473
-004a0000fefe0556fffd0473004a08000001071d00440639006d0473001a
-0639006d0473004205560096040000880639006304730044063900630473
-004404e30029045c004c01c7ffa20aaa009e09c7009e086400460639006d
-04730042084600a404f2009e05c7009c047300870556fffd0473004a0556
-fffd0473004a055600a20473004b055600a20473004b0239ff8a0239ff64
-023900040239fff60639006304730044063900630473004405c700a102aa
-ffcc05c700a102aa006805c700a10473007605c700a1047300830556005c
-0400003f04e3003002390024045c0051037e001305c700a40473008705a6
-00a404d6005e0486005e04e30029040000280556fffd0473004a055600a2
-0473004b06390063047300440000fefd0639006304730044063900630473
-004406390063047300440556000604000021047300570473004804730086
-04730086040000130400005004730046047300460473005505e9005503ab
-004903ab0032050d0032040f00440239ffb9047300420473004204780050
-0402001904ef00190473008b047300870473008701c7001901c7008901c7
-0089029e0000026e001401c700830493008306aa008406aa008406aa0087
-0473ffa60473008b046c00870473004406530044063f00570466004402aa
-ffe402aaffe402aaffe402aa008502aa008502aa008502aaffe40455008a
-0455008a0400003f01c7ffa20214ffb901c7ff7202cb00000239000f0239
-002404730019048c0044046000880400001a05c700060400001804280019
-0400002804540028045c004c045c00790400002404000050040000240400
-00500639006304400088040f004904780050046b0088032e000004000008
-033b008804730048040000240400005007b7004607400046080b004605b3
-0024036f002405c00024061c0013054a0083050f008303e2001e04380063
-03110064031100640146ffce01eb006401eb000001eb000002ea006403d9
-0000029100000187005a02d7005e01c7008001c7006c01c7008a02aa00fb
-02aa00fb02ca003202ca003204ac007004ac007004ac006504ac006502aa
-012102aa00de02aa005902aa012102aa001d02aa005902aa00de023900b6
-023900b602aa00fb02aa00fb02aa00a602aa00a602aa00a602aa001d02aa
-ffe202aafffb029400000142006402b8003202a0000002ca003203100096
-0310009603100096031000960310009602aa006202aa006202aa002802aa
-001d02aa0047045700960457009604570096045700960457004304570043
-045700430457004304570043031000430457002f0457002f0457002f0457
-002f0457002f0310002f0457002504570025045700250457002504570025
-0310002f0457001a0457001a0457001a0457001a0457001a0310001a0457
-004204570042045700420457004204570042031000420457009604570096
-045700960457009604570042045700420457004204570042045700420310
-00420457002f0457002f0457002f0457002f0457002f0310002f0457002f
-0457002f0457002f0457002f0457002f0310002f04570026045700260457
-002604570026045700260310002604570042045700420457004204570042
-045700420310004204570096045700960457009604570096045700420457
-004204570042045700420457004203100042045700260457002604570026
-045700260457002603100026045700230457002304570023045700230457
-0023031000230457002f0457002f0457002f0457002f0457002f0310002f
-0457004b0457004b0457004b0457004b0457004b0310004b045700960457
-009604570096045700960457004204570042045700420457004204570042
-031000420457001a0457001a0457001a0457001a0457001a0310001a0457
-002404570024045700240457002404570024031000240457002f0457002f
-0457002f0457002f0457002f0310002f0457004e0457004e0457004e0457
-004e0457004e0310004e045700960457009604570096045700960000fec1
-0000fec60000fdac0000fed80000ff920000fee90000ff4c0000fea00000
-fec40000ffce0000ff660000fea00000fed80000fed80000ff970000ff98
-0000ff990000fff40000ff420000ff420000ff440000ff5f0000fe870000
-ffec0000ffa60000ff510000ff510000ff510000fec90000ff1c00000000
-0000fee90000ff4c0000ff930000ff2a0000ff560000ffce0000fe870000
-febb0000fec40000fec40000fed80000fed80000feb30000fec90000fdad
-0000fdac0000feb30000fec90000fdad0000fe160000fee60000ffa60000
-fe870000ff440000feba0000ff230000ff9a0000fdac0000fe8800000000
-0000feb00000ff980000fe930000ffa60000fe870000fdac0000ff660000
-ff440000feb00000feb00000feb00000ff030000ff520000fd1f0000ff53
-0000ff530000ff530000feb50000feb50000ffc30000feae0000fedc0000
-fec70000fec80000fedc0000fe1e0000ff420000ff510000feb70000feb0
-02aa00de02aa005902aa00fa049a008c04600088062e001407aa0000062e
-0014047b004c063f005704cf0044063900630473004405c7006604000050
-04e300a8033b008804ff0000043c0032060d000a049d0042072000a406aa
-0084056500630473008b056400a40400000a0556006b0556006b04e00005
-04c5001905e5005f046e004403b600140347002804cf00440495005b0400
-005001c7ffa2063900600389004d03890050055600a205c000a10473004b
-047800870ab4006d04fe00100639001404e70014079900bf05b500880558
-000b0400001a072e00bf0590008806a10078057b007a086d00bf06f00088
-04d5006603ab001f065f0039058200480639006004730044066d0009050c
-001a066d0009050c001a0b010063091c004406aa005c04e600440987006d
-06d000500000fe370ab4006d04fe001005c7006604000050040700140000
-fea60000febc0000feaa0000fead0000fc2b0000fc4c05c000a104780087
-05400004042b00140556009e04730087055d00a40464008804d5004e03ab
-003204a900040380000005ef002904490028070900a4052f0088091800a0
-06f6008806060066042b005005c700660400005004e3003003aa00260767
-00310587002605550057042b004506e4000a0554000a06e4000a0554000a
-023900bf07630007055afffb055700a1046800860540001204ab001805c7
-00a4046b008805c700a4046b008805550057042b004506aa00980580008c
-02aa002e0556fffd0473004a0556fffd0473004a08000001071d00440556
-00a20473004b060500630473005507630007055afffb04d5004e03ab0032
-04d5004e045c004c05c000a10478008705c000a104780087063900630473
-0044063900600473004405c0004a0415002b0515000a040000210515000a
-040000210515000a0400002105550057042b0045071500a805c0008b0540
-004a0473004607bf004a0703004607a6006606860053054d006604130053
-07c3001207470018084600a4070700880639006d0478005005f900300553
-00260000ff430000fec90000ff770000ffb00000ff470000ff560000ff74
-0000fed70000feac000000000000ff520000ff56000000000000feac0000
-fd9a000000000000ff6a0000ff7c0000ff690000ff560000feac0000ff7f
-0000ff560000fdef0000ff430000ff690000ff7c000000000000fdae0000
-ff8c000001020000fefe0000fefe0000fedf0000fedf0000ff580000ff20
-0000fefe0556fffd0473004a055600960473008605560096047300860556
-00960473008605c700660400005005c7009e0473004605c7009e04730046
-05c7009e0473004605c7009e0473004605c7009e04730046055600a20473
-004b055600a20473004b055600a20473004b055600a20473004b055600a2
-0473004b04e300a8023900130639006d0473004205c700a40473008705c7
-00a40473008705c700a40473008705c700930473006805c700a404730087
-0239ffdf01c7ff9202390020023900060556009604000088055600960400
-008805560096040000880473009601c7007e0473009601c7ffb904730096
-01c7ffa50473009601c7ffa306aa009806aa008706aa009806aa008706aa
-009806aa008705c7009c0473008705c7009c0473008705c7009c04730087
-05c7009c0473008706390063047300440639006304730044063900630473
-004406390063047300440556009e047300870556009e0473008705c700a1
-02aa008505c700a102aa008505c700a102aa005e05c700a102aa00260556
-005c0400003f0556005c0400003f0556005c0400003f0556005c0400003f
-0556005c0400003f04e300300239002404e300300239002404e300300239
-ffff04e300300239000e05c700a10473008305c700a10473008305c700a1
-0473008305c700a10473008305c700a104730083055600090400001a0556
-00090400001a078d001905c70006078d001905c70006055600090400000f
-055600090400000f055600060400002104e300290400002804e300290400
-002804e3002904000028047300870239000305c70006040000210473004a
-01c7008904a0004804a0004804a0004804a0004804a0004804a0004804a0
-004804a000480556fffd0556fffd06820013068200130682001306820013
-068200560682005603910062039100620391006203910062039100620391
-0062061e0000061e0000076c0000076c0000076c0000076c00000473008b
-0473008b0473008b0473008b0473008b0473008b0473008b0473008b068f
-0000068f0000081f0000081f0000081f0000081f0000081ffff3081ffff3
-01c7008101c7008101c7ff9b01c7ff9b01c7ffeb01c7ffeb01c7ffa201c7
-ffa20301000003010000049100000491000004910000049100000491fff3
-0491fff3047300440473004404730044047300440473004404730044069d
-0000069d0000082d0000082d000007c9000007c900000460008804600088
-0460008804600088046000880460008804600088046000880682000007ae
-00000812000007ae0006063f0057063f0057063f0057063f0057063f0057
-063f0057063f0057063f0057065f0000065f000007ef000007ef0000078b
-0000078b0000078bffff078bffff04a0004804a000480391006203910062
-0473008b0473008b01c7ffe601c700680473004404730044046000880460
-0088063f0057063f005704a0004804a0004804a0004804a0004804a00048
-04a0004804a0004804a000480556fffd0556fffd06820013068200130682
-00130682001306820056068200560473008b0473008b0473008b0473008b
-0473008b0473008b0473008b0473008b068f0000068f0000081f0000081f
-0000081f0000081f0000081ffff3081ffff3063f0057063f0057063f0057
-063f0057063f0057063f0057063f0057063f0057065f0000065f000007ef
-000007ef0000078b0000078b0000078bffff078bffff04a0004804a00048
-04a0004804a0004804a0004804a0004804a000480556fffd0556fffd0556
-fffd0556fffd0556fffd02aa00e502aa00fd02aa00e502aa000602aa0006
-0473008b0473008b0473008b0473008b0473008b068200000682000006f3
-000006f3000005c700a402aa001302aa001302aa000601c7ffbb01c7ffab
-01c7ffca01c7ffca01c7ff9301c7ff930239001a0239fff5036500000365
-000002aa001302aa001302aa000604600088046000880460008804600088
-048d0083048d00830460008804600088055600060556000606e600000718
-0000061e000002aaffea02aaffea02aa0059063f0057063f0057063f0057
-063f0057063f005707650000069d000007270000065f000005fb006102aa
-00de02aa00e50473000d05c7006605c7006606aa008705c70024095000a1
-078d00190556001f04e30030080000290400003004c100660000ff530000
-ff530000ff530000ff5301c7001901c7ffa2042b00050556001105740046
-02cbffa3057a008702f0ffc8057f000a057f000a02aa008402aa008402aa
-00c902aa00c902aa00a002aa005902aaffaf02aa003a02aa0006023900b9
-02aa00a902aa00a902aa00a902aa00a9032e001e032e001e02aa003a0000
-ff730000ffa50000fed80000ff230000ff720000ff720000fee70000ffa5
-0000ff530000ff530000ff530556009e0473008703f8001905fb0019071d
-00440440001904000050046900870469001903eb008703ab003201c70088
-0361004104000088033600100580008c04780087047300440400001304de
-004404de004404de000d078d005003a800440473004404730044042b0084
-0455001f0455001f03aa00260460008804c6004405de004404c600440400
-001a05c700060400002803ab0032036b003f04db001f02eb00880400001a
-04550088042b008405b4007a04ab001803a00000054f0000035100320351
-ffd103980032034800320348003203f80032036e0032015600690284002d
-0366003202d000320415003203710032036f003204180032030f00320359
-0032039c003203760031036f003204fb000002fa003202fa003203040032
-04cc0032030500640305003202f9003202f90032028c0032028c00320304
-00320142006402b6006404950064030f00640305003202d5003203050032
-030500320306006401c20032030f00640342003204950064029200000320
-00000315006402920000030600320385003202bf00000142006401eb0064
-030f0064029200000315006402920000030900320385003202bf000005ed
-00460a660046061300460689ffba0541ffba01e9003c045a00110000ff0d
-0000ff350000fece0000feb70000fec90000ffcf0000ff4f0000ff9e0000
-feca02b3005f02b3005f03e9004a03e9004a039affba0327ffba039affba
-0327ffba05ad0069053d002d05fd009604dc005004e0003c05f6009b053f
-00280650002804ac00720000fe3b0000fe660000fe660473fffc02aa0053
-02d5ffce01a8ffba01a8ffba01a8ffba01a8ffba0658001509c500470400
-000008000000040000000800000002ab0000020000000155000004730000
-02390000019a000000ab00000000000005e5000305c7006606aa00980580
-008c0744008307180046071800480556fffd05c70066040000140473000a
-04e300300400004f0400002804a5001d000001020000ff420000febf0000
-ff3a0000ff53048d000a05c7005105c7006605c70051045500a102eb0088
-0000ff430000ff040000ffac02d200960000ff37021affba0250001e0000
-ff3a0000ff5b0000ff5f0000ff7e0000ff940000ff4a0000fe9c05b5003a
-05b5003a01f4ff9601f4ff9605b5003a05b5003a01f4ffba01f4ffba05b5
-003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba
-05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba0481003604350036043dffba
-043dffba0481003604350036043dffba043dffba02b3003202b3003202b3
-005f02b3005f03e9004a03e9004a0692003e0692003e043fffba043fffba
-045a002a039a00360435ffba0327ffba045a002a039a00360435ffba0327
-ffba045a002a039a00360435ffba0327ffba064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba067f0014077600140327
-ffba041effba067f0014077600140327ffba041effba067f001407760014
-0327ffba041effba02b4002302b400230327ffba0327ffba02b4002302b4
-00230327ffba0327ffba043500450435004501f4ffba01f4ffba04350045
-0435004501f4ffba01f4ffba043500450435004501f4ffba01f4ffba040d
-0047040d004701a8ffba01a8ffba03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0473ff93047300460239ffbf06aa
-ffd50473ffb70473ff9102aaffa402aaffa40400ffff0239ffb904000028
-04730089030b0064047400480649002401c7001901c700190473001e0460
-001e048c000a04730086047300460239001305b400420400008801c7fffc
-06aa00870473008b0473008702aafffb0400003f0318ffa20400001a0400
-000f040000280473004a04730048047300460473004b03ab004903ab0032
-0534005501c700880400001301c7ffa204730083045c004c0304006402d5
-003202c9003302fc0032028c003201d5003201d500000304003203110064
-01420019014200640142006401420019022a000001420064014200090233
-00640493006404930064030fffc9030f0064030e00640305003203000032
-02b800320142ffca01c20032030f001d031a00320306006402d400640292
-000002de003202de003202de003202f4003202ea00320000febc0000febc
-0000ff730000fea9023900b902fa003202f900320305003202a0000002f9
-00320639006d0556fffd0473000f05c7006602aa004104a0004804a00048
-04a0004804a0004804a0004804a0004804a0004804a0004801c7ff9b01c7
-ffab01c7ff9b01c7ffab01c7ff9b01c7ffbb01c7ff9b01c7ffbb04600088
-0460008804600088046000880460008804600088046000880460008801c7
-ffab01c7ffab01c7ffbb01c7ffbb04600088046000880460008804600088
-045a005304ce004a03a000130556001105c700290558000b055600a20473
-004b0400003301c7ffa205e600630473004805c7000002aa000f05560006
-0400002104000013040000500400001301c700830455fffd02eb00010556
-00090400000f055600090400000f04d5005303ab00490540001204ab0018
-0000fec60000fed40000fec60000fed40000fe5f0000fe5f0000ff720000
-ff730000fee7078b000a03eb004c040000130473000a01c700150473fff4
-0556001105c700a1047300190239ff8b05c700a404730087055600960400
-008804e30029040000280400003b049e00a403670088053000480000ff53
-0000ffbc0000fefe0000fefe0000fea40000fea401c70088000000000000
-002a0000002a0000002a0000002a000000d60000017e00000320000005a6
-0000074e000009380000097e000009fe00000aa400000b8400000bec0000
-0c6400000caa00000ce600000d5600000f1200000fee00001218000013f2
-000015520000170c000018e20000198e00001c2200001e5600001eb20000
-1f7000001ff200002062000020e8000021da000023da000025840000271c
-000028560000299e00002a6200002b1800002ca800002dae00002e920000
-2f7a000031b00000323a000035640000370e000038420000394800003b3c
-00003da800004052000041000000422400004398000045d6000048e20000
-4a8800004bc800004c3200004c9c00004d0000004d8800004dbc00004e38
-0000510a000052e80000549c000056500000580e0000596200005b520000
-5cf600005dea00005f020000619a00006296000064c60000668c0000684e
-00006a1200006ba800006cae000070560000717a00007318000075360000
-79a000007bc400007e1c00008004000081020000814e00008250000082f0
-0000833c00008370000083ac000083ee000084540000849a000084ce0000
-85040000853a0000858a000085cc0000861e00008656000086a8000086de
-0000871e000087600000879e000087e800008828000088560000888e0000
-88de00008914000089540000898e000089d200008a1c00008a5800008a88
-00008acc00008b0400008b9400008c1a00008e2800008fbc0000916c0000
-91b80000924c00009470000096c4000098b4000099a000009a2200009a8c
-00009baa00009d0600009f4e0000a0b00000a13e0000a1e80000a2ac0000
-a3f40000a59e0000a68c0000a7520000a7b60000a8240000a94e0000aa72
-0000ab020000ace40000af3e0000b2900000b3860000b42c0000b47c0000
-b5320000b6520000b7f00000b88a0000b94e0000ba0e0000ba760000bab2
-0000bb0a0000bb580000bd700000bfb60000bfee0000c0200000c14a0000
-c2760000c3240000c3c80000c46a0000c53c0000c5900000c5c60000c61e
-0000c7700000c7e20000c83c0000c9b40000cb200000cc000000cc320000
-ccce0000cdf20000d0680000d0a20000d0e60000d1220000d1840000d1c6
-0000d20c0000d2580000d28a0000d2de0000d31c0000d34c0000d38a0000
-d3d00000d4120000d4500000d4d20000d5400000d6260000d6620000d6e2
-0000d7160000d7b80000d8400000d8ac0000d90e0000d97a0000da660000
-db580000db8c0000dbc00000dbf00000dc340000dcac0000de260000e040
-0000e0720000e0ac0000e1a60000e3340000e36a0000e4ce0000e54a0000
-e62a0000e7200000e8b00000ea1a0000ec080000ed040000ed4a0000ed7e
-0000edc00000edfa0000ee4e0000ee960000eee00000ef100000ef400000
-f1280000f1660000f18e0000f1be0000f1f20000f2180000f23e0000f286
-0000f43c0000f5b60000f5dc0000f6020000f6460000f6760000f6a60000
-f6fc0000f7da0000f8ec0000f9300000f9660000f9c00000f9fe0000fa32
-0000fa620000fa9e0000fade0000fb1c0000fb580000fb9a0000fbd00000
-fc0c0000fc4c0000fc720000fc960000fce60000fe420000fe980000fecc
-0000ff1a0000ff660000ffa80000ffe0000100160001005e000101000001
-029c00010464000105e6000107d80001092a00010aae00010b9000010d2a
-00010d9400010dbc00010e5a000110dc0001111c0001115c0001119c0001
-11da000112380001129600011304000113240001140e000114ae000114e4
-000115320001157c000115c6000115e2000115fe0001161e0001163e0001
-165e0001167e000116a4000116ca000116f000011716000117460001176e
-00011796000117c2000117ee000118220001184c00011878000118ae0001
-18d8000119040001193a000119640001198e000119c2000119f200011a26
-00011a6a00011a9a00011ace00011b1000011b4400011b7600011bb80001
-1bec00011c1c00011c5e00011ca200011ce800011d4400011d6000011d7c
-00011d9800011db400011dd000011f3e000121ea0001245a000124760001
-2490000124ac000124c8000124e4000125000001255c0001259600012600
-000126ca0001276a00012840000128c000012948000129b800012a4e0001
-2aac00012af200012b5000012bb200012c6a00012d2800012d5400012db0
-00012df400012f60000130540001307e0001309a000130c6000130fe0001
-314a0001318a000131be000131ee0001321e0001324e00013292000132c2
-000132f2000133320001336200013392000133c200013402000134320001
-346200013492000134b8000136bc000136ec0001371c0001386c00013a22
-00013a5200013a8000013ab000013ade00013b0e00013b3c00013b600001
-3b8400013bb400013d2400013d5c00013d8c00013f1e00013f4c00013f7a
-00013fa800013fd00001412e000142c6000142fe0001433e0001437a0001
-43aa000143d8000143f4000144240001445400014544000146ac000146dc
-000147160001475600014786000147b6000147f80001481e000148440001
-4884000148c4000148f40001493400014a1e00014a9e00014b8200014bb2
-00014be200014c1200014c4200014c7e00014cb000014ce200014d120001
-4d4200014d8800014dba00014dea00014e2000014e9200014ec600015094
-000151960001532600015556000157a6000159380001599c00015a260001
-5a3600015ac400015cc200015dee00015f5a0001604a000161ce000163e8
-000166140001670600016716000167260001683e0001684e0001685e0001
-686e0001687e0001688e000169ac000169bc000169cc00016a4000016a50
-00016b2000016b3000016c4200016c5200016c6200016c7200016dd00001
-6fae00016ff0000170260001705c0001708c000170bc0001711000017138
-000172c20001740a0001755e000176c60001784a000178ae00017a400001
-7b5c00017b6c00017b7c00017d0200017d1200017e7800017fd200018106
-00018264000183d200018598000185d800018610000186460001866c0001
-869c000186c200018838000188680001899e000189ae000189be00018a00
-00018a1000018ba400018d5000018eda00018f0200018f320001908e0001
-909e000191d6000191e600019280000193e0000193f000019656000197e0
-000199480001997800019aee00019c2000019c3000019c4000019c500001
-9d2a00019d3a00019d4a00019d5a00019e5200019fcc00019fdc0001a104
-0001a2380001a38a0001a51e0001a63c0001a7c80001a8da0001a9100001
-ab460001abe60001abf60001ad8c0001af2e0001afb20001b1340001b144
-0001b3ac0001b52c0001b6ac0001b6dc0001b87c0001ba020001bbc60001
-bcf20001bd020001be320001be420001be520001bf120001bf220001c108
-0001c1180001c24e0001c35c0001c5080001c6be0001c8000001c9700001
-cab80001cb0a0001ccec0001ce680001cea60001d04c0001d0700001d1b0
-0001d1c00001d1d00001d2080001d2180001d3a40001d50c0001d6800001
-d6a40001d6d40001d8420001d8f40001d9b20001d9e00001db960001dc8e
-0001dd1c0001de420001def00001dfc40001e00e0001e0860001e1460001
-e16e0001e1b20001e2080001e2e40001e32e0001e3620001e38a0001e3b2
-0001e3e60001e42a0001e46e0001e4ac0001e5ea0001e6a20001e7c20001
-e8380001e9060001e9580001e9ea0001ea9a0001eb8e0001ebe20001ec78
-0001ed360001ee200001eed20001eff20001f0440001f0ee0001f2240001
-f2fc0001f3e20001f4e80001f5ce0001f6b00001f7a40001f8420001f948
-0001fa420001faba0001fb320001fba80001fbde0001fc3a0001fd020001
-fd8e0001fdc60001fe0c0001fe3c0001fea60001ff660001ff9a0001ffca
-0001fffe0002002e0002005e0002008e0002022e00020266000202a60002
-02de00020316000203b2000204ac000204dc00020580000205ae000205ee
-0002063e0002066e000206ba00020852000209b800020b1800020b5e0002
-0bb200020bea00020d5c00020d9200020e2400020e6200020e9000020ece
-00020ffe0002102600021162000211f20002129c0002131e000213da0002
-14f20002160000021634000216ba0002181600021898000218e2000219ec
-00021a3400021b3800021bb400021c0c00021c9000021d7a00021e900002
-1f8c0002203600022126000221f8000222e2000223ca0002247a000224fc
-0002275a00022784000227ae0002286600022890000229d200022ad80002
-2bc200022bec00022c1600022c4000022c6a00022c9400022e1400022e3e
-00022e6800022e9200022ebc00022ee600022f1000022f3a00022f640002
-2f9800022fc200022fec0002301600023190000231a0000232ba000232ca
-000232f40002331e00023348000233720002351c00023738000238660002
-3876000239f200023a0200023b4800023d1400023e1a00023f9a0002413a
-0002435e000244b80002469a000247de0002490c000249fa00024a240002
-4a4e00024a7800024aa200024acc00024af600024b2000024b4a00024b74
-00024b9e00024bc800024bf200024c1c00024c4600024c7000024eac0002
-50280002516c000253540002549c000254c6000254f00002552000025550
-000255a0000255f000025630000256a2000256f600025754000257aa0002
-57e00002582200025868000258b2000258e20002591a0002594a00025a82
-00025dc800025df200025e1c00025e4600025e7000025e9a00025ec40002
-5eee00025f1800025f4200025f6c00025f9600025fc000025fea00026014
-0002603e0002606800026092000260bc000260e6000261100002613a0002
-61640002618e000261b8000261e20002620c0002623600026260000262fe
-000263140002633e0002661e0002662e000267480002686a000269a80002
-6aea00026c9000026ca000026de200026f3200027122000272f60002740e
-0002741e000274a00002752e0002762e0002763e000276de000276ee0002
-78040002795600027a8600027a9600027b6400027b7400027cea00027cfa
-00027e0e00027e1e00027f52000280e8000281a4000281b4000282b20002
-840c00028498000284a8000285d20002875e0002881a0002882a000288c6
-000288d6000289a4000289b400028a8c00028a9c00028ba400028bb40002
-8d7a00028d8a00028ee200028ef20002915c0002916c0002936600029376
-000294e0000294f0000295e0000295f00002978800029798000298b60002
-98c600029a0600029a1600029a2600029a3600029bae00029bbe00029bce
-00029bde00029d3000029e7e00029f4c0002a0300002a1b00002a3320002
-a4320002a5460002a68a0002a69a0002a7880002a8620002a9fe0002aa0e
-0002ab2c0002ac320002ae300002ae400002ae500002ae600002afaa0002
-afba0002b0720002b0820002b1900002b1a00002b28c0002b29c0002b3ba
-0002b3ca0002b4680002b4780002b4880002b5760002b6ea0002b8160002
-b9100002b9200002b9300002b9400002bade0002bc980002bd660002bd76
-0002bfd60002c21c0002c4a20002c7060002c98a0002cbfc0002cdcc0002
-cf820002cfac0002cfd60002cfe60002cff60002d0200002d04a0002d074
-0002d0840002d0940002d0be0002d0e80002d0f80002d1080002d1320002
-d15c0002d1860002d1960002d1a60002d1b60002d1c60002d1d60002d1e6
-0002d2100002d2200002d2300002d25a0002d2840002d2ae0002d2d80002
-d3020002d32c0002d3560002d3800002d3aa0002d3d40002d3fe0002d428
-0002d4520002d47c0002d4a60002d4d00002d4fa0002d5240002d54e0002
-d5780002d5a20002d5cc0002d5f60002d6200002d64a0002d6740002d69e
-0002d6c80002d6f20002d71c0002d7460002d7700002d79a0002d7c40002
-d7ee0002d8180002d8420002d86c0002d8960002d8c00002d8ea0002d914
-0002d93e0002d9680002d9920002d9bc0002d9e60002da100002da3a0002
-da640002da8e0002dab80002dae20002db0c0002dbac0002dbf00002dc66
-0002dc900002dcba0002dce40002dd0e0002dd380002dd620002dd8c0002
-ddb60002dde00002de0a0002de340002de5e0002de880002deb20002dedc
-0002df060002df300002df5a0002df840002dfae0002dfd80002e0020002
-e02c0002e0560002e08a0002e0be0002e0f20002e2840002e4200002e5bc
-0002e7480002e78e0002e7d40002e8420002e89e0002e8f00002e9600002
-ea380002eb040002ebdc0002eca80002ed480002ee620002ef160002ef98
-0002eff20002f0320002f1500002f29a0002f4320002f48e0002f4ec0002
-f5480002f5a40002f6580002f70e0002f7ba0002f8660002f9120002f9ca
-0002fa820002fb3a0002fb4c0002fb5e0002fb700002fb820002fb940002
-fc020002fc700002fd280002fd3a0002fd4c0002fd5e0002fd6e0002fd80
-0002fd920002fda40002fdb60002fdc80002fdda0002fe880002ff340002
-ffe20003008e00030126000301600003018a000301b4000302080003025a
-000302d6000303200003039c000303f000030474000304c60003053c0003
-0594000305fa00030650000306aa0003072800030774000307d200030836
-00030884000308d20003092a000309720003099c000309ca000309f00003
-0a2400030a5400030a8400030ad600030b4400030b9a00030c0e00030c62
-00030cd600030d1c00030d8400030dca00030e2600030e5600030e900003
-0eb600030ee600030f0c00030f3200030f6400030f9400030fe60003104c
-000310a2000311080003115c000311ca0003120c0003126c000312ae0003
-12fa0003133400031370000313aa000313e60003141a0003144c0003147c
-000314ac000314d6000314fc00031526000315540003157e000315ca0003
-160e0003164400031680000316b4000316e200031720000317500003178a
-000317b4000317e2000318080003182e0003185a000318b6000318e60003
-1916000319460003197e000319b2000319e000031a1000031a4000031a70
-00031aa000031ad400031b2a00031b5e00031bbe00031bf200031c4a0003
-1c7e00031cda00031d7800031e4600031f660003202e000320be00032154
-000323400003253c000326b400032830000329da00032b8c00032c740003
-2daa00032ea200032fb4000330d20003320800033372000334e000033676
-000337f2000339020003391200033a3e00033b7a00033cbc00033e400003
-3f1a00033f9000034046000340ec0003425c000342940003430e000343d0
-0003448a000344f2000345f80003472e000347fa00034958000349d20003
-4a4c00034b1800034bd200034c8600034ce200034d3c00034d8400034df4
-00034e7000034eba00034ef400034f3a00034f7e00034fd0000350220003
-50a40003512600035168000351a8000351de000352140003524200035270
-000352a4000352d80003531a0003535c00035398000353d40003540e0003
-54480003547a000354ac000354de000355100003554a00035584000355c6
-000356080003564a0003568c000356da000357280003576a000357ac0003
-57ec0003582c00035866000358a0000358ec0003593800035976000359b6
-000359fc00035a4200035a7e00035ad400035b1000035b4c00035b8c0003
-5bcc00035c0800035c4400035c8400035cc400035d0800035d4c00035da0
-00035e2e00035e7000035eb200035f1a00035f8200035fb400035fe60003
-601e00036056000360ec00036182000361cc00036216000362520003628e
-000362e40003633a00036384000363ce000364260003647e000364be0003
-64fe000365360003656e000365b800036602000366400003667e000366c0
-0003670200036756000367aa000367f0000368360003687c000368c20003
-69180003696e000369c400036a1a00036a6600036ab200036afe00036b4a
-00036bbe00036c3200036ca600036d1a00036d5800036d9600036dd40003
-6e1200036e5000036e8e00036ed200036f1600036f6200036fae0003700e
-0003705a00037098000370e6000371f60003724600037296000372ce0003
-73060003735c000373b2000374260003748a000374cc0003750e00037564
-000375b2000375fe0003764a0003768a000376ca000377120003775a0003
-77c6000378200003785800037890000378d000037910000379e000037adc
-00037b9c00037c8a00037ce000037d3600037d8800037ddc00037e400003
-7ea400037efa00037f5000037fc60003803c0003807e000380c000038102
-0003814400038186000381c80003821e00038274000382c60003831a0003
-83a200038424000384c400038566000385a4000385e2000386200003865c
-0003869a000386d80003871600038752000388360003892200038a380003
-8b5400038c1e00038ce800038de200038edc00038fda000390d8000391f6
-000393140003943a000395600003966200039764000397f6000398880003
-98c6000399040003995e000399b8000399f000039a2800039b3800039b48
-00039b9000039bd800039c3000039c8800039cba00039cec00039d2e0003
-9d7000039daa00039de400039e2800039e6c00039ee400039f5e00039fee
-0003a0320003a0720003a0f40003a1760003a2ce0003a2de0003a32c0003
-a37a0003a3b60003a3f20003a4380003a47e0003a4cc0003a51a0003a56a
-0003a5ba0003a6160003a6720003a7e80003a9500003a9880003a9c20003
-aa0e0003aa5a0003aaac0003aafe0003ab500003aba60003abe20003ac1e
-0003ac740003acc80003ae000003aea00003aeee0003af2e0003af680003
-b0fe0003b3820003b4460003b5dc0003b73a0003b8080003b9ae0003bc02
-0003be3a0003be800003beb20003bf5c0003c0800003c0a40003c13e0003
-c24a0003c35a0003c46a0003c5780003c6fe0003c7300003c7d20003c7fa
-0003c85c0003c8be0003c9200003c9820003c9c00003c9fe0003ca380003
-ca720003ca9e0003caea0003cb240003cb5e0003ccba0003ce0e0003ce1e
-0003cedc0003d0120003d0700003d1880003d3160003d3bc0003d5020003
-d5400003d57e0003d5bc0003d6100003d6380003d6920003d6f60003d73e
-0003d7a00003d8000003d8720003d8ee0003d96a0003d9ec0003da780003
-db040003db8e0003dc0e0003dc480003dc840003dde80003deb20003dee2
-0003df120003e04a0003e19a0003e1aa0003e2980003e36c0003e4640003
-e55a0003e6dc0003e8360003e8460003e95e0003ea0a0003eb4c0003eca2
-0003ecfe0003ee5c0003eeea0003f0900003f2020003f3160003f34e0003
-f3b20003f5620003f6cc0003f72e0003f8960003f99c0003fa520003fafe
-0003fc260003fd140003fdf40003ff34000400600004017a000402ea0004
-046400040474000405540004064a000406fa000407f6000408a2000409ac
-00040a9800040bc200040ce600040dea00040f1800041056000411c20004
-12f80004148c000416340004172c000418400004197200041a6400041a9c
-00041af200041ba000041bb000041c1200041c6e00041cd400041d200004
-1d6000041d9800041dc400041df200041e2c00041f6200041f960004201a
-000420d00004210000042184000421b4000421ec00042384000425100004
-255a00042594000425ea000426360004265c00042682000426c400042706
-0004274800042778000427b0000427e60004281c0004285e0004288e0004
-28be000429b400042ab800042aec00042b2400042b6a00042b9e00042bce
-00042c0600042c3a00042c6e00042c9e00042cce00042d0400042d3a0004
-2d6a00042d9a00042dce00042e0200042e3200042e6200042e9c00042ed0
-00042f0200042f3400042f6800042f9c00042fcc00042ffc0004302a0004
-305800043166000432d2000434060004353a0004356a000435a40004363e
-000437a800043904000439c800043adc00043b0c00043b4000043c380004
-3de800043e4000043eb800043ff400044032000440a4000440d400044104
-0004413e000441c6000441f600044226000443b6000445000004460c0004
-471a000448460004499c00044af800044c5800044d9200044f0400045064
-000450740004522a00045352000453ec0004557400045584000456800004
-58060004595e00045a1000045ae000045bec00045c9600045cce00045cde
-00045d8e00045e3400045eb000046000000460f4000461ea000462f60004
-63ce000464a80004653c0004664e000467de000468fc000469f200046a9c
-00046b4600046c1000046cb800046d8e00046e0a00046e6600046fc80004
-70fc000472980004735a0004745a00047532000476700004771c000477e6
-000478d6000479fc00047ad800047bde00047d1600047e0600047ea40004
-7f960004810600048250000484bc0004858e000486420004871000048804
-000489420004895200048a8600048b9800048ba800048cb400048de40004
-8e3800048fac000490d4000491e80004939a000495ae00049842000499fc
-00049b2800049d0800049eca0004a05c0004a1280004a2c40004a33a0004
-a3e80004a4c40004a5500004a5f20004a6940004a7780004a8b00004ab0c
-0004ac540004ac640004ac740004acd60004ad340004ad960004ae340004
-aecc0004afd00004b0be0004b0ce0004b0de0004b1780004b2120004b24e
-0004b2ca0004b33e0004b3940004b3c80004b44e0004b4da0004b5520004
-b5b00004b64a0004b6dc0004b75c0004b7de0004b8720004b8a60004b908
-0004b9ba0004bb800004bbb80004bd940004bea80004beb80004beee0004
-bf320004bf760004bfba0004bff00004c0220004c0640004c1000004c156
-0004c1fc0004c2740004c2fa0004c36a0004c3cc0004c4520004c4b20004
-c51c0004c5900004c6000004c65e0004c7040004c79c0004c8080004c898
-0004c8f60004c9640004ca0c0004cab80004cb4e0004cbb80004cc3a0004
-cc9e0004cd4a0004ce020004ceae0004cf3c0004cf980004d0040004d05a
-0004d0dc0004d15a0004d1e00004d26c0004d2c60004d3320004d3a20004
-d4120004d4820004d5060004d5960004d5fc0004d6760004d6f20004d76a
-0004d8100004d8ac0004d93c0004d99a0004da380004dab40004db460004
-dbe80004dc920004dd2a0004dd860004dddc0004de440004deea0004df92
-0004e05c0004e1020004e1640004e1bc0004e21c0004e2aa0004e3300004
-e3be0004e41e0004e4820004e4ec0004e5540004e5bc0004e63a0004e6c2
-0004e7560004e7c20004e82a0004e88e0004e9360004e9f00004ea9e0004
-eb2c0004eb8a0004ebf60004ec660004ed0c0004edb60004ee780004ef1a
-0004ef7e0004f00e0004f0800004f1100004f18e0004f20a0004f2760004
-f3040004f3600004f3be0004f4440004f4c00004f5280004f58c0004f5e0
-0004f64e0004f6b60004f7340004f7aa0004f8240004f8a40004f9000004
-f9660004f9ca0004fa6a0004fb0c0004fbc20004fc720004fcce0004fd46
-0004fda40004fe2e0004fec60004ff560004ffbc0005001a000500a80005
-011a000501ae00050246000502b6000503260005039e000503fc0005045c
-000504d60005053000050590000505ea00050646000506ae0005073c0005
-0772000507aa0005083600050860000508a20005093600050a2400050ab4
-00050aea00050b3a00050bac00050c5800050cea00050d4200050d9c0005
-0df400050e4e00050ed200050f5800050ffc000510a4000510e200051152
-000511e60005127e00051314000513be000513f000051440000514940005
-14da0005157e000516080005168e000516ee000517320005178000051820
-000518b000051950000519f600051a9c00051b6000051b9200051bbc0005
-1c4200051cf200051d2400051d4c00051e1a00051e7800051f1200051f60
-00051fc60005206e000520dc00052142000521ce00052240000522b60005
-236a000523c40005243400052470000524c200052548000525a80005264c
-0005272c00052854000529e400052a4000052a9600052dbc00052e560005
-2eb200052efa00053068000531ba000532000005330e000533a6000534b4
-000535be0005366000053748000537da000538760005396800053a680005
-3ae400053b6a00053bb200053d2400053e8000053f6400053fb400053fe8
-000540d6000541fe00054398000544c8000545de000547120005482e0005
-489c0005493000054a7000054b2600054c9000054dc000054ef20005501e
-000550ca0005519000055262000553bc0005553c0005566c000557880005
-594200055a9400055b8000055c5c00055d1e00055e8800055fd800055fe8
-00055ff800056008000560c000056176000561b2000561e8000562200005
-6256000563e2000565f6000566e0000567f80005697000056ade00056bc8
-00056cfa00056e4200056fc800057166000572ba000574a80005766e0005
-78a400057af200057bda00057cb600057dfe00057f800005806800058182
-000581c40005820e0005842a000586420005878e0005890400058b620005
-8d6400058de800058e1800058e6400058f2c00058ffc0005919000059218
-00059280000592c0000592fe000594b0000596e000059816000599f80005
-9ad400059bee00059d9a00059fa60005a0a80005a1940005a3860005a58e
-0005a6fa0005a87e0005a9de0005ab4c0005abda0005ac6a0005ad840005
-ae900005b0520005b1be0005b3ae0005b5780005b60c0005b6a80005b73e
-0005b7c60005b8ac0005b9840005bb1e0005bcb00005bcd60005bcfc0005
-bd0c0005bd3c0005bd6c0005bee60005c0880005c1320005c2140005c2d4
-0005c37e0005c4180005c4fa0005c5b80005c6940005c84a0005c9840005
-ca100005ca400005ca700005caa40005cad80005cae80005caf80005cb28
-0005cb580005cb8c0005cbc00005cbf40005cc280005cc5c0005cc900005
-ce0a0005ce1a0005ce4a0005ce7a0005ceb20005cee60005cf1a0005cf4e
-0005cf820005cfb60005cfea0005d0220005d0580005d0880005d0c80005
-d1000005d1480005d18e0005d1c20005d1f60005d2300005d2680005d308
-0005d3180005d46a0005d6320005d7d80005d9820005dace0005dbe40005
-dcf20005de080005df020005dfea0005e10c0005e2080005e2e00005e3d0
-0005e48c0005e53e0005e6080005e67a0005e7200005e7b00005e8140005
-e9220005e9880005ea360005eb2c0005eb940005ebfc0005ecac0005ee86
-0005ef8a0005f00a0005f0480005f0f40005f1820005f26a0005f3020005
-f3680005f4660005f5280005f5e20005f6200005f6b00005f7b20005f846
-0005f88a0005f9a80005fad20005fcb40005fe760005ffac000600da0006
-01da000602020006022a0006026000060292000602be000602e60006030e
-0006033c0006039a000604080006044000060478000604a8000604ce0006
-0502000605380006055e00060584000605b2000605e00006060c00060682
-000606aa0006070c00060732000607580006077e000607a4000607d40006
-0804000608340006086e0006089e000608d400060904000609360006095c
-00060982000609b6000609ec00060a1c00060a4c00060a7200060a980006
-0abe00060aec00060b2000060ba600060bea00060c2400060c5800060c9c
-00060cd600060d1000060d3600060d6000060dac00060dee00060e140006
-0e4200060e6800060e8e00060ece00060f0000060f3000060f6000060f86
-00060fac00060fdc0006100c00061032000610580006107e000610a40006
-10ca000610f000061118000611a0000611ca0006123e00061266000612dc
-000613040006136600061398000613ca000613fa00061432000614640006
-1492000614cc000614f40006155400061596000615c6000615f200061622
-000616520006167a000616a2000616ca0006172c00061754000617b20006
-17f60006183a0006186a000618a0000618c6000618ee000619140006193c
-000619620006198a000619b2000619dc00061a0200061a2800061a4e0006
-1a8000061aa800061b2e00061b5800061bc200061bf200061c2200061c48
-00061c6e00061cc600061cf600061d3200061d5c00061d8c00061dbc0006
-1df000061e2400061e5400061e9400061ece00061f1600061f3c00061f62
-00061f8800061fae00061fd4000620140006205400062090000620c00006
-20f0000621200006215000062188000621c000062200000622400006227a
-000622b4000622f00006232e00062378000623c2000624080006244e0006
-2490000624d20006250200062532000625660006259a000625d40006260e
-0006265a000626a6000626fe00062756000627ae0006280c0006283c0006
-286c000628a2000628d80006290e0006294a0006297e000629b200062a06
-00062a5a00062aae00062b0200062b5600062baa00062c0200062c5a0006
-2c8800062cb600062ce800062d1a00062d6000062da600062dd800062e0a
-00062e5c00062eb400062ef800062f3c00062f8000062fc4000630180006
-306c0006309c000630cc000631020006313800063176000631bc00063210
-0006325a000632ac000632fe0006335e000633be000633ee000634200006
-345a00063494000634e60006353a00063584000635cc0006360e00063678
-000636c6000637120006374400063776000637aa000637de000638140006
-384a00063888000638be000638f00006392c00063982000639d800063a36
-00063a9400063aea00063b4000063b7400063ba400063be800063c1e0006
-3c4e00063c9200063cd000063d0800063d4000063d7600063db200063de2
-00063e1e00063e5e00063ea400063eee00063f3a00063f8600063fdc0006
-403200064080000640ce0006411c0006416c000641c8000642240006427c
-000642d4000643280006437c000643be0006440000064448000644900006
-44d8000645260006456a000645ae000646140006467a000646e000064746
-000647ac000648120006487c000648e60006492e00064976000649be0006
-4a0600064a5200064a9e00064af200064b3e00064b8200064bd000064c38
-00064ca000064d1000064d8000064de800064e5000064e9000064ece0006
-4f1800064f4200064f8800064fc00006500e0006503e0006506e000650aa
-000650de000651040006515800065196000651ea000652d0000653f80006
-543a00065460000654b6000654e60006552800065570000655be00065608
-000656580006567e000657660006584a0006599c000659ca000659f80006
-5a8c00065b1200065b4000065bca00065bfa00065c2a00065c7800065cc6
-00065daa00065e8600065fca00065ffa0006602a000660c0000661480006
-6178000661a8000661d80006626800066298000662c80006631a00066362
-000663b80006644e000664e60006655a000665ac000665d60006662c0006
-6660000666aa000666e20006673200066770000667bc000667e20006685e
-000668b0000669c200066bcc00066d8000066f0200067074000673160006
-75e6000677a6000678ec00067b4600067c8800067e9e00067ef000067f40
-00067f9600067fec0006804e000680d600068324000684b6000686c20006
-87de0006899200068b1400068bd400068cb600068d1e00068d8000068df6
-00068e5e00068f0a00068f7a0006900a0006911e000691e20006922e0006
-92c40006937000069414000694be000695080006954a000695c000069628
-000696b800069766000697d0000698340006989a00069954000699ea0006
-9a4800069a7200069a9c00069aac00069abc00069b7e00069c8200069e8c
-00069fe200069ff20006a0a20006a1860006a1e60006a1f60006a2520006
-a2b00006a3d00006a4be0006a4ce0006a4de0006a4ee0006a4fe0006a5e4
-0006a6e40006a8bc0006aa780006ab7e0006abf80006ac720006ad240006
-ad340006ae420006ae520006ae620006af240006b0580006b1440006b154
-0006b1640006b1740006b2da0006b4460006b5720006b5820006b5920006
-b5a20006b5b20006b6940006b6a40006b8060006b9100006ba0e0006bb46
-0006bc180006bc960006bd140006be340006beb00006befc0006bf880006
-c09c0006c0f00006c2320006c2f20006c3be0006c4b40006c5be0006c670
-0006c7d60006c83c0006c9000006cb020006cc900006ce0e0006cf3e0006
-d1f00006d3320006d4600006d5d80006d7500006d8d00006da5e0006dc10
-0006dc7e0006dde20006df1a0006e01e0006e1540006e2860006e3560006
-e4260006e5820006e65c0006e6fc0006e8000006e92a0006ea280006eba8
-0006ed120006ee500006efc80006f1140006f1f60006f25e0006f3000006
-f3a00006f49e0006f6060006f7400006f8d40006fa1e0006fb020006fb60
-0006fc660006fcfc0006fdbe0006fe640006fea400070050000701220007
-01e800070310000704b0000705bc00070614000707ac0007083a0007084c
-0007087c000708ac000708e40007091c000709520007098e000709c40007
-0a0000070b6e00070bb800070c5200070cea00070d6400070de800070e4e
-00070efa00070f46000710660007111c000711f20007122a000712680007
-12dc000713d6000714f4000715f6000716380007167a000716e8000716f8
-000717080007171800071728000717380007174800071758000717680007
-17780007178800071798000717980007191c0007192c000719ec00071ab2
-00071be800071dde00071fe0000721dc00072412000726120007267e0007
-27900007292200072a7a00072b2c00072b7000072c0e00072d3e00072d8e
-00072e2400072f6000072f70000731260007325a000732aa000733000007
-33c20007340600073448000734ce0007352c0007361e000736ac000736e2
-0007375c000737d4000738240007393000073a2600073ad000073afa0007
-3b2400073b4e00073b7800073bb800073bf800073c3000073c6800073cb2
-00073cfc00073d3c00073d7c00073dc600073e1000073e5000073e900007
-3eea00073f4400073f7e00073fb800073ffc0007404000074084000740c8
-0007411c00074170000741bc00074208000742460007428a000742da0007
-432a00074384000743e20007440c00074436000744d00007456a000745ae
-000745f2000747080007471800074760000747a8000747fa0007484c0007
-48b60007490a00074956000749b400074a3e00074aa200074ae600074b30
-00074b9800074be200074c2200074c6a00074ca600074ce200074d1e0007
-4d5800074d9a00074ddc00074e1c00074e5c00074ea600074ef000074f46
-00074f9e00074fec0007503a0007507c000750ca0007510c000751560007
-5198000751dc0007523800075294000752e00007532c00075376000753c0
-000753fe0007543c000754ba0007553800075572000755ac000756460007
-56e0000757b400075888000758e400075940000759b400075a2800075b86
-00075b9600075c8000075c9000075cc600075cfc00075d3600075d700007
-5dac00075de800075e2e00075e7400075fda00076190000762dc0007649a
-00076610000767b8000768e8000769ee00076c0c00076d5000076ee60007
-706e000770ec0007723000077438000774cc00077560000776b4000777de
-0007795800077a9800077c0400077cf200077ebc00078050000780d20007
-8204000782ee0007845600078538000786ee000787e00007894200078a7e
-00078b7200078d3600078ebe00079062000791c600079362000795200007
-96a600079742000798b6000799a800079a9000079c1000079d6200079e82
-0007a01a0007a1f00007a37e0007a4280007a4de0007a6900007a7340007
-a7c20007a80e0007a85a0007a8d20007a9b00007aa2a0007aacc0007ab20
-0007ac840007adb00007aec20007afc40007b08c0007b2000007b3400007
-b5660007b6100007b73a0007b83e0007b9de0007baca0007bbc40007bcc2
-0007bda80007bec20007c07c0007c22a0007c3980007c4100007c4840007
-c5a20007c6260007c7280007c8b40007ca2c0007cb620007cc6c0007cde2
-0007cf5a0007d14c0007d33a0007d5000007d5740007d6240007d6da0007
-d78a0007d8480007d9420007da460007db400007dc4c0007dcd40007dd62
-0007ddea0007de7e0007df5a0007e0500007e1340007e22a0007e2be0007
-e37a0007e40e0007e4cc0007e5bc0007e6c40007e7c20007e8d60007e9f8
-0007eb0c0007ec4c0007ed860007eea80007efbc0007f1000007f2540007
-f4680007f61a0007f6ce0007f7ea0007f8c00007f9de0007fabc0007fc50
-0007fd0a0007fda60007fe980007ff800008006c000800ea000801e40008
-03220008044e00080482000804c6000804d600080576000806180008070e
-000807fa000808d4000809ac00080b0a00080c6a00080d0800080d9e0008
-0ddc00080e1c00080e5a00080e9a00080ef400080f4c00080fa60008100a
-0008109600081292000812e20008140e0008149400081514000815ee0008
-16c2000817c6000819b200081aca00081b3a00081bca00081c8c00081d5e
-00081dca00081e4800081f9c00081fe2000820280008210c000821480008
-21a6000821e4000822160008225a0008229c000822cc000100000d3500f2
-003c009d000700020010002f005600000468041d0005000200>
-<0000003a02be0000000300000000006a00000000000300000001000a006a
-0000000300000002000e00740000000300000003005e0082000000030000
-0004000a00e00000000300000005001800ea0000000300000006000e0102
-000000030000000700ba01100000000300000008003001ca000000030000
-0009008a01fa000000030000000d02aa028400010000000000000035052e
-000100000000000100050563000100000000000200070568000100000000
-0003002f056f00010000000000040005059e0001000000000005000c05a3
-0001000000000006000705af0001000000000007005d05b6000100000000
-00080018061300010000000000090045062b000100000000000d01550670
-0003000104030002000c07c50003000104050002001007d1000300010406
-0002000c07e10003000104070002001007ed0003000104080002001007fd
-0003000104090000006a080d0003000104090001000a0877000300010409
-0002000e08810003000104090003005e088f0003000104090004000a08ed
-0003000104090005001808f70003000104090006000e090f000300010409
-000700ba091d0003000104090008003009d70003000104090009008a0a07
-000300010409000d02aa0a9100030001040a0002000c0d3b00030001040b
-000200100d4700030001040c0002000c0d5700030001040e0002000c0d63
-0003000104100002000e0d6f000300010413000200120d7d000300010414
-0002000c0d8f000300010415000200100d9b0003000104160002000c0dab
-0003000104190002000e0db700030001041b000200100dc500030001041d
-0002000c0dd500030001041f0002000c0de10003000104240002000e0ded
-00030001042a0002000e0dfb00030001042d0002000e0e0900030001080a
-0002000c0e170003000108160002000c0e23000300010c0a0002000c0e2f
-000300010c0c0002000c0e3b00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0052006500670075006c00610072004d006f006e006f
-0074007900700065003a0041007200690061006c00200052006500670075
-006c00610072003a00560065007200730069006f006e00200035002e0030
-003100200028004d006900630072006f0073006f00660074002900410072
-00690061006c00560065007200730069006f006e00200035002e00300031
-0041007200690061006c004d00540041007200690061006c002000690073
-00200061002000740072006100640065006d00610072006b0020006f0066
-00200054006800650020004d006f006e006f007400790070006500200043
-006f00720070006f0072006100740069006f006e00200069006e00200074
-0068006500200055006e0069007400650064002000530074006100740065
-007300200061006e0064002f006f00720020006f00740068006500720020
-0063006f0075006e00740072006900650073002e0054006800650020004d
-006f006e006f007400790070006500200043006f00720070006f00720061
-00740069006f006e004d006f006e006f0074007900700065002000540079
-00700065002000440072006100770069006e00670020004f006600660069
-006300650020002d00200052006f00620069006e0020004e006900630068
-006f006c00610073002c0020005000610074007200690063006900610020
-005300610075006e0064006500720073002000310039003800320059006f
-00750020006d006100790020007500730065002000740068006900730020
-0066006f006e007400200074006f00200064006900730070006c00610079
-00200061006e00640020007000720069006e007400200063006f006e0074
-0065006e00740020006100730020007000650072006d0069007400740065
-006400200062007900200074006800650020006c006900630065006e0073
-00650020007400650072006d007300200066006f00720020007400680065
-002000700072006f006400750063007400200069006e0020007700680069
-006300680020007400680069007300200066006f006e0074002000690073
-00200069006e0063006c0075006400650064002e00200059006f00750020
-006d006100790020006f006e006c0079002000280069002900200065006d
-0062006500640020007400680069007300200066006f006e007400200069
-006e00200063006f006e00740065006e0074002000610073002000700065
-0072006d0069007400740065006400200062007900200074006800650020
-0065006d00620065006400640069006e0067002000720065007300740072
-0069006300740069006f006e007300200069006e0063006c007500640065
-006400200069006e0020007400680069007300200066006f006e0074003b
-00200061006e006400200028006900690029002000740065006d0070006f
-0072006100720069006c007900200064006f0077006e006c006f00610064
-0020007400680069007300200066006f006e007400200074006f00200061
-0020007000720069006e0074006500720020006f00720020006f00740068
-006500720020006f00750074007000750074002000640065007600690063
-006500200074006f002000680065006c00700020007000720069006e0074
-00200063006f006e00740065006e0074002ea9203230303620546865204d
-6f6e6f7479706520436f72706f726174696f6e2e20416c6c205269676874
-732052657365727665642e417269616c526567756c61724d6f6e6f747970
-653a417269616c20526567756c61723a56657273696f6e20352e30312028
-4d6963726f736f667429417269616c56657273696f6e20352e3031417269
-616c4d54417269616c20697320612074726164656d61726b206f66205468
-65204d6f6e6f7479706520436f72706f726174696f6e20696e2074686520
-556e697465642053746174657320616e642f6f72206f7468657220636f75
-6e74726965732e546865204d6f6e6f7479706520436f72706f726174696f
-6e4d6f6e6f7479706520547970652044726177696e67204f666669636520
-2d20526f62696e204e6963686f6c61732c20506174726963696120536175
-6e646572732031393832596f75206d617920757365207468697320666f6e
-7420746f20646973706c617920616e64207072696e7420636f6e74656e74
-206173207065726d697474656420627920746865206c6963656e73652074
-65726d7320666f72207468652070726f6475637420696e20776869636820
-7468697320666f6e7420697320696e636c756465642e20596f75206d6179
-206f6e6c792028692920656d626564207468697320666f6e7420696e2063
-6f6e74656e74206173207065726d69747465642062792074686520656d62
-656464696e67207265737472696374696f6e7320696e636c756465642069
-6e207468697320666f6e743b20616e6420286969292074656d706f726172
-696c7920646f776e6c6f6164207468697320666f6e7420746f2061207072
-696e746572206f72206f74686572206f7574707574206465766963652074
-6f2068656c70207072696e7420636f6e74656e742e004e006f0072006d00
-61006c006f00620079010d0065006a006e00e9006e006f0072006d006100
-6c005300740061006e0064006100720064039a03b103bd03bf03bd03b903
-ba03ac00a90020003200300030003600200054006800650020004d006f00
-6e006f007400790070006500200043006f00720070006f00720061007400
-69006f006e002e00200041006c006c002000520069006700680074007300
-2000520065007300650072007600650064002e0041007200690061006c00
-52006500670075006c00610072004d006f006e006f007400790070006500
-3a0041007200690061006c00200052006500670075006c00610072003a00
-560065007200730069006f006e00200035002e0030003100200028004d00
-6900630072006f0073006f0066007400290041007200690061006c005600
-65007200730069006f006e00200035002e00300031004100720069006100
-6c004d00540041007200690061006c002000690073002000610020007400
-72006100640065006d00610072006b0020006f0066002000540068006500
-20004d006f006e006f007400790070006500200043006f00720070006f00
-72006100740069006f006e00200069006e00200074006800650020005500
-6e0069007400650064002000530074006100740065007300200061006e00
-64002f006f00720020006f007400680065007200200063006f0075006e00
-740072006900650073002e0054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-4d006f006e006f0074007900700065002000540079007000650020004400
-72006100770069006e00670020004f006600660069006300650020002d00
-200052006f00620069006e0020004e006900630068006f006c0061007300
-2c0020005000610074007200690063006900610020005300610075006e00
-64006500720073002000310039003800320059006f00750020006d006100
-7900200075007300650020007400680069007300200066006f006e007400
-200074006f00200064006900730070006c0061007900200061006e006400
-20007000720069006e007400200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-200074006800650020006c006900630065006e0073006500200074006500
-72006d007300200066006f00720020007400680065002000700072006f00
-6400750063007400200069006e0020007700680069006300680020007400
-680069007300200066006f006e007400200069007300200069006e006300
-6c0075006400650064002e00200059006f00750020006d00610079002000
-6f006e006c0079002000280069002900200065006d006200650064002000
-7400680069007300200066006f006e007400200069006e00200063006f00
-6e00740065006e00740020006100730020007000650072006d0069007400
-7400650064002000620079002000740068006500200065006d0062006500
-6400640069006e0067002000720065007300740072006900630074006900
-6f006e007300200069006e0063006c007500640065006400200069006e00
-20007400680069007300200066006f006e0074003b00200061006e006400
-200028006900690029002000740065006d0070006f007200610072006900
-6c007900200064006f0077006e006c006f00610064002000740068006900
-7300200066006f006e007400200074006f00200061002000700072006900
-6e0074006500720020006f00720020006f00740068006500720020006f00
-750074007000750074002000640065007600690063006500200074006f00
-2000680065006c00700020007000720069006e007400200063006f006e00
-740065006e0074002e004e006f0072006d0061006c004e006f0072006d00
-610061006c0069004e006f0072006d0061006c004e006f0072006d00e100
-6c004e006f0072006d0061006c0065005300740061006e00640061006100
-720064004e006f0072006d0061006c004e006f0072006d0061006c006e00
-79004e006f0072006d0061006c041e0431044b0447043d044b0439004e00
-6f0072006d00e1006c006e0065004e006f0072006d0061006c004e006f00
-72006d0061006c004e0061007600610064006e006f0074006801b001a103
-00006e00670041007200720075006e00740061004e006f0072006d006100
-6c004e006f0072006d0061006c004e006f0072006d0061006c004e006f00
-72006d0061006c000000b900540328b326181fd0bc032900e00329000203
-29b22b1d1fb90327031db23b1f40b80323b31215320f412d03200001002f
-0320000100200320006f032000af032000bf03200004005f031e00010010
-031e007f031e0080031e00af031e00bf031e00d0031e00060000031e0010
-031e0020031e006f031e009f031e00e0031e0006031d031cb2201f104127
-0319007f03190002000f031700ef031700ff03170003001f0317002f0317
-004f0317005f0317008f0317009f03170006000f0317005f0317006f0317
-007f031700bf031700f00317000600400317b2923340b80317b28b3340b8
-0317b36a6c3240b80317b2613340b80317b35c5d3240b80317b357593240
-b80317b34d513240b80317b344493240b80317b23a3340b80317b3313432
-40b80317b32e423240b80317b3272c3240b80317b312253280b80317b30a
-0d32c04116031600d00316000200700316000102c4000f0101001f00a003
-1500b0031500020306000f0101001f00400312b32426329fbf0304000103
-0203010064001fffc00301b20d1132410a02ff02ef0012001f02ee02ed00
-64001fffc002edb30e11329f414a02e200af02e200bf02e2000302e202e2
-02e102e1007f02e00001001002e0003f02e0009f02e000bf02e000cf02e0
-00ef02e0000602e002e002df02df02de02de000f02dd002f02dd003f02dd
-005f02dd009f02dd00bf02dd00ef02dd000702dd02dd001002dc00010000
-02dc0001001002dc003f02dc000202dc02dc001002db000102db02db000f
-02da000102da02daffc002d3b2373932b9ffc002d3b22b2f32b9ffc002d3
-b21f2532b9ffc002d3b2171b32b9ffc002d3b2121632b802d2b2f9291fb9
-0326031cb23b1f40bb0322003e00330322b225311fb80318b23c691fb802
-e3b3202b1fa0413002d400b002d40002000002d4001002d4002002d40050
-02d4006002d4007002d40006006002d6007002d6008002d6009002d600a0
-02d600b002d60006000002d6001002d6002002ca002002cc002002d60030
-02d6004002d6005002d6000802d0b2202b1fb802cfb226421f411602ce02
-c70017001f02cd02c80017001f02cc02c60017001f02cb02c50017001f02
-c902c5001e001f02ca02c6b21e1f00410b02c6000002c7001002c6001002
-c7002f02c5000502c1b324121fff411102bf0001001f02bf002f02bf003f
-02bf004f02bf005f02bf008f02bf000602bf0222b2641f12410b02bb00ca
-0800001f02b200e90800001f02a600a20800406a1f402643493240204349
-3240263a3d3240203a3d329f209f26024026969932402096993240268e92
-3240208e92324026848c324020848c3240267a813240207a813240266c76
-3240206c76324026646a324020646a3240265a5f3240205a5f3240264f54
-3240204f5432b8029eb724271f374f6b0120410f02770030027700400277
-00500277000402770277027700f90400001f029bb22a2a1fb8029a402b29
-2a1f80ba0180bc0180520180a201806501807e01808101803c01805e0180
-2b01801c01801e0180400180bb0138000100800140b40180400180bb0138
-00010080013940180180ca0180ad01807301802601802501802401802001
-3740b80221b2493340b80221b2453340b80221b341423240b80221b33d3e
-320f410f0221003f0221007f0221000300bf022100cf022100ff02210003
-00400221b320223240b80221b3191e3240b80222b32a3f3240b80221b32e
-3a326f414802c3007f02c3008f02c300df02c30004002f02c3006002c300
-cf02c30003000f02c3003f02c3005f02c300c002c300ef02c300ff02c300
-0600df02220001008f02220001000f0222002f0222003f0222005f022200
-7f022200ef0222000600bf022100ef02210002006f0221007f022100af02
-210003002f0221003f0221004f0221000302c302c3022202220221022140
-1d101c102b1048038f1c010f1e014f1eff1e023700161600000012110811
-b8010db6f70df8f70d00094109028e028f001d001f0290028f001d001f02
-8fb2f91d1fb80198b226bb1f41150197001e0401001f013900260125001f
-013800730401001f0135001c0801001f0134001c02ab001f0132b21c561f
-b8010fb2262c1fba010e001e0401b61ff91ce41fe91cb80201b61fe81cbb
-1fd720b80401b21fd51cb802abb61fd41c891fc92fb80801b21fbc26b801
-01b21fba20b80201b61fb91c381fadcab80401b21f8126b8019ab21f7e26
-b8019ab61f7d1c471f6b1cb80401b21f6526b8019ab21f5e73b80401400f
-1f52265a1f481c891f441c621f4073b80801b61f3f1c5e1f3c26b8019ab2
-1f351cb80401b61f301cbb1f2b1cb80401b61f2a1c561f291cb80101b21f
-231eb80401b21f5537b80168402c07960758074f07360732072c0721071f
-071d071b071408120810080e080c080a080808060804080208000814b8ff
-e0402b000001001406100000010006040000010004100000010010020000
-01000200000001000002010802004a00b013034b024b5342014bb0c06300
-4b6220b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807
-ff52b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ff
-b101018e851bb0124358b900010111858d1bb900010128858d5959001816
-763f183f123e113946443e113946443e113946443e113946443e11394660
-443e11394660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b2b
-182b1db0964b5358b0aa1d59b0324b5358b0ff1d594bb09353205c58b901
-f201f04544b901f101f045445958b9033e01f2455258b901f2033e445959
-4bb8015653205c58b9002001f14544b9002601f145445958b9081e002045
-5258b90020081e4459594bb8019a53205c58b9002501f24544b9002401f2
-45445958b909090025455258b9002509094459594bb8040153205c58b173
-244544b1242445445958b917200073455258b9007317204459594bb80401
-53205c58b1ca254544b1252545445958b9168000ca455258b900ca168044
-59594bb03e53205c58b11c1c4544b11e1c45445958b9011a001c455258b9
-001c011a4459594bb05653205c58b11c1c4544b12f1c45445958b9018900
-1c455258b9001c01894459594bb8030153205c58b11c1c4544b11c1c4544
-5958b90de0001c455258b9001c0de04459592b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65
-422b2b01b33b59635c456523456023456560234560b08b766818b0806220
-20b163594565234520b003266062636820b003266165b059236544b06323
-4420b13b5c4565234520b003266062636820b003266165b05c236544b03b
-2344b1005c455458b15c406544b23b403b4523614459b347503437456523
-456023456560234560b089766818b080622020b134504565234520b00326
-6062636820b003266165b050236544b034234420b147374565234520b003
-266062636820b003266165b037236544b0472344b10037455458b1374065
-44b24740474523614459004b5342014b5058b108004259435c58b1080042
-59b3020b0a124358601b2159421610703eb0124358b93b21187e1bba0400
-01a8000b2b59b00c2342b00d2342b0124358b92d412d411bba0400040000
-0b2b59b00e2342b00f2342b0124358b9187e3b211bba01a80400000b2b59
-b0102342b0112342002b7475737500184569444569444569447373737374
-757374752b2b2b2b74752b2b2b2b2b737373737373737373737373737373
-737373737373737373732b2b2b45b0406144737400004bb02a534bb03f51
-5a58b1070745b040604459004bb03a534bb03f515a58b10b0b45b8ffc060
-4459004bb02e534bb03a515a58b1030345b040604459004bb02e534bb03c
-515a58b1090945b8ffc06044592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b752b2b2b2b2b2b2b435c58b9008002bbb301401e017400735903b01e4b
-5402b0124b545ab012435c5a58ba009f02220001007359002b7473012b01
-732b2b2b2b2b2b2b2b737373732b2b2b2b2b002b2b2b2b2b2b0045694473
-456944734569447374754569447345694445694445694473744569444569
-44732b2b2b2b2b732b002b732b74752b2b2b2b2b2b2b2b2b2b2b2b2b2b73
-7475732b7374757374752b2b2b742b2b000000>
-[15785 15901 16277 16325 16277 16273 15933 16169 16277 15721 16361 15561 15973
-16029 16305 15693 16345 16249 15893 15629 16365 15481 16245 16249 16357 16337
-15821 15749 16345 15937 16257 16033 19077 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-3 4064 66 <0001ffe1fe69048afeeb0003001a400c013f00021a050019044341182b4e
-10e410e6002f4ded3130033521151f04a9fe69828200>ArialMT AddT42Char 
-3 4240 68 <0002004affe8041c043e00280037022d402c090d092a190d1a2a290d2a2a
-390d3615371b3a2a492a5d0d5d2a6a0d692a60308a0d86299a169b1aa90d
-1528b8ffe8b40b0b065527b8ffe840190b0b0655a619aa28b619bb28c419
-cf28d215dd28084416011eb8fff440110c0c065512120c0c0655050c0c0c
-065535b8ffe040550c0c06551f171f182b2c2a343904392c4904482c5608
-592b6608692b760c870cc90cf90df92b1137340e0104102f243417322114
-185f296f2902291c2f0e3f0e8f0e9f0eff0e059f0eaf0eef0e030e0c0f0f
-02550eb8ffeab4101002550eb8fff44015101006550e0c0d0d06550e060f
-0f06550e0e1c0317b802aab61895141c1c0700b8fff4401a0c0c06550045
-270a321c030b2961106100060d0d025500252124b8ffecb41010025524b8
-ffec400b0d0d025524040c0c025524b8ffe4b40b0b025524b8fff4b40b0b
-065524b8ffdc400b1010065524060f0f065524b8fffcb40c0c065524b802
-5b400e27400026102620263026af260539b8ffc0b40e0e025526b8ffd6b6
-0e0e0255263139b8ffc0400d1e23343039c03902a039013917b8fff44041
-10100655172518222f24bf06cf06021f063f0602060e0f0f0255060c0d0d
-025506180c0c0255060c0b0b0255060c0b0b0655060e0d0d065506100c0c
-065506313810f62b2b2b2b2b2b2b5d71edf4ed2b105d712bf62b2b5dedf4
-2b2b2b2b2b2b2b2b3cfd2be5e5003fed3fe42b3fedfde41112392f2b2b2b
-2b2b5d71ed711112391112393901111217393130005d2b2b2b2b01715d2b
-2b0071250606232226353436363736373637363534272623220607273e02
-333216161716151514161723260306070e02151416333236373635033c64
-b96aafbc477348356bda67013345887f791db0186ed08988aa5010091722
-bc1c1762c46f5c326d6968a2261d835546ab854e814e140e0d1a24250a6e
-2d3d597118718b4b40614a2e78f0fb853d3801dd281c10284d2f48605b4f
-3d77>ArialMT AddT42Char 
-3 5440 70 <00010050ffe803ed043e001a015ab1020243545840340e7f0f010f0b0140
-0050007000030004121c0b07181c040b010e1507080e0e0255070c0d0d02
-55070c0c0c025507100b0b0255072f2b2b2b2bcdd4c6003fed3fed10c45d
-3210c45d3231301b4047090c011f1c4313431753135317601360179b029b
-039a0da410a41a0c080d190a6a0269036a05750c700d800da60cb509b60a
-b50c0c160c860ce302030e225f0f6f0f7f0f030f01b802aa407930004000
-5000600070009000a000e000f00009000f0f0b000004121c0b07181c040b
-1c0f010f240e080d0d06550e221b000100240b2b1f010100010101400b0b
-065501401010065501480c0c0655011a0d0d065501491c1524cf07011f07
-3f0702070e0b0b0655070a1010065507120c0c065507311b34c4182b10f6
-2b2b2b5d71ed10f62b2b2b2b5d724b53234b515a58b90001ffc03859ed72
-f42bed72003fed3fed12392f11392f105de4105de43130005d71015d7159
-011706062322001134123633321617072626232206151416333236033cb1
-1defaedafef772e989addc1faf197f5a88aaa4846a8e018517b7cf011d01
-0aac010281afa11b6b6cc3d3d6c28200>ArialMT AddT42Char 
-3 5876 71 <00020046ffe803df05ba0011001d015540a40a02040d250d340d440d0535
-14351c5702540a5214531c6702640565096314601cc01fd405d513dd19e5
-13e514ef17eb19e51de01fff1f161f1f2b1a3c163c1a4b1a701f901f072e
-02240d2e163a02350d4b02450d4614491c570a560d670de506e716fa01f4
-0e100115030e0b100f001b1c0b0711000a151c030b1833010025110f2510
-10d011011011401160118011041f400b0b02551f400d0d02551112101002
-5511b8fff440110f0f025511060e0e025511180d0d025511b8fff2400b0b
-0b0655110e1010065511b8ffeeb40c0c065511b8fff840420d0d06551174
-1224bf07cf07df07ff07041f073f074f0703071e0b0b025507180c0c0255
-071e0d0d0255070c0b0b0655070c0d0d0655071a0c0c065507191e345018
-2b4e10f42b2b2b2b2b2b5d714dedfd2b2b2b2b2b2b2b2b2b2b5d713c10ed
-10fd3ce4003fed3f3c3fed3f3c11391112393130005d01715d0071213506
-232226263534123633321617113311011416333236353426232206033865
-c47fd5756ad48360962fb3fd20ac7576a5a87b78a1869e8cfba39f01038a
-5141020efa460212cccac1c6daccc400>ArialMT AddT42Char 
-3 6312 72 <0002004bffe8041e043e0015001d015340171f001c150255035d055d0955
-0b65036b056f09650b0815b8ffe4b40d0d065511b8ffe440520d0d06551d
-1c0d0d06552712d905fa14f61a0431123a19311c41124d1a411c51125c19
-521c61126d1a611c78067815f602f618100016010f0d1717501660167016
-03161c0f9010a010021010041b1c0a0700ba02aa0001ffc0b41010025501
-b8ffc04010101006551001010195131c040b17400db8ffdcb40d0d02550d
-b8ffeeb40d0d06550db8ffeab40c0c06550db8ffc04009272a34b00d010d
-1a1fb8ffc0b32526341fb8ffc040411e2334301f011f163310240740242a
-341f073f074f070307200b0b025507180c0c0255071c0d0d0255070e0b0b
-0655071c0c0c065507160d0d065507191e3437182b4e10f42b2b2b2b2b2b
-5d2b4dfde44e10712b2bf6712b2b2b2b4ded003fedfd5d2b2be43fed1239
-2f5d3cfd713c011112393912393130015d005d2b2b2b0171720117060623
-22001110003332001114072116163332360121262726232206035eba2cee
-b9e9feef0114dcd5010e01fce80ab285638cfdda02510c3856897ca90156
-17a3b4011f0103010c0128fedefef91020afba680195864368a6>ArialMT AddT42Char 
-3 6758 73 <000100130000028005d30017010d401e1409010f192f193019401970199b
-0c9c0da90d081a0d280db019c0190419b8ffc040281a1f341d080d030c0f
-1c0a0115022b1413040306000a9f140114ff134004172504000302920101
-00b8ffc0b331383400b8ffc0402b1c1f3490000119400f0f025519400d0e
-025500141010025500280f0f025500220e0e0255002c0d0d025500b8fff2
-400b0c0c025500140b0b065500b8ffeab41010065500b8ffe6b40f0f0655
-00b8fffab70c0c065500a31819bc01ba002100f6010a00182b2bf62b2b2b
-2b2b2b2b2b2b2b2b5d2b2b3c10f43c103ced10eded5d003f3f3c3c3cfd3c
-3fed391139313043794014101106090706080602061009121b0011060f1b
-012b012b2a8181012b715d00723311233533353437363633321707262322
-06151533152311b29f9f131a83764c5c1b38325244cfcf039a8c716b3446
-57129d0a4660628cfc66>ArialMT AddT42Char 
-3 7098 74 <00020042fe5103ea043e001e002a016f40600b0b05142c0b25144c0b4514
-06091d191d2c0b26142c23390b36144a0b46145607580b680bfa0af5150e
-2e232c273e233e274c27902ca02c07362136293f2c460b46214529542154
-29690763216329602c802cda27e821ee23ef271117160615b802b1b4281c
-130701b802aa401020003000600070008000c000d0000700b8027d403205
-1c1c0f0a45221c0c0a16153325330a251818d01701101740176017801704
-2c400b0c02552c400d0d025517121010025517b8fff440110f0f02551706
-0e0e025517160d0d025517b8ffea400b0b0b065517121010065517b8ffee
-b40c0c065517b8fffc404a0d0d065517740f012500221f24bf0fcf0fdf0f
-ff0f041f0f3f0f4f0f030f200b0b02550f1a0c0c02550f220d0d02550f1c
-0b0b06550f0c0d0d06550f1a0c0c06550f192b2c74213450182b2b4ef42b
-2b2b2b2b2b5d714dedf4ed10fd2b2b2b2b2b2b2b2b2b2b5d713c10fde4f6
-3c003fede43fedfd5de43fede43f3c3130015d71005d7117171617163332
-363736270623220235341236333217353311140606232226131416333236
-35342623220666af0b3243747d88180e0176b0dbf06ed18dbc7aa665dba0
-beea99a67d7ca8ad7a78a8581a512532645a37b08b013cdd9801018c9880
-fc6af8cf78ab032ad1c0bfccc3c6c300>ArialMT AddT42Char 
-3 8014 76 <000200880000013c05ba0003000700cd405e09360b0b02554f099009a009
-b009c009df09f0090700091f09700980099f09b009c009df09e009ff090a
-1f09010001070402030906037e0100060506040a0607250500049f04a004
-b004c004e00406c004f0040200042004d004e0040404b8fff8b410100255
-04b8fffa40170e0e025504040c0c0255040a0b0b025504140b0b065504b8
-ffeab41010065504b8fffeb40d0d065504b8fffc400a0c0c0655044e0847
-50182b10f62b2b2b2b2b2b2b2b5d71723cfd3c003f3f3c3fed0111123939
-111239393130015d72712b133533150311331188b4b4b404ebcfcffb1504
-26fbda00>ArialMT AddT42Char 
-3 9202 79 <000100830000013705ba000300e3b605360b0b025505b8ffc0b337383405
-b8ffc0b334353405b8ffc0b330313405b8ffc0b322253405b8ffc0402515
-17340f051f059f05df05044f05df05f005031f0570058005ff0504010000
-0a0203250100b8ffc0b337383400b8ffc040153335349f0001c000f00002
-00002000d000e0000400b8fff8b41010025500b8fffa401d0e0e02550004
-0c0c0255000a0b0b025500140b0b065500081010065500b8fffeb40d0d06
-5500b8ffffb40c0c065500b8fffc400a0c0c0655004e044750182b10f62b
-2b2b2b2b2b2b2b2b5d71722b2b3cfd3c003f3f3130015d71722b2b2b2b2b
-2b3311331183b405bafa4600>ArialMT AddT42Char 
-3 9454 80 <0001008700000626043e002301c7b9000dfff4b40d0d065508b8fff4b40d
-0d065509b8ffd8404d0b0d342504e404e409e117e52005d505f620021708
-202309181b20090303231e1c06151c0b0b06070106231a19100ad0250190
-25a025022517171a0e2590110111041010025511180f0f025511b8ffec40
-0b0e0e025511140c0c025511b8ffe840170b0b025511020b0b0655110c10
-10065511060f0f065511b8fffab40c0c065511b8fff8b40d0d065511b801
-5d400c1825901b011b180f0f02551bb8ffec400b0e0e02551b140c0c0255
-1bb8ffee40110b0b02551b040b0b06551b0a101006551bb8fffe400b0d0d
-06551b0c0f0f06551bb8fffcb40c0c06551bb8015d4016000233232501d0
-00019000a000021f003f004f000300b8fffe401d0e0e025500100d0d0255
-00100c0c0255000c0b0b025500160b0b065500b8fffcb41010065500b8ff
-f440140f0f0655000a0c0c0655000e0d0d065500192425b80178b3214750
-182b2b4ef42b2b2b2b2b2b2b2b2b5d71723c4dfde410f42b2b2b2b2b2b2b
-2b2b5dedf42b2b2b2b2b2b2b2b2b2b5dfd4e456544e67172003f3c3c3c3f
-3f3c4d10ed10ed11173901111239123931304379400e0c141326140c111b
-01120d151b01002b012b2b81015d005d2b2b2b3311331536363332161736
-3332161511231134262623220615112311342623220606151187a132a66a
-76971f7eca9eaab3235c3e7094b458644c813a0426954e5f6258baafb6fd
-27029d6c5f3a95a4fd9702b27878509a91fdd900>ArialMT AddT42Char 
-3 10014 81 <00010087000003e6043e0016017d40130503061302a810b810e303e713f0
-03f6130604b8fff0403c0b0d347910019810d018e018ff18042008140e14
-16121c05070106160d0a0d0e0c0e2418401010025518400b0b02550b2810
-1002550b140e0e02550bb8ffec40110d0d02550b040c0c02550b220b0b02
-550bb8fff4400b0b0b06550b14101006550bb8fff9400b0d0d06550b0a0f
-0f06550bb8fff640120c0c06550b40333634ff0b01ff0b010b4e18b8ffc0
-401a343634b018f018027018a018b018c01804180302331516250100b8ff
-f6b41111025500b8fffab41010025500b8fffa40170e0e025500040c0c02
-55000a0b0b025500040b0b065500b8fffa40110f0f065500020c0c065500
-040d0d065500b8ffc04012333634f0000100002000d000e00004004e1710
-f65d712b2b2b2b2b2b2b2b2b2b3cfd3cf43c105d712bf65d712b2b2b2b2b
-2b2b2b2b2b2b2b2bed3c103c003f3c3f3fed113901123931304379401606
-11090a080a070a0306102611060e1b010f0a121b01002b012b2b2a81015d
-71002b5d71331133153633321616171615112311342626232206151187a2
-75dd60a150100ab42a6b4873a7042697af45704d327dfd7302866e6d4192
-ccfdbc00>ArialMT AddT42Char 
-3 10468 82 <00020044ffe80427043e000d0019016bb615180d0d065513b8ffe8b40d0d
-06550fb8ffe840730d0d065519180d0d065512070a190c47064808560659
-08670669080834103a123a16351845104b124b1645185c055c0952105d12
-5d1652186d056d0964106d126d1664187701150906050d5b035405540a5b
-0c6c036505650a6c0c0a171c0407111c0b0b14241b400d0d02551b400b0b
-025507b8ffea40110f0f025507180d0d025507100b0b025507b8fff0b40b
-0b065507b8fff0b40d0d065507b8fff0b40f0f065507b8fff0b40c0c0655
-07b8ffc04013242534300701000710072007030731df1b011bb8ffc04049
-1e2334301b011b0e24000c0e0f025500120d0d0255000c0c0c0255001c0b
-0b0255000e0b0b0655000e0d0d0655000c1010065500160c0c0655004024
-25341f003f000200311a3437182b10f65d2b2b2b2b2b2b2b2b2bed10712b
-5df65d5d2b2b2b2b2b2b2b2b2b2bed003fed3fed313001715d0071435c58
-4009530553096205620904015d59002b2b2b2b1310373633320015140606
-23220013141633323635342623220644a489c5db01167beb8bdffeedb9b2
-8786b2b38587b2021301278e76fee1fdcdeb82011e010dcccbccd1c5cbca
->ArialMT AddT42Char 
-3 10918 83 <00020087fe690421043e0012001e0162408e0c102d103d104b10043f20b0
-20021f20290c231d3215321d421d70209020083a173a1b4a174a1b59085b
-0c5c175c1b6a086b0c69106d176b1bc020d314dd18dd1ad31ee414e41ee0
-20ff201623042b102b1535043a1046044a105a10e50beb1dfe100b110e03
-161c1c06070106161c0e0b000e1924d00a01100a400a600a800a0420400b
-0b025520400d0d02550ab8ffe6400b0f0f02550a180d0d02550ab8fffab4
-0c0c02550ab8ffeeb40b0b06550ab8fff4b40f0f06550ab8ffe840230c0c
-06550a74011333023312250000c001019001a001b001f001041f013f014f
-010301b8fffc401d0e0e025501100d0d025501100c0c025501100b0b0255
-010c0b0b065501b8fff6b41010065501b8fffc40160f0f0655010c0c0c06
-5501120d0d065501191f473718012b4e10f42b2b2b2b2b2b2b2b2b5d7172
-3c4d10fdf4e410fd2b2b2b2b2b2b2b2b5d71ed003f3fed3f3fed11391239
-3130005d015d717200711311331536363332161615140206232226271103
-141633323635342623220687a43a926888d06a75df7b5a8f2e11a67678ab
-a77473b1fe6905bd8a51518cff98a3fefb8b4c3afdfb03a4cdc4cbd5cbca
-d700>ArialMT AddT42Char 
-3 11776 85 <00010085000002c6043e001100c9403b2f13011004012304340443045304
-66047404060911080908090d1311090d000308010b1c06070106000a0928
-900801082220130113022211250100b8ffc04010333634f0000100002000
-d000e0000400b8fff8b41010025500b8fff840110e0e025500040c0c0255
-00060b0b025500b8fffcb41010065500b8fff440160f0f065500060c0c06
-5500080d0d0655004e1247c4182b10f62b2b2b2b2b2b2b2b5d712b3cfde4
-105df472e4003f3f3fed11393911393901111239390010c9870e7dc43130
-005d72015d33113315363633321707262322060706151185a23e693f5b5e
-3e42423b5e141e0426a171483aa727473f6072fdd400>ArialMT AddT42Char 
-3 12038 86 <0001003fffe803b1043e00300317407b042214223a094a09442456226522
-7c098e098424a613ab2cc2030d09171a1817304b2cd617051b0255020210
-32010a185c085c095c0a5c0b5c0c5c0d6a086a096a0a6a0b6a0c6a0db426
-b4270f27262427242936245a0a590b64266428742374248024930a9c0c92
-28972c9530a40aa90ca327a428b326c5261628b8fff4b40d0d065522b8ff
-f4b40d0d065523b8fff4b40d0d065524b8fff4b40d0d065528b8fff4b40c
-0c065522b8fff4b40c0c065523b8fff4b40c0c065524b8fff4b40c0c0655
-1db8ffde40121e395a0827250c0a041a202615040b2e1d1ab802aa402219
-2c0b0b02551f193f194f195f19af19cf19060f191f196f19df19041f198f
-190219bd02550015000002aa0001ffc040140b0b025510014001021001d0
-0102000110010201b8ffc0b314163401b8ffc040100e113401012e5c1d6c
-1d021d1c150704b8fff4b40b0b025504b8ffe6b41010065504b8ffe64013
-0f0f0655041c2e0b1f1a011a24194013183432b8ffc0402f0f0f02551918
-0f0f025519180d0d025519160c0c025519201010065519200f0f06551910
-0c0c065519160d0d065519b8025bb207242ab8ffc0b51c39d02a012ab8ff
-e6b40c0c02552ab8ffe8b40f0f02552ab8ffe8b40c0c06552ab8ffeab60d
-0d06552a1a32b8ffc04021272a346032c032023f32803202321001010124
-00180d0d025500100d0d06550020b8fff4b40d0d025520b8fff4b4101006
-5520b8fff440190f0f065520240f100b0b02550f160c0c02550f200d0d02
-550fb8fffa40200f0f02550f0e0c0c06550f0c0d0d06550f22df00013f00
-4f00020019313437182b4e10f45d714df42b2b2b2b2b2bed2b2b2b102b2b
-ed724e105d712bf62b2b2b2b712b4dedf42b2b2b2b2b2b2b2b2bed72003f
-ed2b2b2b3fed7112392f2b2b5d71722be410fd5d71722be4111239111239
-0111121739313043794040272d1e2305142c261110121013100306220d20
-1b000928071b01052d071b011e14201b00210e231b0022230d0c08290a1b
-012827090a062b041b001f101d1b01002b2b103c103c2b103c103c2b012b
-2b2b2b2a2b818181002b2b2b2b2b2b2b2b2b5d71015d72715d1337161633
-323635342726272e02353436373636333216161707262623220615141716
-1716171e02151406062322263fb20f897b7c78352593c6994f41382a9153
-7dbd5a11b00c73697c6a16162f1b84bf975669c67dcfd9013d1c6b726544
-3d2318253249814e4779281f2b487b6718525c5237231c1d130a2433417c
-5c5a9f57ac00>ArialMT AddT42Char 
-3 12974 87 <00010024fff2022a0599001700d8b9000affc0b323263409b8ffc0404123
-263480190100010c0d0a0103001610092b0f0a06161c030b0f1022002201
-0d12250c01ff070845094560077007800790070400072007a007b007c007
-d0070607b8ffeeb41010025507b8fff4b40f0f025507b8fff2b40e0e0255
-07b8fff8b40d0d025507b8fff8b40c0c025507b8fffab41010065507b8ff
-f0400b0f0f065507060c0c065507b8ffe8b40d0d065507ba026a00180136
-b166182b10f62b2b2b2b2b2b2b2b2b5d71f4e410ed3cfd3c10e4f43c003f
-ed3f3cfd3c1139123911333310c93130015d2b2b25170623222626351123
-353311371133152311141616333202101a4c3c626c2c8484b3b5b5132b28
-1ea19f103e65a202638c01076cfe8d8cfd934d2c1a00>ArialMT AddT42Char 
-3 13680 89 <0001001a000003e80426000a01eab1020243545840170508000a08060106
-0a0005090805010205240f0f0255052f2bddcd10ddcd113333003f3f3f12
-3931301bb7350501002211390ab8ffde400d11390916121c340816121c34
-02b8ffeab3121c3401b8ffeab3121c340ab8ffd840091e213400281e2134
-0ab8ffe8400922253400162225340ab8ffda407e282e340020282e340f0c
-29002809260a3900350a4800470a56015602590858096601660269086909
-78007701770279087809770a870187028603890788088a099d009809910a
-ac00a20abd00b707b10ac900c50ada00d50aec00e30afb00f40a2c0a0005
-0a1800160a2800260a370a4f00400a09054012163405400b0d34b1060243
-5458400905010008060106000ab8fff4400f0d0d06550a000c0d0d065500
-050908b8fff440120d0d0655080501020c0d0d06550205050c0b1112392f
-dd2bcd10dd2bcd10cd2bcd2b002f3f3f11123931301b40370a0708082509
-0a1409090a0003020225010014010100050a0a000a09080802020106070a
-09030001052f0c010c22084040400980090209b8011bb5400580050205b8
-011b400920024001220bead2182b10f6ed1a19fd5dfd5d1a18ede45d1112
-3939123939003f3c103c103c3f3c113987052e2b877dc4872e182b877dc4
-593130002b2b01715d2b2b2b2b2b2b2b2b2b2b2b2b005d59210133131617
-363713330101aefe6cbee4251f182becb9fe6e0426fd84676f54760288fb
-da00>ArialMT AddT42Char 
-2 0 0 <00020100000005000500000300070000211121112521112101000400fc20
-03c0fc400500fb002004c000>ArialMT AddT42Char 
-ArialMT /CharStrings get begin
-/underscore 66 def
-/a 68 def
-/c 70 def
-/d 71 def
-/e 72 def
-/f 73 def
-/g 74 def
-/i 76 def
-/l 79 def
-/m 80 def
-/n 81 def
-/o 82 def
-/p 83 def
-/r 85 def
-/s 86 def
-/t 87 def
-/v 89 def
-end
-ArialMT /Encoding get
-dup 95 /underscore put
-dup 97 /a put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 105 /i put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 118 /v put
-pop
-end
-%ADOEndSubsetFont
-/KUDFOI+ArialMT /ArialMT findfont ct_VMDictPut
-/KUDFOI+ArialMT*1 
-[95{/.notdef}rp /underscore /.notdef /a /.notdef /c /d /e 
-/f /g /.notdef /i 2{/.notdef}rp /l /m /n 
-/o /p /.notdef /r /s /t /.notdef /v 
-137{/.notdef}rp]
-KUDFOI+ArialMT nf
-KUDFOI+ArialMT*1 [9 0 0 -9 0 0 ]msf
-339.246 56.01 mo
-(gs_set_device_named_color_profile)
-[5.04001 4.56299 5.04001 4.56299 5.04001 2.51999 5.04001 5.03998 5.04001 4.43701 2.043 4.43701 
-5.03998 5.04001 4.923 5.03998 7.55994 4.923 5.04001 5.03998 4.43701 5.03998 1.91702 5.03998 
-2.99695 5.04001 5.03998 2.99695 4.92297 2.52002 2.04297 1.91702 0 ]xsh
-/KUDFOI+ArialMT*1 uf
-/KUDFOI+ArialMT uf
-/ArialMT uf
-gsave
-58.126 443.751 mo
-86.632 443.751 li
-86.632 474.882 li
-58.126 474.882 li
-cp
-clp
-58.125 443.503 mo
-86.6302 443.503 li
-86.6302 474.882 li
-58.125 474.882 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 58.125 96.4965 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-gsave
-70.126 455.751 mo
-98.631 455.751 li
-98.631 486.882 li
-70.126 486.882 li
-cp
-clp
-70.125 455.503 mo
-98.6302 455.503 li
-98.6302 486.882 li
-70.125 486.882 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 70.125 84.4965 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-gsave
-82.126 467.751 mo
-110.632 467.751 li
-110.632 498.883 li
-82.126 498.883 li
-cp
-clp
-82.1251 467.503 mo
-110.63 467.503 li
-110.63 498.882 li
-82.1251 498.882 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 82.1251 72.4966 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-gsave
-94.126 479.751 mo
-122.632 479.751 li
-122.632 510.882 li
-94.126 510.882 li
-cp
-clp
-94.125 479.503 mo
-122.63 479.503 li
-122.63 510.882 li
-94.125 510.882 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 94.125 60.4966 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-gsave
-106.127 491.751 mo
-134.632 491.751 li
-134.632 522.882 li
-106.127 522.882 li
-cp
-clp
-106.125 491.503 mo
-134.63 491.503 li
-134.63 522.882 li
-106.125 522.882 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 106.125 48.4966 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-gsave
-114.002 432.001 mo
-142.507 432.001 li
-142.507 463.132 li
-114.002 463.132 li
-cp
-clp
-114 431.753 mo
-142.505 431.753 li
-142.505 463.132 li
-114 463.132 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 114 108.247 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-gsave
-126.002 444.001 mo
-154.508 444.001 li
-154.508 475.133 li
-126.002 475.133 li
-cp
-clp
-126 443.753 mo
-154.505 443.753 li
-154.505 475.132 li
-126 475.132 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 126 96.2465 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-gsave
-138.002 456.001 mo
-166.508 456.001 li
-166.508 487.132 li
-138.002 487.132 li
-cp
-clp
-138 455.753 mo
-166.505 455.753 li
-166.505 487.132 li
-138 487.132 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 138 84.2465 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-gsave
-150.003 468.001 mo
-178.508 468.001 li
-178.508 499.132 li
-150.003 499.132 li
-cp
-clp
-150 467.753 mo
-178.505 467.753 li
-178.505 499.132 li
-150 499.132 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 150 72.2465 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-gsave
-162.002 480 mo
-190.508 480 li
-190.508 511.132 li
-162.002 511.132 li
-cp
-clp
-162 479.753 mo
-190.505 479.753 li
-190.505 511.132 li
-162 511.132 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 162 60.2465 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-gsave
-174.002 492.001 mo
-202.508 492.001 li
-202.508 523.132 li
-174.002 523.132 li
-cp
-clp
-174 491.753 mo
-202.505 491.753 li
-202.505 523.132 li
-174 523.132 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 174 48.2465 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-.75 lw
-1 lj
-10 ml
-168 12 mo
-264 12 li
-@
-1 lw
-264.125 12.0001 mo
-263.979 19.0012 li
-@
-266.999 18.0637 mo
-263.875 23.9998 li
-261 17.9387 li
-cp
-f
-252 355 mo
-252 269 li
-@
-249.001 270 mo
-251.999 264 li
-255.001 269.999 li
-cp
-f
-255 354 mo
-252 360 li
-249 354 li
-cp
-f
-311 396 mo
-385 396 li
-@
-384 393 mo
-390 396 li
-384 399 li
-cp
-f
-312 399 mo
-306 396 li
-312 393 li
-cp
-f
-216 414 mo
-216 269 li
-@
-213.001 270 mo
-215.999 264 li
-219.001 269.999 li
-cp
-f
-gsave
-48.001 192.003 mo
-76.507 192.003 li
-76.507 223.135 li
-48.001 223.135 li
-cp
-clp
-48 191.753 mo
-76.5052 191.753 li
-76.5052 223.132 li
-48 223.132 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 48 348.246 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-%ADOBeginSubsetFont: ArialMT Initial
-ct_T42Dict begin
--0.664 -0.324 2 1.004
- 256 array 0 1 255 {1 index exch /.notdef put} for  /ArialMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f3210325d73000000cc000000606376
-7420a11cd7eb0000012c000006546670676dcc79599a000007800000066e
-676c796607022dca000094e0000822cc68656164d6144b3e00000df00000
-003668686561123315fe00000e2800000024686d7478f65efffb00000e4c
-000034d46c6f6361361cd72000004320000034d86d617870124c05df0000
-77f8000000206e616d659617a74000007818000011057072657025d64dbf
-0000892000000bbe67646972000000000000000000000000000303880190
-00050008059a05330000011b059a0533000003d1006602120805020b0604
-020202020204e0002affc00078430000000900000000544d432000400020
-fffc05d3fe510133073e01b2400001ffffff0000042605bb000000200004
-05ba001905ba001a05a70019042600180000ffe70000ffe80000ffe7fe69
-ffe805ba0019fe69ffe802ea000000b8000000b80000000000a800ad0169
-00ad00bf00c201f0001800af00b900b400c800170044009c007c00940087
-0006005a00c80089005200520005004400940119ffb4002f00a1000300a1
-00cd00170057007e00ba00160118ffe9007f008503d300870085000d0022
-00410050006f008d014cff75005c00df04830037004c006e00700180ff58
-ff8eff92ffa400a500b903c8fffd000b001a0063006300cdffee05d8ffdc
-002d005c0095009900df019209b500400057008000b9039d0072009a035d
-0401ff67fffa00030021007700cd0004004d00cd01c0022b004c006500e7
-0118017c034305d8ffa3ffb0ffc40003001c005d0068009a00ba01350147
-0221055cff4dffcd0016002d00780080009900b200b600b600b800bd00da
-010c05f0ffa4fff00019002c0049007f00b400ce01c003fefd81fe3f0000
-00050018002900390049006f00be00c700d0012301c1026f050c05320540
-057affd4001400310055005700a700b400e601f7027e027e027f03c60446
-ff42000e0085009100bf00c200c500e1011a012f014f01560229026f029e
-03720008002c00310031006400690089009800c700de012b01b6020c02cf
-03a304ab04fb061dfee0ff0e00060026009b009d00c1010d011801200173
-018201d601e30243025f029b02e2039404a904d20761001c005e006d008d
-00ab00f7011201380151015b0168017c01870191019901cd01d001e80241
-0254026b02ef0368037103bd044204420453047304830586058b06e8fe58
-fec4fed1fef7ff32ff860051007c008100910095009e00b400b900cf00d9
-00d900df00e20105010b010e010e012001210155017b017b017e018d01a2
-01a801a901b401d001d001e201e901f201f501fb020002000206021b0221
-022202220223027202770294029c02cf02cf02d002ec02f903170322032b
-0335033c0359036f037103870390039003b503e1041a04cf04ff05320532
-0596059f05a805ab05c205f0060c0782080008ccfca3fd2afddefe00fe88
-fe96feb2feb4ffe100150019001a001c001f003c005100610061006a0078
-009600a500af00d3010c0118011a012a013e014c0151015f016a01710178
-01820184019a01a501a801a901ae01bc01cd01d701ef0200020d021c0221
-0222022e02350242024f024f025e026502710290029202b402d602fa0307
-030b030f0315032a0347035d036503740379039603b003cc03dd03e203f6
-03fc03fc03ff040a041f04220426042b0447045f0475049e04e704e7055c
-05cb05e5060a066d068606b806f10736073e07500751075d078f07b607d4
-086000b600c300b500b700000000000000000000000001e00381034503b5
-008e0233041902ce02ce002d005f0064034d023f000002a80188027d01b4
-02240578063b023b014e00f00426029402c6029f02f6023b034d014b0153
-006a0231000000000000061404aa0000003c04c300ed04bc026502ce03b5
-0078060c017e02ef060c00b201000239000001c50330042b03cb00da03df
-010704a100db040a011701ed02a70350010b01bd043e05580021039c00ae
-0371017d00b5024500000afb088c012b014e01aa00870054013201f803ff
-0003024e00b4003703e30083006b02d800ed00770088009701640467008e
-0033017c00e700a6029e0329056e062a061501c90269048a021301b40002
-04a9000002390124010305140084015d039a06ef02d9007500cf040a00de
-03ac04bc02cf02ae034d04f005520168006d007d00860071ff8100790558
-04d2016700030156002504e00094007c033204210094007f0072005c002f
-00b6001800ba00b80041034d00720018001f004c016a01550099009a009a
-009800b200040078006900140057006e00ce00b4065402b80067050e0165
-00e7000004cbfe52005affa60099ff67006eff92002dffd40087ff7c00b8
-00a800e5008f00a80185fe7b0070001e00d900de014c054602cf0546ff2d
-028a02d90253029600b700000000000000000000000000000125011800ea
-00ea00ae0000003e05bb008a04d70053003fff8cffd50015002800220099
-0062004a00e4006d00ee00e5004803c00033fe4e02b1ff460370007905df
-0051ffa7ff1f010a0068ff6c004f00bc00a507050061072b00ed04b001d2
-00b6007b00650252ff740365fe690094008f005c00400086007500890089
-4043555441403f3e3d3c3b3a3938373534333231302f2e2d2c2b2a292827
-262524232221201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09
-0807060504030201002c4523466020b02660b004262348482d2c45234623
-6120b02661b004262348482d2c45234660b0206120b04660b00426234848
-2d2c4523462361b0206020b02661b02061b004262348482d2c45234660b0
-406120b06660b004262348482d2c4523462361b0406020b02661b04061b0
-04262348482d2c0110203c003c2d2c20452320b0cd442320b8015a515823
-20b08d44235920b0ed51582320b04d44235920b09051582320b00d442359
-21212d2c20204518684420b001602045b04676688a4560442d2c01b10b0a
-432343650a2d2c00b10a0b4323430b2d2c00b0172370b101173e01b01723
-70b10217453ab10200080d2d2c45b01a234445b01923442d2c2045b00325
-456164b050515845441b2121592d2cb00143632362b0002342b00f2b2d2c
-2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b1
-2cc08a8cb8100062602b0c642364615c58b00361592d2c45b0112bb01723
-44b0177ae4182d2c45b0112bb01723442d2cb01243588745b0112bb01723
-44b0177ae41b038a45186920b01723448a8a8720b0a05158b0112bb01723
-44b0177ae41b21b0177ae45959182d2c2d2cb0022546608a46b040618c48
-2d2c4b53205c58b002855958b00185592d2c20b0032545b019234445b01a
-23444565234520b00325606a20b009234223688a6a606120b01a8ab00052
-7921b21a1a40b9ffe0001a45208a54582321b03f1b235961441cb114008a
-5279b31940201945208a54582321b03f1b235961442d2cb110114323430b
-2d2cb10e0f4323430b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2c
-b10e0f432343650b2d2cb11011432343650b2d2c4b525845441b2121592d
-2c0120b003252349b04060b0206320b000525823b002253823b002256538
-008a63381b212121212159012d2c4bb06451584569b00943608a103a1b21
-2121592d2c01b005251023208af500b0016023edec2d2c01b00525102320
-8af500b0016123edec2d2c01b0062510f500edec2d2c20b001600110203c
-003c2d2c20b001610110203c003c2d2cb02b2bb02a2a2d2c00b00743b006
-430b2d2c3eb02a2a2d2c352d2c76b8022323701020b802234520b0005058
-b00161593a2f182d2c21210c6423648bb84000622d2c21b08051580c6423
-648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb815
-55621bb200802f2b59b002602d2c0c6423648bb84000626023212d2cb400
-0100000015b00826b00826b00826b008260f10161345683ab001162d2cb4
-000100000015b00826b00826b00826b008260f1016134568653ab001162d
-2c4b53234b515a5820458a60441b2121592d2c4b545820458a60441b2121
-592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb01343
-58031b02592d2cb0134358021b03592d2c4b54b012435c5a58381b212159
-2d2cb012435c580cb00425b00425060c6423646164b807085158b00425b0
-0425012046b01060482046b0106048590a21211b2121592d2cb012435c58
-0cb00425b00425060c6423646164b807085158b00425b00425012046b8ff
-f060482046b8fff06048590a21211b2121592d2c4b53234b515a58b03a2b
-1b2121592d2c4b53234b515a58b03b2b1b2121592d2c4b53234b515ab012
-435c5a58381b2121592d2c0c8a034b54b00426024b545a8a8a0ab012435c
-5a58381b2121592d2c4b5258b00425b0042549b00425b00425496120b000
-5458212043b0005558b00325b00325b8ffc038b8ffc038591bb040545820
-43b0005458b00225b8ffc038591b2043b0005458b00325b00325b8ffc038
-b8ffc0381bb00325b8ffc03859595959212121212d2c462346608a8a4623
-20468a608a61b8ff8062232010238ab902c202c28a70456020b0005058b0
-0161b8ffba8b1bb0468c59b0106068013a2d2cb1020042b123018851b140
-0188535a58b910000020885458b202010243604259b12401885158b92000
-0040885458b2020202436042b12401885458b2022002436042004b014b52
-58b2020802436042591bb940000080885458b202040243604259b9400000
-8063b80100885458b202080243604259b94000010063b80200885458b202
-100243604259b94000020063b80400885458b20240024360425959595959
-2d2cb0024354584b53234b515a58381b2121591b21212121592d00000001
-00000005028fa58dc35f5f0f3cf5081b080000000000a2e3272a00000000
-c14fd713faaffd671000080c00000009000100010000000000010000073e
-fe4e00431000faaffa7a1000000100000000000000000000000000000d35
-06000100000000000239000002390000023900b002d7005e047300150473
-0049071d0077055600580187005a02aa007c02aa007c031d004004ac0072
-023900aa02aa0041023900ba0239000004730055047300df0473003c0473
-00560473001a047300550473004d047300610473005304730055023900b9
-023900aa04ac007004ac007204ac00700473005a081f006f0556fffd0556
-009605c7006605c7009e055600a204e300a80639006d05c700a4023900bf
-04000037055600960473009606aa009805c7009c063900630556009e0639
-005805c700a10556005c04e3003005c700a105560009078d001905560009
-0556000604e300290239008b023900000239002703c100360473ffe102aa
-00590473004a0473008604000050047300460473004b0239001304730042
-0473008701c7008801c7ffa20400008801c7008306aa0087047300870473
-0044047300870473004802aa00850400003f02390024047300830400001a
-05c700060400000f040000210400002802ac0039021400bc02ac002f04ac
-00570556fffd0556fffd05c70068055600a205c7009c0639006305c700a1
-0473004a0473004a0473004a0473004a0473004a0473004a040000500473
-004b0473004b0473004b0473004b023900bd023900230239ffe502390009
-047300870473004404730044047300440473004404730044047300830473
-0083047300830473008304730049033300800473006b0473001b04730051
-02cd006d044c000104e3009905e5000305e50003080000e102aa00de02aa
-003d0464004e080000010639005305b4009a0464004e0464004d0464004d
-0473fffd049c00a003f4003805b4007a069600a1046400000231000002f6
-002f02ec002d0625007f071d004404e3008104e3009e02aa00e804ac0072
-046400540473002e0464003304e5001a047300860473008c080000ef0556
-fffd0556fffd0639006308000081078d00520473fffc0800000002aa0053
-02aa004701c7008001c7006c0464004e03f4002f04000021055600060156
-fe390473ffe402aa005c02aa005c040000170400001704730049023900b9
-01c7006c02aa0047080000250556fffd055600a20556fffd055600a20556
-00a20239008d0239ffe00239000402390015063900630639006306390063
-05c700a105c700a105c700a1023900c602aa001902aa000602aa001d02aa
-002e02aa00e502aa00a202aa006b02aa003a02aa004b02aa002804730000
-01c700030556005c0400003f04e3002904000028021400bc05c7fffd0473
-004905560006040000210556009e0473008704ac007204ac00a102aa006b
-02aa001902aa002106ac006b06ac006b06ac0021047300000639006d0473
-0042023900b10556005c0400003f05c700660400005005c7006604000050
-04730046046bffe102aa00ee0556fffd0473004a0556fffd0473004a05c7
-009e04eb004705c7fffd055600a20473004b055600a20473004b04730096
-01c7004204730096025500880473009a02ac008305c7009c0473008705c7
-009c04730087063900630473004405c700a102aa008505c700a102aa003c
-0556005c0400003f04e300300239002404e300300300002305c700a10473
-008305c700a10473008304e300290400002804e3002904000028046800a4
-063900600662005504a00048047400480391006204f000440329002e0530
-0048046bffe1040000b002eb005208c000330800004f040000990800004f
-040000990800004f040000980400009807d5016a05c0009e04ab007204d5
-009d04ac007104d5022204d5010505abffe9050001c905ab027e05abffe9
-05ab027e05abffe905ab027e05abffe905abffe905abffe905abffe905ab
-ffe905ab01c005ab027e05ab01c005ab01c005abffe905abffe905abffe9
-05ab027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab
-01c005ab01c005abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905abffe905abffe905ab02d605ab006605abffea05d5ffff04d50092
-0800000007eb013007eb012007eb013007eb012004d500b204d5008004d5
-002a082b0198086b01b807550010060000f40600006f0440003a05400037
-04c0003f04150040040000250600005505e100bf038d008904d5ffd90180
-008002d50086071500610296000f04d5009202d6008302d6008304d500b2
-02d600700556fffd0473004a05c700660400005005c70066040000500556
-00a20473004b055600a20473004b055600a20473004b0639006d04730042
-0639006d047300420639006d0473004205c700a40473008705c7001f0473
-00060239ffce0239ffce0239ffe40239ffe40239fff60239fff50239004b
-01c700190400003701c7ffa20556009604000088040000860473009601c7
-fffa05c7009c0473008705c900a50473008b063900630473004406390063
-0473004405c700a102aa006b0556005c0400003f04e300300239000c05c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-078d001905c70006055600060400002101c700890556fffd0473004a0800
-0001071d00440639005304e30081023900b9078d001905c70006078d0019
-05c70006078d001905c70006055600060400002101c7008a02aaffe10473
-001b04cd005a06ac006b06ac002206ac002206ac004a02aa00e202aa006b
-02aa00de02aaffea0557ffff0646ffa706b4ffa80312ffa80632ffa706d8
-ffa70605ffa701c7ff780556fffd055600960558fffe055600a204e30029
-05c700a4023900bf055600960558000b06aa009805c7009c0533006d0639
-006305c700a40556009e04f2009404e30030055600060556000906af007f
-05fb0061023900040556000604a00048039100620473008b01c7006b0460
-0088049a008c04000019038700480473008b0473005c01c7008904000086
-04000018049c00a00400001a0395005c04730044048d008303db00560460
-00880433001105b4007a063f005701c7ffc9046000880473004804600088
-063f0057055700a206eb0032045500a105c000640556005c023900bf0239
-0004040000370875000d081500a406d5003104a900a10515000a05c000a0
-0556fffd054000a705560096045500a1056b0000055600a20763000704d5
-004e05c000a105c000a104a900a10540001206aa009805c700a406390063
-05c000a00556009e05c7006604e300300515000a061500520556000905eb
-009f05550057075500a1078000a106550000071500a8054000a505c00055
-081500a405c7001a0473004a0495005b0440008802eb008804ab00000473
-004b055afffb03ab003204780087047800870380008604ab00180580008c
-046b00880473004404550088047300870400005003aa0026040000210695
-004b0400000f0495008a042b0045066b008d0695008d0500002805c0008b
-042b008404150030060000890455001f0473004b0473000002eb00890415
-004b0400003f01c700880239000901c7ffa2074000130680008304730000
-0380008604000021046b008803e900a1034a008808000041089500a00585
-002d000001010000001e0000003100000031000001010000007e0000007e
-0000008c0000008c000001010000001000000101000001210310007d0000
-008c023300d20000030b0000ff04023900b9048100690456003203310019
-0411002d04d1009601f9009b030f005f04ca009b04b8008c01f9009b0413
-002803b0005003b4003c04ca009b04cf005001f9009b02d2003c0498005a
-043c00190488006e045f007303b1001903d4000a0466009604130028058e
-00640524002803f2009b03f2009b03f2009b01e3005a0356005a0686009b
-01f9ffac041300280413002803b4ff5703b4ff570448002d058e0064058e
-0064058e0064058e00640481006904810069048100690456003203310019
-0411002d04d10096024b0000034a000004b8008c024b00000413002803b0
-005003b4003c04cf005002d2003c0498005a0488006e045f007303d4000a
-0466009604130028058e00640524002801f9009b0456003203b00050045f
-0073049b003c0000ffdc0000ff250000ffdc0000fe51028d00ab028d00a0
-02da0043034d007901a8ffba000000460000004600000046000000460000
-00480000004600000046000000460435017c0435012e043500b704350081
-0435012c043500be043500af043500810435009a043500db04350085028d
-00c1043500b3060001000600010002420036060001000435009e04350098
-043500cb0600010006000100060001000600010006000100000000460600
-010006000100060001000600010006000100060001000600010006000100
-051bffba06000100060001000600010005b5003a05b5003a01f4ffba01f4
-ffba060001000600010006000100060001000481003604350036043dffba
-043dffba03e9004a03e9004a067f0014077600140327ffba041effba067f
-0014077600140327ffba041effba051b003204b500240300fff706000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010000000030
-0000004600000046000000400000004606000100060001000000ffdc0000
-fe510000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ff160000ff160000ffdc0000ff160000ffdc0000ff200000ffdc0473
-004a08000000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010006000100028d
-007f028d005d0600010004ee0015034d007901a8000e01d6ffdc01a80056
-01d60010037500320375003201a8002d01d60013051b003204b5002401f4
-ffba01f4ffba01a8009301d6001305b5003a05b5003a01f4ffba01f4ffba
-024200000300fff705b5003a05b5003a01f4ffba01f4ffba05b5003a05b5
-003a01f4ffba01f4ffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba02b3
-005f02b3005f02b3005f02b3005f03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba08c9003e08c9003e06c5ffba06c5ffba08c9003e08c9003e06c5ffba
-06c5ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7
-ffba04a7ffba045a002a039a00360435ffba0327ffba045a002a039a0036
-0435ffba0327ffba064f0027064f00270224ffba021affba04a7004604a7
-00460224ffba021affba04cf002d04cf002d0327ffba0327ffba040d0047
-040d004701a8ffba01a8ffba02b4002302b400230327ffba0327ffba0435
-00450435004501f4ffba01f4ffba024200360300fff7039affba0327ffba
-0375003203750032051b003204b50024051b003204b5002401f4ffba01f4
-ffba045a004004ce0049045a002604ce0039045a005304ce004a045a0053
-04ce004a0600010006000100000000460000004606000100060001000600
-010000000046000000460600010006000100000000480000004606000100
-060001000600010000000046000000460000004600000046000000400000
-003006000100000000460000004606000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d00ca028d00c7028d
-00c606000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000100ffba0800ffba1000ffba06dc0063053f004406d5
-00a1055b00830000fddc0000fc2f0000fca60000fe540000fcd70000fd73
-0000fe290000fe0d0000fd110000fc670000fd9d0000fbf50000fc720000
-fed50000fed50000ff02041b00a006ac006b06ac00190000feb60000fd73
-0000fe080000fca60000fe530000fd110000fbc80000faf40000faaf0000
-fc720000fbaa0000fb6a0000fcf10000fc7d0000fbdd0000fcc10000fb98
-0000fdea0000fe840000fdc20000fcf10000fd5f0000fe760000febc0000
-fceb0000fd6c0000fd580000fc900000fd150000fc2c0000fc130000fc12
-0000fb960000fb9601c700880556fffd0473004a0556fffd0473004a0556
-fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473004a
-0556fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473
-004a0556fffd0473004a0556fffd0473004a055600a20473004b055600a2
-0473004b055600a20473004b055600a20473004b055600a20473004b0556
-00a20473004b055600a20473004b055600a20473004b0239006301c7001f
-023900ba01c7007c06390063047300440639006304730044063900630473
-004406390063047300440639006304730044063900630473004406390063
-0473004406dc0063053f004406dc0063053f004406dc0063053f004406dc
-0063053f004406dc0063053f004405c700a10473008305c700a104730083
-06d500a1055b008306d500a1055b008306d500a1055b008306d500a1055b
-008306d500a1055b00830556000604000021055600060400002105560006
-040000210556fffd0473004a0239ffe201c7ffb0063900630473004405c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-05c700a1047300830000fefe0000fefe0000fefe0000fefe0455fffd02eb
-000c07630007055afffb04a900a10380008604a900a10380008605c700a4
-046b00880473fffd040000140473fffd04000014055600090400000f0555
-0057042b0045055500a10473008706050063047300550639006004730044
-05b5003a01f4ffba0224ffba021affba04a7004601f4009e01f4001001f4
-001b01f4001001f4006b01f4fff90227ffce0000000f0000fff502aa00a4
-02aa00a40000000e00000056000000560000ffcf01a8000f01d6ffbf01a8
-fff501d6ffcd01a8001d01d6fff501a8009301d600130375003203750032
-0375003203750032051b003204b5002405b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba
-01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4
-ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a
-01f4ffba01f4ffba0481003604350036043dffba043dffba048100360435
-0036043dffba043dffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba0481
-003604350036043dffba043dffba02b3003202b3003202b3005f02b3005f
-02b3005f02b3005f02b3003202b3003202b3005f02b3005f02b3005f02b3
-005f02b3005f02b3005f02b3003802b3003802b3004902b3004903e9004a
-03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9
-004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba0692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba08c9003e08c9003e06c5ffba06c5ffba04a7ffba04a7ffba045a
-002a039a00360435ffba0327ffba064f0027064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba064f0027064f00270224
-ffba021affba064f0027064f00270224ffba021affba064f0027064f0027
-0224ffba021affba04a7004604a7004604a7004604a70046093e0032093e
-00320740ffba0740ffba067f0014077600140327ffba041effba04cf002d
-04cf002d0327ffba0327ffba04cf002d04cf002d0327ffba0327ffba04cf
-002d04cf002d0327ffba0327ffba067f0014077600140327ffba041effba
-067f0014077600140327ffba041effba067f0014077600140327ffba041e
-ffba067f0014077600140327ffba041effba067f0014077600140327ffba
-041effba040d0047040d004701a8ffba01a8ffba040d0047040d004701a8
-ffba01a8ffba040d0047040d004701a8ffba01a8ffba040d0047040d0047
-01a8ffba01a8ffba043500450435004501f4ffba01f4ffba043500450435
-00450435004504350045043500450435004501f4ffba01f4ffba04350045
-043500450481003604350036043dffba043dffba024200360300fff7031a
-001a031a001a031a001a0375003203750032037500320375003203750032
-037500320375003203750032037500320375003203750032037500320375
-0032037500320375003203750032051bffba04b5ffba051b003204b50024
-01f4ffba01f4ffba0375003203750032051b003204b5002401f4ffba01f4
-ffba051b003204b50024067f0045067f0045067f0045067f004501a80028
-0000fe290000fea20000ff300000ff1d0000ff120000ff920000fe7e08fc
-003208ad00320000ffb50000ffb60000feed0000ff640000fe7e0000ff9f
-018d000002f6fffd0000fe820000ff1004cd00320000ff580000ff580000
-ff640692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba045a002a039a00360435ffba0327ffba034d007902b400230242
-003601f4ffba0290ffba01f4002f01f4003b01f4001201f400b101f4006d
-067f00140776001401f9009b0000fed902bc000003f2009b045afff504ce
-fff5045a005304ce004a045a005304ce004a045a005304ce004a045a0053
-04ce004a045a005304ce004a045a005304ce004a04350071043500ad045a
-000f04ce000f0473001406110014054000a7047300860540000a0473000a
-05c7005105c700660400005005c7fffd067a00140540004a047300460474
-00480556006e04d5005304e3ffc40639006d04fe000f070c008701c70083
-0239001f055600960400008801c7001504000018072000a405c7ffb80473
-008b0639006006f200630557004406090014047300860556009e0556006b
-0400004f04f20094030b00440239002404e300140239002404e3003005fb
-006105c700a1062e00140400002104e300290400002804e3002904e30031
-045c0044045c003f0473003c0473005503ab003203e50024047300870214
-00bc034e00bc04ac0072023900b00aaa009e09c7009e08640046087f0096
-06aa0096039c008309c7009c078e009c062b0087047300550556fffd0473
-004a0000fefe0556fffd0473004a08000001071d00440639006d0473001a
-0639006d0473004205560096040000880639006304730044063900630473
-004404e30029045c004c01c7ffa20aaa009e09c7009e086400460639006d
-04730042084600a404f2009e05c7009c047300870556fffd0473004a0556
-fffd0473004a055600a20473004b055600a20473004b0239ff8a0239ff64
-023900040239fff60639006304730044063900630473004405c700a102aa
-ffcc05c700a102aa006805c700a10473007605c700a1047300830556005c
-0400003f04e3003002390024045c0051037e001305c700a40473008705a6
-00a404d6005e0486005e04e30029040000280556fffd0473004a055600a2
-0473004b06390063047300440000fefd0639006304730044063900630473
-004406390063047300440556000604000021047300570473004804730086
-04730086040000130400005004730046047300460473005505e9005503ab
-004903ab0032050d0032040f00440239ffb9047300420473004204780050
-0402001904ef00190473008b047300870473008701c7001901c7008901c7
-0089029e0000026e001401c700830493008306aa008406aa008406aa0087
-0473ffa60473008b046c00870473004406530044063f00570466004402aa
-ffe402aaffe402aaffe402aa008502aa008502aa008502aaffe40455008a
-0455008a0400003f01c7ffa20214ffb901c7ff7202cb00000239000f0239
-002404730019048c0044046000880400001a05c700060400001804280019
-0400002804540028045c004c045c00790400002404000050040000240400
-00500639006304400088040f004904780050046b0088032e000004000008
-033b008804730048040000240400005007b7004607400046080b004605b3
-0024036f002405c00024061c0013054a0083050f008303e2001e04380063
-03110064031100640146ffce01eb006401eb000001eb000002ea006403d9
-0000029100000187005a02d7005e01c7008001c7006c01c7008a02aa00fb
-02aa00fb02ca003202ca003204ac007004ac007004ac006504ac006502aa
-012102aa00de02aa005902aa012102aa001d02aa005902aa00de023900b6
-023900b602aa00fb02aa00fb02aa00a602aa00a602aa00a602aa001d02aa
-ffe202aafffb029400000142006402b8003202a0000002ca003203100096
-0310009603100096031000960310009602aa006202aa006202aa002802aa
-001d02aa0047045700960457009604570096045700960457004304570043
-045700430457004304570043031000430457002f0457002f0457002f0457
-002f0457002f0310002f0457002504570025045700250457002504570025
-0310002f0457001a0457001a0457001a0457001a0457001a0310001a0457
-004204570042045700420457004204570042031000420457009604570096
-045700960457009604570042045700420457004204570042045700420310
-00420457002f0457002f0457002f0457002f0457002f0310002f0457002f
-0457002f0457002f0457002f0457002f0310002f04570026045700260457
-002604570026045700260310002604570042045700420457004204570042
-045700420310004204570096045700960457009604570096045700420457
-004204570042045700420457004203100042045700260457002604570026
-045700260457002603100026045700230457002304570023045700230457
-0023031000230457002f0457002f0457002f0457002f0457002f0310002f
-0457004b0457004b0457004b0457004b0457004b0310004b045700960457
-009604570096045700960457004204570042045700420457004204570042
-031000420457001a0457001a0457001a0457001a0457001a0310001a0457
-002404570024045700240457002404570024031000240457002f0457002f
-0457002f0457002f0457002f0310002f0457004e0457004e0457004e0457
-004e0457004e0310004e045700960457009604570096045700960000fec1
-0000fec60000fdac0000fed80000ff920000fee90000ff4c0000fea00000
-fec40000ffce0000ff660000fea00000fed80000fed80000ff970000ff98
-0000ff990000fff40000ff420000ff420000ff440000ff5f0000fe870000
-ffec0000ffa60000ff510000ff510000ff510000fec90000ff1c00000000
-0000fee90000ff4c0000ff930000ff2a0000ff560000ffce0000fe870000
-febb0000fec40000fec40000fed80000fed80000feb30000fec90000fdad
-0000fdac0000feb30000fec90000fdad0000fe160000fee60000ffa60000
-fe870000ff440000feba0000ff230000ff9a0000fdac0000fe8800000000
-0000feb00000ff980000fe930000ffa60000fe870000fdac0000ff660000
-ff440000feb00000feb00000feb00000ff030000ff520000fd1f0000ff53
-0000ff530000ff530000feb50000feb50000ffc30000feae0000fedc0000
-fec70000fec80000fedc0000fe1e0000ff420000ff510000feb70000feb0
-02aa00de02aa005902aa00fa049a008c04600088062e001407aa0000062e
-0014047b004c063f005704cf0044063900630473004405c7006604000050
-04e300a8033b008804ff0000043c0032060d000a049d0042072000a406aa
-0084056500630473008b056400a40400000a0556006b0556006b04e00005
-04c5001905e5005f046e004403b600140347002804cf00440495005b0400
-005001c7ffa2063900600389004d03890050055600a205c000a10473004b
-047800870ab4006d04fe00100639001404e70014079900bf05b500880558
-000b0400001a072e00bf0590008806a10078057b007a086d00bf06f00088
-04d5006603ab001f065f0039058200480639006004730044066d0009050c
-001a066d0009050c001a0b010063091c004406aa005c04e600440987006d
-06d000500000fe370ab4006d04fe001005c7006604000050040700140000
-fea60000febc0000feaa0000fead0000fc2b0000fc4c05c000a104780087
-05400004042b00140556009e04730087055d00a40464008804d5004e03ab
-003204a900040380000005ef002904490028070900a4052f0088091800a0
-06f6008806060066042b005005c700660400005004e3003003aa00260767
-00310587002605550057042b004506e4000a0554000a06e4000a0554000a
-023900bf07630007055afffb055700a1046800860540001204ab001805c7
-00a4046b008805c700a4046b008805550057042b004506aa00980580008c
-02aa002e0556fffd0473004a0556fffd0473004a08000001071d00440556
-00a20473004b060500630473005507630007055afffb04d5004e03ab0032
-04d5004e045c004c05c000a10478008705c000a104780087063900630473
-0044063900600473004405c0004a0415002b0515000a040000210515000a
-040000210515000a0400002105550057042b0045071500a805c0008b0540
-004a0473004607bf004a0703004607a6006606860053054d006604130053
-07c3001207470018084600a4070700880639006d0478005005f900300553
-00260000ff430000fec90000ff770000ffb00000ff470000ff560000ff74
-0000fed70000feac000000000000ff520000ff56000000000000feac0000
-fd9a000000000000ff6a0000ff7c0000ff690000ff560000feac0000ff7f
-0000ff560000fdef0000ff430000ff690000ff7c000000000000fdae0000
-ff8c000001020000fefe0000fefe0000fedf0000fedf0000ff580000ff20
-0000fefe0556fffd0473004a055600960473008605560096047300860556
-00960473008605c700660400005005c7009e0473004605c7009e04730046
-05c7009e0473004605c7009e0473004605c7009e04730046055600a20473
-004b055600a20473004b055600a20473004b055600a20473004b055600a2
-0473004b04e300a8023900130639006d0473004205c700a40473008705c7
-00a40473008705c700a40473008705c700930473006805c700a404730087
-0239ffdf01c7ff9202390020023900060556009604000088055600960400
-008805560096040000880473009601c7007e0473009601c7ffb904730096
-01c7ffa50473009601c7ffa306aa009806aa008706aa009806aa008706aa
-009806aa008705c7009c0473008705c7009c0473008705c7009c04730087
-05c7009c0473008706390063047300440639006304730044063900630473
-004406390063047300440556009e047300870556009e0473008705c700a1
-02aa008505c700a102aa008505c700a102aa005e05c700a102aa00260556
-005c0400003f0556005c0400003f0556005c0400003f0556005c0400003f
-0556005c0400003f04e300300239002404e300300239002404e300300239
-ffff04e300300239000e05c700a10473008305c700a10473008305c700a1
-0473008305c700a10473008305c700a104730083055600090400001a0556
-00090400001a078d001905c70006078d001905c70006055600090400000f
-055600090400000f055600060400002104e300290400002804e300290400
-002804e3002904000028047300870239000305c70006040000210473004a
-01c7008904a0004804a0004804a0004804a0004804a0004804a0004804a0
-004804a000480556fffd0556fffd06820013068200130682001306820013
-068200560682005603910062039100620391006203910062039100620391
-0062061e0000061e0000076c0000076c0000076c0000076c00000473008b
-0473008b0473008b0473008b0473008b0473008b0473008b0473008b068f
-0000068f0000081f0000081f0000081f0000081f0000081ffff3081ffff3
-01c7008101c7008101c7ff9b01c7ff9b01c7ffeb01c7ffeb01c7ffa201c7
-ffa20301000003010000049100000491000004910000049100000491fff3
-0491fff3047300440473004404730044047300440473004404730044069d
-0000069d0000082d0000082d000007c9000007c900000460008804600088
-0460008804600088046000880460008804600088046000880682000007ae
-00000812000007ae0006063f0057063f0057063f0057063f0057063f0057
-063f0057063f0057063f0057065f0000065f000007ef000007ef0000078b
-0000078b0000078bffff078bffff04a0004804a000480391006203910062
-0473008b0473008b01c7ffe601c700680473004404730044046000880460
-0088063f0057063f005704a0004804a0004804a0004804a0004804a00048
-04a0004804a0004804a000480556fffd0556fffd06820013068200130682
-00130682001306820056068200560473008b0473008b0473008b0473008b
-0473008b0473008b0473008b0473008b068f0000068f0000081f0000081f
-0000081f0000081f0000081ffff3081ffff3063f0057063f0057063f0057
-063f0057063f0057063f0057063f0057063f0057065f0000065f000007ef
-000007ef0000078b0000078b0000078bffff078bffff04a0004804a00048
-04a0004804a0004804a0004804a0004804a000480556fffd0556fffd0556
-fffd0556fffd0556fffd02aa00e502aa00fd02aa00e502aa000602aa0006
-0473008b0473008b0473008b0473008b0473008b068200000682000006f3
-000006f3000005c700a402aa001302aa001302aa000601c7ffbb01c7ffab
-01c7ffca01c7ffca01c7ff9301c7ff930239001a0239fff5036500000365
-000002aa001302aa001302aa000604600088046000880460008804600088
-048d0083048d00830460008804600088055600060556000606e600000718
-0000061e000002aaffea02aaffea02aa0059063f0057063f0057063f0057
-063f0057063f005707650000069d000007270000065f000005fb006102aa
-00de02aa00e50473000d05c7006605c7006606aa008705c70024095000a1
-078d00190556001f04e30030080000290400003004c100660000ff530000
-ff530000ff530000ff5301c7001901c7ffa2042b00050556001105740046
-02cbffa3057a008702f0ffc8057f000a057f000a02aa008402aa008402aa
-00c902aa00c902aa00a002aa005902aaffaf02aa003a02aa0006023900b9
-02aa00a902aa00a902aa00a902aa00a9032e001e032e001e02aa003a0000
-ff730000ffa50000fed80000ff230000ff720000ff720000fee70000ffa5
-0000ff530000ff530000ff530556009e0473008703f8001905fb0019071d
-00440440001904000050046900870469001903eb008703ab003201c70088
-0361004104000088033600100580008c04780087047300440400001304de
-004404de004404de000d078d005003a800440473004404730044042b0084
-0455001f0455001f03aa00260460008804c6004405de004404c600440400
-001a05c700060400002803ab0032036b003f04db001f02eb00880400001a
-04550088042b008405b4007a04ab001803a00000054f0000035100320351
-ffd103980032034800320348003203f80032036e0032015600690284002d
-0366003202d000320415003203710032036f003204180032030f00320359
-0032039c003203760031036f003204fb000002fa003202fa003203040032
-04cc0032030500640305003202f9003202f90032028c0032028c00320304
-00320142006402b6006404950064030f00640305003202d5003203050032
-030500320306006401c20032030f00640342003204950064029200000320
-00000315006402920000030600320385003202bf00000142006401eb0064
-030f0064029200000315006402920000030900320385003202bf000005ed
-00460a660046061300460689ffba0541ffba01e9003c045a00110000ff0d
-0000ff350000fece0000feb70000fec90000ffcf0000ff4f0000ff9e0000
-feca02b3005f02b3005f03e9004a03e9004a039affba0327ffba039affba
-0327ffba05ad0069053d002d05fd009604dc005004e0003c05f6009b053f
-00280650002804ac00720000fe3b0000fe660000fe660473fffc02aa0053
-02d5ffce01a8ffba01a8ffba01a8ffba01a8ffba0658001509c500470400
-000008000000040000000800000002ab0000020000000155000004730000
-02390000019a000000ab00000000000005e5000305c7006606aa00980580
-008c0744008307180046071800480556fffd05c70066040000140473000a
-04e300300400004f0400002804a5001d000001020000ff420000febf0000
-ff3a0000ff53048d000a05c7005105c7006605c70051045500a102eb0088
-0000ff430000ff040000ffac02d200960000ff37021affba0250001e0000
-ff3a0000ff5b0000ff5f0000ff7e0000ff940000ff4a0000fe9c05b5003a
-05b5003a01f4ff9601f4ff9605b5003a05b5003a01f4ffba01f4ffba05b5
-003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba
-05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba0481003604350036043dffba
-043dffba0481003604350036043dffba043dffba02b3003202b3003202b3
-005f02b3005f03e9004a03e9004a0692003e0692003e043fffba043fffba
-045a002a039a00360435ffba0327ffba045a002a039a00360435ffba0327
-ffba045a002a039a00360435ffba0327ffba064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba067f0014077600140327
-ffba041effba067f0014077600140327ffba041effba067f001407760014
-0327ffba041effba02b4002302b400230327ffba0327ffba02b4002302b4
-00230327ffba0327ffba043500450435004501f4ffba01f4ffba04350045
-0435004501f4ffba01f4ffba043500450435004501f4ffba01f4ffba040d
-0047040d004701a8ffba01a8ffba03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0473ff93047300460239ffbf06aa
-ffd50473ffb70473ff9102aaffa402aaffa40400ffff0239ffb904000028
-04730089030b0064047400480649002401c7001901c700190473001e0460
-001e048c000a04730086047300460239001305b400420400008801c7fffc
-06aa00870473008b0473008702aafffb0400003f0318ffa20400001a0400
-000f040000280473004a04730048047300460473004b03ab004903ab0032
-0534005501c700880400001301c7ffa204730083045c004c0304006402d5
-003202c9003302fc0032028c003201d5003201d500000304003203110064
-01420019014200640142006401420019022a000001420064014200090233
-00640493006404930064030fffc9030f0064030e00640305003203000032
-02b800320142ffca01c20032030f001d031a00320306006402d400640292
-000002de003202de003202de003202f4003202ea00320000febc0000febc
-0000ff730000fea9023900b902fa003202f900320305003202a0000002f9
-00320639006d0556fffd0473000f05c7006602aa004104a0004804a00048
-04a0004804a0004804a0004804a0004804a0004804a0004801c7ff9b01c7
-ffab01c7ff9b01c7ffab01c7ff9b01c7ffbb01c7ff9b01c7ffbb04600088
-0460008804600088046000880460008804600088046000880460008801c7
-ffab01c7ffab01c7ffbb01c7ffbb04600088046000880460008804600088
-045a005304ce004a03a000130556001105c700290558000b055600a20473
-004b0400003301c7ffa205e600630473004805c7000002aa000f05560006
-0400002104000013040000500400001301c700830455fffd02eb00010556
-00090400000f055600090400000f04d5005303ab00490540001204ab0018
-0000fec60000fed40000fec60000fed40000fe5f0000fe5f0000ff720000
-ff730000fee7078b000a03eb004c040000130473000a01c700150473fff4
-0556001105c700a1047300190239ff8b05c700a404730087055600960400
-008804e30029040000280400003b049e00a403670088053000480000ff53
-0000ffbc0000fefe0000fefe0000fea40000fea401c70088000000000000
-002a0000002a0000002a0000002a000000d60000017e00000320000005a6
-0000074e000009380000097e000009fe00000aa400000b8400000bec0000
-0c6400000caa00000ce600000d5600000f1200000fee00001218000013f2
-000015520000170c000018e20000198e00001c2200001e5600001eb20000
-1f7000001ff200002062000020e8000021da000023da000025840000271c
-000028560000299e00002a6200002b1800002ca800002dae00002e920000
-2f7a000031b00000323a000035640000370e000038420000394800003b3c
-00003da800004052000041000000422400004398000045d6000048e20000
-4a8800004bc800004c3200004c9c00004d0000004d8800004dbc00004e38
-0000510a000052e80000549c000056500000580e0000596200005b520000
-5cf600005dea00005f020000619a00006296000064c60000668c0000684e
-00006a1200006ba800006cae000070560000717a00007318000075360000
-79a000007bc400007e1c00008004000081020000814e00008250000082f0
-0000833c00008370000083ac000083ee000084540000849a000084ce0000
-85040000853a0000858a000085cc0000861e00008656000086a8000086de
-0000871e000087600000879e000087e800008828000088560000888e0000
-88de00008914000089540000898e000089d200008a1c00008a5800008a88
-00008acc00008b0400008b9400008c1a00008e2800008fbc0000916c0000
-91b80000924c00009470000096c4000098b4000099a000009a2200009a8c
-00009baa00009d0600009f4e0000a0b00000a13e0000a1e80000a2ac0000
-a3f40000a59e0000a68c0000a7520000a7b60000a8240000a94e0000aa72
-0000ab020000ace40000af3e0000b2900000b3860000b42c0000b47c0000
-b5320000b6520000b7f00000b88a0000b94e0000ba0e0000ba760000bab2
-0000bb0a0000bb580000bd700000bfb60000bfee0000c0200000c14a0000
-c2760000c3240000c3c80000c46a0000c53c0000c5900000c5c60000c61e
-0000c7700000c7e20000c83c0000c9b40000cb200000cc000000cc320000
-ccce0000cdf20000d0680000d0a20000d0e60000d1220000d1840000d1c6
-0000d20c0000d2580000d28a0000d2de0000d31c0000d34c0000d38a0000
-d3d00000d4120000d4500000d4d20000d5400000d6260000d6620000d6e2
-0000d7160000d7b80000d8400000d8ac0000d90e0000d97a0000da660000
-db580000db8c0000dbc00000dbf00000dc340000dcac0000de260000e040
-0000e0720000e0ac0000e1a60000e3340000e36a0000e4ce0000e54a0000
-e62a0000e7200000e8b00000ea1a0000ec080000ed040000ed4a0000ed7e
-0000edc00000edfa0000ee4e0000ee960000eee00000ef100000ef400000
-f1280000f1660000f18e0000f1be0000f1f20000f2180000f23e0000f286
-0000f43c0000f5b60000f5dc0000f6020000f6460000f6760000f6a60000
-f6fc0000f7da0000f8ec0000f9300000f9660000f9c00000f9fe0000fa32
-0000fa620000fa9e0000fade0000fb1c0000fb580000fb9a0000fbd00000
-fc0c0000fc4c0000fc720000fc960000fce60000fe420000fe980000fecc
-0000ff1a0000ff660000ffa80000ffe0000100160001005e000101000001
-029c00010464000105e6000107d80001092a00010aae00010b9000010d2a
-00010d9400010dbc00010e5a000110dc0001111c0001115c0001119c0001
-11da000112380001129600011304000113240001140e000114ae000114e4
-000115320001157c000115c6000115e2000115fe0001161e0001163e0001
-165e0001167e000116a4000116ca000116f000011716000117460001176e
-00011796000117c2000117ee000118220001184c00011878000118ae0001
-18d8000119040001193a000119640001198e000119c2000119f200011a26
-00011a6a00011a9a00011ace00011b1000011b4400011b7600011bb80001
-1bec00011c1c00011c5e00011ca200011ce800011d4400011d6000011d7c
-00011d9800011db400011dd000011f3e000121ea0001245a000124760001
-2490000124ac000124c8000124e4000125000001255c0001259600012600
-000126ca0001276a00012840000128c000012948000129b800012a4e0001
-2aac00012af200012b5000012bb200012c6a00012d2800012d5400012db0
-00012df400012f60000130540001307e0001309a000130c6000130fe0001
-314a0001318a000131be000131ee0001321e0001324e00013292000132c2
-000132f2000133320001336200013392000133c200013402000134320001
-346200013492000134b8000136bc000136ec0001371c0001386c00013a22
-00013a5200013a8000013ab000013ade00013b0e00013b3c00013b600001
-3b8400013bb400013d2400013d5c00013d8c00013f1e00013f4c00013f7a
-00013fa800013fd00001412e000142c6000142fe0001433e0001437a0001
-43aa000143d8000143f4000144240001445400014544000146ac000146dc
-000147160001475600014786000147b6000147f80001481e000148440001
-4884000148c4000148f40001493400014a1e00014a9e00014b8200014bb2
-00014be200014c1200014c4200014c7e00014cb000014ce200014d120001
-4d4200014d8800014dba00014dea00014e2000014e9200014ec600015094
-000151960001532600015556000157a6000159380001599c00015a260001
-5a3600015ac400015cc200015dee00015f5a0001604a000161ce000163e8
-000166140001670600016716000167260001683e0001684e0001685e0001
-686e0001687e0001688e000169ac000169bc000169cc00016a4000016a50
-00016b2000016b3000016c4200016c5200016c6200016c7200016dd00001
-6fae00016ff0000170260001705c0001708c000170bc0001711000017138
-000172c20001740a0001755e000176c60001784a000178ae00017a400001
-7b5c00017b6c00017b7c00017d0200017d1200017e7800017fd200018106
-00018264000183d200018598000185d800018610000186460001866c0001
-869c000186c200018838000188680001899e000189ae000189be00018a00
-00018a1000018ba400018d5000018eda00018f0200018f320001908e0001
-909e000191d6000191e600019280000193e0000193f000019656000197e0
-000199480001997800019aee00019c2000019c3000019c4000019c500001
-9d2a00019d3a00019d4a00019d5a00019e5200019fcc00019fdc0001a104
-0001a2380001a38a0001a51e0001a63c0001a7c80001a8da0001a9100001
-ab460001abe60001abf60001ad8c0001af2e0001afb20001b1340001b144
-0001b3ac0001b52c0001b6ac0001b6dc0001b87c0001ba020001bbc60001
-bcf20001bd020001be320001be420001be520001bf120001bf220001c108
-0001c1180001c24e0001c35c0001c5080001c6be0001c8000001c9700001
-cab80001cb0a0001ccec0001ce680001cea60001d04c0001d0700001d1b0
-0001d1c00001d1d00001d2080001d2180001d3a40001d50c0001d6800001
-d6a40001d6d40001d8420001d8f40001d9b20001d9e00001db960001dc8e
-0001dd1c0001de420001def00001dfc40001e00e0001e0860001e1460001
-e16e0001e1b20001e2080001e2e40001e32e0001e3620001e38a0001e3b2
-0001e3e60001e42a0001e46e0001e4ac0001e5ea0001e6a20001e7c20001
-e8380001e9060001e9580001e9ea0001ea9a0001eb8e0001ebe20001ec78
-0001ed360001ee200001eed20001eff20001f0440001f0ee0001f2240001
-f2fc0001f3e20001f4e80001f5ce0001f6b00001f7a40001f8420001f948
-0001fa420001faba0001fb320001fba80001fbde0001fc3a0001fd020001
-fd8e0001fdc60001fe0c0001fe3c0001fea60001ff660001ff9a0001ffca
-0001fffe0002002e0002005e0002008e0002022e00020266000202a60002
-02de00020316000203b2000204ac000204dc00020580000205ae000205ee
-0002063e0002066e000206ba00020852000209b800020b1800020b5e0002
-0bb200020bea00020d5c00020d9200020e2400020e6200020e9000020ece
-00020ffe0002102600021162000211f20002129c0002131e000213da0002
-14f20002160000021634000216ba0002181600021898000218e2000219ec
-00021a3400021b3800021bb400021c0c00021c9000021d7a00021e900002
-1f8c0002203600022126000221f8000222e2000223ca0002247a000224fc
-0002275a00022784000227ae0002286600022890000229d200022ad80002
-2bc200022bec00022c1600022c4000022c6a00022c9400022e1400022e3e
-00022e6800022e9200022ebc00022ee600022f1000022f3a00022f640002
-2f9800022fc200022fec0002301600023190000231a0000232ba000232ca
-000232f40002331e00023348000233720002351c00023738000238660002
-3876000239f200023a0200023b4800023d1400023e1a00023f9a0002413a
-0002435e000244b80002469a000247de0002490c000249fa00024a240002
-4a4e00024a7800024aa200024acc00024af600024b2000024b4a00024b74
-00024b9e00024bc800024bf200024c1c00024c4600024c7000024eac0002
-50280002516c000253540002549c000254c6000254f00002552000025550
-000255a0000255f000025630000256a2000256f600025754000257aa0002
-57e00002582200025868000258b2000258e20002591a0002594a00025a82
-00025dc800025df200025e1c00025e4600025e7000025e9a00025ec40002
-5eee00025f1800025f4200025f6c00025f9600025fc000025fea00026014
-0002603e0002606800026092000260bc000260e6000261100002613a0002
-61640002618e000261b8000261e20002620c0002623600026260000262fe
-000263140002633e0002661e0002662e000267480002686a000269a80002
-6aea00026c9000026ca000026de200026f3200027122000272f60002740e
-0002741e000274a00002752e0002762e0002763e000276de000276ee0002
-78040002795600027a8600027a9600027b6400027b7400027cea00027cfa
-00027e0e00027e1e00027f52000280e8000281a4000281b4000282b20002
-840c00028498000284a8000285d20002875e0002881a0002882a000288c6
-000288d6000289a4000289b400028a8c00028a9c00028ba400028bb40002
-8d7a00028d8a00028ee200028ef20002915c0002916c0002936600029376
-000294e0000294f0000295e0000295f00002978800029798000298b60002
-98c600029a0600029a1600029a2600029a3600029bae00029bbe00029bce
-00029bde00029d3000029e7e00029f4c0002a0300002a1b00002a3320002
-a4320002a5460002a68a0002a69a0002a7880002a8620002a9fe0002aa0e
-0002ab2c0002ac320002ae300002ae400002ae500002ae600002afaa0002
-afba0002b0720002b0820002b1900002b1a00002b28c0002b29c0002b3ba
-0002b3ca0002b4680002b4780002b4880002b5760002b6ea0002b8160002
-b9100002b9200002b9300002b9400002bade0002bc980002bd660002bd76
-0002bfd60002c21c0002c4a20002c7060002c98a0002cbfc0002cdcc0002
-cf820002cfac0002cfd60002cfe60002cff60002d0200002d04a0002d074
-0002d0840002d0940002d0be0002d0e80002d0f80002d1080002d1320002
-d15c0002d1860002d1960002d1a60002d1b60002d1c60002d1d60002d1e6
-0002d2100002d2200002d2300002d25a0002d2840002d2ae0002d2d80002
-d3020002d32c0002d3560002d3800002d3aa0002d3d40002d3fe0002d428
-0002d4520002d47c0002d4a60002d4d00002d4fa0002d5240002d54e0002
-d5780002d5a20002d5cc0002d5f60002d6200002d64a0002d6740002d69e
-0002d6c80002d6f20002d71c0002d7460002d7700002d79a0002d7c40002
-d7ee0002d8180002d8420002d86c0002d8960002d8c00002d8ea0002d914
-0002d93e0002d9680002d9920002d9bc0002d9e60002da100002da3a0002
-da640002da8e0002dab80002dae20002db0c0002dbac0002dbf00002dc66
-0002dc900002dcba0002dce40002dd0e0002dd380002dd620002dd8c0002
-ddb60002dde00002de0a0002de340002de5e0002de880002deb20002dedc
-0002df060002df300002df5a0002df840002dfae0002dfd80002e0020002
-e02c0002e0560002e08a0002e0be0002e0f20002e2840002e4200002e5bc
-0002e7480002e78e0002e7d40002e8420002e89e0002e8f00002e9600002
-ea380002eb040002ebdc0002eca80002ed480002ee620002ef160002ef98
-0002eff20002f0320002f1500002f29a0002f4320002f48e0002f4ec0002
-f5480002f5a40002f6580002f70e0002f7ba0002f8660002f9120002f9ca
-0002fa820002fb3a0002fb4c0002fb5e0002fb700002fb820002fb940002
-fc020002fc700002fd280002fd3a0002fd4c0002fd5e0002fd6e0002fd80
-0002fd920002fda40002fdb60002fdc80002fdda0002fe880002ff340002
-ffe20003008e00030126000301600003018a000301b4000302080003025a
-000302d6000303200003039c000303f000030474000304c60003053c0003
-0594000305fa00030650000306aa0003072800030774000307d200030836
-00030884000308d20003092a000309720003099c000309ca000309f00003
-0a2400030a5400030a8400030ad600030b4400030b9a00030c0e00030c62
-00030cd600030d1c00030d8400030dca00030e2600030e5600030e900003
-0eb600030ee600030f0c00030f3200030f6400030f9400030fe60003104c
-000310a2000311080003115c000311ca0003120c0003126c000312ae0003
-12fa0003133400031370000313aa000313e60003141a0003144c0003147c
-000314ac000314d6000314fc00031526000315540003157e000315ca0003
-160e0003164400031680000316b4000316e200031720000317500003178a
-000317b4000317e2000318080003182e0003185a000318b6000318e60003
-1916000319460003197e000319b2000319e000031a1000031a4000031a70
-00031aa000031ad400031b2a00031b5e00031bbe00031bf200031c4a0003
-1c7e00031cda00031d7800031e4600031f660003202e000320be00032154
-000323400003253c000326b400032830000329da00032b8c00032c740003
-2daa00032ea200032fb4000330d20003320800033372000334e000033676
-000337f2000339020003391200033a3e00033b7a00033cbc00033e400003
-3f1a00033f9000034046000340ec0003425c000342940003430e000343d0
-0003448a000344f2000345f80003472e000347fa00034958000349d20003
-4a4c00034b1800034bd200034c8600034ce200034d3c00034d8400034df4
-00034e7000034eba00034ef400034f3a00034f7e00034fd0000350220003
-50a40003512600035168000351a8000351de000352140003524200035270
-000352a4000352d80003531a0003535c00035398000353d40003540e0003
-54480003547a000354ac000354de000355100003554a00035584000355c6
-000356080003564a0003568c000356da000357280003576a000357ac0003
-57ec0003582c00035866000358a0000358ec0003593800035976000359b6
-000359fc00035a4200035a7e00035ad400035b1000035b4c00035b8c0003
-5bcc00035c0800035c4400035c8400035cc400035d0800035d4c00035da0
-00035e2e00035e7000035eb200035f1a00035f8200035fb400035fe60003
-601e00036056000360ec00036182000361cc00036216000362520003628e
-000362e40003633a00036384000363ce000364260003647e000364be0003
-64fe000365360003656e000365b800036602000366400003667e000366c0
-0003670200036756000367aa000367f0000368360003687c000368c20003
-69180003696e000369c400036a1a00036a6600036ab200036afe00036b4a
-00036bbe00036c3200036ca600036d1a00036d5800036d9600036dd40003
-6e1200036e5000036e8e00036ed200036f1600036f6200036fae0003700e
-0003705a00037098000370e6000371f60003724600037296000372ce0003
-73060003735c000373b2000374260003748a000374cc0003750e00037564
-000375b2000375fe0003764a0003768a000376ca000377120003775a0003
-77c6000378200003785800037890000378d000037910000379e000037adc
-00037b9c00037c8a00037ce000037d3600037d8800037ddc00037e400003
-7ea400037efa00037f5000037fc60003803c0003807e000380c000038102
-0003814400038186000381c80003821e00038274000382c60003831a0003
-83a200038424000384c400038566000385a4000385e2000386200003865c
-0003869a000386d80003871600038752000388360003892200038a380003
-8b5400038c1e00038ce800038de200038edc00038fda000390d8000391f6
-000393140003943a000395600003966200039764000397f6000398880003
-98c6000399040003995e000399b8000399f000039a2800039b3800039b48
-00039b9000039bd800039c3000039c8800039cba00039cec00039d2e0003
-9d7000039daa00039de400039e2800039e6c00039ee400039f5e00039fee
-0003a0320003a0720003a0f40003a1760003a2ce0003a2de0003a32c0003
-a37a0003a3b60003a3f20003a4380003a47e0003a4cc0003a51a0003a56a
-0003a5ba0003a6160003a6720003a7e80003a9500003a9880003a9c20003
-aa0e0003aa5a0003aaac0003aafe0003ab500003aba60003abe20003ac1e
-0003ac740003acc80003ae000003aea00003aeee0003af2e0003af680003
-b0fe0003b3820003b4460003b5dc0003b73a0003b8080003b9ae0003bc02
-0003be3a0003be800003beb20003bf5c0003c0800003c0a40003c13e0003
-c24a0003c35a0003c46a0003c5780003c6fe0003c7300003c7d20003c7fa
-0003c85c0003c8be0003c9200003c9820003c9c00003c9fe0003ca380003
-ca720003ca9e0003caea0003cb240003cb5e0003ccba0003ce0e0003ce1e
-0003cedc0003d0120003d0700003d1880003d3160003d3bc0003d5020003
-d5400003d57e0003d5bc0003d6100003d6380003d6920003d6f60003d73e
-0003d7a00003d8000003d8720003d8ee0003d96a0003d9ec0003da780003
-db040003db8e0003dc0e0003dc480003dc840003dde80003deb20003dee2
-0003df120003e04a0003e19a0003e1aa0003e2980003e36c0003e4640003
-e55a0003e6dc0003e8360003e8460003e95e0003ea0a0003eb4c0003eca2
-0003ecfe0003ee5c0003eeea0003f0900003f2020003f3160003f34e0003
-f3b20003f5620003f6cc0003f72e0003f8960003f99c0003fa520003fafe
-0003fc260003fd140003fdf40003ff34000400600004017a000402ea0004
-046400040474000405540004064a000406fa000407f6000408a2000409ac
-00040a9800040bc200040ce600040dea00040f1800041056000411c20004
-12f80004148c000416340004172c000418400004197200041a6400041a9c
-00041af200041ba000041bb000041c1200041c6e00041cd400041d200004
-1d6000041d9800041dc400041df200041e2c00041f6200041f960004201a
-000420d00004210000042184000421b4000421ec00042384000425100004
-255a00042594000425ea000426360004265c00042682000426c400042706
-0004274800042778000427b0000427e60004281c0004285e0004288e0004
-28be000429b400042ab800042aec00042b2400042b6a00042b9e00042bce
-00042c0600042c3a00042c6e00042c9e00042cce00042d0400042d3a0004
-2d6a00042d9a00042dce00042e0200042e3200042e6200042e9c00042ed0
-00042f0200042f3400042f6800042f9c00042fcc00042ffc0004302a0004
-305800043166000432d2000434060004353a0004356a000435a40004363e
-000437a800043904000439c800043adc00043b0c00043b4000043c380004
-3de800043e4000043eb800043ff400044032000440a4000440d400044104
-0004413e000441c6000441f600044226000443b6000445000004460c0004
-471a000448460004499c00044af800044c5800044d9200044f0400045064
-000450740004522a00045352000453ec0004557400045584000456800004
-58060004595e00045a1000045ae000045bec00045c9600045cce00045cde
-00045d8e00045e3400045eb000046000000460f4000461ea000462f60004
-63ce000464a80004653c0004664e000467de000468fc000469f200046a9c
-00046b4600046c1000046cb800046d8e00046e0a00046e6600046fc80004
-70fc000472980004735a0004745a00047532000476700004771c000477e6
-000478d6000479fc00047ad800047bde00047d1600047e0600047ea40004
-7f960004810600048250000484bc0004858e000486420004871000048804
-000489420004895200048a8600048b9800048ba800048cb400048de40004
-8e3800048fac000490d4000491e80004939a000495ae00049842000499fc
-00049b2800049d0800049eca0004a05c0004a1280004a2c40004a33a0004
-a3e80004a4c40004a5500004a5f20004a6940004a7780004a8b00004ab0c
-0004ac540004ac640004ac740004acd60004ad340004ad960004ae340004
-aecc0004afd00004b0be0004b0ce0004b0de0004b1780004b2120004b24e
-0004b2ca0004b33e0004b3940004b3c80004b44e0004b4da0004b5520004
-b5b00004b64a0004b6dc0004b75c0004b7de0004b8720004b8a60004b908
-0004b9ba0004bb800004bbb80004bd940004bea80004beb80004beee0004
-bf320004bf760004bfba0004bff00004c0220004c0640004c1000004c156
-0004c1fc0004c2740004c2fa0004c36a0004c3cc0004c4520004c4b20004
-c51c0004c5900004c6000004c65e0004c7040004c79c0004c8080004c898
-0004c8f60004c9640004ca0c0004cab80004cb4e0004cbb80004cc3a0004
-cc9e0004cd4a0004ce020004ceae0004cf3c0004cf980004d0040004d05a
-0004d0dc0004d15a0004d1e00004d26c0004d2c60004d3320004d3a20004
-d4120004d4820004d5060004d5960004d5fc0004d6760004d6f20004d76a
-0004d8100004d8ac0004d93c0004d99a0004da380004dab40004db460004
-dbe80004dc920004dd2a0004dd860004dddc0004de440004deea0004df92
-0004e05c0004e1020004e1640004e1bc0004e21c0004e2aa0004e3300004
-e3be0004e41e0004e4820004e4ec0004e5540004e5bc0004e63a0004e6c2
-0004e7560004e7c20004e82a0004e88e0004e9360004e9f00004ea9e0004
-eb2c0004eb8a0004ebf60004ec660004ed0c0004edb60004ee780004ef1a
-0004ef7e0004f00e0004f0800004f1100004f18e0004f20a0004f2760004
-f3040004f3600004f3be0004f4440004f4c00004f5280004f58c0004f5e0
-0004f64e0004f6b60004f7340004f7aa0004f8240004f8a40004f9000004
-f9660004f9ca0004fa6a0004fb0c0004fbc20004fc720004fcce0004fd46
-0004fda40004fe2e0004fec60004ff560004ffbc0005001a000500a80005
-011a000501ae00050246000502b6000503260005039e000503fc0005045c
-000504d60005053000050590000505ea00050646000506ae0005073c0005
-0772000507aa0005083600050860000508a20005093600050a2400050ab4
-00050aea00050b3a00050bac00050c5800050cea00050d4200050d9c0005
-0df400050e4e00050ed200050f5800050ffc000510a4000510e200051152
-000511e60005127e00051314000513be000513f000051440000514940005
-14da0005157e000516080005168e000516ee000517320005178000051820
-000518b000051950000519f600051a9c00051b6000051b9200051bbc0005
-1c4200051cf200051d2400051d4c00051e1a00051e7800051f1200051f60
-00051fc60005206e000520dc00052142000521ce00052240000522b60005
-236a000523c40005243400052470000524c200052548000525a80005264c
-0005272c00052854000529e400052a4000052a9600052dbc00052e560005
-2eb200052efa00053068000531ba000532000005330e000533a6000534b4
-000535be0005366000053748000537da000538760005396800053a680005
-3ae400053b6a00053bb200053d2400053e8000053f6400053fb400053fe8
-000540d6000541fe00054398000544c8000545de000547120005482e0005
-489c0005493000054a7000054b2600054c9000054dc000054ef20005501e
-000550ca0005519000055262000553bc0005553c0005566c000557880005
-594200055a9400055b8000055c5c00055d1e00055e8800055fd800055fe8
-00055ff800056008000560c000056176000561b2000561e8000562200005
-6256000563e2000565f6000566e0000567f80005697000056ade00056bc8
-00056cfa00056e4200056fc800057166000572ba000574a80005766e0005
-78a400057af200057bda00057cb600057dfe00057f800005806800058182
-000581c40005820e0005842a000586420005878e0005890400058b620005
-8d6400058de800058e1800058e6400058f2c00058ffc0005919000059218
-00059280000592c0000592fe000594b0000596e000059816000599f80005
-9ad400059bee00059d9a00059fa60005a0a80005a1940005a3860005a58e
-0005a6fa0005a87e0005a9de0005ab4c0005abda0005ac6a0005ad840005
-ae900005b0520005b1be0005b3ae0005b5780005b60c0005b6a80005b73e
-0005b7c60005b8ac0005b9840005bb1e0005bcb00005bcd60005bcfc0005
-bd0c0005bd3c0005bd6c0005bee60005c0880005c1320005c2140005c2d4
-0005c37e0005c4180005c4fa0005c5b80005c6940005c84a0005c9840005
-ca100005ca400005ca700005caa40005cad80005cae80005caf80005cb28
-0005cb580005cb8c0005cbc00005cbf40005cc280005cc5c0005cc900005
-ce0a0005ce1a0005ce4a0005ce7a0005ceb20005cee60005cf1a0005cf4e
-0005cf820005cfb60005cfea0005d0220005d0580005d0880005d0c80005
-d1000005d1480005d18e0005d1c20005d1f60005d2300005d2680005d308
-0005d3180005d46a0005d6320005d7d80005d9820005dace0005dbe40005
-dcf20005de080005df020005dfea0005e10c0005e2080005e2e00005e3d0
-0005e48c0005e53e0005e6080005e67a0005e7200005e7b00005e8140005
-e9220005e9880005ea360005eb2c0005eb940005ebfc0005ecac0005ee86
-0005ef8a0005f00a0005f0480005f0f40005f1820005f26a0005f3020005
-f3680005f4660005f5280005f5e20005f6200005f6b00005f7b20005f846
-0005f88a0005f9a80005fad20005fcb40005fe760005ffac000600da0006
-01da000602020006022a0006026000060292000602be000602e60006030e
-0006033c0006039a000604080006044000060478000604a8000604ce0006
-0502000605380006055e00060584000605b2000605e00006060c00060682
-000606aa0006070c00060732000607580006077e000607a4000607d40006
-0804000608340006086e0006089e000608d400060904000609360006095c
-00060982000609b6000609ec00060a1c00060a4c00060a7200060a980006
-0abe00060aec00060b2000060ba600060bea00060c2400060c5800060c9c
-00060cd600060d1000060d3600060d6000060dac00060dee00060e140006
-0e4200060e6800060e8e00060ece00060f0000060f3000060f6000060f86
-00060fac00060fdc0006100c00061032000610580006107e000610a40006
-10ca000610f000061118000611a0000611ca0006123e00061266000612dc
-000613040006136600061398000613ca000613fa00061432000614640006
-1492000614cc000614f40006155400061596000615c6000615f200061622
-000616520006167a000616a2000616ca0006172c00061754000617b20006
-17f60006183a0006186a000618a0000618c6000618ee000619140006193c
-000619620006198a000619b2000619dc00061a0200061a2800061a4e0006
-1a8000061aa800061b2e00061b5800061bc200061bf200061c2200061c48
-00061c6e00061cc600061cf600061d3200061d5c00061d8c00061dbc0006
-1df000061e2400061e5400061e9400061ece00061f1600061f3c00061f62
-00061f8800061fae00061fd4000620140006205400062090000620c00006
-20f0000621200006215000062188000621c000062200000622400006227a
-000622b4000622f00006232e00062378000623c2000624080006244e0006
-2490000624d20006250200062532000625660006259a000625d40006260e
-0006265a000626a6000626fe00062756000627ae0006280c0006283c0006
-286c000628a2000628d80006290e0006294a0006297e000629b200062a06
-00062a5a00062aae00062b0200062b5600062baa00062c0200062c5a0006
-2c8800062cb600062ce800062d1a00062d6000062da600062dd800062e0a
-00062e5c00062eb400062ef800062f3c00062f8000062fc4000630180006
-306c0006309c000630cc000631020006313800063176000631bc00063210
-0006325a000632ac000632fe0006335e000633be000633ee000634200006
-345a00063494000634e60006353a00063584000635cc0006360e00063678
-000636c6000637120006374400063776000637aa000637de000638140006
-384a00063888000638be000638f00006392c00063982000639d800063a36
-00063a9400063aea00063b4000063b7400063ba400063be800063c1e0006
-3c4e00063c9200063cd000063d0800063d4000063d7600063db200063de2
-00063e1e00063e5e00063ea400063eee00063f3a00063f8600063fdc0006
-403200064080000640ce0006411c0006416c000641c8000642240006427c
-000642d4000643280006437c000643be0006440000064448000644900006
-44d8000645260006456a000645ae000646140006467a000646e000064746
-000647ac000648120006487c000648e60006492e00064976000649be0006
-4a0600064a5200064a9e00064af200064b3e00064b8200064bd000064c38
-00064ca000064d1000064d8000064de800064e5000064e9000064ece0006
-4f1800064f4200064f8800064fc00006500e0006503e0006506e000650aa
-000650de000651040006515800065196000651ea000652d0000653f80006
-543a00065460000654b6000654e60006552800065570000655be00065608
-000656580006567e000657660006584a0006599c000659ca000659f80006
-5a8c00065b1200065b4000065bca00065bfa00065c2a00065c7800065cc6
-00065daa00065e8600065fca00065ffa0006602a000660c0000661480006
-6178000661a8000661d80006626800066298000662c80006631a00066362
-000663b80006644e000664e60006655a000665ac000665d60006662c0006
-6660000666aa000666e20006673200066770000667bc000667e20006685e
-000668b0000669c200066bcc00066d8000066f0200067074000673160006
-75e6000677a6000678ec00067b4600067c8800067e9e00067ef000067f40
-00067f9600067fec0006804e000680d600068324000684b6000686c20006
-87de0006899200068b1400068bd400068cb600068d1e00068d8000068df6
-00068e5e00068f0a00068f7a0006900a0006911e000691e20006922e0006
-92c40006937000069414000694be000695080006954a000695c000069628
-000696b800069766000697d0000698340006989a00069954000699ea0006
-9a4800069a7200069a9c00069aac00069abc00069b7e00069c8200069e8c
-00069fe200069ff20006a0a20006a1860006a1e60006a1f60006a2520006
-a2b00006a3d00006a4be0006a4ce0006a4de0006a4ee0006a4fe0006a5e4
-0006a6e40006a8bc0006aa780006ab7e0006abf80006ac720006ad240006
-ad340006ae420006ae520006ae620006af240006b0580006b1440006b154
-0006b1640006b1740006b2da0006b4460006b5720006b5820006b5920006
-b5a20006b5b20006b6940006b6a40006b8060006b9100006ba0e0006bb46
-0006bc180006bc960006bd140006be340006beb00006befc0006bf880006
-c09c0006c0f00006c2320006c2f20006c3be0006c4b40006c5be0006c670
-0006c7d60006c83c0006c9000006cb020006cc900006ce0e0006cf3e0006
-d1f00006d3320006d4600006d5d80006d7500006d8d00006da5e0006dc10
-0006dc7e0006dde20006df1a0006e01e0006e1540006e2860006e3560006
-e4260006e5820006e65c0006e6fc0006e8000006e92a0006ea280006eba8
-0006ed120006ee500006efc80006f1140006f1f60006f25e0006f3000006
-f3a00006f49e0006f6060006f7400006f8d40006fa1e0006fb020006fb60
-0006fc660006fcfc0006fdbe0006fe640006fea400070050000701220007
-01e800070310000704b0000705bc00070614000707ac0007083a0007084c
-0007087c000708ac000708e40007091c000709520007098e000709c40007
-0a0000070b6e00070bb800070c5200070cea00070d6400070de800070e4e
-00070efa00070f46000710660007111c000711f20007122a000712680007
-12dc000713d6000714f4000715f6000716380007167a000716e8000716f8
-000717080007171800071728000717380007174800071758000717680007
-17780007178800071798000717980007191c0007192c000719ec00071ab2
-00071be800071dde00071fe0000721dc00072412000726120007267e0007
-27900007292200072a7a00072b2c00072b7000072c0e00072d3e00072d8e
-00072e2400072f6000072f70000731260007325a000732aa000733000007
-33c20007340600073448000734ce0007352c0007361e000736ac000736e2
-0007375c000737d4000738240007393000073a2600073ad000073afa0007
-3b2400073b4e00073b7800073bb800073bf800073c3000073c6800073cb2
-00073cfc00073d3c00073d7c00073dc600073e1000073e5000073e900007
-3eea00073f4400073f7e00073fb800073ffc0007404000074084000740c8
-0007411c00074170000741bc00074208000742460007428a000742da0007
-432a00074384000743e20007440c00074436000744d00007456a000745ae
-000745f2000747080007471800074760000747a8000747fa0007484c0007
-48b60007490a00074956000749b400074a3e00074aa200074ae600074b30
-00074b9800074be200074c2200074c6a00074ca600074ce200074d1e0007
-4d5800074d9a00074ddc00074e1c00074e5c00074ea600074ef000074f46
-00074f9e00074fec0007503a0007507c000750ca0007510c000751560007
-5198000751dc0007523800075294000752e00007532c00075376000753c0
-000753fe0007543c000754ba0007553800075572000755ac000756460007
-56e0000757b400075888000758e400075940000759b400075a2800075b86
-00075b9600075c8000075c9000075cc600075cfc00075d3600075d700007
-5dac00075de800075e2e00075e7400075fda00076190000762dc0007649a
-00076610000767b8000768e8000769ee00076c0c00076d5000076ee60007
-706e000770ec0007723000077438000774cc00077560000776b4000777de
-0007795800077a9800077c0400077cf200077ebc00078050000780d20007
-8204000782ee0007845600078538000786ee000787e00007894200078a7e
-00078b7200078d3600078ebe00079062000791c600079362000795200007
-96a600079742000798b6000799a800079a9000079c1000079d6200079e82
-0007a01a0007a1f00007a37e0007a4280007a4de0007a6900007a7340007
-a7c20007a80e0007a85a0007a8d20007a9b00007aa2a0007aacc0007ab20
-0007ac840007adb00007aec20007afc40007b08c0007b2000007b3400007
-b5660007b6100007b73a0007b83e0007b9de0007baca0007bbc40007bcc2
-0007bda80007bec20007c07c0007c22a0007c3980007c4100007c4840007
-c5a20007c6260007c7280007c8b40007ca2c0007cb620007cc6c0007cde2
-0007cf5a0007d14c0007d33a0007d5000007d5740007d6240007d6da0007
-d78a0007d8480007d9420007da460007db400007dc4c0007dcd40007dd62
-0007ddea0007de7e0007df5a0007e0500007e1340007e22a0007e2be0007
-e37a0007e40e0007e4cc0007e5bc0007e6c40007e7c20007e8d60007e9f8
-0007eb0c0007ec4c0007ed860007eea80007efbc0007f1000007f2540007
-f4680007f61a0007f6ce0007f7ea0007f8c00007f9de0007fabc0007fc50
-0007fd0a0007fda60007fe980007ff800008006c000800ea000801e40008
-03220008044e00080482000804c6000804d600080576000806180008070e
-000807fa000808d4000809ac00080b0a00080c6a00080d0800080d9e0008
-0ddc00080e1c00080e5a00080e9a00080ef400080f4c00080fa60008100a
-0008109600081292000812e20008140e0008149400081514000815ee0008
-16c2000817c6000819b200081aca00081b3a00081bca00081c8c00081d5e
-00081dca00081e4800081f9c00081fe2000820280008210c000821480008
-21a6000821e4000822160008225a0008229c000822cc000100000d3500f2
-003c009d000700020010002f005600000468041d0005000200>
-<0000003a02be0000000300000000006a00000000000300000001000a006a
-0000000300000002000e00740000000300000003005e0082000000030000
-0004000a00e00000000300000005001800ea0000000300000006000e0102
-000000030000000700ba01100000000300000008003001ca000000030000
-0009008a01fa000000030000000d02aa028400010000000000000035052e
-000100000000000100050563000100000000000200070568000100000000
-0003002f056f00010000000000040005059e0001000000000005000c05a3
-0001000000000006000705af0001000000000007005d05b6000100000000
-00080018061300010000000000090045062b000100000000000d01550670
-0003000104030002000c07c50003000104050002001007d1000300010406
-0002000c07e10003000104070002001007ed0003000104080002001007fd
-0003000104090000006a080d0003000104090001000a0877000300010409
-0002000e08810003000104090003005e088f0003000104090004000a08ed
-0003000104090005001808f70003000104090006000e090f000300010409
-000700ba091d0003000104090008003009d70003000104090009008a0a07
-000300010409000d02aa0a9100030001040a0002000c0d3b00030001040b
-000200100d4700030001040c0002000c0d5700030001040e0002000c0d63
-0003000104100002000e0d6f000300010413000200120d7d000300010414
-0002000c0d8f000300010415000200100d9b0003000104160002000c0dab
-0003000104190002000e0db700030001041b000200100dc500030001041d
-0002000c0dd500030001041f0002000c0de10003000104240002000e0ded
-00030001042a0002000e0dfb00030001042d0002000e0e0900030001080a
-0002000c0e170003000108160002000c0e23000300010c0a0002000c0e2f
-000300010c0c0002000c0e3b00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0052006500670075006c00610072004d006f006e006f
-0074007900700065003a0041007200690061006c00200052006500670075
-006c00610072003a00560065007200730069006f006e00200035002e0030
-003100200028004d006900630072006f0073006f00660074002900410072
-00690061006c00560065007200730069006f006e00200035002e00300031
-0041007200690061006c004d00540041007200690061006c002000690073
-00200061002000740072006100640065006d00610072006b0020006f0066
-00200054006800650020004d006f006e006f007400790070006500200043
-006f00720070006f0072006100740069006f006e00200069006e00200074
-0068006500200055006e0069007400650064002000530074006100740065
-007300200061006e0064002f006f00720020006f00740068006500720020
-0063006f0075006e00740072006900650073002e0054006800650020004d
-006f006e006f007400790070006500200043006f00720070006f00720061
-00740069006f006e004d006f006e006f0074007900700065002000540079
-00700065002000440072006100770069006e00670020004f006600660069
-006300650020002d00200052006f00620069006e0020004e006900630068
-006f006c00610073002c0020005000610074007200690063006900610020
-005300610075006e0064006500720073002000310039003800320059006f
-00750020006d006100790020007500730065002000740068006900730020
-0066006f006e007400200074006f00200064006900730070006c00610079
-00200061006e00640020007000720069006e007400200063006f006e0074
-0065006e00740020006100730020007000650072006d0069007400740065
-006400200062007900200074006800650020006c006900630065006e0073
-00650020007400650072006d007300200066006f00720020007400680065
-002000700072006f006400750063007400200069006e0020007700680069
-006300680020007400680069007300200066006f006e0074002000690073
-00200069006e0063006c0075006400650064002e00200059006f00750020
-006d006100790020006f006e006c0079002000280069002900200065006d
-0062006500640020007400680069007300200066006f006e007400200069
-006e00200063006f006e00740065006e0074002000610073002000700065
-0072006d0069007400740065006400200062007900200074006800650020
-0065006d00620065006400640069006e0067002000720065007300740072
-0069006300740069006f006e007300200069006e0063006c007500640065
-006400200069006e0020007400680069007300200066006f006e0074003b
-00200061006e006400200028006900690029002000740065006d0070006f
-0072006100720069006c007900200064006f0077006e006c006f00610064
-0020007400680069007300200066006f006e007400200074006f00200061
-0020007000720069006e0074006500720020006f00720020006f00740068
-006500720020006f00750074007000750074002000640065007600690063
-006500200074006f002000680065006c00700020007000720069006e0074
-00200063006f006e00740065006e0074002ea9203230303620546865204d
-6f6e6f7479706520436f72706f726174696f6e2e20416c6c205269676874
-732052657365727665642e417269616c526567756c61724d6f6e6f747970
-653a417269616c20526567756c61723a56657273696f6e20352e30312028
-4d6963726f736f667429417269616c56657273696f6e20352e3031417269
-616c4d54417269616c20697320612074726164656d61726b206f66205468
-65204d6f6e6f7479706520436f72706f726174696f6e20696e2074686520
-556e697465642053746174657320616e642f6f72206f7468657220636f75
-6e74726965732e546865204d6f6e6f7479706520436f72706f726174696f
-6e4d6f6e6f7479706520547970652044726177696e67204f666669636520
-2d20526f62696e204e6963686f6c61732c20506174726963696120536175
-6e646572732031393832596f75206d617920757365207468697320666f6e
-7420746f20646973706c617920616e64207072696e7420636f6e74656e74
-206173207065726d697474656420627920746865206c6963656e73652074
-65726d7320666f72207468652070726f6475637420696e20776869636820
-7468697320666f6e7420697320696e636c756465642e20596f75206d6179
-206f6e6c792028692920656d626564207468697320666f6e7420696e2063
-6f6e74656e74206173207065726d69747465642062792074686520656d62
-656464696e67207265737472696374696f6e7320696e636c756465642069
-6e207468697320666f6e743b20616e6420286969292074656d706f726172
-696c7920646f776e6c6f6164207468697320666f6e7420746f2061207072
-696e746572206f72206f74686572206f7574707574206465766963652074
-6f2068656c70207072696e7420636f6e74656e742e004e006f0072006d00
-61006c006f00620079010d0065006a006e00e9006e006f0072006d006100
-6c005300740061006e0064006100720064039a03b103bd03bf03bd03b903
-ba03ac00a90020003200300030003600200054006800650020004d006f00
-6e006f007400790070006500200043006f00720070006f00720061007400
-69006f006e002e00200041006c006c002000520069006700680074007300
-2000520065007300650072007600650064002e0041007200690061006c00
-52006500670075006c00610072004d006f006e006f007400790070006500
-3a0041007200690061006c00200052006500670075006c00610072003a00
-560065007200730069006f006e00200035002e0030003100200028004d00
-6900630072006f0073006f0066007400290041007200690061006c005600
-65007200730069006f006e00200035002e00300031004100720069006100
-6c004d00540041007200690061006c002000690073002000610020007400
-72006100640065006d00610072006b0020006f0066002000540068006500
-20004d006f006e006f007400790070006500200043006f00720070006f00
-72006100740069006f006e00200069006e00200074006800650020005500
-6e0069007400650064002000530074006100740065007300200061006e00
-64002f006f00720020006f007400680065007200200063006f0075006e00
-740072006900650073002e0054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-4d006f006e006f0074007900700065002000540079007000650020004400
-72006100770069006e00670020004f006600660069006300650020002d00
-200052006f00620069006e0020004e006900630068006f006c0061007300
-2c0020005000610074007200690063006900610020005300610075006e00
-64006500720073002000310039003800320059006f00750020006d006100
-7900200075007300650020007400680069007300200066006f006e007400
-200074006f00200064006900730070006c0061007900200061006e006400
-20007000720069006e007400200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-200074006800650020006c006900630065006e0073006500200074006500
-72006d007300200066006f00720020007400680065002000700072006f00
-6400750063007400200069006e0020007700680069006300680020007400
-680069007300200066006f006e007400200069007300200069006e006300
-6c0075006400650064002e00200059006f00750020006d00610079002000
-6f006e006c0079002000280069002900200065006d006200650064002000
-7400680069007300200066006f006e007400200069006e00200063006f00
-6e00740065006e00740020006100730020007000650072006d0069007400
-7400650064002000620079002000740068006500200065006d0062006500
-6400640069006e0067002000720065007300740072006900630074006900
-6f006e007300200069006e0063006c007500640065006400200069006e00
-20007400680069007300200066006f006e0074003b00200061006e006400
-200028006900690029002000740065006d0070006f007200610072006900
-6c007900200064006f0077006e006c006f00610064002000740068006900
-7300200066006f006e007400200074006f00200061002000700072006900
-6e0074006500720020006f00720020006f00740068006500720020006f00
-750074007000750074002000640065007600690063006500200074006f00
-2000680065006c00700020007000720069006e007400200063006f006e00
-740065006e0074002e004e006f0072006d0061006c004e006f0072006d00
-610061006c0069004e006f0072006d0061006c004e006f0072006d00e100
-6c004e006f0072006d0061006c0065005300740061006e00640061006100
-720064004e006f0072006d0061006c004e006f0072006d0061006c006e00
-79004e006f0072006d0061006c041e0431044b0447043d044b0439004e00
-6f0072006d00e1006c006e0065004e006f0072006d0061006c004e006f00
-72006d0061006c004e0061007600610064006e006f0074006801b001a103
-00006e00670041007200720075006e00740061004e006f0072006d006100
-6c004e006f0072006d0061006c004e006f0072006d0061006c004e006f00
-72006d0061006c000000b900540328b326181fd0bc032900e00329000203
-29b22b1d1fb90327031db23b1f40b80323b31215320f412d03200001002f
-0320000100200320006f032000af032000bf03200004005f031e00010010
-031e007f031e0080031e00af031e00bf031e00d0031e00060000031e0010
-031e0020031e006f031e009f031e00e0031e0006031d031cb2201f104127
-0319007f03190002000f031700ef031700ff03170003001f0317002f0317
-004f0317005f0317008f0317009f03170006000f0317005f0317006f0317
-007f031700bf031700f00317000600400317b2923340b80317b28b3340b8
-0317b36a6c3240b80317b2613340b80317b35c5d3240b80317b357593240
-b80317b34d513240b80317b344493240b80317b23a3340b80317b3313432
-40b80317b32e423240b80317b3272c3240b80317b312253280b80317b30a
-0d32c04116031600d00316000200700316000102c4000f0101001f00a003
-1500b0031500020306000f0101001f00400312b32426329fbf0304000103
-0203010064001fffc00301b20d1132410a02ff02ef0012001f02ee02ed00
-64001fffc002edb30e11329f414a02e200af02e200bf02e2000302e202e2
-02e102e1007f02e00001001002e0003f02e0009f02e000bf02e000cf02e0
-00ef02e0000602e002e002df02df02de02de000f02dd002f02dd003f02dd
-005f02dd009f02dd00bf02dd00ef02dd000702dd02dd001002dc00010000
-02dc0001001002dc003f02dc000202dc02dc001002db000102db02db000f
-02da000102da02daffc002d3b2373932b9ffc002d3b22b2f32b9ffc002d3
-b21f2532b9ffc002d3b2171b32b9ffc002d3b2121632b802d2b2f9291fb9
-0326031cb23b1f40bb0322003e00330322b225311fb80318b23c691fb802
-e3b3202b1fa0413002d400b002d40002000002d4001002d4002002d40050
-02d4006002d4007002d40006006002d6007002d6008002d6009002d600a0
-02d600b002d60006000002d6001002d6002002ca002002cc002002d60030
-02d6004002d6005002d6000802d0b2202b1fb802cfb226421f411602ce02
-c70017001f02cd02c80017001f02cc02c60017001f02cb02c50017001f02
-c902c5001e001f02ca02c6b21e1f00410b02c6000002c7001002c6001002
-c7002f02c5000502c1b324121fff411102bf0001001f02bf002f02bf003f
-02bf004f02bf005f02bf008f02bf000602bf0222b2641f12410b02bb00ca
-0800001f02b200e90800001f02a600a20800406a1f402643493240204349
-3240263a3d3240203a3d329f209f26024026969932402096993240268e92
-3240208e92324026848c324020848c3240267a813240207a813240266c76
-3240206c76324026646a324020646a3240265a5f3240205a5f3240264f54
-3240204f5432b8029eb724271f374f6b0120410f02770030027700400277
-00500277000402770277027700f90400001f029bb22a2a1fb8029a402b29
-2a1f80ba0180bc0180520180a201806501807e01808101803c01805e0180
-2b01801c01801e0180400180bb0138000100800140b40180400180bb0138
-00010080013940180180ca0180ad01807301802601802501802401802001
-3740b80221b2493340b80221b2453340b80221b341423240b80221b33d3e
-320f410f0221003f0221007f0221000300bf022100cf022100ff02210003
-00400221b320223240b80221b3191e3240b80222b32a3f3240b80221b32e
-3a326f414802c3007f02c3008f02c300df02c30004002f02c3006002c300
-cf02c30003000f02c3003f02c3005f02c300c002c300ef02c300ff02c300
-0600df02220001008f02220001000f0222002f0222003f0222005f022200
-7f022200ef0222000600bf022100ef02210002006f0221007f022100af02
-210003002f0221003f0221004f0221000302c302c3022202220221022140
-1d101c102b1048038f1c010f1e014f1eff1e023700161600000012110811
-b8010db6f70df8f70d00094109028e028f001d001f0290028f001d001f02
-8fb2f91d1fb80198b226bb1f41150197001e0401001f013900260125001f
-013800730401001f0135001c0801001f0134001c02ab001f0132b21c561f
-b8010fb2262c1fba010e001e0401b61ff91ce41fe91cb80201b61fe81cbb
-1fd720b80401b21fd51cb802abb61fd41c891fc92fb80801b21fbc26b801
-01b21fba20b80201b61fb91c381fadcab80401b21f8126b8019ab21f7e26
-b8019ab61f7d1c471f6b1cb80401b21f6526b8019ab21f5e73b80401400f
-1f52265a1f481c891f441c621f4073b80801b61f3f1c5e1f3c26b8019ab2
-1f351cb80401b61f301cbb1f2b1cb80401b61f2a1c561f291cb80101b21f
-231eb80401b21f5537b80168402c07960758074f07360732072c0721071f
-071d071b071408120810080e080c080a080808060804080208000814b8ff
-e0402b000001001406100000010006040000010004100000010010020000
-01000200000001000002010802004a00b013034b024b5342014bb0c06300
-4b6220b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807
-ff52b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ff
-b101018e851bb0124358b900010111858d1bb900010128858d5959001816
-763f183f123e113946443e113946443e113946443e113946443e11394660
-443e11394660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b2b
-182b1db0964b5358b0aa1d59b0324b5358b0ff1d594bb09353205c58b901
-f201f04544b901f101f045445958b9033e01f2455258b901f2033e445959
-4bb8015653205c58b9002001f14544b9002601f145445958b9081e002045
-5258b90020081e4459594bb8019a53205c58b9002501f24544b9002401f2
-45445958b909090025455258b9002509094459594bb8040153205c58b173
-244544b1242445445958b917200073455258b9007317204459594bb80401
-53205c58b1ca254544b1252545445958b9168000ca455258b900ca168044
-59594bb03e53205c58b11c1c4544b11e1c45445958b9011a001c455258b9
-001c011a4459594bb05653205c58b11c1c4544b12f1c45445958b9018900
-1c455258b9001c01894459594bb8030153205c58b11c1c4544b11c1c4544
-5958b90de0001c455258b9001c0de04459592b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65
-422b2b01b33b59635c456523456023456560234560b08b766818b0806220
-20b163594565234520b003266062636820b003266165b059236544b06323
-4420b13b5c4565234520b003266062636820b003266165b05c236544b03b
-2344b1005c455458b15c406544b23b403b4523614459b347503437456523
-456023456560234560b089766818b080622020b134504565234520b00326
-6062636820b003266165b050236544b034234420b147374565234520b003
-266062636820b003266165b037236544b0472344b10037455458b1374065
-44b24740474523614459004b5342014b5058b108004259435c58b1080042
-59b3020b0a124358601b2159421610703eb0124358b93b21187e1bba0400
-01a8000b2b59b00c2342b00d2342b0124358b92d412d411bba0400040000
-0b2b59b00e2342b00f2342b0124358b9187e3b211bba01a80400000b2b59
-b0102342b0112342002b7475737500184569444569444569447373737374
-757374752b2b2b2b74752b2b2b2b2b737373737373737373737373737373
-737373737373737373732b2b2b45b0406144737400004bb02a534bb03f51
-5a58b1070745b040604459004bb03a534bb03f515a58b10b0b45b8ffc060
-4459004bb02e534bb03a515a58b1030345b040604459004bb02e534bb03c
-515a58b1090945b8ffc06044592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b752b2b2b2b2b2b2b435c58b9008002bbb301401e017400735903b01e4b
-5402b0124b545ab012435c5a58ba009f02220001007359002b7473012b01
-732b2b2b2b2b2b2b2b737373732b2b2b2b2b002b2b2b2b2b2b0045694473
-456944734569447374754569447345694445694445694473744569444569
-44732b2b2b2b2b732b002b732b74752b2b2b2b2b2b2b2b2b2b2b2b2b2b73
-7475732b7374757374752b2b2b742b2b000000>
-[15785 15901 16277 16325 16277 16273 15933 16169 16277 15721 16361 15561 15973
-16029 16305 15693 16345 16249 15893 15629 16365 15481 16245 16249 16357 16337
-15821 15749 16345 15937 16257 16033 19077 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-2 3242 17 <000100ba0000018700cd000300254018023c000a023c5f006f007f00af00
-04a0000100a004a198182b10f65d5ded003fed313033353315bacdcdcd00
->ArialMT AddT42Char 
-3 4240 68 <0002004affe8041c043e00280037022d402c090d092a190d1a2a290d2a2a
-390d3615371b3a2a492a5d0d5d2a6a0d692a60308a0d86299a169b1aa90d
-1528b8ffe8b40b0b065527b8ffe840190b0b0655a619aa28b619bb28c419
-cf28d215dd28084416011eb8fff440110c0c065512120c0c0655050c0c0c
-065535b8ffe040550c0c06551f171f182b2c2a343904392c4904482c5608
-592b6608692b760c870cc90cf90df92b1137340e0104102f243417322114
-185f296f2902291c2f0e3f0e8f0e9f0eff0e059f0eaf0eef0e030e0c0f0f
-02550eb8ffeab4101002550eb8fff44015101006550e0c0d0d06550e060f
-0f06550e0e1c0317b802aab61895141c1c0700b8fff4401a0c0c06550045
-270a321c030b2961106100060d0d025500252124b8ffecb41010025524b8
-ffec400b0d0d025524040c0c025524b8ffe4b40b0b025524b8fff4b40b0b
-065524b8ffdc400b1010065524060f0f065524b8fffcb40c0c065524b802
-5b400e27400026102620263026af260539b8ffc0b40e0e025526b8ffd6b6
-0e0e0255263139b8ffc0400d1e23343039c03902a039013917b8fff44041
-10100655172518222f24bf06cf06021f063f0602060e0f0f0255060c0d0d
-025506180c0c0255060c0b0b0255060c0b0b0655060e0d0d065506100c0c
-065506313810f62b2b2b2b2b2b2b5d71edf4ed2b105d712bf62b2b5dedf4
-2b2b2b2b2b2b2b2b3cfd2be5e5003fed3fe42b3fedfde41112392f2b2b2b
-2b2b5d71ed711112391112393901111217393130005d2b2b2b2b01715d2b
-2b0071250606232226353436363736373637363534272623220607273e02
-333216161716151514161723260306070e02151416333236373635033c64
-b96aafbc477348356bda67013345887f791db0186ed08988aa5010091722
-bc1c1762c46f5c326d6968a2261d835546ab854e814e140e0d1a24250a6e
-2d3d597118718b4b40614a2e78f0fb853d3801dd281c10284d2f48605b4f
-3d77>ArialMT AddT42Char 
-3 4962 69 <00020086ffe8041f05ba0010001d0180409b01050c0f240535054505053f
-1fb01f021f1f221c331c421c701f901f063a133c163c1a4c164c1a5d085d
-0d580f5d165e1a6a086c0d680f6e166e1ac01fd90cda17da19e213ec17ec
-19e31de01fff1f1920052f0f2f1430053f0f40054c0f50056605da1df504
-fa100c10150e040602001b1c0607010a151c0e0b1824d00b01100b400b60
-0b800b041f400d0d02550b0c0f0f02550b180d0d02550bb8fff6b40c0c02
-550bb8fff0b40b0b06550bb8fff4b40f0f06550bb8ffe0b40c0c06550bb8
-fff4402f0d0d06550b7401113300040c0c025500040d0d06550033032502
-02c001019001a001b001f001041f013f014f010301b8fffeb41010025501
-b8fffc401d0e0e0255010c0d0d025501100c0c025501120b0b0255010c0b
-0b065501b8fff8b41010065501b8fffc40160f0f065501180c0c06550114
-0d0d065501191e4737182b4e10f42b2b2b2b2b2b2b2b2b2b5d71723c4d10
-fdf42b2be410fd2b2b2b2b2b2b2b2b5d71ed003fed3f3fed3f1139111239
-3130005d015d7172007121231133113633321e0215100023222703141716
-333236353426232206012da7b472b162af7140fef2bdbc6b0234559176ac
-a57576ac05bafdf58f4f8fca73feeffed69d0196bf558bcdcbd0c6cd>ArialMT AddT42Char 
-3 5440 70 <00010050ffe803ed043e001a015ab1020243545840340e7f0f010f0b0140
-0050007000030004121c0b07181c040b010e1507080e0e0255070c0d0d02
-55070c0c0c025507100b0b0255072f2b2b2b2bcdd4c6003fed3fed10c45d
-3210c45d3231301b4047090c011f1c4313431753135317601360179b029b
-039a0da410a41a0c080d190a6a0269036a05750c700d800da60cb509b60a
-b50c0c160c860ce302030e225f0f6f0f7f0f030f01b802aa407930004000
-5000600070009000a000e000f00009000f0f0b000004121c0b07181c040b
-1c0f010f240e080d0d06550e221b000100240b2b1f010100010101400b0b
-065501401010065501480c0c0655011a0d0d065501491c1524cf07011f07
-3f0702070e0b0b0655070a1010065507120c0c065507311b34c4182b10f6
-2b2b2b5d71ed10f62b2b2b2b5d724b53234b515a58b90001ffc03859ed72
-f42bed72003fed3fed12392f11392f105de4105de43130005d71015d7159
-011706062322001134123633321617072626232206151416333236033cb1
-1defaedafef772e989addc1faf197f5a88aaa4846a8e018517b7cf011d01
-0aac010281afa11b6b6cc3d3d6c28200>ArialMT AddT42Char 
-3 8014 76 <000200880000013c05ba0003000700cd405e09360b0b02554f099009a009
-b009c009df09f0090700091f09700980099f09b009c009df09e009ff090a
-1f09010001070402030906037e0100060506040a0607250500049f04a004
-b004c004e00406c004f0040200042004d004e0040404b8fff8b410100255
-04b8fffa40170e0e025504040c0c0255040a0b0b025504140b0b065504b8
-ffeab41010065504b8fffeb40d0d065504b8fffc400a0c0c0655044e0847
-50182b10f62b2b2b2b2b2b2b2b5d71723cfd3c003f3f3c3fed0111123939
-111239393130015d72712b133533150311331188b4b4b404ebcfcffb1504
-26fbda00>ArialMT AddT42Char 
-3 9202 79 <000100830000013705ba000300e3b605360b0b025505b8ffc0b337383405
-b8ffc0b334353405b8ffc0b330313405b8ffc0b322253405b8ffc0402515
-17340f051f059f05df05044f05df05f005031f0570058005ff0504010000
-0a0203250100b8ffc0b337383400b8ffc040153335349f0001c000f00002
-00002000d000e0000400b8fff8b41010025500b8fffa401d0e0e02550004
-0c0c0255000a0b0b025500140b0b065500081010065500b8fffeb40d0d06
-5500b8ffffb40c0c065500b8fffc400a0c0c0655004e044750182b10f62b
-2b2b2b2b2b2b2b2b5d71722b2b3cfd3c003f3f3130015d71722b2b2b2b2b
-2b3311331183b405bafa4600>ArialMT AddT42Char 
-2 0 0 <00020100000005000500000300070000211121112521112101000400fc20
-03c0fc400500fb002004c000>ArialMT AddT42Char 
-ArialMT /CharStrings get begin
-/period 17 def
-/a 68 def
-/b 69 def
-/c 70 def
-/i 76 def
-/l 79 def
-end
-ArialMT /Encoding get
-dup 46 /period put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 105 /i put
-dup 108 /l put
-pop
-end
-%ADOEndSubsetFont
-/KUDFOJ+ArialMT /ArialMT findfont ct_VMDictPut
-/KUDFOJ+ArialMT*1 
-[46{/.notdef}rp /period 50{/.notdef}rp /a /b /c 5{/.notdef}rp /i 
-2{/.notdef}rp /l 147{/.notdef}rp]
-KUDFOJ+ArialMT nf
-KUDFOJ+ArialMT*1 [9 0 0 -9 0 0 ]msf
-48 235.76 mo
-(lab.icc)
-[2.043 5.04 5.04 2.52 2.043 4.563 0 ]xsh
-/KUDFOJ+ArialMT*1 uf
-/KUDFOJ+ArialMT uf
-/ArialMT uf
-.75 lw
-[3 2.25 ] 0 dsh
-18 18 mo
-180 18 li
-180 354 li
-18 354 li
-cp
-@
-%ADOBeginSubsetFont: ArialMT Initial
-ct_T42Dict begin
--0.664 -0.324 2 1.004
- 256 array 0 1 255 {1 index exch /.notdef put} for  /ArialMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f3210325d73000000cc000000606376
-7420a11cd7eb0000012c000006546670676dcc79599a000007800000066e
-676c796607022dca000094e0000822cc68656164d6144b3e00000df00000
-003668686561123315fe00000e2800000024686d7478f65efffb00000e4c
-000034d46c6f6361361cd72000004320000034d86d617870124c05df0000
-77f8000000206e616d659617a74000007818000011057072657025d64dbf
-0000892000000bbe67646972000000000000000000000000000303880190
-00050008059a05330000011b059a0533000003d1006602120805020b0604
-020202020204e0002affc00078430000000900000000544d432000400020
-fffc05d3fe510133073e01b2400001ffffff0000042605bb000000200004
-05ba001905ba001a05a70019042600180000ffe70000ffe80000ffe7fe69
-ffe805ba0019fe69ffe802ea000000b8000000b80000000000a800ad0169
-00ad00bf00c201f0001800af00b900b400c800170044009c007c00940087
-0006005a00c80089005200520005004400940119ffb4002f00a1000300a1
-00cd00170057007e00ba00160118ffe9007f008503d300870085000d0022
-00410050006f008d014cff75005c00df04830037004c006e00700180ff58
-ff8eff92ffa400a500b903c8fffd000b001a0063006300cdffee05d8ffdc
-002d005c0095009900df019209b500400057008000b9039d0072009a035d
-0401ff67fffa00030021007700cd0004004d00cd01c0022b004c006500e7
-0118017c034305d8ffa3ffb0ffc40003001c005d0068009a00ba01350147
-0221055cff4dffcd0016002d00780080009900b200b600b600b800bd00da
-010c05f0ffa4fff00019002c0049007f00b400ce01c003fefd81fe3f0000
-00050018002900390049006f00be00c700d0012301c1026f050c05320540
-057affd4001400310055005700a700b400e601f7027e027e027f03c60446
-ff42000e0085009100bf00c200c500e1011a012f014f01560229026f029e
-03720008002c00310031006400690089009800c700de012b01b6020c02cf
-03a304ab04fb061dfee0ff0e00060026009b009d00c1010d011801200173
-018201d601e30243025f029b02e2039404a904d20761001c005e006d008d
-00ab00f7011201380151015b0168017c01870191019901cd01d001e80241
-0254026b02ef0368037103bd044204420453047304830586058b06e8fe58
-fec4fed1fef7ff32ff860051007c008100910095009e00b400b900cf00d9
-00d900df00e20105010b010e010e012001210155017b017b017e018d01a2
-01a801a901b401d001d001e201e901f201f501fb020002000206021b0221
-022202220223027202770294029c02cf02cf02d002ec02f903170322032b
-0335033c0359036f037103870390039003b503e1041a04cf04ff05320532
-0596059f05a805ab05c205f0060c0782080008ccfca3fd2afddefe00fe88
-fe96feb2feb4ffe100150019001a001c001f003c005100610061006a0078
-009600a500af00d3010c0118011a012a013e014c0151015f016a01710178
-01820184019a01a501a801a901ae01bc01cd01d701ef0200020d021c0221
-0222022e02350242024f024f025e026502710290029202b402d602fa0307
-030b030f0315032a0347035d036503740379039603b003cc03dd03e203f6
-03fc03fc03ff040a041f04220426042b0447045f0475049e04e704e7055c
-05cb05e5060a066d068606b806f10736073e07500751075d078f07b607d4
-086000b600c300b500b700000000000000000000000001e00381034503b5
-008e0233041902ce02ce002d005f0064034d023f000002a80188027d01b4
-02240578063b023b014e00f00426029402c6029f02f6023b034d014b0153
-006a0231000000000000061404aa0000003c04c300ed04bc026502ce03b5
-0078060c017e02ef060c00b201000239000001c50330042b03cb00da03df
-010704a100db040a011701ed02a70350010b01bd043e05580021039c00ae
-0371017d00b5024500000afb088c012b014e01aa00870054013201f803ff
-0003024e00b4003703e30083006b02d800ed00770088009701640467008e
-0033017c00e700a6029e0329056e062a061501c90269048a021301b40002
-04a9000002390124010305140084015d039a06ef02d9007500cf040a00de
-03ac04bc02cf02ae034d04f005520168006d007d00860071ff8100790558
-04d2016700030156002504e00094007c033204210094007f0072005c002f
-00b6001800ba00b80041034d00720018001f004c016a01550099009a009a
-009800b200040078006900140057006e00ce00b4065402b80067050e0165
-00e7000004cbfe52005affa60099ff67006eff92002dffd40087ff7c00b8
-00a800e5008f00a80185fe7b0070001e00d900de014c054602cf0546ff2d
-028a02d90253029600b700000000000000000000000000000125011800ea
-00ea00ae0000003e05bb008a04d70053003fff8cffd50015002800220099
-0062004a00e4006d00ee00e5004803c00033fe4e02b1ff460370007905df
-0051ffa7ff1f010a0068ff6c004f00bc00a507050061072b00ed04b001d2
-00b6007b00650252ff740365fe690094008f005c00400086007500890089
-4043555441403f3e3d3c3b3a3938373534333231302f2e2d2c2b2a292827
-262524232221201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09
-0807060504030201002c4523466020b02660b004262348482d2c45234623
-6120b02661b004262348482d2c45234660b0206120b04660b00426234848
-2d2c4523462361b0206020b02661b02061b004262348482d2c45234660b0
-406120b06660b004262348482d2c4523462361b0406020b02661b04061b0
-04262348482d2c0110203c003c2d2c20452320b0cd442320b8015a515823
-20b08d44235920b0ed51582320b04d44235920b09051582320b00d442359
-21212d2c20204518684420b001602045b04676688a4560442d2c01b10b0a
-432343650a2d2c00b10a0b4323430b2d2c00b0172370b101173e01b01723
-70b10217453ab10200080d2d2c45b01a234445b01923442d2c2045b00325
-456164b050515845441b2121592d2cb00143632362b0002342b00f2b2d2c
-2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b1
-2cc08a8cb8100062602b0c642364615c58b00361592d2c45b0112bb01723
-44b0177ae4182d2c45b0112bb01723442d2cb01243588745b0112bb01723
-44b0177ae41b038a45186920b01723448a8a8720b0a05158b0112bb01723
-44b0177ae41b21b0177ae45959182d2c2d2cb0022546608a46b040618c48
-2d2c4b53205c58b002855958b00185592d2c20b0032545b019234445b01a
-23444565234520b00325606a20b009234223688a6a606120b01a8ab00052
-7921b21a1a40b9ffe0001a45208a54582321b03f1b235961441cb114008a
-5279b31940201945208a54582321b03f1b235961442d2cb110114323430b
-2d2cb10e0f4323430b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2c
-b10e0f432343650b2d2cb11011432343650b2d2c4b525845441b2121592d
-2c0120b003252349b04060b0206320b000525823b002253823b002256538
-008a63381b212121212159012d2c4bb06451584569b00943608a103a1b21
-2121592d2c01b005251023208af500b0016023edec2d2c01b00525102320
-8af500b0016123edec2d2c01b0062510f500edec2d2c20b001600110203c
-003c2d2c20b001610110203c003c2d2cb02b2bb02a2a2d2c00b00743b006
-430b2d2c3eb02a2a2d2c352d2c76b8022323701020b802234520b0005058
-b00161593a2f182d2c21210c6423648bb84000622d2c21b08051580c6423
-648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb815
-55621bb200802f2b59b002602d2c0c6423648bb84000626023212d2cb400
-0100000015b00826b00826b00826b008260f10161345683ab001162d2cb4
-000100000015b00826b00826b00826b008260f1016134568653ab001162d
-2c4b53234b515a5820458a60441b2121592d2c4b545820458a60441b2121
-592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb01343
-58031b02592d2cb0134358021b03592d2c4b54b012435c5a58381b212159
-2d2cb012435c580cb00425b00425060c6423646164b807085158b00425b0
-0425012046b01060482046b0106048590a21211b2121592d2cb012435c58
-0cb00425b00425060c6423646164b807085158b00425b00425012046b8ff
-f060482046b8fff06048590a21211b2121592d2c4b53234b515a58b03a2b
-1b2121592d2c4b53234b515a58b03b2b1b2121592d2c4b53234b515ab012
-435c5a58381b2121592d2c0c8a034b54b00426024b545a8a8a0ab012435c
-5a58381b2121592d2c4b5258b00425b0042549b00425b00425496120b000
-5458212043b0005558b00325b00325b8ffc038b8ffc038591bb040545820
-43b0005458b00225b8ffc038591b2043b0005458b00325b00325b8ffc038
-b8ffc0381bb00325b8ffc03859595959212121212d2c462346608a8a4623
-20468a608a61b8ff8062232010238ab902c202c28a70456020b0005058b0
-0161b8ffba8b1bb0468c59b0106068013a2d2cb1020042b123018851b140
-0188535a58b910000020885458b202010243604259b12401885158b92000
-0040885458b2020202436042b12401885458b2022002436042004b014b52
-58b2020802436042591bb940000080885458b202040243604259b9400000
-8063b80100885458b202080243604259b94000010063b80200885458b202
-100243604259b94000020063b80400885458b20240024360425959595959
-2d2cb0024354584b53234b515a58381b2121591b21212121592d00000001
-00000005028fa58dc35f5f0f3cf5081b080000000000a2e3272a00000000
-c14fd713faaffd671000080c00000009000100010000000000010000073e
-fe4e00431000faaffa7a1000000100000000000000000000000000000d35
-06000100000000000239000002390000023900b002d7005e047300150473
-0049071d0077055600580187005a02aa007c02aa007c031d004004ac0072
-023900aa02aa0041023900ba0239000004730055047300df0473003c0473
-00560473001a047300550473004d047300610473005304730055023900b9
-023900aa04ac007004ac007204ac00700473005a081f006f0556fffd0556
-009605c7006605c7009e055600a204e300a80639006d05c700a4023900bf
-04000037055600960473009606aa009805c7009c063900630556009e0639
-005805c700a10556005c04e3003005c700a105560009078d001905560009
-0556000604e300290239008b023900000239002703c100360473ffe102aa
-00590473004a0473008604000050047300460473004b0239001304730042
-0473008701c7008801c7ffa20400008801c7008306aa0087047300870473
-0044047300870473004802aa00850400003f02390024047300830400001a
-05c700060400000f040000210400002802ac0039021400bc02ac002f04ac
-00570556fffd0556fffd05c70068055600a205c7009c0639006305c700a1
-0473004a0473004a0473004a0473004a0473004a0473004a040000500473
-004b0473004b0473004b0473004b023900bd023900230239ffe502390009
-047300870473004404730044047300440473004404730044047300830473
-0083047300830473008304730049033300800473006b0473001b04730051
-02cd006d044c000104e3009905e5000305e50003080000e102aa00de02aa
-003d0464004e080000010639005305b4009a0464004e0464004d0464004d
-0473fffd049c00a003f4003805b4007a069600a1046400000231000002f6
-002f02ec002d0625007f071d004404e3008104e3009e02aa00e804ac0072
-046400540473002e0464003304e5001a047300860473008c080000ef0556
-fffd0556fffd0639006308000081078d00520473fffc0800000002aa0053
-02aa004701c7008001c7006c0464004e03f4002f04000021055600060156
-fe390473ffe402aa005c02aa005c040000170400001704730049023900b9
-01c7006c02aa0047080000250556fffd055600a20556fffd055600a20556
-00a20239008d0239ffe00239000402390015063900630639006306390063
-05c700a105c700a105c700a1023900c602aa001902aa000602aa001d02aa
-002e02aa00e502aa00a202aa006b02aa003a02aa004b02aa002804730000
-01c700030556005c0400003f04e3002904000028021400bc05c7fffd0473
-004905560006040000210556009e0473008704ac007204ac00a102aa006b
-02aa001902aa002106ac006b06ac006b06ac0021047300000639006d0473
-0042023900b10556005c0400003f05c700660400005005c7006604000050
-04730046046bffe102aa00ee0556fffd0473004a0556fffd0473004a05c7
-009e04eb004705c7fffd055600a20473004b055600a20473004b04730096
-01c7004204730096025500880473009a02ac008305c7009c0473008705c7
-009c04730087063900630473004405c700a102aa008505c700a102aa003c
-0556005c0400003f04e300300239002404e300300300002305c700a10473
-008305c700a10473008304e300290400002804e3002904000028046800a4
-063900600662005504a00048047400480391006204f000440329002e0530
-0048046bffe1040000b002eb005208c000330800004f040000990800004f
-040000990800004f040000980400009807d5016a05c0009e04ab007204d5
-009d04ac007104d5022204d5010505abffe9050001c905ab027e05abffe9
-05ab027e05abffe905ab027e05abffe905abffe905abffe905abffe905ab
-ffe905ab01c005ab027e05ab01c005ab01c005abffe905abffe905abffe9
-05ab027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab
-01c005ab01c005abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905abffe905abffe905ab02d605ab006605abffea05d5ffff04d50092
-0800000007eb013007eb012007eb013007eb012004d500b204d5008004d5
-002a082b0198086b01b807550010060000f40600006f0440003a05400037
-04c0003f04150040040000250600005505e100bf038d008904d5ffd90180
-008002d50086071500610296000f04d5009202d6008302d6008304d500b2
-02d600700556fffd0473004a05c700660400005005c70066040000500556
-00a20473004b055600a20473004b055600a20473004b0639006d04730042
-0639006d047300420639006d0473004205c700a40473008705c7001f0473
-00060239ffce0239ffce0239ffe40239ffe40239fff60239fff50239004b
-01c700190400003701c7ffa20556009604000088040000860473009601c7
-fffa05c7009c0473008705c900a50473008b063900630473004406390063
-0473004405c700a102aa006b0556005c0400003f04e300300239000c05c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-078d001905c70006055600060400002101c700890556fffd0473004a0800
-0001071d00440639005304e30081023900b9078d001905c70006078d0019
-05c70006078d001905c70006055600060400002101c7008a02aaffe10473
-001b04cd005a06ac006b06ac002206ac002206ac004a02aa00e202aa006b
-02aa00de02aaffea0557ffff0646ffa706b4ffa80312ffa80632ffa706d8
-ffa70605ffa701c7ff780556fffd055600960558fffe055600a204e30029
-05c700a4023900bf055600960558000b06aa009805c7009c0533006d0639
-006305c700a40556009e04f2009404e30030055600060556000906af007f
-05fb0061023900040556000604a00048039100620473008b01c7006b0460
-0088049a008c04000019038700480473008b0473005c01c7008904000086
-04000018049c00a00400001a0395005c04730044048d008303db00560460
-00880433001105b4007a063f005701c7ffc9046000880473004804600088
-063f0057055700a206eb0032045500a105c000640556005c023900bf0239
-0004040000370875000d081500a406d5003104a900a10515000a05c000a0
-0556fffd054000a705560096045500a1056b0000055600a20763000704d5
-004e05c000a105c000a104a900a10540001206aa009805c700a406390063
-05c000a00556009e05c7006604e300300515000a061500520556000905eb
-009f05550057075500a1078000a106550000071500a8054000a505c00055
-081500a405c7001a0473004a0495005b0440008802eb008804ab00000473
-004b055afffb03ab003204780087047800870380008604ab00180580008c
-046b00880473004404550088047300870400005003aa0026040000210695
-004b0400000f0495008a042b0045066b008d0695008d0500002805c0008b
-042b008404150030060000890455001f0473004b0473000002eb00890415
-004b0400003f01c700880239000901c7ffa2074000130680008304730000
-0380008604000021046b008803e900a1034a008808000041089500a00585
-002d000001010000001e0000003100000031000001010000007e0000007e
-0000008c0000008c000001010000001000000101000001210310007d0000
-008c023300d20000030b0000ff04023900b9048100690456003203310019
-0411002d04d1009601f9009b030f005f04ca009b04b8008c01f9009b0413
-002803b0005003b4003c04ca009b04cf005001f9009b02d2003c0498005a
-043c00190488006e045f007303b1001903d4000a0466009604130028058e
-00640524002803f2009b03f2009b03f2009b01e3005a0356005a0686009b
-01f9ffac041300280413002803b4ff5703b4ff570448002d058e0064058e
-0064058e0064058e00640481006904810069048100690456003203310019
-0411002d04d10096024b0000034a000004b8008c024b00000413002803b0
-005003b4003c04cf005002d2003c0498005a0488006e045f007303d4000a
-0466009604130028058e00640524002801f9009b0456003203b00050045f
-0073049b003c0000ffdc0000ff250000ffdc0000fe51028d00ab028d00a0
-02da0043034d007901a8ffba000000460000004600000046000000460000
-00480000004600000046000000460435017c0435012e043500b704350081
-0435012c043500be043500af043500810435009a043500db04350085028d
-00c1043500b3060001000600010002420036060001000435009e04350098
-043500cb0600010006000100060001000600010006000100000000460600
-010006000100060001000600010006000100060001000600010006000100
-051bffba06000100060001000600010005b5003a05b5003a01f4ffba01f4
-ffba060001000600010006000100060001000481003604350036043dffba
-043dffba03e9004a03e9004a067f0014077600140327ffba041effba067f
-0014077600140327ffba041effba051b003204b500240300fff706000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010000000030
-0000004600000046000000400000004606000100060001000000ffdc0000
-fe510000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ff160000ff160000ffdc0000ff160000ffdc0000ff200000ffdc0473
-004a08000000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010006000100028d
-007f028d005d0600010004ee0015034d007901a8000e01d6ffdc01a80056
-01d60010037500320375003201a8002d01d60013051b003204b5002401f4
-ffba01f4ffba01a8009301d6001305b5003a05b5003a01f4ffba01f4ffba
-024200000300fff705b5003a05b5003a01f4ffba01f4ffba05b5003a05b5
-003a01f4ffba01f4ffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba02b3
-005f02b3005f02b3005f02b3005f03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba08c9003e08c9003e06c5ffba06c5ffba08c9003e08c9003e06c5ffba
-06c5ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7
-ffba04a7ffba045a002a039a00360435ffba0327ffba045a002a039a0036
-0435ffba0327ffba064f0027064f00270224ffba021affba04a7004604a7
-00460224ffba021affba04cf002d04cf002d0327ffba0327ffba040d0047
-040d004701a8ffba01a8ffba02b4002302b400230327ffba0327ffba0435
-00450435004501f4ffba01f4ffba024200360300fff7039affba0327ffba
-0375003203750032051b003204b50024051b003204b5002401f4ffba01f4
-ffba045a004004ce0049045a002604ce0039045a005304ce004a045a0053
-04ce004a0600010006000100000000460000004606000100060001000600
-010000000046000000460600010006000100000000480000004606000100
-060001000600010000000046000000460000004600000046000000400000
-003006000100000000460000004606000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d00ca028d00c7028d
-00c606000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000100ffba0800ffba1000ffba06dc0063053f004406d5
-00a1055b00830000fddc0000fc2f0000fca60000fe540000fcd70000fd73
-0000fe290000fe0d0000fd110000fc670000fd9d0000fbf50000fc720000
-fed50000fed50000ff02041b00a006ac006b06ac00190000feb60000fd73
-0000fe080000fca60000fe530000fd110000fbc80000faf40000faaf0000
-fc720000fbaa0000fb6a0000fcf10000fc7d0000fbdd0000fcc10000fb98
-0000fdea0000fe840000fdc20000fcf10000fd5f0000fe760000febc0000
-fceb0000fd6c0000fd580000fc900000fd150000fc2c0000fc130000fc12
-0000fb960000fb9601c700880556fffd0473004a0556fffd0473004a0556
-fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473004a
-0556fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473
-004a0556fffd0473004a0556fffd0473004a055600a20473004b055600a2
-0473004b055600a20473004b055600a20473004b055600a20473004b0556
-00a20473004b055600a20473004b055600a20473004b0239006301c7001f
-023900ba01c7007c06390063047300440639006304730044063900630473
-004406390063047300440639006304730044063900630473004406390063
-0473004406dc0063053f004406dc0063053f004406dc0063053f004406dc
-0063053f004406dc0063053f004405c700a10473008305c700a104730083
-06d500a1055b008306d500a1055b008306d500a1055b008306d500a1055b
-008306d500a1055b00830556000604000021055600060400002105560006
-040000210556fffd0473004a0239ffe201c7ffb0063900630473004405c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-05c700a1047300830000fefe0000fefe0000fefe0000fefe0455fffd02eb
-000c07630007055afffb04a900a10380008604a900a10380008605c700a4
-046b00880473fffd040000140473fffd04000014055600090400000f0555
-0057042b0045055500a10473008706050063047300550639006004730044
-05b5003a01f4ffba0224ffba021affba04a7004601f4009e01f4001001f4
-001b01f4001001f4006b01f4fff90227ffce0000000f0000fff502aa00a4
-02aa00a40000000e00000056000000560000ffcf01a8000f01d6ffbf01a8
-fff501d6ffcd01a8001d01d6fff501a8009301d600130375003203750032
-0375003203750032051b003204b5002405b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba
-01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4
-ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a
-01f4ffba01f4ffba0481003604350036043dffba043dffba048100360435
-0036043dffba043dffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba0481
-003604350036043dffba043dffba02b3003202b3003202b3005f02b3005f
-02b3005f02b3005f02b3003202b3003202b3005f02b3005f02b3005f02b3
-005f02b3005f02b3005f02b3003802b3003802b3004902b3004903e9004a
-03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9
-004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba0692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba08c9003e08c9003e06c5ffba06c5ffba04a7ffba04a7ffba045a
-002a039a00360435ffba0327ffba064f0027064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba064f0027064f00270224
-ffba021affba064f0027064f00270224ffba021affba064f0027064f0027
-0224ffba021affba04a7004604a7004604a7004604a70046093e0032093e
-00320740ffba0740ffba067f0014077600140327ffba041effba04cf002d
-04cf002d0327ffba0327ffba04cf002d04cf002d0327ffba0327ffba04cf
-002d04cf002d0327ffba0327ffba067f0014077600140327ffba041effba
-067f0014077600140327ffba041effba067f0014077600140327ffba041e
-ffba067f0014077600140327ffba041effba067f0014077600140327ffba
-041effba040d0047040d004701a8ffba01a8ffba040d0047040d004701a8
-ffba01a8ffba040d0047040d004701a8ffba01a8ffba040d0047040d0047
-01a8ffba01a8ffba043500450435004501f4ffba01f4ffba043500450435
-00450435004504350045043500450435004501f4ffba01f4ffba04350045
-043500450481003604350036043dffba043dffba024200360300fff7031a
-001a031a001a031a001a0375003203750032037500320375003203750032
-037500320375003203750032037500320375003203750032037500320375
-0032037500320375003203750032051bffba04b5ffba051b003204b50024
-01f4ffba01f4ffba0375003203750032051b003204b5002401f4ffba01f4
-ffba051b003204b50024067f0045067f0045067f0045067f004501a80028
-0000fe290000fea20000ff300000ff1d0000ff120000ff920000fe7e08fc
-003208ad00320000ffb50000ffb60000feed0000ff640000fe7e0000ff9f
-018d000002f6fffd0000fe820000ff1004cd00320000ff580000ff580000
-ff640692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba045a002a039a00360435ffba0327ffba034d007902b400230242
-003601f4ffba0290ffba01f4002f01f4003b01f4001201f400b101f4006d
-067f00140776001401f9009b0000fed902bc000003f2009b045afff504ce
-fff5045a005304ce004a045a005304ce004a045a005304ce004a045a0053
-04ce004a045a005304ce004a045a005304ce004a04350071043500ad045a
-000f04ce000f0473001406110014054000a7047300860540000a0473000a
-05c7005105c700660400005005c7fffd067a00140540004a047300460474
-00480556006e04d5005304e3ffc40639006d04fe000f070c008701c70083
-0239001f055600960400008801c7001504000018072000a405c7ffb80473
-008b0639006006f200630557004406090014047300860556009e0556006b
-0400004f04f20094030b00440239002404e300140239002404e3003005fb
-006105c700a1062e00140400002104e300290400002804e3002904e30031
-045c0044045c003f0473003c0473005503ab003203e50024047300870214
-00bc034e00bc04ac0072023900b00aaa009e09c7009e08640046087f0096
-06aa0096039c008309c7009c078e009c062b0087047300550556fffd0473
-004a0000fefe0556fffd0473004a08000001071d00440639006d0473001a
-0639006d0473004205560096040000880639006304730044063900630473
-004404e30029045c004c01c7ffa20aaa009e09c7009e086400460639006d
-04730042084600a404f2009e05c7009c047300870556fffd0473004a0556
-fffd0473004a055600a20473004b055600a20473004b0239ff8a0239ff64
-023900040239fff60639006304730044063900630473004405c700a102aa
-ffcc05c700a102aa006805c700a10473007605c700a1047300830556005c
-0400003f04e3003002390024045c0051037e001305c700a40473008705a6
-00a404d6005e0486005e04e30029040000280556fffd0473004a055600a2
-0473004b06390063047300440000fefd0639006304730044063900630473
-004406390063047300440556000604000021047300570473004804730086
-04730086040000130400005004730046047300460473005505e9005503ab
-004903ab0032050d0032040f00440239ffb9047300420473004204780050
-0402001904ef00190473008b047300870473008701c7001901c7008901c7
-0089029e0000026e001401c700830493008306aa008406aa008406aa0087
-0473ffa60473008b046c00870473004406530044063f00570466004402aa
-ffe402aaffe402aaffe402aa008502aa008502aa008502aaffe40455008a
-0455008a0400003f01c7ffa20214ffb901c7ff7202cb00000239000f0239
-002404730019048c0044046000880400001a05c700060400001804280019
-0400002804540028045c004c045c00790400002404000050040000240400
-00500639006304400088040f004904780050046b0088032e000004000008
-033b008804730048040000240400005007b7004607400046080b004605b3
-0024036f002405c00024061c0013054a0083050f008303e2001e04380063
-03110064031100640146ffce01eb006401eb000001eb000002ea006403d9
-0000029100000187005a02d7005e01c7008001c7006c01c7008a02aa00fb
-02aa00fb02ca003202ca003204ac007004ac007004ac006504ac006502aa
-012102aa00de02aa005902aa012102aa001d02aa005902aa00de023900b6
-023900b602aa00fb02aa00fb02aa00a602aa00a602aa00a602aa001d02aa
-ffe202aafffb029400000142006402b8003202a0000002ca003203100096
-0310009603100096031000960310009602aa006202aa006202aa002802aa
-001d02aa0047045700960457009604570096045700960457004304570043
-045700430457004304570043031000430457002f0457002f0457002f0457
-002f0457002f0310002f0457002504570025045700250457002504570025
-0310002f0457001a0457001a0457001a0457001a0457001a0310001a0457
-004204570042045700420457004204570042031000420457009604570096
-045700960457009604570042045700420457004204570042045700420310
-00420457002f0457002f0457002f0457002f0457002f0310002f0457002f
-0457002f0457002f0457002f0457002f0310002f04570026045700260457
-002604570026045700260310002604570042045700420457004204570042
-045700420310004204570096045700960457009604570096045700420457
-004204570042045700420457004203100042045700260457002604570026
-045700260457002603100026045700230457002304570023045700230457
-0023031000230457002f0457002f0457002f0457002f0457002f0310002f
-0457004b0457004b0457004b0457004b0457004b0310004b045700960457
-009604570096045700960457004204570042045700420457004204570042
-031000420457001a0457001a0457001a0457001a0457001a0310001a0457
-002404570024045700240457002404570024031000240457002f0457002f
-0457002f0457002f0457002f0310002f0457004e0457004e0457004e0457
-004e0457004e0310004e045700960457009604570096045700960000fec1
-0000fec60000fdac0000fed80000ff920000fee90000ff4c0000fea00000
-fec40000ffce0000ff660000fea00000fed80000fed80000ff970000ff98
-0000ff990000fff40000ff420000ff420000ff440000ff5f0000fe870000
-ffec0000ffa60000ff510000ff510000ff510000fec90000ff1c00000000
-0000fee90000ff4c0000ff930000ff2a0000ff560000ffce0000fe870000
-febb0000fec40000fec40000fed80000fed80000feb30000fec90000fdad
-0000fdac0000feb30000fec90000fdad0000fe160000fee60000ffa60000
-fe870000ff440000feba0000ff230000ff9a0000fdac0000fe8800000000
-0000feb00000ff980000fe930000ffa60000fe870000fdac0000ff660000
-ff440000feb00000feb00000feb00000ff030000ff520000fd1f0000ff53
-0000ff530000ff530000feb50000feb50000ffc30000feae0000fedc0000
-fec70000fec80000fedc0000fe1e0000ff420000ff510000feb70000feb0
-02aa00de02aa005902aa00fa049a008c04600088062e001407aa0000062e
-0014047b004c063f005704cf0044063900630473004405c7006604000050
-04e300a8033b008804ff0000043c0032060d000a049d0042072000a406aa
-0084056500630473008b056400a40400000a0556006b0556006b04e00005
-04c5001905e5005f046e004403b600140347002804cf00440495005b0400
-005001c7ffa2063900600389004d03890050055600a205c000a10473004b
-047800870ab4006d04fe00100639001404e70014079900bf05b500880558
-000b0400001a072e00bf0590008806a10078057b007a086d00bf06f00088
-04d5006603ab001f065f0039058200480639006004730044066d0009050c
-001a066d0009050c001a0b010063091c004406aa005c04e600440987006d
-06d000500000fe370ab4006d04fe001005c7006604000050040700140000
-fea60000febc0000feaa0000fead0000fc2b0000fc4c05c000a104780087
-05400004042b00140556009e04730087055d00a40464008804d5004e03ab
-003204a900040380000005ef002904490028070900a4052f0088091800a0
-06f6008806060066042b005005c700660400005004e3003003aa00260767
-00310587002605550057042b004506e4000a0554000a06e4000a0554000a
-023900bf07630007055afffb055700a1046800860540001204ab001805c7
-00a4046b008805c700a4046b008805550057042b004506aa00980580008c
-02aa002e0556fffd0473004a0556fffd0473004a08000001071d00440556
-00a20473004b060500630473005507630007055afffb04d5004e03ab0032
-04d5004e045c004c05c000a10478008705c000a104780087063900630473
-0044063900600473004405c0004a0415002b0515000a040000210515000a
-040000210515000a0400002105550057042b0045071500a805c0008b0540
-004a0473004607bf004a0703004607a6006606860053054d006604130053
-07c3001207470018084600a4070700880639006d0478005005f900300553
-00260000ff430000fec90000ff770000ffb00000ff470000ff560000ff74
-0000fed70000feac000000000000ff520000ff56000000000000feac0000
-fd9a000000000000ff6a0000ff7c0000ff690000ff560000feac0000ff7f
-0000ff560000fdef0000ff430000ff690000ff7c000000000000fdae0000
-ff8c000001020000fefe0000fefe0000fedf0000fedf0000ff580000ff20
-0000fefe0556fffd0473004a055600960473008605560096047300860556
-00960473008605c700660400005005c7009e0473004605c7009e04730046
-05c7009e0473004605c7009e0473004605c7009e04730046055600a20473
-004b055600a20473004b055600a20473004b055600a20473004b055600a2
-0473004b04e300a8023900130639006d0473004205c700a40473008705c7
-00a40473008705c700a40473008705c700930473006805c700a404730087
-0239ffdf01c7ff9202390020023900060556009604000088055600960400
-008805560096040000880473009601c7007e0473009601c7ffb904730096
-01c7ffa50473009601c7ffa306aa009806aa008706aa009806aa008706aa
-009806aa008705c7009c0473008705c7009c0473008705c7009c04730087
-05c7009c0473008706390063047300440639006304730044063900630473
-004406390063047300440556009e047300870556009e0473008705c700a1
-02aa008505c700a102aa008505c700a102aa005e05c700a102aa00260556
-005c0400003f0556005c0400003f0556005c0400003f0556005c0400003f
-0556005c0400003f04e300300239002404e300300239002404e300300239
-ffff04e300300239000e05c700a10473008305c700a10473008305c700a1
-0473008305c700a10473008305c700a104730083055600090400001a0556
-00090400001a078d001905c70006078d001905c70006055600090400000f
-055600090400000f055600060400002104e300290400002804e300290400
-002804e3002904000028047300870239000305c70006040000210473004a
-01c7008904a0004804a0004804a0004804a0004804a0004804a0004804a0
-004804a000480556fffd0556fffd06820013068200130682001306820013
-068200560682005603910062039100620391006203910062039100620391
-0062061e0000061e0000076c0000076c0000076c0000076c00000473008b
-0473008b0473008b0473008b0473008b0473008b0473008b0473008b068f
-0000068f0000081f0000081f0000081f0000081f0000081ffff3081ffff3
-01c7008101c7008101c7ff9b01c7ff9b01c7ffeb01c7ffeb01c7ffa201c7
-ffa20301000003010000049100000491000004910000049100000491fff3
-0491fff3047300440473004404730044047300440473004404730044069d
-0000069d0000082d0000082d000007c9000007c900000460008804600088
-0460008804600088046000880460008804600088046000880682000007ae
-00000812000007ae0006063f0057063f0057063f0057063f0057063f0057
-063f0057063f0057063f0057065f0000065f000007ef000007ef0000078b
-0000078b0000078bffff078bffff04a0004804a000480391006203910062
-0473008b0473008b01c7ffe601c700680473004404730044046000880460
-0088063f0057063f005704a0004804a0004804a0004804a0004804a00048
-04a0004804a0004804a000480556fffd0556fffd06820013068200130682
-00130682001306820056068200560473008b0473008b0473008b0473008b
-0473008b0473008b0473008b0473008b068f0000068f0000081f0000081f
-0000081f0000081f0000081ffff3081ffff3063f0057063f0057063f0057
-063f0057063f0057063f0057063f0057063f0057065f0000065f000007ef
-000007ef0000078b0000078b0000078bffff078bffff04a0004804a00048
-04a0004804a0004804a0004804a0004804a000480556fffd0556fffd0556
-fffd0556fffd0556fffd02aa00e502aa00fd02aa00e502aa000602aa0006
-0473008b0473008b0473008b0473008b0473008b068200000682000006f3
-000006f3000005c700a402aa001302aa001302aa000601c7ffbb01c7ffab
-01c7ffca01c7ffca01c7ff9301c7ff930239001a0239fff5036500000365
-000002aa001302aa001302aa000604600088046000880460008804600088
-048d0083048d00830460008804600088055600060556000606e600000718
-0000061e000002aaffea02aaffea02aa0059063f0057063f0057063f0057
-063f0057063f005707650000069d000007270000065f000005fb006102aa
-00de02aa00e50473000d05c7006605c7006606aa008705c70024095000a1
-078d00190556001f04e30030080000290400003004c100660000ff530000
-ff530000ff530000ff5301c7001901c7ffa2042b00050556001105740046
-02cbffa3057a008702f0ffc8057f000a057f000a02aa008402aa008402aa
-00c902aa00c902aa00a002aa005902aaffaf02aa003a02aa0006023900b9
-02aa00a902aa00a902aa00a902aa00a9032e001e032e001e02aa003a0000
-ff730000ffa50000fed80000ff230000ff720000ff720000fee70000ffa5
-0000ff530000ff530000ff530556009e0473008703f8001905fb0019071d
-00440440001904000050046900870469001903eb008703ab003201c70088
-0361004104000088033600100580008c04780087047300440400001304de
-004404de004404de000d078d005003a800440473004404730044042b0084
-0455001f0455001f03aa00260460008804c6004405de004404c600440400
-001a05c700060400002803ab0032036b003f04db001f02eb00880400001a
-04550088042b008405b4007a04ab001803a00000054f0000035100320351
-ffd103980032034800320348003203f80032036e0032015600690284002d
-0366003202d000320415003203710032036f003204180032030f00320359
-0032039c003203760031036f003204fb000002fa003202fa003203040032
-04cc0032030500640305003202f9003202f90032028c0032028c00320304
-00320142006402b6006404950064030f00640305003202d5003203050032
-030500320306006401c20032030f00640342003204950064029200000320
-00000315006402920000030600320385003202bf00000142006401eb0064
-030f0064029200000315006402920000030900320385003202bf000005ed
-00460a660046061300460689ffba0541ffba01e9003c045a00110000ff0d
-0000ff350000fece0000feb70000fec90000ffcf0000ff4f0000ff9e0000
-feca02b3005f02b3005f03e9004a03e9004a039affba0327ffba039affba
-0327ffba05ad0069053d002d05fd009604dc005004e0003c05f6009b053f
-00280650002804ac00720000fe3b0000fe660000fe660473fffc02aa0053
-02d5ffce01a8ffba01a8ffba01a8ffba01a8ffba0658001509c500470400
-000008000000040000000800000002ab0000020000000155000004730000
-02390000019a000000ab00000000000005e5000305c7006606aa00980580
-008c0744008307180046071800480556fffd05c70066040000140473000a
-04e300300400004f0400002804a5001d000001020000ff420000febf0000
-ff3a0000ff53048d000a05c7005105c7006605c70051045500a102eb0088
-0000ff430000ff040000ffac02d200960000ff37021affba0250001e0000
-ff3a0000ff5b0000ff5f0000ff7e0000ff940000ff4a0000fe9c05b5003a
-05b5003a01f4ff9601f4ff9605b5003a05b5003a01f4ffba01f4ffba05b5
-003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba
-05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba0481003604350036043dffba
-043dffba0481003604350036043dffba043dffba02b3003202b3003202b3
-005f02b3005f03e9004a03e9004a0692003e0692003e043fffba043fffba
-045a002a039a00360435ffba0327ffba045a002a039a00360435ffba0327
-ffba045a002a039a00360435ffba0327ffba064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba067f0014077600140327
-ffba041effba067f0014077600140327ffba041effba067f001407760014
-0327ffba041effba02b4002302b400230327ffba0327ffba02b4002302b4
-00230327ffba0327ffba043500450435004501f4ffba01f4ffba04350045
-0435004501f4ffba01f4ffba043500450435004501f4ffba01f4ffba040d
-0047040d004701a8ffba01a8ffba03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0473ff93047300460239ffbf06aa
-ffd50473ffb70473ff9102aaffa402aaffa40400ffff0239ffb904000028
-04730089030b0064047400480649002401c7001901c700190473001e0460
-001e048c000a04730086047300460239001305b400420400008801c7fffc
-06aa00870473008b0473008702aafffb0400003f0318ffa20400001a0400
-000f040000280473004a04730048047300460473004b03ab004903ab0032
-0534005501c700880400001301c7ffa204730083045c004c0304006402d5
-003202c9003302fc0032028c003201d5003201d500000304003203110064
-01420019014200640142006401420019022a000001420064014200090233
-00640493006404930064030fffc9030f0064030e00640305003203000032
-02b800320142ffca01c20032030f001d031a00320306006402d400640292
-000002de003202de003202de003202f4003202ea00320000febc0000febc
-0000ff730000fea9023900b902fa003202f900320305003202a0000002f9
-00320639006d0556fffd0473000f05c7006602aa004104a0004804a00048
-04a0004804a0004804a0004804a0004804a0004804a0004801c7ff9b01c7
-ffab01c7ff9b01c7ffab01c7ff9b01c7ffbb01c7ff9b01c7ffbb04600088
-0460008804600088046000880460008804600088046000880460008801c7
-ffab01c7ffab01c7ffbb01c7ffbb04600088046000880460008804600088
-045a005304ce004a03a000130556001105c700290558000b055600a20473
-004b0400003301c7ffa205e600630473004805c7000002aa000f05560006
-0400002104000013040000500400001301c700830455fffd02eb00010556
-00090400000f055600090400000f04d5005303ab00490540001204ab0018
-0000fec60000fed40000fec60000fed40000fe5f0000fe5f0000ff720000
-ff730000fee7078b000a03eb004c040000130473000a01c700150473fff4
-0556001105c700a1047300190239ff8b05c700a404730087055600960400
-008804e30029040000280400003b049e00a403670088053000480000ff53
-0000ffbc0000fefe0000fefe0000fea40000fea401c70088000000000000
-002a0000002a0000002a0000002a000000d60000017e00000320000005a6
-0000074e000009380000097e000009fe00000aa400000b8400000bec0000
-0c6400000caa00000ce600000d5600000f1200000fee00001218000013f2
-000015520000170c000018e20000198e00001c2200001e5600001eb20000
-1f7000001ff200002062000020e8000021da000023da000025840000271c
-000028560000299e00002a6200002b1800002ca800002dae00002e920000
-2f7a000031b00000323a000035640000370e000038420000394800003b3c
-00003da800004052000041000000422400004398000045d6000048e20000
-4a8800004bc800004c3200004c9c00004d0000004d8800004dbc00004e38
-0000510a000052e80000549c000056500000580e0000596200005b520000
-5cf600005dea00005f020000619a00006296000064c60000668c0000684e
-00006a1200006ba800006cae000070560000717a00007318000075360000
-79a000007bc400007e1c00008004000081020000814e00008250000082f0
-0000833c00008370000083ac000083ee000084540000849a000084ce0000
-85040000853a0000858a000085cc0000861e00008656000086a8000086de
-0000871e000087600000879e000087e800008828000088560000888e0000
-88de00008914000089540000898e000089d200008a1c00008a5800008a88
-00008acc00008b0400008b9400008c1a00008e2800008fbc0000916c0000
-91b80000924c00009470000096c4000098b4000099a000009a2200009a8c
-00009baa00009d0600009f4e0000a0b00000a13e0000a1e80000a2ac0000
-a3f40000a59e0000a68c0000a7520000a7b60000a8240000a94e0000aa72
-0000ab020000ace40000af3e0000b2900000b3860000b42c0000b47c0000
-b5320000b6520000b7f00000b88a0000b94e0000ba0e0000ba760000bab2
-0000bb0a0000bb580000bd700000bfb60000bfee0000c0200000c14a0000
-c2760000c3240000c3c80000c46a0000c53c0000c5900000c5c60000c61e
-0000c7700000c7e20000c83c0000c9b40000cb200000cc000000cc320000
-ccce0000cdf20000d0680000d0a20000d0e60000d1220000d1840000d1c6
-0000d20c0000d2580000d28a0000d2de0000d31c0000d34c0000d38a0000
-d3d00000d4120000d4500000d4d20000d5400000d6260000d6620000d6e2
-0000d7160000d7b80000d8400000d8ac0000d90e0000d97a0000da660000
-db580000db8c0000dbc00000dbf00000dc340000dcac0000de260000e040
-0000e0720000e0ac0000e1a60000e3340000e36a0000e4ce0000e54a0000
-e62a0000e7200000e8b00000ea1a0000ec080000ed040000ed4a0000ed7e
-0000edc00000edfa0000ee4e0000ee960000eee00000ef100000ef400000
-f1280000f1660000f18e0000f1be0000f1f20000f2180000f23e0000f286
-0000f43c0000f5b60000f5dc0000f6020000f6460000f6760000f6a60000
-f6fc0000f7da0000f8ec0000f9300000f9660000f9c00000f9fe0000fa32
-0000fa620000fa9e0000fade0000fb1c0000fb580000fb9a0000fbd00000
-fc0c0000fc4c0000fc720000fc960000fce60000fe420000fe980000fecc
-0000ff1a0000ff660000ffa80000ffe0000100160001005e000101000001
-029c00010464000105e6000107d80001092a00010aae00010b9000010d2a
-00010d9400010dbc00010e5a000110dc0001111c0001115c0001119c0001
-11da000112380001129600011304000113240001140e000114ae000114e4
-000115320001157c000115c6000115e2000115fe0001161e0001163e0001
-165e0001167e000116a4000116ca000116f000011716000117460001176e
-00011796000117c2000117ee000118220001184c00011878000118ae0001
-18d8000119040001193a000119640001198e000119c2000119f200011a26
-00011a6a00011a9a00011ace00011b1000011b4400011b7600011bb80001
-1bec00011c1c00011c5e00011ca200011ce800011d4400011d6000011d7c
-00011d9800011db400011dd000011f3e000121ea0001245a000124760001
-2490000124ac000124c8000124e4000125000001255c0001259600012600
-000126ca0001276a00012840000128c000012948000129b800012a4e0001
-2aac00012af200012b5000012bb200012c6a00012d2800012d5400012db0
-00012df400012f60000130540001307e0001309a000130c6000130fe0001
-314a0001318a000131be000131ee0001321e0001324e00013292000132c2
-000132f2000133320001336200013392000133c200013402000134320001
-346200013492000134b8000136bc000136ec0001371c0001386c00013a22
-00013a5200013a8000013ab000013ade00013b0e00013b3c00013b600001
-3b8400013bb400013d2400013d5c00013d8c00013f1e00013f4c00013f7a
-00013fa800013fd00001412e000142c6000142fe0001433e0001437a0001
-43aa000143d8000143f4000144240001445400014544000146ac000146dc
-000147160001475600014786000147b6000147f80001481e000148440001
-4884000148c4000148f40001493400014a1e00014a9e00014b8200014bb2
-00014be200014c1200014c4200014c7e00014cb000014ce200014d120001
-4d4200014d8800014dba00014dea00014e2000014e9200014ec600015094
-000151960001532600015556000157a6000159380001599c00015a260001
-5a3600015ac400015cc200015dee00015f5a0001604a000161ce000163e8
-000166140001670600016716000167260001683e0001684e0001685e0001
-686e0001687e0001688e000169ac000169bc000169cc00016a4000016a50
-00016b2000016b3000016c4200016c5200016c6200016c7200016dd00001
-6fae00016ff0000170260001705c0001708c000170bc0001711000017138
-000172c20001740a0001755e000176c60001784a000178ae00017a400001
-7b5c00017b6c00017b7c00017d0200017d1200017e7800017fd200018106
-00018264000183d200018598000185d800018610000186460001866c0001
-869c000186c200018838000188680001899e000189ae000189be00018a00
-00018a1000018ba400018d5000018eda00018f0200018f320001908e0001
-909e000191d6000191e600019280000193e0000193f000019656000197e0
-000199480001997800019aee00019c2000019c3000019c4000019c500001
-9d2a00019d3a00019d4a00019d5a00019e5200019fcc00019fdc0001a104
-0001a2380001a38a0001a51e0001a63c0001a7c80001a8da0001a9100001
-ab460001abe60001abf60001ad8c0001af2e0001afb20001b1340001b144
-0001b3ac0001b52c0001b6ac0001b6dc0001b87c0001ba020001bbc60001
-bcf20001bd020001be320001be420001be520001bf120001bf220001c108
-0001c1180001c24e0001c35c0001c5080001c6be0001c8000001c9700001
-cab80001cb0a0001ccec0001ce680001cea60001d04c0001d0700001d1b0
-0001d1c00001d1d00001d2080001d2180001d3a40001d50c0001d6800001
-d6a40001d6d40001d8420001d8f40001d9b20001d9e00001db960001dc8e
-0001dd1c0001de420001def00001dfc40001e00e0001e0860001e1460001
-e16e0001e1b20001e2080001e2e40001e32e0001e3620001e38a0001e3b2
-0001e3e60001e42a0001e46e0001e4ac0001e5ea0001e6a20001e7c20001
-e8380001e9060001e9580001e9ea0001ea9a0001eb8e0001ebe20001ec78
-0001ed360001ee200001eed20001eff20001f0440001f0ee0001f2240001
-f2fc0001f3e20001f4e80001f5ce0001f6b00001f7a40001f8420001f948
-0001fa420001faba0001fb320001fba80001fbde0001fc3a0001fd020001
-fd8e0001fdc60001fe0c0001fe3c0001fea60001ff660001ff9a0001ffca
-0001fffe0002002e0002005e0002008e0002022e00020266000202a60002
-02de00020316000203b2000204ac000204dc00020580000205ae000205ee
-0002063e0002066e000206ba00020852000209b800020b1800020b5e0002
-0bb200020bea00020d5c00020d9200020e2400020e6200020e9000020ece
-00020ffe0002102600021162000211f20002129c0002131e000213da0002
-14f20002160000021634000216ba0002181600021898000218e2000219ec
-00021a3400021b3800021bb400021c0c00021c9000021d7a00021e900002
-1f8c0002203600022126000221f8000222e2000223ca0002247a000224fc
-0002275a00022784000227ae0002286600022890000229d200022ad80002
-2bc200022bec00022c1600022c4000022c6a00022c9400022e1400022e3e
-00022e6800022e9200022ebc00022ee600022f1000022f3a00022f640002
-2f9800022fc200022fec0002301600023190000231a0000232ba000232ca
-000232f40002331e00023348000233720002351c00023738000238660002
-3876000239f200023a0200023b4800023d1400023e1a00023f9a0002413a
-0002435e000244b80002469a000247de0002490c000249fa00024a240002
-4a4e00024a7800024aa200024acc00024af600024b2000024b4a00024b74
-00024b9e00024bc800024bf200024c1c00024c4600024c7000024eac0002
-50280002516c000253540002549c000254c6000254f00002552000025550
-000255a0000255f000025630000256a2000256f600025754000257aa0002
-57e00002582200025868000258b2000258e20002591a0002594a00025a82
-00025dc800025df200025e1c00025e4600025e7000025e9a00025ec40002
-5eee00025f1800025f4200025f6c00025f9600025fc000025fea00026014
-0002603e0002606800026092000260bc000260e6000261100002613a0002
-61640002618e000261b8000261e20002620c0002623600026260000262fe
-000263140002633e0002661e0002662e000267480002686a000269a80002
-6aea00026c9000026ca000026de200026f3200027122000272f60002740e
-0002741e000274a00002752e0002762e0002763e000276de000276ee0002
-78040002795600027a8600027a9600027b6400027b7400027cea00027cfa
-00027e0e00027e1e00027f52000280e8000281a4000281b4000282b20002
-840c00028498000284a8000285d20002875e0002881a0002882a000288c6
-000288d6000289a4000289b400028a8c00028a9c00028ba400028bb40002
-8d7a00028d8a00028ee200028ef20002915c0002916c0002936600029376
-000294e0000294f0000295e0000295f00002978800029798000298b60002
-98c600029a0600029a1600029a2600029a3600029bae00029bbe00029bce
-00029bde00029d3000029e7e00029f4c0002a0300002a1b00002a3320002
-a4320002a5460002a68a0002a69a0002a7880002a8620002a9fe0002aa0e
-0002ab2c0002ac320002ae300002ae400002ae500002ae600002afaa0002
-afba0002b0720002b0820002b1900002b1a00002b28c0002b29c0002b3ba
-0002b3ca0002b4680002b4780002b4880002b5760002b6ea0002b8160002
-b9100002b9200002b9300002b9400002bade0002bc980002bd660002bd76
-0002bfd60002c21c0002c4a20002c7060002c98a0002cbfc0002cdcc0002
-cf820002cfac0002cfd60002cfe60002cff60002d0200002d04a0002d074
-0002d0840002d0940002d0be0002d0e80002d0f80002d1080002d1320002
-d15c0002d1860002d1960002d1a60002d1b60002d1c60002d1d60002d1e6
-0002d2100002d2200002d2300002d25a0002d2840002d2ae0002d2d80002
-d3020002d32c0002d3560002d3800002d3aa0002d3d40002d3fe0002d428
-0002d4520002d47c0002d4a60002d4d00002d4fa0002d5240002d54e0002
-d5780002d5a20002d5cc0002d5f60002d6200002d64a0002d6740002d69e
-0002d6c80002d6f20002d71c0002d7460002d7700002d79a0002d7c40002
-d7ee0002d8180002d8420002d86c0002d8960002d8c00002d8ea0002d914
-0002d93e0002d9680002d9920002d9bc0002d9e60002da100002da3a0002
-da640002da8e0002dab80002dae20002db0c0002dbac0002dbf00002dc66
-0002dc900002dcba0002dce40002dd0e0002dd380002dd620002dd8c0002
-ddb60002dde00002de0a0002de340002de5e0002de880002deb20002dedc
-0002df060002df300002df5a0002df840002dfae0002dfd80002e0020002
-e02c0002e0560002e08a0002e0be0002e0f20002e2840002e4200002e5bc
-0002e7480002e78e0002e7d40002e8420002e89e0002e8f00002e9600002
-ea380002eb040002ebdc0002eca80002ed480002ee620002ef160002ef98
-0002eff20002f0320002f1500002f29a0002f4320002f48e0002f4ec0002
-f5480002f5a40002f6580002f70e0002f7ba0002f8660002f9120002f9ca
-0002fa820002fb3a0002fb4c0002fb5e0002fb700002fb820002fb940002
-fc020002fc700002fd280002fd3a0002fd4c0002fd5e0002fd6e0002fd80
-0002fd920002fda40002fdb60002fdc80002fdda0002fe880002ff340002
-ffe20003008e00030126000301600003018a000301b4000302080003025a
-000302d6000303200003039c000303f000030474000304c60003053c0003
-0594000305fa00030650000306aa0003072800030774000307d200030836
-00030884000308d20003092a000309720003099c000309ca000309f00003
-0a2400030a5400030a8400030ad600030b4400030b9a00030c0e00030c62
-00030cd600030d1c00030d8400030dca00030e2600030e5600030e900003
-0eb600030ee600030f0c00030f3200030f6400030f9400030fe60003104c
-000310a2000311080003115c000311ca0003120c0003126c000312ae0003
-12fa0003133400031370000313aa000313e60003141a0003144c0003147c
-000314ac000314d6000314fc00031526000315540003157e000315ca0003
-160e0003164400031680000316b4000316e200031720000317500003178a
-000317b4000317e2000318080003182e0003185a000318b6000318e60003
-1916000319460003197e000319b2000319e000031a1000031a4000031a70
-00031aa000031ad400031b2a00031b5e00031bbe00031bf200031c4a0003
-1c7e00031cda00031d7800031e4600031f660003202e000320be00032154
-000323400003253c000326b400032830000329da00032b8c00032c740003
-2daa00032ea200032fb4000330d20003320800033372000334e000033676
-000337f2000339020003391200033a3e00033b7a00033cbc00033e400003
-3f1a00033f9000034046000340ec0003425c000342940003430e000343d0
-0003448a000344f2000345f80003472e000347fa00034958000349d20003
-4a4c00034b1800034bd200034c8600034ce200034d3c00034d8400034df4
-00034e7000034eba00034ef400034f3a00034f7e00034fd0000350220003
-50a40003512600035168000351a8000351de000352140003524200035270
-000352a4000352d80003531a0003535c00035398000353d40003540e0003
-54480003547a000354ac000354de000355100003554a00035584000355c6
-000356080003564a0003568c000356da000357280003576a000357ac0003
-57ec0003582c00035866000358a0000358ec0003593800035976000359b6
-000359fc00035a4200035a7e00035ad400035b1000035b4c00035b8c0003
-5bcc00035c0800035c4400035c8400035cc400035d0800035d4c00035da0
-00035e2e00035e7000035eb200035f1a00035f8200035fb400035fe60003
-601e00036056000360ec00036182000361cc00036216000362520003628e
-000362e40003633a00036384000363ce000364260003647e000364be0003
-64fe000365360003656e000365b800036602000366400003667e000366c0
-0003670200036756000367aa000367f0000368360003687c000368c20003
-69180003696e000369c400036a1a00036a6600036ab200036afe00036b4a
-00036bbe00036c3200036ca600036d1a00036d5800036d9600036dd40003
-6e1200036e5000036e8e00036ed200036f1600036f6200036fae0003700e
-0003705a00037098000370e6000371f60003724600037296000372ce0003
-73060003735c000373b2000374260003748a000374cc0003750e00037564
-000375b2000375fe0003764a0003768a000376ca000377120003775a0003
-77c6000378200003785800037890000378d000037910000379e000037adc
-00037b9c00037c8a00037ce000037d3600037d8800037ddc00037e400003
-7ea400037efa00037f5000037fc60003803c0003807e000380c000038102
-0003814400038186000381c80003821e00038274000382c60003831a0003
-83a200038424000384c400038566000385a4000385e2000386200003865c
-0003869a000386d80003871600038752000388360003892200038a380003
-8b5400038c1e00038ce800038de200038edc00038fda000390d8000391f6
-000393140003943a000395600003966200039764000397f6000398880003
-98c6000399040003995e000399b8000399f000039a2800039b3800039b48
-00039b9000039bd800039c3000039c8800039cba00039cec00039d2e0003
-9d7000039daa00039de400039e2800039e6c00039ee400039f5e00039fee
-0003a0320003a0720003a0f40003a1760003a2ce0003a2de0003a32c0003
-a37a0003a3b60003a3f20003a4380003a47e0003a4cc0003a51a0003a56a
-0003a5ba0003a6160003a6720003a7e80003a9500003a9880003a9c20003
-aa0e0003aa5a0003aaac0003aafe0003ab500003aba60003abe20003ac1e
-0003ac740003acc80003ae000003aea00003aeee0003af2e0003af680003
-b0fe0003b3820003b4460003b5dc0003b73a0003b8080003b9ae0003bc02
-0003be3a0003be800003beb20003bf5c0003c0800003c0a40003c13e0003
-c24a0003c35a0003c46a0003c5780003c6fe0003c7300003c7d20003c7fa
-0003c85c0003c8be0003c9200003c9820003c9c00003c9fe0003ca380003
-ca720003ca9e0003caea0003cb240003cb5e0003ccba0003ce0e0003ce1e
-0003cedc0003d0120003d0700003d1880003d3160003d3bc0003d5020003
-d5400003d57e0003d5bc0003d6100003d6380003d6920003d6f60003d73e
-0003d7a00003d8000003d8720003d8ee0003d96a0003d9ec0003da780003
-db040003db8e0003dc0e0003dc480003dc840003dde80003deb20003dee2
-0003df120003e04a0003e19a0003e1aa0003e2980003e36c0003e4640003
-e55a0003e6dc0003e8360003e8460003e95e0003ea0a0003eb4c0003eca2
-0003ecfe0003ee5c0003eeea0003f0900003f2020003f3160003f34e0003
-f3b20003f5620003f6cc0003f72e0003f8960003f99c0003fa520003fafe
-0003fc260003fd140003fdf40003ff34000400600004017a000402ea0004
-046400040474000405540004064a000406fa000407f6000408a2000409ac
-00040a9800040bc200040ce600040dea00040f1800041056000411c20004
-12f80004148c000416340004172c000418400004197200041a6400041a9c
-00041af200041ba000041bb000041c1200041c6e00041cd400041d200004
-1d6000041d9800041dc400041df200041e2c00041f6200041f960004201a
-000420d00004210000042184000421b4000421ec00042384000425100004
-255a00042594000425ea000426360004265c00042682000426c400042706
-0004274800042778000427b0000427e60004281c0004285e0004288e0004
-28be000429b400042ab800042aec00042b2400042b6a00042b9e00042bce
-00042c0600042c3a00042c6e00042c9e00042cce00042d0400042d3a0004
-2d6a00042d9a00042dce00042e0200042e3200042e6200042e9c00042ed0
-00042f0200042f3400042f6800042f9c00042fcc00042ffc0004302a0004
-305800043166000432d2000434060004353a0004356a000435a40004363e
-000437a800043904000439c800043adc00043b0c00043b4000043c380004
-3de800043e4000043eb800043ff400044032000440a4000440d400044104
-0004413e000441c6000441f600044226000443b6000445000004460c0004
-471a000448460004499c00044af800044c5800044d9200044f0400045064
-000450740004522a00045352000453ec0004557400045584000456800004
-58060004595e00045a1000045ae000045bec00045c9600045cce00045cde
-00045d8e00045e3400045eb000046000000460f4000461ea000462f60004
-63ce000464a80004653c0004664e000467de000468fc000469f200046a9c
-00046b4600046c1000046cb800046d8e00046e0a00046e6600046fc80004
-70fc000472980004735a0004745a00047532000476700004771c000477e6
-000478d6000479fc00047ad800047bde00047d1600047e0600047ea40004
-7f960004810600048250000484bc0004858e000486420004871000048804
-000489420004895200048a8600048b9800048ba800048cb400048de40004
-8e3800048fac000490d4000491e80004939a000495ae00049842000499fc
-00049b2800049d0800049eca0004a05c0004a1280004a2c40004a33a0004
-a3e80004a4c40004a5500004a5f20004a6940004a7780004a8b00004ab0c
-0004ac540004ac640004ac740004acd60004ad340004ad960004ae340004
-aecc0004afd00004b0be0004b0ce0004b0de0004b1780004b2120004b24e
-0004b2ca0004b33e0004b3940004b3c80004b44e0004b4da0004b5520004
-b5b00004b64a0004b6dc0004b75c0004b7de0004b8720004b8a60004b908
-0004b9ba0004bb800004bbb80004bd940004bea80004beb80004beee0004
-bf320004bf760004bfba0004bff00004c0220004c0640004c1000004c156
-0004c1fc0004c2740004c2fa0004c36a0004c3cc0004c4520004c4b20004
-c51c0004c5900004c6000004c65e0004c7040004c79c0004c8080004c898
-0004c8f60004c9640004ca0c0004cab80004cb4e0004cbb80004cc3a0004
-cc9e0004cd4a0004ce020004ceae0004cf3c0004cf980004d0040004d05a
-0004d0dc0004d15a0004d1e00004d26c0004d2c60004d3320004d3a20004
-d4120004d4820004d5060004d5960004d5fc0004d6760004d6f20004d76a
-0004d8100004d8ac0004d93c0004d99a0004da380004dab40004db460004
-dbe80004dc920004dd2a0004dd860004dddc0004de440004deea0004df92
-0004e05c0004e1020004e1640004e1bc0004e21c0004e2aa0004e3300004
-e3be0004e41e0004e4820004e4ec0004e5540004e5bc0004e63a0004e6c2
-0004e7560004e7c20004e82a0004e88e0004e9360004e9f00004ea9e0004
-eb2c0004eb8a0004ebf60004ec660004ed0c0004edb60004ee780004ef1a
-0004ef7e0004f00e0004f0800004f1100004f18e0004f20a0004f2760004
-f3040004f3600004f3be0004f4440004f4c00004f5280004f58c0004f5e0
-0004f64e0004f6b60004f7340004f7aa0004f8240004f8a40004f9000004
-f9660004f9ca0004fa6a0004fb0c0004fbc20004fc720004fcce0004fd46
-0004fda40004fe2e0004fec60004ff560004ffbc0005001a000500a80005
-011a000501ae00050246000502b6000503260005039e000503fc0005045c
-000504d60005053000050590000505ea00050646000506ae0005073c0005
-0772000507aa0005083600050860000508a20005093600050a2400050ab4
-00050aea00050b3a00050bac00050c5800050cea00050d4200050d9c0005
-0df400050e4e00050ed200050f5800050ffc000510a4000510e200051152
-000511e60005127e00051314000513be000513f000051440000514940005
-14da0005157e000516080005168e000516ee000517320005178000051820
-000518b000051950000519f600051a9c00051b6000051b9200051bbc0005
-1c4200051cf200051d2400051d4c00051e1a00051e7800051f1200051f60
-00051fc60005206e000520dc00052142000521ce00052240000522b60005
-236a000523c40005243400052470000524c200052548000525a80005264c
-0005272c00052854000529e400052a4000052a9600052dbc00052e560005
-2eb200052efa00053068000531ba000532000005330e000533a6000534b4
-000535be0005366000053748000537da000538760005396800053a680005
-3ae400053b6a00053bb200053d2400053e8000053f6400053fb400053fe8
-000540d6000541fe00054398000544c8000545de000547120005482e0005
-489c0005493000054a7000054b2600054c9000054dc000054ef20005501e
-000550ca0005519000055262000553bc0005553c0005566c000557880005
-594200055a9400055b8000055c5c00055d1e00055e8800055fd800055fe8
-00055ff800056008000560c000056176000561b2000561e8000562200005
-6256000563e2000565f6000566e0000567f80005697000056ade00056bc8
-00056cfa00056e4200056fc800057166000572ba000574a80005766e0005
-78a400057af200057bda00057cb600057dfe00057f800005806800058182
-000581c40005820e0005842a000586420005878e0005890400058b620005
-8d6400058de800058e1800058e6400058f2c00058ffc0005919000059218
-00059280000592c0000592fe000594b0000596e000059816000599f80005
-9ad400059bee00059d9a00059fa60005a0a80005a1940005a3860005a58e
-0005a6fa0005a87e0005a9de0005ab4c0005abda0005ac6a0005ad840005
-ae900005b0520005b1be0005b3ae0005b5780005b60c0005b6a80005b73e
-0005b7c60005b8ac0005b9840005bb1e0005bcb00005bcd60005bcfc0005
-bd0c0005bd3c0005bd6c0005bee60005c0880005c1320005c2140005c2d4
-0005c37e0005c4180005c4fa0005c5b80005c6940005c84a0005c9840005
-ca100005ca400005ca700005caa40005cad80005cae80005caf80005cb28
-0005cb580005cb8c0005cbc00005cbf40005cc280005cc5c0005cc900005
-ce0a0005ce1a0005ce4a0005ce7a0005ceb20005cee60005cf1a0005cf4e
-0005cf820005cfb60005cfea0005d0220005d0580005d0880005d0c80005
-d1000005d1480005d18e0005d1c20005d1f60005d2300005d2680005d308
-0005d3180005d46a0005d6320005d7d80005d9820005dace0005dbe40005
-dcf20005de080005df020005dfea0005e10c0005e2080005e2e00005e3d0
-0005e48c0005e53e0005e6080005e67a0005e7200005e7b00005e8140005
-e9220005e9880005ea360005eb2c0005eb940005ebfc0005ecac0005ee86
-0005ef8a0005f00a0005f0480005f0f40005f1820005f26a0005f3020005
-f3680005f4660005f5280005f5e20005f6200005f6b00005f7b20005f846
-0005f88a0005f9a80005fad20005fcb40005fe760005ffac000600da0006
-01da000602020006022a0006026000060292000602be000602e60006030e
-0006033c0006039a000604080006044000060478000604a8000604ce0006
-0502000605380006055e00060584000605b2000605e00006060c00060682
-000606aa0006070c00060732000607580006077e000607a4000607d40006
-0804000608340006086e0006089e000608d400060904000609360006095c
-00060982000609b6000609ec00060a1c00060a4c00060a7200060a980006
-0abe00060aec00060b2000060ba600060bea00060c2400060c5800060c9c
-00060cd600060d1000060d3600060d6000060dac00060dee00060e140006
-0e4200060e6800060e8e00060ece00060f0000060f3000060f6000060f86
-00060fac00060fdc0006100c00061032000610580006107e000610a40006
-10ca000610f000061118000611a0000611ca0006123e00061266000612dc
-000613040006136600061398000613ca000613fa00061432000614640006
-1492000614cc000614f40006155400061596000615c6000615f200061622
-000616520006167a000616a2000616ca0006172c00061754000617b20006
-17f60006183a0006186a000618a0000618c6000618ee000619140006193c
-000619620006198a000619b2000619dc00061a0200061a2800061a4e0006
-1a8000061aa800061b2e00061b5800061bc200061bf200061c2200061c48
-00061c6e00061cc600061cf600061d3200061d5c00061d8c00061dbc0006
-1df000061e2400061e5400061e9400061ece00061f1600061f3c00061f62
-00061f8800061fae00061fd4000620140006205400062090000620c00006
-20f0000621200006215000062188000621c000062200000622400006227a
-000622b4000622f00006232e00062378000623c2000624080006244e0006
-2490000624d20006250200062532000625660006259a000625d40006260e
-0006265a000626a6000626fe00062756000627ae0006280c0006283c0006
-286c000628a2000628d80006290e0006294a0006297e000629b200062a06
-00062a5a00062aae00062b0200062b5600062baa00062c0200062c5a0006
-2c8800062cb600062ce800062d1a00062d6000062da600062dd800062e0a
-00062e5c00062eb400062ef800062f3c00062f8000062fc4000630180006
-306c0006309c000630cc000631020006313800063176000631bc00063210
-0006325a000632ac000632fe0006335e000633be000633ee000634200006
-345a00063494000634e60006353a00063584000635cc0006360e00063678
-000636c6000637120006374400063776000637aa000637de000638140006
-384a00063888000638be000638f00006392c00063982000639d800063a36
-00063a9400063aea00063b4000063b7400063ba400063be800063c1e0006
-3c4e00063c9200063cd000063d0800063d4000063d7600063db200063de2
-00063e1e00063e5e00063ea400063eee00063f3a00063f8600063fdc0006
-403200064080000640ce0006411c0006416c000641c8000642240006427c
-000642d4000643280006437c000643be0006440000064448000644900006
-44d8000645260006456a000645ae000646140006467a000646e000064746
-000647ac000648120006487c000648e60006492e00064976000649be0006
-4a0600064a5200064a9e00064af200064b3e00064b8200064bd000064c38
-00064ca000064d1000064d8000064de800064e5000064e9000064ece0006
-4f1800064f4200064f8800064fc00006500e0006503e0006506e000650aa
-000650de000651040006515800065196000651ea000652d0000653f80006
-543a00065460000654b6000654e60006552800065570000655be00065608
-000656580006567e000657660006584a0006599c000659ca000659f80006
-5a8c00065b1200065b4000065bca00065bfa00065c2a00065c7800065cc6
-00065daa00065e8600065fca00065ffa0006602a000660c0000661480006
-6178000661a8000661d80006626800066298000662c80006631a00066362
-000663b80006644e000664e60006655a000665ac000665d60006662c0006
-6660000666aa000666e20006673200066770000667bc000667e20006685e
-000668b0000669c200066bcc00066d8000066f0200067074000673160006
-75e6000677a6000678ec00067b4600067c8800067e9e00067ef000067f40
-00067f9600067fec0006804e000680d600068324000684b6000686c20006
-87de0006899200068b1400068bd400068cb600068d1e00068d8000068df6
-00068e5e00068f0a00068f7a0006900a0006911e000691e20006922e0006
-92c40006937000069414000694be000695080006954a000695c000069628
-000696b800069766000697d0000698340006989a00069954000699ea0006
-9a4800069a7200069a9c00069aac00069abc00069b7e00069c8200069e8c
-00069fe200069ff20006a0a20006a1860006a1e60006a1f60006a2520006
-a2b00006a3d00006a4be0006a4ce0006a4de0006a4ee0006a4fe0006a5e4
-0006a6e40006a8bc0006aa780006ab7e0006abf80006ac720006ad240006
-ad340006ae420006ae520006ae620006af240006b0580006b1440006b154
-0006b1640006b1740006b2da0006b4460006b5720006b5820006b5920006
-b5a20006b5b20006b6940006b6a40006b8060006b9100006ba0e0006bb46
-0006bc180006bc960006bd140006be340006beb00006befc0006bf880006
-c09c0006c0f00006c2320006c2f20006c3be0006c4b40006c5be0006c670
-0006c7d60006c83c0006c9000006cb020006cc900006ce0e0006cf3e0006
-d1f00006d3320006d4600006d5d80006d7500006d8d00006da5e0006dc10
-0006dc7e0006dde20006df1a0006e01e0006e1540006e2860006e3560006
-e4260006e5820006e65c0006e6fc0006e8000006e92a0006ea280006eba8
-0006ed120006ee500006efc80006f1140006f1f60006f25e0006f3000006
-f3a00006f49e0006f6060006f7400006f8d40006fa1e0006fb020006fb60
-0006fc660006fcfc0006fdbe0006fe640006fea400070050000701220007
-01e800070310000704b0000705bc00070614000707ac0007083a0007084c
-0007087c000708ac000708e40007091c000709520007098e000709c40007
-0a0000070b6e00070bb800070c5200070cea00070d6400070de800070e4e
-00070efa00070f46000710660007111c000711f20007122a000712680007
-12dc000713d6000714f4000715f6000716380007167a000716e8000716f8
-000717080007171800071728000717380007174800071758000717680007
-17780007178800071798000717980007191c0007192c000719ec00071ab2
-00071be800071dde00071fe0000721dc00072412000726120007267e0007
-27900007292200072a7a00072b2c00072b7000072c0e00072d3e00072d8e
-00072e2400072f6000072f70000731260007325a000732aa000733000007
-33c20007340600073448000734ce0007352c0007361e000736ac000736e2
-0007375c000737d4000738240007393000073a2600073ad000073afa0007
-3b2400073b4e00073b7800073bb800073bf800073c3000073c6800073cb2
-00073cfc00073d3c00073d7c00073dc600073e1000073e5000073e900007
-3eea00073f4400073f7e00073fb800073ffc0007404000074084000740c8
-0007411c00074170000741bc00074208000742460007428a000742da0007
-432a00074384000743e20007440c00074436000744d00007456a000745ae
-000745f2000747080007471800074760000747a8000747fa0007484c0007
-48b60007490a00074956000749b400074a3e00074aa200074ae600074b30
-00074b9800074be200074c2200074c6a00074ca600074ce200074d1e0007
-4d5800074d9a00074ddc00074e1c00074e5c00074ea600074ef000074f46
-00074f9e00074fec0007503a0007507c000750ca0007510c000751560007
-5198000751dc0007523800075294000752e00007532c00075376000753c0
-000753fe0007543c000754ba0007553800075572000755ac000756460007
-56e0000757b400075888000758e400075940000759b400075a2800075b86
-00075b9600075c8000075c9000075cc600075cfc00075d3600075d700007
-5dac00075de800075e2e00075e7400075fda00076190000762dc0007649a
-00076610000767b8000768e8000769ee00076c0c00076d5000076ee60007
-706e000770ec0007723000077438000774cc00077560000776b4000777de
-0007795800077a9800077c0400077cf200077ebc00078050000780d20007
-8204000782ee0007845600078538000786ee000787e00007894200078a7e
-00078b7200078d3600078ebe00079062000791c600079362000795200007
-96a600079742000798b6000799a800079a9000079c1000079d6200079e82
-0007a01a0007a1f00007a37e0007a4280007a4de0007a6900007a7340007
-a7c20007a80e0007a85a0007a8d20007a9b00007aa2a0007aacc0007ab20
-0007ac840007adb00007aec20007afc40007b08c0007b2000007b3400007
-b5660007b6100007b73a0007b83e0007b9de0007baca0007bbc40007bcc2
-0007bda80007bec20007c07c0007c22a0007c3980007c4100007c4840007
-c5a20007c6260007c7280007c8b40007ca2c0007cb620007cc6c0007cde2
-0007cf5a0007d14c0007d33a0007d5000007d5740007d6240007d6da0007
-d78a0007d8480007d9420007da460007db400007dc4c0007dcd40007dd62
-0007ddea0007de7e0007df5a0007e0500007e1340007e22a0007e2be0007
-e37a0007e40e0007e4cc0007e5bc0007e6c40007e7c20007e8d60007e9f8
-0007eb0c0007ec4c0007ed860007eea80007efbc0007f1000007f2540007
-f4680007f61a0007f6ce0007f7ea0007f8c00007f9de0007fabc0007fc50
-0007fd0a0007fda60007fe980007ff800008006c000800ea000801e40008
-03220008044e00080482000804c6000804d600080576000806180008070e
-000807fa000808d4000809ac00080b0a00080c6a00080d0800080d9e0008
-0ddc00080e1c00080e5a00080e9a00080ef400080f4c00080fa60008100a
-0008109600081292000812e20008140e0008149400081514000815ee0008
-16c2000817c6000819b200081aca00081b3a00081bca00081c8c00081d5e
-00081dca00081e4800081f9c00081fe2000820280008210c000821480008
-21a6000821e4000822160008225a0008229c000822cc000100000d3500f2
-003c009d000700020010002f005600000468041d0005000200>
-<0000003a02be0000000300000000006a00000000000300000001000a006a
-0000000300000002000e00740000000300000003005e0082000000030000
-0004000a00e00000000300000005001800ea0000000300000006000e0102
-000000030000000700ba01100000000300000008003001ca000000030000
-0009008a01fa000000030000000d02aa028400010000000000000035052e
-000100000000000100050563000100000000000200070568000100000000
-0003002f056f00010000000000040005059e0001000000000005000c05a3
-0001000000000006000705af0001000000000007005d05b6000100000000
-00080018061300010000000000090045062b000100000000000d01550670
-0003000104030002000c07c50003000104050002001007d1000300010406
-0002000c07e10003000104070002001007ed0003000104080002001007fd
-0003000104090000006a080d0003000104090001000a0877000300010409
-0002000e08810003000104090003005e088f0003000104090004000a08ed
-0003000104090005001808f70003000104090006000e090f000300010409
-000700ba091d0003000104090008003009d70003000104090009008a0a07
-000300010409000d02aa0a9100030001040a0002000c0d3b00030001040b
-000200100d4700030001040c0002000c0d5700030001040e0002000c0d63
-0003000104100002000e0d6f000300010413000200120d7d000300010414
-0002000c0d8f000300010415000200100d9b0003000104160002000c0dab
-0003000104190002000e0db700030001041b000200100dc500030001041d
-0002000c0dd500030001041f0002000c0de10003000104240002000e0ded
-00030001042a0002000e0dfb00030001042d0002000e0e0900030001080a
-0002000c0e170003000108160002000c0e23000300010c0a0002000c0e2f
-000300010c0c0002000c0e3b00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0052006500670075006c00610072004d006f006e006f
-0074007900700065003a0041007200690061006c00200052006500670075
-006c00610072003a00560065007200730069006f006e00200035002e0030
-003100200028004d006900630072006f0073006f00660074002900410072
-00690061006c00560065007200730069006f006e00200035002e00300031
-0041007200690061006c004d00540041007200690061006c002000690073
-00200061002000740072006100640065006d00610072006b0020006f0066
-00200054006800650020004d006f006e006f007400790070006500200043
-006f00720070006f0072006100740069006f006e00200069006e00200074
-0068006500200055006e0069007400650064002000530074006100740065
-007300200061006e0064002f006f00720020006f00740068006500720020
-0063006f0075006e00740072006900650073002e0054006800650020004d
-006f006e006f007400790070006500200043006f00720070006f00720061
-00740069006f006e004d006f006e006f0074007900700065002000540079
-00700065002000440072006100770069006e00670020004f006600660069
-006300650020002d00200052006f00620069006e0020004e006900630068
-006f006c00610073002c0020005000610074007200690063006900610020
-005300610075006e0064006500720073002000310039003800320059006f
-00750020006d006100790020007500730065002000740068006900730020
-0066006f006e007400200074006f00200064006900730070006c00610079
-00200061006e00640020007000720069006e007400200063006f006e0074
-0065006e00740020006100730020007000650072006d0069007400740065
-006400200062007900200074006800650020006c006900630065006e0073
-00650020007400650072006d007300200066006f00720020007400680065
-002000700072006f006400750063007400200069006e0020007700680069
-006300680020007400680069007300200066006f006e0074002000690073
-00200069006e0063006c0075006400650064002e00200059006f00750020
-006d006100790020006f006e006c0079002000280069002900200065006d
-0062006500640020007400680069007300200066006f006e007400200069
-006e00200063006f006e00740065006e0074002000610073002000700065
-0072006d0069007400740065006400200062007900200074006800650020
-0065006d00620065006400640069006e0067002000720065007300740072
-0069006300740069006f006e007300200069006e0063006c007500640065
-006400200069006e0020007400680069007300200066006f006e0074003b
-00200061006e006400200028006900690029002000740065006d0070006f
-0072006100720069006c007900200064006f0077006e006c006f00610064
-0020007400680069007300200066006f006e007400200074006f00200061
-0020007000720069006e0074006500720020006f00720020006f00740068
-006500720020006f00750074007000750074002000640065007600690063
-006500200074006f002000680065006c00700020007000720069006e0074
-00200063006f006e00740065006e0074002ea9203230303620546865204d
-6f6e6f7479706520436f72706f726174696f6e2e20416c6c205269676874
-732052657365727665642e417269616c526567756c61724d6f6e6f747970
-653a417269616c20526567756c61723a56657273696f6e20352e30312028
-4d6963726f736f667429417269616c56657273696f6e20352e3031417269
-616c4d54417269616c20697320612074726164656d61726b206f66205468
-65204d6f6e6f7479706520436f72706f726174696f6e20696e2074686520
-556e697465642053746174657320616e642f6f72206f7468657220636f75
-6e74726965732e546865204d6f6e6f7479706520436f72706f726174696f
-6e4d6f6e6f7479706520547970652044726177696e67204f666669636520
-2d20526f62696e204e6963686f6c61732c20506174726963696120536175
-6e646572732031393832596f75206d617920757365207468697320666f6e
-7420746f20646973706c617920616e64207072696e7420636f6e74656e74
-206173207065726d697474656420627920746865206c6963656e73652074
-65726d7320666f72207468652070726f6475637420696e20776869636820
-7468697320666f6e7420697320696e636c756465642e20596f75206d6179
-206f6e6c792028692920656d626564207468697320666f6e7420696e2063
-6f6e74656e74206173207065726d69747465642062792074686520656d62
-656464696e67207265737472696374696f6e7320696e636c756465642069
-6e207468697320666f6e743b20616e6420286969292074656d706f726172
-696c7920646f776e6c6f6164207468697320666f6e7420746f2061207072
-696e746572206f72206f74686572206f7574707574206465766963652074
-6f2068656c70207072696e7420636f6e74656e742e004e006f0072006d00
-61006c006f00620079010d0065006a006e00e9006e006f0072006d006100
-6c005300740061006e0064006100720064039a03b103bd03bf03bd03b903
-ba03ac00a90020003200300030003600200054006800650020004d006f00
-6e006f007400790070006500200043006f00720070006f00720061007400
-69006f006e002e00200041006c006c002000520069006700680074007300
-2000520065007300650072007600650064002e0041007200690061006c00
-52006500670075006c00610072004d006f006e006f007400790070006500
-3a0041007200690061006c00200052006500670075006c00610072003a00
-560065007200730069006f006e00200035002e0030003100200028004d00
-6900630072006f0073006f0066007400290041007200690061006c005600
-65007200730069006f006e00200035002e00300031004100720069006100
-6c004d00540041007200690061006c002000690073002000610020007400
-72006100640065006d00610072006b0020006f0066002000540068006500
-20004d006f006e006f007400790070006500200043006f00720070006f00
-72006100740069006f006e00200069006e00200074006800650020005500
-6e0069007400650064002000530074006100740065007300200061006e00
-64002f006f00720020006f007400680065007200200063006f0075006e00
-740072006900650073002e0054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-4d006f006e006f0074007900700065002000540079007000650020004400
-72006100770069006e00670020004f006600660069006300650020002d00
-200052006f00620069006e0020004e006900630068006f006c0061007300
-2c0020005000610074007200690063006900610020005300610075006e00
-64006500720073002000310039003800320059006f00750020006d006100
-7900200075007300650020007400680069007300200066006f006e007400
-200074006f00200064006900730070006c0061007900200061006e006400
-20007000720069006e007400200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-200074006800650020006c006900630065006e0073006500200074006500
-72006d007300200066006f00720020007400680065002000700072006f00
-6400750063007400200069006e0020007700680069006300680020007400
-680069007300200066006f006e007400200069007300200069006e006300
-6c0075006400650064002e00200059006f00750020006d00610079002000
-6f006e006c0079002000280069002900200065006d006200650064002000
-7400680069007300200066006f006e007400200069006e00200063006f00
-6e00740065006e00740020006100730020007000650072006d0069007400
-7400650064002000620079002000740068006500200065006d0062006500
-6400640069006e0067002000720065007300740072006900630074006900
-6f006e007300200069006e0063006c007500640065006400200069006e00
-20007400680069007300200066006f006e0074003b00200061006e006400
-200028006900690029002000740065006d0070006f007200610072006900
-6c007900200064006f0077006e006c006f00610064002000740068006900
-7300200066006f006e007400200074006f00200061002000700072006900
-6e0074006500720020006f00720020006f00740068006500720020006f00
-750074007000750074002000640065007600690063006500200074006f00
-2000680065006c00700020007000720069006e007400200063006f006e00
-740065006e0074002e004e006f0072006d0061006c004e006f0072006d00
-610061006c0069004e006f0072006d0061006c004e006f0072006d00e100
-6c004e006f0072006d0061006c0065005300740061006e00640061006100
-720064004e006f0072006d0061006c004e006f0072006d0061006c006e00
-79004e006f0072006d0061006c041e0431044b0447043d044b0439004e00
-6f0072006d00e1006c006e0065004e006f0072006d0061006c004e006f00
-72006d0061006c004e0061007600610064006e006f0074006801b001a103
-00006e00670041007200720075006e00740061004e006f0072006d006100
-6c004e006f0072006d0061006c004e006f0072006d0061006c004e006f00
-72006d0061006c000000b900540328b326181fd0bc032900e00329000203
-29b22b1d1fb90327031db23b1f40b80323b31215320f412d03200001002f
-0320000100200320006f032000af032000bf03200004005f031e00010010
-031e007f031e0080031e00af031e00bf031e00d0031e00060000031e0010
-031e0020031e006f031e009f031e00e0031e0006031d031cb2201f104127
-0319007f03190002000f031700ef031700ff03170003001f0317002f0317
-004f0317005f0317008f0317009f03170006000f0317005f0317006f0317
-007f031700bf031700f00317000600400317b2923340b80317b28b3340b8
-0317b36a6c3240b80317b2613340b80317b35c5d3240b80317b357593240
-b80317b34d513240b80317b344493240b80317b23a3340b80317b3313432
-40b80317b32e423240b80317b3272c3240b80317b312253280b80317b30a
-0d32c04116031600d00316000200700316000102c4000f0101001f00a003
-1500b0031500020306000f0101001f00400312b32426329fbf0304000103
-0203010064001fffc00301b20d1132410a02ff02ef0012001f02ee02ed00
-64001fffc002edb30e11329f414a02e200af02e200bf02e2000302e202e2
-02e102e1007f02e00001001002e0003f02e0009f02e000bf02e000cf02e0
-00ef02e0000602e002e002df02df02de02de000f02dd002f02dd003f02dd
-005f02dd009f02dd00bf02dd00ef02dd000702dd02dd001002dc00010000
-02dc0001001002dc003f02dc000202dc02dc001002db000102db02db000f
-02da000102da02daffc002d3b2373932b9ffc002d3b22b2f32b9ffc002d3
-b21f2532b9ffc002d3b2171b32b9ffc002d3b2121632b802d2b2f9291fb9
-0326031cb23b1f40bb0322003e00330322b225311fb80318b23c691fb802
-e3b3202b1fa0413002d400b002d40002000002d4001002d4002002d40050
-02d4006002d4007002d40006006002d6007002d6008002d6009002d600a0
-02d600b002d60006000002d6001002d6002002ca002002cc002002d60030
-02d6004002d6005002d6000802d0b2202b1fb802cfb226421f411602ce02
-c70017001f02cd02c80017001f02cc02c60017001f02cb02c50017001f02
-c902c5001e001f02ca02c6b21e1f00410b02c6000002c7001002c6001002
-c7002f02c5000502c1b324121fff411102bf0001001f02bf002f02bf003f
-02bf004f02bf005f02bf008f02bf000602bf0222b2641f12410b02bb00ca
-0800001f02b200e90800001f02a600a20800406a1f402643493240204349
-3240263a3d3240203a3d329f209f26024026969932402096993240268e92
-3240208e92324026848c324020848c3240267a813240207a813240266c76
-3240206c76324026646a324020646a3240265a5f3240205a5f3240264f54
-3240204f5432b8029eb724271f374f6b0120410f02770030027700400277
-00500277000402770277027700f90400001f029bb22a2a1fb8029a402b29
-2a1f80ba0180bc0180520180a201806501807e01808101803c01805e0180
-2b01801c01801e0180400180bb0138000100800140b40180400180bb0138
-00010080013940180180ca0180ad01807301802601802501802401802001
-3740b80221b2493340b80221b2453340b80221b341423240b80221b33d3e
-320f410f0221003f0221007f0221000300bf022100cf022100ff02210003
-00400221b320223240b80221b3191e3240b80222b32a3f3240b80221b32e
-3a326f414802c3007f02c3008f02c300df02c30004002f02c3006002c300
-cf02c30003000f02c3003f02c3005f02c300c002c300ef02c300ff02c300
-0600df02220001008f02220001000f0222002f0222003f0222005f022200
-7f022200ef0222000600bf022100ef02210002006f0221007f022100af02
-210003002f0221003f0221004f0221000302c302c3022202220221022140
-1d101c102b1048038f1c010f1e014f1eff1e023700161600000012110811
-b8010db6f70df8f70d00094109028e028f001d001f0290028f001d001f02
-8fb2f91d1fb80198b226bb1f41150197001e0401001f013900260125001f
-013800730401001f0135001c0801001f0134001c02ab001f0132b21c561f
-b8010fb2262c1fba010e001e0401b61ff91ce41fe91cb80201b61fe81cbb
-1fd720b80401b21fd51cb802abb61fd41c891fc92fb80801b21fbc26b801
-01b21fba20b80201b61fb91c381fadcab80401b21f8126b8019ab21f7e26
-b8019ab61f7d1c471f6b1cb80401b21f6526b8019ab21f5e73b80401400f
-1f52265a1f481c891f441c621f4073b80801b61f3f1c5e1f3c26b8019ab2
-1f351cb80401b61f301cbb1f2b1cb80401b61f2a1c561f291cb80101b21f
-231eb80401b21f5537b80168402c07960758074f07360732072c0721071f
-071d071b071408120810080e080c080a080808060804080208000814b8ff
-e0402b000001001406100000010006040000010004100000010010020000
-01000200000001000002010802004a00b013034b024b5342014bb0c06300
-4b6220b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807
-ff52b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ff
-b101018e851bb0124358b900010111858d1bb900010128858d5959001816
-763f183f123e113946443e113946443e113946443e113946443e11394660
-443e11394660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b2b
-182b1db0964b5358b0aa1d59b0324b5358b0ff1d594bb09353205c58b901
-f201f04544b901f101f045445958b9033e01f2455258b901f2033e445959
-4bb8015653205c58b9002001f14544b9002601f145445958b9081e002045
-5258b90020081e4459594bb8019a53205c58b9002501f24544b9002401f2
-45445958b909090025455258b9002509094459594bb8040153205c58b173
-244544b1242445445958b917200073455258b9007317204459594bb80401
-53205c58b1ca254544b1252545445958b9168000ca455258b900ca168044
-59594bb03e53205c58b11c1c4544b11e1c45445958b9011a001c455258b9
-001c011a4459594bb05653205c58b11c1c4544b12f1c45445958b9018900
-1c455258b9001c01894459594bb8030153205c58b11c1c4544b11c1c4544
-5958b90de0001c455258b9001c0de04459592b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65
-422b2b01b33b59635c456523456023456560234560b08b766818b0806220
-20b163594565234520b003266062636820b003266165b059236544b06323
-4420b13b5c4565234520b003266062636820b003266165b05c236544b03b
-2344b1005c455458b15c406544b23b403b4523614459b347503437456523
-456023456560234560b089766818b080622020b134504565234520b00326
-6062636820b003266165b050236544b034234420b147374565234520b003
-266062636820b003266165b037236544b0472344b10037455458b1374065
-44b24740474523614459004b5342014b5058b108004259435c58b1080042
-59b3020b0a124358601b2159421610703eb0124358b93b21187e1bba0400
-01a8000b2b59b00c2342b00d2342b0124358b92d412d411bba0400040000
-0b2b59b00e2342b00f2342b0124358b9187e3b211bba01a80400000b2b59
-b0102342b0112342002b7475737500184569444569444569447373737374
-757374752b2b2b2b74752b2b2b2b2b737373737373737373737373737373
-737373737373737373732b2b2b45b0406144737400004bb02a534bb03f51
-5a58b1070745b040604459004bb03a534bb03f515a58b10b0b45b8ffc060
-4459004bb02e534bb03a515a58b1030345b040604459004bb02e534bb03c
-515a58b1090945b8ffc06044592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b752b2b2b2b2b2b2b435c58b9008002bbb301401e017400735903b01e4b
-5402b0124b545ab012435c5a58ba009f02220001007359002b7473012b01
-732b2b2b2b2b2b2b2b737373732b2b2b2b2b002b2b2b2b2b2b0045694473
-456944734569447374754569447345694445694445694473744569444569
-44732b2b2b2b2b732b002b732b74752b2b2b2b2b2b2b2b2b2b2b2b2b2b73
-7475732b7374757374752b2b2b742b2b000000>
-[15785 15901 16277 16325 16277 16273 15933 16169 16277 15721 16361 15561 15973
-16029 16305 15693 16345 16249 15893 15629 16365 15481 16245 16249 16357 16337
-15821 15749 16345 15937 16257 16033 19077 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-
-2 0 3 <> ArialMT AddT42Char 
-2 3242 17 <000100ba0000018700cd000300254018023c000a023c5f006f007f00af00
-04a0000100a004a198182b10f65d5ded003fed313033353315bacdcdcd00
->ArialMT AddT42Char 
-2 10012 38 <00010066ffe7057605d3001d00d3b563026a1d0201b8ffe8b40b0b065500
-b8ffe8405f0b0b06552000320d63007000741d8000841d90009a05ab03a5
-0db903b40dc70dd000e41df31d110e121d111d1d032a0628112a1c201f47
-0d56145715561968056b1d7b128b129a03990e9a1ca801a402a811d50e13
-0014001a1014101a0402b8ffdeb2283901b8ffc0402d2839100f0001041b
-131e0c031b1e040910260f4a0026200101011a1f1726200801080c0b0b06
-5508191e635c182b4e10f42b5d4ded4e10f65d4dedf4ed003fed3fed1117
-393130012b2b5d5d71005d2b2b0172011706042322240235341224333204
-17072626232206021514121633323604b4c23dfec3e5edfed79baf0143c2
-dc012c3bbf33c293a9e35c6de686a3e2020231effbc1016ed2e50155b1e0
-cb2da092a2feef91bbfee98abc00>ArialMT AddT42Char 
-2 11694 44 <000100bf0000018105ba000300ccb5010200080205b8ffc0b3383d3405b8
-ffc0b333343405b8ffc0b32d303405b8ffc0b328293405b8ffc0b3232534
-05b8ffc0b31d1e3405b8ffc0b3181a3405b8ffc0402a0d103420059005af
-050303200100008f00a000b000042f0040005000df00f000051220008f00
-90000305b8ffc0400b0d0d025500181010025500b8ffecb40f0f025500b8
-ffeeb40d0d025500b8fff640100c0c025500200b0b065500a204d659182b
-10f62b2b2b2b2b2b5d435c58b2800001015d5971723cfd5d2b2b2b2b2b2b
-2b2b3c003f3f313033113311bfc205bafa46>ArialMT AddT42Char 
-2 12858 48 <000100980000060f05ba001002e4b10202435458b90008fff6400b0c0c02
-55080e0d11025502b8ffeeb40d11025505b8ffee40280d1102550c120c0c
-0255050f0c030900010208090b0e000809020a0b06101002550b100d0d02
-550bb8fffab60c0c02550b1000b8ffe6b41010025500b8fff8b40f0f0255
-00b8fffcb40d0d0255002f2b2b2bcd2f2b2b2bcd003f3fc0c010d0d0c011
-1217392b2b3130012b2b2b001bb10602435458401f07200b0b065506200b
-0b065503200b0b065504200b0b065505200b0b065508b8fff240230b0b06
-55020c0b0b065503060c0c0655020e0c0c0655090c0c0c06550a0c0c0c06
-5507b8fff8b40d0d065508b8fff8401f0d0d06552605010c200a12340f20
-0a12340f050c0300010e0b00080801020ab8ffeeb40b0b06550ab8ffeeb4
-0c0c06550abb0256001200100256400d000c0b0b065500060c0c065500b8
-fff8b40d0d065500012f2b2b2bf42ff42b2b003f3c3f3c3c111217392b2b
-5d3130012b2b2b2b2b2b2b2b002b2b2b2b2b1b407f00020f0814021b0804
-760c860cc80c03090c490c490f032904250d2c0e58035b04760d780e870d
-080b020508390d360e4f024b03440740084d0d420e0a9802990396079608
-a803a7070612020f0e0e30050214050502080c0d0d300508140505080c52
-0f5201400102020808090a0b0b0d0d0e0e1000080902601280120212ba02
-a8000d0131b2052008b80131400a0c090a20400c7f0b010bba0256000e01
-0bb2052002b8010b40090f0100200f70100110b80256b720056005800503
-05b802a8b3113b59182b1910f45df45d3c18fd3c10ed1a1910edf45d3c1a
-18fd3c10ed1a1910ede45d00183f3f3c3c103c103c103c103c103c103c1a
-10eded87052e2b877dc4872e182b877dc43130004bb00b534bb01e515a58
-bd000cfffb0008ffd60002ffd638383859014bb00c534bb028515a58b900
-0dfff8b10e0a38385901435c58b9000dffd4b621390e2c21390db8ffd4b6
-37390e3237390db8ffd4b52d390e2c2d392b2b2b2b2b2b5972715d00715d
-015d59593311210116173637012111231101230111980124015b30161935
-015f0105bbfe56affe5805bafbf29148509b03fcfa4604cbfb3504e0fb20
->ArialMT AddT42Char 
-3 4240 68 <0002004affe8041c043e00280037022d402c090d092a190d1a2a290d2a2a
-390d3615371b3a2a492a5d0d5d2a6a0d692a60308a0d86299a169b1aa90d
-1528b8ffe8b40b0b065527b8ffe840190b0b0655a619aa28b619bb28c419
-cf28d215dd28084416011eb8fff440110c0c065512120c0c0655050c0c0c
-065535b8ffe040550c0c06551f171f182b2c2a343904392c4904482c5608
-592b6608692b760c870cc90cf90df92b1137340e0104102f243417322114
-185f296f2902291c2f0e3f0e8f0e9f0eff0e059f0eaf0eef0e030e0c0f0f
-02550eb8ffeab4101002550eb8fff44015101006550e0c0d0d06550e060f
-0f06550e0e1c0317b802aab61895141c1c0700b8fff4401a0c0c06550045
-270a321c030b2961106100060d0d025500252124b8ffecb41010025524b8
-ffec400b0d0d025524040c0c025524b8ffe4b40b0b025524b8fff4b40b0b
-065524b8ffdc400b1010065524060f0f065524b8fffcb40c0c065524b802
-5b400e27400026102620263026af260539b8ffc0b40e0e025526b8ffd6b6
-0e0e0255263139b8ffc0400d1e23343039c03902a039013917b8fff44041
-10100655172518222f24bf06cf06021f063f0602060e0f0f0255060c0d0d
-025506180c0c0255060c0b0b0255060c0b0b0655060e0d0d065506100c0c
-065506313810f62b2b2b2b2b2b2b5d71edf4ed2b105d712bf62b2b5dedf4
-2b2b2b2b2b2b2b2b3cfd2be5e5003fed3fe42b3fedfde41112392f2b2b2b
-2b2b5d71ed711112391112393901111217393130005d2b2b2b2b01715d2b
-2b0071250606232226353436363736373637363534272623220607273e02
-333216161716151514161723260306070e02151416333236373635033c64
-b96aafbc477348356bda67013345887f791db0186ed08988aa5010091722
-bc1c1762c46f5c326d6968a2261d835546ab854e814e140e0d1a24250a6e
-2d3d597118718b4b40614a2e78f0fb853d3801dd281c10284d2f48605b4f
-3d77>ArialMT AddT42Char 
-3 4962 69 <00020086ffe8041f05ba0010001d0180409b01050c0f240535054505053f
-1fb01f021f1f221c331c421c701f901f063a133c163c1a4c164c1a5d085d
-0d580f5d165e1a6a086c0d680f6e166e1ac01fd90cda17da19e213ec17ec
-19e31de01fff1f1920052f0f2f1430053f0f40054c0f50056605da1df504
-fa100c10150e040602001b1c0607010a151c0e0b1824d00b01100b400b60
-0b800b041f400d0d02550b0c0f0f02550b180d0d02550bb8fff6b40c0c02
-550bb8fff0b40b0b06550bb8fff4b40f0f06550bb8ffe0b40c0c06550bb8
-fff4402f0d0d06550b7401113300040c0c025500040d0d06550033032502
-02c001019001a001b001f001041f013f014f010301b8fffeb41010025501
-b8fffc401d0e0e0255010c0d0d025501100c0c025501120b0b0255010c0b
-0b065501b8fff8b41010065501b8fffc40160f0f065501180c0c06550114
-0d0d065501191e4737182b4e10f42b2b2b2b2b2b2b2b2b2b5d71723c4d10
-fdf42b2be410fd2b2b2b2b2b2b2b2b5d71ed003fed3f3fed3f1139111239
-3130005d015d7172007121231133113633321e0215100023222703141716
-333236353426232206012da7b472b162af7140fef2bdbc6b0234559176ac
-a57576ac05bafdf58f4f8fca73feeffed69d0196bf558bcdcbd0c6cd>ArialMT AddT42Char 
-3 5440 70 <00010050ffe803ed043e001a015ab1020243545840340e7f0f010f0b0140
-0050007000030004121c0b07181c040b010e1507080e0e0255070c0d0d02
-55070c0c0c025507100b0b0255072f2b2b2b2bcdd4c6003fed3fed10c45d
-3210c45d3231301b4047090c011f1c4313431753135317601360179b029b
-039a0da410a41a0c080d190a6a0269036a05750c700d800da60cb509b60a
-b50c0c160c860ce302030e225f0f6f0f7f0f030f01b802aa407930004000
-5000600070009000a000e000f00009000f0f0b000004121c0b07181c040b
-1c0f010f240e080d0d06550e221b000100240b2b1f010100010101400b0b
-065501401010065501480c0c0655011a0d0d065501491c1524cf07011f07
-3f0702070e0b0b0655070a1010065507120c0c065507311b34c4182b10f6
-2b2b2b5d71ed10f62b2b2b2b5d724b53234b515a58b90001ffc03859ed72
-f42bed72003fed3fed12392f11392f105de4105de43130005d71015d7159
-011706062322001134123633321617072626232206151416333236033cb1
-1defaedafef772e989addc1faf197f5a88aaa4846a8e018517b7cf011d01
-0aac010281afa11b6b6cc3d3d6c28200>ArialMT AddT42Char 
-3 5876 71 <00020046ffe803df05ba0011001d015540a40a02040d250d340d440d0535
-14351c5702540a5214531c6702640565096314601cc01fd405d513dd19e5
-13e514ef17eb19e51de01fff1f161f1f2b1a3c163c1a4b1a701f901f072e
-02240d2e163a02350d4b02450d4614491c570a560d670de506e716fa01f4
-0e100115030e0b100f001b1c0b0711000a151c030b1833010025110f2510
-10d011011011401160118011041f400b0b02551f400d0d02551112101002
-5511b8fff440110f0f025511060e0e025511180d0d025511b8fff2400b0b
-0b0655110e1010065511b8ffeeb40c0c065511b8fff840420d0d06551174
-1224bf07cf07df07ff07041f073f074f0703071e0b0b025507180c0c0255
-071e0d0d0255070c0b0b0655070c0d0d0655071a0c0c065507191e345018
-2b4e10f42b2b2b2b2b2b5d714dedfd2b2b2b2b2b2b2b2b2b2b5d713c10ed
-10fd3ce4003fed3f3c3fed3f3c11391112393130005d01715d0071213506
-232226263534123633321617113311011416333236353426232206033865
-c47fd5756ad48360962fb3fd20ac7576a5a87b78a1869e8cfba39f01038a
-5141020efa460212cccac1c6daccc400>ArialMT AddT42Char 
-3 6312 72 <0002004bffe8041e043e0015001d015340171f001c150255035d055d0955
-0b65036b056f09650b0815b8ffe4b40d0d065511b8ffe440520d0d06551d
-1c0d0d06552712d905fa14f61a0431123a19311c41124d1a411c51125c19
-521c61126d1a611c78067815f602f618100016010f0d1717501660167016
-03161c0f9010a010021010041b1c0a0700ba02aa0001ffc0b41010025501
-b8ffc04010101006551001010195131c040b17400db8ffdcb40d0d02550d
-b8ffeeb40d0d06550db8ffeab40c0c06550db8ffc04009272a34b00d010d
-1a1fb8ffc0b32526341fb8ffc040411e2334301f011f163310240740242a
-341f073f074f070307200b0b025507180c0c0255071c0d0d0255070e0b0b
-0655071c0c0c065507160d0d065507191e3437182b4e10f42b2b2b2b2b2b
-5d2b4dfde44e10712b2bf6712b2b2b2b4ded003fedfd5d2b2be43fed1239
-2f5d3cfd713c011112393912393130015d005d2b2b2b0171720117060623
-22001110003332001114072116163332360121262726232206035eba2cee
-b9e9feef0114dcd5010e01fce80ab285638cfdda02510c3856897ca90156
-17a3b4011f0103010c0128fedefef91020afba680195864368a6>ArialMT AddT42Char 
-3 6758 73 <000100130000028005d30017010d401e1409010f192f193019401970199b
-0c9c0da90d081a0d280db019c0190419b8ffc040281a1f341d080d030c0f
-1c0a0115022b1413040306000a9f140114ff134004172504000302920101
-00b8ffc0b331383400b8ffc0402b1c1f3490000119400f0f025519400d0e
-025500141010025500280f0f025500220e0e0255002c0d0d025500b8fff2
-400b0c0c025500140b0b065500b8ffeab41010065500b8ffe6b40f0f0655
-00b8fffab70c0c065500a31819bc01ba002100f6010a00182b2bf62b2b2b
-2b2b2b2b2b2b2b2b5d2b2b3c10f43c103ced10eded5d003f3f3c3c3cfd3c
-3fed391139313043794014101106090706080602061009121b0011060f1b
-012b012b2a8181012b715d00723311233533353437363633321707262322
-06151533152311b29f9f131a83764c5c1b38325244cfcf039a8c716b3446
-57129d0a4660628cfc66>ArialMT AddT42Char 
-3 7098 74 <00020042fe5103ea043e001e002a016f40600b0b05142c0b25144c0b4514
-06091d191d2c0b26142c23390b36144a0b46145607580b680bfa0af5150e
-2e232c273e233e274c27902ca02c07362136293f2c460b46214529542154
-29690763216329602c802cda27e821ee23ef271117160615b802b1b4281c
-130701b802aa401020003000600070008000c000d0000700b8027d403205
-1c1c0f0a45221c0c0a16153325330a251818d01701101740176017801704
-2c400b0c02552c400d0d025517121010025517b8fff440110f0f02551706
-0e0e025517160d0d025517b8ffea400b0b0b065517121010065517b8ffee
-b40c0c065517b8fffc404a0d0d065517740f012500221f24bf0fcf0fdf0f
-ff0f041f0f3f0f4f0f030f200b0b02550f1a0c0c02550f220d0d02550f1c
-0b0b06550f0c0d0d06550f1a0c0c06550f192b2c74213450182b2b4ef42b
-2b2b2b2b2b5d714dedf4ed10fd2b2b2b2b2b2b2b2b2b2b5d713c10fde4f6
-3c003fede43fedfd5de43fede43f3c3130015d71005d7117171617163332
-363736270623220235341236333217353311140606232226131416333236
-35342623220666af0b3243747d88180e0176b0dbf06ed18dbc7aa665dba0
-beea99a67d7ca8ad7a78a8581a512532645a37b08b013cdd9801018c9880
-fc6af8cf78ab032ad1c0bfccc3c6c300>ArialMT AddT42Char 
-3 7594 75 <00010087000003e805ba00140161b90016ffc0b315173403b8ffe0400e0d
-0d0655250435034503ba0d0403b8ffe0403a1719341708110c1114030501
-000f1c0507140b0a0c250940333634ff0901c0090116400b0b0255164010
-10025509281010025509140e0e025509b8ffec40110d0d025509040c0c02
-55091a0b0b025509b8fff6400b0b0b065509141010065509b8fff8400b0d
-0d0655090a0f0f065509b8fff6b60c0c0655094e16b8ffc04017343634b0
-16f016027016a016b016ff1604160214250100b8ffc04010333634f00001
-00002000d000e0000400b8fffab41010025500b8fffa40170e0e02550004
-0c0c025500080b0b025500040b0b065500b8fffa40160f0f065500020c0c
-065500020d0d0655004e154750182b10f62b2b2b2b2b2b2b2b5d712b3cfd
-3c105d712bf42b2b2b2b2b2b2b2b2b2b2b2b5d712bed003f3c3fed3f1139
-113901123931304379400e060e07250e060c1b010d080f1b01002b012b2b
-81002b5d2b012b33113311363332161615112311342623220606151187b4
-7ec076ae4bb4756b508d3c05bafdf2925da49cfd5f02a1877b538e7dfdbb
->ArialMT AddT42Char 
-3 8014 76 <000200880000013c05ba0003000700cd405e09360b0b02554f099009a009
-b009c009df09f0090700091f09700980099f09b009c009df09e009ff090a
-1f09010001070402030906037e0100060506040a0607250500049f04a004
-b004c004e00406c004f0040200042004d004e0040404b8fff8b410100255
-04b8fffa40170e0e025504040c0c0255040a0b0b025504140b0b065504b8
-ffeab41010065504b8fffeb40d0d065504b8fffc400a0c0c0655044e0847
-50182b10f62b2b2b2b2b2b2b2b5d71723cfd3c003f3f3c3fed0111123939
-111239393130015d72712b133533150311331188b4b4b404ebcfcffb1504
-26fbda00>ArialMT AddT42Char 
-3 9202 79 <000100830000013705ba000300e3b605360b0b025505b8ffc0b337383405
-b8ffc0b334353405b8ffc0b330313405b8ffc0b322253405b8ffc0402515
-17340f051f059f05df05044f05df05f005031f0570058005ff0504010000
-0a0203250100b8ffc0b337383400b8ffc040153335349f0001c000f00002
-00002000d000e0000400b8fff8b41010025500b8fffa401d0e0e02550004
-0c0c0255000a0b0b025500140b0b065500081010065500b8fffeb40d0d06
-5500b8ffffb40c0c065500b8fffc400a0c0c0655004e044750182b10f62b
-2b2b2b2b2b2b2b2b5d71722b2b3cfd3c003f3f3130015d71722b2b2b2b2b
-2b3311331183b405bafa4600>ArialMT AddT42Char 
-3 9454 80 <0001008700000626043e002301c7b9000dfff4b40d0d065508b8fff4b40d
-0d065509b8ffd8404d0b0d342504e404e409e117e52005d505f620021708
-202309181b20090303231e1c06151c0b0b06070106231a19100ad0250190
-25a025022517171a0e2590110111041010025511180f0f025511b8ffec40
-0b0e0e025511140c0c025511b8ffe840170b0b025511020b0b0655110c10
-10065511060f0f065511b8fffab40c0c065511b8fff8b40d0d065511b801
-5d400c1825901b011b180f0f02551bb8ffec400b0e0e02551b140c0c0255
-1bb8ffee40110b0b02551b040b0b06551b0a101006551bb8fffe400b0d0d
-06551b0c0f0f06551bb8fffcb40c0c06551bb8015d4016000233232501d0
-00019000a000021f003f004f000300b8fffe401d0e0e025500100d0d0255
-00100c0c0255000c0b0b025500160b0b065500b8fffcb41010065500b8ff
-f440140f0f0655000a0c0c0655000e0d0d065500192425b80178b3214750
-182b2b4ef42b2b2b2b2b2b2b2b2b5d71723c4dfde410f42b2b2b2b2b2b2b
-2b2b5dedf42b2b2b2b2b2b2b2b2b2b5dfd4e456544e67172003f3c3c3c3f
-3f3c4d10ed10ed11173901111239123931304379400e0c141326140c111b
-01120d151b01002b012b2b81015d005d2b2b2b3311331536363332161736
-3332161511231134262623220615112311342623220606151187a132a66a
-76971f7eca9eaab3235c3e7094b458644c813a0426954e5f6258baafb6fd
-27029d6c5f3a95a4fd9702b27878509a91fdd900>ArialMT AddT42Char 
-3 10014 81 <00010087000003e6043e0016017d40130503061302a810b810e303e713f0
-03f6130604b8fff0403c0b0d347910019810d018e018ff18042008140e14
-16121c05070106160d0a0d0e0c0e2418401010025518400b0b02550b2810
-1002550b140e0e02550bb8ffec40110d0d02550b040c0c02550b220b0b02
-550bb8fff4400b0b0b06550b14101006550bb8fff9400b0d0d06550b0a0f
-0f06550bb8fff640120c0c06550b40333634ff0b01ff0b010b4e18b8ffc0
-401a343634b018f018027018a018b018c01804180302331516250100b8ff
-f6b41111025500b8fffab41010025500b8fffa40170e0e025500040c0c02
-55000a0b0b025500040b0b065500b8fffa40110f0f065500020c0c065500
-040d0d065500b8ffc04012333634f0000100002000d000e00004004e1710
-f65d712b2b2b2b2b2b2b2b2b2b3cfd3cf43c105d712bf65d712b2b2b2b2b
-2b2b2b2b2b2b2b2bed3c103c003f3c3f3fed113901123931304379401606
-11090a080a070a0306102611060e1b010f0a121b01002b012b2b2a81015d
-71002b5d71331133153633321616171615112311342626232206151187a2
-75dd60a150100ab42a6b4873a7042697af45704d327dfd7302866e6d4192
-ccfdbc00>ArialMT AddT42Char 
-3 10468 82 <00020044ffe80427043e000d0019016bb615180d0d065513b8ffe8b40d0d
-06550fb8ffe840730d0d065519180d0d065512070a190c47064808560659
-08670669080834103a123a16351845104b124b1645185c055c0952105d12
-5d1652186d056d0964106d126d1664187701150906050d5b035405540a5b
-0c6c036505650a6c0c0a171c0407111c0b0b14241b400d0d02551b400b0b
-025507b8ffea40110f0f025507180d0d025507100b0b025507b8fff0b40b
-0b065507b8fff0b40d0d065507b8fff0b40f0f065507b8fff0b40c0c0655
-07b8ffc04013242534300701000710072007030731df1b011bb8ffc04049
-1e2334301b011b0e24000c0e0f025500120d0d0255000c0c0c0255001c0b
-0b0255000e0b0b0655000e0d0d0655000c1010065500160c0c0655004024
-25341f003f000200311a3437182b10f65d2b2b2b2b2b2b2b2b2bed10712b
-5df65d5d2b2b2b2b2b2b2b2b2b2bed003fed3fed313001715d0071435c58
-4009530553096205620904015d59002b2b2b2b1310373633320015140606
-23220013141633323635342623220644a489c5db01167beb8bdffeedb9b2
-8786b2b38587b2021301278e76fee1fdcdeb82011e010dcccbccd1c5cbca
->ArialMT AddT42Char 
-3 10918 83 <00020087fe690421043e0012001e0162408e0c102d103d104b10043f20b0
-20021f20290c231d3215321d421d70209020083a173a1b4a174a1b59085b
-0c5c175c1b6a086b0c69106d176b1bc020d314dd18dd1ad31ee414e41ee0
-20ff201623042b102b1535043a1046044a105a10e50beb1dfe100b110e03
-161c1c06070106161c0e0b000e1924d00a01100a400a600a800a0420400b
-0b025520400d0d02550ab8ffe6400b0f0f02550a180d0d02550ab8fffab4
-0c0c02550ab8ffeeb40b0b06550ab8fff4b40f0f06550ab8ffe840230c0c
-06550a74011333023312250000c001019001a001b001f001041f013f014f
-010301b8fffc401d0e0e025501100d0d025501100c0c025501100b0b0255
-010c0b0b065501b8fff6b41010065501b8fffc40160f0f0655010c0c0c06
-5501120d0d065501191f473718012b4e10f42b2b2b2b2b2b2b2b2b5d7172
-3c4d10fdf4e410fd2b2b2b2b2b2b2b2b5d71ed003f3fed3f3fed11391239
-3130005d015d717200711311331536363332161615140206232226271103
-141633323635342623220687a43a926888d06a75df7b5a8f2e11a67678ab
-a77473b1fe6905bd8a51518cff98a3fefb8b4c3afdfb03a4cdc4cbd5cbca
-d700>ArialMT AddT42Char 
-3 11776 85 <00010085000002c6043e001100c9403b2f13011004012304340443045304
-66047404060911080908090d1311090d000308010b1c06070106000a0928
-900801082220130113022211250100b8ffc04010333634f0000100002000
-d000e0000400b8fff8b41010025500b8fff840110e0e025500040c0c0255
-00060b0b025500b8fffcb41010065500b8fff440160f0f065500060c0c06
-5500080d0d0655004e1247c4182b10f62b2b2b2b2b2b2b2b5d712b3cfde4
-105df472e4003f3f3fed11393911393901111239390010c9870e7dc43130
-005d72015d33113315363633321707262322060706151185a23e693f5b5e
-3e42423b5e141e0426a171483aa727473f6072fdd400>ArialMT AddT42Char 
-3 12038 86 <0001003fffe803b1043e00300317407b042214223a094a09442456226522
-7c098e098424a613ab2cc2030d09171a1817304b2cd617051b0255020210
-32010a185c085c095c0a5c0b5c0c5c0d6a086a096a0a6a0b6a0c6a0db426
-b4270f27262427242936245a0a590b64266428742374248024930a9c0c92
-28972c9530a40aa90ca327a428b326c5261628b8fff4b40d0d065522b8ff
-f4b40d0d065523b8fff4b40d0d065524b8fff4b40d0d065528b8fff4b40c
-0c065522b8fff4b40c0c065523b8fff4b40c0c065524b8fff4b40c0c0655
-1db8ffde40121e395a0827250c0a041a202615040b2e1d1ab802aa402219
-2c0b0b02551f193f194f195f19af19cf19060f191f196f19df19041f198f
-190219bd02550015000002aa0001ffc040140b0b025510014001021001d0
-0102000110010201b8ffc0b314163401b8ffc040100e113401012e5c1d6c
-1d021d1c150704b8fff4b40b0b025504b8ffe6b41010065504b8ffe64013
-0f0f0655041c2e0b1f1a011a24194013183432b8ffc0402f0f0f02551918
-0f0f025519180d0d025519160c0c025519201010065519200f0f06551910
-0c0c065519160d0d065519b8025bb207242ab8ffc0b51c39d02a012ab8ff
-e6b40c0c02552ab8ffe8b40f0f02552ab8ffe8b40c0c06552ab8ffeab60d
-0d06552a1a32b8ffc04021272a346032c032023f32803202321001010124
-00180d0d025500100d0d06550020b8fff4b40d0d025520b8fff4b4101006
-5520b8fff440190f0f065520240f100b0b02550f160c0c02550f200d0d02
-550fb8fffa40200f0f02550f0e0c0c06550f0c0d0d06550f22df00013f00
-4f00020019313437182b4e10f45d714df42b2b2b2b2b2bed2b2b2b102b2b
-ed724e105d712bf62b2b2b2b712b4dedf42b2b2b2b2b2b2b2b2bed72003f
-ed2b2b2b3fed7112392f2b2b5d71722be410fd5d71722be4111239111239
-0111121739313043794040272d1e2305142c261110121013100306220d20
-1b000928071b01052d071b011e14201b00210e231b0022230d0c08290a1b
-012827090a062b041b001f101d1b01002b2b103c103c2b103c103c2b012b
-2b2b2b2a2b818181002b2b2b2b2b2b2b2b2b5d71015d72715d1337161633
-323635342726272e02353436373636333216161707262623220615141716
-1716171e02151406062322263fb20f897b7c78352593c6994f41382a9153
-7dbd5a11b00c73697c6a16162f1b84bf975669c67dcfd9013d1c6b726544
-3d2318253249814e4779281f2b487b6718525c5237231c1d130a2433417c
-5c5a9f57ac00>ArialMT AddT42Char 
-3 12974 87 <00010024fff2022a0599001700d8b9000affc0b323263409b8ffc0404123
-263480190100010c0d0a0103001610092b0f0a06161c030b0f1022002201
-0d12250c01ff070845094560077007800790070400072007a007b007c007
-d0070607b8ffeeb41010025507b8fff4b40f0f025507b8fff2b40e0e0255
-07b8fff8b40d0d025507b8fff8b40c0c025507b8fffab41010065507b8ff
-f0400b0f0f065507060c0c065507b8ffe8b40d0d065507ba026a00180136
-b166182b10f62b2b2b2b2b2b2b2b2b5d71f4e410ed3cfd3c10e4f43c003f
-ed3f3cfd3c1139123911333310c93130015d2b2b25170623222626351123
-353311371133152311141616333202101a4c3c626c2c8484b3b5b5132b28
-1ea19f103e65a202638c01076cfe8d8cfd934d2c1a00>ArialMT AddT42Char 
-3 13680 89 <0001001a000003e80426000a01eab1020243545840170508000a08060106
-0a0005090805010205240f0f0255052f2bddcd10ddcd113333003f3f3f12
-3931301bb7350501002211390ab8ffde400d11390916121c340816121c34
-02b8ffeab3121c3401b8ffeab3121c340ab8ffd840091e213400281e2134
-0ab8ffe8400922253400162225340ab8ffda407e282e340020282e340f0c
-29002809260a3900350a4800470a56015602590858096601660269086909
-78007701770279087809770a870187028603890788088a099d009809910a
-ac00a20abd00b707b10ac900c50ada00d50aec00e30afb00f40a2c0a0005
-0a1800160a2800260a370a4f00400a09054012163405400b0d34b1060243
-5458400905010008060106000ab8fff4400f0d0d06550a000c0d0d065500
-050908b8fff440120d0d0655080501020c0d0d06550205050c0b1112392f
-dd2bcd10dd2bcd10cd2bcd2b002f3f3f11123931301b40370a0708082509
-0a1409090a0003020225010014010100050a0a000a09080802020106070a
-09030001052f0c010c22084040400980090209b8011bb5400580050205b8
-011b400920024001220bead2182b10f6ed1a19fd5dfd5d1a18ede45d1112
-3939123939003f3c103c103c3f3c113987052e2b877dc4872e182b877dc4
-593130002b2b01715d2b2b2b2b2b2b2b2b2b2b2b2b005d59210133131617
-363713330101aefe6cbee4251f182becb9fe6e0426fd84676f54760288fb
-da00>ArialMT AddT42Char 
-4 0 92 <00010021fe5103ee0426001a01f7b10202435458401d0a140f030b031c19
-0f12060b061340120f200b400c200f180f0f02550f192f2b1add1a18cd1a
-1910dd1a18cd003f3f3fed12173931301bb30f1c010fb8ffde406d1c3928
-14560faf0a03400d400f020f202830341020283034070c0912160d181227
-0b270c270d360c360d350e99110b28122813481659125913591569126913
-69157906760d79117a147a15850d8a118c128c138914980aa80bbc10bb11
-ba14ea0ae714f50dfd10f914ff1c1e12b106024354584016130b1c1b040f
-440f840f030f190b031c190f12060b06003f3f3fed1112395d0111123939
-1b40370f0f0c101112120a00031914131325120a1412120a0f0c0f110c25
-0b0a140b0b0a1312120c0c0b06031c190f001c101c022f1cbf1c021cb802
-3fb50f1340124014b80254400b3f124012025f12bf120212b80142b60f01
-2200451b0ab8025440120f200b4040200c300c4f0c03500cff0c020cb801
-42b32f0f010fb8023fb41b207c66182b1a1910fd71f45d711a18ed1a1910
-ed1810f4e41910e45d71ed1a1810ed1910e45d7100183fed3f3c103c103c
-87052e2b087d10c487052e182b0e7d10c400111239870e103c3c08c44bb0
-0e534bb018515a58bb000cffe8000bffe80138385959313001435c58b900
-14ffdeb637390a2237390eb8ffe8b51539112215392b2b2b2b595d712b2b
-00715d2b015d591327163332363736373637013313161736371333010607
-060623227f143b2c3c48171126050bfe6dc2dd2b221f2be3b4fe6c412430
-7c5634fe67a91028241b6b0f1d0428fd9975817c76026bfbc8af42595300
->ArialMT AddT42Char 
-2 0 0 <00020100000005000500000300070000211121112521112101000400fc20
-03c0fc400500fb002004c000>ArialMT AddT42Char 
-ArialMT /CharStrings get begin
-/space 3 def
-/period 17 def
-/C 38 def
-/I 44 def
-/M 48 def
-/a 68 def
-/b 69 def
-/c 70 def
-/d 71 def
-/e 72 def
-/f 73 def
-/g 74 def
-/h 75 def
-/i 76 def
-/l 79 def
-/m 80 def
-/n 81 def
-/o 82 def
-/p 83 def
-/r 85 def
-/s 86 def
-/t 87 def
-/v 89 def
-/y 92 def
-end
-ArialMT /Encoding get
-dup 32 /space put
-dup 46 /period put
-dup 67 /C put
-dup 73 /I put
-dup 77 /M put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 118 /v put
-dup 121 /y put
-pop
-end
-%ADOEndSubsetFont
-/KUDFOK+ArialMT /ArialMT findfont ct_VMDictPut
-/KUDFOK+ArialMT*1 
-[32{/.notdef}rp /space 13{/.notdef}rp /period 20{/.notdef}rp /C 5{/.notdef}rp /I 
-3{/.notdef}rp /M 19{/.notdef}rp /a /b /c /d /e 
-/f /g /h /i 2{/.notdef}rp /l /m /n 
-/o /p /.notdef /r /s /t /.notdef /v 
-2{/.notdef}rp /y 134{/.notdef}rp]
-KUDFOK+ArialMT nf
-KUDFOK+ArialMT*1 [18 0 0 -18 0 0 ]msf
-475.2 279.12 mo
-(ICC Manager and caches)
-[5.04001 12.96 12.96 5.04001 14.9938 9.95404 9.95398 9.95398 10.08 9.95398 5.9939 5.03998 
-10.08 9.95398 9.95398 5.04004 8.94598 10.008 8.94598 10.008 9.95398 0 ]xsh
-475.2 300.72 mo
-(are member variables of )
-[9.95398 5.9939 9.95398 5.04001 14.9939 9.95398 14.9939 9.95398 9.95398 5.9939 5.03998 8.94598 
-10.134 5.99384 3.96002 9.95398 9.95398 4.086 9.95404 8.94598 5.09399 9.95398 5.03998 0 
-]xsh
-475.2 322.32 mo
-(graphics library imager )
-[9.95398 5.9939 9.95398 9.95398 10.08 3.96002 8.94598 8.94598 5.14801 3.96002 3.95996 9.95404 
-6.11981 9.95404 6.11987 8.94598 5.09399 3.96002 14.9938 9.95404 9.95398 9.95398 5.99384 0 
-]xsh
-475.2 343.92 mo
-(state.)
-[8.94601 5.09399 9.95398 5.04001 9.95398 0 ]xsh
-/KUDFOK+ArialMT*1 uf
-/KUDFOK+ArialMT uf
-/ArialMT uf
-12 420 mo
-228 420 li
-228 528 li
-12 528 li
-cp
-@
-gsave
-48.001 246.003 mo
-76.507 246.003 li
-76.507 277.135 li
-48.001 277.135 li
-cp
-clp
-48 245.753 mo
-76.5052 245.753 li
-76.5052 277.132 li
-48 277.132 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 48 294.246 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-%ADOBeginSubsetFont: ArialMT Initial
-ct_T42Dict begin
--0.664 -0.324 2 1.004
- 256 array 0 1 255 {1 index exch /.notdef put} for  /ArialMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f3210325d73000000cc000000606376
-7420a11cd7eb0000012c000006546670676dcc79599a000007800000066e
-676c796607022dca000094e0000822cc68656164d6144b3e00000df00000
-003668686561123315fe00000e2800000024686d7478f65efffb00000e4c
-000034d46c6f6361361cd72000004320000034d86d617870124c05df0000
-77f8000000206e616d659617a74000007818000011057072657025d64dbf
-0000892000000bbe67646972000000000000000000000000000303880190
-00050008059a05330000011b059a0533000003d1006602120805020b0604
-020202020204e0002affc00078430000000900000000544d432000400020
-fffc05d3fe510133073e01b2400001ffffff0000042605bb000000200004
-05ba001905ba001a05a70019042600180000ffe70000ffe80000ffe7fe69
-ffe805ba0019fe69ffe802ea000000b8000000b80000000000a800ad0169
-00ad00bf00c201f0001800af00b900b400c800170044009c007c00940087
-0006005a00c80089005200520005004400940119ffb4002f00a1000300a1
-00cd00170057007e00ba00160118ffe9007f008503d300870085000d0022
-00410050006f008d014cff75005c00df04830037004c006e00700180ff58
-ff8eff92ffa400a500b903c8fffd000b001a0063006300cdffee05d8ffdc
-002d005c0095009900df019209b500400057008000b9039d0072009a035d
-0401ff67fffa00030021007700cd0004004d00cd01c0022b004c006500e7
-0118017c034305d8ffa3ffb0ffc40003001c005d0068009a00ba01350147
-0221055cff4dffcd0016002d00780080009900b200b600b600b800bd00da
-010c05f0ffa4fff00019002c0049007f00b400ce01c003fefd81fe3f0000
-00050018002900390049006f00be00c700d0012301c1026f050c05320540
-057affd4001400310055005700a700b400e601f7027e027e027f03c60446
-ff42000e0085009100bf00c200c500e1011a012f014f01560229026f029e
-03720008002c00310031006400690089009800c700de012b01b6020c02cf
-03a304ab04fb061dfee0ff0e00060026009b009d00c1010d011801200173
-018201d601e30243025f029b02e2039404a904d20761001c005e006d008d
-00ab00f7011201380151015b0168017c01870191019901cd01d001e80241
-0254026b02ef0368037103bd044204420453047304830586058b06e8fe58
-fec4fed1fef7ff32ff860051007c008100910095009e00b400b900cf00d9
-00d900df00e20105010b010e010e012001210155017b017b017e018d01a2
-01a801a901b401d001d001e201e901f201f501fb020002000206021b0221
-022202220223027202770294029c02cf02cf02d002ec02f903170322032b
-0335033c0359036f037103870390039003b503e1041a04cf04ff05320532
-0596059f05a805ab05c205f0060c0782080008ccfca3fd2afddefe00fe88
-fe96feb2feb4ffe100150019001a001c001f003c005100610061006a0078
-009600a500af00d3010c0118011a012a013e014c0151015f016a01710178
-01820184019a01a501a801a901ae01bc01cd01d701ef0200020d021c0221
-0222022e02350242024f024f025e026502710290029202b402d602fa0307
-030b030f0315032a0347035d036503740379039603b003cc03dd03e203f6
-03fc03fc03ff040a041f04220426042b0447045f0475049e04e704e7055c
-05cb05e5060a066d068606b806f10736073e07500751075d078f07b607d4
-086000b600c300b500b700000000000000000000000001e00381034503b5
-008e0233041902ce02ce002d005f0064034d023f000002a80188027d01b4
-02240578063b023b014e00f00426029402c6029f02f6023b034d014b0153
-006a0231000000000000061404aa0000003c04c300ed04bc026502ce03b5
-0078060c017e02ef060c00b201000239000001c50330042b03cb00da03df
-010704a100db040a011701ed02a70350010b01bd043e05580021039c00ae
-0371017d00b5024500000afb088c012b014e01aa00870054013201f803ff
-0003024e00b4003703e30083006b02d800ed00770088009701640467008e
-0033017c00e700a6029e0329056e062a061501c90269048a021301b40002
-04a9000002390124010305140084015d039a06ef02d9007500cf040a00de
-03ac04bc02cf02ae034d04f005520168006d007d00860071ff8100790558
-04d2016700030156002504e00094007c033204210094007f0072005c002f
-00b6001800ba00b80041034d00720018001f004c016a01550099009a009a
-009800b200040078006900140057006e00ce00b4065402b80067050e0165
-00e7000004cbfe52005affa60099ff67006eff92002dffd40087ff7c00b8
-00a800e5008f00a80185fe7b0070001e00d900de014c054602cf0546ff2d
-028a02d90253029600b700000000000000000000000000000125011800ea
-00ea00ae0000003e05bb008a04d70053003fff8cffd50015002800220099
-0062004a00e4006d00ee00e5004803c00033fe4e02b1ff460370007905df
-0051ffa7ff1f010a0068ff6c004f00bc00a507050061072b00ed04b001d2
-00b6007b00650252ff740365fe690094008f005c00400086007500890089
-4043555441403f3e3d3c3b3a3938373534333231302f2e2d2c2b2a292827
-262524232221201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09
-0807060504030201002c4523466020b02660b004262348482d2c45234623
-6120b02661b004262348482d2c45234660b0206120b04660b00426234848
-2d2c4523462361b0206020b02661b02061b004262348482d2c45234660b0
-406120b06660b004262348482d2c4523462361b0406020b02661b04061b0
-04262348482d2c0110203c003c2d2c20452320b0cd442320b8015a515823
-20b08d44235920b0ed51582320b04d44235920b09051582320b00d442359
-21212d2c20204518684420b001602045b04676688a4560442d2c01b10b0a
-432343650a2d2c00b10a0b4323430b2d2c00b0172370b101173e01b01723
-70b10217453ab10200080d2d2c45b01a234445b01923442d2c2045b00325
-456164b050515845441b2121592d2cb00143632362b0002342b00f2b2d2c
-2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b1
-2cc08a8cb8100062602b0c642364615c58b00361592d2c45b0112bb01723
-44b0177ae4182d2c45b0112bb01723442d2cb01243588745b0112bb01723
-44b0177ae41b038a45186920b01723448a8a8720b0a05158b0112bb01723
-44b0177ae41b21b0177ae45959182d2c2d2cb0022546608a46b040618c48
-2d2c4b53205c58b002855958b00185592d2c20b0032545b019234445b01a
-23444565234520b00325606a20b009234223688a6a606120b01a8ab00052
-7921b21a1a40b9ffe0001a45208a54582321b03f1b235961441cb114008a
-5279b31940201945208a54582321b03f1b235961442d2cb110114323430b
-2d2cb10e0f4323430b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2c
-b10e0f432343650b2d2cb11011432343650b2d2c4b525845441b2121592d
-2c0120b003252349b04060b0206320b000525823b002253823b002256538
-008a63381b212121212159012d2c4bb06451584569b00943608a103a1b21
-2121592d2c01b005251023208af500b0016023edec2d2c01b00525102320
-8af500b0016123edec2d2c01b0062510f500edec2d2c20b001600110203c
-003c2d2c20b001610110203c003c2d2cb02b2bb02a2a2d2c00b00743b006
-430b2d2c3eb02a2a2d2c352d2c76b8022323701020b802234520b0005058
-b00161593a2f182d2c21210c6423648bb84000622d2c21b08051580c6423
-648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb815
-55621bb200802f2b59b002602d2c0c6423648bb84000626023212d2cb400
-0100000015b00826b00826b00826b008260f10161345683ab001162d2cb4
-000100000015b00826b00826b00826b008260f1016134568653ab001162d
-2c4b53234b515a5820458a60441b2121592d2c4b545820458a60441b2121
-592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb01343
-58031b02592d2cb0134358021b03592d2c4b54b012435c5a58381b212159
-2d2cb012435c580cb00425b00425060c6423646164b807085158b00425b0
-0425012046b01060482046b0106048590a21211b2121592d2cb012435c58
-0cb00425b00425060c6423646164b807085158b00425b00425012046b8ff
-f060482046b8fff06048590a21211b2121592d2c4b53234b515a58b03a2b
-1b2121592d2c4b53234b515a58b03b2b1b2121592d2c4b53234b515ab012
-435c5a58381b2121592d2c0c8a034b54b00426024b545a8a8a0ab012435c
-5a58381b2121592d2c4b5258b00425b0042549b00425b00425496120b000
-5458212043b0005558b00325b00325b8ffc038b8ffc038591bb040545820
-43b0005458b00225b8ffc038591b2043b0005458b00325b00325b8ffc038
-b8ffc0381bb00325b8ffc03859595959212121212d2c462346608a8a4623
-20468a608a61b8ff8062232010238ab902c202c28a70456020b0005058b0
-0161b8ffba8b1bb0468c59b0106068013a2d2cb1020042b123018851b140
-0188535a58b910000020885458b202010243604259b12401885158b92000
-0040885458b2020202436042b12401885458b2022002436042004b014b52
-58b2020802436042591bb940000080885458b202040243604259b9400000
-8063b80100885458b202080243604259b94000010063b80200885458b202
-100243604259b94000020063b80400885458b20240024360425959595959
-2d2cb0024354584b53234b515a58381b2121591b21212121592d00000001
-00000005028fa58dc35f5f0f3cf5081b080000000000a2e3272a00000000
-c14fd713faaffd671000080c00000009000100010000000000010000073e
-fe4e00431000faaffa7a1000000100000000000000000000000000000d35
-06000100000000000239000002390000023900b002d7005e047300150473
-0049071d0077055600580187005a02aa007c02aa007c031d004004ac0072
-023900aa02aa0041023900ba0239000004730055047300df0473003c0473
-00560473001a047300550473004d047300610473005304730055023900b9
-023900aa04ac007004ac007204ac00700473005a081f006f0556fffd0556
-009605c7006605c7009e055600a204e300a80639006d05c700a4023900bf
-04000037055600960473009606aa009805c7009c063900630556009e0639
-005805c700a10556005c04e3003005c700a105560009078d001905560009
-0556000604e300290239008b023900000239002703c100360473ffe102aa
-00590473004a0473008604000050047300460473004b0239001304730042
-0473008701c7008801c7ffa20400008801c7008306aa0087047300870473
-0044047300870473004802aa00850400003f02390024047300830400001a
-05c700060400000f040000210400002802ac0039021400bc02ac002f04ac
-00570556fffd0556fffd05c70068055600a205c7009c0639006305c700a1
-0473004a0473004a0473004a0473004a0473004a0473004a040000500473
-004b0473004b0473004b0473004b023900bd023900230239ffe502390009
-047300870473004404730044047300440473004404730044047300830473
-0083047300830473008304730049033300800473006b0473001b04730051
-02cd006d044c000104e3009905e5000305e50003080000e102aa00de02aa
-003d0464004e080000010639005305b4009a0464004e0464004d0464004d
-0473fffd049c00a003f4003805b4007a069600a1046400000231000002f6
-002f02ec002d0625007f071d004404e3008104e3009e02aa00e804ac0072
-046400540473002e0464003304e5001a047300860473008c080000ef0556
-fffd0556fffd0639006308000081078d00520473fffc0800000002aa0053
-02aa004701c7008001c7006c0464004e03f4002f04000021055600060156
-fe390473ffe402aa005c02aa005c040000170400001704730049023900b9
-01c7006c02aa0047080000250556fffd055600a20556fffd055600a20556
-00a20239008d0239ffe00239000402390015063900630639006306390063
-05c700a105c700a105c700a1023900c602aa001902aa000602aa001d02aa
-002e02aa00e502aa00a202aa006b02aa003a02aa004b02aa002804730000
-01c700030556005c0400003f04e3002904000028021400bc05c7fffd0473
-004905560006040000210556009e0473008704ac007204ac00a102aa006b
-02aa001902aa002106ac006b06ac006b06ac0021047300000639006d0473
-0042023900b10556005c0400003f05c700660400005005c7006604000050
-04730046046bffe102aa00ee0556fffd0473004a0556fffd0473004a05c7
-009e04eb004705c7fffd055600a20473004b055600a20473004b04730096
-01c7004204730096025500880473009a02ac008305c7009c0473008705c7
-009c04730087063900630473004405c700a102aa008505c700a102aa003c
-0556005c0400003f04e300300239002404e300300300002305c700a10473
-008305c700a10473008304e300290400002804e3002904000028046800a4
-063900600662005504a00048047400480391006204f000440329002e0530
-0048046bffe1040000b002eb005208c000330800004f040000990800004f
-040000990800004f040000980400009807d5016a05c0009e04ab007204d5
-009d04ac007104d5022204d5010505abffe9050001c905ab027e05abffe9
-05ab027e05abffe905ab027e05abffe905abffe905abffe905abffe905ab
-ffe905ab01c005ab027e05ab01c005ab01c005abffe905abffe905abffe9
-05ab027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab
-01c005ab01c005abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905abffe905abffe905ab02d605ab006605abffea05d5ffff04d50092
-0800000007eb013007eb012007eb013007eb012004d500b204d5008004d5
-002a082b0198086b01b807550010060000f40600006f0440003a05400037
-04c0003f04150040040000250600005505e100bf038d008904d5ffd90180
-008002d50086071500610296000f04d5009202d6008302d6008304d500b2
-02d600700556fffd0473004a05c700660400005005c70066040000500556
-00a20473004b055600a20473004b055600a20473004b0639006d04730042
-0639006d047300420639006d0473004205c700a40473008705c7001f0473
-00060239ffce0239ffce0239ffe40239ffe40239fff60239fff50239004b
-01c700190400003701c7ffa20556009604000088040000860473009601c7
-fffa05c7009c0473008705c900a50473008b063900630473004406390063
-0473004405c700a102aa006b0556005c0400003f04e300300239000c05c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-078d001905c70006055600060400002101c700890556fffd0473004a0800
-0001071d00440639005304e30081023900b9078d001905c70006078d0019
-05c70006078d001905c70006055600060400002101c7008a02aaffe10473
-001b04cd005a06ac006b06ac002206ac002206ac004a02aa00e202aa006b
-02aa00de02aaffea0557ffff0646ffa706b4ffa80312ffa80632ffa706d8
-ffa70605ffa701c7ff780556fffd055600960558fffe055600a204e30029
-05c700a4023900bf055600960558000b06aa009805c7009c0533006d0639
-006305c700a40556009e04f2009404e30030055600060556000906af007f
-05fb0061023900040556000604a00048039100620473008b01c7006b0460
-0088049a008c04000019038700480473008b0473005c01c7008904000086
-04000018049c00a00400001a0395005c04730044048d008303db00560460
-00880433001105b4007a063f005701c7ffc9046000880473004804600088
-063f0057055700a206eb0032045500a105c000640556005c023900bf0239
-0004040000370875000d081500a406d5003104a900a10515000a05c000a0
-0556fffd054000a705560096045500a1056b0000055600a20763000704d5
-004e05c000a105c000a104a900a10540001206aa009805c700a406390063
-05c000a00556009e05c7006604e300300515000a061500520556000905eb
-009f05550057075500a1078000a106550000071500a8054000a505c00055
-081500a405c7001a0473004a0495005b0440008802eb008804ab00000473
-004b055afffb03ab003204780087047800870380008604ab00180580008c
-046b00880473004404550088047300870400005003aa0026040000210695
-004b0400000f0495008a042b0045066b008d0695008d0500002805c0008b
-042b008404150030060000890455001f0473004b0473000002eb00890415
-004b0400003f01c700880239000901c7ffa2074000130680008304730000
-0380008604000021046b008803e900a1034a008808000041089500a00585
-002d000001010000001e0000003100000031000001010000007e0000007e
-0000008c0000008c000001010000001000000101000001210310007d0000
-008c023300d20000030b0000ff04023900b9048100690456003203310019
-0411002d04d1009601f9009b030f005f04ca009b04b8008c01f9009b0413
-002803b0005003b4003c04ca009b04cf005001f9009b02d2003c0498005a
-043c00190488006e045f007303b1001903d4000a0466009604130028058e
-00640524002803f2009b03f2009b03f2009b01e3005a0356005a0686009b
-01f9ffac041300280413002803b4ff5703b4ff570448002d058e0064058e
-0064058e0064058e00640481006904810069048100690456003203310019
-0411002d04d10096024b0000034a000004b8008c024b00000413002803b0
-005003b4003c04cf005002d2003c0498005a0488006e045f007303d4000a
-0466009604130028058e00640524002801f9009b0456003203b00050045f
-0073049b003c0000ffdc0000ff250000ffdc0000fe51028d00ab028d00a0
-02da0043034d007901a8ffba000000460000004600000046000000460000
-00480000004600000046000000460435017c0435012e043500b704350081
-0435012c043500be043500af043500810435009a043500db04350085028d
-00c1043500b3060001000600010002420036060001000435009e04350098
-043500cb0600010006000100060001000600010006000100000000460600
-010006000100060001000600010006000100060001000600010006000100
-051bffba06000100060001000600010005b5003a05b5003a01f4ffba01f4
-ffba060001000600010006000100060001000481003604350036043dffba
-043dffba03e9004a03e9004a067f0014077600140327ffba041effba067f
-0014077600140327ffba041effba051b003204b500240300fff706000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010000000030
-0000004600000046000000400000004606000100060001000000ffdc0000
-fe510000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ff160000ff160000ffdc0000ff160000ffdc0000ff200000ffdc0473
-004a08000000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010006000100028d
-007f028d005d0600010004ee0015034d007901a8000e01d6ffdc01a80056
-01d60010037500320375003201a8002d01d60013051b003204b5002401f4
-ffba01f4ffba01a8009301d6001305b5003a05b5003a01f4ffba01f4ffba
-024200000300fff705b5003a05b5003a01f4ffba01f4ffba05b5003a05b5
-003a01f4ffba01f4ffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba02b3
-005f02b3005f02b3005f02b3005f03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba08c9003e08c9003e06c5ffba06c5ffba08c9003e08c9003e06c5ffba
-06c5ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7
-ffba04a7ffba045a002a039a00360435ffba0327ffba045a002a039a0036
-0435ffba0327ffba064f0027064f00270224ffba021affba04a7004604a7
-00460224ffba021affba04cf002d04cf002d0327ffba0327ffba040d0047
-040d004701a8ffba01a8ffba02b4002302b400230327ffba0327ffba0435
-00450435004501f4ffba01f4ffba024200360300fff7039affba0327ffba
-0375003203750032051b003204b50024051b003204b5002401f4ffba01f4
-ffba045a004004ce0049045a002604ce0039045a005304ce004a045a0053
-04ce004a0600010006000100000000460000004606000100060001000600
-010000000046000000460600010006000100000000480000004606000100
-060001000600010000000046000000460000004600000046000000400000
-003006000100000000460000004606000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d00ca028d00c7028d
-00c606000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000100ffba0800ffba1000ffba06dc0063053f004406d5
-00a1055b00830000fddc0000fc2f0000fca60000fe540000fcd70000fd73
-0000fe290000fe0d0000fd110000fc670000fd9d0000fbf50000fc720000
-fed50000fed50000ff02041b00a006ac006b06ac00190000feb60000fd73
-0000fe080000fca60000fe530000fd110000fbc80000faf40000faaf0000
-fc720000fbaa0000fb6a0000fcf10000fc7d0000fbdd0000fcc10000fb98
-0000fdea0000fe840000fdc20000fcf10000fd5f0000fe760000febc0000
-fceb0000fd6c0000fd580000fc900000fd150000fc2c0000fc130000fc12
-0000fb960000fb9601c700880556fffd0473004a0556fffd0473004a0556
-fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473004a
-0556fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473
-004a0556fffd0473004a0556fffd0473004a055600a20473004b055600a2
-0473004b055600a20473004b055600a20473004b055600a20473004b0556
-00a20473004b055600a20473004b055600a20473004b0239006301c7001f
-023900ba01c7007c06390063047300440639006304730044063900630473
-004406390063047300440639006304730044063900630473004406390063
-0473004406dc0063053f004406dc0063053f004406dc0063053f004406dc
-0063053f004406dc0063053f004405c700a10473008305c700a104730083
-06d500a1055b008306d500a1055b008306d500a1055b008306d500a1055b
-008306d500a1055b00830556000604000021055600060400002105560006
-040000210556fffd0473004a0239ffe201c7ffb0063900630473004405c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-05c700a1047300830000fefe0000fefe0000fefe0000fefe0455fffd02eb
-000c07630007055afffb04a900a10380008604a900a10380008605c700a4
-046b00880473fffd040000140473fffd04000014055600090400000f0555
-0057042b0045055500a10473008706050063047300550639006004730044
-05b5003a01f4ffba0224ffba021affba04a7004601f4009e01f4001001f4
-001b01f4001001f4006b01f4fff90227ffce0000000f0000fff502aa00a4
-02aa00a40000000e00000056000000560000ffcf01a8000f01d6ffbf01a8
-fff501d6ffcd01a8001d01d6fff501a8009301d600130375003203750032
-0375003203750032051b003204b5002405b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba
-01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4
-ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a
-01f4ffba01f4ffba0481003604350036043dffba043dffba048100360435
-0036043dffba043dffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba0481
-003604350036043dffba043dffba02b3003202b3003202b3005f02b3005f
-02b3005f02b3005f02b3003202b3003202b3005f02b3005f02b3005f02b3
-005f02b3005f02b3005f02b3003802b3003802b3004902b3004903e9004a
-03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9
-004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba0692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba08c9003e08c9003e06c5ffba06c5ffba04a7ffba04a7ffba045a
-002a039a00360435ffba0327ffba064f0027064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba064f0027064f00270224
-ffba021affba064f0027064f00270224ffba021affba064f0027064f0027
-0224ffba021affba04a7004604a7004604a7004604a70046093e0032093e
-00320740ffba0740ffba067f0014077600140327ffba041effba04cf002d
-04cf002d0327ffba0327ffba04cf002d04cf002d0327ffba0327ffba04cf
-002d04cf002d0327ffba0327ffba067f0014077600140327ffba041effba
-067f0014077600140327ffba041effba067f0014077600140327ffba041e
-ffba067f0014077600140327ffba041effba067f0014077600140327ffba
-041effba040d0047040d004701a8ffba01a8ffba040d0047040d004701a8
-ffba01a8ffba040d0047040d004701a8ffba01a8ffba040d0047040d0047
-01a8ffba01a8ffba043500450435004501f4ffba01f4ffba043500450435
-00450435004504350045043500450435004501f4ffba01f4ffba04350045
-043500450481003604350036043dffba043dffba024200360300fff7031a
-001a031a001a031a001a0375003203750032037500320375003203750032
-037500320375003203750032037500320375003203750032037500320375
-0032037500320375003203750032051bffba04b5ffba051b003204b50024
-01f4ffba01f4ffba0375003203750032051b003204b5002401f4ffba01f4
-ffba051b003204b50024067f0045067f0045067f0045067f004501a80028
-0000fe290000fea20000ff300000ff1d0000ff120000ff920000fe7e08fc
-003208ad00320000ffb50000ffb60000feed0000ff640000fe7e0000ff9f
-018d000002f6fffd0000fe820000ff1004cd00320000ff580000ff580000
-ff640692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba045a002a039a00360435ffba0327ffba034d007902b400230242
-003601f4ffba0290ffba01f4002f01f4003b01f4001201f400b101f4006d
-067f00140776001401f9009b0000fed902bc000003f2009b045afff504ce
-fff5045a005304ce004a045a005304ce004a045a005304ce004a045a0053
-04ce004a045a005304ce004a045a005304ce004a04350071043500ad045a
-000f04ce000f0473001406110014054000a7047300860540000a0473000a
-05c7005105c700660400005005c7fffd067a00140540004a047300460474
-00480556006e04d5005304e3ffc40639006d04fe000f070c008701c70083
-0239001f055600960400008801c7001504000018072000a405c7ffb80473
-008b0639006006f200630557004406090014047300860556009e0556006b
-0400004f04f20094030b00440239002404e300140239002404e3003005fb
-006105c700a1062e00140400002104e300290400002804e3002904e30031
-045c0044045c003f0473003c0473005503ab003203e50024047300870214
-00bc034e00bc04ac0072023900b00aaa009e09c7009e08640046087f0096
-06aa0096039c008309c7009c078e009c062b0087047300550556fffd0473
-004a0000fefe0556fffd0473004a08000001071d00440639006d0473001a
-0639006d0473004205560096040000880639006304730044063900630473
-004404e30029045c004c01c7ffa20aaa009e09c7009e086400460639006d
-04730042084600a404f2009e05c7009c047300870556fffd0473004a0556
-fffd0473004a055600a20473004b055600a20473004b0239ff8a0239ff64
-023900040239fff60639006304730044063900630473004405c700a102aa
-ffcc05c700a102aa006805c700a10473007605c700a1047300830556005c
-0400003f04e3003002390024045c0051037e001305c700a40473008705a6
-00a404d6005e0486005e04e30029040000280556fffd0473004a055600a2
-0473004b06390063047300440000fefd0639006304730044063900630473
-004406390063047300440556000604000021047300570473004804730086
-04730086040000130400005004730046047300460473005505e9005503ab
-004903ab0032050d0032040f00440239ffb9047300420473004204780050
-0402001904ef00190473008b047300870473008701c7001901c7008901c7
-0089029e0000026e001401c700830493008306aa008406aa008406aa0087
-0473ffa60473008b046c00870473004406530044063f00570466004402aa
-ffe402aaffe402aaffe402aa008502aa008502aa008502aaffe40455008a
-0455008a0400003f01c7ffa20214ffb901c7ff7202cb00000239000f0239
-002404730019048c0044046000880400001a05c700060400001804280019
-0400002804540028045c004c045c00790400002404000050040000240400
-00500639006304400088040f004904780050046b0088032e000004000008
-033b008804730048040000240400005007b7004607400046080b004605b3
-0024036f002405c00024061c0013054a0083050f008303e2001e04380063
-03110064031100640146ffce01eb006401eb000001eb000002ea006403d9
-0000029100000187005a02d7005e01c7008001c7006c01c7008a02aa00fb
-02aa00fb02ca003202ca003204ac007004ac007004ac006504ac006502aa
-012102aa00de02aa005902aa012102aa001d02aa005902aa00de023900b6
-023900b602aa00fb02aa00fb02aa00a602aa00a602aa00a602aa001d02aa
-ffe202aafffb029400000142006402b8003202a0000002ca003203100096
-0310009603100096031000960310009602aa006202aa006202aa002802aa
-001d02aa0047045700960457009604570096045700960457004304570043
-045700430457004304570043031000430457002f0457002f0457002f0457
-002f0457002f0310002f0457002504570025045700250457002504570025
-0310002f0457001a0457001a0457001a0457001a0457001a0310001a0457
-004204570042045700420457004204570042031000420457009604570096
-045700960457009604570042045700420457004204570042045700420310
-00420457002f0457002f0457002f0457002f0457002f0310002f0457002f
-0457002f0457002f0457002f0457002f0310002f04570026045700260457
-002604570026045700260310002604570042045700420457004204570042
-045700420310004204570096045700960457009604570096045700420457
-004204570042045700420457004203100042045700260457002604570026
-045700260457002603100026045700230457002304570023045700230457
-0023031000230457002f0457002f0457002f0457002f0457002f0310002f
-0457004b0457004b0457004b0457004b0457004b0310004b045700960457
-009604570096045700960457004204570042045700420457004204570042
-031000420457001a0457001a0457001a0457001a0457001a0310001a0457
-002404570024045700240457002404570024031000240457002f0457002f
-0457002f0457002f0457002f0310002f0457004e0457004e0457004e0457
-004e0457004e0310004e045700960457009604570096045700960000fec1
-0000fec60000fdac0000fed80000ff920000fee90000ff4c0000fea00000
-fec40000ffce0000ff660000fea00000fed80000fed80000ff970000ff98
-0000ff990000fff40000ff420000ff420000ff440000ff5f0000fe870000
-ffec0000ffa60000ff510000ff510000ff510000fec90000ff1c00000000
-0000fee90000ff4c0000ff930000ff2a0000ff560000ffce0000fe870000
-febb0000fec40000fec40000fed80000fed80000feb30000fec90000fdad
-0000fdac0000feb30000fec90000fdad0000fe160000fee60000ffa60000
-fe870000ff440000feba0000ff230000ff9a0000fdac0000fe8800000000
-0000feb00000ff980000fe930000ffa60000fe870000fdac0000ff660000
-ff440000feb00000feb00000feb00000ff030000ff520000fd1f0000ff53
-0000ff530000ff530000feb50000feb50000ffc30000feae0000fedc0000
-fec70000fec80000fedc0000fe1e0000ff420000ff510000feb70000feb0
-02aa00de02aa005902aa00fa049a008c04600088062e001407aa0000062e
-0014047b004c063f005704cf0044063900630473004405c7006604000050
-04e300a8033b008804ff0000043c0032060d000a049d0042072000a406aa
-0084056500630473008b056400a40400000a0556006b0556006b04e00005
-04c5001905e5005f046e004403b600140347002804cf00440495005b0400
-005001c7ffa2063900600389004d03890050055600a205c000a10473004b
-047800870ab4006d04fe00100639001404e70014079900bf05b500880558
-000b0400001a072e00bf0590008806a10078057b007a086d00bf06f00088
-04d5006603ab001f065f0039058200480639006004730044066d0009050c
-001a066d0009050c001a0b010063091c004406aa005c04e600440987006d
-06d000500000fe370ab4006d04fe001005c7006604000050040700140000
-fea60000febc0000feaa0000fead0000fc2b0000fc4c05c000a104780087
-05400004042b00140556009e04730087055d00a40464008804d5004e03ab
-003204a900040380000005ef002904490028070900a4052f0088091800a0
-06f6008806060066042b005005c700660400005004e3003003aa00260767
-00310587002605550057042b004506e4000a0554000a06e4000a0554000a
-023900bf07630007055afffb055700a1046800860540001204ab001805c7
-00a4046b008805c700a4046b008805550057042b004506aa00980580008c
-02aa002e0556fffd0473004a0556fffd0473004a08000001071d00440556
-00a20473004b060500630473005507630007055afffb04d5004e03ab0032
-04d5004e045c004c05c000a10478008705c000a104780087063900630473
-0044063900600473004405c0004a0415002b0515000a040000210515000a
-040000210515000a0400002105550057042b0045071500a805c0008b0540
-004a0473004607bf004a0703004607a6006606860053054d006604130053
-07c3001207470018084600a4070700880639006d0478005005f900300553
-00260000ff430000fec90000ff770000ffb00000ff470000ff560000ff74
-0000fed70000feac000000000000ff520000ff56000000000000feac0000
-fd9a000000000000ff6a0000ff7c0000ff690000ff560000feac0000ff7f
-0000ff560000fdef0000ff430000ff690000ff7c000000000000fdae0000
-ff8c000001020000fefe0000fefe0000fedf0000fedf0000ff580000ff20
-0000fefe0556fffd0473004a055600960473008605560096047300860556
-00960473008605c700660400005005c7009e0473004605c7009e04730046
-05c7009e0473004605c7009e0473004605c7009e04730046055600a20473
-004b055600a20473004b055600a20473004b055600a20473004b055600a2
-0473004b04e300a8023900130639006d0473004205c700a40473008705c7
-00a40473008705c700a40473008705c700930473006805c700a404730087
-0239ffdf01c7ff9202390020023900060556009604000088055600960400
-008805560096040000880473009601c7007e0473009601c7ffb904730096
-01c7ffa50473009601c7ffa306aa009806aa008706aa009806aa008706aa
-009806aa008705c7009c0473008705c7009c0473008705c7009c04730087
-05c7009c0473008706390063047300440639006304730044063900630473
-004406390063047300440556009e047300870556009e0473008705c700a1
-02aa008505c700a102aa008505c700a102aa005e05c700a102aa00260556
-005c0400003f0556005c0400003f0556005c0400003f0556005c0400003f
-0556005c0400003f04e300300239002404e300300239002404e300300239
-ffff04e300300239000e05c700a10473008305c700a10473008305c700a1
-0473008305c700a10473008305c700a104730083055600090400001a0556
-00090400001a078d001905c70006078d001905c70006055600090400000f
-055600090400000f055600060400002104e300290400002804e300290400
-002804e3002904000028047300870239000305c70006040000210473004a
-01c7008904a0004804a0004804a0004804a0004804a0004804a0004804a0
-004804a000480556fffd0556fffd06820013068200130682001306820013
-068200560682005603910062039100620391006203910062039100620391
-0062061e0000061e0000076c0000076c0000076c0000076c00000473008b
-0473008b0473008b0473008b0473008b0473008b0473008b0473008b068f
-0000068f0000081f0000081f0000081f0000081f0000081ffff3081ffff3
-01c7008101c7008101c7ff9b01c7ff9b01c7ffeb01c7ffeb01c7ffa201c7
-ffa20301000003010000049100000491000004910000049100000491fff3
-0491fff3047300440473004404730044047300440473004404730044069d
-0000069d0000082d0000082d000007c9000007c900000460008804600088
-0460008804600088046000880460008804600088046000880682000007ae
-00000812000007ae0006063f0057063f0057063f0057063f0057063f0057
-063f0057063f0057063f0057065f0000065f000007ef000007ef0000078b
-0000078b0000078bffff078bffff04a0004804a000480391006203910062
-0473008b0473008b01c7ffe601c700680473004404730044046000880460
-0088063f0057063f005704a0004804a0004804a0004804a0004804a00048
-04a0004804a0004804a000480556fffd0556fffd06820013068200130682
-00130682001306820056068200560473008b0473008b0473008b0473008b
-0473008b0473008b0473008b0473008b068f0000068f0000081f0000081f
-0000081f0000081f0000081ffff3081ffff3063f0057063f0057063f0057
-063f0057063f0057063f0057063f0057063f0057065f0000065f000007ef
-000007ef0000078b0000078b0000078bffff078bffff04a0004804a00048
-04a0004804a0004804a0004804a0004804a000480556fffd0556fffd0556
-fffd0556fffd0556fffd02aa00e502aa00fd02aa00e502aa000602aa0006
-0473008b0473008b0473008b0473008b0473008b068200000682000006f3
-000006f3000005c700a402aa001302aa001302aa000601c7ffbb01c7ffab
-01c7ffca01c7ffca01c7ff9301c7ff930239001a0239fff5036500000365
-000002aa001302aa001302aa000604600088046000880460008804600088
-048d0083048d00830460008804600088055600060556000606e600000718
-0000061e000002aaffea02aaffea02aa0059063f0057063f0057063f0057
-063f0057063f005707650000069d000007270000065f000005fb006102aa
-00de02aa00e50473000d05c7006605c7006606aa008705c70024095000a1
-078d00190556001f04e30030080000290400003004c100660000ff530000
-ff530000ff530000ff5301c7001901c7ffa2042b00050556001105740046
-02cbffa3057a008702f0ffc8057f000a057f000a02aa008402aa008402aa
-00c902aa00c902aa00a002aa005902aaffaf02aa003a02aa0006023900b9
-02aa00a902aa00a902aa00a902aa00a9032e001e032e001e02aa003a0000
-ff730000ffa50000fed80000ff230000ff720000ff720000fee70000ffa5
-0000ff530000ff530000ff530556009e0473008703f8001905fb0019071d
-00440440001904000050046900870469001903eb008703ab003201c70088
-0361004104000088033600100580008c04780087047300440400001304de
-004404de004404de000d078d005003a800440473004404730044042b0084
-0455001f0455001f03aa00260460008804c6004405de004404c600440400
-001a05c700060400002803ab0032036b003f04db001f02eb00880400001a
-04550088042b008405b4007a04ab001803a00000054f0000035100320351
-ffd103980032034800320348003203f80032036e0032015600690284002d
-0366003202d000320415003203710032036f003204180032030f00320359
-0032039c003203760031036f003204fb000002fa003202fa003203040032
-04cc0032030500640305003202f9003202f90032028c0032028c00320304
-00320142006402b6006404950064030f00640305003202d5003203050032
-030500320306006401c20032030f00640342003204950064029200000320
-00000315006402920000030600320385003202bf00000142006401eb0064
-030f0064029200000315006402920000030900320385003202bf000005ed
-00460a660046061300460689ffba0541ffba01e9003c045a00110000ff0d
-0000ff350000fece0000feb70000fec90000ffcf0000ff4f0000ff9e0000
-feca02b3005f02b3005f03e9004a03e9004a039affba0327ffba039affba
-0327ffba05ad0069053d002d05fd009604dc005004e0003c05f6009b053f
-00280650002804ac00720000fe3b0000fe660000fe660473fffc02aa0053
-02d5ffce01a8ffba01a8ffba01a8ffba01a8ffba0658001509c500470400
-000008000000040000000800000002ab0000020000000155000004730000
-02390000019a000000ab00000000000005e5000305c7006606aa00980580
-008c0744008307180046071800480556fffd05c70066040000140473000a
-04e300300400004f0400002804a5001d000001020000ff420000febf0000
-ff3a0000ff53048d000a05c7005105c7006605c70051045500a102eb0088
-0000ff430000ff040000ffac02d200960000ff37021affba0250001e0000
-ff3a0000ff5b0000ff5f0000ff7e0000ff940000ff4a0000fe9c05b5003a
-05b5003a01f4ff9601f4ff9605b5003a05b5003a01f4ffba01f4ffba05b5
-003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba
-05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba0481003604350036043dffba
-043dffba0481003604350036043dffba043dffba02b3003202b3003202b3
-005f02b3005f03e9004a03e9004a0692003e0692003e043fffba043fffba
-045a002a039a00360435ffba0327ffba045a002a039a00360435ffba0327
-ffba045a002a039a00360435ffba0327ffba064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba067f0014077600140327
-ffba041effba067f0014077600140327ffba041effba067f001407760014
-0327ffba041effba02b4002302b400230327ffba0327ffba02b4002302b4
-00230327ffba0327ffba043500450435004501f4ffba01f4ffba04350045
-0435004501f4ffba01f4ffba043500450435004501f4ffba01f4ffba040d
-0047040d004701a8ffba01a8ffba03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0473ff93047300460239ffbf06aa
-ffd50473ffb70473ff9102aaffa402aaffa40400ffff0239ffb904000028
-04730089030b0064047400480649002401c7001901c700190473001e0460
-001e048c000a04730086047300460239001305b400420400008801c7fffc
-06aa00870473008b0473008702aafffb0400003f0318ffa20400001a0400
-000f040000280473004a04730048047300460473004b03ab004903ab0032
-0534005501c700880400001301c7ffa204730083045c004c0304006402d5
-003202c9003302fc0032028c003201d5003201d500000304003203110064
-01420019014200640142006401420019022a000001420064014200090233
-00640493006404930064030fffc9030f0064030e00640305003203000032
-02b800320142ffca01c20032030f001d031a00320306006402d400640292
-000002de003202de003202de003202f4003202ea00320000febc0000febc
-0000ff730000fea9023900b902fa003202f900320305003202a0000002f9
-00320639006d0556fffd0473000f05c7006602aa004104a0004804a00048
-04a0004804a0004804a0004804a0004804a0004804a0004801c7ff9b01c7
-ffab01c7ff9b01c7ffab01c7ff9b01c7ffbb01c7ff9b01c7ffbb04600088
-0460008804600088046000880460008804600088046000880460008801c7
-ffab01c7ffab01c7ffbb01c7ffbb04600088046000880460008804600088
-045a005304ce004a03a000130556001105c700290558000b055600a20473
-004b0400003301c7ffa205e600630473004805c7000002aa000f05560006
-0400002104000013040000500400001301c700830455fffd02eb00010556
-00090400000f055600090400000f04d5005303ab00490540001204ab0018
-0000fec60000fed40000fec60000fed40000fe5f0000fe5f0000ff720000
-ff730000fee7078b000a03eb004c040000130473000a01c700150473fff4
-0556001105c700a1047300190239ff8b05c700a404730087055600960400
-008804e30029040000280400003b049e00a403670088053000480000ff53
-0000ffbc0000fefe0000fefe0000fea40000fea401c70088000000000000
-002a0000002a0000002a0000002a000000d60000017e00000320000005a6
-0000074e000009380000097e000009fe00000aa400000b8400000bec0000
-0c6400000caa00000ce600000d5600000f1200000fee00001218000013f2
-000015520000170c000018e20000198e00001c2200001e5600001eb20000
-1f7000001ff200002062000020e8000021da000023da000025840000271c
-000028560000299e00002a6200002b1800002ca800002dae00002e920000
-2f7a000031b00000323a000035640000370e000038420000394800003b3c
-00003da800004052000041000000422400004398000045d6000048e20000
-4a8800004bc800004c3200004c9c00004d0000004d8800004dbc00004e38
-0000510a000052e80000549c000056500000580e0000596200005b520000
-5cf600005dea00005f020000619a00006296000064c60000668c0000684e
-00006a1200006ba800006cae000070560000717a00007318000075360000
-79a000007bc400007e1c00008004000081020000814e00008250000082f0
-0000833c00008370000083ac000083ee000084540000849a000084ce0000
-85040000853a0000858a000085cc0000861e00008656000086a8000086de
-0000871e000087600000879e000087e800008828000088560000888e0000
-88de00008914000089540000898e000089d200008a1c00008a5800008a88
-00008acc00008b0400008b9400008c1a00008e2800008fbc0000916c0000
-91b80000924c00009470000096c4000098b4000099a000009a2200009a8c
-00009baa00009d0600009f4e0000a0b00000a13e0000a1e80000a2ac0000
-a3f40000a59e0000a68c0000a7520000a7b60000a8240000a94e0000aa72
-0000ab020000ace40000af3e0000b2900000b3860000b42c0000b47c0000
-b5320000b6520000b7f00000b88a0000b94e0000ba0e0000ba760000bab2
-0000bb0a0000bb580000bd700000bfb60000bfee0000c0200000c14a0000
-c2760000c3240000c3c80000c46a0000c53c0000c5900000c5c60000c61e
-0000c7700000c7e20000c83c0000c9b40000cb200000cc000000cc320000
-ccce0000cdf20000d0680000d0a20000d0e60000d1220000d1840000d1c6
-0000d20c0000d2580000d28a0000d2de0000d31c0000d34c0000d38a0000
-d3d00000d4120000d4500000d4d20000d5400000d6260000d6620000d6e2
-0000d7160000d7b80000d8400000d8ac0000d90e0000d97a0000da660000
-db580000db8c0000dbc00000dbf00000dc340000dcac0000de260000e040
-0000e0720000e0ac0000e1a60000e3340000e36a0000e4ce0000e54a0000
-e62a0000e7200000e8b00000ea1a0000ec080000ed040000ed4a0000ed7e
-0000edc00000edfa0000ee4e0000ee960000eee00000ef100000ef400000
-f1280000f1660000f18e0000f1be0000f1f20000f2180000f23e0000f286
-0000f43c0000f5b60000f5dc0000f6020000f6460000f6760000f6a60000
-f6fc0000f7da0000f8ec0000f9300000f9660000f9c00000f9fe0000fa32
-0000fa620000fa9e0000fade0000fb1c0000fb580000fb9a0000fbd00000
-fc0c0000fc4c0000fc720000fc960000fce60000fe420000fe980000fecc
-0000ff1a0000ff660000ffa80000ffe0000100160001005e000101000001
-029c00010464000105e6000107d80001092a00010aae00010b9000010d2a
-00010d9400010dbc00010e5a000110dc0001111c0001115c0001119c0001
-11da000112380001129600011304000113240001140e000114ae000114e4
-000115320001157c000115c6000115e2000115fe0001161e0001163e0001
-165e0001167e000116a4000116ca000116f000011716000117460001176e
-00011796000117c2000117ee000118220001184c00011878000118ae0001
-18d8000119040001193a000119640001198e000119c2000119f200011a26
-00011a6a00011a9a00011ace00011b1000011b4400011b7600011bb80001
-1bec00011c1c00011c5e00011ca200011ce800011d4400011d6000011d7c
-00011d9800011db400011dd000011f3e000121ea0001245a000124760001
-2490000124ac000124c8000124e4000125000001255c0001259600012600
-000126ca0001276a00012840000128c000012948000129b800012a4e0001
-2aac00012af200012b5000012bb200012c6a00012d2800012d5400012db0
-00012df400012f60000130540001307e0001309a000130c6000130fe0001
-314a0001318a000131be000131ee0001321e0001324e00013292000132c2
-000132f2000133320001336200013392000133c200013402000134320001
-346200013492000134b8000136bc000136ec0001371c0001386c00013a22
-00013a5200013a8000013ab000013ade00013b0e00013b3c00013b600001
-3b8400013bb400013d2400013d5c00013d8c00013f1e00013f4c00013f7a
-00013fa800013fd00001412e000142c6000142fe0001433e0001437a0001
-43aa000143d8000143f4000144240001445400014544000146ac000146dc
-000147160001475600014786000147b6000147f80001481e000148440001
-4884000148c4000148f40001493400014a1e00014a9e00014b8200014bb2
-00014be200014c1200014c4200014c7e00014cb000014ce200014d120001
-4d4200014d8800014dba00014dea00014e2000014e9200014ec600015094
-000151960001532600015556000157a6000159380001599c00015a260001
-5a3600015ac400015cc200015dee00015f5a0001604a000161ce000163e8
-000166140001670600016716000167260001683e0001684e0001685e0001
-686e0001687e0001688e000169ac000169bc000169cc00016a4000016a50
-00016b2000016b3000016c4200016c5200016c6200016c7200016dd00001
-6fae00016ff0000170260001705c0001708c000170bc0001711000017138
-000172c20001740a0001755e000176c60001784a000178ae00017a400001
-7b5c00017b6c00017b7c00017d0200017d1200017e7800017fd200018106
-00018264000183d200018598000185d800018610000186460001866c0001
-869c000186c200018838000188680001899e000189ae000189be00018a00
-00018a1000018ba400018d5000018eda00018f0200018f320001908e0001
-909e000191d6000191e600019280000193e0000193f000019656000197e0
-000199480001997800019aee00019c2000019c3000019c4000019c500001
-9d2a00019d3a00019d4a00019d5a00019e5200019fcc00019fdc0001a104
-0001a2380001a38a0001a51e0001a63c0001a7c80001a8da0001a9100001
-ab460001abe60001abf60001ad8c0001af2e0001afb20001b1340001b144
-0001b3ac0001b52c0001b6ac0001b6dc0001b87c0001ba020001bbc60001
-bcf20001bd020001be320001be420001be520001bf120001bf220001c108
-0001c1180001c24e0001c35c0001c5080001c6be0001c8000001c9700001
-cab80001cb0a0001ccec0001ce680001cea60001d04c0001d0700001d1b0
-0001d1c00001d1d00001d2080001d2180001d3a40001d50c0001d6800001
-d6a40001d6d40001d8420001d8f40001d9b20001d9e00001db960001dc8e
-0001dd1c0001de420001def00001dfc40001e00e0001e0860001e1460001
-e16e0001e1b20001e2080001e2e40001e32e0001e3620001e38a0001e3b2
-0001e3e60001e42a0001e46e0001e4ac0001e5ea0001e6a20001e7c20001
-e8380001e9060001e9580001e9ea0001ea9a0001eb8e0001ebe20001ec78
-0001ed360001ee200001eed20001eff20001f0440001f0ee0001f2240001
-f2fc0001f3e20001f4e80001f5ce0001f6b00001f7a40001f8420001f948
-0001fa420001faba0001fb320001fba80001fbde0001fc3a0001fd020001
-fd8e0001fdc60001fe0c0001fe3c0001fea60001ff660001ff9a0001ffca
-0001fffe0002002e0002005e0002008e0002022e00020266000202a60002
-02de00020316000203b2000204ac000204dc00020580000205ae000205ee
-0002063e0002066e000206ba00020852000209b800020b1800020b5e0002
-0bb200020bea00020d5c00020d9200020e2400020e6200020e9000020ece
-00020ffe0002102600021162000211f20002129c0002131e000213da0002
-14f20002160000021634000216ba0002181600021898000218e2000219ec
-00021a3400021b3800021bb400021c0c00021c9000021d7a00021e900002
-1f8c0002203600022126000221f8000222e2000223ca0002247a000224fc
-0002275a00022784000227ae0002286600022890000229d200022ad80002
-2bc200022bec00022c1600022c4000022c6a00022c9400022e1400022e3e
-00022e6800022e9200022ebc00022ee600022f1000022f3a00022f640002
-2f9800022fc200022fec0002301600023190000231a0000232ba000232ca
-000232f40002331e00023348000233720002351c00023738000238660002
-3876000239f200023a0200023b4800023d1400023e1a00023f9a0002413a
-0002435e000244b80002469a000247de0002490c000249fa00024a240002
-4a4e00024a7800024aa200024acc00024af600024b2000024b4a00024b74
-00024b9e00024bc800024bf200024c1c00024c4600024c7000024eac0002
-50280002516c000253540002549c000254c6000254f00002552000025550
-000255a0000255f000025630000256a2000256f600025754000257aa0002
-57e00002582200025868000258b2000258e20002591a0002594a00025a82
-00025dc800025df200025e1c00025e4600025e7000025e9a00025ec40002
-5eee00025f1800025f4200025f6c00025f9600025fc000025fea00026014
-0002603e0002606800026092000260bc000260e6000261100002613a0002
-61640002618e000261b8000261e20002620c0002623600026260000262fe
-000263140002633e0002661e0002662e000267480002686a000269a80002
-6aea00026c9000026ca000026de200026f3200027122000272f60002740e
-0002741e000274a00002752e0002762e0002763e000276de000276ee0002
-78040002795600027a8600027a9600027b6400027b7400027cea00027cfa
-00027e0e00027e1e00027f52000280e8000281a4000281b4000282b20002
-840c00028498000284a8000285d20002875e0002881a0002882a000288c6
-000288d6000289a4000289b400028a8c00028a9c00028ba400028bb40002
-8d7a00028d8a00028ee200028ef20002915c0002916c0002936600029376
-000294e0000294f0000295e0000295f00002978800029798000298b60002
-98c600029a0600029a1600029a2600029a3600029bae00029bbe00029bce
-00029bde00029d3000029e7e00029f4c0002a0300002a1b00002a3320002
-a4320002a5460002a68a0002a69a0002a7880002a8620002a9fe0002aa0e
-0002ab2c0002ac320002ae300002ae400002ae500002ae600002afaa0002
-afba0002b0720002b0820002b1900002b1a00002b28c0002b29c0002b3ba
-0002b3ca0002b4680002b4780002b4880002b5760002b6ea0002b8160002
-b9100002b9200002b9300002b9400002bade0002bc980002bd660002bd76
-0002bfd60002c21c0002c4a20002c7060002c98a0002cbfc0002cdcc0002
-cf820002cfac0002cfd60002cfe60002cff60002d0200002d04a0002d074
-0002d0840002d0940002d0be0002d0e80002d0f80002d1080002d1320002
-d15c0002d1860002d1960002d1a60002d1b60002d1c60002d1d60002d1e6
-0002d2100002d2200002d2300002d25a0002d2840002d2ae0002d2d80002
-d3020002d32c0002d3560002d3800002d3aa0002d3d40002d3fe0002d428
-0002d4520002d47c0002d4a60002d4d00002d4fa0002d5240002d54e0002
-d5780002d5a20002d5cc0002d5f60002d6200002d64a0002d6740002d69e
-0002d6c80002d6f20002d71c0002d7460002d7700002d79a0002d7c40002
-d7ee0002d8180002d8420002d86c0002d8960002d8c00002d8ea0002d914
-0002d93e0002d9680002d9920002d9bc0002d9e60002da100002da3a0002
-da640002da8e0002dab80002dae20002db0c0002dbac0002dbf00002dc66
-0002dc900002dcba0002dce40002dd0e0002dd380002dd620002dd8c0002
-ddb60002dde00002de0a0002de340002de5e0002de880002deb20002dedc
-0002df060002df300002df5a0002df840002dfae0002dfd80002e0020002
-e02c0002e0560002e08a0002e0be0002e0f20002e2840002e4200002e5bc
-0002e7480002e78e0002e7d40002e8420002e89e0002e8f00002e9600002
-ea380002eb040002ebdc0002eca80002ed480002ee620002ef160002ef98
-0002eff20002f0320002f1500002f29a0002f4320002f48e0002f4ec0002
-f5480002f5a40002f6580002f70e0002f7ba0002f8660002f9120002f9ca
-0002fa820002fb3a0002fb4c0002fb5e0002fb700002fb820002fb940002
-fc020002fc700002fd280002fd3a0002fd4c0002fd5e0002fd6e0002fd80
-0002fd920002fda40002fdb60002fdc80002fdda0002fe880002ff340002
-ffe20003008e00030126000301600003018a000301b4000302080003025a
-000302d6000303200003039c000303f000030474000304c60003053c0003
-0594000305fa00030650000306aa0003072800030774000307d200030836
-00030884000308d20003092a000309720003099c000309ca000309f00003
-0a2400030a5400030a8400030ad600030b4400030b9a00030c0e00030c62
-00030cd600030d1c00030d8400030dca00030e2600030e5600030e900003
-0eb600030ee600030f0c00030f3200030f6400030f9400030fe60003104c
-000310a2000311080003115c000311ca0003120c0003126c000312ae0003
-12fa0003133400031370000313aa000313e60003141a0003144c0003147c
-000314ac000314d6000314fc00031526000315540003157e000315ca0003
-160e0003164400031680000316b4000316e200031720000317500003178a
-000317b4000317e2000318080003182e0003185a000318b6000318e60003
-1916000319460003197e000319b2000319e000031a1000031a4000031a70
-00031aa000031ad400031b2a00031b5e00031bbe00031bf200031c4a0003
-1c7e00031cda00031d7800031e4600031f660003202e000320be00032154
-000323400003253c000326b400032830000329da00032b8c00032c740003
-2daa00032ea200032fb4000330d20003320800033372000334e000033676
-000337f2000339020003391200033a3e00033b7a00033cbc00033e400003
-3f1a00033f9000034046000340ec0003425c000342940003430e000343d0
-0003448a000344f2000345f80003472e000347fa00034958000349d20003
-4a4c00034b1800034bd200034c8600034ce200034d3c00034d8400034df4
-00034e7000034eba00034ef400034f3a00034f7e00034fd0000350220003
-50a40003512600035168000351a8000351de000352140003524200035270
-000352a4000352d80003531a0003535c00035398000353d40003540e0003
-54480003547a000354ac000354de000355100003554a00035584000355c6
-000356080003564a0003568c000356da000357280003576a000357ac0003
-57ec0003582c00035866000358a0000358ec0003593800035976000359b6
-000359fc00035a4200035a7e00035ad400035b1000035b4c00035b8c0003
-5bcc00035c0800035c4400035c8400035cc400035d0800035d4c00035da0
-00035e2e00035e7000035eb200035f1a00035f8200035fb400035fe60003
-601e00036056000360ec00036182000361cc00036216000362520003628e
-000362e40003633a00036384000363ce000364260003647e000364be0003
-64fe000365360003656e000365b800036602000366400003667e000366c0
-0003670200036756000367aa000367f0000368360003687c000368c20003
-69180003696e000369c400036a1a00036a6600036ab200036afe00036b4a
-00036bbe00036c3200036ca600036d1a00036d5800036d9600036dd40003
-6e1200036e5000036e8e00036ed200036f1600036f6200036fae0003700e
-0003705a00037098000370e6000371f60003724600037296000372ce0003
-73060003735c000373b2000374260003748a000374cc0003750e00037564
-000375b2000375fe0003764a0003768a000376ca000377120003775a0003
-77c6000378200003785800037890000378d000037910000379e000037adc
-00037b9c00037c8a00037ce000037d3600037d8800037ddc00037e400003
-7ea400037efa00037f5000037fc60003803c0003807e000380c000038102
-0003814400038186000381c80003821e00038274000382c60003831a0003
-83a200038424000384c400038566000385a4000385e2000386200003865c
-0003869a000386d80003871600038752000388360003892200038a380003
-8b5400038c1e00038ce800038de200038edc00038fda000390d8000391f6
-000393140003943a000395600003966200039764000397f6000398880003
-98c6000399040003995e000399b8000399f000039a2800039b3800039b48
-00039b9000039bd800039c3000039c8800039cba00039cec00039d2e0003
-9d7000039daa00039de400039e2800039e6c00039ee400039f5e00039fee
-0003a0320003a0720003a0f40003a1760003a2ce0003a2de0003a32c0003
-a37a0003a3b60003a3f20003a4380003a47e0003a4cc0003a51a0003a56a
-0003a5ba0003a6160003a6720003a7e80003a9500003a9880003a9c20003
-aa0e0003aa5a0003aaac0003aafe0003ab500003aba60003abe20003ac1e
-0003ac740003acc80003ae000003aea00003aeee0003af2e0003af680003
-b0fe0003b3820003b4460003b5dc0003b73a0003b8080003b9ae0003bc02
-0003be3a0003be800003beb20003bf5c0003c0800003c0a40003c13e0003
-c24a0003c35a0003c46a0003c5780003c6fe0003c7300003c7d20003c7fa
-0003c85c0003c8be0003c9200003c9820003c9c00003c9fe0003ca380003
-ca720003ca9e0003caea0003cb240003cb5e0003ccba0003ce0e0003ce1e
-0003cedc0003d0120003d0700003d1880003d3160003d3bc0003d5020003
-d5400003d57e0003d5bc0003d6100003d6380003d6920003d6f60003d73e
-0003d7a00003d8000003d8720003d8ee0003d96a0003d9ec0003da780003
-db040003db8e0003dc0e0003dc480003dc840003dde80003deb20003dee2
-0003df120003e04a0003e19a0003e1aa0003e2980003e36c0003e4640003
-e55a0003e6dc0003e8360003e8460003e95e0003ea0a0003eb4c0003eca2
-0003ecfe0003ee5c0003eeea0003f0900003f2020003f3160003f34e0003
-f3b20003f5620003f6cc0003f72e0003f8960003f99c0003fa520003fafe
-0003fc260003fd140003fdf40003ff34000400600004017a000402ea0004
-046400040474000405540004064a000406fa000407f6000408a2000409ac
-00040a9800040bc200040ce600040dea00040f1800041056000411c20004
-12f80004148c000416340004172c000418400004197200041a6400041a9c
-00041af200041ba000041bb000041c1200041c6e00041cd400041d200004
-1d6000041d9800041dc400041df200041e2c00041f6200041f960004201a
-000420d00004210000042184000421b4000421ec00042384000425100004
-255a00042594000425ea000426360004265c00042682000426c400042706
-0004274800042778000427b0000427e60004281c0004285e0004288e0004
-28be000429b400042ab800042aec00042b2400042b6a00042b9e00042bce
-00042c0600042c3a00042c6e00042c9e00042cce00042d0400042d3a0004
-2d6a00042d9a00042dce00042e0200042e3200042e6200042e9c00042ed0
-00042f0200042f3400042f6800042f9c00042fcc00042ffc0004302a0004
-305800043166000432d2000434060004353a0004356a000435a40004363e
-000437a800043904000439c800043adc00043b0c00043b4000043c380004
-3de800043e4000043eb800043ff400044032000440a4000440d400044104
-0004413e000441c6000441f600044226000443b6000445000004460c0004
-471a000448460004499c00044af800044c5800044d9200044f0400045064
-000450740004522a00045352000453ec0004557400045584000456800004
-58060004595e00045a1000045ae000045bec00045c9600045cce00045cde
-00045d8e00045e3400045eb000046000000460f4000461ea000462f60004
-63ce000464a80004653c0004664e000467de000468fc000469f200046a9c
-00046b4600046c1000046cb800046d8e00046e0a00046e6600046fc80004
-70fc000472980004735a0004745a00047532000476700004771c000477e6
-000478d6000479fc00047ad800047bde00047d1600047e0600047ea40004
-7f960004810600048250000484bc0004858e000486420004871000048804
-000489420004895200048a8600048b9800048ba800048cb400048de40004
-8e3800048fac000490d4000491e80004939a000495ae00049842000499fc
-00049b2800049d0800049eca0004a05c0004a1280004a2c40004a33a0004
-a3e80004a4c40004a5500004a5f20004a6940004a7780004a8b00004ab0c
-0004ac540004ac640004ac740004acd60004ad340004ad960004ae340004
-aecc0004afd00004b0be0004b0ce0004b0de0004b1780004b2120004b24e
-0004b2ca0004b33e0004b3940004b3c80004b44e0004b4da0004b5520004
-b5b00004b64a0004b6dc0004b75c0004b7de0004b8720004b8a60004b908
-0004b9ba0004bb800004bbb80004bd940004bea80004beb80004beee0004
-bf320004bf760004bfba0004bff00004c0220004c0640004c1000004c156
-0004c1fc0004c2740004c2fa0004c36a0004c3cc0004c4520004c4b20004
-c51c0004c5900004c6000004c65e0004c7040004c79c0004c8080004c898
-0004c8f60004c9640004ca0c0004cab80004cb4e0004cbb80004cc3a0004
-cc9e0004cd4a0004ce020004ceae0004cf3c0004cf980004d0040004d05a
-0004d0dc0004d15a0004d1e00004d26c0004d2c60004d3320004d3a20004
-d4120004d4820004d5060004d5960004d5fc0004d6760004d6f20004d76a
-0004d8100004d8ac0004d93c0004d99a0004da380004dab40004db460004
-dbe80004dc920004dd2a0004dd860004dddc0004de440004deea0004df92
-0004e05c0004e1020004e1640004e1bc0004e21c0004e2aa0004e3300004
-e3be0004e41e0004e4820004e4ec0004e5540004e5bc0004e63a0004e6c2
-0004e7560004e7c20004e82a0004e88e0004e9360004e9f00004ea9e0004
-eb2c0004eb8a0004ebf60004ec660004ed0c0004edb60004ee780004ef1a
-0004ef7e0004f00e0004f0800004f1100004f18e0004f20a0004f2760004
-f3040004f3600004f3be0004f4440004f4c00004f5280004f58c0004f5e0
-0004f64e0004f6b60004f7340004f7aa0004f8240004f8a40004f9000004
-f9660004f9ca0004fa6a0004fb0c0004fbc20004fc720004fcce0004fd46
-0004fda40004fe2e0004fec60004ff560004ffbc0005001a000500a80005
-011a000501ae00050246000502b6000503260005039e000503fc0005045c
-000504d60005053000050590000505ea00050646000506ae0005073c0005
-0772000507aa0005083600050860000508a20005093600050a2400050ab4
-00050aea00050b3a00050bac00050c5800050cea00050d4200050d9c0005
-0df400050e4e00050ed200050f5800050ffc000510a4000510e200051152
-000511e60005127e00051314000513be000513f000051440000514940005
-14da0005157e000516080005168e000516ee000517320005178000051820
-000518b000051950000519f600051a9c00051b6000051b9200051bbc0005
-1c4200051cf200051d2400051d4c00051e1a00051e7800051f1200051f60
-00051fc60005206e000520dc00052142000521ce00052240000522b60005
-236a000523c40005243400052470000524c200052548000525a80005264c
-0005272c00052854000529e400052a4000052a9600052dbc00052e560005
-2eb200052efa00053068000531ba000532000005330e000533a6000534b4
-000535be0005366000053748000537da000538760005396800053a680005
-3ae400053b6a00053bb200053d2400053e8000053f6400053fb400053fe8
-000540d6000541fe00054398000544c8000545de000547120005482e0005
-489c0005493000054a7000054b2600054c9000054dc000054ef20005501e
-000550ca0005519000055262000553bc0005553c0005566c000557880005
-594200055a9400055b8000055c5c00055d1e00055e8800055fd800055fe8
-00055ff800056008000560c000056176000561b2000561e8000562200005
-6256000563e2000565f6000566e0000567f80005697000056ade00056bc8
-00056cfa00056e4200056fc800057166000572ba000574a80005766e0005
-78a400057af200057bda00057cb600057dfe00057f800005806800058182
-000581c40005820e0005842a000586420005878e0005890400058b620005
-8d6400058de800058e1800058e6400058f2c00058ffc0005919000059218
-00059280000592c0000592fe000594b0000596e000059816000599f80005
-9ad400059bee00059d9a00059fa60005a0a80005a1940005a3860005a58e
-0005a6fa0005a87e0005a9de0005ab4c0005abda0005ac6a0005ad840005
-ae900005b0520005b1be0005b3ae0005b5780005b60c0005b6a80005b73e
-0005b7c60005b8ac0005b9840005bb1e0005bcb00005bcd60005bcfc0005
-bd0c0005bd3c0005bd6c0005bee60005c0880005c1320005c2140005c2d4
-0005c37e0005c4180005c4fa0005c5b80005c6940005c84a0005c9840005
-ca100005ca400005ca700005caa40005cad80005cae80005caf80005cb28
-0005cb580005cb8c0005cbc00005cbf40005cc280005cc5c0005cc900005
-ce0a0005ce1a0005ce4a0005ce7a0005ceb20005cee60005cf1a0005cf4e
-0005cf820005cfb60005cfea0005d0220005d0580005d0880005d0c80005
-d1000005d1480005d18e0005d1c20005d1f60005d2300005d2680005d308
-0005d3180005d46a0005d6320005d7d80005d9820005dace0005dbe40005
-dcf20005de080005df020005dfea0005e10c0005e2080005e2e00005e3d0
-0005e48c0005e53e0005e6080005e67a0005e7200005e7b00005e8140005
-e9220005e9880005ea360005eb2c0005eb940005ebfc0005ecac0005ee86
-0005ef8a0005f00a0005f0480005f0f40005f1820005f26a0005f3020005
-f3680005f4660005f5280005f5e20005f6200005f6b00005f7b20005f846
-0005f88a0005f9a80005fad20005fcb40005fe760005ffac000600da0006
-01da000602020006022a0006026000060292000602be000602e60006030e
-0006033c0006039a000604080006044000060478000604a8000604ce0006
-0502000605380006055e00060584000605b2000605e00006060c00060682
-000606aa0006070c00060732000607580006077e000607a4000607d40006
-0804000608340006086e0006089e000608d400060904000609360006095c
-00060982000609b6000609ec00060a1c00060a4c00060a7200060a980006
-0abe00060aec00060b2000060ba600060bea00060c2400060c5800060c9c
-00060cd600060d1000060d3600060d6000060dac00060dee00060e140006
-0e4200060e6800060e8e00060ece00060f0000060f3000060f6000060f86
-00060fac00060fdc0006100c00061032000610580006107e000610a40006
-10ca000610f000061118000611a0000611ca0006123e00061266000612dc
-000613040006136600061398000613ca000613fa00061432000614640006
-1492000614cc000614f40006155400061596000615c6000615f200061622
-000616520006167a000616a2000616ca0006172c00061754000617b20006
-17f60006183a0006186a000618a0000618c6000618ee000619140006193c
-000619620006198a000619b2000619dc00061a0200061a2800061a4e0006
-1a8000061aa800061b2e00061b5800061bc200061bf200061c2200061c48
-00061c6e00061cc600061cf600061d3200061d5c00061d8c00061dbc0006
-1df000061e2400061e5400061e9400061ece00061f1600061f3c00061f62
-00061f8800061fae00061fd4000620140006205400062090000620c00006
-20f0000621200006215000062188000621c000062200000622400006227a
-000622b4000622f00006232e00062378000623c2000624080006244e0006
-2490000624d20006250200062532000625660006259a000625d40006260e
-0006265a000626a6000626fe00062756000627ae0006280c0006283c0006
-286c000628a2000628d80006290e0006294a0006297e000629b200062a06
-00062a5a00062aae00062b0200062b5600062baa00062c0200062c5a0006
-2c8800062cb600062ce800062d1a00062d6000062da600062dd800062e0a
-00062e5c00062eb400062ef800062f3c00062f8000062fc4000630180006
-306c0006309c000630cc000631020006313800063176000631bc00063210
-0006325a000632ac000632fe0006335e000633be000633ee000634200006
-345a00063494000634e60006353a00063584000635cc0006360e00063678
-000636c6000637120006374400063776000637aa000637de000638140006
-384a00063888000638be000638f00006392c00063982000639d800063a36
-00063a9400063aea00063b4000063b7400063ba400063be800063c1e0006
-3c4e00063c9200063cd000063d0800063d4000063d7600063db200063de2
-00063e1e00063e5e00063ea400063eee00063f3a00063f8600063fdc0006
-403200064080000640ce0006411c0006416c000641c8000642240006427c
-000642d4000643280006437c000643be0006440000064448000644900006
-44d8000645260006456a000645ae000646140006467a000646e000064746
-000647ac000648120006487c000648e60006492e00064976000649be0006
-4a0600064a5200064a9e00064af200064b3e00064b8200064bd000064c38
-00064ca000064d1000064d8000064de800064e5000064e9000064ece0006
-4f1800064f4200064f8800064fc00006500e0006503e0006506e000650aa
-000650de000651040006515800065196000651ea000652d0000653f80006
-543a00065460000654b6000654e60006552800065570000655be00065608
-000656580006567e000657660006584a0006599c000659ca000659f80006
-5a8c00065b1200065b4000065bca00065bfa00065c2a00065c7800065cc6
-00065daa00065e8600065fca00065ffa0006602a000660c0000661480006
-6178000661a8000661d80006626800066298000662c80006631a00066362
-000663b80006644e000664e60006655a000665ac000665d60006662c0006
-6660000666aa000666e20006673200066770000667bc000667e20006685e
-000668b0000669c200066bcc00066d8000066f0200067074000673160006
-75e6000677a6000678ec00067b4600067c8800067e9e00067ef000067f40
-00067f9600067fec0006804e000680d600068324000684b6000686c20006
-87de0006899200068b1400068bd400068cb600068d1e00068d8000068df6
-00068e5e00068f0a00068f7a0006900a0006911e000691e20006922e0006
-92c40006937000069414000694be000695080006954a000695c000069628
-000696b800069766000697d0000698340006989a00069954000699ea0006
-9a4800069a7200069a9c00069aac00069abc00069b7e00069c8200069e8c
-00069fe200069ff20006a0a20006a1860006a1e60006a1f60006a2520006
-a2b00006a3d00006a4be0006a4ce0006a4de0006a4ee0006a4fe0006a5e4
-0006a6e40006a8bc0006aa780006ab7e0006abf80006ac720006ad240006
-ad340006ae420006ae520006ae620006af240006b0580006b1440006b154
-0006b1640006b1740006b2da0006b4460006b5720006b5820006b5920006
-b5a20006b5b20006b6940006b6a40006b8060006b9100006ba0e0006bb46
-0006bc180006bc960006bd140006be340006beb00006befc0006bf880006
-c09c0006c0f00006c2320006c2f20006c3be0006c4b40006c5be0006c670
-0006c7d60006c83c0006c9000006cb020006cc900006ce0e0006cf3e0006
-d1f00006d3320006d4600006d5d80006d7500006d8d00006da5e0006dc10
-0006dc7e0006dde20006df1a0006e01e0006e1540006e2860006e3560006
-e4260006e5820006e65c0006e6fc0006e8000006e92a0006ea280006eba8
-0006ed120006ee500006efc80006f1140006f1f60006f25e0006f3000006
-f3a00006f49e0006f6060006f7400006f8d40006fa1e0006fb020006fb60
-0006fc660006fcfc0006fdbe0006fe640006fea400070050000701220007
-01e800070310000704b0000705bc00070614000707ac0007083a0007084c
-0007087c000708ac000708e40007091c000709520007098e000709c40007
-0a0000070b6e00070bb800070c5200070cea00070d6400070de800070e4e
-00070efa00070f46000710660007111c000711f20007122a000712680007
-12dc000713d6000714f4000715f6000716380007167a000716e8000716f8
-000717080007171800071728000717380007174800071758000717680007
-17780007178800071798000717980007191c0007192c000719ec00071ab2
-00071be800071dde00071fe0000721dc00072412000726120007267e0007
-27900007292200072a7a00072b2c00072b7000072c0e00072d3e00072d8e
-00072e2400072f6000072f70000731260007325a000732aa000733000007
-33c20007340600073448000734ce0007352c0007361e000736ac000736e2
-0007375c000737d4000738240007393000073a2600073ad000073afa0007
-3b2400073b4e00073b7800073bb800073bf800073c3000073c6800073cb2
-00073cfc00073d3c00073d7c00073dc600073e1000073e5000073e900007
-3eea00073f4400073f7e00073fb800073ffc0007404000074084000740c8
-0007411c00074170000741bc00074208000742460007428a000742da0007
-432a00074384000743e20007440c00074436000744d00007456a000745ae
-000745f2000747080007471800074760000747a8000747fa0007484c0007
-48b60007490a00074956000749b400074a3e00074aa200074ae600074b30
-00074b9800074be200074c2200074c6a00074ca600074ce200074d1e0007
-4d5800074d9a00074ddc00074e1c00074e5c00074ea600074ef000074f46
-00074f9e00074fec0007503a0007507c000750ca0007510c000751560007
-5198000751dc0007523800075294000752e00007532c00075376000753c0
-000753fe0007543c000754ba0007553800075572000755ac000756460007
-56e0000757b400075888000758e400075940000759b400075a2800075b86
-00075b9600075c8000075c9000075cc600075cfc00075d3600075d700007
-5dac00075de800075e2e00075e7400075fda00076190000762dc0007649a
-00076610000767b8000768e8000769ee00076c0c00076d5000076ee60007
-706e000770ec0007723000077438000774cc00077560000776b4000777de
-0007795800077a9800077c0400077cf200077ebc00078050000780d20007
-8204000782ee0007845600078538000786ee000787e00007894200078a7e
-00078b7200078d3600078ebe00079062000791c600079362000795200007
-96a600079742000798b6000799a800079a9000079c1000079d6200079e82
-0007a01a0007a1f00007a37e0007a4280007a4de0007a6900007a7340007
-a7c20007a80e0007a85a0007a8d20007a9b00007aa2a0007aacc0007ab20
-0007ac840007adb00007aec20007afc40007b08c0007b2000007b3400007
-b5660007b6100007b73a0007b83e0007b9de0007baca0007bbc40007bcc2
-0007bda80007bec20007c07c0007c22a0007c3980007c4100007c4840007
-c5a20007c6260007c7280007c8b40007ca2c0007cb620007cc6c0007cde2
-0007cf5a0007d14c0007d33a0007d5000007d5740007d6240007d6da0007
-d78a0007d8480007d9420007da460007db400007dc4c0007dcd40007dd62
-0007ddea0007de7e0007df5a0007e0500007e1340007e22a0007e2be0007
-e37a0007e40e0007e4cc0007e5bc0007e6c40007e7c20007e8d60007e9f8
-0007eb0c0007ec4c0007ed860007eea80007efbc0007f1000007f2540007
-f4680007f61a0007f6ce0007f7ea0007f8c00007f9de0007fabc0007fc50
-0007fd0a0007fda60007fe980007ff800008006c000800ea000801e40008
-03220008044e00080482000804c6000804d600080576000806180008070e
-000807fa000808d4000809ac00080b0a00080c6a00080d0800080d9e0008
-0ddc00080e1c00080e5a00080e9a00080ef400080f4c00080fa60008100a
-0008109600081292000812e20008140e0008149400081514000815ee0008
-16c2000817c6000819b200081aca00081b3a00081bca00081c8c00081d5e
-00081dca00081e4800081f9c00081fe2000820280008210c000821480008
-21a6000821e4000822160008225a0008229c000822cc000100000d3500f2
-003c009d000700020010002f005600000468041d0005000200>
-<0000003a02be0000000300000000006a00000000000300000001000a006a
-0000000300000002000e00740000000300000003005e0082000000030000
-0004000a00e00000000300000005001800ea0000000300000006000e0102
-000000030000000700ba01100000000300000008003001ca000000030000
-0009008a01fa000000030000000d02aa028400010000000000000035052e
-000100000000000100050563000100000000000200070568000100000000
-0003002f056f00010000000000040005059e0001000000000005000c05a3
-0001000000000006000705af0001000000000007005d05b6000100000000
-00080018061300010000000000090045062b000100000000000d01550670
-0003000104030002000c07c50003000104050002001007d1000300010406
-0002000c07e10003000104070002001007ed0003000104080002001007fd
-0003000104090000006a080d0003000104090001000a0877000300010409
-0002000e08810003000104090003005e088f0003000104090004000a08ed
-0003000104090005001808f70003000104090006000e090f000300010409
-000700ba091d0003000104090008003009d70003000104090009008a0a07
-000300010409000d02aa0a9100030001040a0002000c0d3b00030001040b
-000200100d4700030001040c0002000c0d5700030001040e0002000c0d63
-0003000104100002000e0d6f000300010413000200120d7d000300010414
-0002000c0d8f000300010415000200100d9b0003000104160002000c0dab
-0003000104190002000e0db700030001041b000200100dc500030001041d
-0002000c0dd500030001041f0002000c0de10003000104240002000e0ded
-00030001042a0002000e0dfb00030001042d0002000e0e0900030001080a
-0002000c0e170003000108160002000c0e23000300010c0a0002000c0e2f
-000300010c0c0002000c0e3b00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0052006500670075006c00610072004d006f006e006f
-0074007900700065003a0041007200690061006c00200052006500670075
-006c00610072003a00560065007200730069006f006e00200035002e0030
-003100200028004d006900630072006f0073006f00660074002900410072
-00690061006c00560065007200730069006f006e00200035002e00300031
-0041007200690061006c004d00540041007200690061006c002000690073
-00200061002000740072006100640065006d00610072006b0020006f0066
-00200054006800650020004d006f006e006f007400790070006500200043
-006f00720070006f0072006100740069006f006e00200069006e00200074
-0068006500200055006e0069007400650064002000530074006100740065
-007300200061006e0064002f006f00720020006f00740068006500720020
-0063006f0075006e00740072006900650073002e0054006800650020004d
-006f006e006f007400790070006500200043006f00720070006f00720061
-00740069006f006e004d006f006e006f0074007900700065002000540079
-00700065002000440072006100770069006e00670020004f006600660069
-006300650020002d00200052006f00620069006e0020004e006900630068
-006f006c00610073002c0020005000610074007200690063006900610020
-005300610075006e0064006500720073002000310039003800320059006f
-00750020006d006100790020007500730065002000740068006900730020
-0066006f006e007400200074006f00200064006900730070006c00610079
-00200061006e00640020007000720069006e007400200063006f006e0074
-0065006e00740020006100730020007000650072006d0069007400740065
-006400200062007900200074006800650020006c006900630065006e0073
-00650020007400650072006d007300200066006f00720020007400680065
-002000700072006f006400750063007400200069006e0020007700680069
-006300680020007400680069007300200066006f006e0074002000690073
-00200069006e0063006c0075006400650064002e00200059006f00750020
-006d006100790020006f006e006c0079002000280069002900200065006d
-0062006500640020007400680069007300200066006f006e007400200069
-006e00200063006f006e00740065006e0074002000610073002000700065
-0072006d0069007400740065006400200062007900200074006800650020
-0065006d00620065006400640069006e0067002000720065007300740072
-0069006300740069006f006e007300200069006e0063006c007500640065
-006400200069006e0020007400680069007300200066006f006e0074003b
-00200061006e006400200028006900690029002000740065006d0070006f
-0072006100720069006c007900200064006f0077006e006c006f00610064
-0020007400680069007300200066006f006e007400200074006f00200061
-0020007000720069006e0074006500720020006f00720020006f00740068
-006500720020006f00750074007000750074002000640065007600690063
-006500200074006f002000680065006c00700020007000720069006e0074
-00200063006f006e00740065006e0074002ea9203230303620546865204d
-6f6e6f7479706520436f72706f726174696f6e2e20416c6c205269676874
-732052657365727665642e417269616c526567756c61724d6f6e6f747970
-653a417269616c20526567756c61723a56657273696f6e20352e30312028
-4d6963726f736f667429417269616c56657273696f6e20352e3031417269
-616c4d54417269616c20697320612074726164656d61726b206f66205468
-65204d6f6e6f7479706520436f72706f726174696f6e20696e2074686520
-556e697465642053746174657320616e642f6f72206f7468657220636f75
-6e74726965732e546865204d6f6e6f7479706520436f72706f726174696f
-6e4d6f6e6f7479706520547970652044726177696e67204f666669636520
-2d20526f62696e204e6963686f6c61732c20506174726963696120536175
-6e646572732031393832596f75206d617920757365207468697320666f6e
-7420746f20646973706c617920616e64207072696e7420636f6e74656e74
-206173207065726d697474656420627920746865206c6963656e73652074
-65726d7320666f72207468652070726f6475637420696e20776869636820
-7468697320666f6e7420697320696e636c756465642e20596f75206d6179
-206f6e6c792028692920656d626564207468697320666f6e7420696e2063
-6f6e74656e74206173207065726d69747465642062792074686520656d62
-656464696e67207265737472696374696f6e7320696e636c756465642069
-6e207468697320666f6e743b20616e6420286969292074656d706f726172
-696c7920646f776e6c6f6164207468697320666f6e7420746f2061207072
-696e746572206f72206f74686572206f7574707574206465766963652074
-6f2068656c70207072696e7420636f6e74656e742e004e006f0072006d00
-61006c006f00620079010d0065006a006e00e9006e006f0072006d006100
-6c005300740061006e0064006100720064039a03b103bd03bf03bd03b903
-ba03ac00a90020003200300030003600200054006800650020004d006f00
-6e006f007400790070006500200043006f00720070006f00720061007400
-69006f006e002e00200041006c006c002000520069006700680074007300
-2000520065007300650072007600650064002e0041007200690061006c00
-52006500670075006c00610072004d006f006e006f007400790070006500
-3a0041007200690061006c00200052006500670075006c00610072003a00
-560065007200730069006f006e00200035002e0030003100200028004d00
-6900630072006f0073006f0066007400290041007200690061006c005600
-65007200730069006f006e00200035002e00300031004100720069006100
-6c004d00540041007200690061006c002000690073002000610020007400
-72006100640065006d00610072006b0020006f0066002000540068006500
-20004d006f006e006f007400790070006500200043006f00720070006f00
-72006100740069006f006e00200069006e00200074006800650020005500
-6e0069007400650064002000530074006100740065007300200061006e00
-64002f006f00720020006f007400680065007200200063006f0075006e00
-740072006900650073002e0054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-4d006f006e006f0074007900700065002000540079007000650020004400
-72006100770069006e00670020004f006600660069006300650020002d00
-200052006f00620069006e0020004e006900630068006f006c0061007300
-2c0020005000610074007200690063006900610020005300610075006e00
-64006500720073002000310039003800320059006f00750020006d006100
-7900200075007300650020007400680069007300200066006f006e007400
-200074006f00200064006900730070006c0061007900200061006e006400
-20007000720069006e007400200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-200074006800650020006c006900630065006e0073006500200074006500
-72006d007300200066006f00720020007400680065002000700072006f00
-6400750063007400200069006e0020007700680069006300680020007400
-680069007300200066006f006e007400200069007300200069006e006300
-6c0075006400650064002e00200059006f00750020006d00610079002000
-6f006e006c0079002000280069002900200065006d006200650064002000
-7400680069007300200066006f006e007400200069006e00200063006f00
-6e00740065006e00740020006100730020007000650072006d0069007400
-7400650064002000620079002000740068006500200065006d0062006500
-6400640069006e0067002000720065007300740072006900630074006900
-6f006e007300200069006e0063006c007500640065006400200069006e00
-20007400680069007300200066006f006e0074003b00200061006e006400
-200028006900690029002000740065006d0070006f007200610072006900
-6c007900200064006f0077006e006c006f00610064002000740068006900
-7300200066006f006e007400200074006f00200061002000700072006900
-6e0074006500720020006f00720020006f00740068006500720020006f00
-750074007000750074002000640065007600690063006500200074006f00
-2000680065006c00700020007000720069006e007400200063006f006e00
-740065006e0074002e004e006f0072006d0061006c004e006f0072006d00
-610061006c0069004e006f0072006d0061006c004e006f0072006d00e100
-6c004e006f0072006d0061006c0065005300740061006e00640061006100
-720064004e006f0072006d0061006c004e006f0072006d0061006c006e00
-79004e006f0072006d0061006c041e0431044b0447043d044b0439004e00
-6f0072006d00e1006c006e0065004e006f0072006d0061006c004e006f00
-72006d0061006c004e0061007600610064006e006f0074006801b001a103
-00006e00670041007200720075006e00740061004e006f0072006d006100
-6c004e006f0072006d0061006c004e006f0072006d0061006c004e006f00
-72006d0061006c000000b900540328b326181fd0bc032900e00329000203
-29b22b1d1fb90327031db23b1f40b80323b31215320f412d03200001002f
-0320000100200320006f032000af032000bf03200004005f031e00010010
-031e007f031e0080031e00af031e00bf031e00d0031e00060000031e0010
-031e0020031e006f031e009f031e00e0031e0006031d031cb2201f104127
-0319007f03190002000f031700ef031700ff03170003001f0317002f0317
-004f0317005f0317008f0317009f03170006000f0317005f0317006f0317
-007f031700bf031700f00317000600400317b2923340b80317b28b3340b8
-0317b36a6c3240b80317b2613340b80317b35c5d3240b80317b357593240
-b80317b34d513240b80317b344493240b80317b23a3340b80317b3313432
-40b80317b32e423240b80317b3272c3240b80317b312253280b80317b30a
-0d32c04116031600d00316000200700316000102c4000f0101001f00a003
-1500b0031500020306000f0101001f00400312b32426329fbf0304000103
-0203010064001fffc00301b20d1132410a02ff02ef0012001f02ee02ed00
-64001fffc002edb30e11329f414a02e200af02e200bf02e2000302e202e2
-02e102e1007f02e00001001002e0003f02e0009f02e000bf02e000cf02e0
-00ef02e0000602e002e002df02df02de02de000f02dd002f02dd003f02dd
-005f02dd009f02dd00bf02dd00ef02dd000702dd02dd001002dc00010000
-02dc0001001002dc003f02dc000202dc02dc001002db000102db02db000f
-02da000102da02daffc002d3b2373932b9ffc002d3b22b2f32b9ffc002d3
-b21f2532b9ffc002d3b2171b32b9ffc002d3b2121632b802d2b2f9291fb9
-0326031cb23b1f40bb0322003e00330322b225311fb80318b23c691fb802
-e3b3202b1fa0413002d400b002d40002000002d4001002d4002002d40050
-02d4006002d4007002d40006006002d6007002d6008002d6009002d600a0
-02d600b002d60006000002d6001002d6002002ca002002cc002002d60030
-02d6004002d6005002d6000802d0b2202b1fb802cfb226421f411602ce02
-c70017001f02cd02c80017001f02cc02c60017001f02cb02c50017001f02
-c902c5001e001f02ca02c6b21e1f00410b02c6000002c7001002c6001002
-c7002f02c5000502c1b324121fff411102bf0001001f02bf002f02bf003f
-02bf004f02bf005f02bf008f02bf000602bf0222b2641f12410b02bb00ca
-0800001f02b200e90800001f02a600a20800406a1f402643493240204349
-3240263a3d3240203a3d329f209f26024026969932402096993240268e92
-3240208e92324026848c324020848c3240267a813240207a813240266c76
-3240206c76324026646a324020646a3240265a5f3240205a5f3240264f54
-3240204f5432b8029eb724271f374f6b0120410f02770030027700400277
-00500277000402770277027700f90400001f029bb22a2a1fb8029a402b29
-2a1f80ba0180bc0180520180a201806501807e01808101803c01805e0180
-2b01801c01801e0180400180bb0138000100800140b40180400180bb0138
-00010080013940180180ca0180ad01807301802601802501802401802001
-3740b80221b2493340b80221b2453340b80221b341423240b80221b33d3e
-320f410f0221003f0221007f0221000300bf022100cf022100ff02210003
-00400221b320223240b80221b3191e3240b80222b32a3f3240b80221b32e
-3a326f414802c3007f02c3008f02c300df02c30004002f02c3006002c300
-cf02c30003000f02c3003f02c3005f02c300c002c300ef02c300ff02c300
-0600df02220001008f02220001000f0222002f0222003f0222005f022200
-7f022200ef0222000600bf022100ef02210002006f0221007f022100af02
-210003002f0221003f0221004f0221000302c302c3022202220221022140
-1d101c102b1048038f1c010f1e014f1eff1e023700161600000012110811
-b8010db6f70df8f70d00094109028e028f001d001f0290028f001d001f02
-8fb2f91d1fb80198b226bb1f41150197001e0401001f013900260125001f
-013800730401001f0135001c0801001f0134001c02ab001f0132b21c561f
-b8010fb2262c1fba010e001e0401b61ff91ce41fe91cb80201b61fe81cbb
-1fd720b80401b21fd51cb802abb61fd41c891fc92fb80801b21fbc26b801
-01b21fba20b80201b61fb91c381fadcab80401b21f8126b8019ab21f7e26
-b8019ab61f7d1c471f6b1cb80401b21f6526b8019ab21f5e73b80401400f
-1f52265a1f481c891f441c621f4073b80801b61f3f1c5e1f3c26b8019ab2
-1f351cb80401b61f301cbb1f2b1cb80401b61f2a1c561f291cb80101b21f
-231eb80401b21f5537b80168402c07960758074f07360732072c0721071f
-071d071b071408120810080e080c080a080808060804080208000814b8ff
-e0402b000001001406100000010006040000010004100000010010020000
-01000200000001000002010802004a00b013034b024b5342014bb0c06300
-4b6220b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807
-ff52b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ff
-b101018e851bb0124358b900010111858d1bb900010128858d5959001816
-763f183f123e113946443e113946443e113946443e113946443e11394660
-443e11394660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b2b
-182b1db0964b5358b0aa1d59b0324b5358b0ff1d594bb09353205c58b901
-f201f04544b901f101f045445958b9033e01f2455258b901f2033e445959
-4bb8015653205c58b9002001f14544b9002601f145445958b9081e002045
-5258b90020081e4459594bb8019a53205c58b9002501f24544b9002401f2
-45445958b909090025455258b9002509094459594bb8040153205c58b173
-244544b1242445445958b917200073455258b9007317204459594bb80401
-53205c58b1ca254544b1252545445958b9168000ca455258b900ca168044
-59594bb03e53205c58b11c1c4544b11e1c45445958b9011a001c455258b9
-001c011a4459594bb05653205c58b11c1c4544b12f1c45445958b9018900
-1c455258b9001c01894459594bb8030153205c58b11c1c4544b11c1c4544
-5958b90de0001c455258b9001c0de04459592b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65
-422b2b01b33b59635c456523456023456560234560b08b766818b0806220
-20b163594565234520b003266062636820b003266165b059236544b06323
-4420b13b5c4565234520b003266062636820b003266165b05c236544b03b
-2344b1005c455458b15c406544b23b403b4523614459b347503437456523
-456023456560234560b089766818b080622020b134504565234520b00326
-6062636820b003266165b050236544b034234420b147374565234520b003
-266062636820b003266165b037236544b0472344b10037455458b1374065
-44b24740474523614459004b5342014b5058b108004259435c58b1080042
-59b3020b0a124358601b2159421610703eb0124358b93b21187e1bba0400
-01a8000b2b59b00c2342b00d2342b0124358b92d412d411bba0400040000
-0b2b59b00e2342b00f2342b0124358b9187e3b211bba01a80400000b2b59
-b0102342b0112342002b7475737500184569444569444569447373737374
-757374752b2b2b2b74752b2b2b2b2b737373737373737373737373737373
-737373737373737373732b2b2b45b0406144737400004bb02a534bb03f51
-5a58b1070745b040604459004bb03a534bb03f515a58b10b0b45b8ffc060
-4459004bb02e534bb03a515a58b1030345b040604459004bb02e534bb03c
-515a58b1090945b8ffc06044592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b752b2b2b2b2b2b2b435c58b9008002bbb301401e017400735903b01e4b
-5402b0124b545ab012435c5a58ba009f02220001007359002b7473012b01
-732b2b2b2b2b2b2b2b737373732b2b2b2b2b002b2b2b2b2b2b0045694473
-456944734569447374754569447345694445694445694473744569444569
-44732b2b2b2b2b732b002b732b74752b2b2b2b2b2b2b2b2b2b2b2b2b2b73
-7475732b7374757374752b2b2b742b2b000000>
-[15785 15901 16277 16325 16277 16273 15933 16169 16277 15721 16361 15561 15973
-16029 16305 15693 16345 16249 15893 15629 16365 15481 16245 16249 16357 16337
-15821 15749 16345 15937 16257 16033 19077 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-2 3242 17 <000100ba0000018700cd000300254018023c000a023c5f006f007f00af00
-04a0000100a004a198182b10f65d5ded003fed313033353315bacdcdcd00
->ArialMT AddT42Char 
-2 9604 37 <00030096000004e905ba0011001d002a0113b90004fff440470b0b065504
-044623562366237309840906691a75057009730b8305830b062716090318
-272a1e161d090913121e2a2a2929001c1d1e0201021f1e1e110008182606
-0c1010025506b8ffe640330f0f025506120d0d025506060c0c025506080b
-0b0655060c0c0c065506140d0d0655065425260c1c101002550c0a0d0d02
-550cb8fff440150b0b06550c1a2c1d1e200120000100201010025500b8ff
-f6b40f0f025500b8fff6b40d0d025500b8fffab40c0c025500b8fffab40c
-0c065500b8fff0400a0d0d0655005d2b3b5c182b10f62b2b2b2b2b2b5d3c
-fd3c4e10f62b2b2b4dedf42b2b2b2b2b2b2bed003f3cfd3c3f3cfd3c1239
-2f3c10fd3c392f1139111239011217393130015d005d2b33112132161615
-140607161615140e0223012132373636353426262321112132373e023534
-26262321960226a8cb736667858f5780c18cfe93013d81384a4b46829efe
-db016d5e26435a3a54958cfead05ba59b9655ea63327bc8067b160310352
-1116664d496f29fba0070c386b4652793100>ArialMT AddT42Char 
-2 11032 42 <0001006dffe705b905d300250113401a1b141b15026027015e0813011203
-2424002112170225001e0201b8ffc040200c0c0655010106171e0e03211e
-06090101262725242003032002202760020302b8ffe4b40f0f025502b8ff
-f2b40d0d025502b8ffdab40c0c025502b8fff4401b0c0c06550272802701
-271d26200a010a100c0c06550a1926635b182b4e10f42b5d4ded4d105df6
-2b2b2b2b5d3c4d10fd3c1112392f003fed3fed12392f2b3cfd3c11123911
-123901111239123931304379404404231b1c1a1c191c03060c2610251526
-1f26082504262325180d1d2100160f1321011112141320071d2100220525
-21011c0b17210114111721011e092121002403212100002b2b2b2b012b2b
-103c103c2b2b2b2b2b2b2b2b2b2a81015d005d0135251106042322240235
-3412243332041617072e02232206060706151412043332363711034c026d
-8ffed0a0d8fe9fb4b30150db9f01019226af2162b66f85c2772138870102
-917ef03e023fac01fde07273b9015ed8d60173b467b8943070804d51844f
-889fc4fef88061370111>ArialMT AddT42Char 
-2 15164 53 <000200a1000005ad05ba0018002201fc4021120b0e0112361c5a1f66086d
-1f0409100d0d065508100d0d065507100d0d065524b8ffc0b40c0c02550d
-b8fff4b40c0c02550cb8fff4b40c0c02550bb8fff4b40c0c025512b8ffe2
-b3121a3412b8fff0b322273411b8ffe2b31d273410b8ffe2b31d27340fb8
-ffe2b31d273412b8ffd8b31d263411b8ffe2b3121a3410b8ffe2b3121a34
-0fb8ffe24049121a34250e4a1c4a20530b5c1c6d1c7209780e790f850a88
-0f970da90fb80fe80ee70f100e0c0c20110f1411110f110f0c09121b0221
-1a160a061211100d0c0518090916171a191e17b8ffc040190b0b06551717
-0021221e0201020018180f0f0e081e260e9c06b8ffe8b40f0f025506b8ff
-f6b40d0d025506b8ffe040220c0c025506060d0d0655065d202470248024
-03242218200120000100201010025500b8fff6b40f0f025500b8fff6b40d
-0d025500b8fffa400b0c0c025500060b0b065500b8fff7b40c0c065500b8
-fff8400a0d0d0655005d233ba8182b4e10f42b2b2b2b2b2b2b5d3c4dfd3c
-105df62b2b2b2b19e418ed003f3c103c103c3f3cfd3c12392f2bfd3c103c
-392f12173901111739870e2e2b057d10c43130015d2b2b2b2b2b2b2b2b2b
-2b2b2b2b002b2b2b5d435c58400a08400f390f103a11123a2b2b2b590171
-435c58b9000effde401a193911221939122219390e401c39102214391022
-1f39102215392b2b2b2b2b2b2b5933112132161615140607161716171323
-032e02272623231111213236363534262321a1028ac4cc7acad34d28554c
-fff4c2556e572d214be101a185964e97a3fe3005ba4fc8799cd61d25244e
-75fe710131848c380b07fd750333377947688600>ArialMT AddT42Char 
-3 5440 70 <00010050ffe803ed043e001a015ab1020243545840340e7f0f010f0b0140
-0050007000030004121c0b07181c040b010e1507080e0e0255070c0d0d02
-55070c0c0c025507100b0b0255072f2b2b2b2bcdd4c6003fed3fed10c45d
-3210c45d3231301b4047090c011f1c4313431753135317601360179b029b
-039a0da410a41a0c080d190a6a0269036a05750c700d800da60cb509b60a
-b50c0c160c860ce302030e225f0f6f0f7f0f030f01b802aa407930004000
-5000600070009000a000e000f00009000f0f0b000004121c0b07181c040b
-1c0f010f240e080d0d06550e221b000100240b2b1f010100010101400b0b
-065501401010065501480c0c0655011a0d0d065501491c1524cf07011f07
-3f0702070e0b0b0655070a1010065507120c0c065507311b34c4182b10f6
-2b2b2b5d71ed10f62b2b2b2b5d724b53234b515a58b90001ffc03859ed72
-f42bed72003fed3fed12392f11392f105de4105de43130005d71015d7159
-011706062322001134123633321617072626232206151416333236033cb1
-1defaedafef772e989addc1faf197f5a88aaa4846a8e018517b7cf011d01
-0aac010281afa11b6b6cc3d3d6c28200>ArialMT AddT42Char 
-3 8014 76 <000200880000013c05ba0003000700cd405e09360b0b02554f099009a009
-b009c009df09f0090700091f09700980099f09b009c009df09e009ff090a
-1f09010001070402030906037e0100060506040a0607250500049f04a004
-b004c004e00406c004f0040200042004d004e0040404b8fff8b410100255
-04b8fffa40170e0e025504040c0c0255040a0b0b025504140b0b065504b8
-ffeab41010065504b8fffeb40d0d065504b8fffc400a0c0c0655044e0847
-50182b10f62b2b2b2b2b2b2b2b5d71723cfd3c003f3f3c3fed0111123939
-111239393130015d72712b133533150311331188b4b4b404ebcfcffb1504
-26fbda00>ArialMT AddT42Char 
-3 12038 86 <0001003fffe803b1043e00300317407b042214223a094a09442456226522
-7c098e098424a613ab2cc2030d09171a1817304b2cd617051b0255020210
-32010a185c085c095c0a5c0b5c0c5c0d6a086a096a0a6a0b6a0c6a0db426
-b4270f27262427242936245a0a590b64266428742374248024930a9c0c92
-28972c9530a40aa90ca327a428b326c5261628b8fff4b40d0d065522b8ff
-f4b40d0d065523b8fff4b40d0d065524b8fff4b40d0d065528b8fff4b40c
-0c065522b8fff4b40c0c065523b8fff4b40c0c065524b8fff4b40c0c0655
-1db8ffde40121e395a0827250c0a041a202615040b2e1d1ab802aa402219
-2c0b0b02551f193f194f195f19af19cf19060f191f196f19df19041f198f
-190219bd02550015000002aa0001ffc040140b0b025510014001021001d0
-0102000110010201b8ffc0b314163401b8ffc040100e113401012e5c1d6c
-1d021d1c150704b8fff4b40b0b025504b8ffe6b41010065504b8ffe64013
-0f0f0655041c2e0b1f1a011a24194013183432b8ffc0402f0f0f02551918
-0f0f025519180d0d025519160c0c025519201010065519200f0f06551910
-0c0c065519160d0d065519b8025bb207242ab8ffc0b51c39d02a012ab8ff
-e6b40c0c02552ab8ffe8b40f0f02552ab8ffe8b40c0c06552ab8ffeab60d
-0d06552a1a32b8ffc04021272a346032c032023f32803202321001010124
-00180d0d025500100d0d06550020b8fff4b40d0d025520b8fff4b4101006
-5520b8fff440190f0f065520240f100b0b02550f160c0c02550f200d0d02
-550fb8fffa40200f0f02550f0e0c0c06550f0c0d0d06550f22df00013f00
-4f00020019313437182b4e10f45d714df42b2b2b2b2b2bed2b2b2b102b2b
-ed724e105d712bf62b2b2b2b712b4dedf42b2b2b2b2b2b2b2b2bed72003f
-ed2b2b2b3fed7112392f2b2b5d71722be410fd5d71722be4111239111239
-0111121739313043794040272d1e2305142c261110121013100306220d20
-1b000928071b01052d071b011e14201b00210e231b0022230d0c08290a1b
-012827090a062b041b001f101d1b01002b2b103c103c2b103c103c2b012b
-2b2b2b2a2b818181002b2b2b2b2b2b2b2b2b5d71015d72715d1337161633
-323635342726272e02353436373636333216161707262623220615141716
-1716171e02151406062322263fb20f897b7c78352593c6994f41382a9153
-7dbd5a11b00c73697c6a16162f1b84bf975669c67dcfd9013d1c6b726544
-3d2318253249814e4779281f2b487b6718525c5237231c1d130a2433417c
-5c5a9f57ac00>ArialMT AddT42Char 
-2 0 0 <00020100000005000500000300070000211121112521112101000400fc20
-03c0fc400500fb002004c000>ArialMT AddT42Char 
-ArialMT /CharStrings get begin
-/period 17 def
-/B 37 def
-/G 42 def
-/R 53 def
-/c 70 def
-/i 76 def
-/s 86 def
-end
-ArialMT /Encoding get
-dup 46 /period put
-dup 66 /B put
-dup 71 /G put
-dup 82 /R put
-dup 99 /c put
-dup 105 /i put
-dup 115 /s put
-pop
-end
-%ADOEndSubsetFont
-/KUDFOL+ArialMT /ArialMT findfont ct_VMDictPut
-/KUDFOL+ArialMT*1 
-[46{/.notdef}rp /period 19{/.notdef}rp /B 4{/.notdef}rp /G 10{/.notdef}rp /R 
-16{/.notdef}rp /c 5{/.notdef}rp /i 9{/.notdef}rp /s 140{/.notdef}rp]
-KUDFOL+ArialMT nf
-KUDFOL+ArialMT*1 [9 0 0 -9 0 0 ]msf
-42 289.76 mo
-(sRGB.icc)
-[4.563 6.48 6.957 6.00307 2.52 2.043 4.563 0 ]xsh
-/KUDFOL+ArialMT*1 uf
-/KUDFOL+ArialMT uf
-/ArialMT uf
-gsave
-48.001 300.002 mo
-76.507 300.002 li
-76.507 331.134 li
-48.001 331.134 li
-cp
-clp
-48 299.753 mo
-76.5052 299.753 li
-76.5052 331.132 li
-48 331.132 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 48 240.247 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-%ADOBeginSubsetFont: ArialMT Initial
-ct_T42Dict begin
--0.664 -0.324 2 1.004
- 256 array 0 1 255 {1 index exch /.notdef put} for  /ArialMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f3210325d73000000cc000000606376
-7420a11cd7eb0000012c000006546670676dcc79599a000007800000066e
-676c796607022dca000094e0000822cc68656164d6144b3e00000df00000
-003668686561123315fe00000e2800000024686d7478f65efffb00000e4c
-000034d46c6f6361361cd72000004320000034d86d617870124c05df0000
-77f8000000206e616d659617a74000007818000011057072657025d64dbf
-0000892000000bbe67646972000000000000000000000000000303880190
-00050008059a05330000011b059a0533000003d1006602120805020b0604
-020202020204e0002affc00078430000000900000000544d432000400020
-fffc05d3fe510133073e01b2400001ffffff0000042605bb000000200004
-05ba001905ba001a05a70019042600180000ffe70000ffe80000ffe7fe69
-ffe805ba0019fe69ffe802ea000000b8000000b80000000000a800ad0169
-00ad00bf00c201f0001800af00b900b400c800170044009c007c00940087
-0006005a00c80089005200520005004400940119ffb4002f00a1000300a1
-00cd00170057007e00ba00160118ffe9007f008503d300870085000d0022
-00410050006f008d014cff75005c00df04830037004c006e00700180ff58
-ff8eff92ffa400a500b903c8fffd000b001a0063006300cdffee05d8ffdc
-002d005c0095009900df019209b500400057008000b9039d0072009a035d
-0401ff67fffa00030021007700cd0004004d00cd01c0022b004c006500e7
-0118017c034305d8ffa3ffb0ffc40003001c005d0068009a00ba01350147
-0221055cff4dffcd0016002d00780080009900b200b600b600b800bd00da
-010c05f0ffa4fff00019002c0049007f00b400ce01c003fefd81fe3f0000
-00050018002900390049006f00be00c700d0012301c1026f050c05320540
-057affd4001400310055005700a700b400e601f7027e027e027f03c60446
-ff42000e0085009100bf00c200c500e1011a012f014f01560229026f029e
-03720008002c00310031006400690089009800c700de012b01b6020c02cf
-03a304ab04fb061dfee0ff0e00060026009b009d00c1010d011801200173
-018201d601e30243025f029b02e2039404a904d20761001c005e006d008d
-00ab00f7011201380151015b0168017c01870191019901cd01d001e80241
-0254026b02ef0368037103bd044204420453047304830586058b06e8fe58
-fec4fed1fef7ff32ff860051007c008100910095009e00b400b900cf00d9
-00d900df00e20105010b010e010e012001210155017b017b017e018d01a2
-01a801a901b401d001d001e201e901f201f501fb020002000206021b0221
-022202220223027202770294029c02cf02cf02d002ec02f903170322032b
-0335033c0359036f037103870390039003b503e1041a04cf04ff05320532
-0596059f05a805ab05c205f0060c0782080008ccfca3fd2afddefe00fe88
-fe96feb2feb4ffe100150019001a001c001f003c005100610061006a0078
-009600a500af00d3010c0118011a012a013e014c0151015f016a01710178
-01820184019a01a501a801a901ae01bc01cd01d701ef0200020d021c0221
-0222022e02350242024f024f025e026502710290029202b402d602fa0307
-030b030f0315032a0347035d036503740379039603b003cc03dd03e203f6
-03fc03fc03ff040a041f04220426042b0447045f0475049e04e704e7055c
-05cb05e5060a066d068606b806f10736073e07500751075d078f07b607d4
-086000b600c300b500b700000000000000000000000001e00381034503b5
-008e0233041902ce02ce002d005f0064034d023f000002a80188027d01b4
-02240578063b023b014e00f00426029402c6029f02f6023b034d014b0153
-006a0231000000000000061404aa0000003c04c300ed04bc026502ce03b5
-0078060c017e02ef060c00b201000239000001c50330042b03cb00da03df
-010704a100db040a011701ed02a70350010b01bd043e05580021039c00ae
-0371017d00b5024500000afb088c012b014e01aa00870054013201f803ff
-0003024e00b4003703e30083006b02d800ed00770088009701640467008e
-0033017c00e700a6029e0329056e062a061501c90269048a021301b40002
-04a9000002390124010305140084015d039a06ef02d9007500cf040a00de
-03ac04bc02cf02ae034d04f005520168006d007d00860071ff8100790558
-04d2016700030156002504e00094007c033204210094007f0072005c002f
-00b6001800ba00b80041034d00720018001f004c016a01550099009a009a
-009800b200040078006900140057006e00ce00b4065402b80067050e0165
-00e7000004cbfe52005affa60099ff67006eff92002dffd40087ff7c00b8
-00a800e5008f00a80185fe7b0070001e00d900de014c054602cf0546ff2d
-028a02d90253029600b700000000000000000000000000000125011800ea
-00ea00ae0000003e05bb008a04d70053003fff8cffd50015002800220099
-0062004a00e4006d00ee00e5004803c00033fe4e02b1ff460370007905df
-0051ffa7ff1f010a0068ff6c004f00bc00a507050061072b00ed04b001d2
-00b6007b00650252ff740365fe690094008f005c00400086007500890089
-4043555441403f3e3d3c3b3a3938373534333231302f2e2d2c2b2a292827
-262524232221201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09
-0807060504030201002c4523466020b02660b004262348482d2c45234623
-6120b02661b004262348482d2c45234660b0206120b04660b00426234848
-2d2c4523462361b0206020b02661b02061b004262348482d2c45234660b0
-406120b06660b004262348482d2c4523462361b0406020b02661b04061b0
-04262348482d2c0110203c003c2d2c20452320b0cd442320b8015a515823
-20b08d44235920b0ed51582320b04d44235920b09051582320b00d442359
-21212d2c20204518684420b001602045b04676688a4560442d2c01b10b0a
-432343650a2d2c00b10a0b4323430b2d2c00b0172370b101173e01b01723
-70b10217453ab10200080d2d2c45b01a234445b01923442d2c2045b00325
-456164b050515845441b2121592d2cb00143632362b0002342b00f2b2d2c
-2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b1
-2cc08a8cb8100062602b0c642364615c58b00361592d2c45b0112bb01723
-44b0177ae4182d2c45b0112bb01723442d2cb01243588745b0112bb01723
-44b0177ae41b038a45186920b01723448a8a8720b0a05158b0112bb01723
-44b0177ae41b21b0177ae45959182d2c2d2cb0022546608a46b040618c48
-2d2c4b53205c58b002855958b00185592d2c20b0032545b019234445b01a
-23444565234520b00325606a20b009234223688a6a606120b01a8ab00052
-7921b21a1a40b9ffe0001a45208a54582321b03f1b235961441cb114008a
-5279b31940201945208a54582321b03f1b235961442d2cb110114323430b
-2d2cb10e0f4323430b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2c
-b10e0f432343650b2d2cb11011432343650b2d2c4b525845441b2121592d
-2c0120b003252349b04060b0206320b000525823b002253823b002256538
-008a63381b212121212159012d2c4bb06451584569b00943608a103a1b21
-2121592d2c01b005251023208af500b0016023edec2d2c01b00525102320
-8af500b0016123edec2d2c01b0062510f500edec2d2c20b001600110203c
-003c2d2c20b001610110203c003c2d2cb02b2bb02a2a2d2c00b00743b006
-430b2d2c3eb02a2a2d2c352d2c76b8022323701020b802234520b0005058
-b00161593a2f182d2c21210c6423648bb84000622d2c21b08051580c6423
-648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb815
-55621bb200802f2b59b002602d2c0c6423648bb84000626023212d2cb400
-0100000015b00826b00826b00826b008260f10161345683ab001162d2cb4
-000100000015b00826b00826b00826b008260f1016134568653ab001162d
-2c4b53234b515a5820458a60441b2121592d2c4b545820458a60441b2121
-592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb01343
-58031b02592d2cb0134358021b03592d2c4b54b012435c5a58381b212159
-2d2cb012435c580cb00425b00425060c6423646164b807085158b00425b0
-0425012046b01060482046b0106048590a21211b2121592d2cb012435c58
-0cb00425b00425060c6423646164b807085158b00425b00425012046b8ff
-f060482046b8fff06048590a21211b2121592d2c4b53234b515a58b03a2b
-1b2121592d2c4b53234b515a58b03b2b1b2121592d2c4b53234b515ab012
-435c5a58381b2121592d2c0c8a034b54b00426024b545a8a8a0ab012435c
-5a58381b2121592d2c4b5258b00425b0042549b00425b00425496120b000
-5458212043b0005558b00325b00325b8ffc038b8ffc038591bb040545820
-43b0005458b00225b8ffc038591b2043b0005458b00325b00325b8ffc038
-b8ffc0381bb00325b8ffc03859595959212121212d2c462346608a8a4623
-20468a608a61b8ff8062232010238ab902c202c28a70456020b0005058b0
-0161b8ffba8b1bb0468c59b0106068013a2d2cb1020042b123018851b140
-0188535a58b910000020885458b202010243604259b12401885158b92000
-0040885458b2020202436042b12401885458b2022002436042004b014b52
-58b2020802436042591bb940000080885458b202040243604259b9400000
-8063b80100885458b202080243604259b94000010063b80200885458b202
-100243604259b94000020063b80400885458b20240024360425959595959
-2d2cb0024354584b53234b515a58381b2121591b21212121592d00000001
-00000005028fa58dc35f5f0f3cf5081b080000000000a2e3272a00000000
-c14fd713faaffd671000080c00000009000100010000000000010000073e
-fe4e00431000faaffa7a1000000100000000000000000000000000000d35
-06000100000000000239000002390000023900b002d7005e047300150473
-0049071d0077055600580187005a02aa007c02aa007c031d004004ac0072
-023900aa02aa0041023900ba0239000004730055047300df0473003c0473
-00560473001a047300550473004d047300610473005304730055023900b9
-023900aa04ac007004ac007204ac00700473005a081f006f0556fffd0556
-009605c7006605c7009e055600a204e300a80639006d05c700a4023900bf
-04000037055600960473009606aa009805c7009c063900630556009e0639
-005805c700a10556005c04e3003005c700a105560009078d001905560009
-0556000604e300290239008b023900000239002703c100360473ffe102aa
-00590473004a0473008604000050047300460473004b0239001304730042
-0473008701c7008801c7ffa20400008801c7008306aa0087047300870473
-0044047300870473004802aa00850400003f02390024047300830400001a
-05c700060400000f040000210400002802ac0039021400bc02ac002f04ac
-00570556fffd0556fffd05c70068055600a205c7009c0639006305c700a1
-0473004a0473004a0473004a0473004a0473004a0473004a040000500473
-004b0473004b0473004b0473004b023900bd023900230239ffe502390009
-047300870473004404730044047300440473004404730044047300830473
-0083047300830473008304730049033300800473006b0473001b04730051
-02cd006d044c000104e3009905e5000305e50003080000e102aa00de02aa
-003d0464004e080000010639005305b4009a0464004e0464004d0464004d
-0473fffd049c00a003f4003805b4007a069600a1046400000231000002f6
-002f02ec002d0625007f071d004404e3008104e3009e02aa00e804ac0072
-046400540473002e0464003304e5001a047300860473008c080000ef0556
-fffd0556fffd0639006308000081078d00520473fffc0800000002aa0053
-02aa004701c7008001c7006c0464004e03f4002f04000021055600060156
-fe390473ffe402aa005c02aa005c040000170400001704730049023900b9
-01c7006c02aa0047080000250556fffd055600a20556fffd055600a20556
-00a20239008d0239ffe00239000402390015063900630639006306390063
-05c700a105c700a105c700a1023900c602aa001902aa000602aa001d02aa
-002e02aa00e502aa00a202aa006b02aa003a02aa004b02aa002804730000
-01c700030556005c0400003f04e3002904000028021400bc05c7fffd0473
-004905560006040000210556009e0473008704ac007204ac00a102aa006b
-02aa001902aa002106ac006b06ac006b06ac0021047300000639006d0473
-0042023900b10556005c0400003f05c700660400005005c7006604000050
-04730046046bffe102aa00ee0556fffd0473004a0556fffd0473004a05c7
-009e04eb004705c7fffd055600a20473004b055600a20473004b04730096
-01c7004204730096025500880473009a02ac008305c7009c0473008705c7
-009c04730087063900630473004405c700a102aa008505c700a102aa003c
-0556005c0400003f04e300300239002404e300300300002305c700a10473
-008305c700a10473008304e300290400002804e3002904000028046800a4
-063900600662005504a00048047400480391006204f000440329002e0530
-0048046bffe1040000b002eb005208c000330800004f040000990800004f
-040000990800004f040000980400009807d5016a05c0009e04ab007204d5
-009d04ac007104d5022204d5010505abffe9050001c905ab027e05abffe9
-05ab027e05abffe905ab027e05abffe905abffe905abffe905abffe905ab
-ffe905ab01c005ab027e05ab01c005ab01c005abffe905abffe905abffe9
-05ab027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab
-01c005ab01c005abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905abffe905abffe905ab02d605ab006605abffea05d5ffff04d50092
-0800000007eb013007eb012007eb013007eb012004d500b204d5008004d5
-002a082b0198086b01b807550010060000f40600006f0440003a05400037
-04c0003f04150040040000250600005505e100bf038d008904d5ffd90180
-008002d50086071500610296000f04d5009202d6008302d6008304d500b2
-02d600700556fffd0473004a05c700660400005005c70066040000500556
-00a20473004b055600a20473004b055600a20473004b0639006d04730042
-0639006d047300420639006d0473004205c700a40473008705c7001f0473
-00060239ffce0239ffce0239ffe40239ffe40239fff60239fff50239004b
-01c700190400003701c7ffa20556009604000088040000860473009601c7
-fffa05c7009c0473008705c900a50473008b063900630473004406390063
-0473004405c700a102aa006b0556005c0400003f04e300300239000c05c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-078d001905c70006055600060400002101c700890556fffd0473004a0800
-0001071d00440639005304e30081023900b9078d001905c70006078d0019
-05c70006078d001905c70006055600060400002101c7008a02aaffe10473
-001b04cd005a06ac006b06ac002206ac002206ac004a02aa00e202aa006b
-02aa00de02aaffea0557ffff0646ffa706b4ffa80312ffa80632ffa706d8
-ffa70605ffa701c7ff780556fffd055600960558fffe055600a204e30029
-05c700a4023900bf055600960558000b06aa009805c7009c0533006d0639
-006305c700a40556009e04f2009404e30030055600060556000906af007f
-05fb0061023900040556000604a00048039100620473008b01c7006b0460
-0088049a008c04000019038700480473008b0473005c01c7008904000086
-04000018049c00a00400001a0395005c04730044048d008303db00560460
-00880433001105b4007a063f005701c7ffc9046000880473004804600088
-063f0057055700a206eb0032045500a105c000640556005c023900bf0239
-0004040000370875000d081500a406d5003104a900a10515000a05c000a0
-0556fffd054000a705560096045500a1056b0000055600a20763000704d5
-004e05c000a105c000a104a900a10540001206aa009805c700a406390063
-05c000a00556009e05c7006604e300300515000a061500520556000905eb
-009f05550057075500a1078000a106550000071500a8054000a505c00055
-081500a405c7001a0473004a0495005b0440008802eb008804ab00000473
-004b055afffb03ab003204780087047800870380008604ab00180580008c
-046b00880473004404550088047300870400005003aa0026040000210695
-004b0400000f0495008a042b0045066b008d0695008d0500002805c0008b
-042b008404150030060000890455001f0473004b0473000002eb00890415
-004b0400003f01c700880239000901c7ffa2074000130680008304730000
-0380008604000021046b008803e900a1034a008808000041089500a00585
-002d000001010000001e0000003100000031000001010000007e0000007e
-0000008c0000008c000001010000001000000101000001210310007d0000
-008c023300d20000030b0000ff04023900b9048100690456003203310019
-0411002d04d1009601f9009b030f005f04ca009b04b8008c01f9009b0413
-002803b0005003b4003c04ca009b04cf005001f9009b02d2003c0498005a
-043c00190488006e045f007303b1001903d4000a0466009604130028058e
-00640524002803f2009b03f2009b03f2009b01e3005a0356005a0686009b
-01f9ffac041300280413002803b4ff5703b4ff570448002d058e0064058e
-0064058e0064058e00640481006904810069048100690456003203310019
-0411002d04d10096024b0000034a000004b8008c024b00000413002803b0
-005003b4003c04cf005002d2003c0498005a0488006e045f007303d4000a
-0466009604130028058e00640524002801f9009b0456003203b00050045f
-0073049b003c0000ffdc0000ff250000ffdc0000fe51028d00ab028d00a0
-02da0043034d007901a8ffba000000460000004600000046000000460000
-00480000004600000046000000460435017c0435012e043500b704350081
-0435012c043500be043500af043500810435009a043500db04350085028d
-00c1043500b3060001000600010002420036060001000435009e04350098
-043500cb0600010006000100060001000600010006000100000000460600
-010006000100060001000600010006000100060001000600010006000100
-051bffba06000100060001000600010005b5003a05b5003a01f4ffba01f4
-ffba060001000600010006000100060001000481003604350036043dffba
-043dffba03e9004a03e9004a067f0014077600140327ffba041effba067f
-0014077600140327ffba041effba051b003204b500240300fff706000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010000000030
-0000004600000046000000400000004606000100060001000000ffdc0000
-fe510000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ff160000ff160000ffdc0000ff160000ffdc0000ff200000ffdc0473
-004a08000000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010006000100028d
-007f028d005d0600010004ee0015034d007901a8000e01d6ffdc01a80056
-01d60010037500320375003201a8002d01d60013051b003204b5002401f4
-ffba01f4ffba01a8009301d6001305b5003a05b5003a01f4ffba01f4ffba
-024200000300fff705b5003a05b5003a01f4ffba01f4ffba05b5003a05b5
-003a01f4ffba01f4ffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba02b3
-005f02b3005f02b3005f02b3005f03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba08c9003e08c9003e06c5ffba06c5ffba08c9003e08c9003e06c5ffba
-06c5ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7
-ffba04a7ffba045a002a039a00360435ffba0327ffba045a002a039a0036
-0435ffba0327ffba064f0027064f00270224ffba021affba04a7004604a7
-00460224ffba021affba04cf002d04cf002d0327ffba0327ffba040d0047
-040d004701a8ffba01a8ffba02b4002302b400230327ffba0327ffba0435
-00450435004501f4ffba01f4ffba024200360300fff7039affba0327ffba
-0375003203750032051b003204b50024051b003204b5002401f4ffba01f4
-ffba045a004004ce0049045a002604ce0039045a005304ce004a045a0053
-04ce004a0600010006000100000000460000004606000100060001000600
-010000000046000000460600010006000100000000480000004606000100
-060001000600010000000046000000460000004600000046000000400000
-003006000100000000460000004606000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d00ca028d00c7028d
-00c606000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000100ffba0800ffba1000ffba06dc0063053f004406d5
-00a1055b00830000fddc0000fc2f0000fca60000fe540000fcd70000fd73
-0000fe290000fe0d0000fd110000fc670000fd9d0000fbf50000fc720000
-fed50000fed50000ff02041b00a006ac006b06ac00190000feb60000fd73
-0000fe080000fca60000fe530000fd110000fbc80000faf40000faaf0000
-fc720000fbaa0000fb6a0000fcf10000fc7d0000fbdd0000fcc10000fb98
-0000fdea0000fe840000fdc20000fcf10000fd5f0000fe760000febc0000
-fceb0000fd6c0000fd580000fc900000fd150000fc2c0000fc130000fc12
-0000fb960000fb9601c700880556fffd0473004a0556fffd0473004a0556
-fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473004a
-0556fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473
-004a0556fffd0473004a0556fffd0473004a055600a20473004b055600a2
-0473004b055600a20473004b055600a20473004b055600a20473004b0556
-00a20473004b055600a20473004b055600a20473004b0239006301c7001f
-023900ba01c7007c06390063047300440639006304730044063900630473
-004406390063047300440639006304730044063900630473004406390063
-0473004406dc0063053f004406dc0063053f004406dc0063053f004406dc
-0063053f004406dc0063053f004405c700a10473008305c700a104730083
-06d500a1055b008306d500a1055b008306d500a1055b008306d500a1055b
-008306d500a1055b00830556000604000021055600060400002105560006
-040000210556fffd0473004a0239ffe201c7ffb0063900630473004405c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-05c700a1047300830000fefe0000fefe0000fefe0000fefe0455fffd02eb
-000c07630007055afffb04a900a10380008604a900a10380008605c700a4
-046b00880473fffd040000140473fffd04000014055600090400000f0555
-0057042b0045055500a10473008706050063047300550639006004730044
-05b5003a01f4ffba0224ffba021affba04a7004601f4009e01f4001001f4
-001b01f4001001f4006b01f4fff90227ffce0000000f0000fff502aa00a4
-02aa00a40000000e00000056000000560000ffcf01a8000f01d6ffbf01a8
-fff501d6ffcd01a8001d01d6fff501a8009301d600130375003203750032
-0375003203750032051b003204b5002405b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba
-01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4
-ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a
-01f4ffba01f4ffba0481003604350036043dffba043dffba048100360435
-0036043dffba043dffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba0481
-003604350036043dffba043dffba02b3003202b3003202b3005f02b3005f
-02b3005f02b3005f02b3003202b3003202b3005f02b3005f02b3005f02b3
-005f02b3005f02b3005f02b3003802b3003802b3004902b3004903e9004a
-03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9
-004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba0692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba08c9003e08c9003e06c5ffba06c5ffba04a7ffba04a7ffba045a
-002a039a00360435ffba0327ffba064f0027064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba064f0027064f00270224
-ffba021affba064f0027064f00270224ffba021affba064f0027064f0027
-0224ffba021affba04a7004604a7004604a7004604a70046093e0032093e
-00320740ffba0740ffba067f0014077600140327ffba041effba04cf002d
-04cf002d0327ffba0327ffba04cf002d04cf002d0327ffba0327ffba04cf
-002d04cf002d0327ffba0327ffba067f0014077600140327ffba041effba
-067f0014077600140327ffba041effba067f0014077600140327ffba041e
-ffba067f0014077600140327ffba041effba067f0014077600140327ffba
-041effba040d0047040d004701a8ffba01a8ffba040d0047040d004701a8
-ffba01a8ffba040d0047040d004701a8ffba01a8ffba040d0047040d0047
-01a8ffba01a8ffba043500450435004501f4ffba01f4ffba043500450435
-00450435004504350045043500450435004501f4ffba01f4ffba04350045
-043500450481003604350036043dffba043dffba024200360300fff7031a
-001a031a001a031a001a0375003203750032037500320375003203750032
-037500320375003203750032037500320375003203750032037500320375
-0032037500320375003203750032051bffba04b5ffba051b003204b50024
-01f4ffba01f4ffba0375003203750032051b003204b5002401f4ffba01f4
-ffba051b003204b50024067f0045067f0045067f0045067f004501a80028
-0000fe290000fea20000ff300000ff1d0000ff120000ff920000fe7e08fc
-003208ad00320000ffb50000ffb60000feed0000ff640000fe7e0000ff9f
-018d000002f6fffd0000fe820000ff1004cd00320000ff580000ff580000
-ff640692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba045a002a039a00360435ffba0327ffba034d007902b400230242
-003601f4ffba0290ffba01f4002f01f4003b01f4001201f400b101f4006d
-067f00140776001401f9009b0000fed902bc000003f2009b045afff504ce
-fff5045a005304ce004a045a005304ce004a045a005304ce004a045a0053
-04ce004a045a005304ce004a045a005304ce004a04350071043500ad045a
-000f04ce000f0473001406110014054000a7047300860540000a0473000a
-05c7005105c700660400005005c7fffd067a00140540004a047300460474
-00480556006e04d5005304e3ffc40639006d04fe000f070c008701c70083
-0239001f055600960400008801c7001504000018072000a405c7ffb80473
-008b0639006006f200630557004406090014047300860556009e0556006b
-0400004f04f20094030b00440239002404e300140239002404e3003005fb
-006105c700a1062e00140400002104e300290400002804e3002904e30031
-045c0044045c003f0473003c0473005503ab003203e50024047300870214
-00bc034e00bc04ac0072023900b00aaa009e09c7009e08640046087f0096
-06aa0096039c008309c7009c078e009c062b0087047300550556fffd0473
-004a0000fefe0556fffd0473004a08000001071d00440639006d0473001a
-0639006d0473004205560096040000880639006304730044063900630473
-004404e30029045c004c01c7ffa20aaa009e09c7009e086400460639006d
-04730042084600a404f2009e05c7009c047300870556fffd0473004a0556
-fffd0473004a055600a20473004b055600a20473004b0239ff8a0239ff64
-023900040239fff60639006304730044063900630473004405c700a102aa
-ffcc05c700a102aa006805c700a10473007605c700a1047300830556005c
-0400003f04e3003002390024045c0051037e001305c700a40473008705a6
-00a404d6005e0486005e04e30029040000280556fffd0473004a055600a2
-0473004b06390063047300440000fefd0639006304730044063900630473
-004406390063047300440556000604000021047300570473004804730086
-04730086040000130400005004730046047300460473005505e9005503ab
-004903ab0032050d0032040f00440239ffb9047300420473004204780050
-0402001904ef00190473008b047300870473008701c7001901c7008901c7
-0089029e0000026e001401c700830493008306aa008406aa008406aa0087
-0473ffa60473008b046c00870473004406530044063f00570466004402aa
-ffe402aaffe402aaffe402aa008502aa008502aa008502aaffe40455008a
-0455008a0400003f01c7ffa20214ffb901c7ff7202cb00000239000f0239
-002404730019048c0044046000880400001a05c700060400001804280019
-0400002804540028045c004c045c00790400002404000050040000240400
-00500639006304400088040f004904780050046b0088032e000004000008
-033b008804730048040000240400005007b7004607400046080b004605b3
-0024036f002405c00024061c0013054a0083050f008303e2001e04380063
-03110064031100640146ffce01eb006401eb000001eb000002ea006403d9
-0000029100000187005a02d7005e01c7008001c7006c01c7008a02aa00fb
-02aa00fb02ca003202ca003204ac007004ac007004ac006504ac006502aa
-012102aa00de02aa005902aa012102aa001d02aa005902aa00de023900b6
-023900b602aa00fb02aa00fb02aa00a602aa00a602aa00a602aa001d02aa
-ffe202aafffb029400000142006402b8003202a0000002ca003203100096
-0310009603100096031000960310009602aa006202aa006202aa002802aa
-001d02aa0047045700960457009604570096045700960457004304570043
-045700430457004304570043031000430457002f0457002f0457002f0457
-002f0457002f0310002f0457002504570025045700250457002504570025
-0310002f0457001a0457001a0457001a0457001a0457001a0310001a0457
-004204570042045700420457004204570042031000420457009604570096
-045700960457009604570042045700420457004204570042045700420310
-00420457002f0457002f0457002f0457002f0457002f0310002f0457002f
-0457002f0457002f0457002f0457002f0310002f04570026045700260457
-002604570026045700260310002604570042045700420457004204570042
-045700420310004204570096045700960457009604570096045700420457
-004204570042045700420457004203100042045700260457002604570026
-045700260457002603100026045700230457002304570023045700230457
-0023031000230457002f0457002f0457002f0457002f0457002f0310002f
-0457004b0457004b0457004b0457004b0457004b0310004b045700960457
-009604570096045700960457004204570042045700420457004204570042
-031000420457001a0457001a0457001a0457001a0457001a0310001a0457
-002404570024045700240457002404570024031000240457002f0457002f
-0457002f0457002f0457002f0310002f0457004e0457004e0457004e0457
-004e0457004e0310004e045700960457009604570096045700960000fec1
-0000fec60000fdac0000fed80000ff920000fee90000ff4c0000fea00000
-fec40000ffce0000ff660000fea00000fed80000fed80000ff970000ff98
-0000ff990000fff40000ff420000ff420000ff440000ff5f0000fe870000
-ffec0000ffa60000ff510000ff510000ff510000fec90000ff1c00000000
-0000fee90000ff4c0000ff930000ff2a0000ff560000ffce0000fe870000
-febb0000fec40000fec40000fed80000fed80000feb30000fec90000fdad
-0000fdac0000feb30000fec90000fdad0000fe160000fee60000ffa60000
-fe870000ff440000feba0000ff230000ff9a0000fdac0000fe8800000000
-0000feb00000ff980000fe930000ffa60000fe870000fdac0000ff660000
-ff440000feb00000feb00000feb00000ff030000ff520000fd1f0000ff53
-0000ff530000ff530000feb50000feb50000ffc30000feae0000fedc0000
-fec70000fec80000fedc0000fe1e0000ff420000ff510000feb70000feb0
-02aa00de02aa005902aa00fa049a008c04600088062e001407aa0000062e
-0014047b004c063f005704cf0044063900630473004405c7006604000050
-04e300a8033b008804ff0000043c0032060d000a049d0042072000a406aa
-0084056500630473008b056400a40400000a0556006b0556006b04e00005
-04c5001905e5005f046e004403b600140347002804cf00440495005b0400
-005001c7ffa2063900600389004d03890050055600a205c000a10473004b
-047800870ab4006d04fe00100639001404e70014079900bf05b500880558
-000b0400001a072e00bf0590008806a10078057b007a086d00bf06f00088
-04d5006603ab001f065f0039058200480639006004730044066d0009050c
-001a066d0009050c001a0b010063091c004406aa005c04e600440987006d
-06d000500000fe370ab4006d04fe001005c7006604000050040700140000
-fea60000febc0000feaa0000fead0000fc2b0000fc4c05c000a104780087
-05400004042b00140556009e04730087055d00a40464008804d5004e03ab
-003204a900040380000005ef002904490028070900a4052f0088091800a0
-06f6008806060066042b005005c700660400005004e3003003aa00260767
-00310587002605550057042b004506e4000a0554000a06e4000a0554000a
-023900bf07630007055afffb055700a1046800860540001204ab001805c7
-00a4046b008805c700a4046b008805550057042b004506aa00980580008c
-02aa002e0556fffd0473004a0556fffd0473004a08000001071d00440556
-00a20473004b060500630473005507630007055afffb04d5004e03ab0032
-04d5004e045c004c05c000a10478008705c000a104780087063900630473
-0044063900600473004405c0004a0415002b0515000a040000210515000a
-040000210515000a0400002105550057042b0045071500a805c0008b0540
-004a0473004607bf004a0703004607a6006606860053054d006604130053
-07c3001207470018084600a4070700880639006d0478005005f900300553
-00260000ff430000fec90000ff770000ffb00000ff470000ff560000ff74
-0000fed70000feac000000000000ff520000ff56000000000000feac0000
-fd9a000000000000ff6a0000ff7c0000ff690000ff560000feac0000ff7f
-0000ff560000fdef0000ff430000ff690000ff7c000000000000fdae0000
-ff8c000001020000fefe0000fefe0000fedf0000fedf0000ff580000ff20
-0000fefe0556fffd0473004a055600960473008605560096047300860556
-00960473008605c700660400005005c7009e0473004605c7009e04730046
-05c7009e0473004605c7009e0473004605c7009e04730046055600a20473
-004b055600a20473004b055600a20473004b055600a20473004b055600a2
-0473004b04e300a8023900130639006d0473004205c700a40473008705c7
-00a40473008705c700a40473008705c700930473006805c700a404730087
-0239ffdf01c7ff9202390020023900060556009604000088055600960400
-008805560096040000880473009601c7007e0473009601c7ffb904730096
-01c7ffa50473009601c7ffa306aa009806aa008706aa009806aa008706aa
-009806aa008705c7009c0473008705c7009c0473008705c7009c04730087
-05c7009c0473008706390063047300440639006304730044063900630473
-004406390063047300440556009e047300870556009e0473008705c700a1
-02aa008505c700a102aa008505c700a102aa005e05c700a102aa00260556
-005c0400003f0556005c0400003f0556005c0400003f0556005c0400003f
-0556005c0400003f04e300300239002404e300300239002404e300300239
-ffff04e300300239000e05c700a10473008305c700a10473008305c700a1
-0473008305c700a10473008305c700a104730083055600090400001a0556
-00090400001a078d001905c70006078d001905c70006055600090400000f
-055600090400000f055600060400002104e300290400002804e300290400
-002804e3002904000028047300870239000305c70006040000210473004a
-01c7008904a0004804a0004804a0004804a0004804a0004804a0004804a0
-004804a000480556fffd0556fffd06820013068200130682001306820013
-068200560682005603910062039100620391006203910062039100620391
-0062061e0000061e0000076c0000076c0000076c0000076c00000473008b
-0473008b0473008b0473008b0473008b0473008b0473008b0473008b068f
-0000068f0000081f0000081f0000081f0000081f0000081ffff3081ffff3
-01c7008101c7008101c7ff9b01c7ff9b01c7ffeb01c7ffeb01c7ffa201c7
-ffa20301000003010000049100000491000004910000049100000491fff3
-0491fff3047300440473004404730044047300440473004404730044069d
-0000069d0000082d0000082d000007c9000007c900000460008804600088
-0460008804600088046000880460008804600088046000880682000007ae
-00000812000007ae0006063f0057063f0057063f0057063f0057063f0057
-063f0057063f0057063f0057065f0000065f000007ef000007ef0000078b
-0000078b0000078bffff078bffff04a0004804a000480391006203910062
-0473008b0473008b01c7ffe601c700680473004404730044046000880460
-0088063f0057063f005704a0004804a0004804a0004804a0004804a00048
-04a0004804a0004804a000480556fffd0556fffd06820013068200130682
-00130682001306820056068200560473008b0473008b0473008b0473008b
-0473008b0473008b0473008b0473008b068f0000068f0000081f0000081f
-0000081f0000081f0000081ffff3081ffff3063f0057063f0057063f0057
-063f0057063f0057063f0057063f0057063f0057065f0000065f000007ef
-000007ef0000078b0000078b0000078bffff078bffff04a0004804a00048
-04a0004804a0004804a0004804a0004804a000480556fffd0556fffd0556
-fffd0556fffd0556fffd02aa00e502aa00fd02aa00e502aa000602aa0006
-0473008b0473008b0473008b0473008b0473008b068200000682000006f3
-000006f3000005c700a402aa001302aa001302aa000601c7ffbb01c7ffab
-01c7ffca01c7ffca01c7ff9301c7ff930239001a0239fff5036500000365
-000002aa001302aa001302aa000604600088046000880460008804600088
-048d0083048d00830460008804600088055600060556000606e600000718
-0000061e000002aaffea02aaffea02aa0059063f0057063f0057063f0057
-063f0057063f005707650000069d000007270000065f000005fb006102aa
-00de02aa00e50473000d05c7006605c7006606aa008705c70024095000a1
-078d00190556001f04e30030080000290400003004c100660000ff530000
-ff530000ff530000ff5301c7001901c7ffa2042b00050556001105740046
-02cbffa3057a008702f0ffc8057f000a057f000a02aa008402aa008402aa
-00c902aa00c902aa00a002aa005902aaffaf02aa003a02aa0006023900b9
-02aa00a902aa00a902aa00a902aa00a9032e001e032e001e02aa003a0000
-ff730000ffa50000fed80000ff230000ff720000ff720000fee70000ffa5
-0000ff530000ff530000ff530556009e0473008703f8001905fb0019071d
-00440440001904000050046900870469001903eb008703ab003201c70088
-0361004104000088033600100580008c04780087047300440400001304de
-004404de004404de000d078d005003a800440473004404730044042b0084
-0455001f0455001f03aa00260460008804c6004405de004404c600440400
-001a05c700060400002803ab0032036b003f04db001f02eb00880400001a
-04550088042b008405b4007a04ab001803a00000054f0000035100320351
-ffd103980032034800320348003203f80032036e0032015600690284002d
-0366003202d000320415003203710032036f003204180032030f00320359
-0032039c003203760031036f003204fb000002fa003202fa003203040032
-04cc0032030500640305003202f9003202f90032028c0032028c00320304
-00320142006402b6006404950064030f00640305003202d5003203050032
-030500320306006401c20032030f00640342003204950064029200000320
-00000315006402920000030600320385003202bf00000142006401eb0064
-030f0064029200000315006402920000030900320385003202bf000005ed
-00460a660046061300460689ffba0541ffba01e9003c045a00110000ff0d
-0000ff350000fece0000feb70000fec90000ffcf0000ff4f0000ff9e0000
-feca02b3005f02b3005f03e9004a03e9004a039affba0327ffba039affba
-0327ffba05ad0069053d002d05fd009604dc005004e0003c05f6009b053f
-00280650002804ac00720000fe3b0000fe660000fe660473fffc02aa0053
-02d5ffce01a8ffba01a8ffba01a8ffba01a8ffba0658001509c500470400
-000008000000040000000800000002ab0000020000000155000004730000
-02390000019a000000ab00000000000005e5000305c7006606aa00980580
-008c0744008307180046071800480556fffd05c70066040000140473000a
-04e300300400004f0400002804a5001d000001020000ff420000febf0000
-ff3a0000ff53048d000a05c7005105c7006605c70051045500a102eb0088
-0000ff430000ff040000ffac02d200960000ff37021affba0250001e0000
-ff3a0000ff5b0000ff5f0000ff7e0000ff940000ff4a0000fe9c05b5003a
-05b5003a01f4ff9601f4ff9605b5003a05b5003a01f4ffba01f4ffba05b5
-003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba
-05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba0481003604350036043dffba
-043dffba0481003604350036043dffba043dffba02b3003202b3003202b3
-005f02b3005f03e9004a03e9004a0692003e0692003e043fffba043fffba
-045a002a039a00360435ffba0327ffba045a002a039a00360435ffba0327
-ffba045a002a039a00360435ffba0327ffba064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba067f0014077600140327
-ffba041effba067f0014077600140327ffba041effba067f001407760014
-0327ffba041effba02b4002302b400230327ffba0327ffba02b4002302b4
-00230327ffba0327ffba043500450435004501f4ffba01f4ffba04350045
-0435004501f4ffba01f4ffba043500450435004501f4ffba01f4ffba040d
-0047040d004701a8ffba01a8ffba03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0473ff93047300460239ffbf06aa
-ffd50473ffb70473ff9102aaffa402aaffa40400ffff0239ffb904000028
-04730089030b0064047400480649002401c7001901c700190473001e0460
-001e048c000a04730086047300460239001305b400420400008801c7fffc
-06aa00870473008b0473008702aafffb0400003f0318ffa20400001a0400
-000f040000280473004a04730048047300460473004b03ab004903ab0032
-0534005501c700880400001301c7ffa204730083045c004c0304006402d5
-003202c9003302fc0032028c003201d5003201d500000304003203110064
-01420019014200640142006401420019022a000001420064014200090233
-00640493006404930064030fffc9030f0064030e00640305003203000032
-02b800320142ffca01c20032030f001d031a00320306006402d400640292
-000002de003202de003202de003202f4003202ea00320000febc0000febc
-0000ff730000fea9023900b902fa003202f900320305003202a0000002f9
-00320639006d0556fffd0473000f05c7006602aa004104a0004804a00048
-04a0004804a0004804a0004804a0004804a0004804a0004801c7ff9b01c7
-ffab01c7ff9b01c7ffab01c7ff9b01c7ffbb01c7ff9b01c7ffbb04600088
-0460008804600088046000880460008804600088046000880460008801c7
-ffab01c7ffab01c7ffbb01c7ffbb04600088046000880460008804600088
-045a005304ce004a03a000130556001105c700290558000b055600a20473
-004b0400003301c7ffa205e600630473004805c7000002aa000f05560006
-0400002104000013040000500400001301c700830455fffd02eb00010556
-00090400000f055600090400000f04d5005303ab00490540001204ab0018
-0000fec60000fed40000fec60000fed40000fe5f0000fe5f0000ff720000
-ff730000fee7078b000a03eb004c040000130473000a01c700150473fff4
-0556001105c700a1047300190239ff8b05c700a404730087055600960400
-008804e30029040000280400003b049e00a403670088053000480000ff53
-0000ffbc0000fefe0000fefe0000fea40000fea401c70088000000000000
-002a0000002a0000002a0000002a000000d60000017e00000320000005a6
-0000074e000009380000097e000009fe00000aa400000b8400000bec0000
-0c6400000caa00000ce600000d5600000f1200000fee00001218000013f2
-000015520000170c000018e20000198e00001c2200001e5600001eb20000
-1f7000001ff200002062000020e8000021da000023da000025840000271c
-000028560000299e00002a6200002b1800002ca800002dae00002e920000
-2f7a000031b00000323a000035640000370e000038420000394800003b3c
-00003da800004052000041000000422400004398000045d6000048e20000
-4a8800004bc800004c3200004c9c00004d0000004d8800004dbc00004e38
-0000510a000052e80000549c000056500000580e0000596200005b520000
-5cf600005dea00005f020000619a00006296000064c60000668c0000684e
-00006a1200006ba800006cae000070560000717a00007318000075360000
-79a000007bc400007e1c00008004000081020000814e00008250000082f0
-0000833c00008370000083ac000083ee000084540000849a000084ce0000
-85040000853a0000858a000085cc0000861e00008656000086a8000086de
-0000871e000087600000879e000087e800008828000088560000888e0000
-88de00008914000089540000898e000089d200008a1c00008a5800008a88
-00008acc00008b0400008b9400008c1a00008e2800008fbc0000916c0000
-91b80000924c00009470000096c4000098b4000099a000009a2200009a8c
-00009baa00009d0600009f4e0000a0b00000a13e0000a1e80000a2ac0000
-a3f40000a59e0000a68c0000a7520000a7b60000a8240000a94e0000aa72
-0000ab020000ace40000af3e0000b2900000b3860000b42c0000b47c0000
-b5320000b6520000b7f00000b88a0000b94e0000ba0e0000ba760000bab2
-0000bb0a0000bb580000bd700000bfb60000bfee0000c0200000c14a0000
-c2760000c3240000c3c80000c46a0000c53c0000c5900000c5c60000c61e
-0000c7700000c7e20000c83c0000c9b40000cb200000cc000000cc320000
-ccce0000cdf20000d0680000d0a20000d0e60000d1220000d1840000d1c6
-0000d20c0000d2580000d28a0000d2de0000d31c0000d34c0000d38a0000
-d3d00000d4120000d4500000d4d20000d5400000d6260000d6620000d6e2
-0000d7160000d7b80000d8400000d8ac0000d90e0000d97a0000da660000
-db580000db8c0000dbc00000dbf00000dc340000dcac0000de260000e040
-0000e0720000e0ac0000e1a60000e3340000e36a0000e4ce0000e54a0000
-e62a0000e7200000e8b00000ea1a0000ec080000ed040000ed4a0000ed7e
-0000edc00000edfa0000ee4e0000ee960000eee00000ef100000ef400000
-f1280000f1660000f18e0000f1be0000f1f20000f2180000f23e0000f286
-0000f43c0000f5b60000f5dc0000f6020000f6460000f6760000f6a60000
-f6fc0000f7da0000f8ec0000f9300000f9660000f9c00000f9fe0000fa32
-0000fa620000fa9e0000fade0000fb1c0000fb580000fb9a0000fbd00000
-fc0c0000fc4c0000fc720000fc960000fce60000fe420000fe980000fecc
-0000ff1a0000ff660000ffa80000ffe0000100160001005e000101000001
-029c00010464000105e6000107d80001092a00010aae00010b9000010d2a
-00010d9400010dbc00010e5a000110dc0001111c0001115c0001119c0001
-11da000112380001129600011304000113240001140e000114ae000114e4
-000115320001157c000115c6000115e2000115fe0001161e0001163e0001
-165e0001167e000116a4000116ca000116f000011716000117460001176e
-00011796000117c2000117ee000118220001184c00011878000118ae0001
-18d8000119040001193a000119640001198e000119c2000119f200011a26
-00011a6a00011a9a00011ace00011b1000011b4400011b7600011bb80001
-1bec00011c1c00011c5e00011ca200011ce800011d4400011d6000011d7c
-00011d9800011db400011dd000011f3e000121ea0001245a000124760001
-2490000124ac000124c8000124e4000125000001255c0001259600012600
-000126ca0001276a00012840000128c000012948000129b800012a4e0001
-2aac00012af200012b5000012bb200012c6a00012d2800012d5400012db0
-00012df400012f60000130540001307e0001309a000130c6000130fe0001
-314a0001318a000131be000131ee0001321e0001324e00013292000132c2
-000132f2000133320001336200013392000133c200013402000134320001
-346200013492000134b8000136bc000136ec0001371c0001386c00013a22
-00013a5200013a8000013ab000013ade00013b0e00013b3c00013b600001
-3b8400013bb400013d2400013d5c00013d8c00013f1e00013f4c00013f7a
-00013fa800013fd00001412e000142c6000142fe0001433e0001437a0001
-43aa000143d8000143f4000144240001445400014544000146ac000146dc
-000147160001475600014786000147b6000147f80001481e000148440001
-4884000148c4000148f40001493400014a1e00014a9e00014b8200014bb2
-00014be200014c1200014c4200014c7e00014cb000014ce200014d120001
-4d4200014d8800014dba00014dea00014e2000014e9200014ec600015094
-000151960001532600015556000157a6000159380001599c00015a260001
-5a3600015ac400015cc200015dee00015f5a0001604a000161ce000163e8
-000166140001670600016716000167260001683e0001684e0001685e0001
-686e0001687e0001688e000169ac000169bc000169cc00016a4000016a50
-00016b2000016b3000016c4200016c5200016c6200016c7200016dd00001
-6fae00016ff0000170260001705c0001708c000170bc0001711000017138
-000172c20001740a0001755e000176c60001784a000178ae00017a400001
-7b5c00017b6c00017b7c00017d0200017d1200017e7800017fd200018106
-00018264000183d200018598000185d800018610000186460001866c0001
-869c000186c200018838000188680001899e000189ae000189be00018a00
-00018a1000018ba400018d5000018eda00018f0200018f320001908e0001
-909e000191d6000191e600019280000193e0000193f000019656000197e0
-000199480001997800019aee00019c2000019c3000019c4000019c500001
-9d2a00019d3a00019d4a00019d5a00019e5200019fcc00019fdc0001a104
-0001a2380001a38a0001a51e0001a63c0001a7c80001a8da0001a9100001
-ab460001abe60001abf60001ad8c0001af2e0001afb20001b1340001b144
-0001b3ac0001b52c0001b6ac0001b6dc0001b87c0001ba020001bbc60001
-bcf20001bd020001be320001be420001be520001bf120001bf220001c108
-0001c1180001c24e0001c35c0001c5080001c6be0001c8000001c9700001
-cab80001cb0a0001ccec0001ce680001cea60001d04c0001d0700001d1b0
-0001d1c00001d1d00001d2080001d2180001d3a40001d50c0001d6800001
-d6a40001d6d40001d8420001d8f40001d9b20001d9e00001db960001dc8e
-0001dd1c0001de420001def00001dfc40001e00e0001e0860001e1460001
-e16e0001e1b20001e2080001e2e40001e32e0001e3620001e38a0001e3b2
-0001e3e60001e42a0001e46e0001e4ac0001e5ea0001e6a20001e7c20001
-e8380001e9060001e9580001e9ea0001ea9a0001eb8e0001ebe20001ec78
-0001ed360001ee200001eed20001eff20001f0440001f0ee0001f2240001
-f2fc0001f3e20001f4e80001f5ce0001f6b00001f7a40001f8420001f948
-0001fa420001faba0001fb320001fba80001fbde0001fc3a0001fd020001
-fd8e0001fdc60001fe0c0001fe3c0001fea60001ff660001ff9a0001ffca
-0001fffe0002002e0002005e0002008e0002022e00020266000202a60002
-02de00020316000203b2000204ac000204dc00020580000205ae000205ee
-0002063e0002066e000206ba00020852000209b800020b1800020b5e0002
-0bb200020bea00020d5c00020d9200020e2400020e6200020e9000020ece
-00020ffe0002102600021162000211f20002129c0002131e000213da0002
-14f20002160000021634000216ba0002181600021898000218e2000219ec
-00021a3400021b3800021bb400021c0c00021c9000021d7a00021e900002
-1f8c0002203600022126000221f8000222e2000223ca0002247a000224fc
-0002275a00022784000227ae0002286600022890000229d200022ad80002
-2bc200022bec00022c1600022c4000022c6a00022c9400022e1400022e3e
-00022e6800022e9200022ebc00022ee600022f1000022f3a00022f640002
-2f9800022fc200022fec0002301600023190000231a0000232ba000232ca
-000232f40002331e00023348000233720002351c00023738000238660002
-3876000239f200023a0200023b4800023d1400023e1a00023f9a0002413a
-0002435e000244b80002469a000247de0002490c000249fa00024a240002
-4a4e00024a7800024aa200024acc00024af600024b2000024b4a00024b74
-00024b9e00024bc800024bf200024c1c00024c4600024c7000024eac0002
-50280002516c000253540002549c000254c6000254f00002552000025550
-000255a0000255f000025630000256a2000256f600025754000257aa0002
-57e00002582200025868000258b2000258e20002591a0002594a00025a82
-00025dc800025df200025e1c00025e4600025e7000025e9a00025ec40002
-5eee00025f1800025f4200025f6c00025f9600025fc000025fea00026014
-0002603e0002606800026092000260bc000260e6000261100002613a0002
-61640002618e000261b8000261e20002620c0002623600026260000262fe
-000263140002633e0002661e0002662e000267480002686a000269a80002
-6aea00026c9000026ca000026de200026f3200027122000272f60002740e
-0002741e000274a00002752e0002762e0002763e000276de000276ee0002
-78040002795600027a8600027a9600027b6400027b7400027cea00027cfa
-00027e0e00027e1e00027f52000280e8000281a4000281b4000282b20002
-840c00028498000284a8000285d20002875e0002881a0002882a000288c6
-000288d6000289a4000289b400028a8c00028a9c00028ba400028bb40002
-8d7a00028d8a00028ee200028ef20002915c0002916c0002936600029376
-000294e0000294f0000295e0000295f00002978800029798000298b60002
-98c600029a0600029a1600029a2600029a3600029bae00029bbe00029bce
-00029bde00029d3000029e7e00029f4c0002a0300002a1b00002a3320002
-a4320002a5460002a68a0002a69a0002a7880002a8620002a9fe0002aa0e
-0002ab2c0002ac320002ae300002ae400002ae500002ae600002afaa0002
-afba0002b0720002b0820002b1900002b1a00002b28c0002b29c0002b3ba
-0002b3ca0002b4680002b4780002b4880002b5760002b6ea0002b8160002
-b9100002b9200002b9300002b9400002bade0002bc980002bd660002bd76
-0002bfd60002c21c0002c4a20002c7060002c98a0002cbfc0002cdcc0002
-cf820002cfac0002cfd60002cfe60002cff60002d0200002d04a0002d074
-0002d0840002d0940002d0be0002d0e80002d0f80002d1080002d1320002
-d15c0002d1860002d1960002d1a60002d1b60002d1c60002d1d60002d1e6
-0002d2100002d2200002d2300002d25a0002d2840002d2ae0002d2d80002
-d3020002d32c0002d3560002d3800002d3aa0002d3d40002d3fe0002d428
-0002d4520002d47c0002d4a60002d4d00002d4fa0002d5240002d54e0002
-d5780002d5a20002d5cc0002d5f60002d6200002d64a0002d6740002d69e
-0002d6c80002d6f20002d71c0002d7460002d7700002d79a0002d7c40002
-d7ee0002d8180002d8420002d86c0002d8960002d8c00002d8ea0002d914
-0002d93e0002d9680002d9920002d9bc0002d9e60002da100002da3a0002
-da640002da8e0002dab80002dae20002db0c0002dbac0002dbf00002dc66
-0002dc900002dcba0002dce40002dd0e0002dd380002dd620002dd8c0002
-ddb60002dde00002de0a0002de340002de5e0002de880002deb20002dedc
-0002df060002df300002df5a0002df840002dfae0002dfd80002e0020002
-e02c0002e0560002e08a0002e0be0002e0f20002e2840002e4200002e5bc
-0002e7480002e78e0002e7d40002e8420002e89e0002e8f00002e9600002
-ea380002eb040002ebdc0002eca80002ed480002ee620002ef160002ef98
-0002eff20002f0320002f1500002f29a0002f4320002f48e0002f4ec0002
-f5480002f5a40002f6580002f70e0002f7ba0002f8660002f9120002f9ca
-0002fa820002fb3a0002fb4c0002fb5e0002fb700002fb820002fb940002
-fc020002fc700002fd280002fd3a0002fd4c0002fd5e0002fd6e0002fd80
-0002fd920002fda40002fdb60002fdc80002fdda0002fe880002ff340002
-ffe20003008e00030126000301600003018a000301b4000302080003025a
-000302d6000303200003039c000303f000030474000304c60003053c0003
-0594000305fa00030650000306aa0003072800030774000307d200030836
-00030884000308d20003092a000309720003099c000309ca000309f00003
-0a2400030a5400030a8400030ad600030b4400030b9a00030c0e00030c62
-00030cd600030d1c00030d8400030dca00030e2600030e5600030e900003
-0eb600030ee600030f0c00030f3200030f6400030f9400030fe60003104c
-000310a2000311080003115c000311ca0003120c0003126c000312ae0003
-12fa0003133400031370000313aa000313e60003141a0003144c0003147c
-000314ac000314d6000314fc00031526000315540003157e000315ca0003
-160e0003164400031680000316b4000316e200031720000317500003178a
-000317b4000317e2000318080003182e0003185a000318b6000318e60003
-1916000319460003197e000319b2000319e000031a1000031a4000031a70
-00031aa000031ad400031b2a00031b5e00031bbe00031bf200031c4a0003
-1c7e00031cda00031d7800031e4600031f660003202e000320be00032154
-000323400003253c000326b400032830000329da00032b8c00032c740003
-2daa00032ea200032fb4000330d20003320800033372000334e000033676
-000337f2000339020003391200033a3e00033b7a00033cbc00033e400003
-3f1a00033f9000034046000340ec0003425c000342940003430e000343d0
-0003448a000344f2000345f80003472e000347fa00034958000349d20003
-4a4c00034b1800034bd200034c8600034ce200034d3c00034d8400034df4
-00034e7000034eba00034ef400034f3a00034f7e00034fd0000350220003
-50a40003512600035168000351a8000351de000352140003524200035270
-000352a4000352d80003531a0003535c00035398000353d40003540e0003
-54480003547a000354ac000354de000355100003554a00035584000355c6
-000356080003564a0003568c000356da000357280003576a000357ac0003
-57ec0003582c00035866000358a0000358ec0003593800035976000359b6
-000359fc00035a4200035a7e00035ad400035b1000035b4c00035b8c0003
-5bcc00035c0800035c4400035c8400035cc400035d0800035d4c00035da0
-00035e2e00035e7000035eb200035f1a00035f8200035fb400035fe60003
-601e00036056000360ec00036182000361cc00036216000362520003628e
-000362e40003633a00036384000363ce000364260003647e000364be0003
-64fe000365360003656e000365b800036602000366400003667e000366c0
-0003670200036756000367aa000367f0000368360003687c000368c20003
-69180003696e000369c400036a1a00036a6600036ab200036afe00036b4a
-00036bbe00036c3200036ca600036d1a00036d5800036d9600036dd40003
-6e1200036e5000036e8e00036ed200036f1600036f6200036fae0003700e
-0003705a00037098000370e6000371f60003724600037296000372ce0003
-73060003735c000373b2000374260003748a000374cc0003750e00037564
-000375b2000375fe0003764a0003768a000376ca000377120003775a0003
-77c6000378200003785800037890000378d000037910000379e000037adc
-00037b9c00037c8a00037ce000037d3600037d8800037ddc00037e400003
-7ea400037efa00037f5000037fc60003803c0003807e000380c000038102
-0003814400038186000381c80003821e00038274000382c60003831a0003
-83a200038424000384c400038566000385a4000385e2000386200003865c
-0003869a000386d80003871600038752000388360003892200038a380003
-8b5400038c1e00038ce800038de200038edc00038fda000390d8000391f6
-000393140003943a000395600003966200039764000397f6000398880003
-98c6000399040003995e000399b8000399f000039a2800039b3800039b48
-00039b9000039bd800039c3000039c8800039cba00039cec00039d2e0003
-9d7000039daa00039de400039e2800039e6c00039ee400039f5e00039fee
-0003a0320003a0720003a0f40003a1760003a2ce0003a2de0003a32c0003
-a37a0003a3b60003a3f20003a4380003a47e0003a4cc0003a51a0003a56a
-0003a5ba0003a6160003a6720003a7e80003a9500003a9880003a9c20003
-aa0e0003aa5a0003aaac0003aafe0003ab500003aba60003abe20003ac1e
-0003ac740003acc80003ae000003aea00003aeee0003af2e0003af680003
-b0fe0003b3820003b4460003b5dc0003b73a0003b8080003b9ae0003bc02
-0003be3a0003be800003beb20003bf5c0003c0800003c0a40003c13e0003
-c24a0003c35a0003c46a0003c5780003c6fe0003c7300003c7d20003c7fa
-0003c85c0003c8be0003c9200003c9820003c9c00003c9fe0003ca380003
-ca720003ca9e0003caea0003cb240003cb5e0003ccba0003ce0e0003ce1e
-0003cedc0003d0120003d0700003d1880003d3160003d3bc0003d5020003
-d5400003d57e0003d5bc0003d6100003d6380003d6920003d6f60003d73e
-0003d7a00003d8000003d8720003d8ee0003d96a0003d9ec0003da780003
-db040003db8e0003dc0e0003dc480003dc840003dde80003deb20003dee2
-0003df120003e04a0003e19a0003e1aa0003e2980003e36c0003e4640003
-e55a0003e6dc0003e8360003e8460003e95e0003ea0a0003eb4c0003eca2
-0003ecfe0003ee5c0003eeea0003f0900003f2020003f3160003f34e0003
-f3b20003f5620003f6cc0003f72e0003f8960003f99c0003fa520003fafe
-0003fc260003fd140003fdf40003ff34000400600004017a000402ea0004
-046400040474000405540004064a000406fa000407f6000408a2000409ac
-00040a9800040bc200040ce600040dea00040f1800041056000411c20004
-12f80004148c000416340004172c000418400004197200041a6400041a9c
-00041af200041ba000041bb000041c1200041c6e00041cd400041d200004
-1d6000041d9800041dc400041df200041e2c00041f6200041f960004201a
-000420d00004210000042184000421b4000421ec00042384000425100004
-255a00042594000425ea000426360004265c00042682000426c400042706
-0004274800042778000427b0000427e60004281c0004285e0004288e0004
-28be000429b400042ab800042aec00042b2400042b6a00042b9e00042bce
-00042c0600042c3a00042c6e00042c9e00042cce00042d0400042d3a0004
-2d6a00042d9a00042dce00042e0200042e3200042e6200042e9c00042ed0
-00042f0200042f3400042f6800042f9c00042fcc00042ffc0004302a0004
-305800043166000432d2000434060004353a0004356a000435a40004363e
-000437a800043904000439c800043adc00043b0c00043b4000043c380004
-3de800043e4000043eb800043ff400044032000440a4000440d400044104
-0004413e000441c6000441f600044226000443b6000445000004460c0004
-471a000448460004499c00044af800044c5800044d9200044f0400045064
-000450740004522a00045352000453ec0004557400045584000456800004
-58060004595e00045a1000045ae000045bec00045c9600045cce00045cde
-00045d8e00045e3400045eb000046000000460f4000461ea000462f60004
-63ce000464a80004653c0004664e000467de000468fc000469f200046a9c
-00046b4600046c1000046cb800046d8e00046e0a00046e6600046fc80004
-70fc000472980004735a0004745a00047532000476700004771c000477e6
-000478d6000479fc00047ad800047bde00047d1600047e0600047ea40004
-7f960004810600048250000484bc0004858e000486420004871000048804
-000489420004895200048a8600048b9800048ba800048cb400048de40004
-8e3800048fac000490d4000491e80004939a000495ae00049842000499fc
-00049b2800049d0800049eca0004a05c0004a1280004a2c40004a33a0004
-a3e80004a4c40004a5500004a5f20004a6940004a7780004a8b00004ab0c
-0004ac540004ac640004ac740004acd60004ad340004ad960004ae340004
-aecc0004afd00004b0be0004b0ce0004b0de0004b1780004b2120004b24e
-0004b2ca0004b33e0004b3940004b3c80004b44e0004b4da0004b5520004
-b5b00004b64a0004b6dc0004b75c0004b7de0004b8720004b8a60004b908
-0004b9ba0004bb800004bbb80004bd940004bea80004beb80004beee0004
-bf320004bf760004bfba0004bff00004c0220004c0640004c1000004c156
-0004c1fc0004c2740004c2fa0004c36a0004c3cc0004c4520004c4b20004
-c51c0004c5900004c6000004c65e0004c7040004c79c0004c8080004c898
-0004c8f60004c9640004ca0c0004cab80004cb4e0004cbb80004cc3a0004
-cc9e0004cd4a0004ce020004ceae0004cf3c0004cf980004d0040004d05a
-0004d0dc0004d15a0004d1e00004d26c0004d2c60004d3320004d3a20004
-d4120004d4820004d5060004d5960004d5fc0004d6760004d6f20004d76a
-0004d8100004d8ac0004d93c0004d99a0004da380004dab40004db460004
-dbe80004dc920004dd2a0004dd860004dddc0004de440004deea0004df92
-0004e05c0004e1020004e1640004e1bc0004e21c0004e2aa0004e3300004
-e3be0004e41e0004e4820004e4ec0004e5540004e5bc0004e63a0004e6c2
-0004e7560004e7c20004e82a0004e88e0004e9360004e9f00004ea9e0004
-eb2c0004eb8a0004ebf60004ec660004ed0c0004edb60004ee780004ef1a
-0004ef7e0004f00e0004f0800004f1100004f18e0004f20a0004f2760004
-f3040004f3600004f3be0004f4440004f4c00004f5280004f58c0004f5e0
-0004f64e0004f6b60004f7340004f7aa0004f8240004f8a40004f9000004
-f9660004f9ca0004fa6a0004fb0c0004fbc20004fc720004fcce0004fd46
-0004fda40004fe2e0004fec60004ff560004ffbc0005001a000500a80005
-011a000501ae00050246000502b6000503260005039e000503fc0005045c
-000504d60005053000050590000505ea00050646000506ae0005073c0005
-0772000507aa0005083600050860000508a20005093600050a2400050ab4
-00050aea00050b3a00050bac00050c5800050cea00050d4200050d9c0005
-0df400050e4e00050ed200050f5800050ffc000510a4000510e200051152
-000511e60005127e00051314000513be000513f000051440000514940005
-14da0005157e000516080005168e000516ee000517320005178000051820
-000518b000051950000519f600051a9c00051b6000051b9200051bbc0005
-1c4200051cf200051d2400051d4c00051e1a00051e7800051f1200051f60
-00051fc60005206e000520dc00052142000521ce00052240000522b60005
-236a000523c40005243400052470000524c200052548000525a80005264c
-0005272c00052854000529e400052a4000052a9600052dbc00052e560005
-2eb200052efa00053068000531ba000532000005330e000533a6000534b4
-000535be0005366000053748000537da000538760005396800053a680005
-3ae400053b6a00053bb200053d2400053e8000053f6400053fb400053fe8
-000540d6000541fe00054398000544c8000545de000547120005482e0005
-489c0005493000054a7000054b2600054c9000054dc000054ef20005501e
-000550ca0005519000055262000553bc0005553c0005566c000557880005
-594200055a9400055b8000055c5c00055d1e00055e8800055fd800055fe8
-00055ff800056008000560c000056176000561b2000561e8000562200005
-6256000563e2000565f6000566e0000567f80005697000056ade00056bc8
-00056cfa00056e4200056fc800057166000572ba000574a80005766e0005
-78a400057af200057bda00057cb600057dfe00057f800005806800058182
-000581c40005820e0005842a000586420005878e0005890400058b620005
-8d6400058de800058e1800058e6400058f2c00058ffc0005919000059218
-00059280000592c0000592fe000594b0000596e000059816000599f80005
-9ad400059bee00059d9a00059fa60005a0a80005a1940005a3860005a58e
-0005a6fa0005a87e0005a9de0005ab4c0005abda0005ac6a0005ad840005
-ae900005b0520005b1be0005b3ae0005b5780005b60c0005b6a80005b73e
-0005b7c60005b8ac0005b9840005bb1e0005bcb00005bcd60005bcfc0005
-bd0c0005bd3c0005bd6c0005bee60005c0880005c1320005c2140005c2d4
-0005c37e0005c4180005c4fa0005c5b80005c6940005c84a0005c9840005
-ca100005ca400005ca700005caa40005cad80005cae80005caf80005cb28
-0005cb580005cb8c0005cbc00005cbf40005cc280005cc5c0005cc900005
-ce0a0005ce1a0005ce4a0005ce7a0005ceb20005cee60005cf1a0005cf4e
-0005cf820005cfb60005cfea0005d0220005d0580005d0880005d0c80005
-d1000005d1480005d18e0005d1c20005d1f60005d2300005d2680005d308
-0005d3180005d46a0005d6320005d7d80005d9820005dace0005dbe40005
-dcf20005de080005df020005dfea0005e10c0005e2080005e2e00005e3d0
-0005e48c0005e53e0005e6080005e67a0005e7200005e7b00005e8140005
-e9220005e9880005ea360005eb2c0005eb940005ebfc0005ecac0005ee86
-0005ef8a0005f00a0005f0480005f0f40005f1820005f26a0005f3020005
-f3680005f4660005f5280005f5e20005f6200005f6b00005f7b20005f846
-0005f88a0005f9a80005fad20005fcb40005fe760005ffac000600da0006
-01da000602020006022a0006026000060292000602be000602e60006030e
-0006033c0006039a000604080006044000060478000604a8000604ce0006
-0502000605380006055e00060584000605b2000605e00006060c00060682
-000606aa0006070c00060732000607580006077e000607a4000607d40006
-0804000608340006086e0006089e000608d400060904000609360006095c
-00060982000609b6000609ec00060a1c00060a4c00060a7200060a980006
-0abe00060aec00060b2000060ba600060bea00060c2400060c5800060c9c
-00060cd600060d1000060d3600060d6000060dac00060dee00060e140006
-0e4200060e6800060e8e00060ece00060f0000060f3000060f6000060f86
-00060fac00060fdc0006100c00061032000610580006107e000610a40006
-10ca000610f000061118000611a0000611ca0006123e00061266000612dc
-000613040006136600061398000613ca000613fa00061432000614640006
-1492000614cc000614f40006155400061596000615c6000615f200061622
-000616520006167a000616a2000616ca0006172c00061754000617b20006
-17f60006183a0006186a000618a0000618c6000618ee000619140006193c
-000619620006198a000619b2000619dc00061a0200061a2800061a4e0006
-1a8000061aa800061b2e00061b5800061bc200061bf200061c2200061c48
-00061c6e00061cc600061cf600061d3200061d5c00061d8c00061dbc0006
-1df000061e2400061e5400061e9400061ece00061f1600061f3c00061f62
-00061f8800061fae00061fd4000620140006205400062090000620c00006
-20f0000621200006215000062188000621c000062200000622400006227a
-000622b4000622f00006232e00062378000623c2000624080006244e0006
-2490000624d20006250200062532000625660006259a000625d40006260e
-0006265a000626a6000626fe00062756000627ae0006280c0006283c0006
-286c000628a2000628d80006290e0006294a0006297e000629b200062a06
-00062a5a00062aae00062b0200062b5600062baa00062c0200062c5a0006
-2c8800062cb600062ce800062d1a00062d6000062da600062dd800062e0a
-00062e5c00062eb400062ef800062f3c00062f8000062fc4000630180006
-306c0006309c000630cc000631020006313800063176000631bc00063210
-0006325a000632ac000632fe0006335e000633be000633ee000634200006
-345a00063494000634e60006353a00063584000635cc0006360e00063678
-000636c6000637120006374400063776000637aa000637de000638140006
-384a00063888000638be000638f00006392c00063982000639d800063a36
-00063a9400063aea00063b4000063b7400063ba400063be800063c1e0006
-3c4e00063c9200063cd000063d0800063d4000063d7600063db200063de2
-00063e1e00063e5e00063ea400063eee00063f3a00063f8600063fdc0006
-403200064080000640ce0006411c0006416c000641c8000642240006427c
-000642d4000643280006437c000643be0006440000064448000644900006
-44d8000645260006456a000645ae000646140006467a000646e000064746
-000647ac000648120006487c000648e60006492e00064976000649be0006
-4a0600064a5200064a9e00064af200064b3e00064b8200064bd000064c38
-00064ca000064d1000064d8000064de800064e5000064e9000064ece0006
-4f1800064f4200064f8800064fc00006500e0006503e0006506e000650aa
-000650de000651040006515800065196000651ea000652d0000653f80006
-543a00065460000654b6000654e60006552800065570000655be00065608
-000656580006567e000657660006584a0006599c000659ca000659f80006
-5a8c00065b1200065b4000065bca00065bfa00065c2a00065c7800065cc6
-00065daa00065e8600065fca00065ffa0006602a000660c0000661480006
-6178000661a8000661d80006626800066298000662c80006631a00066362
-000663b80006644e000664e60006655a000665ac000665d60006662c0006
-6660000666aa000666e20006673200066770000667bc000667e20006685e
-000668b0000669c200066bcc00066d8000066f0200067074000673160006
-75e6000677a6000678ec00067b4600067c8800067e9e00067ef000067f40
-00067f9600067fec0006804e000680d600068324000684b6000686c20006
-87de0006899200068b1400068bd400068cb600068d1e00068d8000068df6
-00068e5e00068f0a00068f7a0006900a0006911e000691e20006922e0006
-92c40006937000069414000694be000695080006954a000695c000069628
-000696b800069766000697d0000698340006989a00069954000699ea0006
-9a4800069a7200069a9c00069aac00069abc00069b7e00069c8200069e8c
-00069fe200069ff20006a0a20006a1860006a1e60006a1f60006a2520006
-a2b00006a3d00006a4be0006a4ce0006a4de0006a4ee0006a4fe0006a5e4
-0006a6e40006a8bc0006aa780006ab7e0006abf80006ac720006ad240006
-ad340006ae420006ae520006ae620006af240006b0580006b1440006b154
-0006b1640006b1740006b2da0006b4460006b5720006b5820006b5920006
-b5a20006b5b20006b6940006b6a40006b8060006b9100006ba0e0006bb46
-0006bc180006bc960006bd140006be340006beb00006befc0006bf880006
-c09c0006c0f00006c2320006c2f20006c3be0006c4b40006c5be0006c670
-0006c7d60006c83c0006c9000006cb020006cc900006ce0e0006cf3e0006
-d1f00006d3320006d4600006d5d80006d7500006d8d00006da5e0006dc10
-0006dc7e0006dde20006df1a0006e01e0006e1540006e2860006e3560006
-e4260006e5820006e65c0006e6fc0006e8000006e92a0006ea280006eba8
-0006ed120006ee500006efc80006f1140006f1f60006f25e0006f3000006
-f3a00006f49e0006f6060006f7400006f8d40006fa1e0006fb020006fb60
-0006fc660006fcfc0006fdbe0006fe640006fea400070050000701220007
-01e800070310000704b0000705bc00070614000707ac0007083a0007084c
-0007087c000708ac000708e40007091c000709520007098e000709c40007
-0a0000070b6e00070bb800070c5200070cea00070d6400070de800070e4e
-00070efa00070f46000710660007111c000711f20007122a000712680007
-12dc000713d6000714f4000715f6000716380007167a000716e8000716f8
-000717080007171800071728000717380007174800071758000717680007
-17780007178800071798000717980007191c0007192c000719ec00071ab2
-00071be800071dde00071fe0000721dc00072412000726120007267e0007
-27900007292200072a7a00072b2c00072b7000072c0e00072d3e00072d8e
-00072e2400072f6000072f70000731260007325a000732aa000733000007
-33c20007340600073448000734ce0007352c0007361e000736ac000736e2
-0007375c000737d4000738240007393000073a2600073ad000073afa0007
-3b2400073b4e00073b7800073bb800073bf800073c3000073c6800073cb2
-00073cfc00073d3c00073d7c00073dc600073e1000073e5000073e900007
-3eea00073f4400073f7e00073fb800073ffc0007404000074084000740c8
-0007411c00074170000741bc00074208000742460007428a000742da0007
-432a00074384000743e20007440c00074436000744d00007456a000745ae
-000745f2000747080007471800074760000747a8000747fa0007484c0007
-48b60007490a00074956000749b400074a3e00074aa200074ae600074b30
-00074b9800074be200074c2200074c6a00074ca600074ce200074d1e0007
-4d5800074d9a00074ddc00074e1c00074e5c00074ea600074ef000074f46
-00074f9e00074fec0007503a0007507c000750ca0007510c000751560007
-5198000751dc0007523800075294000752e00007532c00075376000753c0
-000753fe0007543c000754ba0007553800075572000755ac000756460007
-56e0000757b400075888000758e400075940000759b400075a2800075b86
-00075b9600075c8000075c9000075cc600075cfc00075d3600075d700007
-5dac00075de800075e2e00075e7400075fda00076190000762dc0007649a
-00076610000767b8000768e8000769ee00076c0c00076d5000076ee60007
-706e000770ec0007723000077438000774cc00077560000776b4000777de
-0007795800077a9800077c0400077cf200077ebc00078050000780d20007
-8204000782ee0007845600078538000786ee000787e00007894200078a7e
-00078b7200078d3600078ebe00079062000791c600079362000795200007
-96a600079742000798b6000799a800079a9000079c1000079d6200079e82
-0007a01a0007a1f00007a37e0007a4280007a4de0007a6900007a7340007
-a7c20007a80e0007a85a0007a8d20007a9b00007aa2a0007aacc0007ab20
-0007ac840007adb00007aec20007afc40007b08c0007b2000007b3400007
-b5660007b6100007b73a0007b83e0007b9de0007baca0007bbc40007bcc2
-0007bda80007bec20007c07c0007c22a0007c3980007c4100007c4840007
-c5a20007c6260007c7280007c8b40007ca2c0007cb620007cc6c0007cde2
-0007cf5a0007d14c0007d33a0007d5000007d5740007d6240007d6da0007
-d78a0007d8480007d9420007da460007db400007dc4c0007dcd40007dd62
-0007ddea0007de7e0007df5a0007e0500007e1340007e22a0007e2be0007
-e37a0007e40e0007e4cc0007e5bc0007e6c40007e7c20007e8d60007e9f8
-0007eb0c0007ec4c0007ed860007eea80007efbc0007f1000007f2540007
-f4680007f61a0007f6ce0007f7ea0007f8c00007f9de0007fabc0007fc50
-0007fd0a0007fda60007fe980007ff800008006c000800ea000801e40008
-03220008044e00080482000804c6000804d600080576000806180008070e
-000807fa000808d4000809ac00080b0a00080c6a00080d0800080d9e0008
-0ddc00080e1c00080e5a00080e9a00080ef400080f4c00080fa60008100a
-0008109600081292000812e20008140e0008149400081514000815ee0008
-16c2000817c6000819b200081aca00081b3a00081bca00081c8c00081d5e
-00081dca00081e4800081f9c00081fe2000820280008210c000821480008
-21a6000821e4000822160008225a0008229c000822cc000100000d3500f2
-003c009d000700020010002f005600000468041d0005000200>
-<0000003a02be0000000300000000006a00000000000300000001000a006a
-0000000300000002000e00740000000300000003005e0082000000030000
-0004000a00e00000000300000005001800ea0000000300000006000e0102
-000000030000000700ba01100000000300000008003001ca000000030000
-0009008a01fa000000030000000d02aa028400010000000000000035052e
-000100000000000100050563000100000000000200070568000100000000
-0003002f056f00010000000000040005059e0001000000000005000c05a3
-0001000000000006000705af0001000000000007005d05b6000100000000
-00080018061300010000000000090045062b000100000000000d01550670
-0003000104030002000c07c50003000104050002001007d1000300010406
-0002000c07e10003000104070002001007ed0003000104080002001007fd
-0003000104090000006a080d0003000104090001000a0877000300010409
-0002000e08810003000104090003005e088f0003000104090004000a08ed
-0003000104090005001808f70003000104090006000e090f000300010409
-000700ba091d0003000104090008003009d70003000104090009008a0a07
-000300010409000d02aa0a9100030001040a0002000c0d3b00030001040b
-000200100d4700030001040c0002000c0d5700030001040e0002000c0d63
-0003000104100002000e0d6f000300010413000200120d7d000300010414
-0002000c0d8f000300010415000200100d9b0003000104160002000c0dab
-0003000104190002000e0db700030001041b000200100dc500030001041d
-0002000c0dd500030001041f0002000c0de10003000104240002000e0ded
-00030001042a0002000e0dfb00030001042d0002000e0e0900030001080a
-0002000c0e170003000108160002000c0e23000300010c0a0002000c0e2f
-000300010c0c0002000c0e3b00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0052006500670075006c00610072004d006f006e006f
-0074007900700065003a0041007200690061006c00200052006500670075
-006c00610072003a00560065007200730069006f006e00200035002e0030
-003100200028004d006900630072006f0073006f00660074002900410072
-00690061006c00560065007200730069006f006e00200035002e00300031
-0041007200690061006c004d00540041007200690061006c002000690073
-00200061002000740072006100640065006d00610072006b0020006f0066
-00200054006800650020004d006f006e006f007400790070006500200043
-006f00720070006f0072006100740069006f006e00200069006e00200074
-0068006500200055006e0069007400650064002000530074006100740065
-007300200061006e0064002f006f00720020006f00740068006500720020
-0063006f0075006e00740072006900650073002e0054006800650020004d
-006f006e006f007400790070006500200043006f00720070006f00720061
-00740069006f006e004d006f006e006f0074007900700065002000540079
-00700065002000440072006100770069006e00670020004f006600660069
-006300650020002d00200052006f00620069006e0020004e006900630068
-006f006c00610073002c0020005000610074007200690063006900610020
-005300610075006e0064006500720073002000310039003800320059006f
-00750020006d006100790020007500730065002000740068006900730020
-0066006f006e007400200074006f00200064006900730070006c00610079
-00200061006e00640020007000720069006e007400200063006f006e0074
-0065006e00740020006100730020007000650072006d0069007400740065
-006400200062007900200074006800650020006c006900630065006e0073
-00650020007400650072006d007300200066006f00720020007400680065
-002000700072006f006400750063007400200069006e0020007700680069
-006300680020007400680069007300200066006f006e0074002000690073
-00200069006e0063006c0075006400650064002e00200059006f00750020
-006d006100790020006f006e006c0079002000280069002900200065006d
-0062006500640020007400680069007300200066006f006e007400200069
-006e00200063006f006e00740065006e0074002000610073002000700065
-0072006d0069007400740065006400200062007900200074006800650020
-0065006d00620065006400640069006e0067002000720065007300740072
-0069006300740069006f006e007300200069006e0063006c007500640065
-006400200069006e0020007400680069007300200066006f006e0074003b
-00200061006e006400200028006900690029002000740065006d0070006f
-0072006100720069006c007900200064006f0077006e006c006f00610064
-0020007400680069007300200066006f006e007400200074006f00200061
-0020007000720069006e0074006500720020006f00720020006f00740068
-006500720020006f00750074007000750074002000640065007600690063
-006500200074006f002000680065006c00700020007000720069006e0074
-00200063006f006e00740065006e0074002ea9203230303620546865204d
-6f6e6f7479706520436f72706f726174696f6e2e20416c6c205269676874
-732052657365727665642e417269616c526567756c61724d6f6e6f747970
-653a417269616c20526567756c61723a56657273696f6e20352e30312028
-4d6963726f736f667429417269616c56657273696f6e20352e3031417269
-616c4d54417269616c20697320612074726164656d61726b206f66205468
-65204d6f6e6f7479706520436f72706f726174696f6e20696e2074686520
-556e697465642053746174657320616e642f6f72206f7468657220636f75
-6e74726965732e546865204d6f6e6f7479706520436f72706f726174696f
-6e4d6f6e6f7479706520547970652044726177696e67204f666669636520
-2d20526f62696e204e6963686f6c61732c20506174726963696120536175
-6e646572732031393832596f75206d617920757365207468697320666f6e
-7420746f20646973706c617920616e64207072696e7420636f6e74656e74
-206173207065726d697474656420627920746865206c6963656e73652074
-65726d7320666f72207468652070726f6475637420696e20776869636820
-7468697320666f6e7420697320696e636c756465642e20596f75206d6179
-206f6e6c792028692920656d626564207468697320666f6e7420696e2063
-6f6e74656e74206173207065726d69747465642062792074686520656d62
-656464696e67207265737472696374696f6e7320696e636c756465642069
-6e207468697320666f6e743b20616e6420286969292074656d706f726172
-696c7920646f776e6c6f6164207468697320666f6e7420746f2061207072
-696e746572206f72206f74686572206f7574707574206465766963652074
-6f2068656c70207072696e7420636f6e74656e742e004e006f0072006d00
-61006c006f00620079010d0065006a006e00e9006e006f0072006d006100
-6c005300740061006e0064006100720064039a03b103bd03bf03bd03b903
-ba03ac00a90020003200300030003600200054006800650020004d006f00
-6e006f007400790070006500200043006f00720070006f00720061007400
-69006f006e002e00200041006c006c002000520069006700680074007300
-2000520065007300650072007600650064002e0041007200690061006c00
-52006500670075006c00610072004d006f006e006f007400790070006500
-3a0041007200690061006c00200052006500670075006c00610072003a00
-560065007200730069006f006e00200035002e0030003100200028004d00
-6900630072006f0073006f0066007400290041007200690061006c005600
-65007200730069006f006e00200035002e00300031004100720069006100
-6c004d00540041007200690061006c002000690073002000610020007400
-72006100640065006d00610072006b0020006f0066002000540068006500
-20004d006f006e006f007400790070006500200043006f00720070006f00
-72006100740069006f006e00200069006e00200074006800650020005500
-6e0069007400650064002000530074006100740065007300200061006e00
-64002f006f00720020006f007400680065007200200063006f0075006e00
-740072006900650073002e0054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-4d006f006e006f0074007900700065002000540079007000650020004400
-72006100770069006e00670020004f006600660069006300650020002d00
-200052006f00620069006e0020004e006900630068006f006c0061007300
-2c0020005000610074007200690063006900610020005300610075006e00
-64006500720073002000310039003800320059006f00750020006d006100
-7900200075007300650020007400680069007300200066006f006e007400
-200074006f00200064006900730070006c0061007900200061006e006400
-20007000720069006e007400200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-200074006800650020006c006900630065006e0073006500200074006500
-72006d007300200066006f00720020007400680065002000700072006f00
-6400750063007400200069006e0020007700680069006300680020007400
-680069007300200066006f006e007400200069007300200069006e006300
-6c0075006400650064002e00200059006f00750020006d00610079002000
-6f006e006c0079002000280069002900200065006d006200650064002000
-7400680069007300200066006f006e007400200069006e00200063006f00
-6e00740065006e00740020006100730020007000650072006d0069007400
-7400650064002000620079002000740068006500200065006d0062006500
-6400640069006e0067002000720065007300740072006900630074006900
-6f006e007300200069006e0063006c007500640065006400200069006e00
-20007400680069007300200066006f006e0074003b00200061006e006400
-200028006900690029002000740065006d0070006f007200610072006900
-6c007900200064006f0077006e006c006f00610064002000740068006900
-7300200066006f006e007400200074006f00200061002000700072006900
-6e0074006500720020006f00720020006f00740068006500720020006f00
-750074007000750074002000640065007600690063006500200074006f00
-2000680065006c00700020007000720069006e007400200063006f006e00
-740065006e0074002e004e006f0072006d0061006c004e006f0072006d00
-610061006c0069004e006f0072006d0061006c004e006f0072006d00e100
-6c004e006f0072006d0061006c0065005300740061006e00640061006100
-720064004e006f0072006d0061006c004e006f0072006d0061006c006e00
-79004e006f0072006d0061006c041e0431044b0447043d044b0439004e00
-6f0072006d00e1006c006e0065004e006f0072006d0061006c004e006f00
-72006d0061006c004e0061007600610064006e006f0074006801b001a103
-00006e00670041007200720075006e00740061004e006f0072006d006100
-6c004e006f0072006d0061006c004e006f0072006d0061006c004e006f00
-72006d0061006c000000b900540328b326181fd0bc032900e00329000203
-29b22b1d1fb90327031db23b1f40b80323b31215320f412d03200001002f
-0320000100200320006f032000af032000bf03200004005f031e00010010
-031e007f031e0080031e00af031e00bf031e00d0031e00060000031e0010
-031e0020031e006f031e009f031e00e0031e0006031d031cb2201f104127
-0319007f03190002000f031700ef031700ff03170003001f0317002f0317
-004f0317005f0317008f0317009f03170006000f0317005f0317006f0317
-007f031700bf031700f00317000600400317b2923340b80317b28b3340b8
-0317b36a6c3240b80317b2613340b80317b35c5d3240b80317b357593240
-b80317b34d513240b80317b344493240b80317b23a3340b80317b3313432
-40b80317b32e423240b80317b3272c3240b80317b312253280b80317b30a
-0d32c04116031600d00316000200700316000102c4000f0101001f00a003
-1500b0031500020306000f0101001f00400312b32426329fbf0304000103
-0203010064001fffc00301b20d1132410a02ff02ef0012001f02ee02ed00
-64001fffc002edb30e11329f414a02e200af02e200bf02e2000302e202e2
-02e102e1007f02e00001001002e0003f02e0009f02e000bf02e000cf02e0
-00ef02e0000602e002e002df02df02de02de000f02dd002f02dd003f02dd
-005f02dd009f02dd00bf02dd00ef02dd000702dd02dd001002dc00010000
-02dc0001001002dc003f02dc000202dc02dc001002db000102db02db000f
-02da000102da02daffc002d3b2373932b9ffc002d3b22b2f32b9ffc002d3
-b21f2532b9ffc002d3b2171b32b9ffc002d3b2121632b802d2b2f9291fb9
-0326031cb23b1f40bb0322003e00330322b225311fb80318b23c691fb802
-e3b3202b1fa0413002d400b002d40002000002d4001002d4002002d40050
-02d4006002d4007002d40006006002d6007002d6008002d6009002d600a0
-02d600b002d60006000002d6001002d6002002ca002002cc002002d60030
-02d6004002d6005002d6000802d0b2202b1fb802cfb226421f411602ce02
-c70017001f02cd02c80017001f02cc02c60017001f02cb02c50017001f02
-c902c5001e001f02ca02c6b21e1f00410b02c6000002c7001002c6001002
-c7002f02c5000502c1b324121fff411102bf0001001f02bf002f02bf003f
-02bf004f02bf005f02bf008f02bf000602bf0222b2641f12410b02bb00ca
-0800001f02b200e90800001f02a600a20800406a1f402643493240204349
-3240263a3d3240203a3d329f209f26024026969932402096993240268e92
-3240208e92324026848c324020848c3240267a813240207a813240266c76
-3240206c76324026646a324020646a3240265a5f3240205a5f3240264f54
-3240204f5432b8029eb724271f374f6b0120410f02770030027700400277
-00500277000402770277027700f90400001f029bb22a2a1fb8029a402b29
-2a1f80ba0180bc0180520180a201806501807e01808101803c01805e0180
-2b01801c01801e0180400180bb0138000100800140b40180400180bb0138
-00010080013940180180ca0180ad01807301802601802501802401802001
-3740b80221b2493340b80221b2453340b80221b341423240b80221b33d3e
-320f410f0221003f0221007f0221000300bf022100cf022100ff02210003
-00400221b320223240b80221b3191e3240b80222b32a3f3240b80221b32e
-3a326f414802c3007f02c3008f02c300df02c30004002f02c3006002c300
-cf02c30003000f02c3003f02c3005f02c300c002c300ef02c300ff02c300
-0600df02220001008f02220001000f0222002f0222003f0222005f022200
-7f022200ef0222000600bf022100ef02210002006f0221007f022100af02
-210003002f0221003f0221004f0221000302c302c3022202220221022140
-1d101c102b1048038f1c010f1e014f1eff1e023700161600000012110811
-b8010db6f70df8f70d00094109028e028f001d001f0290028f001d001f02
-8fb2f91d1fb80198b226bb1f41150197001e0401001f013900260125001f
-013800730401001f0135001c0801001f0134001c02ab001f0132b21c561f
-b8010fb2262c1fba010e001e0401b61ff91ce41fe91cb80201b61fe81cbb
-1fd720b80401b21fd51cb802abb61fd41c891fc92fb80801b21fbc26b801
-01b21fba20b80201b61fb91c381fadcab80401b21f8126b8019ab21f7e26
-b8019ab61f7d1c471f6b1cb80401b21f6526b8019ab21f5e73b80401400f
-1f52265a1f481c891f441c621f4073b80801b61f3f1c5e1f3c26b8019ab2
-1f351cb80401b61f301cbb1f2b1cb80401b61f2a1c561f291cb80101b21f
-231eb80401b21f5537b80168402c07960758074f07360732072c0721071f
-071d071b071408120810080e080c080a080808060804080208000814b8ff
-e0402b000001001406100000010006040000010004100000010010020000
-01000200000001000002010802004a00b013034b024b5342014bb0c06300
-4b6220b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807
-ff52b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ff
-b101018e851bb0124358b900010111858d1bb900010128858d5959001816
-763f183f123e113946443e113946443e113946443e113946443e11394660
-443e11394660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b2b
-182b1db0964b5358b0aa1d59b0324b5358b0ff1d594bb09353205c58b901
-f201f04544b901f101f045445958b9033e01f2455258b901f2033e445959
-4bb8015653205c58b9002001f14544b9002601f145445958b9081e002045
-5258b90020081e4459594bb8019a53205c58b9002501f24544b9002401f2
-45445958b909090025455258b9002509094459594bb8040153205c58b173
-244544b1242445445958b917200073455258b9007317204459594bb80401
-53205c58b1ca254544b1252545445958b9168000ca455258b900ca168044
-59594bb03e53205c58b11c1c4544b11e1c45445958b9011a001c455258b9
-001c011a4459594bb05653205c58b11c1c4544b12f1c45445958b9018900
-1c455258b9001c01894459594bb8030153205c58b11c1c4544b11c1c4544
-5958b90de0001c455258b9001c0de04459592b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65
-422b2b01b33b59635c456523456023456560234560b08b766818b0806220
-20b163594565234520b003266062636820b003266165b059236544b06323
-4420b13b5c4565234520b003266062636820b003266165b05c236544b03b
-2344b1005c455458b15c406544b23b403b4523614459b347503437456523
-456023456560234560b089766818b080622020b134504565234520b00326
-6062636820b003266165b050236544b034234420b147374565234520b003
-266062636820b003266165b037236544b0472344b10037455458b1374065
-44b24740474523614459004b5342014b5058b108004259435c58b1080042
-59b3020b0a124358601b2159421610703eb0124358b93b21187e1bba0400
-01a8000b2b59b00c2342b00d2342b0124358b92d412d411bba0400040000
-0b2b59b00e2342b00f2342b0124358b9187e3b211bba01a80400000b2b59
-b0102342b0112342002b7475737500184569444569444569447373737374
-757374752b2b2b2b74752b2b2b2b2b737373737373737373737373737373
-737373737373737373732b2b2b45b0406144737400004bb02a534bb03f51
-5a58b1070745b040604459004bb03a534bb03f515a58b10b0b45b8ffc060
-4459004bb02e534bb03a515a58b1030345b040604459004bb02e534bb03c
-515a58b1090945b8ffc06044592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b752b2b2b2b2b2b2b435c58b9008002bbb301401e017400735903b01e4b
-5402b0124b545ab012435c5a58ba009f02220001007359002b7473012b01
-732b2b2b2b2b2b2b2b737373732b2b2b2b2b002b2b2b2b2b2b0045694473
-456944734569447374754569447345694445694445694473744569444569
-44732b2b2b2b2b732b002b732b74752b2b2b2b2b2b2b2b2b2b2b2b2b2b73
-7475732b7374757374752b2b2b742b2b000000>
-[15785 15901 16277 16325 16277 16273 15933 16169 16277 15721 16361 15561 15973
-16029 16305 15693 16345 16249 15893 15629 16365 15481 16245 16249 16357 16337
-15821 15749 16345 15937 16257 16033 19077 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-2 3172 16 <0001004101b8026a026d0003002c401970027003024d014d020201230002
-1a05700001001904708d182b4e10e45d10e6002f4ded31300071015d1335
-211541022901b8b5b500>ArialMT AddT42Char 
-2 3242 17 <000100ba0000018700cd000300254018023c000a023c5f006f007f00af00
-04a0000100a004a198182b10f65d5ded003fed313033353315bacdcdcd00
->ArialMT AddT42Char 
-3 4240 68 <0002004affe8041c043e00280037022d402c090d092a190d1a2a290d2a2a
-390d3615371b3a2a492a5d0d5d2a6a0d692a60308a0d86299a169b1aa90d
-1528b8ffe8b40b0b065527b8ffe840190b0b0655a619aa28b619bb28c419
-cf28d215dd28084416011eb8fff440110c0c065512120c0c0655050c0c0c
-065535b8ffe040550c0c06551f171f182b2c2a343904392c4904482c5608
-592b6608692b760c870cc90cf90df92b1137340e0104102f243417322114
-185f296f2902291c2f0e3f0e8f0e9f0eff0e059f0eaf0eef0e030e0c0f0f
-02550eb8ffeab4101002550eb8fff44015101006550e0c0d0d06550e060f
-0f06550e0e1c0317b802aab61895141c1c0700b8fff4401a0c0c06550045
-270a321c030b2961106100060d0d025500252124b8ffecb41010025524b8
-ffec400b0d0d025524040c0c025524b8ffe4b40b0b025524b8fff4b40b0b
-065524b8ffdc400b1010065524060f0f065524b8fffcb40c0c065524b802
-5b400e27400026102620263026af260539b8ffc0b40e0e025526b8ffd6b6
-0e0e0255263139b8ffc0400d1e23343039c03902a039013917b8fff44041
-10100655172518222f24bf06cf06021f063f0602060e0f0f0255060c0d0d
-025506180c0c0255060c0b0b0255060c0b0b0655060e0d0d065506100c0c
-065506313810f62b2b2b2b2b2b2b5d71edf4ed2b105d712bf62b2b5dedf4
-2b2b2b2b2b2b2b2b3cfd2be5e5003fed3fe42b3fedfde41112392f2b2b2b
-2b2b5d71ed711112391112393901111217393130005d2b2b2b2b01715d2b
-2b0071250606232226353436363736373637363534272623220607273e02
-333216161716151514161723260306070e02151416333236373635033c64
-b96aafbc477348356bda67013345887f791db0186ed08988aa5010091722
-bc1c1762c46f5c326d6968a2261d835546ab854e814e140e0d1a24250a6e
-2d3d597118718b4b40614a2e78f0fb853d3801dd281c10284d2f48605b4f
-3d77>ArialMT AddT42Char 
-3 5440 70 <00010050ffe803ed043e001a015ab1020243545840340e7f0f010f0b0140
-0050007000030004121c0b07181c040b010e1507080e0e0255070c0d0d02
-55070c0c0c025507100b0b0255072f2b2b2b2bcdd4c6003fed3fed10c45d
-3210c45d3231301b4047090c011f1c4313431753135317601360179b029b
-039a0da410a41a0c080d190a6a0269036a05750c700d800da60cb509b60a
-b50c0c160c860ce302030e225f0f6f0f7f0f030f01b802aa407930004000
-5000600070009000a000e000f00009000f0f0b000004121c0b07181c040b
-1c0f010f240e080d0d06550e221b000100240b2b1f010100010101400b0b
-065501401010065501480c0c0655011a0d0d065501491c1524cf07011f07
-3f0702070e0b0b0655070a1010065507120c0c065507311b34c4182b10f6
-2b2b2b5d71ed10f62b2b2b2b5d724b53234b515a58b90001ffc03859ed72
-f42bed72003fed3fed12392f11392f105de4105de43130005d71015d7159
-011706062322001134123633321617072626232206151416333236033cb1
-1defaedafef772e989addc1faf197f5a88aaa4846a8e018517b7cf011d01
-0aac010281afa11b6b6cc3d3d6c28200>ArialMT AddT42Char 
-3 7098 74 <00020042fe5103ea043e001e002a016f40600b0b05142c0b25144c0b4514
-06091d191d2c0b26142c23390b36144a0b46145607580b680bfa0af5150e
-2e232c273e233e274c27902ca02c07362136293f2c460b46214529542154
-29690763216329602c802cda27e821ee23ef271117160615b802b1b4281c
-130701b802aa401020003000600070008000c000d0000700b8027d403205
-1c1c0f0a45221c0c0a16153325330a251818d01701101740176017801704
-2c400b0c02552c400d0d025517121010025517b8fff440110f0f02551706
-0e0e025517160d0d025517b8ffea400b0b0b065517121010065517b8ffee
-b40c0c065517b8fffc404a0d0d065517740f012500221f24bf0fcf0fdf0f
-ff0f041f0f3f0f4f0f030f200b0b02550f1a0c0c02550f220d0d02550f1c
-0b0b06550f0c0d0d06550f1a0c0c06550f192b2c74213450182b2b4ef42b
-2b2b2b2b2b5d714dedf4ed10fd2b2b2b2b2b2b2b2b2b2b5d713c10fde4f6
-3c003fede43fedfd5de43fede43f3c3130015d71005d7117171617163332
-363736270623220235341236333217353311140606232226131416333236
-35342623220666af0b3243747d88180e0176b0dbf06ed18dbc7aa665dba0
-beea99a67d7ca8ad7a78a8581a512532645a37b08b013cdd9801018c9880
-fc6af8cf78ab032ad1c0bfccc3c6c300>ArialMT AddT42Char 
-3 8014 76 <000200880000013c05ba0003000700cd405e09360b0b02554f099009a009
-b009c009df09f0090700091f09700980099f09b009c009df09e009ff090a
-1f09010001070402030906037e0100060506040a0607250500049f04a004
-b004c004e00406c004f0040200042004d004e0040404b8fff8b410100255
-04b8fffa40170e0e025504040c0c0255040a0b0b025504140b0b065504b8
-ffeab41010065504b8fffeb40d0d065504b8fffc400a0c0c0655044e0847
-50182b10f62b2b2b2b2b2b2b2b5d71723cfd3c003f3f3c3fed0111123939
-111239393130015d72712b133533150311331188b4b4b404ebcfcffb1504
-26fbda00>ArialMT AddT42Char 
-3 11776 85 <00010085000002c6043e001100c9403b2f13011004012304340443045304
-66047404060911080908090d1311090d000308010b1c06070106000a0928
-900801082220130113022211250100b8ffc04010333634f0000100002000
-d000e0000400b8fff8b41010025500b8fff840110e0e025500040c0c0255
-00060b0b025500b8fffcb41010065500b8fff440160f0f065500060c0c06
-5500080d0d0655004e1247c4182b10f62b2b2b2b2b2b2b2b5d712b3cfde4
-105df472e4003f3f3fed11393911393901111239390010c9870e7dc43130
-005d72015d33113315363633321707262322060706151185a23e693f5b5e
-3e42423b5e141e0426a171483aa727473f6072fdd400>ArialMT AddT42Char 
-3 12038 86 <0001003fffe803b1043e00300317407b042214223a094a09442456226522
-7c098e098424a613ab2cc2030d09171a1817304b2cd617051b0255020210
-32010a185c085c095c0a5c0b5c0c5c0d6a086a096a0a6a0b6a0c6a0db426
-b4270f27262427242936245a0a590b64266428742374248024930a9c0c92
-28972c9530a40aa90ca327a428b326c5261628b8fff4b40d0d065522b8ff
-f4b40d0d065523b8fff4b40d0d065524b8fff4b40d0d065528b8fff4b40c
-0c065522b8fff4b40c0c065523b8fff4b40c0c065524b8fff4b40c0c0655
-1db8ffde40121e395a0827250c0a041a202615040b2e1d1ab802aa402219
-2c0b0b02551f193f194f195f19af19cf19060f191f196f19df19041f198f
-190219bd02550015000002aa0001ffc040140b0b025510014001021001d0
-0102000110010201b8ffc0b314163401b8ffc040100e113401012e5c1d6c
-1d021d1c150704b8fff4b40b0b025504b8ffe6b41010065504b8ffe64013
-0f0f0655041c2e0b1f1a011a24194013183432b8ffc0402f0f0f02551918
-0f0f025519180d0d025519160c0c025519201010065519200f0f06551910
-0c0c065519160d0d065519b8025bb207242ab8ffc0b51c39d02a012ab8ff
-e6b40c0c02552ab8ffe8b40f0f02552ab8ffe8b40c0c06552ab8ffeab60d
-0d06552a1a32b8ffc04021272a346032c032023f32803202321001010124
-00180d0d025500100d0d06550020b8fff4b40d0d025520b8fff4b4101006
-5520b8fff440190f0f065520240f100b0b02550f160c0c02550f200d0d02
-550fb8fffa40200f0f02550f0e0c0c06550f0c0d0d06550f22df00013f00
-4f00020019313437182b4e10f45d714df42b2b2b2b2b2bed2b2b2b102b2b
-ed724e105d712bf62b2b2b2b712b4dedf42b2b2b2b2b2b2b2b2bed72003f
-ed2b2b2b3fed7112392f2b2b5d71722be410fd5d71722be4111239111239
-0111121739313043794040272d1e2305142c261110121013100306220d20
-1b000928071b01052d071b011e14201b00210e231b0022230d0c08290a1b
-012827090a062b041b001f101d1b01002b2b103c103c2b103c103c2b012b
-2b2b2b2a2b818181002b2b2b2b2b2b2b2b2b5d71015d72715d1337161633
-323635342726272e02353436373636333216161707262623220615141716
-1716171e02151406062322263fb20f897b7c78352593c6994f41382a9153
-7dbd5a11b00c73697c6a16162f1b84bf975669c67dcfd9013d1c6b726544
-3d2318253249814e4779281f2b487b6718525c5237231c1d130a2433417c
-5c5a9f57ac00>ArialMT AddT42Char 
-4 0 92 <00010021fe5103ee0426001a01f7b10202435458401d0a140f030b031c19
-0f12060b061340120f200b400c200f180f0f02550f192f2b1add1a18cd1a
-1910dd1a18cd003f3f3fed12173931301bb30f1c010fb8ffde406d1c3928
-14560faf0a03400d400f020f202830341020283034070c0912160d181227
-0b270c270d360c360d350e99110b28122813481659125913591569126913
-69157906760d79117a147a15850d8a118c128c138914980aa80bbc10bb11
-ba14ea0ae714f50dfd10f914ff1c1e12b106024354584016130b1c1b040f
-440f840f030f190b031c190f12060b06003f3f3fed1112395d0111123939
-1b40370f0f0c101112120a00031914131325120a1412120a0f0c0f110c25
-0b0a140b0b0a1312120c0c0b06031c190f001c101c022f1cbf1c021cb802
-3fb50f1340124014b80254400b3f124012025f12bf120212b80142b60f01
-2200451b0ab8025440120f200b4040200c300c4f0c03500cff0c020cb801
-42b32f0f010fb8023fb41b207c66182b1a1910fd71f45d711a18ed1a1910
-ed1810f4e41910e45d71ed1a1810ed1910e45d7100183fed3f3c103c103c
-87052e2b087d10c487052e182b0e7d10c400111239870e103c3c08c44bb0
-0e534bb018515a58bb000cffe8000bffe80138385959313001435c58b900
-14ffdeb637390a2237390eb8ffe8b51539112215392b2b2b2b595d712b2b
-00715d2b015d591327163332363736373637013313161736371333010607
-060623227f143b2c3c48171126050bfe6dc2dd2b221f2be3b4fe6c412430
-7c5634fe67a91028241b6b0f1d0428fd9975817c76026bfbc8af42595300
->ArialMT AddT42Char 
-2 0 0 <00020100000005000500000300070000211121112521112101000400fc20
-03c0fc400500fb002004c000>ArialMT AddT42Char 
-ArialMT /CharStrings get begin
-/hyphen 16 def
-/period 17 def
-/a 68 def
-/c 70 def
-/g 74 def
-/i 76 def
-/r 85 def
-/s 86 def
-/y 92 def
-end
-ArialMT /Encoding get
-dup 45 /hyphen put
-dup 46 /period put
-dup 97 /a put
-dup 99 /c put
-dup 103 /g put
-dup 105 /i put
-dup 114 /r put
-dup 115 /s put
-dup 121 /y put
-pop
-end
-%ADOEndSubsetFont
-/KUDFOM+ArialMT /ArialMT findfont ct_VMDictPut
-/KUDFOM+ArialMT*1 
-[45{/.notdef}rp /hyphen /period 50{/.notdef}rp /a /.notdef /c 3{/.notdef}rp 
-/g /.notdef /i 8{/.notdef}rp /r /s 5{/.notdef}rp /y 
-134{/.notdef}rp]
-KUDFOM+ArialMT nf
-KUDFOM+ArialMT*1 [9 0 0 -9 0 0 ]msf
-42 344.76 mo
-(s)sh
-46.563 344.76 mo
-(-)sh
-49.5599 344.76 mo
-(gray.icc)
-[5.04 2.99693 5.04 4.437 2.52 2.043 4.563 0 ]xsh
-/KUDFOM+ArialMT*1 uf
-/KUDFOM+ArialMT uf
-/ArialMT uf
-gsave
-492.007 89.99 mo
-520.512 89.99 li
-520.512 121.246 li
-492.007 121.246 li
-cp
-clp
-492 89.7525 mo
-520.505 89.7525 li
-520.505 121.256 li
-492 121.256 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.5033 492 450.248 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-%ADOBeginSubsetFont: ArialMT Initial
-ct_T42Dict begin
--0.664 -0.324 2 1.004
- 256 array 0 1 255 {1 index exch /.notdef put} for  /ArialMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f3210325d73000000cc000000606376
-7420a11cd7eb0000012c000006546670676dcc79599a000007800000066e
-676c796607022dca000094e0000822cc68656164d6144b3e00000df00000
-003668686561123315fe00000e2800000024686d7478f65efffb00000e4c
-000034d46c6f6361361cd72000004320000034d86d617870124c05df0000
-77f8000000206e616d659617a74000007818000011057072657025d64dbf
-0000892000000bbe67646972000000000000000000000000000303880190
-00050008059a05330000011b059a0533000003d1006602120805020b0604
-020202020204e0002affc00078430000000900000000544d432000400020
-fffc05d3fe510133073e01b2400001ffffff0000042605bb000000200004
-05ba001905ba001a05a70019042600180000ffe70000ffe80000ffe7fe69
-ffe805ba0019fe69ffe802ea000000b8000000b80000000000a800ad0169
-00ad00bf00c201f0001800af00b900b400c800170044009c007c00940087
-0006005a00c80089005200520005004400940119ffb4002f00a1000300a1
-00cd00170057007e00ba00160118ffe9007f008503d300870085000d0022
-00410050006f008d014cff75005c00df04830037004c006e00700180ff58
-ff8eff92ffa400a500b903c8fffd000b001a0063006300cdffee05d8ffdc
-002d005c0095009900df019209b500400057008000b9039d0072009a035d
-0401ff67fffa00030021007700cd0004004d00cd01c0022b004c006500e7
-0118017c034305d8ffa3ffb0ffc40003001c005d0068009a00ba01350147
-0221055cff4dffcd0016002d00780080009900b200b600b600b800bd00da
-010c05f0ffa4fff00019002c0049007f00b400ce01c003fefd81fe3f0000
-00050018002900390049006f00be00c700d0012301c1026f050c05320540
-057affd4001400310055005700a700b400e601f7027e027e027f03c60446
-ff42000e0085009100bf00c200c500e1011a012f014f01560229026f029e
-03720008002c00310031006400690089009800c700de012b01b6020c02cf
-03a304ab04fb061dfee0ff0e00060026009b009d00c1010d011801200173
-018201d601e30243025f029b02e2039404a904d20761001c005e006d008d
-00ab00f7011201380151015b0168017c01870191019901cd01d001e80241
-0254026b02ef0368037103bd044204420453047304830586058b06e8fe58
-fec4fed1fef7ff32ff860051007c008100910095009e00b400b900cf00d9
-00d900df00e20105010b010e010e012001210155017b017b017e018d01a2
-01a801a901b401d001d001e201e901f201f501fb020002000206021b0221
-022202220223027202770294029c02cf02cf02d002ec02f903170322032b
-0335033c0359036f037103870390039003b503e1041a04cf04ff05320532
-0596059f05a805ab05c205f0060c0782080008ccfca3fd2afddefe00fe88
-fe96feb2feb4ffe100150019001a001c001f003c005100610061006a0078
-009600a500af00d3010c0118011a012a013e014c0151015f016a01710178
-01820184019a01a501a801a901ae01bc01cd01d701ef0200020d021c0221
-0222022e02350242024f024f025e026502710290029202b402d602fa0307
-030b030f0315032a0347035d036503740379039603b003cc03dd03e203f6
-03fc03fc03ff040a041f04220426042b0447045f0475049e04e704e7055c
-05cb05e5060a066d068606b806f10736073e07500751075d078f07b607d4
-086000b600c300b500b700000000000000000000000001e00381034503b5
-008e0233041902ce02ce002d005f0064034d023f000002a80188027d01b4
-02240578063b023b014e00f00426029402c6029f02f6023b034d014b0153
-006a0231000000000000061404aa0000003c04c300ed04bc026502ce03b5
-0078060c017e02ef060c00b201000239000001c50330042b03cb00da03df
-010704a100db040a011701ed02a70350010b01bd043e05580021039c00ae
-0371017d00b5024500000afb088c012b014e01aa00870054013201f803ff
-0003024e00b4003703e30083006b02d800ed00770088009701640467008e
-0033017c00e700a6029e0329056e062a061501c90269048a021301b40002
-04a9000002390124010305140084015d039a06ef02d9007500cf040a00de
-03ac04bc02cf02ae034d04f005520168006d007d00860071ff8100790558
-04d2016700030156002504e00094007c033204210094007f0072005c002f
-00b6001800ba00b80041034d00720018001f004c016a01550099009a009a
-009800b200040078006900140057006e00ce00b4065402b80067050e0165
-00e7000004cbfe52005affa60099ff67006eff92002dffd40087ff7c00b8
-00a800e5008f00a80185fe7b0070001e00d900de014c054602cf0546ff2d
-028a02d90253029600b700000000000000000000000000000125011800ea
-00ea00ae0000003e05bb008a04d70053003fff8cffd50015002800220099
-0062004a00e4006d00ee00e5004803c00033fe4e02b1ff460370007905df
-0051ffa7ff1f010a0068ff6c004f00bc00a507050061072b00ed04b001d2
-00b6007b00650252ff740365fe690094008f005c00400086007500890089
-4043555441403f3e3d3c3b3a3938373534333231302f2e2d2c2b2a292827
-262524232221201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09
-0807060504030201002c4523466020b02660b004262348482d2c45234623
-6120b02661b004262348482d2c45234660b0206120b04660b00426234848
-2d2c4523462361b0206020b02661b02061b004262348482d2c45234660b0
-406120b06660b004262348482d2c4523462361b0406020b02661b04061b0
-04262348482d2c0110203c003c2d2c20452320b0cd442320b8015a515823
-20b08d44235920b0ed51582320b04d44235920b09051582320b00d442359
-21212d2c20204518684420b001602045b04676688a4560442d2c01b10b0a
-432343650a2d2c00b10a0b4323430b2d2c00b0172370b101173e01b01723
-70b10217453ab10200080d2d2c45b01a234445b01923442d2c2045b00325
-456164b050515845441b2121592d2cb00143632362b0002342b00f2b2d2c
-2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b1
-2cc08a8cb8100062602b0c642364615c58b00361592d2c45b0112bb01723
-44b0177ae4182d2c45b0112bb01723442d2cb01243588745b0112bb01723
-44b0177ae41b038a45186920b01723448a8a8720b0a05158b0112bb01723
-44b0177ae41b21b0177ae45959182d2c2d2cb0022546608a46b040618c48
-2d2c4b53205c58b002855958b00185592d2c20b0032545b019234445b01a
-23444565234520b00325606a20b009234223688a6a606120b01a8ab00052
-7921b21a1a40b9ffe0001a45208a54582321b03f1b235961441cb114008a
-5279b31940201945208a54582321b03f1b235961442d2cb110114323430b
-2d2cb10e0f4323430b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2c
-b10e0f432343650b2d2cb11011432343650b2d2c4b525845441b2121592d
-2c0120b003252349b04060b0206320b000525823b002253823b002256538
-008a63381b212121212159012d2c4bb06451584569b00943608a103a1b21
-2121592d2c01b005251023208af500b0016023edec2d2c01b00525102320
-8af500b0016123edec2d2c01b0062510f500edec2d2c20b001600110203c
-003c2d2c20b001610110203c003c2d2cb02b2bb02a2a2d2c00b00743b006
-430b2d2c3eb02a2a2d2c352d2c76b8022323701020b802234520b0005058
-b00161593a2f182d2c21210c6423648bb84000622d2c21b08051580c6423
-648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb815
-55621bb200802f2b59b002602d2c0c6423648bb84000626023212d2cb400
-0100000015b00826b00826b00826b008260f10161345683ab001162d2cb4
-000100000015b00826b00826b00826b008260f1016134568653ab001162d
-2c4b53234b515a5820458a60441b2121592d2c4b545820458a60441b2121
-592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb01343
-58031b02592d2cb0134358021b03592d2c4b54b012435c5a58381b212159
-2d2cb012435c580cb00425b00425060c6423646164b807085158b00425b0
-0425012046b01060482046b0106048590a21211b2121592d2cb012435c58
-0cb00425b00425060c6423646164b807085158b00425b00425012046b8ff
-f060482046b8fff06048590a21211b2121592d2c4b53234b515a58b03a2b
-1b2121592d2c4b53234b515a58b03b2b1b2121592d2c4b53234b515ab012
-435c5a58381b2121592d2c0c8a034b54b00426024b545a8a8a0ab012435c
-5a58381b2121592d2c4b5258b00425b0042549b00425b00425496120b000
-5458212043b0005558b00325b00325b8ffc038b8ffc038591bb040545820
-43b0005458b00225b8ffc038591b2043b0005458b00325b00325b8ffc038
-b8ffc0381bb00325b8ffc03859595959212121212d2c462346608a8a4623
-20468a608a61b8ff8062232010238ab902c202c28a70456020b0005058b0
-0161b8ffba8b1bb0468c59b0106068013a2d2cb1020042b123018851b140
-0188535a58b910000020885458b202010243604259b12401885158b92000
-0040885458b2020202436042b12401885458b2022002436042004b014b52
-58b2020802436042591bb940000080885458b202040243604259b9400000
-8063b80100885458b202080243604259b94000010063b80200885458b202
-100243604259b94000020063b80400885458b20240024360425959595959
-2d2cb0024354584b53234b515a58381b2121591b21212121592d00000001
-00000005028fa58dc35f5f0f3cf5081b080000000000a2e3272a00000000
-c14fd713faaffd671000080c00000009000100010000000000010000073e
-fe4e00431000faaffa7a1000000100000000000000000000000000000d35
-06000100000000000239000002390000023900b002d7005e047300150473
-0049071d0077055600580187005a02aa007c02aa007c031d004004ac0072
-023900aa02aa0041023900ba0239000004730055047300df0473003c0473
-00560473001a047300550473004d047300610473005304730055023900b9
-023900aa04ac007004ac007204ac00700473005a081f006f0556fffd0556
-009605c7006605c7009e055600a204e300a80639006d05c700a4023900bf
-04000037055600960473009606aa009805c7009c063900630556009e0639
-005805c700a10556005c04e3003005c700a105560009078d001905560009
-0556000604e300290239008b023900000239002703c100360473ffe102aa
-00590473004a0473008604000050047300460473004b0239001304730042
-0473008701c7008801c7ffa20400008801c7008306aa0087047300870473
-0044047300870473004802aa00850400003f02390024047300830400001a
-05c700060400000f040000210400002802ac0039021400bc02ac002f04ac
-00570556fffd0556fffd05c70068055600a205c7009c0639006305c700a1
-0473004a0473004a0473004a0473004a0473004a0473004a040000500473
-004b0473004b0473004b0473004b023900bd023900230239ffe502390009
-047300870473004404730044047300440473004404730044047300830473
-0083047300830473008304730049033300800473006b0473001b04730051
-02cd006d044c000104e3009905e5000305e50003080000e102aa00de02aa
-003d0464004e080000010639005305b4009a0464004e0464004d0464004d
-0473fffd049c00a003f4003805b4007a069600a1046400000231000002f6
-002f02ec002d0625007f071d004404e3008104e3009e02aa00e804ac0072
-046400540473002e0464003304e5001a047300860473008c080000ef0556
-fffd0556fffd0639006308000081078d00520473fffc0800000002aa0053
-02aa004701c7008001c7006c0464004e03f4002f04000021055600060156
-fe390473ffe402aa005c02aa005c040000170400001704730049023900b9
-01c7006c02aa0047080000250556fffd055600a20556fffd055600a20556
-00a20239008d0239ffe00239000402390015063900630639006306390063
-05c700a105c700a105c700a1023900c602aa001902aa000602aa001d02aa
-002e02aa00e502aa00a202aa006b02aa003a02aa004b02aa002804730000
-01c700030556005c0400003f04e3002904000028021400bc05c7fffd0473
-004905560006040000210556009e0473008704ac007204ac00a102aa006b
-02aa001902aa002106ac006b06ac006b06ac0021047300000639006d0473
-0042023900b10556005c0400003f05c700660400005005c7006604000050
-04730046046bffe102aa00ee0556fffd0473004a0556fffd0473004a05c7
-009e04eb004705c7fffd055600a20473004b055600a20473004b04730096
-01c7004204730096025500880473009a02ac008305c7009c0473008705c7
-009c04730087063900630473004405c700a102aa008505c700a102aa003c
-0556005c0400003f04e300300239002404e300300300002305c700a10473
-008305c700a10473008304e300290400002804e3002904000028046800a4
-063900600662005504a00048047400480391006204f000440329002e0530
-0048046bffe1040000b002eb005208c000330800004f040000990800004f
-040000990800004f040000980400009807d5016a05c0009e04ab007204d5
-009d04ac007104d5022204d5010505abffe9050001c905ab027e05abffe9
-05ab027e05abffe905ab027e05abffe905abffe905abffe905abffe905ab
-ffe905ab01c005ab027e05ab01c005ab01c005abffe905abffe905abffe9
-05ab027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab
-01c005ab01c005abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905abffe905abffe905ab02d605ab006605abffea05d5ffff04d50092
-0800000007eb013007eb012007eb013007eb012004d500b204d5008004d5
-002a082b0198086b01b807550010060000f40600006f0440003a05400037
-04c0003f04150040040000250600005505e100bf038d008904d5ffd90180
-008002d50086071500610296000f04d5009202d6008302d6008304d500b2
-02d600700556fffd0473004a05c700660400005005c70066040000500556
-00a20473004b055600a20473004b055600a20473004b0639006d04730042
-0639006d047300420639006d0473004205c700a40473008705c7001f0473
-00060239ffce0239ffce0239ffe40239ffe40239fff60239fff50239004b
-01c700190400003701c7ffa20556009604000088040000860473009601c7
-fffa05c7009c0473008705c900a50473008b063900630473004406390063
-0473004405c700a102aa006b0556005c0400003f04e300300239000c05c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-078d001905c70006055600060400002101c700890556fffd0473004a0800
-0001071d00440639005304e30081023900b9078d001905c70006078d0019
-05c70006078d001905c70006055600060400002101c7008a02aaffe10473
-001b04cd005a06ac006b06ac002206ac002206ac004a02aa00e202aa006b
-02aa00de02aaffea0557ffff0646ffa706b4ffa80312ffa80632ffa706d8
-ffa70605ffa701c7ff780556fffd055600960558fffe055600a204e30029
-05c700a4023900bf055600960558000b06aa009805c7009c0533006d0639
-006305c700a40556009e04f2009404e30030055600060556000906af007f
-05fb0061023900040556000604a00048039100620473008b01c7006b0460
-0088049a008c04000019038700480473008b0473005c01c7008904000086
-04000018049c00a00400001a0395005c04730044048d008303db00560460
-00880433001105b4007a063f005701c7ffc9046000880473004804600088
-063f0057055700a206eb0032045500a105c000640556005c023900bf0239
-0004040000370875000d081500a406d5003104a900a10515000a05c000a0
-0556fffd054000a705560096045500a1056b0000055600a20763000704d5
-004e05c000a105c000a104a900a10540001206aa009805c700a406390063
-05c000a00556009e05c7006604e300300515000a061500520556000905eb
-009f05550057075500a1078000a106550000071500a8054000a505c00055
-081500a405c7001a0473004a0495005b0440008802eb008804ab00000473
-004b055afffb03ab003204780087047800870380008604ab00180580008c
-046b00880473004404550088047300870400005003aa0026040000210695
-004b0400000f0495008a042b0045066b008d0695008d0500002805c0008b
-042b008404150030060000890455001f0473004b0473000002eb00890415
-004b0400003f01c700880239000901c7ffa2074000130680008304730000
-0380008604000021046b008803e900a1034a008808000041089500a00585
-002d000001010000001e0000003100000031000001010000007e0000007e
-0000008c0000008c000001010000001000000101000001210310007d0000
-008c023300d20000030b0000ff04023900b9048100690456003203310019
-0411002d04d1009601f9009b030f005f04ca009b04b8008c01f9009b0413
-002803b0005003b4003c04ca009b04cf005001f9009b02d2003c0498005a
-043c00190488006e045f007303b1001903d4000a0466009604130028058e
-00640524002803f2009b03f2009b03f2009b01e3005a0356005a0686009b
-01f9ffac041300280413002803b4ff5703b4ff570448002d058e0064058e
-0064058e0064058e00640481006904810069048100690456003203310019
-0411002d04d10096024b0000034a000004b8008c024b00000413002803b0
-005003b4003c04cf005002d2003c0498005a0488006e045f007303d4000a
-0466009604130028058e00640524002801f9009b0456003203b00050045f
-0073049b003c0000ffdc0000ff250000ffdc0000fe51028d00ab028d00a0
-02da0043034d007901a8ffba000000460000004600000046000000460000
-00480000004600000046000000460435017c0435012e043500b704350081
-0435012c043500be043500af043500810435009a043500db04350085028d
-00c1043500b3060001000600010002420036060001000435009e04350098
-043500cb0600010006000100060001000600010006000100000000460600
-010006000100060001000600010006000100060001000600010006000100
-051bffba06000100060001000600010005b5003a05b5003a01f4ffba01f4
-ffba060001000600010006000100060001000481003604350036043dffba
-043dffba03e9004a03e9004a067f0014077600140327ffba041effba067f
-0014077600140327ffba041effba051b003204b500240300fff706000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010000000030
-0000004600000046000000400000004606000100060001000000ffdc0000
-fe510000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ff160000ff160000ffdc0000ff160000ffdc0000ff200000ffdc0473
-004a08000000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010006000100028d
-007f028d005d0600010004ee0015034d007901a8000e01d6ffdc01a80056
-01d60010037500320375003201a8002d01d60013051b003204b5002401f4
-ffba01f4ffba01a8009301d6001305b5003a05b5003a01f4ffba01f4ffba
-024200000300fff705b5003a05b5003a01f4ffba01f4ffba05b5003a05b5
-003a01f4ffba01f4ffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba02b3
-005f02b3005f02b3005f02b3005f03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba08c9003e08c9003e06c5ffba06c5ffba08c9003e08c9003e06c5ffba
-06c5ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7
-ffba04a7ffba045a002a039a00360435ffba0327ffba045a002a039a0036
-0435ffba0327ffba064f0027064f00270224ffba021affba04a7004604a7
-00460224ffba021affba04cf002d04cf002d0327ffba0327ffba040d0047
-040d004701a8ffba01a8ffba02b4002302b400230327ffba0327ffba0435
-00450435004501f4ffba01f4ffba024200360300fff7039affba0327ffba
-0375003203750032051b003204b50024051b003204b5002401f4ffba01f4
-ffba045a004004ce0049045a002604ce0039045a005304ce004a045a0053
-04ce004a0600010006000100000000460000004606000100060001000600
-010000000046000000460600010006000100000000480000004606000100
-060001000600010000000046000000460000004600000046000000400000
-003006000100000000460000004606000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d00ca028d00c7028d
-00c606000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000100ffba0800ffba1000ffba06dc0063053f004406d5
-00a1055b00830000fddc0000fc2f0000fca60000fe540000fcd70000fd73
-0000fe290000fe0d0000fd110000fc670000fd9d0000fbf50000fc720000
-fed50000fed50000ff02041b00a006ac006b06ac00190000feb60000fd73
-0000fe080000fca60000fe530000fd110000fbc80000faf40000faaf0000
-fc720000fbaa0000fb6a0000fcf10000fc7d0000fbdd0000fcc10000fb98
-0000fdea0000fe840000fdc20000fcf10000fd5f0000fe760000febc0000
-fceb0000fd6c0000fd580000fc900000fd150000fc2c0000fc130000fc12
-0000fb960000fb9601c700880556fffd0473004a0556fffd0473004a0556
-fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473004a
-0556fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473
-004a0556fffd0473004a0556fffd0473004a055600a20473004b055600a2
-0473004b055600a20473004b055600a20473004b055600a20473004b0556
-00a20473004b055600a20473004b055600a20473004b0239006301c7001f
-023900ba01c7007c06390063047300440639006304730044063900630473
-004406390063047300440639006304730044063900630473004406390063
-0473004406dc0063053f004406dc0063053f004406dc0063053f004406dc
-0063053f004406dc0063053f004405c700a10473008305c700a104730083
-06d500a1055b008306d500a1055b008306d500a1055b008306d500a1055b
-008306d500a1055b00830556000604000021055600060400002105560006
-040000210556fffd0473004a0239ffe201c7ffb0063900630473004405c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-05c700a1047300830000fefe0000fefe0000fefe0000fefe0455fffd02eb
-000c07630007055afffb04a900a10380008604a900a10380008605c700a4
-046b00880473fffd040000140473fffd04000014055600090400000f0555
-0057042b0045055500a10473008706050063047300550639006004730044
-05b5003a01f4ffba0224ffba021affba04a7004601f4009e01f4001001f4
-001b01f4001001f4006b01f4fff90227ffce0000000f0000fff502aa00a4
-02aa00a40000000e00000056000000560000ffcf01a8000f01d6ffbf01a8
-fff501d6ffcd01a8001d01d6fff501a8009301d600130375003203750032
-0375003203750032051b003204b5002405b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba
-01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4
-ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a
-01f4ffba01f4ffba0481003604350036043dffba043dffba048100360435
-0036043dffba043dffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba0481
-003604350036043dffba043dffba02b3003202b3003202b3005f02b3005f
-02b3005f02b3005f02b3003202b3003202b3005f02b3005f02b3005f02b3
-005f02b3005f02b3005f02b3003802b3003802b3004902b3004903e9004a
-03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9
-004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba0692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba08c9003e08c9003e06c5ffba06c5ffba04a7ffba04a7ffba045a
-002a039a00360435ffba0327ffba064f0027064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba064f0027064f00270224
-ffba021affba064f0027064f00270224ffba021affba064f0027064f0027
-0224ffba021affba04a7004604a7004604a7004604a70046093e0032093e
-00320740ffba0740ffba067f0014077600140327ffba041effba04cf002d
-04cf002d0327ffba0327ffba04cf002d04cf002d0327ffba0327ffba04cf
-002d04cf002d0327ffba0327ffba067f0014077600140327ffba041effba
-067f0014077600140327ffba041effba067f0014077600140327ffba041e
-ffba067f0014077600140327ffba041effba067f0014077600140327ffba
-041effba040d0047040d004701a8ffba01a8ffba040d0047040d004701a8
-ffba01a8ffba040d0047040d004701a8ffba01a8ffba040d0047040d0047
-01a8ffba01a8ffba043500450435004501f4ffba01f4ffba043500450435
-00450435004504350045043500450435004501f4ffba01f4ffba04350045
-043500450481003604350036043dffba043dffba024200360300fff7031a
-001a031a001a031a001a0375003203750032037500320375003203750032
-037500320375003203750032037500320375003203750032037500320375
-0032037500320375003203750032051bffba04b5ffba051b003204b50024
-01f4ffba01f4ffba0375003203750032051b003204b5002401f4ffba01f4
-ffba051b003204b50024067f0045067f0045067f0045067f004501a80028
-0000fe290000fea20000ff300000ff1d0000ff120000ff920000fe7e08fc
-003208ad00320000ffb50000ffb60000feed0000ff640000fe7e0000ff9f
-018d000002f6fffd0000fe820000ff1004cd00320000ff580000ff580000
-ff640692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba045a002a039a00360435ffba0327ffba034d007902b400230242
-003601f4ffba0290ffba01f4002f01f4003b01f4001201f400b101f4006d
-067f00140776001401f9009b0000fed902bc000003f2009b045afff504ce
-fff5045a005304ce004a045a005304ce004a045a005304ce004a045a0053
-04ce004a045a005304ce004a045a005304ce004a04350071043500ad045a
-000f04ce000f0473001406110014054000a7047300860540000a0473000a
-05c7005105c700660400005005c7fffd067a00140540004a047300460474
-00480556006e04d5005304e3ffc40639006d04fe000f070c008701c70083
-0239001f055600960400008801c7001504000018072000a405c7ffb80473
-008b0639006006f200630557004406090014047300860556009e0556006b
-0400004f04f20094030b00440239002404e300140239002404e3003005fb
-006105c700a1062e00140400002104e300290400002804e3002904e30031
-045c0044045c003f0473003c0473005503ab003203e50024047300870214
-00bc034e00bc04ac0072023900b00aaa009e09c7009e08640046087f0096
-06aa0096039c008309c7009c078e009c062b0087047300550556fffd0473
-004a0000fefe0556fffd0473004a08000001071d00440639006d0473001a
-0639006d0473004205560096040000880639006304730044063900630473
-004404e30029045c004c01c7ffa20aaa009e09c7009e086400460639006d
-04730042084600a404f2009e05c7009c047300870556fffd0473004a0556
-fffd0473004a055600a20473004b055600a20473004b0239ff8a0239ff64
-023900040239fff60639006304730044063900630473004405c700a102aa
-ffcc05c700a102aa006805c700a10473007605c700a1047300830556005c
-0400003f04e3003002390024045c0051037e001305c700a40473008705a6
-00a404d6005e0486005e04e30029040000280556fffd0473004a055600a2
-0473004b06390063047300440000fefd0639006304730044063900630473
-004406390063047300440556000604000021047300570473004804730086
-04730086040000130400005004730046047300460473005505e9005503ab
-004903ab0032050d0032040f00440239ffb9047300420473004204780050
-0402001904ef00190473008b047300870473008701c7001901c7008901c7
-0089029e0000026e001401c700830493008306aa008406aa008406aa0087
-0473ffa60473008b046c00870473004406530044063f00570466004402aa
-ffe402aaffe402aaffe402aa008502aa008502aa008502aaffe40455008a
-0455008a0400003f01c7ffa20214ffb901c7ff7202cb00000239000f0239
-002404730019048c0044046000880400001a05c700060400001804280019
-0400002804540028045c004c045c00790400002404000050040000240400
-00500639006304400088040f004904780050046b0088032e000004000008
-033b008804730048040000240400005007b7004607400046080b004605b3
-0024036f002405c00024061c0013054a0083050f008303e2001e04380063
-03110064031100640146ffce01eb006401eb000001eb000002ea006403d9
-0000029100000187005a02d7005e01c7008001c7006c01c7008a02aa00fb
-02aa00fb02ca003202ca003204ac007004ac007004ac006504ac006502aa
-012102aa00de02aa005902aa012102aa001d02aa005902aa00de023900b6
-023900b602aa00fb02aa00fb02aa00a602aa00a602aa00a602aa001d02aa
-ffe202aafffb029400000142006402b8003202a0000002ca003203100096
-0310009603100096031000960310009602aa006202aa006202aa002802aa
-001d02aa0047045700960457009604570096045700960457004304570043
-045700430457004304570043031000430457002f0457002f0457002f0457
-002f0457002f0310002f0457002504570025045700250457002504570025
-0310002f0457001a0457001a0457001a0457001a0457001a0310001a0457
-004204570042045700420457004204570042031000420457009604570096
-045700960457009604570042045700420457004204570042045700420310
-00420457002f0457002f0457002f0457002f0457002f0310002f0457002f
-0457002f0457002f0457002f0457002f0310002f04570026045700260457
-002604570026045700260310002604570042045700420457004204570042
-045700420310004204570096045700960457009604570096045700420457
-004204570042045700420457004203100042045700260457002604570026
-045700260457002603100026045700230457002304570023045700230457
-0023031000230457002f0457002f0457002f0457002f0457002f0310002f
-0457004b0457004b0457004b0457004b0457004b0310004b045700960457
-009604570096045700960457004204570042045700420457004204570042
-031000420457001a0457001a0457001a0457001a0457001a0310001a0457
-002404570024045700240457002404570024031000240457002f0457002f
-0457002f0457002f0457002f0310002f0457004e0457004e0457004e0457
-004e0457004e0310004e045700960457009604570096045700960000fec1
-0000fec60000fdac0000fed80000ff920000fee90000ff4c0000fea00000
-fec40000ffce0000ff660000fea00000fed80000fed80000ff970000ff98
-0000ff990000fff40000ff420000ff420000ff440000ff5f0000fe870000
-ffec0000ffa60000ff510000ff510000ff510000fec90000ff1c00000000
-0000fee90000ff4c0000ff930000ff2a0000ff560000ffce0000fe870000
-febb0000fec40000fec40000fed80000fed80000feb30000fec90000fdad
-0000fdac0000feb30000fec90000fdad0000fe160000fee60000ffa60000
-fe870000ff440000feba0000ff230000ff9a0000fdac0000fe8800000000
-0000feb00000ff980000fe930000ffa60000fe870000fdac0000ff660000
-ff440000feb00000feb00000feb00000ff030000ff520000fd1f0000ff53
-0000ff530000ff530000feb50000feb50000ffc30000feae0000fedc0000
-fec70000fec80000fedc0000fe1e0000ff420000ff510000feb70000feb0
-02aa00de02aa005902aa00fa049a008c04600088062e001407aa0000062e
-0014047b004c063f005704cf0044063900630473004405c7006604000050
-04e300a8033b008804ff0000043c0032060d000a049d0042072000a406aa
-0084056500630473008b056400a40400000a0556006b0556006b04e00005
-04c5001905e5005f046e004403b600140347002804cf00440495005b0400
-005001c7ffa2063900600389004d03890050055600a205c000a10473004b
-047800870ab4006d04fe00100639001404e70014079900bf05b500880558
-000b0400001a072e00bf0590008806a10078057b007a086d00bf06f00088
-04d5006603ab001f065f0039058200480639006004730044066d0009050c
-001a066d0009050c001a0b010063091c004406aa005c04e600440987006d
-06d000500000fe370ab4006d04fe001005c7006604000050040700140000
-fea60000febc0000feaa0000fead0000fc2b0000fc4c05c000a104780087
-05400004042b00140556009e04730087055d00a40464008804d5004e03ab
-003204a900040380000005ef002904490028070900a4052f0088091800a0
-06f6008806060066042b005005c700660400005004e3003003aa00260767
-00310587002605550057042b004506e4000a0554000a06e4000a0554000a
-023900bf07630007055afffb055700a1046800860540001204ab001805c7
-00a4046b008805c700a4046b008805550057042b004506aa00980580008c
-02aa002e0556fffd0473004a0556fffd0473004a08000001071d00440556
-00a20473004b060500630473005507630007055afffb04d5004e03ab0032
-04d5004e045c004c05c000a10478008705c000a104780087063900630473
-0044063900600473004405c0004a0415002b0515000a040000210515000a
-040000210515000a0400002105550057042b0045071500a805c0008b0540
-004a0473004607bf004a0703004607a6006606860053054d006604130053
-07c3001207470018084600a4070700880639006d0478005005f900300553
-00260000ff430000fec90000ff770000ffb00000ff470000ff560000ff74
-0000fed70000feac000000000000ff520000ff56000000000000feac0000
-fd9a000000000000ff6a0000ff7c0000ff690000ff560000feac0000ff7f
-0000ff560000fdef0000ff430000ff690000ff7c000000000000fdae0000
-ff8c000001020000fefe0000fefe0000fedf0000fedf0000ff580000ff20
-0000fefe0556fffd0473004a055600960473008605560096047300860556
-00960473008605c700660400005005c7009e0473004605c7009e04730046
-05c7009e0473004605c7009e0473004605c7009e04730046055600a20473
-004b055600a20473004b055600a20473004b055600a20473004b055600a2
-0473004b04e300a8023900130639006d0473004205c700a40473008705c7
-00a40473008705c700a40473008705c700930473006805c700a404730087
-0239ffdf01c7ff9202390020023900060556009604000088055600960400
-008805560096040000880473009601c7007e0473009601c7ffb904730096
-01c7ffa50473009601c7ffa306aa009806aa008706aa009806aa008706aa
-009806aa008705c7009c0473008705c7009c0473008705c7009c04730087
-05c7009c0473008706390063047300440639006304730044063900630473
-004406390063047300440556009e047300870556009e0473008705c700a1
-02aa008505c700a102aa008505c700a102aa005e05c700a102aa00260556
-005c0400003f0556005c0400003f0556005c0400003f0556005c0400003f
-0556005c0400003f04e300300239002404e300300239002404e300300239
-ffff04e300300239000e05c700a10473008305c700a10473008305c700a1
-0473008305c700a10473008305c700a104730083055600090400001a0556
-00090400001a078d001905c70006078d001905c70006055600090400000f
-055600090400000f055600060400002104e300290400002804e300290400
-002804e3002904000028047300870239000305c70006040000210473004a
-01c7008904a0004804a0004804a0004804a0004804a0004804a0004804a0
-004804a000480556fffd0556fffd06820013068200130682001306820013
-068200560682005603910062039100620391006203910062039100620391
-0062061e0000061e0000076c0000076c0000076c0000076c00000473008b
-0473008b0473008b0473008b0473008b0473008b0473008b0473008b068f
-0000068f0000081f0000081f0000081f0000081f0000081ffff3081ffff3
-01c7008101c7008101c7ff9b01c7ff9b01c7ffeb01c7ffeb01c7ffa201c7
-ffa20301000003010000049100000491000004910000049100000491fff3
-0491fff3047300440473004404730044047300440473004404730044069d
-0000069d0000082d0000082d000007c9000007c900000460008804600088
-0460008804600088046000880460008804600088046000880682000007ae
-00000812000007ae0006063f0057063f0057063f0057063f0057063f0057
-063f0057063f0057063f0057065f0000065f000007ef000007ef0000078b
-0000078b0000078bffff078bffff04a0004804a000480391006203910062
-0473008b0473008b01c7ffe601c700680473004404730044046000880460
-0088063f0057063f005704a0004804a0004804a0004804a0004804a00048
-04a0004804a0004804a000480556fffd0556fffd06820013068200130682
-00130682001306820056068200560473008b0473008b0473008b0473008b
-0473008b0473008b0473008b0473008b068f0000068f0000081f0000081f
-0000081f0000081f0000081ffff3081ffff3063f0057063f0057063f0057
-063f0057063f0057063f0057063f0057063f0057065f0000065f000007ef
-000007ef0000078b0000078b0000078bffff078bffff04a0004804a00048
-04a0004804a0004804a0004804a0004804a000480556fffd0556fffd0556
-fffd0556fffd0556fffd02aa00e502aa00fd02aa00e502aa000602aa0006
-0473008b0473008b0473008b0473008b0473008b068200000682000006f3
-000006f3000005c700a402aa001302aa001302aa000601c7ffbb01c7ffab
-01c7ffca01c7ffca01c7ff9301c7ff930239001a0239fff5036500000365
-000002aa001302aa001302aa000604600088046000880460008804600088
-048d0083048d00830460008804600088055600060556000606e600000718
-0000061e000002aaffea02aaffea02aa0059063f0057063f0057063f0057
-063f0057063f005707650000069d000007270000065f000005fb006102aa
-00de02aa00e50473000d05c7006605c7006606aa008705c70024095000a1
-078d00190556001f04e30030080000290400003004c100660000ff530000
-ff530000ff530000ff5301c7001901c7ffa2042b00050556001105740046
-02cbffa3057a008702f0ffc8057f000a057f000a02aa008402aa008402aa
-00c902aa00c902aa00a002aa005902aaffaf02aa003a02aa0006023900b9
-02aa00a902aa00a902aa00a902aa00a9032e001e032e001e02aa003a0000
-ff730000ffa50000fed80000ff230000ff720000ff720000fee70000ffa5
-0000ff530000ff530000ff530556009e0473008703f8001905fb0019071d
-00440440001904000050046900870469001903eb008703ab003201c70088
-0361004104000088033600100580008c04780087047300440400001304de
-004404de004404de000d078d005003a800440473004404730044042b0084
-0455001f0455001f03aa00260460008804c6004405de004404c600440400
-001a05c700060400002803ab0032036b003f04db001f02eb00880400001a
-04550088042b008405b4007a04ab001803a00000054f0000035100320351
-ffd103980032034800320348003203f80032036e0032015600690284002d
-0366003202d000320415003203710032036f003204180032030f00320359
-0032039c003203760031036f003204fb000002fa003202fa003203040032
-04cc0032030500640305003202f9003202f90032028c0032028c00320304
-00320142006402b6006404950064030f00640305003202d5003203050032
-030500320306006401c20032030f00640342003204950064029200000320
-00000315006402920000030600320385003202bf00000142006401eb0064
-030f0064029200000315006402920000030900320385003202bf000005ed
-00460a660046061300460689ffba0541ffba01e9003c045a00110000ff0d
-0000ff350000fece0000feb70000fec90000ffcf0000ff4f0000ff9e0000
-feca02b3005f02b3005f03e9004a03e9004a039affba0327ffba039affba
-0327ffba05ad0069053d002d05fd009604dc005004e0003c05f6009b053f
-00280650002804ac00720000fe3b0000fe660000fe660473fffc02aa0053
-02d5ffce01a8ffba01a8ffba01a8ffba01a8ffba0658001509c500470400
-000008000000040000000800000002ab0000020000000155000004730000
-02390000019a000000ab00000000000005e5000305c7006606aa00980580
-008c0744008307180046071800480556fffd05c70066040000140473000a
-04e300300400004f0400002804a5001d000001020000ff420000febf0000
-ff3a0000ff53048d000a05c7005105c7006605c70051045500a102eb0088
-0000ff430000ff040000ffac02d200960000ff37021affba0250001e0000
-ff3a0000ff5b0000ff5f0000ff7e0000ff940000ff4a0000fe9c05b5003a
-05b5003a01f4ff9601f4ff9605b5003a05b5003a01f4ffba01f4ffba05b5
-003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba
-05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba0481003604350036043dffba
-043dffba0481003604350036043dffba043dffba02b3003202b3003202b3
-005f02b3005f03e9004a03e9004a0692003e0692003e043fffba043fffba
-045a002a039a00360435ffba0327ffba045a002a039a00360435ffba0327
-ffba045a002a039a00360435ffba0327ffba064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba067f0014077600140327
-ffba041effba067f0014077600140327ffba041effba067f001407760014
-0327ffba041effba02b4002302b400230327ffba0327ffba02b4002302b4
-00230327ffba0327ffba043500450435004501f4ffba01f4ffba04350045
-0435004501f4ffba01f4ffba043500450435004501f4ffba01f4ffba040d
-0047040d004701a8ffba01a8ffba03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0473ff93047300460239ffbf06aa
-ffd50473ffb70473ff9102aaffa402aaffa40400ffff0239ffb904000028
-04730089030b0064047400480649002401c7001901c700190473001e0460
-001e048c000a04730086047300460239001305b400420400008801c7fffc
-06aa00870473008b0473008702aafffb0400003f0318ffa20400001a0400
-000f040000280473004a04730048047300460473004b03ab004903ab0032
-0534005501c700880400001301c7ffa204730083045c004c0304006402d5
-003202c9003302fc0032028c003201d5003201d500000304003203110064
-01420019014200640142006401420019022a000001420064014200090233
-00640493006404930064030fffc9030f0064030e00640305003203000032
-02b800320142ffca01c20032030f001d031a00320306006402d400640292
-000002de003202de003202de003202f4003202ea00320000febc0000febc
-0000ff730000fea9023900b902fa003202f900320305003202a0000002f9
-00320639006d0556fffd0473000f05c7006602aa004104a0004804a00048
-04a0004804a0004804a0004804a0004804a0004804a0004801c7ff9b01c7
-ffab01c7ff9b01c7ffab01c7ff9b01c7ffbb01c7ff9b01c7ffbb04600088
-0460008804600088046000880460008804600088046000880460008801c7
-ffab01c7ffab01c7ffbb01c7ffbb04600088046000880460008804600088
-045a005304ce004a03a000130556001105c700290558000b055600a20473
-004b0400003301c7ffa205e600630473004805c7000002aa000f05560006
-0400002104000013040000500400001301c700830455fffd02eb00010556
-00090400000f055600090400000f04d5005303ab00490540001204ab0018
-0000fec60000fed40000fec60000fed40000fe5f0000fe5f0000ff720000
-ff730000fee7078b000a03eb004c040000130473000a01c700150473fff4
-0556001105c700a1047300190239ff8b05c700a404730087055600960400
-008804e30029040000280400003b049e00a403670088053000480000ff53
-0000ffbc0000fefe0000fefe0000fea40000fea401c70088000000000000
-002a0000002a0000002a0000002a000000d60000017e00000320000005a6
-0000074e000009380000097e000009fe00000aa400000b8400000bec0000
-0c6400000caa00000ce600000d5600000f1200000fee00001218000013f2
-000015520000170c000018e20000198e00001c2200001e5600001eb20000
-1f7000001ff200002062000020e8000021da000023da000025840000271c
-000028560000299e00002a6200002b1800002ca800002dae00002e920000
-2f7a000031b00000323a000035640000370e000038420000394800003b3c
-00003da800004052000041000000422400004398000045d6000048e20000
-4a8800004bc800004c3200004c9c00004d0000004d8800004dbc00004e38
-0000510a000052e80000549c000056500000580e0000596200005b520000
-5cf600005dea00005f020000619a00006296000064c60000668c0000684e
-00006a1200006ba800006cae000070560000717a00007318000075360000
-79a000007bc400007e1c00008004000081020000814e00008250000082f0
-0000833c00008370000083ac000083ee000084540000849a000084ce0000
-85040000853a0000858a000085cc0000861e00008656000086a8000086de
-0000871e000087600000879e000087e800008828000088560000888e0000
-88de00008914000089540000898e000089d200008a1c00008a5800008a88
-00008acc00008b0400008b9400008c1a00008e2800008fbc0000916c0000
-91b80000924c00009470000096c4000098b4000099a000009a2200009a8c
-00009baa00009d0600009f4e0000a0b00000a13e0000a1e80000a2ac0000
-a3f40000a59e0000a68c0000a7520000a7b60000a8240000a94e0000aa72
-0000ab020000ace40000af3e0000b2900000b3860000b42c0000b47c0000
-b5320000b6520000b7f00000b88a0000b94e0000ba0e0000ba760000bab2
-0000bb0a0000bb580000bd700000bfb60000bfee0000c0200000c14a0000
-c2760000c3240000c3c80000c46a0000c53c0000c5900000c5c60000c61e
-0000c7700000c7e20000c83c0000c9b40000cb200000cc000000cc320000
-ccce0000cdf20000d0680000d0a20000d0e60000d1220000d1840000d1c6
-0000d20c0000d2580000d28a0000d2de0000d31c0000d34c0000d38a0000
-d3d00000d4120000d4500000d4d20000d5400000d6260000d6620000d6e2
-0000d7160000d7b80000d8400000d8ac0000d90e0000d97a0000da660000
-db580000db8c0000dbc00000dbf00000dc340000dcac0000de260000e040
-0000e0720000e0ac0000e1a60000e3340000e36a0000e4ce0000e54a0000
-e62a0000e7200000e8b00000ea1a0000ec080000ed040000ed4a0000ed7e
-0000edc00000edfa0000ee4e0000ee960000eee00000ef100000ef400000
-f1280000f1660000f18e0000f1be0000f1f20000f2180000f23e0000f286
-0000f43c0000f5b60000f5dc0000f6020000f6460000f6760000f6a60000
-f6fc0000f7da0000f8ec0000f9300000f9660000f9c00000f9fe0000fa32
-0000fa620000fa9e0000fade0000fb1c0000fb580000fb9a0000fbd00000
-fc0c0000fc4c0000fc720000fc960000fce60000fe420000fe980000fecc
-0000ff1a0000ff660000ffa80000ffe0000100160001005e000101000001
-029c00010464000105e6000107d80001092a00010aae00010b9000010d2a
-00010d9400010dbc00010e5a000110dc0001111c0001115c0001119c0001
-11da000112380001129600011304000113240001140e000114ae000114e4
-000115320001157c000115c6000115e2000115fe0001161e0001163e0001
-165e0001167e000116a4000116ca000116f000011716000117460001176e
-00011796000117c2000117ee000118220001184c00011878000118ae0001
-18d8000119040001193a000119640001198e000119c2000119f200011a26
-00011a6a00011a9a00011ace00011b1000011b4400011b7600011bb80001
-1bec00011c1c00011c5e00011ca200011ce800011d4400011d6000011d7c
-00011d9800011db400011dd000011f3e000121ea0001245a000124760001
-2490000124ac000124c8000124e4000125000001255c0001259600012600
-000126ca0001276a00012840000128c000012948000129b800012a4e0001
-2aac00012af200012b5000012bb200012c6a00012d2800012d5400012db0
-00012df400012f60000130540001307e0001309a000130c6000130fe0001
-314a0001318a000131be000131ee0001321e0001324e00013292000132c2
-000132f2000133320001336200013392000133c200013402000134320001
-346200013492000134b8000136bc000136ec0001371c0001386c00013a22
-00013a5200013a8000013ab000013ade00013b0e00013b3c00013b600001
-3b8400013bb400013d2400013d5c00013d8c00013f1e00013f4c00013f7a
-00013fa800013fd00001412e000142c6000142fe0001433e0001437a0001
-43aa000143d8000143f4000144240001445400014544000146ac000146dc
-000147160001475600014786000147b6000147f80001481e000148440001
-4884000148c4000148f40001493400014a1e00014a9e00014b8200014bb2
-00014be200014c1200014c4200014c7e00014cb000014ce200014d120001
-4d4200014d8800014dba00014dea00014e2000014e9200014ec600015094
-000151960001532600015556000157a6000159380001599c00015a260001
-5a3600015ac400015cc200015dee00015f5a0001604a000161ce000163e8
-000166140001670600016716000167260001683e0001684e0001685e0001
-686e0001687e0001688e000169ac000169bc000169cc00016a4000016a50
-00016b2000016b3000016c4200016c5200016c6200016c7200016dd00001
-6fae00016ff0000170260001705c0001708c000170bc0001711000017138
-000172c20001740a0001755e000176c60001784a000178ae00017a400001
-7b5c00017b6c00017b7c00017d0200017d1200017e7800017fd200018106
-00018264000183d200018598000185d800018610000186460001866c0001
-869c000186c200018838000188680001899e000189ae000189be00018a00
-00018a1000018ba400018d5000018eda00018f0200018f320001908e0001
-909e000191d6000191e600019280000193e0000193f000019656000197e0
-000199480001997800019aee00019c2000019c3000019c4000019c500001
-9d2a00019d3a00019d4a00019d5a00019e5200019fcc00019fdc0001a104
-0001a2380001a38a0001a51e0001a63c0001a7c80001a8da0001a9100001
-ab460001abe60001abf60001ad8c0001af2e0001afb20001b1340001b144
-0001b3ac0001b52c0001b6ac0001b6dc0001b87c0001ba020001bbc60001
-bcf20001bd020001be320001be420001be520001bf120001bf220001c108
-0001c1180001c24e0001c35c0001c5080001c6be0001c8000001c9700001
-cab80001cb0a0001ccec0001ce680001cea60001d04c0001d0700001d1b0
-0001d1c00001d1d00001d2080001d2180001d3a40001d50c0001d6800001
-d6a40001d6d40001d8420001d8f40001d9b20001d9e00001db960001dc8e
-0001dd1c0001de420001def00001dfc40001e00e0001e0860001e1460001
-e16e0001e1b20001e2080001e2e40001e32e0001e3620001e38a0001e3b2
-0001e3e60001e42a0001e46e0001e4ac0001e5ea0001e6a20001e7c20001
-e8380001e9060001e9580001e9ea0001ea9a0001eb8e0001ebe20001ec78
-0001ed360001ee200001eed20001eff20001f0440001f0ee0001f2240001
-f2fc0001f3e20001f4e80001f5ce0001f6b00001f7a40001f8420001f948
-0001fa420001faba0001fb320001fba80001fbde0001fc3a0001fd020001
-fd8e0001fdc60001fe0c0001fe3c0001fea60001ff660001ff9a0001ffca
-0001fffe0002002e0002005e0002008e0002022e00020266000202a60002
-02de00020316000203b2000204ac000204dc00020580000205ae000205ee
-0002063e0002066e000206ba00020852000209b800020b1800020b5e0002
-0bb200020bea00020d5c00020d9200020e2400020e6200020e9000020ece
-00020ffe0002102600021162000211f20002129c0002131e000213da0002
-14f20002160000021634000216ba0002181600021898000218e2000219ec
-00021a3400021b3800021bb400021c0c00021c9000021d7a00021e900002
-1f8c0002203600022126000221f8000222e2000223ca0002247a000224fc
-0002275a00022784000227ae0002286600022890000229d200022ad80002
-2bc200022bec00022c1600022c4000022c6a00022c9400022e1400022e3e
-00022e6800022e9200022ebc00022ee600022f1000022f3a00022f640002
-2f9800022fc200022fec0002301600023190000231a0000232ba000232ca
-000232f40002331e00023348000233720002351c00023738000238660002
-3876000239f200023a0200023b4800023d1400023e1a00023f9a0002413a
-0002435e000244b80002469a000247de0002490c000249fa00024a240002
-4a4e00024a7800024aa200024acc00024af600024b2000024b4a00024b74
-00024b9e00024bc800024bf200024c1c00024c4600024c7000024eac0002
-50280002516c000253540002549c000254c6000254f00002552000025550
-000255a0000255f000025630000256a2000256f600025754000257aa0002
-57e00002582200025868000258b2000258e20002591a0002594a00025a82
-00025dc800025df200025e1c00025e4600025e7000025e9a00025ec40002
-5eee00025f1800025f4200025f6c00025f9600025fc000025fea00026014
-0002603e0002606800026092000260bc000260e6000261100002613a0002
-61640002618e000261b8000261e20002620c0002623600026260000262fe
-000263140002633e0002661e0002662e000267480002686a000269a80002
-6aea00026c9000026ca000026de200026f3200027122000272f60002740e
-0002741e000274a00002752e0002762e0002763e000276de000276ee0002
-78040002795600027a8600027a9600027b6400027b7400027cea00027cfa
-00027e0e00027e1e00027f52000280e8000281a4000281b4000282b20002
-840c00028498000284a8000285d20002875e0002881a0002882a000288c6
-000288d6000289a4000289b400028a8c00028a9c00028ba400028bb40002
-8d7a00028d8a00028ee200028ef20002915c0002916c0002936600029376
-000294e0000294f0000295e0000295f00002978800029798000298b60002
-98c600029a0600029a1600029a2600029a3600029bae00029bbe00029bce
-00029bde00029d3000029e7e00029f4c0002a0300002a1b00002a3320002
-a4320002a5460002a68a0002a69a0002a7880002a8620002a9fe0002aa0e
-0002ab2c0002ac320002ae300002ae400002ae500002ae600002afaa0002
-afba0002b0720002b0820002b1900002b1a00002b28c0002b29c0002b3ba
-0002b3ca0002b4680002b4780002b4880002b5760002b6ea0002b8160002
-b9100002b9200002b9300002b9400002bade0002bc980002bd660002bd76
-0002bfd60002c21c0002c4a20002c7060002c98a0002cbfc0002cdcc0002
-cf820002cfac0002cfd60002cfe60002cff60002d0200002d04a0002d074
-0002d0840002d0940002d0be0002d0e80002d0f80002d1080002d1320002
-d15c0002d1860002d1960002d1a60002d1b60002d1c60002d1d60002d1e6
-0002d2100002d2200002d2300002d25a0002d2840002d2ae0002d2d80002
-d3020002d32c0002d3560002d3800002d3aa0002d3d40002d3fe0002d428
-0002d4520002d47c0002d4a60002d4d00002d4fa0002d5240002d54e0002
-d5780002d5a20002d5cc0002d5f60002d6200002d64a0002d6740002d69e
-0002d6c80002d6f20002d71c0002d7460002d7700002d79a0002d7c40002
-d7ee0002d8180002d8420002d86c0002d8960002d8c00002d8ea0002d914
-0002d93e0002d9680002d9920002d9bc0002d9e60002da100002da3a0002
-da640002da8e0002dab80002dae20002db0c0002dbac0002dbf00002dc66
-0002dc900002dcba0002dce40002dd0e0002dd380002dd620002dd8c0002
-ddb60002dde00002de0a0002de340002de5e0002de880002deb20002dedc
-0002df060002df300002df5a0002df840002dfae0002dfd80002e0020002
-e02c0002e0560002e08a0002e0be0002e0f20002e2840002e4200002e5bc
-0002e7480002e78e0002e7d40002e8420002e89e0002e8f00002e9600002
-ea380002eb040002ebdc0002eca80002ed480002ee620002ef160002ef98
-0002eff20002f0320002f1500002f29a0002f4320002f48e0002f4ec0002
-f5480002f5a40002f6580002f70e0002f7ba0002f8660002f9120002f9ca
-0002fa820002fb3a0002fb4c0002fb5e0002fb700002fb820002fb940002
-fc020002fc700002fd280002fd3a0002fd4c0002fd5e0002fd6e0002fd80
-0002fd920002fda40002fdb60002fdc80002fdda0002fe880002ff340002
-ffe20003008e00030126000301600003018a000301b4000302080003025a
-000302d6000303200003039c000303f000030474000304c60003053c0003
-0594000305fa00030650000306aa0003072800030774000307d200030836
-00030884000308d20003092a000309720003099c000309ca000309f00003
-0a2400030a5400030a8400030ad600030b4400030b9a00030c0e00030c62
-00030cd600030d1c00030d8400030dca00030e2600030e5600030e900003
-0eb600030ee600030f0c00030f3200030f6400030f9400030fe60003104c
-000310a2000311080003115c000311ca0003120c0003126c000312ae0003
-12fa0003133400031370000313aa000313e60003141a0003144c0003147c
-000314ac000314d6000314fc00031526000315540003157e000315ca0003
-160e0003164400031680000316b4000316e200031720000317500003178a
-000317b4000317e2000318080003182e0003185a000318b6000318e60003
-1916000319460003197e000319b2000319e000031a1000031a4000031a70
-00031aa000031ad400031b2a00031b5e00031bbe00031bf200031c4a0003
-1c7e00031cda00031d7800031e4600031f660003202e000320be00032154
-000323400003253c000326b400032830000329da00032b8c00032c740003
-2daa00032ea200032fb4000330d20003320800033372000334e000033676
-000337f2000339020003391200033a3e00033b7a00033cbc00033e400003
-3f1a00033f9000034046000340ec0003425c000342940003430e000343d0
-0003448a000344f2000345f80003472e000347fa00034958000349d20003
-4a4c00034b1800034bd200034c8600034ce200034d3c00034d8400034df4
-00034e7000034eba00034ef400034f3a00034f7e00034fd0000350220003
-50a40003512600035168000351a8000351de000352140003524200035270
-000352a4000352d80003531a0003535c00035398000353d40003540e0003
-54480003547a000354ac000354de000355100003554a00035584000355c6
-000356080003564a0003568c000356da000357280003576a000357ac0003
-57ec0003582c00035866000358a0000358ec0003593800035976000359b6
-000359fc00035a4200035a7e00035ad400035b1000035b4c00035b8c0003
-5bcc00035c0800035c4400035c8400035cc400035d0800035d4c00035da0
-00035e2e00035e7000035eb200035f1a00035f8200035fb400035fe60003
-601e00036056000360ec00036182000361cc00036216000362520003628e
-000362e40003633a00036384000363ce000364260003647e000364be0003
-64fe000365360003656e000365b800036602000366400003667e000366c0
-0003670200036756000367aa000367f0000368360003687c000368c20003
-69180003696e000369c400036a1a00036a6600036ab200036afe00036b4a
-00036bbe00036c3200036ca600036d1a00036d5800036d9600036dd40003
-6e1200036e5000036e8e00036ed200036f1600036f6200036fae0003700e
-0003705a00037098000370e6000371f60003724600037296000372ce0003
-73060003735c000373b2000374260003748a000374cc0003750e00037564
-000375b2000375fe0003764a0003768a000376ca000377120003775a0003
-77c6000378200003785800037890000378d000037910000379e000037adc
-00037b9c00037c8a00037ce000037d3600037d8800037ddc00037e400003
-7ea400037efa00037f5000037fc60003803c0003807e000380c000038102
-0003814400038186000381c80003821e00038274000382c60003831a0003
-83a200038424000384c400038566000385a4000385e2000386200003865c
-0003869a000386d80003871600038752000388360003892200038a380003
-8b5400038c1e00038ce800038de200038edc00038fda000390d8000391f6
-000393140003943a000395600003966200039764000397f6000398880003
-98c6000399040003995e000399b8000399f000039a2800039b3800039b48
-00039b9000039bd800039c3000039c8800039cba00039cec00039d2e0003
-9d7000039daa00039de400039e2800039e6c00039ee400039f5e00039fee
-0003a0320003a0720003a0f40003a1760003a2ce0003a2de0003a32c0003
-a37a0003a3b60003a3f20003a4380003a47e0003a4cc0003a51a0003a56a
-0003a5ba0003a6160003a6720003a7e80003a9500003a9880003a9c20003
-aa0e0003aa5a0003aaac0003aafe0003ab500003aba60003abe20003ac1e
-0003ac740003acc80003ae000003aea00003aeee0003af2e0003af680003
-b0fe0003b3820003b4460003b5dc0003b73a0003b8080003b9ae0003bc02
-0003be3a0003be800003beb20003bf5c0003c0800003c0a40003c13e0003
-c24a0003c35a0003c46a0003c5780003c6fe0003c7300003c7d20003c7fa
-0003c85c0003c8be0003c9200003c9820003c9c00003c9fe0003ca380003
-ca720003ca9e0003caea0003cb240003cb5e0003ccba0003ce0e0003ce1e
-0003cedc0003d0120003d0700003d1880003d3160003d3bc0003d5020003
-d5400003d57e0003d5bc0003d6100003d6380003d6920003d6f60003d73e
-0003d7a00003d8000003d8720003d8ee0003d96a0003d9ec0003da780003
-db040003db8e0003dc0e0003dc480003dc840003dde80003deb20003dee2
-0003df120003e04a0003e19a0003e1aa0003e2980003e36c0003e4640003
-e55a0003e6dc0003e8360003e8460003e95e0003ea0a0003eb4c0003eca2
-0003ecfe0003ee5c0003eeea0003f0900003f2020003f3160003f34e0003
-f3b20003f5620003f6cc0003f72e0003f8960003f99c0003fa520003fafe
-0003fc260003fd140003fdf40003ff34000400600004017a000402ea0004
-046400040474000405540004064a000406fa000407f6000408a2000409ac
-00040a9800040bc200040ce600040dea00040f1800041056000411c20004
-12f80004148c000416340004172c000418400004197200041a6400041a9c
-00041af200041ba000041bb000041c1200041c6e00041cd400041d200004
-1d6000041d9800041dc400041df200041e2c00041f6200041f960004201a
-000420d00004210000042184000421b4000421ec00042384000425100004
-255a00042594000425ea000426360004265c00042682000426c400042706
-0004274800042778000427b0000427e60004281c0004285e0004288e0004
-28be000429b400042ab800042aec00042b2400042b6a00042b9e00042bce
-00042c0600042c3a00042c6e00042c9e00042cce00042d0400042d3a0004
-2d6a00042d9a00042dce00042e0200042e3200042e6200042e9c00042ed0
-00042f0200042f3400042f6800042f9c00042fcc00042ffc0004302a0004
-305800043166000432d2000434060004353a0004356a000435a40004363e
-000437a800043904000439c800043adc00043b0c00043b4000043c380004
-3de800043e4000043eb800043ff400044032000440a4000440d400044104
-0004413e000441c6000441f600044226000443b6000445000004460c0004
-471a000448460004499c00044af800044c5800044d9200044f0400045064
-000450740004522a00045352000453ec0004557400045584000456800004
-58060004595e00045a1000045ae000045bec00045c9600045cce00045cde
-00045d8e00045e3400045eb000046000000460f4000461ea000462f60004
-63ce000464a80004653c0004664e000467de000468fc000469f200046a9c
-00046b4600046c1000046cb800046d8e00046e0a00046e6600046fc80004
-70fc000472980004735a0004745a00047532000476700004771c000477e6
-000478d6000479fc00047ad800047bde00047d1600047e0600047ea40004
-7f960004810600048250000484bc0004858e000486420004871000048804
-000489420004895200048a8600048b9800048ba800048cb400048de40004
-8e3800048fac000490d4000491e80004939a000495ae00049842000499fc
-00049b2800049d0800049eca0004a05c0004a1280004a2c40004a33a0004
-a3e80004a4c40004a5500004a5f20004a6940004a7780004a8b00004ab0c
-0004ac540004ac640004ac740004acd60004ad340004ad960004ae340004
-aecc0004afd00004b0be0004b0ce0004b0de0004b1780004b2120004b24e
-0004b2ca0004b33e0004b3940004b3c80004b44e0004b4da0004b5520004
-b5b00004b64a0004b6dc0004b75c0004b7de0004b8720004b8a60004b908
-0004b9ba0004bb800004bbb80004bd940004bea80004beb80004beee0004
-bf320004bf760004bfba0004bff00004c0220004c0640004c1000004c156
-0004c1fc0004c2740004c2fa0004c36a0004c3cc0004c4520004c4b20004
-c51c0004c5900004c6000004c65e0004c7040004c79c0004c8080004c898
-0004c8f60004c9640004ca0c0004cab80004cb4e0004cbb80004cc3a0004
-cc9e0004cd4a0004ce020004ceae0004cf3c0004cf980004d0040004d05a
-0004d0dc0004d15a0004d1e00004d26c0004d2c60004d3320004d3a20004
-d4120004d4820004d5060004d5960004d5fc0004d6760004d6f20004d76a
-0004d8100004d8ac0004d93c0004d99a0004da380004dab40004db460004
-dbe80004dc920004dd2a0004dd860004dddc0004de440004deea0004df92
-0004e05c0004e1020004e1640004e1bc0004e21c0004e2aa0004e3300004
-e3be0004e41e0004e4820004e4ec0004e5540004e5bc0004e63a0004e6c2
-0004e7560004e7c20004e82a0004e88e0004e9360004e9f00004ea9e0004
-eb2c0004eb8a0004ebf60004ec660004ed0c0004edb60004ee780004ef1a
-0004ef7e0004f00e0004f0800004f1100004f18e0004f20a0004f2760004
-f3040004f3600004f3be0004f4440004f4c00004f5280004f58c0004f5e0
-0004f64e0004f6b60004f7340004f7aa0004f8240004f8a40004f9000004
-f9660004f9ca0004fa6a0004fb0c0004fbc20004fc720004fcce0004fd46
-0004fda40004fe2e0004fec60004ff560004ffbc0005001a000500a80005
-011a000501ae00050246000502b6000503260005039e000503fc0005045c
-000504d60005053000050590000505ea00050646000506ae0005073c0005
-0772000507aa0005083600050860000508a20005093600050a2400050ab4
-00050aea00050b3a00050bac00050c5800050cea00050d4200050d9c0005
-0df400050e4e00050ed200050f5800050ffc000510a4000510e200051152
-000511e60005127e00051314000513be000513f000051440000514940005
-14da0005157e000516080005168e000516ee000517320005178000051820
-000518b000051950000519f600051a9c00051b6000051b9200051bbc0005
-1c4200051cf200051d2400051d4c00051e1a00051e7800051f1200051f60
-00051fc60005206e000520dc00052142000521ce00052240000522b60005
-236a000523c40005243400052470000524c200052548000525a80005264c
-0005272c00052854000529e400052a4000052a9600052dbc00052e560005
-2eb200052efa00053068000531ba000532000005330e000533a6000534b4
-000535be0005366000053748000537da000538760005396800053a680005
-3ae400053b6a00053bb200053d2400053e8000053f6400053fb400053fe8
-000540d6000541fe00054398000544c8000545de000547120005482e0005
-489c0005493000054a7000054b2600054c9000054dc000054ef20005501e
-000550ca0005519000055262000553bc0005553c0005566c000557880005
-594200055a9400055b8000055c5c00055d1e00055e8800055fd800055fe8
-00055ff800056008000560c000056176000561b2000561e8000562200005
-6256000563e2000565f6000566e0000567f80005697000056ade00056bc8
-00056cfa00056e4200056fc800057166000572ba000574a80005766e0005
-78a400057af200057bda00057cb600057dfe00057f800005806800058182
-000581c40005820e0005842a000586420005878e0005890400058b620005
-8d6400058de800058e1800058e6400058f2c00058ffc0005919000059218
-00059280000592c0000592fe000594b0000596e000059816000599f80005
-9ad400059bee00059d9a00059fa60005a0a80005a1940005a3860005a58e
-0005a6fa0005a87e0005a9de0005ab4c0005abda0005ac6a0005ad840005
-ae900005b0520005b1be0005b3ae0005b5780005b60c0005b6a80005b73e
-0005b7c60005b8ac0005b9840005bb1e0005bcb00005bcd60005bcfc0005
-bd0c0005bd3c0005bd6c0005bee60005c0880005c1320005c2140005c2d4
-0005c37e0005c4180005c4fa0005c5b80005c6940005c84a0005c9840005
-ca100005ca400005ca700005caa40005cad80005cae80005caf80005cb28
-0005cb580005cb8c0005cbc00005cbf40005cc280005cc5c0005cc900005
-ce0a0005ce1a0005ce4a0005ce7a0005ceb20005cee60005cf1a0005cf4e
-0005cf820005cfb60005cfea0005d0220005d0580005d0880005d0c80005
-d1000005d1480005d18e0005d1c20005d1f60005d2300005d2680005d308
-0005d3180005d46a0005d6320005d7d80005d9820005dace0005dbe40005
-dcf20005de080005df020005dfea0005e10c0005e2080005e2e00005e3d0
-0005e48c0005e53e0005e6080005e67a0005e7200005e7b00005e8140005
-e9220005e9880005ea360005eb2c0005eb940005ebfc0005ecac0005ee86
-0005ef8a0005f00a0005f0480005f0f40005f1820005f26a0005f3020005
-f3680005f4660005f5280005f5e20005f6200005f6b00005f7b20005f846
-0005f88a0005f9a80005fad20005fcb40005fe760005ffac000600da0006
-01da000602020006022a0006026000060292000602be000602e60006030e
-0006033c0006039a000604080006044000060478000604a8000604ce0006
-0502000605380006055e00060584000605b2000605e00006060c00060682
-000606aa0006070c00060732000607580006077e000607a4000607d40006
-0804000608340006086e0006089e000608d400060904000609360006095c
-00060982000609b6000609ec00060a1c00060a4c00060a7200060a980006
-0abe00060aec00060b2000060ba600060bea00060c2400060c5800060c9c
-00060cd600060d1000060d3600060d6000060dac00060dee00060e140006
-0e4200060e6800060e8e00060ece00060f0000060f3000060f6000060f86
-00060fac00060fdc0006100c00061032000610580006107e000610a40006
-10ca000610f000061118000611a0000611ca0006123e00061266000612dc
-000613040006136600061398000613ca000613fa00061432000614640006
-1492000614cc000614f40006155400061596000615c6000615f200061622
-000616520006167a000616a2000616ca0006172c00061754000617b20006
-17f60006183a0006186a000618a0000618c6000618ee000619140006193c
-000619620006198a000619b2000619dc00061a0200061a2800061a4e0006
-1a8000061aa800061b2e00061b5800061bc200061bf200061c2200061c48
-00061c6e00061cc600061cf600061d3200061d5c00061d8c00061dbc0006
-1df000061e2400061e5400061e9400061ece00061f1600061f3c00061f62
-00061f8800061fae00061fd4000620140006205400062090000620c00006
-20f0000621200006215000062188000621c000062200000622400006227a
-000622b4000622f00006232e00062378000623c2000624080006244e0006
-2490000624d20006250200062532000625660006259a000625d40006260e
-0006265a000626a6000626fe00062756000627ae0006280c0006283c0006
-286c000628a2000628d80006290e0006294a0006297e000629b200062a06
-00062a5a00062aae00062b0200062b5600062baa00062c0200062c5a0006
-2c8800062cb600062ce800062d1a00062d6000062da600062dd800062e0a
-00062e5c00062eb400062ef800062f3c00062f8000062fc4000630180006
-306c0006309c000630cc000631020006313800063176000631bc00063210
-0006325a000632ac000632fe0006335e000633be000633ee000634200006
-345a00063494000634e60006353a00063584000635cc0006360e00063678
-000636c6000637120006374400063776000637aa000637de000638140006
-384a00063888000638be000638f00006392c00063982000639d800063a36
-00063a9400063aea00063b4000063b7400063ba400063be800063c1e0006
-3c4e00063c9200063cd000063d0800063d4000063d7600063db200063de2
-00063e1e00063e5e00063ea400063eee00063f3a00063f8600063fdc0006
-403200064080000640ce0006411c0006416c000641c8000642240006427c
-000642d4000643280006437c000643be0006440000064448000644900006
-44d8000645260006456a000645ae000646140006467a000646e000064746
-000647ac000648120006487c000648e60006492e00064976000649be0006
-4a0600064a5200064a9e00064af200064b3e00064b8200064bd000064c38
-00064ca000064d1000064d8000064de800064e5000064e9000064ece0006
-4f1800064f4200064f8800064fc00006500e0006503e0006506e000650aa
-000650de000651040006515800065196000651ea000652d0000653f80006
-543a00065460000654b6000654e60006552800065570000655be00065608
-000656580006567e000657660006584a0006599c000659ca000659f80006
-5a8c00065b1200065b4000065bca00065bfa00065c2a00065c7800065cc6
-00065daa00065e8600065fca00065ffa0006602a000660c0000661480006
-6178000661a8000661d80006626800066298000662c80006631a00066362
-000663b80006644e000664e60006655a000665ac000665d60006662c0006
-6660000666aa000666e20006673200066770000667bc000667e20006685e
-000668b0000669c200066bcc00066d8000066f0200067074000673160006
-75e6000677a6000678ec00067b4600067c8800067e9e00067ef000067f40
-00067f9600067fec0006804e000680d600068324000684b6000686c20006
-87de0006899200068b1400068bd400068cb600068d1e00068d8000068df6
-00068e5e00068f0a00068f7a0006900a0006911e000691e20006922e0006
-92c40006937000069414000694be000695080006954a000695c000069628
-000696b800069766000697d0000698340006989a00069954000699ea0006
-9a4800069a7200069a9c00069aac00069abc00069b7e00069c8200069e8c
-00069fe200069ff20006a0a20006a1860006a1e60006a1f60006a2520006
-a2b00006a3d00006a4be0006a4ce0006a4de0006a4ee0006a4fe0006a5e4
-0006a6e40006a8bc0006aa780006ab7e0006abf80006ac720006ad240006
-ad340006ae420006ae520006ae620006af240006b0580006b1440006b154
-0006b1640006b1740006b2da0006b4460006b5720006b5820006b5920006
-b5a20006b5b20006b6940006b6a40006b8060006b9100006ba0e0006bb46
-0006bc180006bc960006bd140006be340006beb00006befc0006bf880006
-c09c0006c0f00006c2320006c2f20006c3be0006c4b40006c5be0006c670
-0006c7d60006c83c0006c9000006cb020006cc900006ce0e0006cf3e0006
-d1f00006d3320006d4600006d5d80006d7500006d8d00006da5e0006dc10
-0006dc7e0006dde20006df1a0006e01e0006e1540006e2860006e3560006
-e4260006e5820006e65c0006e6fc0006e8000006e92a0006ea280006eba8
-0006ed120006ee500006efc80006f1140006f1f60006f25e0006f3000006
-f3a00006f49e0006f6060006f7400006f8d40006fa1e0006fb020006fb60
-0006fc660006fcfc0006fdbe0006fe640006fea400070050000701220007
-01e800070310000704b0000705bc00070614000707ac0007083a0007084c
-0007087c000708ac000708e40007091c000709520007098e000709c40007
-0a0000070b6e00070bb800070c5200070cea00070d6400070de800070e4e
-00070efa00070f46000710660007111c000711f20007122a000712680007
-12dc000713d6000714f4000715f6000716380007167a000716e8000716f8
-000717080007171800071728000717380007174800071758000717680007
-17780007178800071798000717980007191c0007192c000719ec00071ab2
-00071be800071dde00071fe0000721dc00072412000726120007267e0007
-27900007292200072a7a00072b2c00072b7000072c0e00072d3e00072d8e
-00072e2400072f6000072f70000731260007325a000732aa000733000007
-33c20007340600073448000734ce0007352c0007361e000736ac000736e2
-0007375c000737d4000738240007393000073a2600073ad000073afa0007
-3b2400073b4e00073b7800073bb800073bf800073c3000073c6800073cb2
-00073cfc00073d3c00073d7c00073dc600073e1000073e5000073e900007
-3eea00073f4400073f7e00073fb800073ffc0007404000074084000740c8
-0007411c00074170000741bc00074208000742460007428a000742da0007
-432a00074384000743e20007440c00074436000744d00007456a000745ae
-000745f2000747080007471800074760000747a8000747fa0007484c0007
-48b60007490a00074956000749b400074a3e00074aa200074ae600074b30
-00074b9800074be200074c2200074c6a00074ca600074ce200074d1e0007
-4d5800074d9a00074ddc00074e1c00074e5c00074ea600074ef000074f46
-00074f9e00074fec0007503a0007507c000750ca0007510c000751560007
-5198000751dc0007523800075294000752e00007532c00075376000753c0
-000753fe0007543c000754ba0007553800075572000755ac000756460007
-56e0000757b400075888000758e400075940000759b400075a2800075b86
-00075b9600075c8000075c9000075cc600075cfc00075d3600075d700007
-5dac00075de800075e2e00075e7400075fda00076190000762dc0007649a
-00076610000767b8000768e8000769ee00076c0c00076d5000076ee60007
-706e000770ec0007723000077438000774cc00077560000776b4000777de
-0007795800077a9800077c0400077cf200077ebc00078050000780d20007
-8204000782ee0007845600078538000786ee000787e00007894200078a7e
-00078b7200078d3600078ebe00079062000791c600079362000795200007
-96a600079742000798b6000799a800079a9000079c1000079d6200079e82
-0007a01a0007a1f00007a37e0007a4280007a4de0007a6900007a7340007
-a7c20007a80e0007a85a0007a8d20007a9b00007aa2a0007aacc0007ab20
-0007ac840007adb00007aec20007afc40007b08c0007b2000007b3400007
-b5660007b6100007b73a0007b83e0007b9de0007baca0007bbc40007bcc2
-0007bda80007bec20007c07c0007c22a0007c3980007c4100007c4840007
-c5a20007c6260007c7280007c8b40007ca2c0007cb620007cc6c0007cde2
-0007cf5a0007d14c0007d33a0007d5000007d5740007d6240007d6da0007
-d78a0007d8480007d9420007da460007db400007dc4c0007dcd40007dd62
-0007ddea0007de7e0007df5a0007e0500007e1340007e22a0007e2be0007
-e37a0007e40e0007e4cc0007e5bc0007e6c40007e7c20007e8d60007e9f8
-0007eb0c0007ec4c0007ed860007eea80007efbc0007f1000007f2540007
-f4680007f61a0007f6ce0007f7ea0007f8c00007f9de0007fabc0007fc50
-0007fd0a0007fda60007fe980007ff800008006c000800ea000801e40008
-03220008044e00080482000804c6000804d600080576000806180008070e
-000807fa000808d4000809ac00080b0a00080c6a00080d0800080d9e0008
-0ddc00080e1c00080e5a00080e9a00080ef400080f4c00080fa60008100a
-0008109600081292000812e20008140e0008149400081514000815ee0008
-16c2000817c6000819b200081aca00081b3a00081bca00081c8c00081d5e
-00081dca00081e4800081f9c00081fe2000820280008210c000821480008
-21a6000821e4000822160008225a0008229c000822cc000100000d3500f2
-003c009d000700020010002f005600000468041d0005000200>
-<0000003a02be0000000300000000006a00000000000300000001000a006a
-0000000300000002000e00740000000300000003005e0082000000030000
-0004000a00e00000000300000005001800ea0000000300000006000e0102
-000000030000000700ba01100000000300000008003001ca000000030000
-0009008a01fa000000030000000d02aa028400010000000000000035052e
-000100000000000100050563000100000000000200070568000100000000
-0003002f056f00010000000000040005059e0001000000000005000c05a3
-0001000000000006000705af0001000000000007005d05b6000100000000
-00080018061300010000000000090045062b000100000000000d01550670
-0003000104030002000c07c50003000104050002001007d1000300010406
-0002000c07e10003000104070002001007ed0003000104080002001007fd
-0003000104090000006a080d0003000104090001000a0877000300010409
-0002000e08810003000104090003005e088f0003000104090004000a08ed
-0003000104090005001808f70003000104090006000e090f000300010409
-000700ba091d0003000104090008003009d70003000104090009008a0a07
-000300010409000d02aa0a9100030001040a0002000c0d3b00030001040b
-000200100d4700030001040c0002000c0d5700030001040e0002000c0d63
-0003000104100002000e0d6f000300010413000200120d7d000300010414
-0002000c0d8f000300010415000200100d9b0003000104160002000c0dab
-0003000104190002000e0db700030001041b000200100dc500030001041d
-0002000c0dd500030001041f0002000c0de10003000104240002000e0ded
-00030001042a0002000e0dfb00030001042d0002000e0e0900030001080a
-0002000c0e170003000108160002000c0e23000300010c0a0002000c0e2f
-000300010c0c0002000c0e3b00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0052006500670075006c00610072004d006f006e006f
-0074007900700065003a0041007200690061006c00200052006500670075
-006c00610072003a00560065007200730069006f006e00200035002e0030
-003100200028004d006900630072006f0073006f00660074002900410072
-00690061006c00560065007200730069006f006e00200035002e00300031
-0041007200690061006c004d00540041007200690061006c002000690073
-00200061002000740072006100640065006d00610072006b0020006f0066
-00200054006800650020004d006f006e006f007400790070006500200043
-006f00720070006f0072006100740069006f006e00200069006e00200074
-0068006500200055006e0069007400650064002000530074006100740065
-007300200061006e0064002f006f00720020006f00740068006500720020
-0063006f0075006e00740072006900650073002e0054006800650020004d
-006f006e006f007400790070006500200043006f00720070006f00720061
-00740069006f006e004d006f006e006f0074007900700065002000540079
-00700065002000440072006100770069006e00670020004f006600660069
-006300650020002d00200052006f00620069006e0020004e006900630068
-006f006c00610073002c0020005000610074007200690063006900610020
-005300610075006e0064006500720073002000310039003800320059006f
-00750020006d006100790020007500730065002000740068006900730020
-0066006f006e007400200074006f00200064006900730070006c00610079
-00200061006e00640020007000720069006e007400200063006f006e0074
-0065006e00740020006100730020007000650072006d0069007400740065
-006400200062007900200074006800650020006c006900630065006e0073
-00650020007400650072006d007300200066006f00720020007400680065
-002000700072006f006400750063007400200069006e0020007700680069
-006300680020007400680069007300200066006f006e0074002000690073
-00200069006e0063006c0075006400650064002e00200059006f00750020
-006d006100790020006f006e006c0079002000280069002900200065006d
-0062006500640020007400680069007300200066006f006e007400200069
-006e00200063006f006e00740065006e0074002000610073002000700065
-0072006d0069007400740065006400200062007900200074006800650020
-0065006d00620065006400640069006e0067002000720065007300740072
-0069006300740069006f006e007300200069006e0063006c007500640065
-006400200069006e0020007400680069007300200066006f006e0074003b
-00200061006e006400200028006900690029002000740065006d0070006f
-0072006100720069006c007900200064006f0077006e006c006f00610064
-0020007400680069007300200066006f006e007400200074006f00200061
-0020007000720069006e0074006500720020006f00720020006f00740068
-006500720020006f00750074007000750074002000640065007600690063
-006500200074006f002000680065006c00700020007000720069006e0074
-00200063006f006e00740065006e0074002ea9203230303620546865204d
-6f6e6f7479706520436f72706f726174696f6e2e20416c6c205269676874
-732052657365727665642e417269616c526567756c61724d6f6e6f747970
-653a417269616c20526567756c61723a56657273696f6e20352e30312028
-4d6963726f736f667429417269616c56657273696f6e20352e3031417269
-616c4d54417269616c20697320612074726164656d61726b206f66205468
-65204d6f6e6f7479706520436f72706f726174696f6e20696e2074686520
-556e697465642053746174657320616e642f6f72206f7468657220636f75
-6e74726965732e546865204d6f6e6f7479706520436f72706f726174696f
-6e4d6f6e6f7479706520547970652044726177696e67204f666669636520
-2d20526f62696e204e6963686f6c61732c20506174726963696120536175
-6e646572732031393832596f75206d617920757365207468697320666f6e
-7420746f20646973706c617920616e64207072696e7420636f6e74656e74
-206173207065726d697474656420627920746865206c6963656e73652074
-65726d7320666f72207468652070726f6475637420696e20776869636820
-7468697320666f6e7420697320696e636c756465642e20596f75206d6179
-206f6e6c792028692920656d626564207468697320666f6e7420696e2063
-6f6e74656e74206173207065726d69747465642062792074686520656d62
-656464696e67207265737472696374696f6e7320696e636c756465642069
-6e207468697320666f6e743b20616e6420286969292074656d706f726172
-696c7920646f776e6c6f6164207468697320666f6e7420746f2061207072
-696e746572206f72206f74686572206f7574707574206465766963652074
-6f2068656c70207072696e7420636f6e74656e742e004e006f0072006d00
-61006c006f00620079010d0065006a006e00e9006e006f0072006d006100
-6c005300740061006e0064006100720064039a03b103bd03bf03bd03b903
-ba03ac00a90020003200300030003600200054006800650020004d006f00
-6e006f007400790070006500200043006f00720070006f00720061007400
-69006f006e002e00200041006c006c002000520069006700680074007300
-2000520065007300650072007600650064002e0041007200690061006c00
-52006500670075006c00610072004d006f006e006f007400790070006500
-3a0041007200690061006c00200052006500670075006c00610072003a00
-560065007200730069006f006e00200035002e0030003100200028004d00
-6900630072006f0073006f0066007400290041007200690061006c005600
-65007200730069006f006e00200035002e00300031004100720069006100
-6c004d00540041007200690061006c002000690073002000610020007400
-72006100640065006d00610072006b0020006f0066002000540068006500
-20004d006f006e006f007400790070006500200043006f00720070006f00
-72006100740069006f006e00200069006e00200074006800650020005500
-6e0069007400650064002000530074006100740065007300200061006e00
-64002f006f00720020006f007400680065007200200063006f0075006e00
-740072006900650073002e0054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-4d006f006e006f0074007900700065002000540079007000650020004400
-72006100770069006e00670020004f006600660069006300650020002d00
-200052006f00620069006e0020004e006900630068006f006c0061007300
-2c0020005000610074007200690063006900610020005300610075006e00
-64006500720073002000310039003800320059006f00750020006d006100
-7900200075007300650020007400680069007300200066006f006e007400
-200074006f00200064006900730070006c0061007900200061006e006400
-20007000720069006e007400200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-200074006800650020006c006900630065006e0073006500200074006500
-72006d007300200066006f00720020007400680065002000700072006f00
-6400750063007400200069006e0020007700680069006300680020007400
-680069007300200066006f006e007400200069007300200069006e006300
-6c0075006400650064002e00200059006f00750020006d00610079002000
-6f006e006c0079002000280069002900200065006d006200650064002000
-7400680069007300200066006f006e007400200069006e00200063006f00
-6e00740065006e00740020006100730020007000650072006d0069007400
-7400650064002000620079002000740068006500200065006d0062006500
-6400640069006e0067002000720065007300740072006900630074006900
-6f006e007300200069006e0063006c007500640065006400200069006e00
-20007400680069007300200066006f006e0074003b00200061006e006400
-200028006900690029002000740065006d0070006f007200610072006900
-6c007900200064006f0077006e006c006f00610064002000740068006900
-7300200066006f006e007400200074006f00200061002000700072006900
-6e0074006500720020006f00720020006f00740068006500720020006f00
-750074007000750074002000640065007600690063006500200074006f00
-2000680065006c00700020007000720069006e007400200063006f006e00
-740065006e0074002e004e006f0072006d0061006c004e006f0072006d00
-610061006c0069004e006f0072006d0061006c004e006f0072006d00e100
-6c004e006f0072006d0061006c0065005300740061006e00640061006100
-720064004e006f0072006d0061006c004e006f0072006d0061006c006e00
-79004e006f0072006d0061006c041e0431044b0447043d044b0439004e00
-6f0072006d00e1006c006e0065004e006f0072006d0061006c004e006f00
-72006d0061006c004e0061007600610064006e006f0074006801b001a103
-00006e00670041007200720075006e00740061004e006f0072006d006100
-6c004e006f0072006d0061006c004e006f0072006d0061006c004e006f00
-72006d0061006c000000b900540328b326181fd0bc032900e00329000203
-29b22b1d1fb90327031db23b1f40b80323b31215320f412d03200001002f
-0320000100200320006f032000af032000bf03200004005f031e00010010
-031e007f031e0080031e00af031e00bf031e00d0031e00060000031e0010
-031e0020031e006f031e009f031e00e0031e0006031d031cb2201f104127
-0319007f03190002000f031700ef031700ff03170003001f0317002f0317
-004f0317005f0317008f0317009f03170006000f0317005f0317006f0317
-007f031700bf031700f00317000600400317b2923340b80317b28b3340b8
-0317b36a6c3240b80317b2613340b80317b35c5d3240b80317b357593240
-b80317b34d513240b80317b344493240b80317b23a3340b80317b3313432
-40b80317b32e423240b80317b3272c3240b80317b312253280b80317b30a
-0d32c04116031600d00316000200700316000102c4000f0101001f00a003
-1500b0031500020306000f0101001f00400312b32426329fbf0304000103
-0203010064001fffc00301b20d1132410a02ff02ef0012001f02ee02ed00
-64001fffc002edb30e11329f414a02e200af02e200bf02e2000302e202e2
-02e102e1007f02e00001001002e0003f02e0009f02e000bf02e000cf02e0
-00ef02e0000602e002e002df02df02de02de000f02dd002f02dd003f02dd
-005f02dd009f02dd00bf02dd00ef02dd000702dd02dd001002dc00010000
-02dc0001001002dc003f02dc000202dc02dc001002db000102db02db000f
-02da000102da02daffc002d3b2373932b9ffc002d3b22b2f32b9ffc002d3
-b21f2532b9ffc002d3b2171b32b9ffc002d3b2121632b802d2b2f9291fb9
-0326031cb23b1f40bb0322003e00330322b225311fb80318b23c691fb802
-e3b3202b1fa0413002d400b002d40002000002d4001002d4002002d40050
-02d4006002d4007002d40006006002d6007002d6008002d6009002d600a0
-02d600b002d60006000002d6001002d6002002ca002002cc002002d60030
-02d6004002d6005002d6000802d0b2202b1fb802cfb226421f411602ce02
-c70017001f02cd02c80017001f02cc02c60017001f02cb02c50017001f02
-c902c5001e001f02ca02c6b21e1f00410b02c6000002c7001002c6001002
-c7002f02c5000502c1b324121fff411102bf0001001f02bf002f02bf003f
-02bf004f02bf005f02bf008f02bf000602bf0222b2641f12410b02bb00ca
-0800001f02b200e90800001f02a600a20800406a1f402643493240204349
-3240263a3d3240203a3d329f209f26024026969932402096993240268e92
-3240208e92324026848c324020848c3240267a813240207a813240266c76
-3240206c76324026646a324020646a3240265a5f3240205a5f3240264f54
-3240204f5432b8029eb724271f374f6b0120410f02770030027700400277
-00500277000402770277027700f90400001f029bb22a2a1fb8029a402b29
-2a1f80ba0180bc0180520180a201806501807e01808101803c01805e0180
-2b01801c01801e0180400180bb0138000100800140b40180400180bb0138
-00010080013940180180ca0180ad01807301802601802501802401802001
-3740b80221b2493340b80221b2453340b80221b341423240b80221b33d3e
-320f410f0221003f0221007f0221000300bf022100cf022100ff02210003
-00400221b320223240b80221b3191e3240b80222b32a3f3240b80221b32e
-3a326f414802c3007f02c3008f02c300df02c30004002f02c3006002c300
-cf02c30003000f02c3003f02c3005f02c300c002c300ef02c300ff02c300
-0600df02220001008f02220001000f0222002f0222003f0222005f022200
-7f022200ef0222000600bf022100ef02210002006f0221007f022100af02
-210003002f0221003f0221004f0221000302c302c3022202220221022140
-1d101c102b1048038f1c010f1e014f1eff1e023700161600000012110811
-b8010db6f70df8f70d00094109028e028f001d001f0290028f001d001f02
-8fb2f91d1fb80198b226bb1f41150197001e0401001f013900260125001f
-013800730401001f0135001c0801001f0134001c02ab001f0132b21c561f
-b8010fb2262c1fba010e001e0401b61ff91ce41fe91cb80201b61fe81cbb
-1fd720b80401b21fd51cb802abb61fd41c891fc92fb80801b21fbc26b801
-01b21fba20b80201b61fb91c381fadcab80401b21f8126b8019ab21f7e26
-b8019ab61f7d1c471f6b1cb80401b21f6526b8019ab21f5e73b80401400f
-1f52265a1f481c891f441c621f4073b80801b61f3f1c5e1f3c26b8019ab2
-1f351cb80401b61f301cbb1f2b1cb80401b61f2a1c561f291cb80101b21f
-231eb80401b21f5537b80168402c07960758074f07360732072c0721071f
-071d071b071408120810080e080c080a080808060804080208000814b8ff
-e0402b000001001406100000010006040000010004100000010010020000
-01000200000001000002010802004a00b013034b024b5342014bb0c06300
-4b6220b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807
-ff52b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ff
-b101018e851bb0124358b900010111858d1bb900010128858d5959001816
-763f183f123e113946443e113946443e113946443e113946443e11394660
-443e11394660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b2b
-182b1db0964b5358b0aa1d59b0324b5358b0ff1d594bb09353205c58b901
-f201f04544b901f101f045445958b9033e01f2455258b901f2033e445959
-4bb8015653205c58b9002001f14544b9002601f145445958b9081e002045
-5258b90020081e4459594bb8019a53205c58b9002501f24544b9002401f2
-45445958b909090025455258b9002509094459594bb8040153205c58b173
-244544b1242445445958b917200073455258b9007317204459594bb80401
-53205c58b1ca254544b1252545445958b9168000ca455258b900ca168044
-59594bb03e53205c58b11c1c4544b11e1c45445958b9011a001c455258b9
-001c011a4459594bb05653205c58b11c1c4544b12f1c45445958b9018900
-1c455258b9001c01894459594bb8030153205c58b11c1c4544b11c1c4544
-5958b90de0001c455258b9001c0de04459592b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65
-422b2b01b33b59635c456523456023456560234560b08b766818b0806220
-20b163594565234520b003266062636820b003266165b059236544b06323
-4420b13b5c4565234520b003266062636820b003266165b05c236544b03b
-2344b1005c455458b15c406544b23b403b4523614459b347503437456523
-456023456560234560b089766818b080622020b134504565234520b00326
-6062636820b003266165b050236544b034234420b147374565234520b003
-266062636820b003266165b037236544b0472344b10037455458b1374065
-44b24740474523614459004b5342014b5058b108004259435c58b1080042
-59b3020b0a124358601b2159421610703eb0124358b93b21187e1bba0400
-01a8000b2b59b00c2342b00d2342b0124358b92d412d411bba0400040000
-0b2b59b00e2342b00f2342b0124358b9187e3b211bba01a80400000b2b59
-b0102342b0112342002b7475737500184569444569444569447373737374
-757374752b2b2b2b74752b2b2b2b2b737373737373737373737373737373
-737373737373737373732b2b2b45b0406144737400004bb02a534bb03f51
-5a58b1070745b040604459004bb03a534bb03f515a58b10b0b45b8ffc060
-4459004bb02e534bb03a515a58b1030345b040604459004bb02e534bb03c
-515a58b1090945b8ffc06044592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b752b2b2b2b2b2b2b435c58b9008002bbb301401e017400735903b01e4b
-5402b0124b545ab012435c5a58ba009f02220001007359002b7473012b01
-732b2b2b2b2b2b2b2b737373732b2b2b2b2b002b2b2b2b2b2b0045694473
-456944734569447374754569447345694445694445694473744569444569
-44732b2b2b2b2b732b002b732b74752b2b2b2b2b2b2b2b2b2b2b2b2b2b73
-7475732b7374757374752b2b2b742b2b000000>
-[15785 15901 16277 16325 16277 16273 15933 16169 16277 15721 16361 15561 15973
-16029 16305 15693 16345 16249 15893 15629 16365 15481 16245 16249 16357 16337
-15821 15749 16345 15937 16257 16033 19077 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-2 3242 17 <000100ba0000018700cd000300254018023c000a023c5f006f007f00af00
-04a0000100a004a198182b10f65d5ded003fed313033353315bacdcdcd00
->ArialMT AddT42Char 
-2 10326 39 <0002009e0000055a05ba000f001d00e5402f201f0143081c1d1e02010211
-101e0f000817262009011f400d0d0255092010100255090a0f0f02550918
-0d0d025509b8fff440150c0c0655091a1f1d102001200001002010100255
-00b8fff6b40f0f025500b8fff6b40d0d025500b8fffab40c0c025500b8ff
-f7b40c0c065500b8fff8400a0d0d0655005d1e3b5c182b10f62b2b2b2b2b
-2b5d3cfd3c10f62b2b2b2b2b5ded003f3cfd3c3f3cfd3c31304379403603
-1b0708060805080408040619181a1802060b0a0c0a0d0a03061516141613
-1603061b03172101120e17210118081c2101160a1121002b2b012b2b2a2a
-2a2a81015d3311213217161716121514020e022325213236373636353426
-272623219e01f9ab5a7e5974734e7a91cd85feb1013991a531454d976c4e
-adfecc05ba151d4c62fecfc4a7fefea96132ad363145e9a6e6f72a1e>ArialMT AddT42Char 
-2 12720 47 <000100960000042a05ba0005006d400c010204031e05000820040104b802
-a7400f070203200120000100201010025500b8fff6b40f0f025500b8fff6
-b40d0d025500b8fffab40c0c025500b8fff6b40c0c065500b8fff8400a0d
-0d0655005d063b5c182b10f62b2b2b2b2b2b5d3cfd3c10e65d003f3cfd3c
-3f313033113311211596c202d205bafaf3ad>ArialMT AddT42Char 
-2 14402 51 <0002009e000004fd05ba000d001800b2402c65116b14024b104b145b105b
-14040b0c1e0f0e0e0017181e02010200081226080a0d0d025508100b0b06
-5508b8fff4401b0c0c0655081a201a01201a011a180d2001200001002010
-10025500b8fff6b40f0f025500b8fff6b40d0d025500b8fffa400b0c0c02
-55000c0b0b065500b8fffab40c0c065500b8fff0400a0d0d0655005d193b
-5c182b10f62b2b2b2b2b2b2b5d3cfd3c4e10715df62b2b2b4ded003f3f3c
-fd3c12392f3cfd3c3130015d005d33112132171e02151402212111112132
-36353426272623219e0229924d6c9259eefec9fe88017bbc9e5d4c3184fe
-8905ba0e1265b66dbbfefdfdac03018c7f5c83150d00>ArialMT AddT42Char 
-3 5440 70 <00010050ffe803ed043e001a015ab1020243545840340e7f0f010f0b0140
-0050007000030004121c0b07181c040b010e1507080e0e0255070c0d0d02
-55070c0c0c025507100b0b0255072f2b2b2b2bcdd4c6003fed3fed10c45d
-3210c45d3231301b4047090c011f1c4313431753135317601360179b029b
-039a0da410a41a0c080d190a6a0269036a05750c700d800da60cb509b60a
-b50c0c160c860ce302030e225f0f6f0f7f0f030f01b802aa407930004000
-5000600070009000a000e000f00009000f0f0b000004121c0b07181c040b
-1c0f010f240e080d0d06550e221b000100240b2b1f010100010101400b0b
-065501401010065501480c0c0655011a0d0d065501491c1524cf07011f07
-3f0702070e0b0b0655070a1010065507120c0c065507311b34c4182b10f6
-2b2b2b5d71ed10f62b2b2b2b5d724b53234b515a58b90001ffc03859ed72
-f42bed72003fed3fed12392f11392f105de4105de43130005d71015d7159
-011706062322001134123633321617072626232206151416333236033cb1
-1defaedafef772e989addc1faf197f5a88aaa4846a8e018517b7cf011d01
-0aac010281afa11b6b6cc3d3d6c28200>ArialMT AddT42Char 
-3 6312 72 <0002004bffe8041e043e0015001d015340171f001c150255035d055d0955
-0b65036b056f09650b0815b8ffe4b40d0d065511b8ffe440520d0d06551d
-1c0d0d06552712d905fa14f61a0431123a19311c41124d1a411c51125c19
-521c61126d1a611c78067815f602f618100016010f0d1717501660167016
-03161c0f9010a010021010041b1c0a0700ba02aa0001ffc0b41010025501
-b8ffc04010101006551001010195131c040b17400db8ffdcb40d0d02550d
-b8ffeeb40d0d06550db8ffeab40c0c06550db8ffc04009272a34b00d010d
-1a1fb8ffc0b32526341fb8ffc040411e2334301f011f163310240740242a
-341f073f074f070307200b0b025507180c0c0255071c0d0d0255070e0b0b
-0655071c0c0c065507160d0d065507191e3437182b4e10f42b2b2b2b2b2b
-5d2b4dfde44e10712b2bf6712b2b2b2b4ded003fedfd5d2b2be43fed1239
-2f5d3cfd713c011112393912393130015d005d2b2b2b0171720117060623
-22001110003332001114072116163332360121262726232206035eba2cee
-b9e9feef0114dcd5010e01fce80ab285638cfdda02510c3856897ca90156
-17a3b4011f0103010c0128fedefef91020afba680195864368a6>ArialMT AddT42Char 
-3 6758 73 <000100130000028005d30017010d401e1409010f192f193019401970199b
-0c9c0da90d081a0d280db019c0190419b8ffc040281a1f341d080d030c0f
-1c0a0115022b1413040306000a9f140114ff134004172504000302920101
-00b8ffc0b331383400b8ffc0402b1c1f3490000119400f0f025519400d0e
-025500141010025500280f0f025500220e0e0255002c0d0d025500b8fff2
-400b0c0c025500140b0b065500b8ffeab41010065500b8ffe6b40f0f0655
-00b8fffab70c0c065500a31819bc01ba002100f6010a00182b2bf62b2b2b
-2b2b2b2b2b2b2b2b5d2b2b3c10f43c103ced10eded5d003f3f3c3c3cfd3c
-3fed391139313043794014101106090706080602061009121b0011060f1b
-012b012b2a8181012b715d00723311233533353437363633321707262322
-06151533152311b29f9f131a83764c5c1b38325244cfcf039a8c716b3446
-57129d0a4660628cfc66>ArialMT AddT42Char 
-3 8014 76 <000200880000013c05ba0003000700cd405e09360b0b02554f099009a009
-b009c009df09f0090700091f09700980099f09b009c009df09e009ff090a
-1f09010001070402030906037e0100060506040a0607250500049f04a004
-b004c004e00406c004f0040200042004d004e0040404b8fff8b410100255
-04b8fffa40170e0e025504040c0c0255040a0b0b025504140b0b065504b8
-ffeab41010065504b8fffeb40d0d065504b8fffc400a0c0c0655044e0847
-50182b10f62b2b2b2b2b2b2b2b5d71723cfd3c003f3f3c3fed0111123939
-111239393130015d72712b133533150311331188b4b4b404ebcfcffb1504
-26fbda00>ArialMT AddT42Char 
-3 8538 78 <00010088000003f805ba000b0261401b060c0d0d0655070656065a09030f
-0df305f60603090c1010025506b8fff4b40c0c02550ab8fff4b40c0c0255
-09b8fff4b40c0c025503b8ffe840100d0d06555503770a02120620132134
-08b8fff0b312273409b8fff0b41227341205b8fff0b312213409b8fff040
-84122734060404050406370947040525062d0a580a7703750ada03e30607
-a60601230626072508390638093f0d4f0d59045906580759097d04790599
-09c606d204d606e406e907f706f90815120a0a0503030402060607090908
-0a0a050908082507061407070603040425050a1405050a0a090603040801
-02000405060708080b0b000a04b8010f400905040c0c0655052208b8010f
-402120073f070207100c0c0655071a900d010d0b2500022501019000013f
-004f000200b8fffe40310e0e025500100d0d025500100c0c0255000a0b0b
-025500120b0b065500120c0c065500080d0d065500190c0de1214766182b
-2b4ef42b2b2b2b2b2b2b5d713c4d10ed10ed4e1071f62b5d4dedf42bed00
-3f3c103c103c3f3c3f3c11173987052e2b047d10c487052e182b0e7d10c4
-0710083c083c0310083c083cb10602435458400d4b09011f098403020918
-0d1134002b5d7159313001435c58400a092c1d3909081d1d3c06b8ffdeb2
-1d3906b8ffd4b2203906b8ffd4b121392b2b2b2b2b595d00715d0171002b
-2b435c58b90006ffc0b2213903b8ffc0b2163903b8ffdeb2103906b8ffde
-b2103903b8ffdeb20c3903b8ffdeb10b392b2b2b2b2b2b59012b2b2b435c
-584012dd040108141639090814143c090814143c06b8fff6b2183906b8ff
-ecb11b392b2b2b2b2b015d59005d2b2b2b2b2b015d712b33113311013301
-012301071188b401aae9fe6a01bfdefea17f05bafcbc01b0fe76fd64021f
-7afe5b00>ArialMT AddT42Char 
-3 9202 79 <000100830000013705ba000300e3b605360b0b025505b8ffc0b337383405
-b8ffc0b334353405b8ffc0b330313405b8ffc0b322253405b8ffc0402515
-17340f051f059f05df05044f05df05f005031f0570058005ff0504010000
-0a0203250100b8ffc0b337383400b8ffc040153335349f0001c000f00002
-00002000d000e0000400b8fff8b41010025500b8fffa401d0e0e02550004
-0c0c0255000a0b0b025500140b0b065500081010065500b8fffeb40d0d06
-5500b8ffffb40c0c065500b8fffc400a0c0c0655004e044750182b10f62b
-2b2b2b2b2b2b2b2b5d71722b2b3cfd3c003f3f3130015d71722b2b2b2b2b
-2b3311331183b405bafa4600>ArialMT AddT42Char 
-3 10014 81 <00010087000003e6043e0016017d40130503061302a810b810e303e713f0
-03f6130604b8fff0403c0b0d347910019810d018e018ff18042008140e14
-16121c05070106160d0a0d0e0c0e2418401010025518400b0b02550b2810
-1002550b140e0e02550bb8ffec40110d0d02550b040c0c02550b220b0b02
-550bb8fff4400b0b0b06550b14101006550bb8fff9400b0d0d06550b0a0f
-0f06550bb8fff640120c0c06550b40333634ff0b01ff0b010b4e18b8ffc0
-401a343634b018f018027018a018b018c01804180302331516250100b8ff
-f6b41111025500b8fffab41010025500b8fffa40170e0e025500040c0c02
-55000a0b0b025500040b0b065500b8fffa40110f0f065500020c0c065500
-040d0d065500b8ffc04012333634f0000100002000d000e00004004e1710
-f65d712b2b2b2b2b2b2b2b2b2b3cfd3cf43c105d712bf65d712b2b2b2b2b
-2b2b2b2b2b2b2b2bed3c103c003f3c3f3fed113901123931304379401606
-11090a080a070a0306102611060e1b010f0a121b01002b012b2b2a81015d
-71002b5d71331133153633321616171615112311342626232206151187a2
-75dd60a150100ab42a6b4873a7042697af45704d327dfd7302866e6d4192
-ccfdbc00>ArialMT AddT42Char 
-3 10468 82 <00020044ffe80427043e000d0019016bb615180d0d065513b8ffe8b40d0d
-06550fb8ffe840730d0d065519180d0d065512070a190c47064808560659
-08670669080834103a123a16351845104b124b1645185c055c0952105d12
-5d1652186d056d0964106d126d1664187701150906050d5b035405540a5b
-0c6c036505650a6c0c0a171c0407111c0b0b14241b400d0d02551b400b0b
-025507b8ffea40110f0f025507180d0d025507100b0b025507b8fff0b40b
-0b065507b8fff0b40d0d065507b8fff0b40f0f065507b8fff0b40c0c0655
-07b8ffc04013242534300701000710072007030731df1b011bb8ffc04049
-1e2334301b011b0e24000c0e0f025500120d0d0255000c0c0c0255001c0b
-0b0255000e0b0b0655000e0d0d0655000c1010065500160c0c0655004024
-25341f003f000200311a3437182b10f65d2b2b2b2b2b2b2b2b2bed10712b
-5df65d5d2b2b2b2b2b2b2b2b2b2bed003fed3fed313001715d0071435c58
-4009530553096205620904015d59002b2b2b2b1310373633320015140606
-23220013141633323635342623220644a489c5db01167beb8bdffeedb9b2
-8786b2b38587b2021301278e76fee1fdcdeb82011e010dcccbccd1c5cbca
->ArialMT AddT42Char 
-3 11776 85 <00010085000002c6043e001100c9403b2f13011004012304340443045304
-66047404060911080908090d1311090d000308010b1c06070106000a0928
-900801082220130113022211250100b8ffc04010333634f0000100002000
-d000e0000400b8fff8b41010025500b8fff840110e0e025500040c0c0255
-00060b0b025500b8fffcb41010065500b8fff440160f0f065500060c0c06
-5500080d0d0655004e1247c4182b10f62b2b2b2b2b2b2b2b5d712b3cfde4
-105df472e4003f3f3fed11393911393901111239390010c9870e7dc43130
-005d72015d33113315363633321707262322060706151185a23e693f5b5e
-3e42423b5e141e0426a171483aa727473f6072fdd400>ArialMT AddT42Char 
-3 13680 89 <0001001a000003e80426000a01eab1020243545840170508000a08060106
-0a0005090805010205240f0f0255052f2bddcd10ddcd113333003f3f3f12
-3931301bb7350501002211390ab8ffde400d11390916121c340816121c34
-02b8ffeab3121c3401b8ffeab3121c340ab8ffd840091e213400281e2134
-0ab8ffe8400922253400162225340ab8ffda407e282e340020282e340f0c
-29002809260a3900350a4800470a56015602590858096601660269086909
-78007701770279087809770a870187028603890788088a099d009809910a
-ac00a20abd00b707b10ac900c50ada00d50aec00e30afb00f40a2c0a0005
-0a1800160a2800260a370a4f00400a09054012163405400b0d34b1060243
-5458400905010008060106000ab8fff4400f0d0d06550a000c0d0d065500
-050908b8fff440120d0d0655080501020c0d0d06550205050c0b1112392f
-dd2bcd10dd2bcd10cd2bcd2b002f3f3f11123931301b40370a0708082509
-0a1409090a0003020225010014010100050a0a000a09080802020106070a
-09030001052f0c010c22084040400980090209b8011bb5400580050205b8
-011b400920024001220bead2182b10f6ed1a19fd5dfd5d1a18ede45d1112
-3939123939003f3c103c103c3f3c113987052e2b877dc4872e182b877dc4
-593130002b2b01715d2b2b2b2b2b2b2b2b2b2b2b2b005d59210133131617
-363713330101aefe6cbee4251f182becb9fe6e0426fd84676f54760288fb
-da00>ArialMT AddT42Char 
-2 0 0 <00020100000005000500000300070000211121112521112101000400fc20
-03c0fc400500fb002004c000>ArialMT AddT42Char 
-ArialMT /CharStrings get begin
-/period 17 def
-/D 39 def
-/L 47 def
-/P 51 def
-/c 70 def
-/e 72 def
-/f 73 def
-/i 76 def
-/k 78 def
-/l 79 def
-/n 81 def
-/o 82 def
-/r 85 def
-/v 89 def
-end
-ArialMT /Encoding get
-dup 46 /period put
-dup 68 /D put
-dup 76 /L put
-dup 80 /P put
-dup 99 /c put
-dup 101 /e put
-dup 102 /f put
-dup 105 /i put
-dup 107 /k put
-dup 108 /l put
-dup 110 /n put
-dup 111 /o put
-dup 114 /r put
-dup 118 /v put
-pop
-end
-%ADOEndSubsetFont
-/KUDFON+ArialMT /ArialMT findfont ct_VMDictPut
-/KUDFON+ArialMT*1 
-[46{/.notdef}rp /period 21{/.notdef}rp /D 7{/.notdef}rp /L 3{/.notdef}rp /P 
-18{/.notdef}rp /c /.notdef /e /f 2{/.notdef}rp /i /.notdef 
-/k /l /.notdef /n /o 2{/.notdef}rp /r 3{/.notdef}rp 
-/v 137{/.notdef}rp]
-KUDFON+ArialMT nf
-KUDFON+ArialMT*1 [9 0 0 -9 0 0 ]msf
-462 132.635 mo
-(DeviceLinkProfile.icc)
-[6.48001 5.03998 4.43701 2.043 4.56299 5.04001 5.04001 2.043 5.04001 4.56299 6.00305 2.99695 
-5.03998 2.52002 2.04297 1.91705 5.03998 2.52002 2.04297 4.43701 0 ]xsh
-/KUDFON+ArialMT*1 uf
-/KUDFON+ArialMT uf
-/ArialMT uf
-gsave
-132.002 192.003 mo
-160.507 192.003 li
-160.507 223.135 li
-132.002 223.135 li
-cp
-clp
-132 191.753 mo
-160.505 191.753 li
-160.505 223.132 li
-132 223.132 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 132 348.246 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-%ADOBeginSubsetFont: ArialMT Initial
-ct_T42Dict begin
--0.664 -0.324 2 1.004
- 256 array 0 1 255 {1 index exch /.notdef put} for  /ArialMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f3210325d73000000cc000000606376
-7420a11cd7eb0000012c000006546670676dcc79599a000007800000066e
-676c796607022dca000094e0000822cc68656164d6144b3e00000df00000
-003668686561123315fe00000e2800000024686d7478f65efffb00000e4c
-000034d46c6f6361361cd72000004320000034d86d617870124c05df0000
-77f8000000206e616d659617a74000007818000011057072657025d64dbf
-0000892000000bbe67646972000000000000000000000000000303880190
-00050008059a05330000011b059a0533000003d1006602120805020b0604
-020202020204e0002affc00078430000000900000000544d432000400020
-fffc05d3fe510133073e01b2400001ffffff0000042605bb000000200004
-05ba001905ba001a05a70019042600180000ffe70000ffe80000ffe7fe69
-ffe805ba0019fe69ffe802ea000000b8000000b80000000000a800ad0169
-00ad00bf00c201f0001800af00b900b400c800170044009c007c00940087
-0006005a00c80089005200520005004400940119ffb4002f00a1000300a1
-00cd00170057007e00ba00160118ffe9007f008503d300870085000d0022
-00410050006f008d014cff75005c00df04830037004c006e00700180ff58
-ff8eff92ffa400a500b903c8fffd000b001a0063006300cdffee05d8ffdc
-002d005c0095009900df019209b500400057008000b9039d0072009a035d
-0401ff67fffa00030021007700cd0004004d00cd01c0022b004c006500e7
-0118017c034305d8ffa3ffb0ffc40003001c005d0068009a00ba01350147
-0221055cff4dffcd0016002d00780080009900b200b600b600b800bd00da
-010c05f0ffa4fff00019002c0049007f00b400ce01c003fefd81fe3f0000
-00050018002900390049006f00be00c700d0012301c1026f050c05320540
-057affd4001400310055005700a700b400e601f7027e027e027f03c60446
-ff42000e0085009100bf00c200c500e1011a012f014f01560229026f029e
-03720008002c00310031006400690089009800c700de012b01b6020c02cf
-03a304ab04fb061dfee0ff0e00060026009b009d00c1010d011801200173
-018201d601e30243025f029b02e2039404a904d20761001c005e006d008d
-00ab00f7011201380151015b0168017c01870191019901cd01d001e80241
-0254026b02ef0368037103bd044204420453047304830586058b06e8fe58
-fec4fed1fef7ff32ff860051007c008100910095009e00b400b900cf00d9
-00d900df00e20105010b010e010e012001210155017b017b017e018d01a2
-01a801a901b401d001d001e201e901f201f501fb020002000206021b0221
-022202220223027202770294029c02cf02cf02d002ec02f903170322032b
-0335033c0359036f037103870390039003b503e1041a04cf04ff05320532
-0596059f05a805ab05c205f0060c0782080008ccfca3fd2afddefe00fe88
-fe96feb2feb4ffe100150019001a001c001f003c005100610061006a0078
-009600a500af00d3010c0118011a012a013e014c0151015f016a01710178
-01820184019a01a501a801a901ae01bc01cd01d701ef0200020d021c0221
-0222022e02350242024f024f025e026502710290029202b402d602fa0307
-030b030f0315032a0347035d036503740379039603b003cc03dd03e203f6
-03fc03fc03ff040a041f04220426042b0447045f0475049e04e704e7055c
-05cb05e5060a066d068606b806f10736073e07500751075d078f07b607d4
-086000b600c300b500b700000000000000000000000001e00381034503b5
-008e0233041902ce02ce002d005f0064034d023f000002a80188027d01b4
-02240578063b023b014e00f00426029402c6029f02f6023b034d014b0153
-006a0231000000000000061404aa0000003c04c300ed04bc026502ce03b5
-0078060c017e02ef060c00b201000239000001c50330042b03cb00da03df
-010704a100db040a011701ed02a70350010b01bd043e05580021039c00ae
-0371017d00b5024500000afb088c012b014e01aa00870054013201f803ff
-0003024e00b4003703e30083006b02d800ed00770088009701640467008e
-0033017c00e700a6029e0329056e062a061501c90269048a021301b40002
-04a9000002390124010305140084015d039a06ef02d9007500cf040a00de
-03ac04bc02cf02ae034d04f005520168006d007d00860071ff8100790558
-04d2016700030156002504e00094007c033204210094007f0072005c002f
-00b6001800ba00b80041034d00720018001f004c016a01550099009a009a
-009800b200040078006900140057006e00ce00b4065402b80067050e0165
-00e7000004cbfe52005affa60099ff67006eff92002dffd40087ff7c00b8
-00a800e5008f00a80185fe7b0070001e00d900de014c054602cf0546ff2d
-028a02d90253029600b700000000000000000000000000000125011800ea
-00ea00ae0000003e05bb008a04d70053003fff8cffd50015002800220099
-0062004a00e4006d00ee00e5004803c00033fe4e02b1ff460370007905df
-0051ffa7ff1f010a0068ff6c004f00bc00a507050061072b00ed04b001d2
-00b6007b00650252ff740365fe690094008f005c00400086007500890089
-4043555441403f3e3d3c3b3a3938373534333231302f2e2d2c2b2a292827
-262524232221201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09
-0807060504030201002c4523466020b02660b004262348482d2c45234623
-6120b02661b004262348482d2c45234660b0206120b04660b00426234848
-2d2c4523462361b0206020b02661b02061b004262348482d2c45234660b0
-406120b06660b004262348482d2c4523462361b0406020b02661b04061b0
-04262348482d2c0110203c003c2d2c20452320b0cd442320b8015a515823
-20b08d44235920b0ed51582320b04d44235920b09051582320b00d442359
-21212d2c20204518684420b001602045b04676688a4560442d2c01b10b0a
-432343650a2d2c00b10a0b4323430b2d2c00b0172370b101173e01b01723
-70b10217453ab10200080d2d2c45b01a234445b01923442d2c2045b00325
-456164b050515845441b2121592d2cb00143632362b0002342b00f2b2d2c
-2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b1
-2cc08a8cb8100062602b0c642364615c58b00361592d2c45b0112bb01723
-44b0177ae4182d2c45b0112bb01723442d2cb01243588745b0112bb01723
-44b0177ae41b038a45186920b01723448a8a8720b0a05158b0112bb01723
-44b0177ae41b21b0177ae45959182d2c2d2cb0022546608a46b040618c48
-2d2c4b53205c58b002855958b00185592d2c20b0032545b019234445b01a
-23444565234520b00325606a20b009234223688a6a606120b01a8ab00052
-7921b21a1a40b9ffe0001a45208a54582321b03f1b235961441cb114008a
-5279b31940201945208a54582321b03f1b235961442d2cb110114323430b
-2d2cb10e0f4323430b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2c
-b10e0f432343650b2d2cb11011432343650b2d2c4b525845441b2121592d
-2c0120b003252349b04060b0206320b000525823b002253823b002256538
-008a63381b212121212159012d2c4bb06451584569b00943608a103a1b21
-2121592d2c01b005251023208af500b0016023edec2d2c01b00525102320
-8af500b0016123edec2d2c01b0062510f500edec2d2c20b001600110203c
-003c2d2c20b001610110203c003c2d2cb02b2bb02a2a2d2c00b00743b006
-430b2d2c3eb02a2a2d2c352d2c76b8022323701020b802234520b0005058
-b00161593a2f182d2c21210c6423648bb84000622d2c21b08051580c6423
-648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb815
-55621bb200802f2b59b002602d2c0c6423648bb84000626023212d2cb400
-0100000015b00826b00826b00826b008260f10161345683ab001162d2cb4
-000100000015b00826b00826b00826b008260f1016134568653ab001162d
-2c4b53234b515a5820458a60441b2121592d2c4b545820458a60441b2121
-592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb01343
-58031b02592d2cb0134358021b03592d2c4b54b012435c5a58381b212159
-2d2cb012435c580cb00425b00425060c6423646164b807085158b00425b0
-0425012046b01060482046b0106048590a21211b2121592d2cb012435c58
-0cb00425b00425060c6423646164b807085158b00425b00425012046b8ff
-f060482046b8fff06048590a21211b2121592d2c4b53234b515a58b03a2b
-1b2121592d2c4b53234b515a58b03b2b1b2121592d2c4b53234b515ab012
-435c5a58381b2121592d2c0c8a034b54b00426024b545a8a8a0ab012435c
-5a58381b2121592d2c4b5258b00425b0042549b00425b00425496120b000
-5458212043b0005558b00325b00325b8ffc038b8ffc038591bb040545820
-43b0005458b00225b8ffc038591b2043b0005458b00325b00325b8ffc038
-b8ffc0381bb00325b8ffc03859595959212121212d2c462346608a8a4623
-20468a608a61b8ff8062232010238ab902c202c28a70456020b0005058b0
-0161b8ffba8b1bb0468c59b0106068013a2d2cb1020042b123018851b140
-0188535a58b910000020885458b202010243604259b12401885158b92000
-0040885458b2020202436042b12401885458b2022002436042004b014b52
-58b2020802436042591bb940000080885458b202040243604259b9400000
-8063b80100885458b202080243604259b94000010063b80200885458b202
-100243604259b94000020063b80400885458b20240024360425959595959
-2d2cb0024354584b53234b515a58381b2121591b21212121592d00000001
-00000005028fa58dc35f5f0f3cf5081b080000000000a2e3272a00000000
-c14fd713faaffd671000080c00000009000100010000000000010000073e
-fe4e00431000faaffa7a1000000100000000000000000000000000000d35
-06000100000000000239000002390000023900b002d7005e047300150473
-0049071d0077055600580187005a02aa007c02aa007c031d004004ac0072
-023900aa02aa0041023900ba0239000004730055047300df0473003c0473
-00560473001a047300550473004d047300610473005304730055023900b9
-023900aa04ac007004ac007204ac00700473005a081f006f0556fffd0556
-009605c7006605c7009e055600a204e300a80639006d05c700a4023900bf
-04000037055600960473009606aa009805c7009c063900630556009e0639
-005805c700a10556005c04e3003005c700a105560009078d001905560009
-0556000604e300290239008b023900000239002703c100360473ffe102aa
-00590473004a0473008604000050047300460473004b0239001304730042
-0473008701c7008801c7ffa20400008801c7008306aa0087047300870473
-0044047300870473004802aa00850400003f02390024047300830400001a
-05c700060400000f040000210400002802ac0039021400bc02ac002f04ac
-00570556fffd0556fffd05c70068055600a205c7009c0639006305c700a1
-0473004a0473004a0473004a0473004a0473004a0473004a040000500473
-004b0473004b0473004b0473004b023900bd023900230239ffe502390009
-047300870473004404730044047300440473004404730044047300830473
-0083047300830473008304730049033300800473006b0473001b04730051
-02cd006d044c000104e3009905e5000305e50003080000e102aa00de02aa
-003d0464004e080000010639005305b4009a0464004e0464004d0464004d
-0473fffd049c00a003f4003805b4007a069600a1046400000231000002f6
-002f02ec002d0625007f071d004404e3008104e3009e02aa00e804ac0072
-046400540473002e0464003304e5001a047300860473008c080000ef0556
-fffd0556fffd0639006308000081078d00520473fffc0800000002aa0053
-02aa004701c7008001c7006c0464004e03f4002f04000021055600060156
-fe390473ffe402aa005c02aa005c040000170400001704730049023900b9
-01c7006c02aa0047080000250556fffd055600a20556fffd055600a20556
-00a20239008d0239ffe00239000402390015063900630639006306390063
-05c700a105c700a105c700a1023900c602aa001902aa000602aa001d02aa
-002e02aa00e502aa00a202aa006b02aa003a02aa004b02aa002804730000
-01c700030556005c0400003f04e3002904000028021400bc05c7fffd0473
-004905560006040000210556009e0473008704ac007204ac00a102aa006b
-02aa001902aa002106ac006b06ac006b06ac0021047300000639006d0473
-0042023900b10556005c0400003f05c700660400005005c7006604000050
-04730046046bffe102aa00ee0556fffd0473004a0556fffd0473004a05c7
-009e04eb004705c7fffd055600a20473004b055600a20473004b04730096
-01c7004204730096025500880473009a02ac008305c7009c0473008705c7
-009c04730087063900630473004405c700a102aa008505c700a102aa003c
-0556005c0400003f04e300300239002404e300300300002305c700a10473
-008305c700a10473008304e300290400002804e3002904000028046800a4
-063900600662005504a00048047400480391006204f000440329002e0530
-0048046bffe1040000b002eb005208c000330800004f040000990800004f
-040000990800004f040000980400009807d5016a05c0009e04ab007204d5
-009d04ac007104d5022204d5010505abffe9050001c905ab027e05abffe9
-05ab027e05abffe905ab027e05abffe905abffe905abffe905abffe905ab
-ffe905ab01c005ab027e05ab01c005ab01c005abffe905abffe905abffe9
-05ab027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab
-01c005ab01c005abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905abffe905abffe905ab02d605ab006605abffea05d5ffff04d50092
-0800000007eb013007eb012007eb013007eb012004d500b204d5008004d5
-002a082b0198086b01b807550010060000f40600006f0440003a05400037
-04c0003f04150040040000250600005505e100bf038d008904d5ffd90180
-008002d50086071500610296000f04d5009202d6008302d6008304d500b2
-02d600700556fffd0473004a05c700660400005005c70066040000500556
-00a20473004b055600a20473004b055600a20473004b0639006d04730042
-0639006d047300420639006d0473004205c700a40473008705c7001f0473
-00060239ffce0239ffce0239ffe40239ffe40239fff60239fff50239004b
-01c700190400003701c7ffa20556009604000088040000860473009601c7
-fffa05c7009c0473008705c900a50473008b063900630473004406390063
-0473004405c700a102aa006b0556005c0400003f04e300300239000c05c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-078d001905c70006055600060400002101c700890556fffd0473004a0800
-0001071d00440639005304e30081023900b9078d001905c70006078d0019
-05c70006078d001905c70006055600060400002101c7008a02aaffe10473
-001b04cd005a06ac006b06ac002206ac002206ac004a02aa00e202aa006b
-02aa00de02aaffea0557ffff0646ffa706b4ffa80312ffa80632ffa706d8
-ffa70605ffa701c7ff780556fffd055600960558fffe055600a204e30029
-05c700a4023900bf055600960558000b06aa009805c7009c0533006d0639
-006305c700a40556009e04f2009404e30030055600060556000906af007f
-05fb0061023900040556000604a00048039100620473008b01c7006b0460
-0088049a008c04000019038700480473008b0473005c01c7008904000086
-04000018049c00a00400001a0395005c04730044048d008303db00560460
-00880433001105b4007a063f005701c7ffc9046000880473004804600088
-063f0057055700a206eb0032045500a105c000640556005c023900bf0239
-0004040000370875000d081500a406d5003104a900a10515000a05c000a0
-0556fffd054000a705560096045500a1056b0000055600a20763000704d5
-004e05c000a105c000a104a900a10540001206aa009805c700a406390063
-05c000a00556009e05c7006604e300300515000a061500520556000905eb
-009f05550057075500a1078000a106550000071500a8054000a505c00055
-081500a405c7001a0473004a0495005b0440008802eb008804ab00000473
-004b055afffb03ab003204780087047800870380008604ab00180580008c
-046b00880473004404550088047300870400005003aa0026040000210695
-004b0400000f0495008a042b0045066b008d0695008d0500002805c0008b
-042b008404150030060000890455001f0473004b0473000002eb00890415
-004b0400003f01c700880239000901c7ffa2074000130680008304730000
-0380008604000021046b008803e900a1034a008808000041089500a00585
-002d000001010000001e0000003100000031000001010000007e0000007e
-0000008c0000008c000001010000001000000101000001210310007d0000
-008c023300d20000030b0000ff04023900b9048100690456003203310019
-0411002d04d1009601f9009b030f005f04ca009b04b8008c01f9009b0413
-002803b0005003b4003c04ca009b04cf005001f9009b02d2003c0498005a
-043c00190488006e045f007303b1001903d4000a0466009604130028058e
-00640524002803f2009b03f2009b03f2009b01e3005a0356005a0686009b
-01f9ffac041300280413002803b4ff5703b4ff570448002d058e0064058e
-0064058e0064058e00640481006904810069048100690456003203310019
-0411002d04d10096024b0000034a000004b8008c024b00000413002803b0
-005003b4003c04cf005002d2003c0498005a0488006e045f007303d4000a
-0466009604130028058e00640524002801f9009b0456003203b00050045f
-0073049b003c0000ffdc0000ff250000ffdc0000fe51028d00ab028d00a0
-02da0043034d007901a8ffba000000460000004600000046000000460000
-00480000004600000046000000460435017c0435012e043500b704350081
-0435012c043500be043500af043500810435009a043500db04350085028d
-00c1043500b3060001000600010002420036060001000435009e04350098
-043500cb0600010006000100060001000600010006000100000000460600
-010006000100060001000600010006000100060001000600010006000100
-051bffba06000100060001000600010005b5003a05b5003a01f4ffba01f4
-ffba060001000600010006000100060001000481003604350036043dffba
-043dffba03e9004a03e9004a067f0014077600140327ffba041effba067f
-0014077600140327ffba041effba051b003204b500240300fff706000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010000000030
-0000004600000046000000400000004606000100060001000000ffdc0000
-fe510000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ff160000ff160000ffdc0000ff160000ffdc0000ff200000ffdc0473
-004a08000000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010006000100028d
-007f028d005d0600010004ee0015034d007901a8000e01d6ffdc01a80056
-01d60010037500320375003201a8002d01d60013051b003204b5002401f4
-ffba01f4ffba01a8009301d6001305b5003a05b5003a01f4ffba01f4ffba
-024200000300fff705b5003a05b5003a01f4ffba01f4ffba05b5003a05b5
-003a01f4ffba01f4ffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba02b3
-005f02b3005f02b3005f02b3005f03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba08c9003e08c9003e06c5ffba06c5ffba08c9003e08c9003e06c5ffba
-06c5ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7
-ffba04a7ffba045a002a039a00360435ffba0327ffba045a002a039a0036
-0435ffba0327ffba064f0027064f00270224ffba021affba04a7004604a7
-00460224ffba021affba04cf002d04cf002d0327ffba0327ffba040d0047
-040d004701a8ffba01a8ffba02b4002302b400230327ffba0327ffba0435
-00450435004501f4ffba01f4ffba024200360300fff7039affba0327ffba
-0375003203750032051b003204b50024051b003204b5002401f4ffba01f4
-ffba045a004004ce0049045a002604ce0039045a005304ce004a045a0053
-04ce004a0600010006000100000000460000004606000100060001000600
-010000000046000000460600010006000100000000480000004606000100
-060001000600010000000046000000460000004600000046000000400000
-003006000100000000460000004606000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d00ca028d00c7028d
-00c606000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000100ffba0800ffba1000ffba06dc0063053f004406d5
-00a1055b00830000fddc0000fc2f0000fca60000fe540000fcd70000fd73
-0000fe290000fe0d0000fd110000fc670000fd9d0000fbf50000fc720000
-fed50000fed50000ff02041b00a006ac006b06ac00190000feb60000fd73
-0000fe080000fca60000fe530000fd110000fbc80000faf40000faaf0000
-fc720000fbaa0000fb6a0000fcf10000fc7d0000fbdd0000fcc10000fb98
-0000fdea0000fe840000fdc20000fcf10000fd5f0000fe760000febc0000
-fceb0000fd6c0000fd580000fc900000fd150000fc2c0000fc130000fc12
-0000fb960000fb9601c700880556fffd0473004a0556fffd0473004a0556
-fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473004a
-0556fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473
-004a0556fffd0473004a0556fffd0473004a055600a20473004b055600a2
-0473004b055600a20473004b055600a20473004b055600a20473004b0556
-00a20473004b055600a20473004b055600a20473004b0239006301c7001f
-023900ba01c7007c06390063047300440639006304730044063900630473
-004406390063047300440639006304730044063900630473004406390063
-0473004406dc0063053f004406dc0063053f004406dc0063053f004406dc
-0063053f004406dc0063053f004405c700a10473008305c700a104730083
-06d500a1055b008306d500a1055b008306d500a1055b008306d500a1055b
-008306d500a1055b00830556000604000021055600060400002105560006
-040000210556fffd0473004a0239ffe201c7ffb0063900630473004405c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-05c700a1047300830000fefe0000fefe0000fefe0000fefe0455fffd02eb
-000c07630007055afffb04a900a10380008604a900a10380008605c700a4
-046b00880473fffd040000140473fffd04000014055600090400000f0555
-0057042b0045055500a10473008706050063047300550639006004730044
-05b5003a01f4ffba0224ffba021affba04a7004601f4009e01f4001001f4
-001b01f4001001f4006b01f4fff90227ffce0000000f0000fff502aa00a4
-02aa00a40000000e00000056000000560000ffcf01a8000f01d6ffbf01a8
-fff501d6ffcd01a8001d01d6fff501a8009301d600130375003203750032
-0375003203750032051b003204b5002405b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba
-01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4
-ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a
-01f4ffba01f4ffba0481003604350036043dffba043dffba048100360435
-0036043dffba043dffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba0481
-003604350036043dffba043dffba02b3003202b3003202b3005f02b3005f
-02b3005f02b3005f02b3003202b3003202b3005f02b3005f02b3005f02b3
-005f02b3005f02b3005f02b3003802b3003802b3004902b3004903e9004a
-03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9
-004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba0692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba08c9003e08c9003e06c5ffba06c5ffba04a7ffba04a7ffba045a
-002a039a00360435ffba0327ffba064f0027064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba064f0027064f00270224
-ffba021affba064f0027064f00270224ffba021affba064f0027064f0027
-0224ffba021affba04a7004604a7004604a7004604a70046093e0032093e
-00320740ffba0740ffba067f0014077600140327ffba041effba04cf002d
-04cf002d0327ffba0327ffba04cf002d04cf002d0327ffba0327ffba04cf
-002d04cf002d0327ffba0327ffba067f0014077600140327ffba041effba
-067f0014077600140327ffba041effba067f0014077600140327ffba041e
-ffba067f0014077600140327ffba041effba067f0014077600140327ffba
-041effba040d0047040d004701a8ffba01a8ffba040d0047040d004701a8
-ffba01a8ffba040d0047040d004701a8ffba01a8ffba040d0047040d0047
-01a8ffba01a8ffba043500450435004501f4ffba01f4ffba043500450435
-00450435004504350045043500450435004501f4ffba01f4ffba04350045
-043500450481003604350036043dffba043dffba024200360300fff7031a
-001a031a001a031a001a0375003203750032037500320375003203750032
-037500320375003203750032037500320375003203750032037500320375
-0032037500320375003203750032051bffba04b5ffba051b003204b50024
-01f4ffba01f4ffba0375003203750032051b003204b5002401f4ffba01f4
-ffba051b003204b50024067f0045067f0045067f0045067f004501a80028
-0000fe290000fea20000ff300000ff1d0000ff120000ff920000fe7e08fc
-003208ad00320000ffb50000ffb60000feed0000ff640000fe7e0000ff9f
-018d000002f6fffd0000fe820000ff1004cd00320000ff580000ff580000
-ff640692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba045a002a039a00360435ffba0327ffba034d007902b400230242
-003601f4ffba0290ffba01f4002f01f4003b01f4001201f400b101f4006d
-067f00140776001401f9009b0000fed902bc000003f2009b045afff504ce
-fff5045a005304ce004a045a005304ce004a045a005304ce004a045a0053
-04ce004a045a005304ce004a045a005304ce004a04350071043500ad045a
-000f04ce000f0473001406110014054000a7047300860540000a0473000a
-05c7005105c700660400005005c7fffd067a00140540004a047300460474
-00480556006e04d5005304e3ffc40639006d04fe000f070c008701c70083
-0239001f055600960400008801c7001504000018072000a405c7ffb80473
-008b0639006006f200630557004406090014047300860556009e0556006b
-0400004f04f20094030b00440239002404e300140239002404e3003005fb
-006105c700a1062e00140400002104e300290400002804e3002904e30031
-045c0044045c003f0473003c0473005503ab003203e50024047300870214
-00bc034e00bc04ac0072023900b00aaa009e09c7009e08640046087f0096
-06aa0096039c008309c7009c078e009c062b0087047300550556fffd0473
-004a0000fefe0556fffd0473004a08000001071d00440639006d0473001a
-0639006d0473004205560096040000880639006304730044063900630473
-004404e30029045c004c01c7ffa20aaa009e09c7009e086400460639006d
-04730042084600a404f2009e05c7009c047300870556fffd0473004a0556
-fffd0473004a055600a20473004b055600a20473004b0239ff8a0239ff64
-023900040239fff60639006304730044063900630473004405c700a102aa
-ffcc05c700a102aa006805c700a10473007605c700a1047300830556005c
-0400003f04e3003002390024045c0051037e001305c700a40473008705a6
-00a404d6005e0486005e04e30029040000280556fffd0473004a055600a2
-0473004b06390063047300440000fefd0639006304730044063900630473
-004406390063047300440556000604000021047300570473004804730086
-04730086040000130400005004730046047300460473005505e9005503ab
-004903ab0032050d0032040f00440239ffb9047300420473004204780050
-0402001904ef00190473008b047300870473008701c7001901c7008901c7
-0089029e0000026e001401c700830493008306aa008406aa008406aa0087
-0473ffa60473008b046c00870473004406530044063f00570466004402aa
-ffe402aaffe402aaffe402aa008502aa008502aa008502aaffe40455008a
-0455008a0400003f01c7ffa20214ffb901c7ff7202cb00000239000f0239
-002404730019048c0044046000880400001a05c700060400001804280019
-0400002804540028045c004c045c00790400002404000050040000240400
-00500639006304400088040f004904780050046b0088032e000004000008
-033b008804730048040000240400005007b7004607400046080b004605b3
-0024036f002405c00024061c0013054a0083050f008303e2001e04380063
-03110064031100640146ffce01eb006401eb000001eb000002ea006403d9
-0000029100000187005a02d7005e01c7008001c7006c01c7008a02aa00fb
-02aa00fb02ca003202ca003204ac007004ac007004ac006504ac006502aa
-012102aa00de02aa005902aa012102aa001d02aa005902aa00de023900b6
-023900b602aa00fb02aa00fb02aa00a602aa00a602aa00a602aa001d02aa
-ffe202aafffb029400000142006402b8003202a0000002ca003203100096
-0310009603100096031000960310009602aa006202aa006202aa002802aa
-001d02aa0047045700960457009604570096045700960457004304570043
-045700430457004304570043031000430457002f0457002f0457002f0457
-002f0457002f0310002f0457002504570025045700250457002504570025
-0310002f0457001a0457001a0457001a0457001a0457001a0310001a0457
-004204570042045700420457004204570042031000420457009604570096
-045700960457009604570042045700420457004204570042045700420310
-00420457002f0457002f0457002f0457002f0457002f0310002f0457002f
-0457002f0457002f0457002f0457002f0310002f04570026045700260457
-002604570026045700260310002604570042045700420457004204570042
-045700420310004204570096045700960457009604570096045700420457
-004204570042045700420457004203100042045700260457002604570026
-045700260457002603100026045700230457002304570023045700230457
-0023031000230457002f0457002f0457002f0457002f0457002f0310002f
-0457004b0457004b0457004b0457004b0457004b0310004b045700960457
-009604570096045700960457004204570042045700420457004204570042
-031000420457001a0457001a0457001a0457001a0457001a0310001a0457
-002404570024045700240457002404570024031000240457002f0457002f
-0457002f0457002f0457002f0310002f0457004e0457004e0457004e0457
-004e0457004e0310004e045700960457009604570096045700960000fec1
-0000fec60000fdac0000fed80000ff920000fee90000ff4c0000fea00000
-fec40000ffce0000ff660000fea00000fed80000fed80000ff970000ff98
-0000ff990000fff40000ff420000ff420000ff440000ff5f0000fe870000
-ffec0000ffa60000ff510000ff510000ff510000fec90000ff1c00000000
-0000fee90000ff4c0000ff930000ff2a0000ff560000ffce0000fe870000
-febb0000fec40000fec40000fed80000fed80000feb30000fec90000fdad
-0000fdac0000feb30000fec90000fdad0000fe160000fee60000ffa60000
-fe870000ff440000feba0000ff230000ff9a0000fdac0000fe8800000000
-0000feb00000ff980000fe930000ffa60000fe870000fdac0000ff660000
-ff440000feb00000feb00000feb00000ff030000ff520000fd1f0000ff53
-0000ff530000ff530000feb50000feb50000ffc30000feae0000fedc0000
-fec70000fec80000fedc0000fe1e0000ff420000ff510000feb70000feb0
-02aa00de02aa005902aa00fa049a008c04600088062e001407aa0000062e
-0014047b004c063f005704cf0044063900630473004405c7006604000050
-04e300a8033b008804ff0000043c0032060d000a049d0042072000a406aa
-0084056500630473008b056400a40400000a0556006b0556006b04e00005
-04c5001905e5005f046e004403b600140347002804cf00440495005b0400
-005001c7ffa2063900600389004d03890050055600a205c000a10473004b
-047800870ab4006d04fe00100639001404e70014079900bf05b500880558
-000b0400001a072e00bf0590008806a10078057b007a086d00bf06f00088
-04d5006603ab001f065f0039058200480639006004730044066d0009050c
-001a066d0009050c001a0b010063091c004406aa005c04e600440987006d
-06d000500000fe370ab4006d04fe001005c7006604000050040700140000
-fea60000febc0000feaa0000fead0000fc2b0000fc4c05c000a104780087
-05400004042b00140556009e04730087055d00a40464008804d5004e03ab
-003204a900040380000005ef002904490028070900a4052f0088091800a0
-06f6008806060066042b005005c700660400005004e3003003aa00260767
-00310587002605550057042b004506e4000a0554000a06e4000a0554000a
-023900bf07630007055afffb055700a1046800860540001204ab001805c7
-00a4046b008805c700a4046b008805550057042b004506aa00980580008c
-02aa002e0556fffd0473004a0556fffd0473004a08000001071d00440556
-00a20473004b060500630473005507630007055afffb04d5004e03ab0032
-04d5004e045c004c05c000a10478008705c000a104780087063900630473
-0044063900600473004405c0004a0415002b0515000a040000210515000a
-040000210515000a0400002105550057042b0045071500a805c0008b0540
-004a0473004607bf004a0703004607a6006606860053054d006604130053
-07c3001207470018084600a4070700880639006d0478005005f900300553
-00260000ff430000fec90000ff770000ffb00000ff470000ff560000ff74
-0000fed70000feac000000000000ff520000ff56000000000000feac0000
-fd9a000000000000ff6a0000ff7c0000ff690000ff560000feac0000ff7f
-0000ff560000fdef0000ff430000ff690000ff7c000000000000fdae0000
-ff8c000001020000fefe0000fefe0000fedf0000fedf0000ff580000ff20
-0000fefe0556fffd0473004a055600960473008605560096047300860556
-00960473008605c700660400005005c7009e0473004605c7009e04730046
-05c7009e0473004605c7009e0473004605c7009e04730046055600a20473
-004b055600a20473004b055600a20473004b055600a20473004b055600a2
-0473004b04e300a8023900130639006d0473004205c700a40473008705c7
-00a40473008705c700a40473008705c700930473006805c700a404730087
-0239ffdf01c7ff9202390020023900060556009604000088055600960400
-008805560096040000880473009601c7007e0473009601c7ffb904730096
-01c7ffa50473009601c7ffa306aa009806aa008706aa009806aa008706aa
-009806aa008705c7009c0473008705c7009c0473008705c7009c04730087
-05c7009c0473008706390063047300440639006304730044063900630473
-004406390063047300440556009e047300870556009e0473008705c700a1
-02aa008505c700a102aa008505c700a102aa005e05c700a102aa00260556
-005c0400003f0556005c0400003f0556005c0400003f0556005c0400003f
-0556005c0400003f04e300300239002404e300300239002404e300300239
-ffff04e300300239000e05c700a10473008305c700a10473008305c700a1
-0473008305c700a10473008305c700a104730083055600090400001a0556
-00090400001a078d001905c70006078d001905c70006055600090400000f
-055600090400000f055600060400002104e300290400002804e300290400
-002804e3002904000028047300870239000305c70006040000210473004a
-01c7008904a0004804a0004804a0004804a0004804a0004804a0004804a0
-004804a000480556fffd0556fffd06820013068200130682001306820013
-068200560682005603910062039100620391006203910062039100620391
-0062061e0000061e0000076c0000076c0000076c0000076c00000473008b
-0473008b0473008b0473008b0473008b0473008b0473008b0473008b068f
-0000068f0000081f0000081f0000081f0000081f0000081ffff3081ffff3
-01c7008101c7008101c7ff9b01c7ff9b01c7ffeb01c7ffeb01c7ffa201c7
-ffa20301000003010000049100000491000004910000049100000491fff3
-0491fff3047300440473004404730044047300440473004404730044069d
-0000069d0000082d0000082d000007c9000007c900000460008804600088
-0460008804600088046000880460008804600088046000880682000007ae
-00000812000007ae0006063f0057063f0057063f0057063f0057063f0057
-063f0057063f0057063f0057065f0000065f000007ef000007ef0000078b
-0000078b0000078bffff078bffff04a0004804a000480391006203910062
-0473008b0473008b01c7ffe601c700680473004404730044046000880460
-0088063f0057063f005704a0004804a0004804a0004804a0004804a00048
-04a0004804a0004804a000480556fffd0556fffd06820013068200130682
-00130682001306820056068200560473008b0473008b0473008b0473008b
-0473008b0473008b0473008b0473008b068f0000068f0000081f0000081f
-0000081f0000081f0000081ffff3081ffff3063f0057063f0057063f0057
-063f0057063f0057063f0057063f0057063f0057065f0000065f000007ef
-000007ef0000078b0000078b0000078bffff078bffff04a0004804a00048
-04a0004804a0004804a0004804a0004804a000480556fffd0556fffd0556
-fffd0556fffd0556fffd02aa00e502aa00fd02aa00e502aa000602aa0006
-0473008b0473008b0473008b0473008b0473008b068200000682000006f3
-000006f3000005c700a402aa001302aa001302aa000601c7ffbb01c7ffab
-01c7ffca01c7ffca01c7ff9301c7ff930239001a0239fff5036500000365
-000002aa001302aa001302aa000604600088046000880460008804600088
-048d0083048d00830460008804600088055600060556000606e600000718
-0000061e000002aaffea02aaffea02aa0059063f0057063f0057063f0057
-063f0057063f005707650000069d000007270000065f000005fb006102aa
-00de02aa00e50473000d05c7006605c7006606aa008705c70024095000a1
-078d00190556001f04e30030080000290400003004c100660000ff530000
-ff530000ff530000ff5301c7001901c7ffa2042b00050556001105740046
-02cbffa3057a008702f0ffc8057f000a057f000a02aa008402aa008402aa
-00c902aa00c902aa00a002aa005902aaffaf02aa003a02aa0006023900b9
-02aa00a902aa00a902aa00a902aa00a9032e001e032e001e02aa003a0000
-ff730000ffa50000fed80000ff230000ff720000ff720000fee70000ffa5
-0000ff530000ff530000ff530556009e0473008703f8001905fb0019071d
-00440440001904000050046900870469001903eb008703ab003201c70088
-0361004104000088033600100580008c04780087047300440400001304de
-004404de004404de000d078d005003a800440473004404730044042b0084
-0455001f0455001f03aa00260460008804c6004405de004404c600440400
-001a05c700060400002803ab0032036b003f04db001f02eb00880400001a
-04550088042b008405b4007a04ab001803a00000054f0000035100320351
-ffd103980032034800320348003203f80032036e0032015600690284002d
-0366003202d000320415003203710032036f003204180032030f00320359
-0032039c003203760031036f003204fb000002fa003202fa003203040032
-04cc0032030500640305003202f9003202f90032028c0032028c00320304
-00320142006402b6006404950064030f00640305003202d5003203050032
-030500320306006401c20032030f00640342003204950064029200000320
-00000315006402920000030600320385003202bf00000142006401eb0064
-030f0064029200000315006402920000030900320385003202bf000005ed
-00460a660046061300460689ffba0541ffba01e9003c045a00110000ff0d
-0000ff350000fece0000feb70000fec90000ffcf0000ff4f0000ff9e0000
-feca02b3005f02b3005f03e9004a03e9004a039affba0327ffba039affba
-0327ffba05ad0069053d002d05fd009604dc005004e0003c05f6009b053f
-00280650002804ac00720000fe3b0000fe660000fe660473fffc02aa0053
-02d5ffce01a8ffba01a8ffba01a8ffba01a8ffba0658001509c500470400
-000008000000040000000800000002ab0000020000000155000004730000
-02390000019a000000ab00000000000005e5000305c7006606aa00980580
-008c0744008307180046071800480556fffd05c70066040000140473000a
-04e300300400004f0400002804a5001d000001020000ff420000febf0000
-ff3a0000ff53048d000a05c7005105c7006605c70051045500a102eb0088
-0000ff430000ff040000ffac02d200960000ff37021affba0250001e0000
-ff3a0000ff5b0000ff5f0000ff7e0000ff940000ff4a0000fe9c05b5003a
-05b5003a01f4ff9601f4ff9605b5003a05b5003a01f4ffba01f4ffba05b5
-003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba
-05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba0481003604350036043dffba
-043dffba0481003604350036043dffba043dffba02b3003202b3003202b3
-005f02b3005f03e9004a03e9004a0692003e0692003e043fffba043fffba
-045a002a039a00360435ffba0327ffba045a002a039a00360435ffba0327
-ffba045a002a039a00360435ffba0327ffba064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba067f0014077600140327
-ffba041effba067f0014077600140327ffba041effba067f001407760014
-0327ffba041effba02b4002302b400230327ffba0327ffba02b4002302b4
-00230327ffba0327ffba043500450435004501f4ffba01f4ffba04350045
-0435004501f4ffba01f4ffba043500450435004501f4ffba01f4ffba040d
-0047040d004701a8ffba01a8ffba03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0473ff93047300460239ffbf06aa
-ffd50473ffb70473ff9102aaffa402aaffa40400ffff0239ffb904000028
-04730089030b0064047400480649002401c7001901c700190473001e0460
-001e048c000a04730086047300460239001305b400420400008801c7fffc
-06aa00870473008b0473008702aafffb0400003f0318ffa20400001a0400
-000f040000280473004a04730048047300460473004b03ab004903ab0032
-0534005501c700880400001301c7ffa204730083045c004c0304006402d5
-003202c9003302fc0032028c003201d5003201d500000304003203110064
-01420019014200640142006401420019022a000001420064014200090233
-00640493006404930064030fffc9030f0064030e00640305003203000032
-02b800320142ffca01c20032030f001d031a00320306006402d400640292
-000002de003202de003202de003202f4003202ea00320000febc0000febc
-0000ff730000fea9023900b902fa003202f900320305003202a0000002f9
-00320639006d0556fffd0473000f05c7006602aa004104a0004804a00048
-04a0004804a0004804a0004804a0004804a0004804a0004801c7ff9b01c7
-ffab01c7ff9b01c7ffab01c7ff9b01c7ffbb01c7ff9b01c7ffbb04600088
-0460008804600088046000880460008804600088046000880460008801c7
-ffab01c7ffab01c7ffbb01c7ffbb04600088046000880460008804600088
-045a005304ce004a03a000130556001105c700290558000b055600a20473
-004b0400003301c7ffa205e600630473004805c7000002aa000f05560006
-0400002104000013040000500400001301c700830455fffd02eb00010556
-00090400000f055600090400000f04d5005303ab00490540001204ab0018
-0000fec60000fed40000fec60000fed40000fe5f0000fe5f0000ff720000
-ff730000fee7078b000a03eb004c040000130473000a01c700150473fff4
-0556001105c700a1047300190239ff8b05c700a404730087055600960400
-008804e30029040000280400003b049e00a403670088053000480000ff53
-0000ffbc0000fefe0000fefe0000fea40000fea401c70088000000000000
-002a0000002a0000002a0000002a000000d60000017e00000320000005a6
-0000074e000009380000097e000009fe00000aa400000b8400000bec0000
-0c6400000caa00000ce600000d5600000f1200000fee00001218000013f2
-000015520000170c000018e20000198e00001c2200001e5600001eb20000
-1f7000001ff200002062000020e8000021da000023da000025840000271c
-000028560000299e00002a6200002b1800002ca800002dae00002e920000
-2f7a000031b00000323a000035640000370e000038420000394800003b3c
-00003da800004052000041000000422400004398000045d6000048e20000
-4a8800004bc800004c3200004c9c00004d0000004d8800004dbc00004e38
-0000510a000052e80000549c000056500000580e0000596200005b520000
-5cf600005dea00005f020000619a00006296000064c60000668c0000684e
-00006a1200006ba800006cae000070560000717a00007318000075360000
-79a000007bc400007e1c00008004000081020000814e00008250000082f0
-0000833c00008370000083ac000083ee000084540000849a000084ce0000
-85040000853a0000858a000085cc0000861e00008656000086a8000086de
-0000871e000087600000879e000087e800008828000088560000888e0000
-88de00008914000089540000898e000089d200008a1c00008a5800008a88
-00008acc00008b0400008b9400008c1a00008e2800008fbc0000916c0000
-91b80000924c00009470000096c4000098b4000099a000009a2200009a8c
-00009baa00009d0600009f4e0000a0b00000a13e0000a1e80000a2ac0000
-a3f40000a59e0000a68c0000a7520000a7b60000a8240000a94e0000aa72
-0000ab020000ace40000af3e0000b2900000b3860000b42c0000b47c0000
-b5320000b6520000b7f00000b88a0000b94e0000ba0e0000ba760000bab2
-0000bb0a0000bb580000bd700000bfb60000bfee0000c0200000c14a0000
-c2760000c3240000c3c80000c46a0000c53c0000c5900000c5c60000c61e
-0000c7700000c7e20000c83c0000c9b40000cb200000cc000000cc320000
-ccce0000cdf20000d0680000d0a20000d0e60000d1220000d1840000d1c6
-0000d20c0000d2580000d28a0000d2de0000d31c0000d34c0000d38a0000
-d3d00000d4120000d4500000d4d20000d5400000d6260000d6620000d6e2
-0000d7160000d7b80000d8400000d8ac0000d90e0000d97a0000da660000
-db580000db8c0000dbc00000dbf00000dc340000dcac0000de260000e040
-0000e0720000e0ac0000e1a60000e3340000e36a0000e4ce0000e54a0000
-e62a0000e7200000e8b00000ea1a0000ec080000ed040000ed4a0000ed7e
-0000edc00000edfa0000ee4e0000ee960000eee00000ef100000ef400000
-f1280000f1660000f18e0000f1be0000f1f20000f2180000f23e0000f286
-0000f43c0000f5b60000f5dc0000f6020000f6460000f6760000f6a60000
-f6fc0000f7da0000f8ec0000f9300000f9660000f9c00000f9fe0000fa32
-0000fa620000fa9e0000fade0000fb1c0000fb580000fb9a0000fbd00000
-fc0c0000fc4c0000fc720000fc960000fce60000fe420000fe980000fecc
-0000ff1a0000ff660000ffa80000ffe0000100160001005e000101000001
-029c00010464000105e6000107d80001092a00010aae00010b9000010d2a
-00010d9400010dbc00010e5a000110dc0001111c0001115c0001119c0001
-11da000112380001129600011304000113240001140e000114ae000114e4
-000115320001157c000115c6000115e2000115fe0001161e0001163e0001
-165e0001167e000116a4000116ca000116f000011716000117460001176e
-00011796000117c2000117ee000118220001184c00011878000118ae0001
-18d8000119040001193a000119640001198e000119c2000119f200011a26
-00011a6a00011a9a00011ace00011b1000011b4400011b7600011bb80001
-1bec00011c1c00011c5e00011ca200011ce800011d4400011d6000011d7c
-00011d9800011db400011dd000011f3e000121ea0001245a000124760001
-2490000124ac000124c8000124e4000125000001255c0001259600012600
-000126ca0001276a00012840000128c000012948000129b800012a4e0001
-2aac00012af200012b5000012bb200012c6a00012d2800012d5400012db0
-00012df400012f60000130540001307e0001309a000130c6000130fe0001
-314a0001318a000131be000131ee0001321e0001324e00013292000132c2
-000132f2000133320001336200013392000133c200013402000134320001
-346200013492000134b8000136bc000136ec0001371c0001386c00013a22
-00013a5200013a8000013ab000013ade00013b0e00013b3c00013b600001
-3b8400013bb400013d2400013d5c00013d8c00013f1e00013f4c00013f7a
-00013fa800013fd00001412e000142c6000142fe0001433e0001437a0001
-43aa000143d8000143f4000144240001445400014544000146ac000146dc
-000147160001475600014786000147b6000147f80001481e000148440001
-4884000148c4000148f40001493400014a1e00014a9e00014b8200014bb2
-00014be200014c1200014c4200014c7e00014cb000014ce200014d120001
-4d4200014d8800014dba00014dea00014e2000014e9200014ec600015094
-000151960001532600015556000157a6000159380001599c00015a260001
-5a3600015ac400015cc200015dee00015f5a0001604a000161ce000163e8
-000166140001670600016716000167260001683e0001684e0001685e0001
-686e0001687e0001688e000169ac000169bc000169cc00016a4000016a50
-00016b2000016b3000016c4200016c5200016c6200016c7200016dd00001
-6fae00016ff0000170260001705c0001708c000170bc0001711000017138
-000172c20001740a0001755e000176c60001784a000178ae00017a400001
-7b5c00017b6c00017b7c00017d0200017d1200017e7800017fd200018106
-00018264000183d200018598000185d800018610000186460001866c0001
-869c000186c200018838000188680001899e000189ae000189be00018a00
-00018a1000018ba400018d5000018eda00018f0200018f320001908e0001
-909e000191d6000191e600019280000193e0000193f000019656000197e0
-000199480001997800019aee00019c2000019c3000019c4000019c500001
-9d2a00019d3a00019d4a00019d5a00019e5200019fcc00019fdc0001a104
-0001a2380001a38a0001a51e0001a63c0001a7c80001a8da0001a9100001
-ab460001abe60001abf60001ad8c0001af2e0001afb20001b1340001b144
-0001b3ac0001b52c0001b6ac0001b6dc0001b87c0001ba020001bbc60001
-bcf20001bd020001be320001be420001be520001bf120001bf220001c108
-0001c1180001c24e0001c35c0001c5080001c6be0001c8000001c9700001
-cab80001cb0a0001ccec0001ce680001cea60001d04c0001d0700001d1b0
-0001d1c00001d1d00001d2080001d2180001d3a40001d50c0001d6800001
-d6a40001d6d40001d8420001d8f40001d9b20001d9e00001db960001dc8e
-0001dd1c0001de420001def00001dfc40001e00e0001e0860001e1460001
-e16e0001e1b20001e2080001e2e40001e32e0001e3620001e38a0001e3b2
-0001e3e60001e42a0001e46e0001e4ac0001e5ea0001e6a20001e7c20001
-e8380001e9060001e9580001e9ea0001ea9a0001eb8e0001ebe20001ec78
-0001ed360001ee200001eed20001eff20001f0440001f0ee0001f2240001
-f2fc0001f3e20001f4e80001f5ce0001f6b00001f7a40001f8420001f948
-0001fa420001faba0001fb320001fba80001fbde0001fc3a0001fd020001
-fd8e0001fdc60001fe0c0001fe3c0001fea60001ff660001ff9a0001ffca
-0001fffe0002002e0002005e0002008e0002022e00020266000202a60002
-02de00020316000203b2000204ac000204dc00020580000205ae000205ee
-0002063e0002066e000206ba00020852000209b800020b1800020b5e0002
-0bb200020bea00020d5c00020d9200020e2400020e6200020e9000020ece
-00020ffe0002102600021162000211f20002129c0002131e000213da0002
-14f20002160000021634000216ba0002181600021898000218e2000219ec
-00021a3400021b3800021bb400021c0c00021c9000021d7a00021e900002
-1f8c0002203600022126000221f8000222e2000223ca0002247a000224fc
-0002275a00022784000227ae0002286600022890000229d200022ad80002
-2bc200022bec00022c1600022c4000022c6a00022c9400022e1400022e3e
-00022e6800022e9200022ebc00022ee600022f1000022f3a00022f640002
-2f9800022fc200022fec0002301600023190000231a0000232ba000232ca
-000232f40002331e00023348000233720002351c00023738000238660002
-3876000239f200023a0200023b4800023d1400023e1a00023f9a0002413a
-0002435e000244b80002469a000247de0002490c000249fa00024a240002
-4a4e00024a7800024aa200024acc00024af600024b2000024b4a00024b74
-00024b9e00024bc800024bf200024c1c00024c4600024c7000024eac0002
-50280002516c000253540002549c000254c6000254f00002552000025550
-000255a0000255f000025630000256a2000256f600025754000257aa0002
-57e00002582200025868000258b2000258e20002591a0002594a00025a82
-00025dc800025df200025e1c00025e4600025e7000025e9a00025ec40002
-5eee00025f1800025f4200025f6c00025f9600025fc000025fea00026014
-0002603e0002606800026092000260bc000260e6000261100002613a0002
-61640002618e000261b8000261e20002620c0002623600026260000262fe
-000263140002633e0002661e0002662e000267480002686a000269a80002
-6aea00026c9000026ca000026de200026f3200027122000272f60002740e
-0002741e000274a00002752e0002762e0002763e000276de000276ee0002
-78040002795600027a8600027a9600027b6400027b7400027cea00027cfa
-00027e0e00027e1e00027f52000280e8000281a4000281b4000282b20002
-840c00028498000284a8000285d20002875e0002881a0002882a000288c6
-000288d6000289a4000289b400028a8c00028a9c00028ba400028bb40002
-8d7a00028d8a00028ee200028ef20002915c0002916c0002936600029376
-000294e0000294f0000295e0000295f00002978800029798000298b60002
-98c600029a0600029a1600029a2600029a3600029bae00029bbe00029bce
-00029bde00029d3000029e7e00029f4c0002a0300002a1b00002a3320002
-a4320002a5460002a68a0002a69a0002a7880002a8620002a9fe0002aa0e
-0002ab2c0002ac320002ae300002ae400002ae500002ae600002afaa0002
-afba0002b0720002b0820002b1900002b1a00002b28c0002b29c0002b3ba
-0002b3ca0002b4680002b4780002b4880002b5760002b6ea0002b8160002
-b9100002b9200002b9300002b9400002bade0002bc980002bd660002bd76
-0002bfd60002c21c0002c4a20002c7060002c98a0002cbfc0002cdcc0002
-cf820002cfac0002cfd60002cfe60002cff60002d0200002d04a0002d074
-0002d0840002d0940002d0be0002d0e80002d0f80002d1080002d1320002
-d15c0002d1860002d1960002d1a60002d1b60002d1c60002d1d60002d1e6
-0002d2100002d2200002d2300002d25a0002d2840002d2ae0002d2d80002
-d3020002d32c0002d3560002d3800002d3aa0002d3d40002d3fe0002d428
-0002d4520002d47c0002d4a60002d4d00002d4fa0002d5240002d54e0002
-d5780002d5a20002d5cc0002d5f60002d6200002d64a0002d6740002d69e
-0002d6c80002d6f20002d71c0002d7460002d7700002d79a0002d7c40002
-d7ee0002d8180002d8420002d86c0002d8960002d8c00002d8ea0002d914
-0002d93e0002d9680002d9920002d9bc0002d9e60002da100002da3a0002
-da640002da8e0002dab80002dae20002db0c0002dbac0002dbf00002dc66
-0002dc900002dcba0002dce40002dd0e0002dd380002dd620002dd8c0002
-ddb60002dde00002de0a0002de340002de5e0002de880002deb20002dedc
-0002df060002df300002df5a0002df840002dfae0002dfd80002e0020002
-e02c0002e0560002e08a0002e0be0002e0f20002e2840002e4200002e5bc
-0002e7480002e78e0002e7d40002e8420002e89e0002e8f00002e9600002
-ea380002eb040002ebdc0002eca80002ed480002ee620002ef160002ef98
-0002eff20002f0320002f1500002f29a0002f4320002f48e0002f4ec0002
-f5480002f5a40002f6580002f70e0002f7ba0002f8660002f9120002f9ca
-0002fa820002fb3a0002fb4c0002fb5e0002fb700002fb820002fb940002
-fc020002fc700002fd280002fd3a0002fd4c0002fd5e0002fd6e0002fd80
-0002fd920002fda40002fdb60002fdc80002fdda0002fe880002ff340002
-ffe20003008e00030126000301600003018a000301b4000302080003025a
-000302d6000303200003039c000303f000030474000304c60003053c0003
-0594000305fa00030650000306aa0003072800030774000307d200030836
-00030884000308d20003092a000309720003099c000309ca000309f00003
-0a2400030a5400030a8400030ad600030b4400030b9a00030c0e00030c62
-00030cd600030d1c00030d8400030dca00030e2600030e5600030e900003
-0eb600030ee600030f0c00030f3200030f6400030f9400030fe60003104c
-000310a2000311080003115c000311ca0003120c0003126c000312ae0003
-12fa0003133400031370000313aa000313e60003141a0003144c0003147c
-000314ac000314d6000314fc00031526000315540003157e000315ca0003
-160e0003164400031680000316b4000316e200031720000317500003178a
-000317b4000317e2000318080003182e0003185a000318b6000318e60003
-1916000319460003197e000319b2000319e000031a1000031a4000031a70
-00031aa000031ad400031b2a00031b5e00031bbe00031bf200031c4a0003
-1c7e00031cda00031d7800031e4600031f660003202e000320be00032154
-000323400003253c000326b400032830000329da00032b8c00032c740003
-2daa00032ea200032fb4000330d20003320800033372000334e000033676
-000337f2000339020003391200033a3e00033b7a00033cbc00033e400003
-3f1a00033f9000034046000340ec0003425c000342940003430e000343d0
-0003448a000344f2000345f80003472e000347fa00034958000349d20003
-4a4c00034b1800034bd200034c8600034ce200034d3c00034d8400034df4
-00034e7000034eba00034ef400034f3a00034f7e00034fd0000350220003
-50a40003512600035168000351a8000351de000352140003524200035270
-000352a4000352d80003531a0003535c00035398000353d40003540e0003
-54480003547a000354ac000354de000355100003554a00035584000355c6
-000356080003564a0003568c000356da000357280003576a000357ac0003
-57ec0003582c00035866000358a0000358ec0003593800035976000359b6
-000359fc00035a4200035a7e00035ad400035b1000035b4c00035b8c0003
-5bcc00035c0800035c4400035c8400035cc400035d0800035d4c00035da0
-00035e2e00035e7000035eb200035f1a00035f8200035fb400035fe60003
-601e00036056000360ec00036182000361cc00036216000362520003628e
-000362e40003633a00036384000363ce000364260003647e000364be0003
-64fe000365360003656e000365b800036602000366400003667e000366c0
-0003670200036756000367aa000367f0000368360003687c000368c20003
-69180003696e000369c400036a1a00036a6600036ab200036afe00036b4a
-00036bbe00036c3200036ca600036d1a00036d5800036d9600036dd40003
-6e1200036e5000036e8e00036ed200036f1600036f6200036fae0003700e
-0003705a00037098000370e6000371f60003724600037296000372ce0003
-73060003735c000373b2000374260003748a000374cc0003750e00037564
-000375b2000375fe0003764a0003768a000376ca000377120003775a0003
-77c6000378200003785800037890000378d000037910000379e000037adc
-00037b9c00037c8a00037ce000037d3600037d8800037ddc00037e400003
-7ea400037efa00037f5000037fc60003803c0003807e000380c000038102
-0003814400038186000381c80003821e00038274000382c60003831a0003
-83a200038424000384c400038566000385a4000385e2000386200003865c
-0003869a000386d80003871600038752000388360003892200038a380003
-8b5400038c1e00038ce800038de200038edc00038fda000390d8000391f6
-000393140003943a000395600003966200039764000397f6000398880003
-98c6000399040003995e000399b8000399f000039a2800039b3800039b48
-00039b9000039bd800039c3000039c8800039cba00039cec00039d2e0003
-9d7000039daa00039de400039e2800039e6c00039ee400039f5e00039fee
-0003a0320003a0720003a0f40003a1760003a2ce0003a2de0003a32c0003
-a37a0003a3b60003a3f20003a4380003a47e0003a4cc0003a51a0003a56a
-0003a5ba0003a6160003a6720003a7e80003a9500003a9880003a9c20003
-aa0e0003aa5a0003aaac0003aafe0003ab500003aba60003abe20003ac1e
-0003ac740003acc80003ae000003aea00003aeee0003af2e0003af680003
-b0fe0003b3820003b4460003b5dc0003b73a0003b8080003b9ae0003bc02
-0003be3a0003be800003beb20003bf5c0003c0800003c0a40003c13e0003
-c24a0003c35a0003c46a0003c5780003c6fe0003c7300003c7d20003c7fa
-0003c85c0003c8be0003c9200003c9820003c9c00003c9fe0003ca380003
-ca720003ca9e0003caea0003cb240003cb5e0003ccba0003ce0e0003ce1e
-0003cedc0003d0120003d0700003d1880003d3160003d3bc0003d5020003
-d5400003d57e0003d5bc0003d6100003d6380003d6920003d6f60003d73e
-0003d7a00003d8000003d8720003d8ee0003d96a0003d9ec0003da780003
-db040003db8e0003dc0e0003dc480003dc840003dde80003deb20003dee2
-0003df120003e04a0003e19a0003e1aa0003e2980003e36c0003e4640003
-e55a0003e6dc0003e8360003e8460003e95e0003ea0a0003eb4c0003eca2
-0003ecfe0003ee5c0003eeea0003f0900003f2020003f3160003f34e0003
-f3b20003f5620003f6cc0003f72e0003f8960003f99c0003fa520003fafe
-0003fc260003fd140003fdf40003ff34000400600004017a000402ea0004
-046400040474000405540004064a000406fa000407f6000408a2000409ac
-00040a9800040bc200040ce600040dea00040f1800041056000411c20004
-12f80004148c000416340004172c000418400004197200041a6400041a9c
-00041af200041ba000041bb000041c1200041c6e00041cd400041d200004
-1d6000041d9800041dc400041df200041e2c00041f6200041f960004201a
-000420d00004210000042184000421b4000421ec00042384000425100004
-255a00042594000425ea000426360004265c00042682000426c400042706
-0004274800042778000427b0000427e60004281c0004285e0004288e0004
-28be000429b400042ab800042aec00042b2400042b6a00042b9e00042bce
-00042c0600042c3a00042c6e00042c9e00042cce00042d0400042d3a0004
-2d6a00042d9a00042dce00042e0200042e3200042e6200042e9c00042ed0
-00042f0200042f3400042f6800042f9c00042fcc00042ffc0004302a0004
-305800043166000432d2000434060004353a0004356a000435a40004363e
-000437a800043904000439c800043adc00043b0c00043b4000043c380004
-3de800043e4000043eb800043ff400044032000440a4000440d400044104
-0004413e000441c6000441f600044226000443b6000445000004460c0004
-471a000448460004499c00044af800044c5800044d9200044f0400045064
-000450740004522a00045352000453ec0004557400045584000456800004
-58060004595e00045a1000045ae000045bec00045c9600045cce00045cde
-00045d8e00045e3400045eb000046000000460f4000461ea000462f60004
-63ce000464a80004653c0004664e000467de000468fc000469f200046a9c
-00046b4600046c1000046cb800046d8e00046e0a00046e6600046fc80004
-70fc000472980004735a0004745a00047532000476700004771c000477e6
-000478d6000479fc00047ad800047bde00047d1600047e0600047ea40004
-7f960004810600048250000484bc0004858e000486420004871000048804
-000489420004895200048a8600048b9800048ba800048cb400048de40004
-8e3800048fac000490d4000491e80004939a000495ae00049842000499fc
-00049b2800049d0800049eca0004a05c0004a1280004a2c40004a33a0004
-a3e80004a4c40004a5500004a5f20004a6940004a7780004a8b00004ab0c
-0004ac540004ac640004ac740004acd60004ad340004ad960004ae340004
-aecc0004afd00004b0be0004b0ce0004b0de0004b1780004b2120004b24e
-0004b2ca0004b33e0004b3940004b3c80004b44e0004b4da0004b5520004
-b5b00004b64a0004b6dc0004b75c0004b7de0004b8720004b8a60004b908
-0004b9ba0004bb800004bbb80004bd940004bea80004beb80004beee0004
-bf320004bf760004bfba0004bff00004c0220004c0640004c1000004c156
-0004c1fc0004c2740004c2fa0004c36a0004c3cc0004c4520004c4b20004
-c51c0004c5900004c6000004c65e0004c7040004c79c0004c8080004c898
-0004c8f60004c9640004ca0c0004cab80004cb4e0004cbb80004cc3a0004
-cc9e0004cd4a0004ce020004ceae0004cf3c0004cf980004d0040004d05a
-0004d0dc0004d15a0004d1e00004d26c0004d2c60004d3320004d3a20004
-d4120004d4820004d5060004d5960004d5fc0004d6760004d6f20004d76a
-0004d8100004d8ac0004d93c0004d99a0004da380004dab40004db460004
-dbe80004dc920004dd2a0004dd860004dddc0004de440004deea0004df92
-0004e05c0004e1020004e1640004e1bc0004e21c0004e2aa0004e3300004
-e3be0004e41e0004e4820004e4ec0004e5540004e5bc0004e63a0004e6c2
-0004e7560004e7c20004e82a0004e88e0004e9360004e9f00004ea9e0004
-eb2c0004eb8a0004ebf60004ec660004ed0c0004edb60004ee780004ef1a
-0004ef7e0004f00e0004f0800004f1100004f18e0004f20a0004f2760004
-f3040004f3600004f3be0004f4440004f4c00004f5280004f58c0004f5e0
-0004f64e0004f6b60004f7340004f7aa0004f8240004f8a40004f9000004
-f9660004f9ca0004fa6a0004fb0c0004fbc20004fc720004fcce0004fd46
-0004fda40004fe2e0004fec60004ff560004ffbc0005001a000500a80005
-011a000501ae00050246000502b6000503260005039e000503fc0005045c
-000504d60005053000050590000505ea00050646000506ae0005073c0005
-0772000507aa0005083600050860000508a20005093600050a2400050ab4
-00050aea00050b3a00050bac00050c5800050cea00050d4200050d9c0005
-0df400050e4e00050ed200050f5800050ffc000510a4000510e200051152
-000511e60005127e00051314000513be000513f000051440000514940005
-14da0005157e000516080005168e000516ee000517320005178000051820
-000518b000051950000519f600051a9c00051b6000051b9200051bbc0005
-1c4200051cf200051d2400051d4c00051e1a00051e7800051f1200051f60
-00051fc60005206e000520dc00052142000521ce00052240000522b60005
-236a000523c40005243400052470000524c200052548000525a80005264c
-0005272c00052854000529e400052a4000052a9600052dbc00052e560005
-2eb200052efa00053068000531ba000532000005330e000533a6000534b4
-000535be0005366000053748000537da000538760005396800053a680005
-3ae400053b6a00053bb200053d2400053e8000053f6400053fb400053fe8
-000540d6000541fe00054398000544c8000545de000547120005482e0005
-489c0005493000054a7000054b2600054c9000054dc000054ef20005501e
-000550ca0005519000055262000553bc0005553c0005566c000557880005
-594200055a9400055b8000055c5c00055d1e00055e8800055fd800055fe8
-00055ff800056008000560c000056176000561b2000561e8000562200005
-6256000563e2000565f6000566e0000567f80005697000056ade00056bc8
-00056cfa00056e4200056fc800057166000572ba000574a80005766e0005
-78a400057af200057bda00057cb600057dfe00057f800005806800058182
-000581c40005820e0005842a000586420005878e0005890400058b620005
-8d6400058de800058e1800058e6400058f2c00058ffc0005919000059218
-00059280000592c0000592fe000594b0000596e000059816000599f80005
-9ad400059bee00059d9a00059fa60005a0a80005a1940005a3860005a58e
-0005a6fa0005a87e0005a9de0005ab4c0005abda0005ac6a0005ad840005
-ae900005b0520005b1be0005b3ae0005b5780005b60c0005b6a80005b73e
-0005b7c60005b8ac0005b9840005bb1e0005bcb00005bcd60005bcfc0005
-bd0c0005bd3c0005bd6c0005bee60005c0880005c1320005c2140005c2d4
-0005c37e0005c4180005c4fa0005c5b80005c6940005c84a0005c9840005
-ca100005ca400005ca700005caa40005cad80005cae80005caf80005cb28
-0005cb580005cb8c0005cbc00005cbf40005cc280005cc5c0005cc900005
-ce0a0005ce1a0005ce4a0005ce7a0005ceb20005cee60005cf1a0005cf4e
-0005cf820005cfb60005cfea0005d0220005d0580005d0880005d0c80005
-d1000005d1480005d18e0005d1c20005d1f60005d2300005d2680005d308
-0005d3180005d46a0005d6320005d7d80005d9820005dace0005dbe40005
-dcf20005de080005df020005dfea0005e10c0005e2080005e2e00005e3d0
-0005e48c0005e53e0005e6080005e67a0005e7200005e7b00005e8140005
-e9220005e9880005ea360005eb2c0005eb940005ebfc0005ecac0005ee86
-0005ef8a0005f00a0005f0480005f0f40005f1820005f26a0005f3020005
-f3680005f4660005f5280005f5e20005f6200005f6b00005f7b20005f846
-0005f88a0005f9a80005fad20005fcb40005fe760005ffac000600da0006
-01da000602020006022a0006026000060292000602be000602e60006030e
-0006033c0006039a000604080006044000060478000604a8000604ce0006
-0502000605380006055e00060584000605b2000605e00006060c00060682
-000606aa0006070c00060732000607580006077e000607a4000607d40006
-0804000608340006086e0006089e000608d400060904000609360006095c
-00060982000609b6000609ec00060a1c00060a4c00060a7200060a980006
-0abe00060aec00060b2000060ba600060bea00060c2400060c5800060c9c
-00060cd600060d1000060d3600060d6000060dac00060dee00060e140006
-0e4200060e6800060e8e00060ece00060f0000060f3000060f6000060f86
-00060fac00060fdc0006100c00061032000610580006107e000610a40006
-10ca000610f000061118000611a0000611ca0006123e00061266000612dc
-000613040006136600061398000613ca000613fa00061432000614640006
-1492000614cc000614f40006155400061596000615c6000615f200061622
-000616520006167a000616a2000616ca0006172c00061754000617b20006
-17f60006183a0006186a000618a0000618c6000618ee000619140006193c
-000619620006198a000619b2000619dc00061a0200061a2800061a4e0006
-1a8000061aa800061b2e00061b5800061bc200061bf200061c2200061c48
-00061c6e00061cc600061cf600061d3200061d5c00061d8c00061dbc0006
-1df000061e2400061e5400061e9400061ece00061f1600061f3c00061f62
-00061f8800061fae00061fd4000620140006205400062090000620c00006
-20f0000621200006215000062188000621c000062200000622400006227a
-000622b4000622f00006232e00062378000623c2000624080006244e0006
-2490000624d20006250200062532000625660006259a000625d40006260e
-0006265a000626a6000626fe00062756000627ae0006280c0006283c0006
-286c000628a2000628d80006290e0006294a0006297e000629b200062a06
-00062a5a00062aae00062b0200062b5600062baa00062c0200062c5a0006
-2c8800062cb600062ce800062d1a00062d6000062da600062dd800062e0a
-00062e5c00062eb400062ef800062f3c00062f8000062fc4000630180006
-306c0006309c000630cc000631020006313800063176000631bc00063210
-0006325a000632ac000632fe0006335e000633be000633ee000634200006
-345a00063494000634e60006353a00063584000635cc0006360e00063678
-000636c6000637120006374400063776000637aa000637de000638140006
-384a00063888000638be000638f00006392c00063982000639d800063a36
-00063a9400063aea00063b4000063b7400063ba400063be800063c1e0006
-3c4e00063c9200063cd000063d0800063d4000063d7600063db200063de2
-00063e1e00063e5e00063ea400063eee00063f3a00063f8600063fdc0006
-403200064080000640ce0006411c0006416c000641c8000642240006427c
-000642d4000643280006437c000643be0006440000064448000644900006
-44d8000645260006456a000645ae000646140006467a000646e000064746
-000647ac000648120006487c000648e60006492e00064976000649be0006
-4a0600064a5200064a9e00064af200064b3e00064b8200064bd000064c38
-00064ca000064d1000064d8000064de800064e5000064e9000064ece0006
-4f1800064f4200064f8800064fc00006500e0006503e0006506e000650aa
-000650de000651040006515800065196000651ea000652d0000653f80006
-543a00065460000654b6000654e60006552800065570000655be00065608
-000656580006567e000657660006584a0006599c000659ca000659f80006
-5a8c00065b1200065b4000065bca00065bfa00065c2a00065c7800065cc6
-00065daa00065e8600065fca00065ffa0006602a000660c0000661480006
-6178000661a8000661d80006626800066298000662c80006631a00066362
-000663b80006644e000664e60006655a000665ac000665d60006662c0006
-6660000666aa000666e20006673200066770000667bc000667e20006685e
-000668b0000669c200066bcc00066d8000066f0200067074000673160006
-75e6000677a6000678ec00067b4600067c8800067e9e00067ef000067f40
-00067f9600067fec0006804e000680d600068324000684b6000686c20006
-87de0006899200068b1400068bd400068cb600068d1e00068d8000068df6
-00068e5e00068f0a00068f7a0006900a0006911e000691e20006922e0006
-92c40006937000069414000694be000695080006954a000695c000069628
-000696b800069766000697d0000698340006989a00069954000699ea0006
-9a4800069a7200069a9c00069aac00069abc00069b7e00069c8200069e8c
-00069fe200069ff20006a0a20006a1860006a1e60006a1f60006a2520006
-a2b00006a3d00006a4be0006a4ce0006a4de0006a4ee0006a4fe0006a5e4
-0006a6e40006a8bc0006aa780006ab7e0006abf80006ac720006ad240006
-ad340006ae420006ae520006ae620006af240006b0580006b1440006b154
-0006b1640006b1740006b2da0006b4460006b5720006b5820006b5920006
-b5a20006b5b20006b6940006b6a40006b8060006b9100006ba0e0006bb46
-0006bc180006bc960006bd140006be340006beb00006befc0006bf880006
-c09c0006c0f00006c2320006c2f20006c3be0006c4b40006c5be0006c670
-0006c7d60006c83c0006c9000006cb020006cc900006ce0e0006cf3e0006
-d1f00006d3320006d4600006d5d80006d7500006d8d00006da5e0006dc10
-0006dc7e0006dde20006df1a0006e01e0006e1540006e2860006e3560006
-e4260006e5820006e65c0006e6fc0006e8000006e92a0006ea280006eba8
-0006ed120006ee500006efc80006f1140006f1f60006f25e0006f3000006
-f3a00006f49e0006f6060006f7400006f8d40006fa1e0006fb020006fb60
-0006fc660006fcfc0006fdbe0006fe640006fea400070050000701220007
-01e800070310000704b0000705bc00070614000707ac0007083a0007084c
-0007087c000708ac000708e40007091c000709520007098e000709c40007
-0a0000070b6e00070bb800070c5200070cea00070d6400070de800070e4e
-00070efa00070f46000710660007111c000711f20007122a000712680007
-12dc000713d6000714f4000715f6000716380007167a000716e8000716f8
-000717080007171800071728000717380007174800071758000717680007
-17780007178800071798000717980007191c0007192c000719ec00071ab2
-00071be800071dde00071fe0000721dc00072412000726120007267e0007
-27900007292200072a7a00072b2c00072b7000072c0e00072d3e00072d8e
-00072e2400072f6000072f70000731260007325a000732aa000733000007
-33c20007340600073448000734ce0007352c0007361e000736ac000736e2
-0007375c000737d4000738240007393000073a2600073ad000073afa0007
-3b2400073b4e00073b7800073bb800073bf800073c3000073c6800073cb2
-00073cfc00073d3c00073d7c00073dc600073e1000073e5000073e900007
-3eea00073f4400073f7e00073fb800073ffc0007404000074084000740c8
-0007411c00074170000741bc00074208000742460007428a000742da0007
-432a00074384000743e20007440c00074436000744d00007456a000745ae
-000745f2000747080007471800074760000747a8000747fa0007484c0007
-48b60007490a00074956000749b400074a3e00074aa200074ae600074b30
-00074b9800074be200074c2200074c6a00074ca600074ce200074d1e0007
-4d5800074d9a00074ddc00074e1c00074e5c00074ea600074ef000074f46
-00074f9e00074fec0007503a0007507c000750ca0007510c000751560007
-5198000751dc0007523800075294000752e00007532c00075376000753c0
-000753fe0007543c000754ba0007553800075572000755ac000756460007
-56e0000757b400075888000758e400075940000759b400075a2800075b86
-00075b9600075c8000075c9000075cc600075cfc00075d3600075d700007
-5dac00075de800075e2e00075e7400075fda00076190000762dc0007649a
-00076610000767b8000768e8000769ee00076c0c00076d5000076ee60007
-706e000770ec0007723000077438000774cc00077560000776b4000777de
-0007795800077a9800077c0400077cf200077ebc00078050000780d20007
-8204000782ee0007845600078538000786ee000787e00007894200078a7e
-00078b7200078d3600078ebe00079062000791c600079362000795200007
-96a600079742000798b6000799a800079a9000079c1000079d6200079e82
-0007a01a0007a1f00007a37e0007a4280007a4de0007a6900007a7340007
-a7c20007a80e0007a85a0007a8d20007a9b00007aa2a0007aacc0007ab20
-0007ac840007adb00007aec20007afc40007b08c0007b2000007b3400007
-b5660007b6100007b73a0007b83e0007b9de0007baca0007bbc40007bcc2
-0007bda80007bec20007c07c0007c22a0007c3980007c4100007c4840007
-c5a20007c6260007c7280007c8b40007ca2c0007cb620007cc6c0007cde2
-0007cf5a0007d14c0007d33a0007d5000007d5740007d6240007d6da0007
-d78a0007d8480007d9420007da460007db400007dc4c0007dcd40007dd62
-0007ddea0007de7e0007df5a0007e0500007e1340007e22a0007e2be0007
-e37a0007e40e0007e4cc0007e5bc0007e6c40007e7c20007e8d60007e9f8
-0007eb0c0007ec4c0007ed860007eea80007efbc0007f1000007f2540007
-f4680007f61a0007f6ce0007f7ea0007f8c00007f9de0007fabc0007fc50
-0007fd0a0007fda60007fe980007ff800008006c000800ea000801e40008
-03220008044e00080482000804c6000804d600080576000806180008070e
-000807fa000808d4000809ac00080b0a00080c6a00080d0800080d9e0008
-0ddc00080e1c00080e5a00080e9a00080ef400080f4c00080fa60008100a
-0008109600081292000812e20008140e0008149400081514000815ee0008
-16c2000817c6000819b200081aca00081b3a00081bca00081c8c00081d5e
-00081dca00081e4800081f9c00081fe2000820280008210c000821480008
-21a6000821e4000822160008225a0008229c000822cc000100000d3500f2
-003c009d000700020010002f005600000468041d0005000200>
-<0000003a02be0000000300000000006a00000000000300000001000a006a
-0000000300000002000e00740000000300000003005e0082000000030000
-0004000a00e00000000300000005001800ea0000000300000006000e0102
-000000030000000700ba01100000000300000008003001ca000000030000
-0009008a01fa000000030000000d02aa028400010000000000000035052e
-000100000000000100050563000100000000000200070568000100000000
-0003002f056f00010000000000040005059e0001000000000005000c05a3
-0001000000000006000705af0001000000000007005d05b6000100000000
-00080018061300010000000000090045062b000100000000000d01550670
-0003000104030002000c07c50003000104050002001007d1000300010406
-0002000c07e10003000104070002001007ed0003000104080002001007fd
-0003000104090000006a080d0003000104090001000a0877000300010409
-0002000e08810003000104090003005e088f0003000104090004000a08ed
-0003000104090005001808f70003000104090006000e090f000300010409
-000700ba091d0003000104090008003009d70003000104090009008a0a07
-000300010409000d02aa0a9100030001040a0002000c0d3b00030001040b
-000200100d4700030001040c0002000c0d5700030001040e0002000c0d63
-0003000104100002000e0d6f000300010413000200120d7d000300010414
-0002000c0d8f000300010415000200100d9b0003000104160002000c0dab
-0003000104190002000e0db700030001041b000200100dc500030001041d
-0002000c0dd500030001041f0002000c0de10003000104240002000e0ded
-00030001042a0002000e0dfb00030001042d0002000e0e0900030001080a
-0002000c0e170003000108160002000c0e23000300010c0a0002000c0e2f
-000300010c0c0002000c0e3b00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0052006500670075006c00610072004d006f006e006f
-0074007900700065003a0041007200690061006c00200052006500670075
-006c00610072003a00560065007200730069006f006e00200035002e0030
-003100200028004d006900630072006f0073006f00660074002900410072
-00690061006c00560065007200730069006f006e00200035002e00300031
-0041007200690061006c004d00540041007200690061006c002000690073
-00200061002000740072006100640065006d00610072006b0020006f0066
-00200054006800650020004d006f006e006f007400790070006500200043
-006f00720070006f0072006100740069006f006e00200069006e00200074
-0068006500200055006e0069007400650064002000530074006100740065
-007300200061006e0064002f006f00720020006f00740068006500720020
-0063006f0075006e00740072006900650073002e0054006800650020004d
-006f006e006f007400790070006500200043006f00720070006f00720061
-00740069006f006e004d006f006e006f0074007900700065002000540079
-00700065002000440072006100770069006e00670020004f006600660069
-006300650020002d00200052006f00620069006e0020004e006900630068
-006f006c00610073002c0020005000610074007200690063006900610020
-005300610075006e0064006500720073002000310039003800320059006f
-00750020006d006100790020007500730065002000740068006900730020
-0066006f006e007400200074006f00200064006900730070006c00610079
-00200061006e00640020007000720069006e007400200063006f006e0074
-0065006e00740020006100730020007000650072006d0069007400740065
-006400200062007900200074006800650020006c006900630065006e0073
-00650020007400650072006d007300200066006f00720020007400680065
-002000700072006f006400750063007400200069006e0020007700680069
-006300680020007400680069007300200066006f006e0074002000690073
-00200069006e0063006c0075006400650064002e00200059006f00750020
-006d006100790020006f006e006c0079002000280069002900200065006d
-0062006500640020007400680069007300200066006f006e007400200069
-006e00200063006f006e00740065006e0074002000610073002000700065
-0072006d0069007400740065006400200062007900200074006800650020
-0065006d00620065006400640069006e0067002000720065007300740072
-0069006300740069006f006e007300200069006e0063006c007500640065
-006400200069006e0020007400680069007300200066006f006e0074003b
-00200061006e006400200028006900690029002000740065006d0070006f
-0072006100720069006c007900200064006f0077006e006c006f00610064
-0020007400680069007300200066006f006e007400200074006f00200061
-0020007000720069006e0074006500720020006f00720020006f00740068
-006500720020006f00750074007000750074002000640065007600690063
-006500200074006f002000680065006c00700020007000720069006e0074
-00200063006f006e00740065006e0074002ea9203230303620546865204d
-6f6e6f7479706520436f72706f726174696f6e2e20416c6c205269676874
-732052657365727665642e417269616c526567756c61724d6f6e6f747970
-653a417269616c20526567756c61723a56657273696f6e20352e30312028
-4d6963726f736f667429417269616c56657273696f6e20352e3031417269
-616c4d54417269616c20697320612074726164656d61726b206f66205468
-65204d6f6e6f7479706520436f72706f726174696f6e20696e2074686520
-556e697465642053746174657320616e642f6f72206f7468657220636f75
-6e74726965732e546865204d6f6e6f7479706520436f72706f726174696f
-6e4d6f6e6f7479706520547970652044726177696e67204f666669636520
-2d20526f62696e204e6963686f6c61732c20506174726963696120536175
-6e646572732031393832596f75206d617920757365207468697320666f6e
-7420746f20646973706c617920616e64207072696e7420636f6e74656e74
-206173207065726d697474656420627920746865206c6963656e73652074
-65726d7320666f72207468652070726f6475637420696e20776869636820
-7468697320666f6e7420697320696e636c756465642e20596f75206d6179
-206f6e6c792028692920656d626564207468697320666f6e7420696e2063
-6f6e74656e74206173207065726d69747465642062792074686520656d62
-656464696e67207265737472696374696f6e7320696e636c756465642069
-6e207468697320666f6e743b20616e6420286969292074656d706f726172
-696c7920646f776e6c6f6164207468697320666f6e7420746f2061207072
-696e746572206f72206f74686572206f7574707574206465766963652074
-6f2068656c70207072696e7420636f6e74656e742e004e006f0072006d00
-61006c006f00620079010d0065006a006e00e9006e006f0072006d006100
-6c005300740061006e0064006100720064039a03b103bd03bf03bd03b903
-ba03ac00a90020003200300030003600200054006800650020004d006f00
-6e006f007400790070006500200043006f00720070006f00720061007400
-69006f006e002e00200041006c006c002000520069006700680074007300
-2000520065007300650072007600650064002e0041007200690061006c00
-52006500670075006c00610072004d006f006e006f007400790070006500
-3a0041007200690061006c00200052006500670075006c00610072003a00
-560065007200730069006f006e00200035002e0030003100200028004d00
-6900630072006f0073006f0066007400290041007200690061006c005600
-65007200730069006f006e00200035002e00300031004100720069006100
-6c004d00540041007200690061006c002000690073002000610020007400
-72006100640065006d00610072006b0020006f0066002000540068006500
-20004d006f006e006f007400790070006500200043006f00720070006f00
-72006100740069006f006e00200069006e00200074006800650020005500
-6e0069007400650064002000530074006100740065007300200061006e00
-64002f006f00720020006f007400680065007200200063006f0075006e00
-740072006900650073002e0054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-4d006f006e006f0074007900700065002000540079007000650020004400
-72006100770069006e00670020004f006600660069006300650020002d00
-200052006f00620069006e0020004e006900630068006f006c0061007300
-2c0020005000610074007200690063006900610020005300610075006e00
-64006500720073002000310039003800320059006f00750020006d006100
-7900200075007300650020007400680069007300200066006f006e007400
-200074006f00200064006900730070006c0061007900200061006e006400
-20007000720069006e007400200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-200074006800650020006c006900630065006e0073006500200074006500
-72006d007300200066006f00720020007400680065002000700072006f00
-6400750063007400200069006e0020007700680069006300680020007400
-680069007300200066006f006e007400200069007300200069006e006300
-6c0075006400650064002e00200059006f00750020006d00610079002000
-6f006e006c0079002000280069002900200065006d006200650064002000
-7400680069007300200066006f006e007400200069006e00200063006f00
-6e00740065006e00740020006100730020007000650072006d0069007400
-7400650064002000620079002000740068006500200065006d0062006500
-6400640069006e0067002000720065007300740072006900630074006900
-6f006e007300200069006e0063006c007500640065006400200069006e00
-20007400680069007300200066006f006e0074003b00200061006e006400
-200028006900690029002000740065006d0070006f007200610072006900
-6c007900200064006f0077006e006c006f00610064002000740068006900
-7300200066006f006e007400200074006f00200061002000700072006900
-6e0074006500720020006f00720020006f00740068006500720020006f00
-750074007000750074002000640065007600690063006500200074006f00
-2000680065006c00700020007000720069006e007400200063006f006e00
-740065006e0074002e004e006f0072006d0061006c004e006f0072006d00
-610061006c0069004e006f0072006d0061006c004e006f0072006d00e100
-6c004e006f0072006d0061006c0065005300740061006e00640061006100
-720064004e006f0072006d0061006c004e006f0072006d0061006c006e00
-79004e006f0072006d0061006c041e0431044b0447043d044b0439004e00
-6f0072006d00e1006c006e0065004e006f0072006d0061006c004e006f00
-72006d0061006c004e0061007600610064006e006f0074006801b001a103
-00006e00670041007200720075006e00740061004e006f0072006d006100
-6c004e006f0072006d0061006c004e006f0072006d0061006c004e006f00
-72006d0061006c000000b900540328b326181fd0bc032900e00329000203
-29b22b1d1fb90327031db23b1f40b80323b31215320f412d03200001002f
-0320000100200320006f032000af032000bf03200004005f031e00010010
-031e007f031e0080031e00af031e00bf031e00d0031e00060000031e0010
-031e0020031e006f031e009f031e00e0031e0006031d031cb2201f104127
-0319007f03190002000f031700ef031700ff03170003001f0317002f0317
-004f0317005f0317008f0317009f03170006000f0317005f0317006f0317
-007f031700bf031700f00317000600400317b2923340b80317b28b3340b8
-0317b36a6c3240b80317b2613340b80317b35c5d3240b80317b357593240
-b80317b34d513240b80317b344493240b80317b23a3340b80317b3313432
-40b80317b32e423240b80317b3272c3240b80317b312253280b80317b30a
-0d32c04116031600d00316000200700316000102c4000f0101001f00a003
-1500b0031500020306000f0101001f00400312b32426329fbf0304000103
-0203010064001fffc00301b20d1132410a02ff02ef0012001f02ee02ed00
-64001fffc002edb30e11329f414a02e200af02e200bf02e2000302e202e2
-02e102e1007f02e00001001002e0003f02e0009f02e000bf02e000cf02e0
-00ef02e0000602e002e002df02df02de02de000f02dd002f02dd003f02dd
-005f02dd009f02dd00bf02dd00ef02dd000702dd02dd001002dc00010000
-02dc0001001002dc003f02dc000202dc02dc001002db000102db02db000f
-02da000102da02daffc002d3b2373932b9ffc002d3b22b2f32b9ffc002d3
-b21f2532b9ffc002d3b2171b32b9ffc002d3b2121632b802d2b2f9291fb9
-0326031cb23b1f40bb0322003e00330322b225311fb80318b23c691fb802
-e3b3202b1fa0413002d400b002d40002000002d4001002d4002002d40050
-02d4006002d4007002d40006006002d6007002d6008002d6009002d600a0
-02d600b002d60006000002d6001002d6002002ca002002cc002002d60030
-02d6004002d6005002d6000802d0b2202b1fb802cfb226421f411602ce02
-c70017001f02cd02c80017001f02cc02c60017001f02cb02c50017001f02
-c902c5001e001f02ca02c6b21e1f00410b02c6000002c7001002c6001002
-c7002f02c5000502c1b324121fff411102bf0001001f02bf002f02bf003f
-02bf004f02bf005f02bf008f02bf000602bf0222b2641f12410b02bb00ca
-0800001f02b200e90800001f02a600a20800406a1f402643493240204349
-3240263a3d3240203a3d329f209f26024026969932402096993240268e92
-3240208e92324026848c324020848c3240267a813240207a813240266c76
-3240206c76324026646a324020646a3240265a5f3240205a5f3240264f54
-3240204f5432b8029eb724271f374f6b0120410f02770030027700400277
-00500277000402770277027700f90400001f029bb22a2a1fb8029a402b29
-2a1f80ba0180bc0180520180a201806501807e01808101803c01805e0180
-2b01801c01801e0180400180bb0138000100800140b40180400180bb0138
-00010080013940180180ca0180ad01807301802601802501802401802001
-3740b80221b2493340b80221b2453340b80221b341423240b80221b33d3e
-320f410f0221003f0221007f0221000300bf022100cf022100ff02210003
-00400221b320223240b80221b3191e3240b80222b32a3f3240b80221b32e
-3a326f414802c3007f02c3008f02c300df02c30004002f02c3006002c300
-cf02c30003000f02c3003f02c3005f02c300c002c300ef02c300ff02c300
-0600df02220001008f02220001000f0222002f0222003f0222005f022200
-7f022200ef0222000600bf022100ef02210002006f0221007f022100af02
-210003002f0221003f0221004f0221000302c302c3022202220221022140
-1d101c102b1048038f1c010f1e014f1eff1e023700161600000012110811
-b8010db6f70df8f70d00094109028e028f001d001f0290028f001d001f02
-8fb2f91d1fb80198b226bb1f41150197001e0401001f013900260125001f
-013800730401001f0135001c0801001f0134001c02ab001f0132b21c561f
-b8010fb2262c1fba010e001e0401b61ff91ce41fe91cb80201b61fe81cbb
-1fd720b80401b21fd51cb802abb61fd41c891fc92fb80801b21fbc26b801
-01b21fba20b80201b61fb91c381fadcab80401b21f8126b8019ab21f7e26
-b8019ab61f7d1c471f6b1cb80401b21f6526b8019ab21f5e73b80401400f
-1f52265a1f481c891f441c621f4073b80801b61f3f1c5e1f3c26b8019ab2
-1f351cb80401b61f301cbb1f2b1cb80401b61f2a1c561f291cb80101b21f
-231eb80401b21f5537b80168402c07960758074f07360732072c0721071f
-071d071b071408120810080e080c080a080808060804080208000814b8ff
-e0402b000001001406100000010006040000010004100000010010020000
-01000200000001000002010802004a00b013034b024b5342014bb0c06300
-4b6220b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807
-ff52b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ff
-b101018e851bb0124358b900010111858d1bb900010128858d5959001816
-763f183f123e113946443e113946443e113946443e113946443e11394660
-443e11394660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b2b
-182b1db0964b5358b0aa1d59b0324b5358b0ff1d594bb09353205c58b901
-f201f04544b901f101f045445958b9033e01f2455258b901f2033e445959
-4bb8015653205c58b9002001f14544b9002601f145445958b9081e002045
-5258b90020081e4459594bb8019a53205c58b9002501f24544b9002401f2
-45445958b909090025455258b9002509094459594bb8040153205c58b173
-244544b1242445445958b917200073455258b9007317204459594bb80401
-53205c58b1ca254544b1252545445958b9168000ca455258b900ca168044
-59594bb03e53205c58b11c1c4544b11e1c45445958b9011a001c455258b9
-001c011a4459594bb05653205c58b11c1c4544b12f1c45445958b9018900
-1c455258b9001c01894459594bb8030153205c58b11c1c4544b11c1c4544
-5958b90de0001c455258b9001c0de04459592b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65
-422b2b01b33b59635c456523456023456560234560b08b766818b0806220
-20b163594565234520b003266062636820b003266165b059236544b06323
-4420b13b5c4565234520b003266062636820b003266165b05c236544b03b
-2344b1005c455458b15c406544b23b403b4523614459b347503437456523
-456023456560234560b089766818b080622020b134504565234520b00326
-6062636820b003266165b050236544b034234420b147374565234520b003
-266062636820b003266165b037236544b0472344b10037455458b1374065
-44b24740474523614459004b5342014b5058b108004259435c58b1080042
-59b3020b0a124358601b2159421610703eb0124358b93b21187e1bba0400
-01a8000b2b59b00c2342b00d2342b0124358b92d412d411bba0400040000
-0b2b59b00e2342b00f2342b0124358b9187e3b211bba01a80400000b2b59
-b0102342b0112342002b7475737500184569444569444569447373737374
-757374752b2b2b2b74752b2b2b2b2b737373737373737373737373737373
-737373737373737373732b2b2b45b0406144737400004bb02a534bb03f51
-5a58b1070745b040604459004bb03a534bb03f515a58b10b0b45b8ffc060
-4459004bb02e534bb03a515a58b1030345b040604459004bb02e534bb03c
-515a58b1090945b8ffc06044592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b752b2b2b2b2b2b2b435c58b9008002bbb301401e017400735903b01e4b
-5402b0124b545ab012435c5a58ba009f02220001007359002b7473012b01
-732b2b2b2b2b2b2b2b737373732b2b2b2b2b002b2b2b2b2b2b0045694473
-456944734569447374754569447345694445694445694473744569444569
-44732b2b2b2b2b732b002b732b74752b2b2b2b2b2b2b2b2b2b2b2b2b2b73
-7475732b7374757374752b2b2b742b2b000000>
-[15785 15901 16277 16325 16277 16273 15933 16169 16277 15721 16361 15561 15973
-16029 16305 15693 16345 16249 15893 15629 16365 15481 16245 16249 16357 16337
-15821 15749 16345 15937 16257 16033 19077 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-2 3242 17 <000100ba0000018700cd000300254018023c000a023c5f006f007f00af00
-04a0000100a004a198182b10f65d5ded003fed313033353315bacdcdcd00
->ArialMT AddT42Char 
-3 4064 66 <0001ffe1fe69048afeeb0003001a400c013f00021a050019044341182b4e
-10e410e6002f4ded3130033521151f04a9fe69828200>ArialMT AddT42Char 
-3 4240 68 <0002004affe8041c043e00280037022d402c090d092a190d1a2a290d2a2a
-390d3615371b3a2a492a5d0d5d2a6a0d692a60308a0d86299a169b1aa90d
-1528b8ffe8b40b0b065527b8ffe840190b0b0655a619aa28b619bb28c419
-cf28d215dd28084416011eb8fff440110c0c065512120c0c0655050c0c0c
-065535b8ffe040550c0c06551f171f182b2c2a343904392c4904482c5608
-592b6608692b760c870cc90cf90df92b1137340e0104102f243417322114
-185f296f2902291c2f0e3f0e8f0e9f0eff0e059f0eaf0eef0e030e0c0f0f
-02550eb8ffeab4101002550eb8fff44015101006550e0c0d0d06550e060f
-0f06550e0e1c0317b802aab61895141c1c0700b8fff4401a0c0c06550045
-270a321c030b2961106100060d0d025500252124b8ffecb41010025524b8
-ffec400b0d0d025524040c0c025524b8ffe4b40b0b025524b8fff4b40b0b
-065524b8ffdc400b1010065524060f0f065524b8fffcb40c0c065524b802
-5b400e27400026102620263026af260539b8ffc0b40e0e025526b8ffd6b6
-0e0e0255263139b8ffc0400d1e23343039c03902a039013917b8fff44041
-10100655172518222f24bf06cf06021f063f0602060e0f0f0255060c0d0d
-025506180c0c0255060c0b0b0255060c0b0b0655060e0d0d065506100c0c
-065506313810f62b2b2b2b2b2b2b5d71edf4ed2b105d712bf62b2b5dedf4
-2b2b2b2b2b2b2b2b3cfd2be5e5003fed3fe42b3fedfde41112392f2b2b2b
-2b2b5d71ed711112391112393901111217393130005d2b2b2b2b01715d2b
-2b0071250606232226353436363736373637363534272623220607273e02
-333216161716151514161723260306070e02151416333236373635033c64
-b96aafbc477348356bda67013345887f791db0186ed08988aa5010091722
-bc1c1762c46f5c326d6968a2261d835546ab854e814e140e0d1a24250a6e
-2d3d597118718b4b40614a2e78f0fb853d3801dd281c10284d2f48605b4f
-3d77>ArialMT AddT42Char 
-3 5440 70 <00010050ffe803ed043e001a015ab1020243545840340e7f0f010f0b0140
-0050007000030004121c0b07181c040b010e1507080e0e0255070c0d0d02
-55070c0c0c025507100b0b0255072f2b2b2b2bcdd4c6003fed3fed10c45d
-3210c45d3231301b4047090c011f1c4313431753135317601360179b029b
-039a0da410a41a0c080d190a6a0269036a05750c700d800da60cb509b60a
-b50c0c160c860ce302030e225f0f6f0f7f0f030f01b802aa407930004000
-5000600070009000a000e000f00009000f0f0b000004121c0b07181c040b
-1c0f010f240e080d0d06550e221b000100240b2b1f010100010101400b0b
-065501401010065501480c0c0655011a0d0d065501491c1524cf07011f07
-3f0702070e0b0b0655070a1010065507120c0c065507311b34c4182b10f6
-2b2b2b5d71ed10f62b2b2b2b5d724b53234b515a58b90001ffc03859ed72
-f42bed72003fed3fed12392f11392f105de4105de43130005d71015d7159
-011706062322001134123633321617072626232206151416333236033cb1
-1defaedafef772e989addc1faf197f5a88aaa4846a8e018517b7cf011d01
-0aac010281afa11b6b6cc3d3d6c28200>ArialMT AddT42Char 
-3 7098 74 <00020042fe5103ea043e001e002a016f40600b0b05142c0b25144c0b4514
-06091d191d2c0b26142c23390b36144a0b46145607580b680bfa0af5150e
-2e232c273e233e274c27902ca02c07362136293f2c460b46214529542154
-29690763216329602c802cda27e821ee23ef271117160615b802b1b4281c
-130701b802aa401020003000600070008000c000d0000700b8027d403205
-1c1c0f0a45221c0c0a16153325330a251818d01701101740176017801704
-2c400b0c02552c400d0d025517121010025517b8fff440110f0f02551706
-0e0e025517160d0d025517b8ffea400b0b0b065517121010065517b8ffee
-b40c0c065517b8fffc404a0d0d065517740f012500221f24bf0fcf0fdf0f
-ff0f041f0f3f0f4f0f030f200b0b02550f1a0c0c02550f220d0d02550f1c
-0b0b06550f0c0d0d06550f1a0c0c06550f192b2c74213450182b2b4ef42b
-2b2b2b2b2b5d714dedf4ed10fd2b2b2b2b2b2b2b2b2b2b5d713c10fde4f6
-3c003fede43fedfd5de43fede43f3c3130015d71005d7117171617163332
-363736270623220235341236333217353311140606232226131416333236
-35342623220666af0b3243747d88180e0176b0dbf06ed18dbc7aa665dba0
-beea99a67d7ca8ad7a78a8581a512532645a37b08b013cdd9801018c9880
-fc6af8cf78ab032ad1c0bfccc3c6c300>ArialMT AddT42Char 
-3 8014 76 <000200880000013c05ba0003000700cd405e09360b0b02554f099009a009
-b009c009df09f0090700091f09700980099f09b009c009df09e009ff090a
-1f09010001070402030906037e0100060506040a0607250500049f04a004
-b004c004e00406c004f0040200042004d004e0040404b8fff8b410100255
-04b8fffa40170e0e025504040c0c0255040a0b0b025504140b0b065504b8
-ffeab41010065504b8fffeb40d0d065504b8fffc400a0c0c0655044e0847
-50182b10f62b2b2b2b2b2b2b2b5d71723cfd3c003f3f3c3fed0111123939
-111239393130015d72712b133533150311331188b4b4b404ebcfcffb1504
-26fbda00>ArialMT AddT42Char 
-3 10918 83 <00020087fe690421043e0012001e0162408e0c102d103d104b10043f20b0
-20021f20290c231d3215321d421d70209020083a173a1b4a174a1b59085b
-0c5c175c1b6a086b0c69106d176b1bc020d314dd18dd1ad31ee414e41ee0
-20ff201623042b102b1535043a1046044a105a10e50beb1dfe100b110e03
-161c1c06070106161c0e0b000e1924d00a01100a400a600a800a0420400b
-0b025520400d0d02550ab8ffe6400b0f0f02550a180d0d02550ab8fffab4
-0c0c02550ab8ffeeb40b0b06550ab8fff4b40f0f06550ab8ffe840230c0c
-06550a74011333023312250000c001019001a001b001f001041f013f014f
-010301b8fffc401d0e0e025501100d0d025501100c0c025501100b0b0255
-010c0b0b065501b8fff6b41010065501b8fffc40160f0f0655010c0c0c06
-5501120d0d065501191f473718012b4e10f42b2b2b2b2b2b2b2b2b5d7172
-3c4d10fdf4e410fd2b2b2b2b2b2b2b2b5d71ed003f3fed3f3fed11391239
-3130005d015d717200711311331536363332161615140206232226271103
-141633323635342623220687a43a926888d06a75df7b5a8f2e11a67678ab
-a77473b1fe6905bd8a51518cff98a3fefb8b4c3afdfb03a4cdc4cbd5cbca
-d700>ArialMT AddT42Char 
-3 11776 85 <00010085000002c6043e001100c9403b2f13011004012304340443045304
-66047404060911080908090d1311090d000308010b1c06070106000a0928
-900801082220130113022211250100b8ffc04010333634f0000100002000
-d000e0000400b8fff8b41010025500b8fff840110e0e025500040c0c0255
-00060b0b025500b8fffcb41010065500b8fff440160f0f065500060c0c06
-5500080d0d0655004e1247c4182b10f62b2b2b2b2b2b2b2b5d712b3cfde4
-105df472e4003f3f3fed11393911393901111239390010c9870e7dc43130
-005d72015d33113315363633321707262322060706151185a23e693f5b5e
-3e42423b5e141e0426a171483aa727473f6072fdd400>ArialMT AddT42Char 
-3 12038 86 <0001003fffe803b1043e00300317407b042214223a094a09442456226522
-7c098e098424a613ab2cc2030d09171a1817304b2cd617051b0255020210
-32010a185c085c095c0a5c0b5c0c5c0d6a086a096a0a6a0b6a0c6a0db426
-b4270f27262427242936245a0a590b64266428742374248024930a9c0c92
-28972c9530a40aa90ca327a428b326c5261628b8fff4b40d0d065522b8ff
-f4b40d0d065523b8fff4b40d0d065524b8fff4b40d0d065528b8fff4b40c
-0c065522b8fff4b40c0c065523b8fff4b40c0c065524b8fff4b40c0c0655
-1db8ffde40121e395a0827250c0a041a202615040b2e1d1ab802aa402219
-2c0b0b02551f193f194f195f19af19cf19060f191f196f19df19041f198f
-190219bd02550015000002aa0001ffc040140b0b025510014001021001d0
-0102000110010201b8ffc0b314163401b8ffc040100e113401012e5c1d6c
-1d021d1c150704b8fff4b40b0b025504b8ffe6b41010065504b8ffe64013
-0f0f0655041c2e0b1f1a011a24194013183432b8ffc0402f0f0f02551918
-0f0f025519180d0d025519160c0c025519201010065519200f0f06551910
-0c0c065519160d0d065519b8025bb207242ab8ffc0b51c39d02a012ab8ff
-e6b40c0c02552ab8ffe8b40f0f02552ab8ffe8b40c0c06552ab8ffeab60d
-0d06552a1a32b8ffc04021272a346032c032023f32803202321001010124
-00180d0d025500100d0d06550020b8fff4b40d0d025520b8fff4b4101006
-5520b8fff440190f0f065520240f100b0b02550f160c0c02550f200d0d02
-550fb8fffa40200f0f02550f0e0c0c06550f0c0d0d06550f22df00013f00
-4f00020019313437182b4e10f45d714df42b2b2b2b2b2bed2b2b2b102b2b
-ed724e105d712bf62b2b2b2b712b4dedf42b2b2b2b2b2b2b2b2bed72003f
-ed2b2b2b3fed7112392f2b2b5d71722be410fd5d71722be4111239111239
-0111121739313043794040272d1e2305142c261110121013100306220d20
-1b000928071b01052d071b011e14201b00210e231b0022230d0c08290a1b
-012827090a062b041b001f101d1b01002b2b103c103c2b103c103c2b012b
-2b2b2b2a2b818181002b2b2b2b2b2b2b2b2b5d71015d72715d1337161633
-323635342726272e02353436373636333216161707262623220615141716
-1716171e02151406062322263fb20f897b7c78352593c6994f41382a9153
-7dbd5a11b00c73697c6a16162f1b84bf975669c67dcfd9013d1c6b726544
-3d2318253249814e4779281f2b487b6718525c5237231c1d130a2433417c
-5c5a9f57ac00>ArialMT AddT42Char 
-4 0 92 <00010021fe5103ee0426001a01f7b10202435458401d0a140f030b031c19
-0f12060b061340120f200b400c200f180f0f02550f192f2b1add1a18cd1a
-1910dd1a18cd003f3f3fed12173931301bb30f1c010fb8ffde406d1c3928
-14560faf0a03400d400f020f202830341020283034070c0912160d181227
-0b270c270d360c360d350e99110b28122813481659125913591569126913
-69157906760d79117a147a15850d8a118c128c138914980aa80bbc10bb11
-ba14ea0ae714f50dfd10f914ff1c1e12b106024354584016130b1c1b040f
-440f840f030f190b031c190f12060b06003f3f3fed1112395d0111123939
-1b40370f0f0c101112120a00031914131325120a1412120a0f0c0f110c25
-0b0a140b0b0a1312120c0c0b06031c190f001c101c022f1cbf1c021cb802
-3fb50f1340124014b80254400b3f124012025f12bf120212b80142b60f01
-2200451b0ab8025440120f200b4040200c300c4f0c03500cff0c020cb801
-42b32f0f010fb8023fb41b207c66182b1a1910fd71f45d711a18ed1a1910
-ed1810f4e41910e45d71ed1a1810ed1910e45d7100183fed3f3c103c103c
-87052e2b087d10c487052e182b0e7d10c400111239870e103c3c08c44bb0
-0e534bb018515a58bb000cffe8000bffe80138385959313001435c58b900
-14ffdeb637390a2237390eb8ffe8b51539112215392b2b2b2b595d712b2b
-00715d2b015d591327163332363736373637013313161736371333010607
-060623227f143b2c3c48171126050bfe6dc2dd2b221f2be3b4fe6c412430
-7c5634fe67a91028241b6b0f1d0428fd9975817c76026bfbc8af42595300
->ArialMT AddT42Char 
-2 0 0 <00020100000005000500000300070000211121112521112101000400fc20
-03c0fc400500fb002004c000>ArialMT AddT42Char 
-ArialMT /CharStrings get begin
-/period 17 def
-/underscore 66 def
-/a 68 def
-/c 70 def
-/g 74 def
-/i 76 def
-/p 83 def
-/r 85 def
-/s 86 def
-/y 92 def
-end
-ArialMT /Encoding get
-dup 46 /period put
-dup 95 /underscore put
-dup 97 /a put
-dup 99 /c put
-dup 103 /g put
-dup 105 /i put
-dup 112 /p put
-dup 114 /r put
-dup 115 /s put
-dup 121 /y put
-pop
-end
-%ADOEndSubsetFont
-/KUDFOO+ArialMT /ArialMT findfont ct_VMDictPut
-/KUDFOO+ArialMT*1 
-[46{/.notdef}rp /period 48{/.notdef}rp /underscore /.notdef /a /.notdef /c 
-3{/.notdef}rp /g /.notdef /i 6{/.notdef}rp /p /.notdef /r 
-/s 5{/.notdef}rp /y 134{/.notdef}rp]
-KUDFOO+ArialMT nf
-KUDFOO+ArialMT*1 [9 0 0 -9 0 0 ]msf
-120 236.76 mo
-(ps_gray.icc)
-[5.04 4.563 5.03999 5.04001 2.99693 5.03999 4.437 2.52 2.043 4.563 0 ]xsh
-/KUDFOO+ArialMT*1 uf
-/KUDFOO+ArialMT uf
-/ArialMT uf
-gsave
-132.002 246.003 mo
-160.507 246.003 li
-160.507 277.135 li
-132.002 277.135 li
-cp
-clp
-132 245.753 mo
-160.505 245.753 li
-160.505 277.132 li
-132 277.132 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 132 294.246 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-%ADOBeginSubsetFont: ArialMT Initial
-ct_T42Dict begin
--0.664 -0.324 2 1.004
- 256 array 0 1 255 {1 index exch /.notdef put} for  /ArialMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f3210325d73000000cc000000606376
-7420a11cd7eb0000012c000006546670676dcc79599a000007800000066e
-676c796607022dca000094e0000822cc68656164d6144b3e00000df00000
-003668686561123315fe00000e2800000024686d7478f65efffb00000e4c
-000034d46c6f6361361cd72000004320000034d86d617870124c05df0000
-77f8000000206e616d659617a74000007818000011057072657025d64dbf
-0000892000000bbe67646972000000000000000000000000000303880190
-00050008059a05330000011b059a0533000003d1006602120805020b0604
-020202020204e0002affc00078430000000900000000544d432000400020
-fffc05d3fe510133073e01b2400001ffffff0000042605bb000000200004
-05ba001905ba001a05a70019042600180000ffe70000ffe80000ffe7fe69
-ffe805ba0019fe69ffe802ea000000b8000000b80000000000a800ad0169
-00ad00bf00c201f0001800af00b900b400c800170044009c007c00940087
-0006005a00c80089005200520005004400940119ffb4002f00a1000300a1
-00cd00170057007e00ba00160118ffe9007f008503d300870085000d0022
-00410050006f008d014cff75005c00df04830037004c006e00700180ff58
-ff8eff92ffa400a500b903c8fffd000b001a0063006300cdffee05d8ffdc
-002d005c0095009900df019209b500400057008000b9039d0072009a035d
-0401ff67fffa00030021007700cd0004004d00cd01c0022b004c006500e7
-0118017c034305d8ffa3ffb0ffc40003001c005d0068009a00ba01350147
-0221055cff4dffcd0016002d00780080009900b200b600b600b800bd00da
-010c05f0ffa4fff00019002c0049007f00b400ce01c003fefd81fe3f0000
-00050018002900390049006f00be00c700d0012301c1026f050c05320540
-057affd4001400310055005700a700b400e601f7027e027e027f03c60446
-ff42000e0085009100bf00c200c500e1011a012f014f01560229026f029e
-03720008002c00310031006400690089009800c700de012b01b6020c02cf
-03a304ab04fb061dfee0ff0e00060026009b009d00c1010d011801200173
-018201d601e30243025f029b02e2039404a904d20761001c005e006d008d
-00ab00f7011201380151015b0168017c01870191019901cd01d001e80241
-0254026b02ef0368037103bd044204420453047304830586058b06e8fe58
-fec4fed1fef7ff32ff860051007c008100910095009e00b400b900cf00d9
-00d900df00e20105010b010e010e012001210155017b017b017e018d01a2
-01a801a901b401d001d001e201e901f201f501fb020002000206021b0221
-022202220223027202770294029c02cf02cf02d002ec02f903170322032b
-0335033c0359036f037103870390039003b503e1041a04cf04ff05320532
-0596059f05a805ab05c205f0060c0782080008ccfca3fd2afddefe00fe88
-fe96feb2feb4ffe100150019001a001c001f003c005100610061006a0078
-009600a500af00d3010c0118011a012a013e014c0151015f016a01710178
-01820184019a01a501a801a901ae01bc01cd01d701ef0200020d021c0221
-0222022e02350242024f024f025e026502710290029202b402d602fa0307
-030b030f0315032a0347035d036503740379039603b003cc03dd03e203f6
-03fc03fc03ff040a041f04220426042b0447045f0475049e04e704e7055c
-05cb05e5060a066d068606b806f10736073e07500751075d078f07b607d4
-086000b600c300b500b700000000000000000000000001e00381034503b5
-008e0233041902ce02ce002d005f0064034d023f000002a80188027d01b4
-02240578063b023b014e00f00426029402c6029f02f6023b034d014b0153
-006a0231000000000000061404aa0000003c04c300ed04bc026502ce03b5
-0078060c017e02ef060c00b201000239000001c50330042b03cb00da03df
-010704a100db040a011701ed02a70350010b01bd043e05580021039c00ae
-0371017d00b5024500000afb088c012b014e01aa00870054013201f803ff
-0003024e00b4003703e30083006b02d800ed00770088009701640467008e
-0033017c00e700a6029e0329056e062a061501c90269048a021301b40002
-04a9000002390124010305140084015d039a06ef02d9007500cf040a00de
-03ac04bc02cf02ae034d04f005520168006d007d00860071ff8100790558
-04d2016700030156002504e00094007c033204210094007f0072005c002f
-00b6001800ba00b80041034d00720018001f004c016a01550099009a009a
-009800b200040078006900140057006e00ce00b4065402b80067050e0165
-00e7000004cbfe52005affa60099ff67006eff92002dffd40087ff7c00b8
-00a800e5008f00a80185fe7b0070001e00d900de014c054602cf0546ff2d
-028a02d90253029600b700000000000000000000000000000125011800ea
-00ea00ae0000003e05bb008a04d70053003fff8cffd50015002800220099
-0062004a00e4006d00ee00e5004803c00033fe4e02b1ff460370007905df
-0051ffa7ff1f010a0068ff6c004f00bc00a507050061072b00ed04b001d2
-00b6007b00650252ff740365fe690094008f005c00400086007500890089
-4043555441403f3e3d3c3b3a3938373534333231302f2e2d2c2b2a292827
-262524232221201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09
-0807060504030201002c4523466020b02660b004262348482d2c45234623
-6120b02661b004262348482d2c45234660b0206120b04660b00426234848
-2d2c4523462361b0206020b02661b02061b004262348482d2c45234660b0
-406120b06660b004262348482d2c4523462361b0406020b02661b04061b0
-04262348482d2c0110203c003c2d2c20452320b0cd442320b8015a515823
-20b08d44235920b0ed51582320b04d44235920b09051582320b00d442359
-21212d2c20204518684420b001602045b04676688a4560442d2c01b10b0a
-432343650a2d2c00b10a0b4323430b2d2c00b0172370b101173e01b01723
-70b10217453ab10200080d2d2c45b01a234445b01923442d2c2045b00325
-456164b050515845441b2121592d2cb00143632362b0002342b00f2b2d2c
-2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b1
-2cc08a8cb8100062602b0c642364615c58b00361592d2c45b0112bb01723
-44b0177ae4182d2c45b0112bb01723442d2cb01243588745b0112bb01723
-44b0177ae41b038a45186920b01723448a8a8720b0a05158b0112bb01723
-44b0177ae41b21b0177ae45959182d2c2d2cb0022546608a46b040618c48
-2d2c4b53205c58b002855958b00185592d2c20b0032545b019234445b01a
-23444565234520b00325606a20b009234223688a6a606120b01a8ab00052
-7921b21a1a40b9ffe0001a45208a54582321b03f1b235961441cb114008a
-5279b31940201945208a54582321b03f1b235961442d2cb110114323430b
-2d2cb10e0f4323430b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2c
-b10e0f432343650b2d2cb11011432343650b2d2c4b525845441b2121592d
-2c0120b003252349b04060b0206320b000525823b002253823b002256538
-008a63381b212121212159012d2c4bb06451584569b00943608a103a1b21
-2121592d2c01b005251023208af500b0016023edec2d2c01b00525102320
-8af500b0016123edec2d2c01b0062510f500edec2d2c20b001600110203c
-003c2d2c20b001610110203c003c2d2cb02b2bb02a2a2d2c00b00743b006
-430b2d2c3eb02a2a2d2c352d2c76b8022323701020b802234520b0005058
-b00161593a2f182d2c21210c6423648bb84000622d2c21b08051580c6423
-648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb815
-55621bb200802f2b59b002602d2c0c6423648bb84000626023212d2cb400
-0100000015b00826b00826b00826b008260f10161345683ab001162d2cb4
-000100000015b00826b00826b00826b008260f1016134568653ab001162d
-2c4b53234b515a5820458a60441b2121592d2c4b545820458a60441b2121
-592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb01343
-58031b02592d2cb0134358021b03592d2c4b54b012435c5a58381b212159
-2d2cb012435c580cb00425b00425060c6423646164b807085158b00425b0
-0425012046b01060482046b0106048590a21211b2121592d2cb012435c58
-0cb00425b00425060c6423646164b807085158b00425b00425012046b8ff
-f060482046b8fff06048590a21211b2121592d2c4b53234b515a58b03a2b
-1b2121592d2c4b53234b515a58b03b2b1b2121592d2c4b53234b515ab012
-435c5a58381b2121592d2c0c8a034b54b00426024b545a8a8a0ab012435c
-5a58381b2121592d2c4b5258b00425b0042549b00425b00425496120b000
-5458212043b0005558b00325b00325b8ffc038b8ffc038591bb040545820
-43b0005458b00225b8ffc038591b2043b0005458b00325b00325b8ffc038
-b8ffc0381bb00325b8ffc03859595959212121212d2c462346608a8a4623
-20468a608a61b8ff8062232010238ab902c202c28a70456020b0005058b0
-0161b8ffba8b1bb0468c59b0106068013a2d2cb1020042b123018851b140
-0188535a58b910000020885458b202010243604259b12401885158b92000
-0040885458b2020202436042b12401885458b2022002436042004b014b52
-58b2020802436042591bb940000080885458b202040243604259b9400000
-8063b80100885458b202080243604259b94000010063b80200885458b202
-100243604259b94000020063b80400885458b20240024360425959595959
-2d2cb0024354584b53234b515a58381b2121591b21212121592d00000001
-00000005028fa58dc35f5f0f3cf5081b080000000000a2e3272a00000000
-c14fd713faaffd671000080c00000009000100010000000000010000073e
-fe4e00431000faaffa7a1000000100000000000000000000000000000d35
-06000100000000000239000002390000023900b002d7005e047300150473
-0049071d0077055600580187005a02aa007c02aa007c031d004004ac0072
-023900aa02aa0041023900ba0239000004730055047300df0473003c0473
-00560473001a047300550473004d047300610473005304730055023900b9
-023900aa04ac007004ac007204ac00700473005a081f006f0556fffd0556
-009605c7006605c7009e055600a204e300a80639006d05c700a4023900bf
-04000037055600960473009606aa009805c7009c063900630556009e0639
-005805c700a10556005c04e3003005c700a105560009078d001905560009
-0556000604e300290239008b023900000239002703c100360473ffe102aa
-00590473004a0473008604000050047300460473004b0239001304730042
-0473008701c7008801c7ffa20400008801c7008306aa0087047300870473
-0044047300870473004802aa00850400003f02390024047300830400001a
-05c700060400000f040000210400002802ac0039021400bc02ac002f04ac
-00570556fffd0556fffd05c70068055600a205c7009c0639006305c700a1
-0473004a0473004a0473004a0473004a0473004a0473004a040000500473
-004b0473004b0473004b0473004b023900bd023900230239ffe502390009
-047300870473004404730044047300440473004404730044047300830473
-0083047300830473008304730049033300800473006b0473001b04730051
-02cd006d044c000104e3009905e5000305e50003080000e102aa00de02aa
-003d0464004e080000010639005305b4009a0464004e0464004d0464004d
-0473fffd049c00a003f4003805b4007a069600a1046400000231000002f6
-002f02ec002d0625007f071d004404e3008104e3009e02aa00e804ac0072
-046400540473002e0464003304e5001a047300860473008c080000ef0556
-fffd0556fffd0639006308000081078d00520473fffc0800000002aa0053
-02aa004701c7008001c7006c0464004e03f4002f04000021055600060156
-fe390473ffe402aa005c02aa005c040000170400001704730049023900b9
-01c7006c02aa0047080000250556fffd055600a20556fffd055600a20556
-00a20239008d0239ffe00239000402390015063900630639006306390063
-05c700a105c700a105c700a1023900c602aa001902aa000602aa001d02aa
-002e02aa00e502aa00a202aa006b02aa003a02aa004b02aa002804730000
-01c700030556005c0400003f04e3002904000028021400bc05c7fffd0473
-004905560006040000210556009e0473008704ac007204ac00a102aa006b
-02aa001902aa002106ac006b06ac006b06ac0021047300000639006d0473
-0042023900b10556005c0400003f05c700660400005005c7006604000050
-04730046046bffe102aa00ee0556fffd0473004a0556fffd0473004a05c7
-009e04eb004705c7fffd055600a20473004b055600a20473004b04730096
-01c7004204730096025500880473009a02ac008305c7009c0473008705c7
-009c04730087063900630473004405c700a102aa008505c700a102aa003c
-0556005c0400003f04e300300239002404e300300300002305c700a10473
-008305c700a10473008304e300290400002804e3002904000028046800a4
-063900600662005504a00048047400480391006204f000440329002e0530
-0048046bffe1040000b002eb005208c000330800004f040000990800004f
-040000990800004f040000980400009807d5016a05c0009e04ab007204d5
-009d04ac007104d5022204d5010505abffe9050001c905ab027e05abffe9
-05ab027e05abffe905ab027e05abffe905abffe905abffe905abffe905ab
-ffe905ab01c005ab027e05ab01c005ab01c005abffe905abffe905abffe9
-05ab027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab
-01c005ab01c005abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905abffe905abffe905ab02d605ab006605abffea05d5ffff04d50092
-0800000007eb013007eb012007eb013007eb012004d500b204d5008004d5
-002a082b0198086b01b807550010060000f40600006f0440003a05400037
-04c0003f04150040040000250600005505e100bf038d008904d5ffd90180
-008002d50086071500610296000f04d5009202d6008302d6008304d500b2
-02d600700556fffd0473004a05c700660400005005c70066040000500556
-00a20473004b055600a20473004b055600a20473004b0639006d04730042
-0639006d047300420639006d0473004205c700a40473008705c7001f0473
-00060239ffce0239ffce0239ffe40239ffe40239fff60239fff50239004b
-01c700190400003701c7ffa20556009604000088040000860473009601c7
-fffa05c7009c0473008705c900a50473008b063900630473004406390063
-0473004405c700a102aa006b0556005c0400003f04e300300239000c05c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-078d001905c70006055600060400002101c700890556fffd0473004a0800
-0001071d00440639005304e30081023900b9078d001905c70006078d0019
-05c70006078d001905c70006055600060400002101c7008a02aaffe10473
-001b04cd005a06ac006b06ac002206ac002206ac004a02aa00e202aa006b
-02aa00de02aaffea0557ffff0646ffa706b4ffa80312ffa80632ffa706d8
-ffa70605ffa701c7ff780556fffd055600960558fffe055600a204e30029
-05c700a4023900bf055600960558000b06aa009805c7009c0533006d0639
-006305c700a40556009e04f2009404e30030055600060556000906af007f
-05fb0061023900040556000604a00048039100620473008b01c7006b0460
-0088049a008c04000019038700480473008b0473005c01c7008904000086
-04000018049c00a00400001a0395005c04730044048d008303db00560460
-00880433001105b4007a063f005701c7ffc9046000880473004804600088
-063f0057055700a206eb0032045500a105c000640556005c023900bf0239
-0004040000370875000d081500a406d5003104a900a10515000a05c000a0
-0556fffd054000a705560096045500a1056b0000055600a20763000704d5
-004e05c000a105c000a104a900a10540001206aa009805c700a406390063
-05c000a00556009e05c7006604e300300515000a061500520556000905eb
-009f05550057075500a1078000a106550000071500a8054000a505c00055
-081500a405c7001a0473004a0495005b0440008802eb008804ab00000473
-004b055afffb03ab003204780087047800870380008604ab00180580008c
-046b00880473004404550088047300870400005003aa0026040000210695
-004b0400000f0495008a042b0045066b008d0695008d0500002805c0008b
-042b008404150030060000890455001f0473004b0473000002eb00890415
-004b0400003f01c700880239000901c7ffa2074000130680008304730000
-0380008604000021046b008803e900a1034a008808000041089500a00585
-002d000001010000001e0000003100000031000001010000007e0000007e
-0000008c0000008c000001010000001000000101000001210310007d0000
-008c023300d20000030b0000ff04023900b9048100690456003203310019
-0411002d04d1009601f9009b030f005f04ca009b04b8008c01f9009b0413
-002803b0005003b4003c04ca009b04cf005001f9009b02d2003c0498005a
-043c00190488006e045f007303b1001903d4000a0466009604130028058e
-00640524002803f2009b03f2009b03f2009b01e3005a0356005a0686009b
-01f9ffac041300280413002803b4ff5703b4ff570448002d058e0064058e
-0064058e0064058e00640481006904810069048100690456003203310019
-0411002d04d10096024b0000034a000004b8008c024b00000413002803b0
-005003b4003c04cf005002d2003c0498005a0488006e045f007303d4000a
-0466009604130028058e00640524002801f9009b0456003203b00050045f
-0073049b003c0000ffdc0000ff250000ffdc0000fe51028d00ab028d00a0
-02da0043034d007901a8ffba000000460000004600000046000000460000
-00480000004600000046000000460435017c0435012e043500b704350081
-0435012c043500be043500af043500810435009a043500db04350085028d
-00c1043500b3060001000600010002420036060001000435009e04350098
-043500cb0600010006000100060001000600010006000100000000460600
-010006000100060001000600010006000100060001000600010006000100
-051bffba06000100060001000600010005b5003a05b5003a01f4ffba01f4
-ffba060001000600010006000100060001000481003604350036043dffba
-043dffba03e9004a03e9004a067f0014077600140327ffba041effba067f
-0014077600140327ffba041effba051b003204b500240300fff706000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010000000030
-0000004600000046000000400000004606000100060001000000ffdc0000
-fe510000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ff160000ff160000ffdc0000ff160000ffdc0000ff200000ffdc0473
-004a08000000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010006000100028d
-007f028d005d0600010004ee0015034d007901a8000e01d6ffdc01a80056
-01d60010037500320375003201a8002d01d60013051b003204b5002401f4
-ffba01f4ffba01a8009301d6001305b5003a05b5003a01f4ffba01f4ffba
-024200000300fff705b5003a05b5003a01f4ffba01f4ffba05b5003a05b5
-003a01f4ffba01f4ffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba02b3
-005f02b3005f02b3005f02b3005f03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba08c9003e08c9003e06c5ffba06c5ffba08c9003e08c9003e06c5ffba
-06c5ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7
-ffba04a7ffba045a002a039a00360435ffba0327ffba045a002a039a0036
-0435ffba0327ffba064f0027064f00270224ffba021affba04a7004604a7
-00460224ffba021affba04cf002d04cf002d0327ffba0327ffba040d0047
-040d004701a8ffba01a8ffba02b4002302b400230327ffba0327ffba0435
-00450435004501f4ffba01f4ffba024200360300fff7039affba0327ffba
-0375003203750032051b003204b50024051b003204b5002401f4ffba01f4
-ffba045a004004ce0049045a002604ce0039045a005304ce004a045a0053
-04ce004a0600010006000100000000460000004606000100060001000600
-010000000046000000460600010006000100000000480000004606000100
-060001000600010000000046000000460000004600000046000000400000
-003006000100000000460000004606000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d00ca028d00c7028d
-00c606000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000100ffba0800ffba1000ffba06dc0063053f004406d5
-00a1055b00830000fddc0000fc2f0000fca60000fe540000fcd70000fd73
-0000fe290000fe0d0000fd110000fc670000fd9d0000fbf50000fc720000
-fed50000fed50000ff02041b00a006ac006b06ac00190000feb60000fd73
-0000fe080000fca60000fe530000fd110000fbc80000faf40000faaf0000
-fc720000fbaa0000fb6a0000fcf10000fc7d0000fbdd0000fcc10000fb98
-0000fdea0000fe840000fdc20000fcf10000fd5f0000fe760000febc0000
-fceb0000fd6c0000fd580000fc900000fd150000fc2c0000fc130000fc12
-0000fb960000fb9601c700880556fffd0473004a0556fffd0473004a0556
-fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473004a
-0556fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473
-004a0556fffd0473004a0556fffd0473004a055600a20473004b055600a2
-0473004b055600a20473004b055600a20473004b055600a20473004b0556
-00a20473004b055600a20473004b055600a20473004b0239006301c7001f
-023900ba01c7007c06390063047300440639006304730044063900630473
-004406390063047300440639006304730044063900630473004406390063
-0473004406dc0063053f004406dc0063053f004406dc0063053f004406dc
-0063053f004406dc0063053f004405c700a10473008305c700a104730083
-06d500a1055b008306d500a1055b008306d500a1055b008306d500a1055b
-008306d500a1055b00830556000604000021055600060400002105560006
-040000210556fffd0473004a0239ffe201c7ffb0063900630473004405c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-05c700a1047300830000fefe0000fefe0000fefe0000fefe0455fffd02eb
-000c07630007055afffb04a900a10380008604a900a10380008605c700a4
-046b00880473fffd040000140473fffd04000014055600090400000f0555
-0057042b0045055500a10473008706050063047300550639006004730044
-05b5003a01f4ffba0224ffba021affba04a7004601f4009e01f4001001f4
-001b01f4001001f4006b01f4fff90227ffce0000000f0000fff502aa00a4
-02aa00a40000000e00000056000000560000ffcf01a8000f01d6ffbf01a8
-fff501d6ffcd01a8001d01d6fff501a8009301d600130375003203750032
-0375003203750032051b003204b5002405b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba
-01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4
-ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a
-01f4ffba01f4ffba0481003604350036043dffba043dffba048100360435
-0036043dffba043dffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba0481
-003604350036043dffba043dffba02b3003202b3003202b3005f02b3005f
-02b3005f02b3005f02b3003202b3003202b3005f02b3005f02b3005f02b3
-005f02b3005f02b3005f02b3003802b3003802b3004902b3004903e9004a
-03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9
-004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba0692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba08c9003e08c9003e06c5ffba06c5ffba04a7ffba04a7ffba045a
-002a039a00360435ffba0327ffba064f0027064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba064f0027064f00270224
-ffba021affba064f0027064f00270224ffba021affba064f0027064f0027
-0224ffba021affba04a7004604a7004604a7004604a70046093e0032093e
-00320740ffba0740ffba067f0014077600140327ffba041effba04cf002d
-04cf002d0327ffba0327ffba04cf002d04cf002d0327ffba0327ffba04cf
-002d04cf002d0327ffba0327ffba067f0014077600140327ffba041effba
-067f0014077600140327ffba041effba067f0014077600140327ffba041e
-ffba067f0014077600140327ffba041effba067f0014077600140327ffba
-041effba040d0047040d004701a8ffba01a8ffba040d0047040d004701a8
-ffba01a8ffba040d0047040d004701a8ffba01a8ffba040d0047040d0047
-01a8ffba01a8ffba043500450435004501f4ffba01f4ffba043500450435
-00450435004504350045043500450435004501f4ffba01f4ffba04350045
-043500450481003604350036043dffba043dffba024200360300fff7031a
-001a031a001a031a001a0375003203750032037500320375003203750032
-037500320375003203750032037500320375003203750032037500320375
-0032037500320375003203750032051bffba04b5ffba051b003204b50024
-01f4ffba01f4ffba0375003203750032051b003204b5002401f4ffba01f4
-ffba051b003204b50024067f0045067f0045067f0045067f004501a80028
-0000fe290000fea20000ff300000ff1d0000ff120000ff920000fe7e08fc
-003208ad00320000ffb50000ffb60000feed0000ff640000fe7e0000ff9f
-018d000002f6fffd0000fe820000ff1004cd00320000ff580000ff580000
-ff640692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba045a002a039a00360435ffba0327ffba034d007902b400230242
-003601f4ffba0290ffba01f4002f01f4003b01f4001201f400b101f4006d
-067f00140776001401f9009b0000fed902bc000003f2009b045afff504ce
-fff5045a005304ce004a045a005304ce004a045a005304ce004a045a0053
-04ce004a045a005304ce004a045a005304ce004a04350071043500ad045a
-000f04ce000f0473001406110014054000a7047300860540000a0473000a
-05c7005105c700660400005005c7fffd067a00140540004a047300460474
-00480556006e04d5005304e3ffc40639006d04fe000f070c008701c70083
-0239001f055600960400008801c7001504000018072000a405c7ffb80473
-008b0639006006f200630557004406090014047300860556009e0556006b
-0400004f04f20094030b00440239002404e300140239002404e3003005fb
-006105c700a1062e00140400002104e300290400002804e3002904e30031
-045c0044045c003f0473003c0473005503ab003203e50024047300870214
-00bc034e00bc04ac0072023900b00aaa009e09c7009e08640046087f0096
-06aa0096039c008309c7009c078e009c062b0087047300550556fffd0473
-004a0000fefe0556fffd0473004a08000001071d00440639006d0473001a
-0639006d0473004205560096040000880639006304730044063900630473
-004404e30029045c004c01c7ffa20aaa009e09c7009e086400460639006d
-04730042084600a404f2009e05c7009c047300870556fffd0473004a0556
-fffd0473004a055600a20473004b055600a20473004b0239ff8a0239ff64
-023900040239fff60639006304730044063900630473004405c700a102aa
-ffcc05c700a102aa006805c700a10473007605c700a1047300830556005c
-0400003f04e3003002390024045c0051037e001305c700a40473008705a6
-00a404d6005e0486005e04e30029040000280556fffd0473004a055600a2
-0473004b06390063047300440000fefd0639006304730044063900630473
-004406390063047300440556000604000021047300570473004804730086
-04730086040000130400005004730046047300460473005505e9005503ab
-004903ab0032050d0032040f00440239ffb9047300420473004204780050
-0402001904ef00190473008b047300870473008701c7001901c7008901c7
-0089029e0000026e001401c700830493008306aa008406aa008406aa0087
-0473ffa60473008b046c00870473004406530044063f00570466004402aa
-ffe402aaffe402aaffe402aa008502aa008502aa008502aaffe40455008a
-0455008a0400003f01c7ffa20214ffb901c7ff7202cb00000239000f0239
-002404730019048c0044046000880400001a05c700060400001804280019
-0400002804540028045c004c045c00790400002404000050040000240400
-00500639006304400088040f004904780050046b0088032e000004000008
-033b008804730048040000240400005007b7004607400046080b004605b3
-0024036f002405c00024061c0013054a0083050f008303e2001e04380063
-03110064031100640146ffce01eb006401eb000001eb000002ea006403d9
-0000029100000187005a02d7005e01c7008001c7006c01c7008a02aa00fb
-02aa00fb02ca003202ca003204ac007004ac007004ac006504ac006502aa
-012102aa00de02aa005902aa012102aa001d02aa005902aa00de023900b6
-023900b602aa00fb02aa00fb02aa00a602aa00a602aa00a602aa001d02aa
-ffe202aafffb029400000142006402b8003202a0000002ca003203100096
-0310009603100096031000960310009602aa006202aa006202aa002802aa
-001d02aa0047045700960457009604570096045700960457004304570043
-045700430457004304570043031000430457002f0457002f0457002f0457
-002f0457002f0310002f0457002504570025045700250457002504570025
-0310002f0457001a0457001a0457001a0457001a0457001a0310001a0457
-004204570042045700420457004204570042031000420457009604570096
-045700960457009604570042045700420457004204570042045700420310
-00420457002f0457002f0457002f0457002f0457002f0310002f0457002f
-0457002f0457002f0457002f0457002f0310002f04570026045700260457
-002604570026045700260310002604570042045700420457004204570042
-045700420310004204570096045700960457009604570096045700420457
-004204570042045700420457004203100042045700260457002604570026
-045700260457002603100026045700230457002304570023045700230457
-0023031000230457002f0457002f0457002f0457002f0457002f0310002f
-0457004b0457004b0457004b0457004b0457004b0310004b045700960457
-009604570096045700960457004204570042045700420457004204570042
-031000420457001a0457001a0457001a0457001a0457001a0310001a0457
-002404570024045700240457002404570024031000240457002f0457002f
-0457002f0457002f0457002f0310002f0457004e0457004e0457004e0457
-004e0457004e0310004e045700960457009604570096045700960000fec1
-0000fec60000fdac0000fed80000ff920000fee90000ff4c0000fea00000
-fec40000ffce0000ff660000fea00000fed80000fed80000ff970000ff98
-0000ff990000fff40000ff420000ff420000ff440000ff5f0000fe870000
-ffec0000ffa60000ff510000ff510000ff510000fec90000ff1c00000000
-0000fee90000ff4c0000ff930000ff2a0000ff560000ffce0000fe870000
-febb0000fec40000fec40000fed80000fed80000feb30000fec90000fdad
-0000fdac0000feb30000fec90000fdad0000fe160000fee60000ffa60000
-fe870000ff440000feba0000ff230000ff9a0000fdac0000fe8800000000
-0000feb00000ff980000fe930000ffa60000fe870000fdac0000ff660000
-ff440000feb00000feb00000feb00000ff030000ff520000fd1f0000ff53
-0000ff530000ff530000feb50000feb50000ffc30000feae0000fedc0000
-fec70000fec80000fedc0000fe1e0000ff420000ff510000feb70000feb0
-02aa00de02aa005902aa00fa049a008c04600088062e001407aa0000062e
-0014047b004c063f005704cf0044063900630473004405c7006604000050
-04e300a8033b008804ff0000043c0032060d000a049d0042072000a406aa
-0084056500630473008b056400a40400000a0556006b0556006b04e00005
-04c5001905e5005f046e004403b600140347002804cf00440495005b0400
-005001c7ffa2063900600389004d03890050055600a205c000a10473004b
-047800870ab4006d04fe00100639001404e70014079900bf05b500880558
-000b0400001a072e00bf0590008806a10078057b007a086d00bf06f00088
-04d5006603ab001f065f0039058200480639006004730044066d0009050c
-001a066d0009050c001a0b010063091c004406aa005c04e600440987006d
-06d000500000fe370ab4006d04fe001005c7006604000050040700140000
-fea60000febc0000feaa0000fead0000fc2b0000fc4c05c000a104780087
-05400004042b00140556009e04730087055d00a40464008804d5004e03ab
-003204a900040380000005ef002904490028070900a4052f0088091800a0
-06f6008806060066042b005005c700660400005004e3003003aa00260767
-00310587002605550057042b004506e4000a0554000a06e4000a0554000a
-023900bf07630007055afffb055700a1046800860540001204ab001805c7
-00a4046b008805c700a4046b008805550057042b004506aa00980580008c
-02aa002e0556fffd0473004a0556fffd0473004a08000001071d00440556
-00a20473004b060500630473005507630007055afffb04d5004e03ab0032
-04d5004e045c004c05c000a10478008705c000a104780087063900630473
-0044063900600473004405c0004a0415002b0515000a040000210515000a
-040000210515000a0400002105550057042b0045071500a805c0008b0540
-004a0473004607bf004a0703004607a6006606860053054d006604130053
-07c3001207470018084600a4070700880639006d0478005005f900300553
-00260000ff430000fec90000ff770000ffb00000ff470000ff560000ff74
-0000fed70000feac000000000000ff520000ff56000000000000feac0000
-fd9a000000000000ff6a0000ff7c0000ff690000ff560000feac0000ff7f
-0000ff560000fdef0000ff430000ff690000ff7c000000000000fdae0000
-ff8c000001020000fefe0000fefe0000fedf0000fedf0000ff580000ff20
-0000fefe0556fffd0473004a055600960473008605560096047300860556
-00960473008605c700660400005005c7009e0473004605c7009e04730046
-05c7009e0473004605c7009e0473004605c7009e04730046055600a20473
-004b055600a20473004b055600a20473004b055600a20473004b055600a2
-0473004b04e300a8023900130639006d0473004205c700a40473008705c7
-00a40473008705c700a40473008705c700930473006805c700a404730087
-0239ffdf01c7ff9202390020023900060556009604000088055600960400
-008805560096040000880473009601c7007e0473009601c7ffb904730096
-01c7ffa50473009601c7ffa306aa009806aa008706aa009806aa008706aa
-009806aa008705c7009c0473008705c7009c0473008705c7009c04730087
-05c7009c0473008706390063047300440639006304730044063900630473
-004406390063047300440556009e047300870556009e0473008705c700a1
-02aa008505c700a102aa008505c700a102aa005e05c700a102aa00260556
-005c0400003f0556005c0400003f0556005c0400003f0556005c0400003f
-0556005c0400003f04e300300239002404e300300239002404e300300239
-ffff04e300300239000e05c700a10473008305c700a10473008305c700a1
-0473008305c700a10473008305c700a104730083055600090400001a0556
-00090400001a078d001905c70006078d001905c70006055600090400000f
-055600090400000f055600060400002104e300290400002804e300290400
-002804e3002904000028047300870239000305c70006040000210473004a
-01c7008904a0004804a0004804a0004804a0004804a0004804a0004804a0
-004804a000480556fffd0556fffd06820013068200130682001306820013
-068200560682005603910062039100620391006203910062039100620391
-0062061e0000061e0000076c0000076c0000076c0000076c00000473008b
-0473008b0473008b0473008b0473008b0473008b0473008b0473008b068f
-0000068f0000081f0000081f0000081f0000081f0000081ffff3081ffff3
-01c7008101c7008101c7ff9b01c7ff9b01c7ffeb01c7ffeb01c7ffa201c7
-ffa20301000003010000049100000491000004910000049100000491fff3
-0491fff3047300440473004404730044047300440473004404730044069d
-0000069d0000082d0000082d000007c9000007c900000460008804600088
-0460008804600088046000880460008804600088046000880682000007ae
-00000812000007ae0006063f0057063f0057063f0057063f0057063f0057
-063f0057063f0057063f0057065f0000065f000007ef000007ef0000078b
-0000078b0000078bffff078bffff04a0004804a000480391006203910062
-0473008b0473008b01c7ffe601c700680473004404730044046000880460
-0088063f0057063f005704a0004804a0004804a0004804a0004804a00048
-04a0004804a0004804a000480556fffd0556fffd06820013068200130682
-00130682001306820056068200560473008b0473008b0473008b0473008b
-0473008b0473008b0473008b0473008b068f0000068f0000081f0000081f
-0000081f0000081f0000081ffff3081ffff3063f0057063f0057063f0057
-063f0057063f0057063f0057063f0057063f0057065f0000065f000007ef
-000007ef0000078b0000078b0000078bffff078bffff04a0004804a00048
-04a0004804a0004804a0004804a0004804a000480556fffd0556fffd0556
-fffd0556fffd0556fffd02aa00e502aa00fd02aa00e502aa000602aa0006
-0473008b0473008b0473008b0473008b0473008b068200000682000006f3
-000006f3000005c700a402aa001302aa001302aa000601c7ffbb01c7ffab
-01c7ffca01c7ffca01c7ff9301c7ff930239001a0239fff5036500000365
-000002aa001302aa001302aa000604600088046000880460008804600088
-048d0083048d00830460008804600088055600060556000606e600000718
-0000061e000002aaffea02aaffea02aa0059063f0057063f0057063f0057
-063f0057063f005707650000069d000007270000065f000005fb006102aa
-00de02aa00e50473000d05c7006605c7006606aa008705c70024095000a1
-078d00190556001f04e30030080000290400003004c100660000ff530000
-ff530000ff530000ff5301c7001901c7ffa2042b00050556001105740046
-02cbffa3057a008702f0ffc8057f000a057f000a02aa008402aa008402aa
-00c902aa00c902aa00a002aa005902aaffaf02aa003a02aa0006023900b9
-02aa00a902aa00a902aa00a902aa00a9032e001e032e001e02aa003a0000
-ff730000ffa50000fed80000ff230000ff720000ff720000fee70000ffa5
-0000ff530000ff530000ff530556009e0473008703f8001905fb0019071d
-00440440001904000050046900870469001903eb008703ab003201c70088
-0361004104000088033600100580008c04780087047300440400001304de
-004404de004404de000d078d005003a800440473004404730044042b0084
-0455001f0455001f03aa00260460008804c6004405de004404c600440400
-001a05c700060400002803ab0032036b003f04db001f02eb00880400001a
-04550088042b008405b4007a04ab001803a00000054f0000035100320351
-ffd103980032034800320348003203f80032036e0032015600690284002d
-0366003202d000320415003203710032036f003204180032030f00320359
-0032039c003203760031036f003204fb000002fa003202fa003203040032
-04cc0032030500640305003202f9003202f90032028c0032028c00320304
-00320142006402b6006404950064030f00640305003202d5003203050032
-030500320306006401c20032030f00640342003204950064029200000320
-00000315006402920000030600320385003202bf00000142006401eb0064
-030f0064029200000315006402920000030900320385003202bf000005ed
-00460a660046061300460689ffba0541ffba01e9003c045a00110000ff0d
-0000ff350000fece0000feb70000fec90000ffcf0000ff4f0000ff9e0000
-feca02b3005f02b3005f03e9004a03e9004a039affba0327ffba039affba
-0327ffba05ad0069053d002d05fd009604dc005004e0003c05f6009b053f
-00280650002804ac00720000fe3b0000fe660000fe660473fffc02aa0053
-02d5ffce01a8ffba01a8ffba01a8ffba01a8ffba0658001509c500470400
-000008000000040000000800000002ab0000020000000155000004730000
-02390000019a000000ab00000000000005e5000305c7006606aa00980580
-008c0744008307180046071800480556fffd05c70066040000140473000a
-04e300300400004f0400002804a5001d000001020000ff420000febf0000
-ff3a0000ff53048d000a05c7005105c7006605c70051045500a102eb0088
-0000ff430000ff040000ffac02d200960000ff37021affba0250001e0000
-ff3a0000ff5b0000ff5f0000ff7e0000ff940000ff4a0000fe9c05b5003a
-05b5003a01f4ff9601f4ff9605b5003a05b5003a01f4ffba01f4ffba05b5
-003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba
-05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba0481003604350036043dffba
-043dffba0481003604350036043dffba043dffba02b3003202b3003202b3
-005f02b3005f03e9004a03e9004a0692003e0692003e043fffba043fffba
-045a002a039a00360435ffba0327ffba045a002a039a00360435ffba0327
-ffba045a002a039a00360435ffba0327ffba064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba067f0014077600140327
-ffba041effba067f0014077600140327ffba041effba067f001407760014
-0327ffba041effba02b4002302b400230327ffba0327ffba02b4002302b4
-00230327ffba0327ffba043500450435004501f4ffba01f4ffba04350045
-0435004501f4ffba01f4ffba043500450435004501f4ffba01f4ffba040d
-0047040d004701a8ffba01a8ffba03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0473ff93047300460239ffbf06aa
-ffd50473ffb70473ff9102aaffa402aaffa40400ffff0239ffb904000028
-04730089030b0064047400480649002401c7001901c700190473001e0460
-001e048c000a04730086047300460239001305b400420400008801c7fffc
-06aa00870473008b0473008702aafffb0400003f0318ffa20400001a0400
-000f040000280473004a04730048047300460473004b03ab004903ab0032
-0534005501c700880400001301c7ffa204730083045c004c0304006402d5
-003202c9003302fc0032028c003201d5003201d500000304003203110064
-01420019014200640142006401420019022a000001420064014200090233
-00640493006404930064030fffc9030f0064030e00640305003203000032
-02b800320142ffca01c20032030f001d031a00320306006402d400640292
-000002de003202de003202de003202f4003202ea00320000febc0000febc
-0000ff730000fea9023900b902fa003202f900320305003202a0000002f9
-00320639006d0556fffd0473000f05c7006602aa004104a0004804a00048
-04a0004804a0004804a0004804a0004804a0004804a0004801c7ff9b01c7
-ffab01c7ff9b01c7ffab01c7ff9b01c7ffbb01c7ff9b01c7ffbb04600088
-0460008804600088046000880460008804600088046000880460008801c7
-ffab01c7ffab01c7ffbb01c7ffbb04600088046000880460008804600088
-045a005304ce004a03a000130556001105c700290558000b055600a20473
-004b0400003301c7ffa205e600630473004805c7000002aa000f05560006
-0400002104000013040000500400001301c700830455fffd02eb00010556
-00090400000f055600090400000f04d5005303ab00490540001204ab0018
-0000fec60000fed40000fec60000fed40000fe5f0000fe5f0000ff720000
-ff730000fee7078b000a03eb004c040000130473000a01c700150473fff4
-0556001105c700a1047300190239ff8b05c700a404730087055600960400
-008804e30029040000280400003b049e00a403670088053000480000ff53
-0000ffbc0000fefe0000fefe0000fea40000fea401c70088000000000000
-002a0000002a0000002a0000002a000000d60000017e00000320000005a6
-0000074e000009380000097e000009fe00000aa400000b8400000bec0000
-0c6400000caa00000ce600000d5600000f1200000fee00001218000013f2
-000015520000170c000018e20000198e00001c2200001e5600001eb20000
-1f7000001ff200002062000020e8000021da000023da000025840000271c
-000028560000299e00002a6200002b1800002ca800002dae00002e920000
-2f7a000031b00000323a000035640000370e000038420000394800003b3c
-00003da800004052000041000000422400004398000045d6000048e20000
-4a8800004bc800004c3200004c9c00004d0000004d8800004dbc00004e38
-0000510a000052e80000549c000056500000580e0000596200005b520000
-5cf600005dea00005f020000619a00006296000064c60000668c0000684e
-00006a1200006ba800006cae000070560000717a00007318000075360000
-79a000007bc400007e1c00008004000081020000814e00008250000082f0
-0000833c00008370000083ac000083ee000084540000849a000084ce0000
-85040000853a0000858a000085cc0000861e00008656000086a8000086de
-0000871e000087600000879e000087e800008828000088560000888e0000
-88de00008914000089540000898e000089d200008a1c00008a5800008a88
-00008acc00008b0400008b9400008c1a00008e2800008fbc0000916c0000
-91b80000924c00009470000096c4000098b4000099a000009a2200009a8c
-00009baa00009d0600009f4e0000a0b00000a13e0000a1e80000a2ac0000
-a3f40000a59e0000a68c0000a7520000a7b60000a8240000a94e0000aa72
-0000ab020000ace40000af3e0000b2900000b3860000b42c0000b47c0000
-b5320000b6520000b7f00000b88a0000b94e0000ba0e0000ba760000bab2
-0000bb0a0000bb580000bd700000bfb60000bfee0000c0200000c14a0000
-c2760000c3240000c3c80000c46a0000c53c0000c5900000c5c60000c61e
-0000c7700000c7e20000c83c0000c9b40000cb200000cc000000cc320000
-ccce0000cdf20000d0680000d0a20000d0e60000d1220000d1840000d1c6
-0000d20c0000d2580000d28a0000d2de0000d31c0000d34c0000d38a0000
-d3d00000d4120000d4500000d4d20000d5400000d6260000d6620000d6e2
-0000d7160000d7b80000d8400000d8ac0000d90e0000d97a0000da660000
-db580000db8c0000dbc00000dbf00000dc340000dcac0000de260000e040
-0000e0720000e0ac0000e1a60000e3340000e36a0000e4ce0000e54a0000
-e62a0000e7200000e8b00000ea1a0000ec080000ed040000ed4a0000ed7e
-0000edc00000edfa0000ee4e0000ee960000eee00000ef100000ef400000
-f1280000f1660000f18e0000f1be0000f1f20000f2180000f23e0000f286
-0000f43c0000f5b60000f5dc0000f6020000f6460000f6760000f6a60000
-f6fc0000f7da0000f8ec0000f9300000f9660000f9c00000f9fe0000fa32
-0000fa620000fa9e0000fade0000fb1c0000fb580000fb9a0000fbd00000
-fc0c0000fc4c0000fc720000fc960000fce60000fe420000fe980000fecc
-0000ff1a0000ff660000ffa80000ffe0000100160001005e000101000001
-029c00010464000105e6000107d80001092a00010aae00010b9000010d2a
-00010d9400010dbc00010e5a000110dc0001111c0001115c0001119c0001
-11da000112380001129600011304000113240001140e000114ae000114e4
-000115320001157c000115c6000115e2000115fe0001161e0001163e0001
-165e0001167e000116a4000116ca000116f000011716000117460001176e
-00011796000117c2000117ee000118220001184c00011878000118ae0001
-18d8000119040001193a000119640001198e000119c2000119f200011a26
-00011a6a00011a9a00011ace00011b1000011b4400011b7600011bb80001
-1bec00011c1c00011c5e00011ca200011ce800011d4400011d6000011d7c
-00011d9800011db400011dd000011f3e000121ea0001245a000124760001
-2490000124ac000124c8000124e4000125000001255c0001259600012600
-000126ca0001276a00012840000128c000012948000129b800012a4e0001
-2aac00012af200012b5000012bb200012c6a00012d2800012d5400012db0
-00012df400012f60000130540001307e0001309a000130c6000130fe0001
-314a0001318a000131be000131ee0001321e0001324e00013292000132c2
-000132f2000133320001336200013392000133c200013402000134320001
-346200013492000134b8000136bc000136ec0001371c0001386c00013a22
-00013a5200013a8000013ab000013ade00013b0e00013b3c00013b600001
-3b8400013bb400013d2400013d5c00013d8c00013f1e00013f4c00013f7a
-00013fa800013fd00001412e000142c6000142fe0001433e0001437a0001
-43aa000143d8000143f4000144240001445400014544000146ac000146dc
-000147160001475600014786000147b6000147f80001481e000148440001
-4884000148c4000148f40001493400014a1e00014a9e00014b8200014bb2
-00014be200014c1200014c4200014c7e00014cb000014ce200014d120001
-4d4200014d8800014dba00014dea00014e2000014e9200014ec600015094
-000151960001532600015556000157a6000159380001599c00015a260001
-5a3600015ac400015cc200015dee00015f5a0001604a000161ce000163e8
-000166140001670600016716000167260001683e0001684e0001685e0001
-686e0001687e0001688e000169ac000169bc000169cc00016a4000016a50
-00016b2000016b3000016c4200016c5200016c6200016c7200016dd00001
-6fae00016ff0000170260001705c0001708c000170bc0001711000017138
-000172c20001740a0001755e000176c60001784a000178ae00017a400001
-7b5c00017b6c00017b7c00017d0200017d1200017e7800017fd200018106
-00018264000183d200018598000185d800018610000186460001866c0001
-869c000186c200018838000188680001899e000189ae000189be00018a00
-00018a1000018ba400018d5000018eda00018f0200018f320001908e0001
-909e000191d6000191e600019280000193e0000193f000019656000197e0
-000199480001997800019aee00019c2000019c3000019c4000019c500001
-9d2a00019d3a00019d4a00019d5a00019e5200019fcc00019fdc0001a104
-0001a2380001a38a0001a51e0001a63c0001a7c80001a8da0001a9100001
-ab460001abe60001abf60001ad8c0001af2e0001afb20001b1340001b144
-0001b3ac0001b52c0001b6ac0001b6dc0001b87c0001ba020001bbc60001
-bcf20001bd020001be320001be420001be520001bf120001bf220001c108
-0001c1180001c24e0001c35c0001c5080001c6be0001c8000001c9700001
-cab80001cb0a0001ccec0001ce680001cea60001d04c0001d0700001d1b0
-0001d1c00001d1d00001d2080001d2180001d3a40001d50c0001d6800001
-d6a40001d6d40001d8420001d8f40001d9b20001d9e00001db960001dc8e
-0001dd1c0001de420001def00001dfc40001e00e0001e0860001e1460001
-e16e0001e1b20001e2080001e2e40001e32e0001e3620001e38a0001e3b2
-0001e3e60001e42a0001e46e0001e4ac0001e5ea0001e6a20001e7c20001
-e8380001e9060001e9580001e9ea0001ea9a0001eb8e0001ebe20001ec78
-0001ed360001ee200001eed20001eff20001f0440001f0ee0001f2240001
-f2fc0001f3e20001f4e80001f5ce0001f6b00001f7a40001f8420001f948
-0001fa420001faba0001fb320001fba80001fbde0001fc3a0001fd020001
-fd8e0001fdc60001fe0c0001fe3c0001fea60001ff660001ff9a0001ffca
-0001fffe0002002e0002005e0002008e0002022e00020266000202a60002
-02de00020316000203b2000204ac000204dc00020580000205ae000205ee
-0002063e0002066e000206ba00020852000209b800020b1800020b5e0002
-0bb200020bea00020d5c00020d9200020e2400020e6200020e9000020ece
-00020ffe0002102600021162000211f20002129c0002131e000213da0002
-14f20002160000021634000216ba0002181600021898000218e2000219ec
-00021a3400021b3800021bb400021c0c00021c9000021d7a00021e900002
-1f8c0002203600022126000221f8000222e2000223ca0002247a000224fc
-0002275a00022784000227ae0002286600022890000229d200022ad80002
-2bc200022bec00022c1600022c4000022c6a00022c9400022e1400022e3e
-00022e6800022e9200022ebc00022ee600022f1000022f3a00022f640002
-2f9800022fc200022fec0002301600023190000231a0000232ba000232ca
-000232f40002331e00023348000233720002351c00023738000238660002
-3876000239f200023a0200023b4800023d1400023e1a00023f9a0002413a
-0002435e000244b80002469a000247de0002490c000249fa00024a240002
-4a4e00024a7800024aa200024acc00024af600024b2000024b4a00024b74
-00024b9e00024bc800024bf200024c1c00024c4600024c7000024eac0002
-50280002516c000253540002549c000254c6000254f00002552000025550
-000255a0000255f000025630000256a2000256f600025754000257aa0002
-57e00002582200025868000258b2000258e20002591a0002594a00025a82
-00025dc800025df200025e1c00025e4600025e7000025e9a00025ec40002
-5eee00025f1800025f4200025f6c00025f9600025fc000025fea00026014
-0002603e0002606800026092000260bc000260e6000261100002613a0002
-61640002618e000261b8000261e20002620c0002623600026260000262fe
-000263140002633e0002661e0002662e000267480002686a000269a80002
-6aea00026c9000026ca000026de200026f3200027122000272f60002740e
-0002741e000274a00002752e0002762e0002763e000276de000276ee0002
-78040002795600027a8600027a9600027b6400027b7400027cea00027cfa
-00027e0e00027e1e00027f52000280e8000281a4000281b4000282b20002
-840c00028498000284a8000285d20002875e0002881a0002882a000288c6
-000288d6000289a4000289b400028a8c00028a9c00028ba400028bb40002
-8d7a00028d8a00028ee200028ef20002915c0002916c0002936600029376
-000294e0000294f0000295e0000295f00002978800029798000298b60002
-98c600029a0600029a1600029a2600029a3600029bae00029bbe00029bce
-00029bde00029d3000029e7e00029f4c0002a0300002a1b00002a3320002
-a4320002a5460002a68a0002a69a0002a7880002a8620002a9fe0002aa0e
-0002ab2c0002ac320002ae300002ae400002ae500002ae600002afaa0002
-afba0002b0720002b0820002b1900002b1a00002b28c0002b29c0002b3ba
-0002b3ca0002b4680002b4780002b4880002b5760002b6ea0002b8160002
-b9100002b9200002b9300002b9400002bade0002bc980002bd660002bd76
-0002bfd60002c21c0002c4a20002c7060002c98a0002cbfc0002cdcc0002
-cf820002cfac0002cfd60002cfe60002cff60002d0200002d04a0002d074
-0002d0840002d0940002d0be0002d0e80002d0f80002d1080002d1320002
-d15c0002d1860002d1960002d1a60002d1b60002d1c60002d1d60002d1e6
-0002d2100002d2200002d2300002d25a0002d2840002d2ae0002d2d80002
-d3020002d32c0002d3560002d3800002d3aa0002d3d40002d3fe0002d428
-0002d4520002d47c0002d4a60002d4d00002d4fa0002d5240002d54e0002
-d5780002d5a20002d5cc0002d5f60002d6200002d64a0002d6740002d69e
-0002d6c80002d6f20002d71c0002d7460002d7700002d79a0002d7c40002
-d7ee0002d8180002d8420002d86c0002d8960002d8c00002d8ea0002d914
-0002d93e0002d9680002d9920002d9bc0002d9e60002da100002da3a0002
-da640002da8e0002dab80002dae20002db0c0002dbac0002dbf00002dc66
-0002dc900002dcba0002dce40002dd0e0002dd380002dd620002dd8c0002
-ddb60002dde00002de0a0002de340002de5e0002de880002deb20002dedc
-0002df060002df300002df5a0002df840002dfae0002dfd80002e0020002
-e02c0002e0560002e08a0002e0be0002e0f20002e2840002e4200002e5bc
-0002e7480002e78e0002e7d40002e8420002e89e0002e8f00002e9600002
-ea380002eb040002ebdc0002eca80002ed480002ee620002ef160002ef98
-0002eff20002f0320002f1500002f29a0002f4320002f48e0002f4ec0002
-f5480002f5a40002f6580002f70e0002f7ba0002f8660002f9120002f9ca
-0002fa820002fb3a0002fb4c0002fb5e0002fb700002fb820002fb940002
-fc020002fc700002fd280002fd3a0002fd4c0002fd5e0002fd6e0002fd80
-0002fd920002fda40002fdb60002fdc80002fdda0002fe880002ff340002
-ffe20003008e00030126000301600003018a000301b4000302080003025a
-000302d6000303200003039c000303f000030474000304c60003053c0003
-0594000305fa00030650000306aa0003072800030774000307d200030836
-00030884000308d20003092a000309720003099c000309ca000309f00003
-0a2400030a5400030a8400030ad600030b4400030b9a00030c0e00030c62
-00030cd600030d1c00030d8400030dca00030e2600030e5600030e900003
-0eb600030ee600030f0c00030f3200030f6400030f9400030fe60003104c
-000310a2000311080003115c000311ca0003120c0003126c000312ae0003
-12fa0003133400031370000313aa000313e60003141a0003144c0003147c
-000314ac000314d6000314fc00031526000315540003157e000315ca0003
-160e0003164400031680000316b4000316e200031720000317500003178a
-000317b4000317e2000318080003182e0003185a000318b6000318e60003
-1916000319460003197e000319b2000319e000031a1000031a4000031a70
-00031aa000031ad400031b2a00031b5e00031bbe00031bf200031c4a0003
-1c7e00031cda00031d7800031e4600031f660003202e000320be00032154
-000323400003253c000326b400032830000329da00032b8c00032c740003
-2daa00032ea200032fb4000330d20003320800033372000334e000033676
-000337f2000339020003391200033a3e00033b7a00033cbc00033e400003
-3f1a00033f9000034046000340ec0003425c000342940003430e000343d0
-0003448a000344f2000345f80003472e000347fa00034958000349d20003
-4a4c00034b1800034bd200034c8600034ce200034d3c00034d8400034df4
-00034e7000034eba00034ef400034f3a00034f7e00034fd0000350220003
-50a40003512600035168000351a8000351de000352140003524200035270
-000352a4000352d80003531a0003535c00035398000353d40003540e0003
-54480003547a000354ac000354de000355100003554a00035584000355c6
-000356080003564a0003568c000356da000357280003576a000357ac0003
-57ec0003582c00035866000358a0000358ec0003593800035976000359b6
-000359fc00035a4200035a7e00035ad400035b1000035b4c00035b8c0003
-5bcc00035c0800035c4400035c8400035cc400035d0800035d4c00035da0
-00035e2e00035e7000035eb200035f1a00035f8200035fb400035fe60003
-601e00036056000360ec00036182000361cc00036216000362520003628e
-000362e40003633a00036384000363ce000364260003647e000364be0003
-64fe000365360003656e000365b800036602000366400003667e000366c0
-0003670200036756000367aa000367f0000368360003687c000368c20003
-69180003696e000369c400036a1a00036a6600036ab200036afe00036b4a
-00036bbe00036c3200036ca600036d1a00036d5800036d9600036dd40003
-6e1200036e5000036e8e00036ed200036f1600036f6200036fae0003700e
-0003705a00037098000370e6000371f60003724600037296000372ce0003
-73060003735c000373b2000374260003748a000374cc0003750e00037564
-000375b2000375fe0003764a0003768a000376ca000377120003775a0003
-77c6000378200003785800037890000378d000037910000379e000037adc
-00037b9c00037c8a00037ce000037d3600037d8800037ddc00037e400003
-7ea400037efa00037f5000037fc60003803c0003807e000380c000038102
-0003814400038186000381c80003821e00038274000382c60003831a0003
-83a200038424000384c400038566000385a4000385e2000386200003865c
-0003869a000386d80003871600038752000388360003892200038a380003
-8b5400038c1e00038ce800038de200038edc00038fda000390d8000391f6
-000393140003943a000395600003966200039764000397f6000398880003
-98c6000399040003995e000399b8000399f000039a2800039b3800039b48
-00039b9000039bd800039c3000039c8800039cba00039cec00039d2e0003
-9d7000039daa00039de400039e2800039e6c00039ee400039f5e00039fee
-0003a0320003a0720003a0f40003a1760003a2ce0003a2de0003a32c0003
-a37a0003a3b60003a3f20003a4380003a47e0003a4cc0003a51a0003a56a
-0003a5ba0003a6160003a6720003a7e80003a9500003a9880003a9c20003
-aa0e0003aa5a0003aaac0003aafe0003ab500003aba60003abe20003ac1e
-0003ac740003acc80003ae000003aea00003aeee0003af2e0003af680003
-b0fe0003b3820003b4460003b5dc0003b73a0003b8080003b9ae0003bc02
-0003be3a0003be800003beb20003bf5c0003c0800003c0a40003c13e0003
-c24a0003c35a0003c46a0003c5780003c6fe0003c7300003c7d20003c7fa
-0003c85c0003c8be0003c9200003c9820003c9c00003c9fe0003ca380003
-ca720003ca9e0003caea0003cb240003cb5e0003ccba0003ce0e0003ce1e
-0003cedc0003d0120003d0700003d1880003d3160003d3bc0003d5020003
-d5400003d57e0003d5bc0003d6100003d6380003d6920003d6f60003d73e
-0003d7a00003d8000003d8720003d8ee0003d96a0003d9ec0003da780003
-db040003db8e0003dc0e0003dc480003dc840003dde80003deb20003dee2
-0003df120003e04a0003e19a0003e1aa0003e2980003e36c0003e4640003
-e55a0003e6dc0003e8360003e8460003e95e0003ea0a0003eb4c0003eca2
-0003ecfe0003ee5c0003eeea0003f0900003f2020003f3160003f34e0003
-f3b20003f5620003f6cc0003f72e0003f8960003f99c0003fa520003fafe
-0003fc260003fd140003fdf40003ff34000400600004017a000402ea0004
-046400040474000405540004064a000406fa000407f6000408a2000409ac
-00040a9800040bc200040ce600040dea00040f1800041056000411c20004
-12f80004148c000416340004172c000418400004197200041a6400041a9c
-00041af200041ba000041bb000041c1200041c6e00041cd400041d200004
-1d6000041d9800041dc400041df200041e2c00041f6200041f960004201a
-000420d00004210000042184000421b4000421ec00042384000425100004
-255a00042594000425ea000426360004265c00042682000426c400042706
-0004274800042778000427b0000427e60004281c0004285e0004288e0004
-28be000429b400042ab800042aec00042b2400042b6a00042b9e00042bce
-00042c0600042c3a00042c6e00042c9e00042cce00042d0400042d3a0004
-2d6a00042d9a00042dce00042e0200042e3200042e6200042e9c00042ed0
-00042f0200042f3400042f6800042f9c00042fcc00042ffc0004302a0004
-305800043166000432d2000434060004353a0004356a000435a40004363e
-000437a800043904000439c800043adc00043b0c00043b4000043c380004
-3de800043e4000043eb800043ff400044032000440a4000440d400044104
-0004413e000441c6000441f600044226000443b6000445000004460c0004
-471a000448460004499c00044af800044c5800044d9200044f0400045064
-000450740004522a00045352000453ec0004557400045584000456800004
-58060004595e00045a1000045ae000045bec00045c9600045cce00045cde
-00045d8e00045e3400045eb000046000000460f4000461ea000462f60004
-63ce000464a80004653c0004664e000467de000468fc000469f200046a9c
-00046b4600046c1000046cb800046d8e00046e0a00046e6600046fc80004
-70fc000472980004735a0004745a00047532000476700004771c000477e6
-000478d6000479fc00047ad800047bde00047d1600047e0600047ea40004
-7f960004810600048250000484bc0004858e000486420004871000048804
-000489420004895200048a8600048b9800048ba800048cb400048de40004
-8e3800048fac000490d4000491e80004939a000495ae00049842000499fc
-00049b2800049d0800049eca0004a05c0004a1280004a2c40004a33a0004
-a3e80004a4c40004a5500004a5f20004a6940004a7780004a8b00004ab0c
-0004ac540004ac640004ac740004acd60004ad340004ad960004ae340004
-aecc0004afd00004b0be0004b0ce0004b0de0004b1780004b2120004b24e
-0004b2ca0004b33e0004b3940004b3c80004b44e0004b4da0004b5520004
-b5b00004b64a0004b6dc0004b75c0004b7de0004b8720004b8a60004b908
-0004b9ba0004bb800004bbb80004bd940004bea80004beb80004beee0004
-bf320004bf760004bfba0004bff00004c0220004c0640004c1000004c156
-0004c1fc0004c2740004c2fa0004c36a0004c3cc0004c4520004c4b20004
-c51c0004c5900004c6000004c65e0004c7040004c79c0004c8080004c898
-0004c8f60004c9640004ca0c0004cab80004cb4e0004cbb80004cc3a0004
-cc9e0004cd4a0004ce020004ceae0004cf3c0004cf980004d0040004d05a
-0004d0dc0004d15a0004d1e00004d26c0004d2c60004d3320004d3a20004
-d4120004d4820004d5060004d5960004d5fc0004d6760004d6f20004d76a
-0004d8100004d8ac0004d93c0004d99a0004da380004dab40004db460004
-dbe80004dc920004dd2a0004dd860004dddc0004de440004deea0004df92
-0004e05c0004e1020004e1640004e1bc0004e21c0004e2aa0004e3300004
-e3be0004e41e0004e4820004e4ec0004e5540004e5bc0004e63a0004e6c2
-0004e7560004e7c20004e82a0004e88e0004e9360004e9f00004ea9e0004
-eb2c0004eb8a0004ebf60004ec660004ed0c0004edb60004ee780004ef1a
-0004ef7e0004f00e0004f0800004f1100004f18e0004f20a0004f2760004
-f3040004f3600004f3be0004f4440004f4c00004f5280004f58c0004f5e0
-0004f64e0004f6b60004f7340004f7aa0004f8240004f8a40004f9000004
-f9660004f9ca0004fa6a0004fb0c0004fbc20004fc720004fcce0004fd46
-0004fda40004fe2e0004fec60004ff560004ffbc0005001a000500a80005
-011a000501ae00050246000502b6000503260005039e000503fc0005045c
-000504d60005053000050590000505ea00050646000506ae0005073c0005
-0772000507aa0005083600050860000508a20005093600050a2400050ab4
-00050aea00050b3a00050bac00050c5800050cea00050d4200050d9c0005
-0df400050e4e00050ed200050f5800050ffc000510a4000510e200051152
-000511e60005127e00051314000513be000513f000051440000514940005
-14da0005157e000516080005168e000516ee000517320005178000051820
-000518b000051950000519f600051a9c00051b6000051b9200051bbc0005
-1c4200051cf200051d2400051d4c00051e1a00051e7800051f1200051f60
-00051fc60005206e000520dc00052142000521ce00052240000522b60005
-236a000523c40005243400052470000524c200052548000525a80005264c
-0005272c00052854000529e400052a4000052a9600052dbc00052e560005
-2eb200052efa00053068000531ba000532000005330e000533a6000534b4
-000535be0005366000053748000537da000538760005396800053a680005
-3ae400053b6a00053bb200053d2400053e8000053f6400053fb400053fe8
-000540d6000541fe00054398000544c8000545de000547120005482e0005
-489c0005493000054a7000054b2600054c9000054dc000054ef20005501e
-000550ca0005519000055262000553bc0005553c0005566c000557880005
-594200055a9400055b8000055c5c00055d1e00055e8800055fd800055fe8
-00055ff800056008000560c000056176000561b2000561e8000562200005
-6256000563e2000565f6000566e0000567f80005697000056ade00056bc8
-00056cfa00056e4200056fc800057166000572ba000574a80005766e0005
-78a400057af200057bda00057cb600057dfe00057f800005806800058182
-000581c40005820e0005842a000586420005878e0005890400058b620005
-8d6400058de800058e1800058e6400058f2c00058ffc0005919000059218
-00059280000592c0000592fe000594b0000596e000059816000599f80005
-9ad400059bee00059d9a00059fa60005a0a80005a1940005a3860005a58e
-0005a6fa0005a87e0005a9de0005ab4c0005abda0005ac6a0005ad840005
-ae900005b0520005b1be0005b3ae0005b5780005b60c0005b6a80005b73e
-0005b7c60005b8ac0005b9840005bb1e0005bcb00005bcd60005bcfc0005
-bd0c0005bd3c0005bd6c0005bee60005c0880005c1320005c2140005c2d4
-0005c37e0005c4180005c4fa0005c5b80005c6940005c84a0005c9840005
-ca100005ca400005ca700005caa40005cad80005cae80005caf80005cb28
-0005cb580005cb8c0005cbc00005cbf40005cc280005cc5c0005cc900005
-ce0a0005ce1a0005ce4a0005ce7a0005ceb20005cee60005cf1a0005cf4e
-0005cf820005cfb60005cfea0005d0220005d0580005d0880005d0c80005
-d1000005d1480005d18e0005d1c20005d1f60005d2300005d2680005d308
-0005d3180005d46a0005d6320005d7d80005d9820005dace0005dbe40005
-dcf20005de080005df020005dfea0005e10c0005e2080005e2e00005e3d0
-0005e48c0005e53e0005e6080005e67a0005e7200005e7b00005e8140005
-e9220005e9880005ea360005eb2c0005eb940005ebfc0005ecac0005ee86
-0005ef8a0005f00a0005f0480005f0f40005f1820005f26a0005f3020005
-f3680005f4660005f5280005f5e20005f6200005f6b00005f7b20005f846
-0005f88a0005f9a80005fad20005fcb40005fe760005ffac000600da0006
-01da000602020006022a0006026000060292000602be000602e60006030e
-0006033c0006039a000604080006044000060478000604a8000604ce0006
-0502000605380006055e00060584000605b2000605e00006060c00060682
-000606aa0006070c00060732000607580006077e000607a4000607d40006
-0804000608340006086e0006089e000608d400060904000609360006095c
-00060982000609b6000609ec00060a1c00060a4c00060a7200060a980006
-0abe00060aec00060b2000060ba600060bea00060c2400060c5800060c9c
-00060cd600060d1000060d3600060d6000060dac00060dee00060e140006
-0e4200060e6800060e8e00060ece00060f0000060f3000060f6000060f86
-00060fac00060fdc0006100c00061032000610580006107e000610a40006
-10ca000610f000061118000611a0000611ca0006123e00061266000612dc
-000613040006136600061398000613ca000613fa00061432000614640006
-1492000614cc000614f40006155400061596000615c6000615f200061622
-000616520006167a000616a2000616ca0006172c00061754000617b20006
-17f60006183a0006186a000618a0000618c6000618ee000619140006193c
-000619620006198a000619b2000619dc00061a0200061a2800061a4e0006
-1a8000061aa800061b2e00061b5800061bc200061bf200061c2200061c48
-00061c6e00061cc600061cf600061d3200061d5c00061d8c00061dbc0006
-1df000061e2400061e5400061e9400061ece00061f1600061f3c00061f62
-00061f8800061fae00061fd4000620140006205400062090000620c00006
-20f0000621200006215000062188000621c000062200000622400006227a
-000622b4000622f00006232e00062378000623c2000624080006244e0006
-2490000624d20006250200062532000625660006259a000625d40006260e
-0006265a000626a6000626fe00062756000627ae0006280c0006283c0006
-286c000628a2000628d80006290e0006294a0006297e000629b200062a06
-00062a5a00062aae00062b0200062b5600062baa00062c0200062c5a0006
-2c8800062cb600062ce800062d1a00062d6000062da600062dd800062e0a
-00062e5c00062eb400062ef800062f3c00062f8000062fc4000630180006
-306c0006309c000630cc000631020006313800063176000631bc00063210
-0006325a000632ac000632fe0006335e000633be000633ee000634200006
-345a00063494000634e60006353a00063584000635cc0006360e00063678
-000636c6000637120006374400063776000637aa000637de000638140006
-384a00063888000638be000638f00006392c00063982000639d800063a36
-00063a9400063aea00063b4000063b7400063ba400063be800063c1e0006
-3c4e00063c9200063cd000063d0800063d4000063d7600063db200063de2
-00063e1e00063e5e00063ea400063eee00063f3a00063f8600063fdc0006
-403200064080000640ce0006411c0006416c000641c8000642240006427c
-000642d4000643280006437c000643be0006440000064448000644900006
-44d8000645260006456a000645ae000646140006467a000646e000064746
-000647ac000648120006487c000648e60006492e00064976000649be0006
-4a0600064a5200064a9e00064af200064b3e00064b8200064bd000064c38
-00064ca000064d1000064d8000064de800064e5000064e9000064ece0006
-4f1800064f4200064f8800064fc00006500e0006503e0006506e000650aa
-000650de000651040006515800065196000651ea000652d0000653f80006
-543a00065460000654b6000654e60006552800065570000655be00065608
-000656580006567e000657660006584a0006599c000659ca000659f80006
-5a8c00065b1200065b4000065bca00065bfa00065c2a00065c7800065cc6
-00065daa00065e8600065fca00065ffa0006602a000660c0000661480006
-6178000661a8000661d80006626800066298000662c80006631a00066362
-000663b80006644e000664e60006655a000665ac000665d60006662c0006
-6660000666aa000666e20006673200066770000667bc000667e20006685e
-000668b0000669c200066bcc00066d8000066f0200067074000673160006
-75e6000677a6000678ec00067b4600067c8800067e9e00067ef000067f40
-00067f9600067fec0006804e000680d600068324000684b6000686c20006
-87de0006899200068b1400068bd400068cb600068d1e00068d8000068df6
-00068e5e00068f0a00068f7a0006900a0006911e000691e20006922e0006
-92c40006937000069414000694be000695080006954a000695c000069628
-000696b800069766000697d0000698340006989a00069954000699ea0006
-9a4800069a7200069a9c00069aac00069abc00069b7e00069c8200069e8c
-00069fe200069ff20006a0a20006a1860006a1e60006a1f60006a2520006
-a2b00006a3d00006a4be0006a4ce0006a4de0006a4ee0006a4fe0006a5e4
-0006a6e40006a8bc0006aa780006ab7e0006abf80006ac720006ad240006
-ad340006ae420006ae520006ae620006af240006b0580006b1440006b154
-0006b1640006b1740006b2da0006b4460006b5720006b5820006b5920006
-b5a20006b5b20006b6940006b6a40006b8060006b9100006ba0e0006bb46
-0006bc180006bc960006bd140006be340006beb00006befc0006bf880006
-c09c0006c0f00006c2320006c2f20006c3be0006c4b40006c5be0006c670
-0006c7d60006c83c0006c9000006cb020006cc900006ce0e0006cf3e0006
-d1f00006d3320006d4600006d5d80006d7500006d8d00006da5e0006dc10
-0006dc7e0006dde20006df1a0006e01e0006e1540006e2860006e3560006
-e4260006e5820006e65c0006e6fc0006e8000006e92a0006ea280006eba8
-0006ed120006ee500006efc80006f1140006f1f60006f25e0006f3000006
-f3a00006f49e0006f6060006f7400006f8d40006fa1e0006fb020006fb60
-0006fc660006fcfc0006fdbe0006fe640006fea400070050000701220007
-01e800070310000704b0000705bc00070614000707ac0007083a0007084c
-0007087c000708ac000708e40007091c000709520007098e000709c40007
-0a0000070b6e00070bb800070c5200070cea00070d6400070de800070e4e
-00070efa00070f46000710660007111c000711f20007122a000712680007
-12dc000713d6000714f4000715f6000716380007167a000716e8000716f8
-000717080007171800071728000717380007174800071758000717680007
-17780007178800071798000717980007191c0007192c000719ec00071ab2
-00071be800071dde00071fe0000721dc00072412000726120007267e0007
-27900007292200072a7a00072b2c00072b7000072c0e00072d3e00072d8e
-00072e2400072f6000072f70000731260007325a000732aa000733000007
-33c20007340600073448000734ce0007352c0007361e000736ac000736e2
-0007375c000737d4000738240007393000073a2600073ad000073afa0007
-3b2400073b4e00073b7800073bb800073bf800073c3000073c6800073cb2
-00073cfc00073d3c00073d7c00073dc600073e1000073e5000073e900007
-3eea00073f4400073f7e00073fb800073ffc0007404000074084000740c8
-0007411c00074170000741bc00074208000742460007428a000742da0007
-432a00074384000743e20007440c00074436000744d00007456a000745ae
-000745f2000747080007471800074760000747a8000747fa0007484c0007
-48b60007490a00074956000749b400074a3e00074aa200074ae600074b30
-00074b9800074be200074c2200074c6a00074ca600074ce200074d1e0007
-4d5800074d9a00074ddc00074e1c00074e5c00074ea600074ef000074f46
-00074f9e00074fec0007503a0007507c000750ca0007510c000751560007
-5198000751dc0007523800075294000752e00007532c00075376000753c0
-000753fe0007543c000754ba0007553800075572000755ac000756460007
-56e0000757b400075888000758e400075940000759b400075a2800075b86
-00075b9600075c8000075c9000075cc600075cfc00075d3600075d700007
-5dac00075de800075e2e00075e7400075fda00076190000762dc0007649a
-00076610000767b8000768e8000769ee00076c0c00076d5000076ee60007
-706e000770ec0007723000077438000774cc00077560000776b4000777de
-0007795800077a9800077c0400077cf200077ebc00078050000780d20007
-8204000782ee0007845600078538000786ee000787e00007894200078a7e
-00078b7200078d3600078ebe00079062000791c600079362000795200007
-96a600079742000798b6000799a800079a9000079c1000079d6200079e82
-0007a01a0007a1f00007a37e0007a4280007a4de0007a6900007a7340007
-a7c20007a80e0007a85a0007a8d20007a9b00007aa2a0007aacc0007ab20
-0007ac840007adb00007aec20007afc40007b08c0007b2000007b3400007
-b5660007b6100007b73a0007b83e0007b9de0007baca0007bbc40007bcc2
-0007bda80007bec20007c07c0007c22a0007c3980007c4100007c4840007
-c5a20007c6260007c7280007c8b40007ca2c0007cb620007cc6c0007cde2
-0007cf5a0007d14c0007d33a0007d5000007d5740007d6240007d6da0007
-d78a0007d8480007d9420007da460007db400007dc4c0007dcd40007dd62
-0007ddea0007de7e0007df5a0007e0500007e1340007e22a0007e2be0007
-e37a0007e40e0007e4cc0007e5bc0007e6c40007e7c20007e8d60007e9f8
-0007eb0c0007ec4c0007ed860007eea80007efbc0007f1000007f2540007
-f4680007f61a0007f6ce0007f7ea0007f8c00007f9de0007fabc0007fc50
-0007fd0a0007fda60007fe980007ff800008006c000800ea000801e40008
-03220008044e00080482000804c6000804d600080576000806180008070e
-000807fa000808d4000809ac00080b0a00080c6a00080d0800080d9e0008
-0ddc00080e1c00080e5a00080e9a00080ef400080f4c00080fa60008100a
-0008109600081292000812e20008140e0008149400081514000815ee0008
-16c2000817c6000819b200081aca00081b3a00081bca00081c8c00081d5e
-00081dca00081e4800081f9c00081fe2000820280008210c000821480008
-21a6000821e4000822160008225a0008229c000822cc000100000d3500f2
-003c009d000700020010002f005600000468041d0005000200>
-<0000003a02be0000000300000000006a00000000000300000001000a006a
-0000000300000002000e00740000000300000003005e0082000000030000
-0004000a00e00000000300000005001800ea0000000300000006000e0102
-000000030000000700ba01100000000300000008003001ca000000030000
-0009008a01fa000000030000000d02aa028400010000000000000035052e
-000100000000000100050563000100000000000200070568000100000000
-0003002f056f00010000000000040005059e0001000000000005000c05a3
-0001000000000006000705af0001000000000007005d05b6000100000000
-00080018061300010000000000090045062b000100000000000d01550670
-0003000104030002000c07c50003000104050002001007d1000300010406
-0002000c07e10003000104070002001007ed0003000104080002001007fd
-0003000104090000006a080d0003000104090001000a0877000300010409
-0002000e08810003000104090003005e088f0003000104090004000a08ed
-0003000104090005001808f70003000104090006000e090f000300010409
-000700ba091d0003000104090008003009d70003000104090009008a0a07
-000300010409000d02aa0a9100030001040a0002000c0d3b00030001040b
-000200100d4700030001040c0002000c0d5700030001040e0002000c0d63
-0003000104100002000e0d6f000300010413000200120d7d000300010414
-0002000c0d8f000300010415000200100d9b0003000104160002000c0dab
-0003000104190002000e0db700030001041b000200100dc500030001041d
-0002000c0dd500030001041f0002000c0de10003000104240002000e0ded
-00030001042a0002000e0dfb00030001042d0002000e0e0900030001080a
-0002000c0e170003000108160002000c0e23000300010c0a0002000c0e2f
-000300010c0c0002000c0e3b00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0052006500670075006c00610072004d006f006e006f
-0074007900700065003a0041007200690061006c00200052006500670075
-006c00610072003a00560065007200730069006f006e00200035002e0030
-003100200028004d006900630072006f0073006f00660074002900410072
-00690061006c00560065007200730069006f006e00200035002e00300031
-0041007200690061006c004d00540041007200690061006c002000690073
-00200061002000740072006100640065006d00610072006b0020006f0066
-00200054006800650020004d006f006e006f007400790070006500200043
-006f00720070006f0072006100740069006f006e00200069006e00200074
-0068006500200055006e0069007400650064002000530074006100740065
-007300200061006e0064002f006f00720020006f00740068006500720020
-0063006f0075006e00740072006900650073002e0054006800650020004d
-006f006e006f007400790070006500200043006f00720070006f00720061
-00740069006f006e004d006f006e006f0074007900700065002000540079
-00700065002000440072006100770069006e00670020004f006600660069
-006300650020002d00200052006f00620069006e0020004e006900630068
-006f006c00610073002c0020005000610074007200690063006900610020
-005300610075006e0064006500720073002000310039003800320059006f
-00750020006d006100790020007500730065002000740068006900730020
-0066006f006e007400200074006f00200064006900730070006c00610079
-00200061006e00640020007000720069006e007400200063006f006e0074
-0065006e00740020006100730020007000650072006d0069007400740065
-006400200062007900200074006800650020006c006900630065006e0073
-00650020007400650072006d007300200066006f00720020007400680065
-002000700072006f006400750063007400200069006e0020007700680069
-006300680020007400680069007300200066006f006e0074002000690073
-00200069006e0063006c0075006400650064002e00200059006f00750020
-006d006100790020006f006e006c0079002000280069002900200065006d
-0062006500640020007400680069007300200066006f006e007400200069
-006e00200063006f006e00740065006e0074002000610073002000700065
-0072006d0069007400740065006400200062007900200074006800650020
-0065006d00620065006400640069006e0067002000720065007300740072
-0069006300740069006f006e007300200069006e0063006c007500640065
-006400200069006e0020007400680069007300200066006f006e0074003b
-00200061006e006400200028006900690029002000740065006d0070006f
-0072006100720069006c007900200064006f0077006e006c006f00610064
-0020007400680069007300200066006f006e007400200074006f00200061
-0020007000720069006e0074006500720020006f00720020006f00740068
-006500720020006f00750074007000750074002000640065007600690063
-006500200074006f002000680065006c00700020007000720069006e0074
-00200063006f006e00740065006e0074002ea9203230303620546865204d
-6f6e6f7479706520436f72706f726174696f6e2e20416c6c205269676874
-732052657365727665642e417269616c526567756c61724d6f6e6f747970
-653a417269616c20526567756c61723a56657273696f6e20352e30312028
-4d6963726f736f667429417269616c56657273696f6e20352e3031417269
-616c4d54417269616c20697320612074726164656d61726b206f66205468
-65204d6f6e6f7479706520436f72706f726174696f6e20696e2074686520
-556e697465642053746174657320616e642f6f72206f7468657220636f75
-6e74726965732e546865204d6f6e6f7479706520436f72706f726174696f
-6e4d6f6e6f7479706520547970652044726177696e67204f666669636520
-2d20526f62696e204e6963686f6c61732c20506174726963696120536175
-6e646572732031393832596f75206d617920757365207468697320666f6e
-7420746f20646973706c617920616e64207072696e7420636f6e74656e74
-206173207065726d697474656420627920746865206c6963656e73652074
-65726d7320666f72207468652070726f6475637420696e20776869636820
-7468697320666f6e7420697320696e636c756465642e20596f75206d6179
-206f6e6c792028692920656d626564207468697320666f6e7420696e2063
-6f6e74656e74206173207065726d69747465642062792074686520656d62
-656464696e67207265737472696374696f6e7320696e636c756465642069
-6e207468697320666f6e743b20616e6420286969292074656d706f726172
-696c7920646f776e6c6f6164207468697320666f6e7420746f2061207072
-696e746572206f72206f74686572206f7574707574206465766963652074
-6f2068656c70207072696e7420636f6e74656e742e004e006f0072006d00
-61006c006f00620079010d0065006a006e00e9006e006f0072006d006100
-6c005300740061006e0064006100720064039a03b103bd03bf03bd03b903
-ba03ac00a90020003200300030003600200054006800650020004d006f00
-6e006f007400790070006500200043006f00720070006f00720061007400
-69006f006e002e00200041006c006c002000520069006700680074007300
-2000520065007300650072007600650064002e0041007200690061006c00
-52006500670075006c00610072004d006f006e006f007400790070006500
-3a0041007200690061006c00200052006500670075006c00610072003a00
-560065007200730069006f006e00200035002e0030003100200028004d00
-6900630072006f0073006f0066007400290041007200690061006c005600
-65007200730069006f006e00200035002e00300031004100720069006100
-6c004d00540041007200690061006c002000690073002000610020007400
-72006100640065006d00610072006b0020006f0066002000540068006500
-20004d006f006e006f007400790070006500200043006f00720070006f00
-72006100740069006f006e00200069006e00200074006800650020005500
-6e0069007400650064002000530074006100740065007300200061006e00
-64002f006f00720020006f007400680065007200200063006f0075006e00
-740072006900650073002e0054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-4d006f006e006f0074007900700065002000540079007000650020004400
-72006100770069006e00670020004f006600660069006300650020002d00
-200052006f00620069006e0020004e006900630068006f006c0061007300
-2c0020005000610074007200690063006900610020005300610075006e00
-64006500720073002000310039003800320059006f00750020006d006100
-7900200075007300650020007400680069007300200066006f006e007400
-200074006f00200064006900730070006c0061007900200061006e006400
-20007000720069006e007400200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-200074006800650020006c006900630065006e0073006500200074006500
-72006d007300200066006f00720020007400680065002000700072006f00
-6400750063007400200069006e0020007700680069006300680020007400
-680069007300200066006f006e007400200069007300200069006e006300
-6c0075006400650064002e00200059006f00750020006d00610079002000
-6f006e006c0079002000280069002900200065006d006200650064002000
-7400680069007300200066006f006e007400200069006e00200063006f00
-6e00740065006e00740020006100730020007000650072006d0069007400
-7400650064002000620079002000740068006500200065006d0062006500
-6400640069006e0067002000720065007300740072006900630074006900
-6f006e007300200069006e0063006c007500640065006400200069006e00
-20007400680069007300200066006f006e0074003b00200061006e006400
-200028006900690029002000740065006d0070006f007200610072006900
-6c007900200064006f0077006e006c006f00610064002000740068006900
-7300200066006f006e007400200074006f00200061002000700072006900
-6e0074006500720020006f00720020006f00740068006500720020006f00
-750074007000750074002000640065007600690063006500200074006f00
-2000680065006c00700020007000720069006e007400200063006f006e00
-740065006e0074002e004e006f0072006d0061006c004e006f0072006d00
-610061006c0069004e006f0072006d0061006c004e006f0072006d00e100
-6c004e006f0072006d0061006c0065005300740061006e00640061006100
-720064004e006f0072006d0061006c004e006f0072006d0061006c006e00
-79004e006f0072006d0061006c041e0431044b0447043d044b0439004e00
-6f0072006d00e1006c006e0065004e006f0072006d0061006c004e006f00
-72006d0061006c004e0061007600610064006e006f0074006801b001a103
-00006e00670041007200720075006e00740061004e006f0072006d006100
-6c004e006f0072006d0061006c004e006f0072006d0061006c004e006f00
-72006d0061006c000000b900540328b326181fd0bc032900e00329000203
-29b22b1d1fb90327031db23b1f40b80323b31215320f412d03200001002f
-0320000100200320006f032000af032000bf03200004005f031e00010010
-031e007f031e0080031e00af031e00bf031e00d0031e00060000031e0010
-031e0020031e006f031e009f031e00e0031e0006031d031cb2201f104127
-0319007f03190002000f031700ef031700ff03170003001f0317002f0317
-004f0317005f0317008f0317009f03170006000f0317005f0317006f0317
-007f031700bf031700f00317000600400317b2923340b80317b28b3340b8
-0317b36a6c3240b80317b2613340b80317b35c5d3240b80317b357593240
-b80317b34d513240b80317b344493240b80317b23a3340b80317b3313432
-40b80317b32e423240b80317b3272c3240b80317b312253280b80317b30a
-0d32c04116031600d00316000200700316000102c4000f0101001f00a003
-1500b0031500020306000f0101001f00400312b32426329fbf0304000103
-0203010064001fffc00301b20d1132410a02ff02ef0012001f02ee02ed00
-64001fffc002edb30e11329f414a02e200af02e200bf02e2000302e202e2
-02e102e1007f02e00001001002e0003f02e0009f02e000bf02e000cf02e0
-00ef02e0000602e002e002df02df02de02de000f02dd002f02dd003f02dd
-005f02dd009f02dd00bf02dd00ef02dd000702dd02dd001002dc00010000
-02dc0001001002dc003f02dc000202dc02dc001002db000102db02db000f
-02da000102da02daffc002d3b2373932b9ffc002d3b22b2f32b9ffc002d3
-b21f2532b9ffc002d3b2171b32b9ffc002d3b2121632b802d2b2f9291fb9
-0326031cb23b1f40bb0322003e00330322b225311fb80318b23c691fb802
-e3b3202b1fa0413002d400b002d40002000002d4001002d4002002d40050
-02d4006002d4007002d40006006002d6007002d6008002d6009002d600a0
-02d600b002d60006000002d6001002d6002002ca002002cc002002d60030
-02d6004002d6005002d6000802d0b2202b1fb802cfb226421f411602ce02
-c70017001f02cd02c80017001f02cc02c60017001f02cb02c50017001f02
-c902c5001e001f02ca02c6b21e1f00410b02c6000002c7001002c6001002
-c7002f02c5000502c1b324121fff411102bf0001001f02bf002f02bf003f
-02bf004f02bf005f02bf008f02bf000602bf0222b2641f12410b02bb00ca
-0800001f02b200e90800001f02a600a20800406a1f402643493240204349
-3240263a3d3240203a3d329f209f26024026969932402096993240268e92
-3240208e92324026848c324020848c3240267a813240207a813240266c76
-3240206c76324026646a324020646a3240265a5f3240205a5f3240264f54
-3240204f5432b8029eb724271f374f6b0120410f02770030027700400277
-00500277000402770277027700f90400001f029bb22a2a1fb8029a402b29
-2a1f80ba0180bc0180520180a201806501807e01808101803c01805e0180
-2b01801c01801e0180400180bb0138000100800140b40180400180bb0138
-00010080013940180180ca0180ad01807301802601802501802401802001
-3740b80221b2493340b80221b2453340b80221b341423240b80221b33d3e
-320f410f0221003f0221007f0221000300bf022100cf022100ff02210003
-00400221b320223240b80221b3191e3240b80222b32a3f3240b80221b32e
-3a326f414802c3007f02c3008f02c300df02c30004002f02c3006002c300
-cf02c30003000f02c3003f02c3005f02c300c002c300ef02c300ff02c300
-0600df02220001008f02220001000f0222002f0222003f0222005f022200
-7f022200ef0222000600bf022100ef02210002006f0221007f022100af02
-210003002f0221003f0221004f0221000302c302c3022202220221022140
-1d101c102b1048038f1c010f1e014f1eff1e023700161600000012110811
-b8010db6f70df8f70d00094109028e028f001d001f0290028f001d001f02
-8fb2f91d1fb80198b226bb1f41150197001e0401001f013900260125001f
-013800730401001f0135001c0801001f0134001c02ab001f0132b21c561f
-b8010fb2262c1fba010e001e0401b61ff91ce41fe91cb80201b61fe81cbb
-1fd720b80401b21fd51cb802abb61fd41c891fc92fb80801b21fbc26b801
-01b21fba20b80201b61fb91c381fadcab80401b21f8126b8019ab21f7e26
-b8019ab61f7d1c471f6b1cb80401b21f6526b8019ab21f5e73b80401400f
-1f52265a1f481c891f441c621f4073b80801b61f3f1c5e1f3c26b8019ab2
-1f351cb80401b61f301cbb1f2b1cb80401b61f2a1c561f291cb80101b21f
-231eb80401b21f5537b80168402c07960758074f07360732072c0721071f
-071d071b071408120810080e080c080a080808060804080208000814b8ff
-e0402b000001001406100000010006040000010004100000010010020000
-01000200000001000002010802004a00b013034b024b5342014bb0c06300
-4b6220b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807
-ff52b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ff
-b101018e851bb0124358b900010111858d1bb900010128858d5959001816
-763f183f123e113946443e113946443e113946443e113946443e11394660
-443e11394660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b2b
-182b1db0964b5358b0aa1d59b0324b5358b0ff1d594bb09353205c58b901
-f201f04544b901f101f045445958b9033e01f2455258b901f2033e445959
-4bb8015653205c58b9002001f14544b9002601f145445958b9081e002045
-5258b90020081e4459594bb8019a53205c58b9002501f24544b9002401f2
-45445958b909090025455258b9002509094459594bb8040153205c58b173
-244544b1242445445958b917200073455258b9007317204459594bb80401
-53205c58b1ca254544b1252545445958b9168000ca455258b900ca168044
-59594bb03e53205c58b11c1c4544b11e1c45445958b9011a001c455258b9
-001c011a4459594bb05653205c58b11c1c4544b12f1c45445958b9018900
-1c455258b9001c01894459594bb8030153205c58b11c1c4544b11c1c4544
-5958b90de0001c455258b9001c0de04459592b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65
-422b2b01b33b59635c456523456023456560234560b08b766818b0806220
-20b163594565234520b003266062636820b003266165b059236544b06323
-4420b13b5c4565234520b003266062636820b003266165b05c236544b03b
-2344b1005c455458b15c406544b23b403b4523614459b347503437456523
-456023456560234560b089766818b080622020b134504565234520b00326
-6062636820b003266165b050236544b034234420b147374565234520b003
-266062636820b003266165b037236544b0472344b10037455458b1374065
-44b24740474523614459004b5342014b5058b108004259435c58b1080042
-59b3020b0a124358601b2159421610703eb0124358b93b21187e1bba0400
-01a8000b2b59b00c2342b00d2342b0124358b92d412d411bba0400040000
-0b2b59b00e2342b00f2342b0124358b9187e3b211bba01a80400000b2b59
-b0102342b0112342002b7475737500184569444569444569447373737374
-757374752b2b2b2b74752b2b2b2b2b737373737373737373737373737373
-737373737373737373732b2b2b45b0406144737400004bb02a534bb03f51
-5a58b1070745b040604459004bb03a534bb03f515a58b10b0b45b8ffc060
-4459004bb02e534bb03a515a58b1030345b040604459004bb02e534bb03c
-515a58b1090945b8ffc06044592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b752b2b2b2b2b2b2b435c58b9008002bbb301401e017400735903b01e4b
-5402b0124b545ab012435c5a58ba009f02220001007359002b7473012b01
-732b2b2b2b2b2b2b2b737373732b2b2b2b2b002b2b2b2b2b2b0045694473
-456944734569447374754569447345694445694445694473744569444569
-44732b2b2b2b2b732b002b732b74752b2b2b2b2b2b2b2b2b2b2b2b2b2b73
-7475732b7374757374752b2b2b742b2b000000>
-[15785 15901 16277 16325 16277 16273 15933 16169 16277 15721 16361 15561 15973
-16029 16305 15693 16345 16249 15893 15629 16365 15481 16245 16249 16357 16337
-15821 15749 16345 15937 16257 16033 19077 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-2 3242 17 <000100ba0000018700cd000300254018023c000a023c5f006f007f00af00
-04a0000100a004a198182b10f65d5ded003fed313033353315bacdcdcd00
->ArialMT AddT42Char 
-3 4064 66 <0001ffe1fe69048afeeb0003001a400c013f00021a050019044341182b4e
-10e410e6002f4ded3130033521151f04a9fe69828200>ArialMT AddT42Char 
-3 4962 69 <00020086ffe8041f05ba0010001d0180409b01050c0f240535054505053f
-1fb01f021f1f221c331c421c701f901f063a133c163c1a4c164c1a5d085d
-0d580f5d165e1a6a086c0d680f6e166e1ac01fd90cda17da19e213ec17ec
-19e31de01fff1f1920052f0f2f1430053f0f40054c0f50056605da1df504
-fa100c10150e040602001b1c0607010a151c0e0b1824d00b01100b400b60
-0b800b041f400d0d02550b0c0f0f02550b180d0d02550bb8fff6b40c0c02
-550bb8fff0b40b0b06550bb8fff4b40f0f06550bb8ffe0b40c0c06550bb8
-fff4402f0d0d06550b7401113300040c0c025500040d0d06550033032502
-02c001019001a001b001f001041f013f014f010301b8fffeb41010025501
-b8fffc401d0e0e0255010c0d0d025501100c0c025501120b0b0255010c0b
-0b065501b8fff8b41010065501b8fffc40160f0f065501180c0c06550114
-0d0d065501191e4737182b4e10f42b2b2b2b2b2b2b2b2b2b5d71723c4d10
-fdf42b2be410fd2b2b2b2b2b2b2b2b5d71ed003fed3f3fed3f1139111239
-3130005d015d7172007121231133113633321e0215100023222703141716
-333236353426232206012da7b472b162af7140fef2bdbc6b0234559176ac
-a57576ac05bafdf58f4f8fca73feeffed69d0196bf558bcdcbd0c6cd>ArialMT AddT42Char 
-3 5440 70 <00010050ffe803ed043e001a015ab1020243545840340e7f0f010f0b0140
-0050007000030004121c0b07181c040b010e1507080e0e0255070c0d0d02
-55070c0c0c025507100b0b0255072f2b2b2b2bcdd4c6003fed3fed10c45d
-3210c45d3231301b4047090c011f1c4313431753135317601360179b029b
-039a0da410a41a0c080d190a6a0269036a05750c700d800da60cb509b60a
-b50c0c160c860ce302030e225f0f6f0f7f0f030f01b802aa407930004000
-5000600070009000a000e000f00009000f0f0b000004121c0b07181c040b
-1c0f010f240e080d0d06550e221b000100240b2b1f010100010101400b0b
-065501401010065501480c0c0655011a0d0d065501491c1524cf07011f07
-3f0702070e0b0b0655070a1010065507120c0c065507311b34c4182b10f6
-2b2b2b5d71ed10f62b2b2b2b5d724b53234b515a58b90001ffc03859ed72
-f42bed72003fed3fed12392f11392f105de4105de43130005d71015d7159
-011706062322001134123633321617072626232206151416333236033cb1
-1defaedafef772e989addc1faf197f5a88aaa4846a8e018517b7cf011d01
-0aac010281afa11b6b6cc3d3d6c28200>ArialMT AddT42Char 
-3 7098 74 <00020042fe5103ea043e001e002a016f40600b0b05142c0b25144c0b4514
-06091d191d2c0b26142c23390b36144a0b46145607580b680bfa0af5150e
-2e232c273e233e274c27902ca02c07362136293f2c460b46214529542154
-29690763216329602c802cda27e821ee23ef271117160615b802b1b4281c
-130701b802aa401020003000600070008000c000d0000700b8027d403205
-1c1c0f0a45221c0c0a16153325330a251818d01701101740176017801704
-2c400b0c02552c400d0d025517121010025517b8fff440110f0f02551706
-0e0e025517160d0d025517b8ffea400b0b0b065517121010065517b8ffee
-b40c0c065517b8fffc404a0d0d065517740f012500221f24bf0fcf0fdf0f
-ff0f041f0f3f0f4f0f030f200b0b02550f1a0c0c02550f220d0d02550f1c
-0b0b06550f0c0d0d06550f1a0c0c06550f192b2c74213450182b2b4ef42b
-2b2b2b2b2b5d714dedf4ed10fd2b2b2b2b2b2b2b2b2b2b5d713c10fde4f6
-3c003fede43fedfd5de43fede43f3c3130015d71005d7117171617163332
-363736270623220235341236333217353311140606232226131416333236
-35342623220666af0b3243747d88180e0176b0dbf06ed18dbc7aa665dba0
-beea99a67d7ca8ad7a78a8581a512532645a37b08b013cdd9801018c9880
-fc6af8cf78ab032ad1c0bfccc3c6c300>ArialMT AddT42Char 
-3 8014 76 <000200880000013c05ba0003000700cd405e09360b0b02554f099009a009
-b009c009df09f0090700091f09700980099f09b009c009df09e009ff090a
-1f09010001070402030906037e0100060506040a0607250500049f04a004
-b004c004e00406c004f0040200042004d004e0040404b8fff8b410100255
-04b8fffa40170e0e025504040c0c0255040a0b0b025504140b0b065504b8
-ffeab41010065504b8fffeb40d0d065504b8fffc400a0c0c0655044e0847
-50182b10f62b2b2b2b2b2b2b2b5d71723cfd3c003f3f3c3fed0111123939
-111239393130015d72712b133533150311331188b4b4b404ebcfcffb1504
-26fbda00>ArialMT AddT42Char 
-3 10918 83 <00020087fe690421043e0012001e0162408e0c102d103d104b10043f20b0
-20021f20290c231d3215321d421d70209020083a173a1b4a174a1b59085b
-0c5c175c1b6a086b0c69106d176b1bc020d314dd18dd1ad31ee414e41ee0
-20ff201623042b102b1535043a1046044a105a10e50beb1dfe100b110e03
-161c1c06070106161c0e0b000e1924d00a01100a400a600a800a0420400b
-0b025520400d0d02550ab8ffe6400b0f0f02550a180d0d02550ab8fffab4
-0c0c02550ab8ffeeb40b0b06550ab8fff4b40f0f06550ab8ffe840230c0c
-06550a74011333023312250000c001019001a001b001f001041f013f014f
-010301b8fffc401d0e0e025501100d0d025501100c0c025501100b0b0255
-010c0b0b065501b8fff6b41010065501b8fffc40160f0f0655010c0c0c06
-5501120d0d065501191f473718012b4e10f42b2b2b2b2b2b2b2b2b5d7172
-3c4d10fdf4e410fd2b2b2b2b2b2b2b2b5d71ed003f3fed3f3fed11391239
-3130005d015d717200711311331536363332161615140206232226271103
-141633323635342623220687a43a926888d06a75df7b5a8f2e11a67678ab
-a77473b1fe6905bd8a51518cff98a3fefb8b4c3afdfb03a4cdc4cbd5cbca
-d700>ArialMT AddT42Char 
-3 11776 85 <00010085000002c6043e001100c9403b2f13011004012304340443045304
-66047404060911080908090d1311090d000308010b1c06070106000a0928
-900801082220130113022211250100b8ffc04010333634f0000100002000
-d000e0000400b8fff8b41010025500b8fff840110e0e025500040c0c0255
-00060b0b025500b8fffcb41010065500b8fff440160f0f065500060c0c06
-5500080d0d0655004e1247c4182b10f62b2b2b2b2b2b2b2b5d712b3cfde4
-105df472e4003f3f3fed11393911393901111239390010c9870e7dc43130
-005d72015d33113315363633321707262322060706151185a23e693f5b5e
-3e42423b5e141e0426a171483aa727473f6072fdd400>ArialMT AddT42Char 
-3 12038 86 <0001003fffe803b1043e00300317407b042214223a094a09442456226522
-7c098e098424a613ab2cc2030d09171a1817304b2cd617051b0255020210
-32010a185c085c095c0a5c0b5c0c5c0d6a086a096a0a6a0b6a0c6a0db426
-b4270f27262427242936245a0a590b64266428742374248024930a9c0c92
-28972c9530a40aa90ca327a428b326c5261628b8fff4b40d0d065522b8ff
-f4b40d0d065523b8fff4b40d0d065524b8fff4b40d0d065528b8fff4b40c
-0c065522b8fff4b40c0c065523b8fff4b40c0c065524b8fff4b40c0c0655
-1db8ffde40121e395a0827250c0a041a202615040b2e1d1ab802aa402219
-2c0b0b02551f193f194f195f19af19cf19060f191f196f19df19041f198f
-190219bd02550015000002aa0001ffc040140b0b025510014001021001d0
-0102000110010201b8ffc0b314163401b8ffc040100e113401012e5c1d6c
-1d021d1c150704b8fff4b40b0b025504b8ffe6b41010065504b8ffe64013
-0f0f0655041c2e0b1f1a011a24194013183432b8ffc0402f0f0f02551918
-0f0f025519180d0d025519160c0c025519201010065519200f0f06551910
-0c0c065519160d0d065519b8025bb207242ab8ffc0b51c39d02a012ab8ff
-e6b40c0c02552ab8ffe8b40f0f02552ab8ffe8b40c0c06552ab8ffeab60d
-0d06552a1a32b8ffc04021272a346032c032023f32803202321001010124
-00180d0d025500100d0d06550020b8fff4b40d0d025520b8fff4b4101006
-5520b8fff440190f0f065520240f100b0b02550f160c0c02550f200d0d02
-550fb8fffa40200f0f02550f0e0c0c06550f0c0d0d06550f22df00013f00
-4f00020019313437182b4e10f45d714df42b2b2b2b2b2bed2b2b2b102b2b
-ed724e105d712bf62b2b2b2b712b4dedf42b2b2b2b2b2b2b2b2bed72003f
-ed2b2b2b3fed7112392f2b2b5d71722be410fd5d71722be4111239111239
-0111121739313043794040272d1e2305142c261110121013100306220d20
-1b000928071b01052d071b011e14201b00210e231b0022230d0c08290a1b
-012827090a062b041b001f101d1b01002b2b103c103c2b103c103c2b012b
-2b2b2b2a2b818181002b2b2b2b2b2b2b2b2b5d71015d72715d1337161633
-323635342726272e02353436373636333216161707262623220615141716
-1716171e02151406062322263fb20f897b7c78352593c6994f41382a9153
-7dbd5a11b00c73697c6a16162f1b84bf975669c67dcfd9013d1c6b726544
-3d2318253249814e4779281f2b487b6718525c5237231c1d130a2433417c
-5c5a9f57ac00>ArialMT AddT42Char 
-2 0 0 <00020100000005000500000300070000211121112521112101000400fc20
-03c0fc400500fb002004c000>ArialMT AddT42Char 
-ArialMT /CharStrings get begin
-/period 17 def
-/underscore 66 def
-/b 69 def
-/c 70 def
-/g 74 def
-/i 76 def
-/p 83 def
-/r 85 def
-/s 86 def
-end
-ArialMT /Encoding get
-dup 46 /period put
-dup 95 /underscore put
-dup 98 /b put
-dup 99 /c put
-dup 103 /g put
-dup 105 /i put
-dup 112 /p put
-dup 114 /r put
-dup 115 /s put
-pop
-end
-%ADOEndSubsetFont
-/KUDFOP+ArialMT /ArialMT findfont ct_VMDictPut
-/KUDFOP+ArialMT*1 
-[46{/.notdef}rp /period 48{/.notdef}rp /underscore 2{/.notdef}rp /b /c 3{/.notdef}rp 
-/g /.notdef /i 6{/.notdef}rp /p /.notdef /r /s 
-140{/.notdef}rp]
-KUDFOP+ArialMT nf
-KUDFOP+ArialMT*1 [9 0 0 -9 0 0 ]msf
-126 289.76 mo
-(ps_rgb.icc)
-[5.03999 4.563 5.03999 2.99693 5.04001 5.03999 2.52 2.043 4.56299 0 ]xsh
-/KUDFOP+ArialMT*1 uf
-/KUDFOP+ArialMT uf
-/ArialMT uf
-gsave
-132.002 300.002 mo
-160.507 300.002 li
-160.507 331.134 li
-132.002 331.134 li
-cp
-clp
-132 299.753 mo
-160.505 299.753 li
-160.505 331.132 li
-132 331.132 li
-cp
-gsave
-/0 /CSA get_res setcolorspace
-clp
-[1 0 0 -1 0 540 ]ct
-[28.5051 0 0 -31.3783 132 240.247 ]ct
-snap_to_device
-Adobe_AGM_Image/AGMIMG_fl cf /ASCII85Decode fl /RunLengthDecode filter ddf
-<<
-/T 1
-/W 60 
-/H 66 
-/M[60 0 0 -66 0 66 ]
-/BC 8 
-/D[0 1 0 1 0 1 0 1 ]
-/DS [
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-[AGMIMG_fl 60 string /rs cvx /pop cvx] cvx
-]
-/O 3
->>
-%%BeginBinary: 1
-img
-%flh7!!<<(!s&T1!!!$%!T=+c!!3<+!lu0.dt?!<`9$%fuk7!!E?(#U(E=
-,pk#h./>4c-h/Si.4c_h&HDh6quR6.!<<6(!='bn-71,>.etIf.I\ek/L;YS!!*3#!lY-M!6=d%LimX&/=pPq%N95#7V=Y-QE*e!rW-+
-!s8Q+"98K4'Ft?S#mq"I&,?Y0%e1&7#n@@a'`\7:quR-+!c!W3#g
-!7h,\!WiB)"TSQ;*>T2!'+kilq%NQ>nJDEG(_A2@!;cd-!s8Q+"98K6((^i_%L`dWq%!33nIc!;&doj#
-!;Q[%!%g)k6!sJZ*()RPj&JPcd&GZk4'(H\A)&EZ.
-+TMQGr;dE2!s&K-!!3]E$jd=Q$OR:;%/CA0&,-S>'+kKj)#sa@r;mK3!W`B+!!3`G$OI7Q$jmF=$i(8%
-&-ij\#Tjrb!X&B&e,]%>%fub8!:)q%3i@&I]m&!!39$!lb3O!!30)
-!Nd%f$_4'DW@<('bKh&1et)!X&B%%g)k:!:)q%3i@&I]m&!!39$!lY-J!W`H*!WrE:*=`Ji%g!:T%J^V3')<7;
-'aGBg&1et)!X&B%%g)k:!5!pC7!/q%*c?&I]m&!!39$!lY-M
-!W`H*!WrE:*"<8e%M'-[q%3?6q%E`Bq@j/J(D&,@!!39$!=o86"T\].!"TeN#R^tJ$jl_;q$d'/q%!]?
-&ITd#!!&I]m&!!39$!lY-M!W`H*!WrE:)[m&b%1WpXq%*95
-q%EK;"qqda/0Oup!!E0#%g)k:!%M9'm)#sa@qZ730!%1s!n)?9g@r
-%fub8!/&GZt6'*]6a/0Oup"8r62!s/W,!sAT7'+"pQ#mgtFq@!?4q$[!-p^RK?
-$R-Gg!sAE%%0Q\5!rriH#mUhF$4I49$i(5#%0dCQ,8pO`"8r;]!9!nd"TSQ*!"U1]%N#ll#lXuQ&/H*%
-$4I=R()@)Z&J>K\'bq#_'bqJo&e#g*$lKZl$Rm5!!rN'/#6kA6"9ei@)[?EL#RVCI&c_t3!"KMQ"p=r-
-',(QT%1NFC'+kf]#71_^*X;lO$4RLO*uP%\qZ73-"9AQ+!"BeQ#S@LS#lXu3()S#5'+kZP#T3XD%hAgI
-#mgqN)&X1s"To;X*[hI.#Tt#cqZ>:JnGkHI!!N?'!rriS%1Np]%Klb:#8.dj(^C9Z()n.t#7h:R%N-/p
-&/uQ+%0ctO*YTG)'FQ?5!!<'!&dJUF!X&Z.'H78Y!sJrB#o+0WrW!H<%LWRG!u2IQ":YhG#T"6T$4R:Y
-('FgI$OmUP*uP%\qZ6p%"9AQ+!%n]u$4.+K$O$S;#T"%5)turVm6&n`%ooKN'WL&e=R7!UQrs8W)grrg/3-PR!m%gX9r!;cig!!@'F"TnZ(gAh9X
-!s\](0Fo3/%hJ^@*a^'+%LELG!!!*-$3CA8&2Id@NM!2PYHk71ZE[RS+X7U6$Rm5!!Wi0!%0Q_:#Qb\M
-!X&Z5)HY_mrsJbtjNk/l<%8Og$1S!##Rq:M*uP%\quRB2!X/T+!WWZG"UYV8a
-.j,93#Tt#cqZ?`so`,1O$O$V5!WgsS!!<*!%h0?['G:TM!%0?6$4IX\"TAB.#SeC//j=35TrY9oWt);7
-[=AVb)&s8'$Rm5!!rN'*"pG56"pb;H%fuq:!A,Q<*$3'V^f=?#]#Qb)"!"'JR!sB&D#Tjoa"8W'.
-!s&H)!"0GD%L`LA!@IO?!ri5to`#9#-O14t%1`^e)?BX9nGiP*"U+o."9S\Y!!!*!!!$!"&lG"T]&C#Tjoa"8W'.!s&H)!"0bR$j[.E!=/8s!rW#rpAYJY'atoj%1`^e)?BX9nGik1
-"9AT/"T\W(!W2rW!#>_=!sAT7(Bb-V$k`sS&jmfF%M0Zu"9&9="!T3oNMs.cY-P72Z)^t8"U>YX%1`am
-+TMTA!>,P@"T\Z,!YcFT"9JT)!X:sYqYp`icAk?s!Vufp!"8l0)]et^#n."Y)#sd9!XJf0!4!WrK<(Bt!D!5M;!WW3$!#-I]#R(81!nhZq>q67!X&]-%1`LC"UGMB#ljr'`o;pC2\$$%+HIY"U,#5"U5)0%$:Jdp%8:Yp&>!I)u'CC!WrfC
-!!!-)#n."Y)#sd8!XAu4"9ec7%g)_6'F4gE%0d58E]XC("TSN*&HH-tRBR@5\%T\]LbK5B%NHH+&./dL
-*uY.V!posf#hf8,!W`Z4#6k/=&c`1B"UYD;()HrP+oqZD%hSsN'5#1NQ'du)S"Z-g*XrMe&0E#3$OmUQ
--QrHkquIi@!Wi?%!W`uS#R(A7"U5/>%L$M;r:f[LmcWR%r^HP]%0I1U!!!-(#n."Y)#sd8!XAu4"9ec7
-%g)_6#m^Y:()mN';E+mX!"pT-K9`LCZb+&EBGq3d&/uT,&-WCK"s4``qZ>gY!#-!X8W310-It2Ek8cQdaciUnF0HURZ'E!!!`N%1!4E%1`am+TMTA!?_RM#6G#3!u;UR!W`?0%1`[O
-!=aM.h:C-,d`fh\\P*2(!"T/B&I/RK&Jc)f$jI^i!!E'!&H`%8!WWT@":5>:"p+f-"TSl%!#5t`+=K9G
-0bOs,*uk^j!!!?6"s4``qZ?ct`;h^s!!!$"%2T-U$O$b8!!WK)3"ToMS(BX^>!X]AI$O74D0!WsTeBugtd+?Wm)#=4B'GCTS%M9Em#n."Y
-)#sd8!Y>G7!Wi?0&Hi@F"9no."To5+!#6:k+Y5fH+9E5i*#]@h!!!?6"s4``qZ?9feGqK/!>4!WiH1&eYKY"s"Q]"8W'4"9AQ+!"T_F"U+u3"9ei-"p"cL
-pAbp2#S7J0,mY>'%0ZnE$4."G$jIdl!;ciX!94&,!W`H*!WrE:(]t!I!sf&7%L*@R!<>6(?tPA)cJdpA
-bIj7?LFNQ0r>#_Q$j?eC%gaU,!!<'!,Qe)O!:JnGk-B!53!q94!S5I'EJ[V#n.4O#6tD8$47%E
-#7:VT)$'O8`;ghY!qB7
-!qZ7K8!LoJn<"Li"TT5A
-$O[%="UGMF#RU_\*WQ6Cr;ehZ!X/T,"98rF"9er3"p>)6!6!WrE5'*ACA!sJf2!WE'#'+bWG!"o>L%1!"<":#/9#Rq4H#6Z"`!;cis!6>.!
-!W`H*!WrE:(]t!I!sf&7#n$n=$4."J!!KFchV[2NeKG)#!!NK5#mgY7"U>DC#7:VZ*WQ6Cr;d3,!X/T,
-"98rF">'c\"9nu4"U58=!!*'&"rFJo`l5j>^(LJS$k3=E"U,;C#mLG4"UG8M(B=O>qZ7H7!@$j?k=)]/SP!q63@!#,J8"T\Z,!#-=U#RCS?"U5DF"9\r.
-#nd=E8aGQkjns67!!`T-$NgP9#Q=u8#6t>:"XG5k!s8E%(BX^B!)8#Qk/J*<6'P(Ae(I!<<*+
-#R:G3#RCbE"9])?!sJfI)?9m;!oa1[!Ta:q!W`H*!WrE:)?pHQ"UP>:%1NFC#6"o@"oo0ff]hS9.00MW
-!Wrl;"U4i/rWNE0"XYDnqZ.uF!X/T,"98rG"U5,5"pG/1!!WW/!<`N,!#0doeC(*0"9f;>"U>JA"U,#3
-"pXu/!Z`0Zq#Ua'!!##D@#7(G7"pbMA"9]#;"9eoL)?BX9e,]%>
-2Za!`!AbY!X/i5!qZ6j&!()?uS
-"9]JZ"p+]'(]t$P%LE:A!WWH0$3pP2!s8Z."WeQ^!!N6%`;g;J!=!W`9+#m1;6"UH"]!<<<#!X8c.!WrE5(&e@A"9nu4!WiN/,6.]K$O74`('"=8!"feE!!EE,
-"9S`2"p+f+!!NK2)\rGS"oSMA!##D7"T\Z,!#-=U#RCS?"U5,6!Wr<(!XAi9*!-?X!=&`/!<`Z2!!WT1
-#R1;1$4I4L'-.hj!XS`*%0HY8!)2!X/`-!!`lA'.+Lo!!393$3UD4!W`<#!t>J>!s&H*"pk_T&H`(<
-r;sq<,Q[uM!:!!!$%$O[:H!#mCG7!WroE!sTAU*"iGX!Wi0""p=r.!rriHrWN?+"pFo/%KHJ:
-$NU50"98EJ-ia5KrW!T6"U+r.!)B9Cp!s/N%!ri8@!"T,3"T\Z,!#-7P#6k89"U=c+p&k3r
-%g+C&*ZH78,[(Q4=u.N@"TST+"8r61!s/W,!sAT7&d/@A"9o#)"TS`%"TAN$":l;C5"eIA5Y3=D%g;q8"9eT'
-%0Q\5!rriF!sJi1"U##)"RuR)(f!7f927cE.3B*(!!36)r;u!ZirBMi!q$-!K!?(a0q8!!*-)"Te`-"8i01!s/W,!sAT7&-<"q$-!/g_JF"9AQ,o`FU_ec63]!<<0)!!'.P"3"9JW,oE+"Pj8]Sh!WW9*!!3fE!<<3'lMq=o"V)@l
-.2;ma!!NH)o`5I&!rrE+!!<]>!WW?*lMptf"UYPK(`s7j!!!-)!:p7!!!39'!Y#M=!!<;g!"8o3$54:"
-&-;h3"9SYs!n75@!"T)4!!*6(!=ftX$P3jX$k<"?q$IE<%M'-d)BgFD$2so*"U"At$j$M2!X&N*$53gR
-$Ocq?nH]F.$4I=R',_f"T("U"l)!r)g,!rrB*!B&J5Qb%1ERM"Tnc+!r`;p!lY-J!8!!!$$!<<0$
-!q-.#!sJ`+!s8N*!!NK+"U"l1q#gEq#mCG3!!*0&!!<>k!Y,A8!!<9&!WWB+!J,~>
-
-%%EndBinary
-grestore
-np
-grestore
-%ADOBeginSubsetFont: ArialMT Initial
-ct_T42Dict begin
--0.664 -0.324 2 1.004
- 256 array 0 1 255 {1 index exch /.notdef put} for  /ArialMT
-Type42DictBegin
-[<00010000000c000c000c000c4f532f3210325d73000000cc000000606376
-7420a11cd7eb0000012c000006546670676dcc79599a000007800000066e
-676c796607022dca000094e0000822cc68656164d6144b3e00000df00000
-003668686561123315fe00000e2800000024686d7478f65efffb00000e4c
-000034d46c6f6361361cd72000004320000034d86d617870124c05df0000
-77f8000000206e616d659617a74000007818000011057072657025d64dbf
-0000892000000bbe67646972000000000000000000000000000303880190
-00050008059a05330000011b059a0533000003d1006602120805020b0604
-020202020204e0002affc00078430000000900000000544d432000400020
-fffc05d3fe510133073e01b2400001ffffff0000042605bb000000200004
-05ba001905ba001a05a70019042600180000ffe70000ffe80000ffe7fe69
-ffe805ba0019fe69ffe802ea000000b8000000b80000000000a800ad0169
-00ad00bf00c201f0001800af00b900b400c800170044009c007c00940087
-0006005a00c80089005200520005004400940119ffb4002f00a1000300a1
-00cd00170057007e00ba00160118ffe9007f008503d300870085000d0022
-00410050006f008d014cff75005c00df04830037004c006e00700180ff58
-ff8eff92ffa400a500b903c8fffd000b001a0063006300cdffee05d8ffdc
-002d005c0095009900df019209b500400057008000b9039d0072009a035d
-0401ff67fffa00030021007700cd0004004d00cd01c0022b004c006500e7
-0118017c034305d8ffa3ffb0ffc40003001c005d0068009a00ba01350147
-0221055cff4dffcd0016002d00780080009900b200b600b600b800bd00da
-010c05f0ffa4fff00019002c0049007f00b400ce01c003fefd81fe3f0000
-00050018002900390049006f00be00c700d0012301c1026f050c05320540
-057affd4001400310055005700a700b400e601f7027e027e027f03c60446
-ff42000e0085009100bf00c200c500e1011a012f014f01560229026f029e
-03720008002c00310031006400690089009800c700de012b01b6020c02cf
-03a304ab04fb061dfee0ff0e00060026009b009d00c1010d011801200173
-018201d601e30243025f029b02e2039404a904d20761001c005e006d008d
-00ab00f7011201380151015b0168017c01870191019901cd01d001e80241
-0254026b02ef0368037103bd044204420453047304830586058b06e8fe58
-fec4fed1fef7ff32ff860051007c008100910095009e00b400b900cf00d9
-00d900df00e20105010b010e010e012001210155017b017b017e018d01a2
-01a801a901b401d001d001e201e901f201f501fb020002000206021b0221
-022202220223027202770294029c02cf02cf02d002ec02f903170322032b
-0335033c0359036f037103870390039003b503e1041a04cf04ff05320532
-0596059f05a805ab05c205f0060c0782080008ccfca3fd2afddefe00fe88
-fe96feb2feb4ffe100150019001a001c001f003c005100610061006a0078
-009600a500af00d3010c0118011a012a013e014c0151015f016a01710178
-01820184019a01a501a801a901ae01bc01cd01d701ef0200020d021c0221
-0222022e02350242024f024f025e026502710290029202b402d602fa0307
-030b030f0315032a0347035d036503740379039603b003cc03dd03e203f6
-03fc03fc03ff040a041f04220426042b0447045f0475049e04e704e7055c
-05cb05e5060a066d068606b806f10736073e07500751075d078f07b607d4
-086000b600c300b500b700000000000000000000000001e00381034503b5
-008e0233041902ce02ce002d005f0064034d023f000002a80188027d01b4
-02240578063b023b014e00f00426029402c6029f02f6023b034d014b0153
-006a0231000000000000061404aa0000003c04c300ed04bc026502ce03b5
-0078060c017e02ef060c00b201000239000001c50330042b03cb00da03df
-010704a100db040a011701ed02a70350010b01bd043e05580021039c00ae
-0371017d00b5024500000afb088c012b014e01aa00870054013201f803ff
-0003024e00b4003703e30083006b02d800ed00770088009701640467008e
-0033017c00e700a6029e0329056e062a061501c90269048a021301b40002
-04a9000002390124010305140084015d039a06ef02d9007500cf040a00de
-03ac04bc02cf02ae034d04f005520168006d007d00860071ff8100790558
-04d2016700030156002504e00094007c033204210094007f0072005c002f
-00b6001800ba00b80041034d00720018001f004c016a01550099009a009a
-009800b200040078006900140057006e00ce00b4065402b80067050e0165
-00e7000004cbfe52005affa60099ff67006eff92002dffd40087ff7c00b8
-00a800e5008f00a80185fe7b0070001e00d900de014c054602cf0546ff2d
-028a02d90253029600b700000000000000000000000000000125011800ea
-00ea00ae0000003e05bb008a04d70053003fff8cffd50015002800220099
-0062004a00e4006d00ee00e5004803c00033fe4e02b1ff460370007905df
-0051ffa7ff1f010a0068ff6c004f00bc00a507050061072b00ed04b001d2
-00b6007b00650252ff740365fe690094008f005c00400086007500890089
-4043555441403f3e3d3c3b3a3938373534333231302f2e2d2c2b2a292827
-262524232221201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09
-0807060504030201002c4523466020b02660b004262348482d2c45234623
-6120b02661b004262348482d2c45234660b0206120b04660b00426234848
-2d2c4523462361b0206020b02661b02061b004262348482d2c45234660b0
-406120b06660b004262348482d2c4523462361b0406020b02661b04061b0
-04262348482d2c0110203c003c2d2c20452320b0cd442320b8015a515823
-20b08d44235920b0ed51582320b04d44235920b09051582320b00d442359
-21212d2c20204518684420b001602045b04676688a4560442d2c01b10b0a
-432343650a2d2c00b10a0b4323430b2d2c00b0172370b101173e01b01723
-70b10217453ab10200080d2d2c45b01a234445b01923442d2c2045b00325
-456164b050515845441b2121592d2cb00143632362b0002342b00f2b2d2c
-2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b1
-2cc08a8cb8100062602b0c642364615c58b00361592d2c45b0112bb01723
-44b0177ae4182d2c45b0112bb01723442d2cb01243588745b0112bb01723
-44b0177ae41b038a45186920b01723448a8a8720b0a05158b0112bb01723
-44b0177ae41b21b0177ae45959182d2c2d2cb0022546608a46b040618c48
-2d2c4b53205c58b002855958b00185592d2c20b0032545b019234445b01a
-23444565234520b00325606a20b009234223688a6a606120b01a8ab00052
-7921b21a1a40b9ffe0001a45208a54582321b03f1b235961441cb114008a
-5279b31940201945208a54582321b03f1b235961442d2cb110114323430b
-2d2cb10e0f4323430b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2c
-b10e0f432343650b2d2cb11011432343650b2d2c4b525845441b2121592d
-2c0120b003252349b04060b0206320b000525823b002253823b002256538
-008a63381b212121212159012d2c4bb06451584569b00943608a103a1b21
-2121592d2c01b005251023208af500b0016023edec2d2c01b00525102320
-8af500b0016123edec2d2c01b0062510f500edec2d2c20b001600110203c
-003c2d2c20b001610110203c003c2d2cb02b2bb02a2a2d2c00b00743b006
-430b2d2c3eb02a2a2d2c352d2c76b8022323701020b802234520b0005058
-b00161593a2f182d2c21210c6423648bb84000622d2c21b08051580c6423
-648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb815
-55621bb200802f2b59b002602d2c0c6423648bb84000626023212d2cb400
-0100000015b00826b00826b00826b008260f10161345683ab001162d2cb4
-000100000015b00826b00826b00826b008260f1016134568653ab001162d
-2c4b53234b515a5820458a60441b2121592d2c4b545820458a60441b2121
-592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb01343
-58031b02592d2cb0134358021b03592d2c4b54b012435c5a58381b212159
-2d2cb012435c580cb00425b00425060c6423646164b807085158b00425b0
-0425012046b01060482046b0106048590a21211b2121592d2cb012435c58
-0cb00425b00425060c6423646164b807085158b00425b00425012046b8ff
-f060482046b8fff06048590a21211b2121592d2c4b53234b515a58b03a2b
-1b2121592d2c4b53234b515a58b03b2b1b2121592d2c4b53234b515ab012
-435c5a58381b2121592d2c0c8a034b54b00426024b545a8a8a0ab012435c
-5a58381b2121592d2c4b5258b00425b0042549b00425b00425496120b000
-5458212043b0005558b00325b00325b8ffc038b8ffc038591bb040545820
-43b0005458b00225b8ffc038591b2043b0005458b00325b00325b8ffc038
-b8ffc0381bb00325b8ffc03859595959212121212d2c462346608a8a4623
-20468a608a61b8ff8062232010238ab902c202c28a70456020b0005058b0
-0161b8ffba8b1bb0468c59b0106068013a2d2cb1020042b123018851b140
-0188535a58b910000020885458b202010243604259b12401885158b92000
-0040885458b2020202436042b12401885458b2022002436042004b014b52
-58b2020802436042591bb940000080885458b202040243604259b9400000
-8063b80100885458b202080243604259b94000010063b80200885458b202
-100243604259b94000020063b80400885458b20240024360425959595959
-2d2cb0024354584b53234b515a58381b2121591b21212121592d00000001
-00000005028fa58dc35f5f0f3cf5081b080000000000a2e3272a00000000
-c14fd713faaffd671000080c00000009000100010000000000010000073e
-fe4e00431000faaffa7a1000000100000000000000000000000000000d35
-06000100000000000239000002390000023900b002d7005e047300150473
-0049071d0077055600580187005a02aa007c02aa007c031d004004ac0072
-023900aa02aa0041023900ba0239000004730055047300df0473003c0473
-00560473001a047300550473004d047300610473005304730055023900b9
-023900aa04ac007004ac007204ac00700473005a081f006f0556fffd0556
-009605c7006605c7009e055600a204e300a80639006d05c700a4023900bf
-04000037055600960473009606aa009805c7009c063900630556009e0639
-005805c700a10556005c04e3003005c700a105560009078d001905560009
-0556000604e300290239008b023900000239002703c100360473ffe102aa
-00590473004a0473008604000050047300460473004b0239001304730042
-0473008701c7008801c7ffa20400008801c7008306aa0087047300870473
-0044047300870473004802aa00850400003f02390024047300830400001a
-05c700060400000f040000210400002802ac0039021400bc02ac002f04ac
-00570556fffd0556fffd05c70068055600a205c7009c0639006305c700a1
-0473004a0473004a0473004a0473004a0473004a0473004a040000500473
-004b0473004b0473004b0473004b023900bd023900230239ffe502390009
-047300870473004404730044047300440473004404730044047300830473
-0083047300830473008304730049033300800473006b0473001b04730051
-02cd006d044c000104e3009905e5000305e50003080000e102aa00de02aa
-003d0464004e080000010639005305b4009a0464004e0464004d0464004d
-0473fffd049c00a003f4003805b4007a069600a1046400000231000002f6
-002f02ec002d0625007f071d004404e3008104e3009e02aa00e804ac0072
-046400540473002e0464003304e5001a047300860473008c080000ef0556
-fffd0556fffd0639006308000081078d00520473fffc0800000002aa0053
-02aa004701c7008001c7006c0464004e03f4002f04000021055600060156
-fe390473ffe402aa005c02aa005c040000170400001704730049023900b9
-01c7006c02aa0047080000250556fffd055600a20556fffd055600a20556
-00a20239008d0239ffe00239000402390015063900630639006306390063
-05c700a105c700a105c700a1023900c602aa001902aa000602aa001d02aa
-002e02aa00e502aa00a202aa006b02aa003a02aa004b02aa002804730000
-01c700030556005c0400003f04e3002904000028021400bc05c7fffd0473
-004905560006040000210556009e0473008704ac007204ac00a102aa006b
-02aa001902aa002106ac006b06ac006b06ac0021047300000639006d0473
-0042023900b10556005c0400003f05c700660400005005c7006604000050
-04730046046bffe102aa00ee0556fffd0473004a0556fffd0473004a05c7
-009e04eb004705c7fffd055600a20473004b055600a20473004b04730096
-01c7004204730096025500880473009a02ac008305c7009c0473008705c7
-009c04730087063900630473004405c700a102aa008505c700a102aa003c
-0556005c0400003f04e300300239002404e300300300002305c700a10473
-008305c700a10473008304e300290400002804e3002904000028046800a4
-063900600662005504a00048047400480391006204f000440329002e0530
-0048046bffe1040000b002eb005208c000330800004f040000990800004f
-040000990800004f040000980400009807d5016a05c0009e04ab007204d5
-009d04ac007104d5022204d5010505abffe9050001c905ab027e05abffe9
-05ab027e05abffe905ab027e05abffe905abffe905abffe905abffe905ab
-ffe905ab01c005ab027e05ab01c005ab01c005abffe905abffe905abffe9
-05ab027e05ab01c005ab01c005abffe905abffe905abffe905ab027e05ab
-01c005ab01c005abffe905abffe905abffe905abffe905abffe905abffe9
-05abffe905abffe905abffe905abffe905abffe905abffe905abffe905ab
-ffe905abffe905abffe905ab02d605ab006605abffea05d5ffff04d50092
-0800000007eb013007eb012007eb013007eb012004d500b204d5008004d5
-002a082b0198086b01b807550010060000f40600006f0440003a05400037
-04c0003f04150040040000250600005505e100bf038d008904d5ffd90180
-008002d50086071500610296000f04d5009202d6008302d6008304d500b2
-02d600700556fffd0473004a05c700660400005005c70066040000500556
-00a20473004b055600a20473004b055600a20473004b0639006d04730042
-0639006d047300420639006d0473004205c700a40473008705c7001f0473
-00060239ffce0239ffce0239ffe40239ffe40239fff60239fff50239004b
-01c700190400003701c7ffa20556009604000088040000860473009601c7
-fffa05c7009c0473008705c900a50473008b063900630473004406390063
-0473004405c700a102aa006b0556005c0400003f04e300300239000c05c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-078d001905c70006055600060400002101c700890556fffd0473004a0800
-0001071d00440639005304e30081023900b9078d001905c70006078d0019
-05c70006078d001905c70006055600060400002101c7008a02aaffe10473
-001b04cd005a06ac006b06ac002206ac002206ac004a02aa00e202aa006b
-02aa00de02aaffea0557ffff0646ffa706b4ffa80312ffa80632ffa706d8
-ffa70605ffa701c7ff780556fffd055600960558fffe055600a204e30029
-05c700a4023900bf055600960558000b06aa009805c7009c0533006d0639
-006305c700a40556009e04f2009404e30030055600060556000906af007f
-05fb0061023900040556000604a00048039100620473008b01c7006b0460
-0088049a008c04000019038700480473008b0473005c01c7008904000086
-04000018049c00a00400001a0395005c04730044048d008303db00560460
-00880433001105b4007a063f005701c7ffc9046000880473004804600088
-063f0057055700a206eb0032045500a105c000640556005c023900bf0239
-0004040000370875000d081500a406d5003104a900a10515000a05c000a0
-0556fffd054000a705560096045500a1056b0000055600a20763000704d5
-004e05c000a105c000a104a900a10540001206aa009805c700a406390063
-05c000a00556009e05c7006604e300300515000a061500520556000905eb
-009f05550057075500a1078000a106550000071500a8054000a505c00055
-081500a405c7001a0473004a0495005b0440008802eb008804ab00000473
-004b055afffb03ab003204780087047800870380008604ab00180580008c
-046b00880473004404550088047300870400005003aa0026040000210695
-004b0400000f0495008a042b0045066b008d0695008d0500002805c0008b
-042b008404150030060000890455001f0473004b0473000002eb00890415
-004b0400003f01c700880239000901c7ffa2074000130680008304730000
-0380008604000021046b008803e900a1034a008808000041089500a00585
-002d000001010000001e0000003100000031000001010000007e0000007e
-0000008c0000008c000001010000001000000101000001210310007d0000
-008c023300d20000030b0000ff04023900b9048100690456003203310019
-0411002d04d1009601f9009b030f005f04ca009b04b8008c01f9009b0413
-002803b0005003b4003c04ca009b04cf005001f9009b02d2003c0498005a
-043c00190488006e045f007303b1001903d4000a0466009604130028058e
-00640524002803f2009b03f2009b03f2009b01e3005a0356005a0686009b
-01f9ffac041300280413002803b4ff5703b4ff570448002d058e0064058e
-0064058e0064058e00640481006904810069048100690456003203310019
-0411002d04d10096024b0000034a000004b8008c024b00000413002803b0
-005003b4003c04cf005002d2003c0498005a0488006e045f007303d4000a
-0466009604130028058e00640524002801f9009b0456003203b00050045f
-0073049b003c0000ffdc0000ff250000ffdc0000fe51028d00ab028d00a0
-02da0043034d007901a8ffba000000460000004600000046000000460000
-00480000004600000046000000460435017c0435012e043500b704350081
-0435012c043500be043500af043500810435009a043500db04350085028d
-00c1043500b3060001000600010002420036060001000435009e04350098
-043500cb0600010006000100060001000600010006000100000000460600
-010006000100060001000600010006000100060001000600010006000100
-051bffba06000100060001000600010005b5003a05b5003a01f4ffba01f4
-ffba060001000600010006000100060001000481003604350036043dffba
-043dffba03e9004a03e9004a067f0014077600140327ffba041effba067f
-0014077600140327ffba041effba051b003204b500240300fff706000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010000000030
-0000004600000046000000400000004606000100060001000000ffdc0000
-fe510000ff160000ff160000ff160000ff160000ff160000ff160000ff16
-0000ff160000ff160000ffdc0000ff160000ffdc0000ff200000ffdc0473
-004a08000000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010006000100028d
-007f028d005d0600010004ee0015034d007901a8000e01d6ffdc01a80056
-01d60010037500320375003201a8002d01d60013051b003204b5002401f4
-ffba01f4ffba01a8009301d6001305b5003a05b5003a01f4ffba01f4ffba
-024200000300fff705b5003a05b5003a01f4ffba01f4ffba05b5003a05b5
-003a01f4ffba01f4ffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba02b3
-005f02b3005f02b3005f02b3005f03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba08c9003e08c9003e06c5ffba06c5ffba08c9003e08c9003e06c5ffba
-06c5ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7ffba04a7
-ffba04a7ffba045a002a039a00360435ffba0327ffba045a002a039a0036
-0435ffba0327ffba064f0027064f00270224ffba021affba04a7004604a7
-00460224ffba021affba04cf002d04cf002d0327ffba0327ffba040d0047
-040d004701a8ffba01a8ffba02b4002302b400230327ffba0327ffba0435
-00450435004501f4ffba01f4ffba024200360300fff7039affba0327ffba
-0375003203750032051b003204b50024051b003204b5002401f4ffba01f4
-ffba045a004004ce0049045a002604ce0039045a005304ce004a045a0053
-04ce004a0600010006000100000000460000004606000100060001000600
-010000000046000000460600010006000100000000480000004606000100
-060001000600010000000046000000460000004600000046000000400000
-003006000100000000460000004606000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100028d00ca028d00c7028d
-00c606000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100
-06000100060001000100ffba0800ffba1000ffba06dc0063053f004406d5
-00a1055b00830000fddc0000fc2f0000fca60000fe540000fcd70000fd73
-0000fe290000fe0d0000fd110000fc670000fd9d0000fbf50000fc720000
-fed50000fed50000ff02041b00a006ac006b06ac00190000feb60000fd73
-0000fe080000fca60000fe530000fd110000fbc80000faf40000faaf0000
-fc720000fbaa0000fb6a0000fcf10000fc7d0000fbdd0000fcc10000fb98
-0000fdea0000fe840000fdc20000fcf10000fd5f0000fe760000febc0000
-fceb0000fd6c0000fd580000fc900000fd150000fc2c0000fc130000fc12
-0000fb960000fb9601c700880556fffd0473004a0556fffd0473004a0556
-fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473004a
-0556fffd0473004a0556fffd0473004a0556fffd0473004a0556fffd0473
-004a0556fffd0473004a0556fffd0473004a055600a20473004b055600a2
-0473004b055600a20473004b055600a20473004b055600a20473004b0556
-00a20473004b055600a20473004b055600a20473004b0239006301c7001f
-023900ba01c7007c06390063047300440639006304730044063900630473
-004406390063047300440639006304730044063900630473004406390063
-0473004406dc0063053f004406dc0063053f004406dc0063053f004406dc
-0063053f004406dc0063053f004405c700a10473008305c700a104730083
-06d500a1055b008306d500a1055b008306d500a1055b008306d500a1055b
-008306d500a1055b00830556000604000021055600060400002105560006
-040000210556fffd0473004a0239ffe201c7ffb0063900630473004405c7
-00a10473008305c700a10473008305c700a10473008305c700a104730083
-05c700a1047300830000fefe0000fefe0000fefe0000fefe0455fffd02eb
-000c07630007055afffb04a900a10380008604a900a10380008605c700a4
-046b00880473fffd040000140473fffd04000014055600090400000f0555
-0057042b0045055500a10473008706050063047300550639006004730044
-05b5003a01f4ffba0224ffba021affba04a7004601f4009e01f4001001f4
-001b01f4001001f4006b01f4fff90227ffce0000000f0000fff502aa00a4
-02aa00a40000000e00000056000000560000ffcf01a8000f01d6ffbf01a8
-fff501d6ffcd01a8001d01d6fff501a8009301d600130375003203750032
-0375003203750032051b003204b5002405b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba
-01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4
-ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a
-01f4ffba01f4ffba0481003604350036043dffba043dffba048100360435
-0036043dffba043dffba0481003604350036043dffba043dffba04810036
-04350036043dffba043dffba0481003604350036043dffba043dffba0481
-003604350036043dffba043dffba02b3003202b3003202b3005f02b3005f
-02b3005f02b3005f02b3003202b3003202b3005f02b3005f02b3005f02b3
-005f02b3005f02b3005f02b3003802b3003802b3004902b3004903e9004a
-03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9
-004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0692003e0692003e043fffba043f
-ffba0692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba08c9003e08c9003e06c5ffba06c5ffba04a7ffba04a7ffba045a
-002a039a00360435ffba0327ffba064f0027064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba064f0027064f00270224
-ffba021affba064f0027064f00270224ffba021affba064f0027064f0027
-0224ffba021affba04a7004604a7004604a7004604a70046093e0032093e
-00320740ffba0740ffba067f0014077600140327ffba041effba04cf002d
-04cf002d0327ffba0327ffba04cf002d04cf002d0327ffba0327ffba04cf
-002d04cf002d0327ffba0327ffba067f0014077600140327ffba041effba
-067f0014077600140327ffba041effba067f0014077600140327ffba041e
-ffba067f0014077600140327ffba041effba067f0014077600140327ffba
-041effba040d0047040d004701a8ffba01a8ffba040d0047040d004701a8
-ffba01a8ffba040d0047040d004701a8ffba01a8ffba040d0047040d0047
-01a8ffba01a8ffba043500450435004501f4ffba01f4ffba043500450435
-00450435004504350045043500450435004501f4ffba01f4ffba04350045
-043500450481003604350036043dffba043dffba024200360300fff7031a
-001a031a001a031a001a0375003203750032037500320375003203750032
-037500320375003203750032037500320375003203750032037500320375
-0032037500320375003203750032051bffba04b5ffba051b003204b50024
-01f4ffba01f4ffba0375003203750032051b003204b5002401f4ffba01f4
-ffba051b003204b50024067f0045067f0045067f0045067f004501a80028
-0000fe290000fea20000ff300000ff1d0000ff120000ff920000fe7e08fc
-003208ad00320000ffb50000ffb60000feed0000ff640000fe7e0000ff9f
-018d000002f6fffd0000fe820000ff1004cd00320000ff580000ff580000
-ff640692003e0692003e043fffba043fffba08c9003e08c9003e06c5ffba
-06c5ffba045a002a039a00360435ffba0327ffba034d007902b400230242
-003601f4ffba0290ffba01f4002f01f4003b01f4001201f400b101f4006d
-067f00140776001401f9009b0000fed902bc000003f2009b045afff504ce
-fff5045a005304ce004a045a005304ce004a045a005304ce004a045a0053
-04ce004a045a005304ce004a045a005304ce004a04350071043500ad045a
-000f04ce000f0473001406110014054000a7047300860540000a0473000a
-05c7005105c700660400005005c7fffd067a00140540004a047300460474
-00480556006e04d5005304e3ffc40639006d04fe000f070c008701c70083
-0239001f055600960400008801c7001504000018072000a405c7ffb80473
-008b0639006006f200630557004406090014047300860556009e0556006b
-0400004f04f20094030b00440239002404e300140239002404e3003005fb
-006105c700a1062e00140400002104e300290400002804e3002904e30031
-045c0044045c003f0473003c0473005503ab003203e50024047300870214
-00bc034e00bc04ac0072023900b00aaa009e09c7009e08640046087f0096
-06aa0096039c008309c7009c078e009c062b0087047300550556fffd0473
-004a0000fefe0556fffd0473004a08000001071d00440639006d0473001a
-0639006d0473004205560096040000880639006304730044063900630473
-004404e30029045c004c01c7ffa20aaa009e09c7009e086400460639006d
-04730042084600a404f2009e05c7009c047300870556fffd0473004a0556
-fffd0473004a055600a20473004b055600a20473004b0239ff8a0239ff64
-023900040239fff60639006304730044063900630473004405c700a102aa
-ffcc05c700a102aa006805c700a10473007605c700a1047300830556005c
-0400003f04e3003002390024045c0051037e001305c700a40473008705a6
-00a404d6005e0486005e04e30029040000280556fffd0473004a055600a2
-0473004b06390063047300440000fefd0639006304730044063900630473
-004406390063047300440556000604000021047300570473004804730086
-04730086040000130400005004730046047300460473005505e9005503ab
-004903ab0032050d0032040f00440239ffb9047300420473004204780050
-0402001904ef00190473008b047300870473008701c7001901c7008901c7
-0089029e0000026e001401c700830493008306aa008406aa008406aa0087
-0473ffa60473008b046c00870473004406530044063f00570466004402aa
-ffe402aaffe402aaffe402aa008502aa008502aa008502aaffe40455008a
-0455008a0400003f01c7ffa20214ffb901c7ff7202cb00000239000f0239
-002404730019048c0044046000880400001a05c700060400001804280019
-0400002804540028045c004c045c00790400002404000050040000240400
-00500639006304400088040f004904780050046b0088032e000004000008
-033b008804730048040000240400005007b7004607400046080b004605b3
-0024036f002405c00024061c0013054a0083050f008303e2001e04380063
-03110064031100640146ffce01eb006401eb000001eb000002ea006403d9
-0000029100000187005a02d7005e01c7008001c7006c01c7008a02aa00fb
-02aa00fb02ca003202ca003204ac007004ac007004ac006504ac006502aa
-012102aa00de02aa005902aa012102aa001d02aa005902aa00de023900b6
-023900b602aa00fb02aa00fb02aa00a602aa00a602aa00a602aa001d02aa
-ffe202aafffb029400000142006402b8003202a0000002ca003203100096
-0310009603100096031000960310009602aa006202aa006202aa002802aa
-001d02aa0047045700960457009604570096045700960457004304570043
-045700430457004304570043031000430457002f0457002f0457002f0457
-002f0457002f0310002f0457002504570025045700250457002504570025
-0310002f0457001a0457001a0457001a0457001a0457001a0310001a0457
-004204570042045700420457004204570042031000420457009604570096
-045700960457009604570042045700420457004204570042045700420310
-00420457002f0457002f0457002f0457002f0457002f0310002f0457002f
-0457002f0457002f0457002f0457002f0310002f04570026045700260457
-002604570026045700260310002604570042045700420457004204570042
-045700420310004204570096045700960457009604570096045700420457
-004204570042045700420457004203100042045700260457002604570026
-045700260457002603100026045700230457002304570023045700230457
-0023031000230457002f0457002f0457002f0457002f0457002f0310002f
-0457004b0457004b0457004b0457004b0457004b0310004b045700960457
-009604570096045700960457004204570042045700420457004204570042
-031000420457001a0457001a0457001a0457001a0457001a0310001a0457
-002404570024045700240457002404570024031000240457002f0457002f
-0457002f0457002f0457002f0310002f0457004e0457004e0457004e0457
-004e0457004e0310004e045700960457009604570096045700960000fec1
-0000fec60000fdac0000fed80000ff920000fee90000ff4c0000fea00000
-fec40000ffce0000ff660000fea00000fed80000fed80000ff970000ff98
-0000ff990000fff40000ff420000ff420000ff440000ff5f0000fe870000
-ffec0000ffa60000ff510000ff510000ff510000fec90000ff1c00000000
-0000fee90000ff4c0000ff930000ff2a0000ff560000ffce0000fe870000
-febb0000fec40000fec40000fed80000fed80000feb30000fec90000fdad
-0000fdac0000feb30000fec90000fdad0000fe160000fee60000ffa60000
-fe870000ff440000feba0000ff230000ff9a0000fdac0000fe8800000000
-0000feb00000ff980000fe930000ffa60000fe870000fdac0000ff660000
-ff440000feb00000feb00000feb00000ff030000ff520000fd1f0000ff53
-0000ff530000ff530000feb50000feb50000ffc30000feae0000fedc0000
-fec70000fec80000fedc0000fe1e0000ff420000ff510000feb70000feb0
-02aa00de02aa005902aa00fa049a008c04600088062e001407aa0000062e
-0014047b004c063f005704cf0044063900630473004405c7006604000050
-04e300a8033b008804ff0000043c0032060d000a049d0042072000a406aa
-0084056500630473008b056400a40400000a0556006b0556006b04e00005
-04c5001905e5005f046e004403b600140347002804cf00440495005b0400
-005001c7ffa2063900600389004d03890050055600a205c000a10473004b
-047800870ab4006d04fe00100639001404e70014079900bf05b500880558
-000b0400001a072e00bf0590008806a10078057b007a086d00bf06f00088
-04d5006603ab001f065f0039058200480639006004730044066d0009050c
-001a066d0009050c001a0b010063091c004406aa005c04e600440987006d
-06d000500000fe370ab4006d04fe001005c7006604000050040700140000
-fea60000febc0000feaa0000fead0000fc2b0000fc4c05c000a104780087
-05400004042b00140556009e04730087055d00a40464008804d5004e03ab
-003204a900040380000005ef002904490028070900a4052f0088091800a0
-06f6008806060066042b005005c700660400005004e3003003aa00260767
-00310587002605550057042b004506e4000a0554000a06e4000a0554000a
-023900bf07630007055afffb055700a1046800860540001204ab001805c7
-00a4046b008805c700a4046b008805550057042b004506aa00980580008c
-02aa002e0556fffd0473004a0556fffd0473004a08000001071d00440556
-00a20473004b060500630473005507630007055afffb04d5004e03ab0032
-04d5004e045c004c05c000a10478008705c000a104780087063900630473
-0044063900600473004405c0004a0415002b0515000a040000210515000a
-040000210515000a0400002105550057042b0045071500a805c0008b0540
-004a0473004607bf004a0703004607a6006606860053054d006604130053
-07c3001207470018084600a4070700880639006d0478005005f900300553
-00260000ff430000fec90000ff770000ffb00000ff470000ff560000ff74
-0000fed70000feac000000000000ff520000ff56000000000000feac0000
-fd9a000000000000ff6a0000ff7c0000ff690000ff560000feac0000ff7f
-0000ff560000fdef0000ff430000ff690000ff7c000000000000fdae0000
-ff8c000001020000fefe0000fefe0000fedf0000fedf0000ff580000ff20
-0000fefe0556fffd0473004a055600960473008605560096047300860556
-00960473008605c700660400005005c7009e0473004605c7009e04730046
-05c7009e0473004605c7009e0473004605c7009e04730046055600a20473
-004b055600a20473004b055600a20473004b055600a20473004b055600a2
-0473004b04e300a8023900130639006d0473004205c700a40473008705c7
-00a40473008705c700a40473008705c700930473006805c700a404730087
-0239ffdf01c7ff9202390020023900060556009604000088055600960400
-008805560096040000880473009601c7007e0473009601c7ffb904730096
-01c7ffa50473009601c7ffa306aa009806aa008706aa009806aa008706aa
-009806aa008705c7009c0473008705c7009c0473008705c7009c04730087
-05c7009c0473008706390063047300440639006304730044063900630473
-004406390063047300440556009e047300870556009e0473008705c700a1
-02aa008505c700a102aa008505c700a102aa005e05c700a102aa00260556
-005c0400003f0556005c0400003f0556005c0400003f0556005c0400003f
-0556005c0400003f04e300300239002404e300300239002404e300300239
-ffff04e300300239000e05c700a10473008305c700a10473008305c700a1
-0473008305c700a10473008305c700a104730083055600090400001a0556
-00090400001a078d001905c70006078d001905c70006055600090400000f
-055600090400000f055600060400002104e300290400002804e300290400
-002804e3002904000028047300870239000305c70006040000210473004a
-01c7008904a0004804a0004804a0004804a0004804a0004804a0004804a0
-004804a000480556fffd0556fffd06820013068200130682001306820013
-068200560682005603910062039100620391006203910062039100620391
-0062061e0000061e0000076c0000076c0000076c0000076c00000473008b
-0473008b0473008b0473008b0473008b0473008b0473008b0473008b068f
-0000068f0000081f0000081f0000081f0000081f0000081ffff3081ffff3
-01c7008101c7008101c7ff9b01c7ff9b01c7ffeb01c7ffeb01c7ffa201c7
-ffa20301000003010000049100000491000004910000049100000491fff3
-0491fff3047300440473004404730044047300440473004404730044069d
-0000069d0000082d0000082d000007c9000007c900000460008804600088
-0460008804600088046000880460008804600088046000880682000007ae
-00000812000007ae0006063f0057063f0057063f0057063f0057063f0057
-063f0057063f0057063f0057065f0000065f000007ef000007ef0000078b
-0000078b0000078bffff078bffff04a0004804a000480391006203910062
-0473008b0473008b01c7ffe601c700680473004404730044046000880460
-0088063f0057063f005704a0004804a0004804a0004804a0004804a00048
-04a0004804a0004804a000480556fffd0556fffd06820013068200130682
-00130682001306820056068200560473008b0473008b0473008b0473008b
-0473008b0473008b0473008b0473008b068f0000068f0000081f0000081f
-0000081f0000081f0000081ffff3081ffff3063f0057063f0057063f0057
-063f0057063f0057063f0057063f0057063f0057065f0000065f000007ef
-000007ef0000078b0000078b0000078bffff078bffff04a0004804a00048
-04a0004804a0004804a0004804a0004804a000480556fffd0556fffd0556
-fffd0556fffd0556fffd02aa00e502aa00fd02aa00e502aa000602aa0006
-0473008b0473008b0473008b0473008b0473008b068200000682000006f3
-000006f3000005c700a402aa001302aa001302aa000601c7ffbb01c7ffab
-01c7ffca01c7ffca01c7ff9301c7ff930239001a0239fff5036500000365
-000002aa001302aa001302aa000604600088046000880460008804600088
-048d0083048d00830460008804600088055600060556000606e600000718
-0000061e000002aaffea02aaffea02aa0059063f0057063f0057063f0057
-063f0057063f005707650000069d000007270000065f000005fb006102aa
-00de02aa00e50473000d05c7006605c7006606aa008705c70024095000a1
-078d00190556001f04e30030080000290400003004c100660000ff530000
-ff530000ff530000ff5301c7001901c7ffa2042b00050556001105740046
-02cbffa3057a008702f0ffc8057f000a057f000a02aa008402aa008402aa
-00c902aa00c902aa00a002aa005902aaffaf02aa003a02aa0006023900b9
-02aa00a902aa00a902aa00a902aa00a9032e001e032e001e02aa003a0000
-ff730000ffa50000fed80000ff230000ff720000ff720000fee70000ffa5
-0000ff530000ff530000ff530556009e0473008703f8001905fb0019071d
-00440440001904000050046900870469001903eb008703ab003201c70088
-0361004104000088033600100580008c04780087047300440400001304de
-004404de004404de000d078d005003a800440473004404730044042b0084
-0455001f0455001f03aa00260460008804c6004405de004404c600440400
-001a05c700060400002803ab0032036b003f04db001f02eb00880400001a
-04550088042b008405b4007a04ab001803a00000054f0000035100320351
-ffd103980032034800320348003203f80032036e0032015600690284002d
-0366003202d000320415003203710032036f003204180032030f00320359
-0032039c003203760031036f003204fb000002fa003202fa003203040032
-04cc0032030500640305003202f9003202f90032028c0032028c00320304
-00320142006402b6006404950064030f00640305003202d5003203050032
-030500320306006401c20032030f00640342003204950064029200000320
-00000315006402920000030600320385003202bf00000142006401eb0064
-030f0064029200000315006402920000030900320385003202bf000005ed
-00460a660046061300460689ffba0541ffba01e9003c045a00110000ff0d
-0000ff350000fece0000feb70000fec90000ffcf0000ff4f0000ff9e0000
-feca02b3005f02b3005f03e9004a03e9004a039affba0327ffba039affba
-0327ffba05ad0069053d002d05fd009604dc005004e0003c05f6009b053f
-00280650002804ac00720000fe3b0000fe660000fe660473fffc02aa0053
-02d5ffce01a8ffba01a8ffba01a8ffba01a8ffba0658001509c500470400
-000008000000040000000800000002ab0000020000000155000004730000
-02390000019a000000ab00000000000005e5000305c7006606aa00980580
-008c0744008307180046071800480556fffd05c70066040000140473000a
-04e300300400004f0400002804a5001d000001020000ff420000febf0000
-ff3a0000ff53048d000a05c7005105c7006605c70051045500a102eb0088
-0000ff430000ff040000ffac02d200960000ff37021affba0250001e0000
-ff3a0000ff5b0000ff5f0000ff7e0000ff940000ff4a0000fe9c05b5003a
-05b5003a01f4ff9601f4ff9605b5003a05b5003a01f4ffba01f4ffba05b5
-003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4ffba
-05b5003a05b5003a01f4ffba01f4ffba05b5003a05b5003a01f4ffba01f4
-ffba05b5003a05b5003a01f4ffba01f4ffba0481003604350036043dffba
-043dffba0481003604350036043dffba043dffba02b3003202b3003202b3
-005f02b3005f03e9004a03e9004a0692003e0692003e043fffba043fffba
-045a002a039a00360435ffba0327ffba045a002a039a00360435ffba0327
-ffba045a002a039a00360435ffba0327ffba064f0027064f00270224ffba
-021affba064f0027064f00270224ffba021affba067f0014077600140327
-ffba041effba067f0014077600140327ffba041effba067f001407760014
-0327ffba041effba02b4002302b400230327ffba0327ffba02b4002302b4
-00230327ffba0327ffba043500450435004501f4ffba01f4ffba04350045
-0435004501f4ffba01f4ffba043500450435004501f4ffba01f4ffba040d
-0047040d004701a8ffba01a8ffba03e9004a03e9004a03e9004a03e9004a
-0692003e0692003e043fffba043fffba0473ff93047300460239ffbf06aa
-ffd50473ffb70473ff9102aaffa402aaffa40400ffff0239ffb904000028
-04730089030b0064047400480649002401c7001901c700190473001e0460
-001e048c000a04730086047300460239001305b400420400008801c7fffc
-06aa00870473008b0473008702aafffb0400003f0318ffa20400001a0400
-000f040000280473004a04730048047300460473004b03ab004903ab0032
-0534005501c700880400001301c7ffa204730083045c004c0304006402d5
-003202c9003302fc0032028c003201d5003201d500000304003203110064
-01420019014200640142006401420019022a000001420064014200090233
-00640493006404930064030fffc9030f0064030e00640305003203000032
-02b800320142ffca01c20032030f001d031a00320306006402d400640292
-000002de003202de003202de003202f4003202ea00320000febc0000febc
-0000ff730000fea9023900b902fa003202f900320305003202a0000002f9
-00320639006d0556fffd0473000f05c7006602aa004104a0004804a00048
-04a0004804a0004804a0004804a0004804a0004804a0004801c7ff9b01c7
-ffab01c7ff9b01c7ffab01c7ff9b01c7ffbb01c7ff9b01c7ffbb04600088
-0460008804600088046000880460008804600088046000880460008801c7
-ffab01c7ffab01c7ffbb01c7ffbb04600088046000880460008804600088
-045a005304ce004a03a000130556001105c700290558000b055600a20473
-004b0400003301c7ffa205e600630473004805c7000002aa000f05560006
-0400002104000013040000500400001301c700830455fffd02eb00010556
-00090400000f055600090400000f04d5005303ab00490540001204ab0018
-0000fec60000fed40000fec60000fed40000fe5f0000fe5f0000ff720000
-ff730000fee7078b000a03eb004c040000130473000a01c700150473fff4
-0556001105c700a1047300190239ff8b05c700a404730087055600960400
-008804e30029040000280400003b049e00a403670088053000480000ff53
-0000ffbc0000fefe0000fefe0000fea40000fea401c70088000000000000
-002a0000002a0000002a0000002a000000d60000017e00000320000005a6
-0000074e000009380000097e000009fe00000aa400000b8400000bec0000
-0c6400000caa00000ce600000d5600000f1200000fee00001218000013f2
-000015520000170c000018e20000198e00001c2200001e5600001eb20000
-1f7000001ff200002062000020e8000021da000023da000025840000271c
-000028560000299e00002a6200002b1800002ca800002dae00002e920000
-2f7a000031b00000323a000035640000370e000038420000394800003b3c
-00003da800004052000041000000422400004398000045d6000048e20000
-4a8800004bc800004c3200004c9c00004d0000004d8800004dbc00004e38
-0000510a000052e80000549c000056500000580e0000596200005b520000
-5cf600005dea00005f020000619a00006296000064c60000668c0000684e
-00006a1200006ba800006cae000070560000717a00007318000075360000
-79a000007bc400007e1c00008004000081020000814e00008250000082f0
-0000833c00008370000083ac000083ee000084540000849a000084ce0000
-85040000853a0000858a000085cc0000861e00008656000086a8000086de
-0000871e000087600000879e000087e800008828000088560000888e0000
-88de00008914000089540000898e000089d200008a1c00008a5800008a88
-00008acc00008b0400008b9400008c1a00008e2800008fbc0000916c0000
-91b80000924c00009470000096c4000098b4000099a000009a2200009a8c
-00009baa00009d0600009f4e0000a0b00000a13e0000a1e80000a2ac0000
-a3f40000a59e0000a68c0000a7520000a7b60000a8240000a94e0000aa72
-0000ab020000ace40000af3e0000b2900000b3860000b42c0000b47c0000
-b5320000b6520000b7f00000b88a0000b94e0000ba0e0000ba760000bab2
-0000bb0a0000bb580000bd700000bfb60000bfee0000c0200000c14a0000
-c2760000c3240000c3c80000c46a0000c53c0000c5900000c5c60000c61e
-0000c7700000c7e20000c83c0000c9b40000cb200000cc000000cc320000
-ccce0000cdf20000d0680000d0a20000d0e60000d1220000d1840000d1c6
-0000d20c0000d2580000d28a0000d2de0000d31c0000d34c0000d38a0000
-d3d00000d4120000d4500000d4d20000d5400000d6260000d6620000d6e2
-0000d7160000d7b80000d8400000d8ac0000d90e0000d97a0000da660000
-db580000db8c0000dbc00000dbf00000dc340000dcac0000de260000e040
-0000e0720000e0ac0000e1a60000e3340000e36a0000e4ce0000e54a0000
-e62a0000e7200000e8b00000ea1a0000ec080000ed040000ed4a0000ed7e
-0000edc00000edfa0000ee4e0000ee960000eee00000ef100000ef400000
-f1280000f1660000f18e0000f1be0000f1f20000f2180000f23e0000f286
-0000f43c0000f5b60000f5dc0000f6020000f6460000f6760000f6a60000
-f6fc0000f7da0000f8ec0000f9300000f9660000f9c00000f9fe0000fa32
-0000fa620000fa9e0000fade0000fb1c0000fb580000fb9a0000fbd00000
-fc0c0000fc4c0000fc720000fc960000fce60000fe420000fe980000fecc
-0000ff1a0000ff660000ffa80000ffe0000100160001005e000101000001
-029c00010464000105e6000107d80001092a00010aae00010b9000010d2a
-00010d9400010dbc00010e5a000110dc0001111c0001115c0001119c0001
-11da000112380001129600011304000113240001140e000114ae000114e4
-000115320001157c000115c6000115e2000115fe0001161e0001163e0001
-165e0001167e000116a4000116ca000116f000011716000117460001176e
-00011796000117c2000117ee000118220001184c00011878000118ae0001
-18d8000119040001193a000119640001198e000119c2000119f200011a26
-00011a6a00011a9a00011ace00011b1000011b4400011b7600011bb80001
-1bec00011c1c00011c5e00011ca200011ce800011d4400011d6000011d7c
-00011d9800011db400011dd000011f3e000121ea0001245a000124760001
-2490000124ac000124c8000124e4000125000001255c0001259600012600
-000126ca0001276a00012840000128c000012948000129b800012a4e0001
-2aac00012af200012b5000012bb200012c6a00012d2800012d5400012db0
-00012df400012f60000130540001307e0001309a000130c6000130fe0001
-314a0001318a000131be000131ee0001321e0001324e00013292000132c2
-000132f2000133320001336200013392000133c200013402000134320001
-346200013492000134b8000136bc000136ec0001371c0001386c00013a22
-00013a5200013a8000013ab000013ade00013b0e00013b3c00013b600001
-3b8400013bb400013d2400013d5c00013d8c00013f1e00013f4c00013f7a
-00013fa800013fd00001412e000142c6000142fe0001433e0001437a0001
-43aa000143d8000143f4000144240001445400014544000146ac000146dc
-000147160001475600014786000147b6000147f80001481e000148440001
-4884000148c4000148f40001493400014a1e00014a9e00014b8200014bb2
-00014be200014c1200014c4200014c7e00014cb000014ce200014d120001
-4d4200014d8800014dba00014dea00014e2000014e9200014ec600015094
-000151960001532600015556000157a6000159380001599c00015a260001
-5a3600015ac400015cc200015dee00015f5a0001604a000161ce000163e8
-000166140001670600016716000167260001683e0001684e0001685e0001
-686e0001687e0001688e000169ac000169bc000169cc00016a4000016a50
-00016b2000016b3000016c4200016c5200016c6200016c7200016dd00001
-6fae00016ff0000170260001705c0001708c000170bc0001711000017138
-000172c20001740a0001755e000176c60001784a000178ae00017a400001
-7b5c00017b6c00017b7c00017d0200017d1200017e7800017fd200018106
-00018264000183d200018598000185d800018610000186460001866c0001
-869c000186c200018838000188680001899e000189ae000189be00018a00
-00018a1000018ba400018d5000018eda00018f0200018f320001908e0001
-909e000191d6000191e600019280000193e0000193f000019656000197e0
-000199480001997800019aee00019c2000019c3000019c4000019c500001
-9d2a00019d3a00019d4a00019d5a00019e5200019fcc00019fdc0001a104
-0001a2380001a38a0001a51e0001a63c0001a7c80001a8da0001a9100001
-ab460001abe60001abf60001ad8c0001af2e0001afb20001b1340001b144
-0001b3ac0001b52c0001b6ac0001b6dc0001b87c0001ba020001bbc60001
-bcf20001bd020001be320001be420001be520001bf120001bf220001c108
-0001c1180001c24e0001c35c0001c5080001c6be0001c8000001c9700001
-cab80001cb0a0001ccec0001ce680001cea60001d04c0001d0700001d1b0
-0001d1c00001d1d00001d2080001d2180001d3a40001d50c0001d6800001
-d6a40001d6d40001d8420001d8f40001d9b20001d9e00001db960001dc8e
-0001dd1c0001de420001def00001dfc40001e00e0001e0860001e1460001
-e16e0001e1b20001e2080001e2e40001e32e0001e3620001e38a0001e3b2
-0001e3e60001e42a0001e46e0001e4ac0001e5ea0001e6a20001e7c20001
-e8380001e9060001e9580001e9ea0001ea9a0001eb8e0001ebe20001ec78
-0001ed360001ee200001eed20001eff20001f0440001f0ee0001f2240001
-f2fc0001f3e20001f4e80001f5ce0001f6b00001f7a40001f8420001f948
-0001fa420001faba0001fb320001fba80001fbde0001fc3a0001fd020001
-fd8e0001fdc60001fe0c0001fe3c0001fea60001ff660001ff9a0001ffca
-0001fffe0002002e0002005e0002008e0002022e00020266000202a60002
-02de00020316000203b2000204ac000204dc00020580000205ae000205ee
-0002063e0002066e000206ba00020852000209b800020b1800020b5e0002
-0bb200020bea00020d5c00020d9200020e2400020e6200020e9000020ece
-00020ffe0002102600021162000211f20002129c0002131e000213da0002
-14f20002160000021634000216ba0002181600021898000218e2000219ec
-00021a3400021b3800021bb400021c0c00021c9000021d7a00021e900002
-1f8c0002203600022126000221f8000222e2000223ca0002247a000224fc
-0002275a00022784000227ae0002286600022890000229d200022ad80002
-2bc200022bec00022c1600022c4000022c6a00022c9400022e1400022e3e
-00022e6800022e9200022ebc00022ee600022f1000022f3a00022f640002
-2f9800022fc200022fec0002301600023190000231a0000232ba000232ca
-000232f40002331e00023348000233720002351c00023738000238660002
-3876000239f200023a0200023b4800023d1400023e1a00023f9a0002413a
-0002435e000244b80002469a000247de0002490c000249fa00024a240002
-4a4e00024a7800024aa200024acc00024af600024b2000024b4a00024b74
-00024b9e00024bc800024bf200024c1c00024c4600024c7000024eac0002
-50280002516c000253540002549c000254c6000254f00002552000025550
-000255a0000255f000025630000256a2000256f600025754000257aa0002
-57e00002582200025868000258b2000258e20002591a0002594a00025a82
-00025dc800025df200025e1c00025e4600025e7000025e9a00025ec40002
-5eee00025f1800025f4200025f6c00025f9600025fc000025fea00026014
-0002603e0002606800026092000260bc000260e6000261100002613a0002
-61640002618e000261b8000261e20002620c0002623600026260000262fe
-000263140002633e0002661e0002662e000267480002686a000269a80002
-6aea00026c9000026ca000026de200026f3200027122000272f60002740e
-0002741e000274a00002752e0002762e0002763e000276de000276ee0002
-78040002795600027a8600027a9600027b6400027b7400027cea00027cfa
-00027e0e00027e1e00027f52000280e8000281a4000281b4000282b20002
-840c00028498000284a8000285d20002875e0002881a0002882a000288c6
-000288d6000289a4000289b400028a8c00028a9c00028ba400028bb40002
-8d7a00028d8a00028ee200028ef20002915c0002916c0002936600029376
-000294e0000294f0000295e0000295f00002978800029798000298b60002
-98c600029a0600029a1600029a2600029a3600029bae00029bbe00029bce
-00029bde00029d3000029e7e00029f4c0002a0300002a1b00002a3320002
-a4320002a5460002a68a0002a69a0002a7880002a8620002a9fe0002aa0e
-0002ab2c0002ac320002ae300002ae400002ae500002ae600002afaa0002
-afba0002b0720002b0820002b1900002b1a00002b28c0002b29c0002b3ba
-0002b3ca0002b4680002b4780002b4880002b5760002b6ea0002b8160002
-b9100002b9200002b9300002b9400002bade0002bc980002bd660002bd76
-0002bfd60002c21c0002c4a20002c7060002c98a0002cbfc0002cdcc0002
-cf820002cfac0002cfd60002cfe60002cff60002d0200002d04a0002d074
-0002d0840002d0940002d0be0002d0e80002d0f80002d1080002d1320002
-d15c0002d1860002d1960002d1a60002d1b60002d1c60002d1d60002d1e6
-0002d2100002d2200002d2300002d25a0002d2840002d2ae0002d2d80002
-d3020002d32c0002d3560002d3800002d3aa0002d3d40002d3fe0002d428
-0002d4520002d47c0002d4a60002d4d00002d4fa0002d5240002d54e0002
-d5780002d5a20002d5cc0002d5f60002d6200002d64a0002d6740002d69e
-0002d6c80002d6f20002d71c0002d7460002d7700002d79a0002d7c40002
-d7ee0002d8180002d8420002d86c0002d8960002d8c00002d8ea0002d914
-0002d93e0002d9680002d9920002d9bc0002d9e60002da100002da3a0002
-da640002da8e0002dab80002dae20002db0c0002dbac0002dbf00002dc66
-0002dc900002dcba0002dce40002dd0e0002dd380002dd620002dd8c0002
-ddb60002dde00002de0a0002de340002de5e0002de880002deb20002dedc
-0002df060002df300002df5a0002df840002dfae0002dfd80002e0020002
-e02c0002e0560002e08a0002e0be0002e0f20002e2840002e4200002e5bc
-0002e7480002e78e0002e7d40002e8420002e89e0002e8f00002e9600002
-ea380002eb040002ebdc0002eca80002ed480002ee620002ef160002ef98
-0002eff20002f0320002f1500002f29a0002f4320002f48e0002f4ec0002
-f5480002f5a40002f6580002f70e0002f7ba0002f8660002f9120002f9ca
-0002fa820002fb3a0002fb4c0002fb5e0002fb700002fb820002fb940002
-fc020002fc700002fd280002fd3a0002fd4c0002fd5e0002fd6e0002fd80
-0002fd920002fda40002fdb60002fdc80002fdda0002fe880002ff340002
-ffe20003008e00030126000301600003018a000301b4000302080003025a
-000302d6000303200003039c000303f000030474000304c60003053c0003
-0594000305fa00030650000306aa0003072800030774000307d200030836
-00030884000308d20003092a000309720003099c000309ca000309f00003
-0a2400030a5400030a8400030ad600030b4400030b9a00030c0e00030c62
-00030cd600030d1c00030d8400030dca00030e2600030e5600030e900003
-0eb600030ee600030f0c00030f3200030f6400030f9400030fe60003104c
-000310a2000311080003115c000311ca0003120c0003126c000312ae0003
-12fa0003133400031370000313aa000313e60003141a0003144c0003147c
-000314ac000314d6000314fc00031526000315540003157e000315ca0003
-160e0003164400031680000316b4000316e200031720000317500003178a
-000317b4000317e2000318080003182e0003185a000318b6000318e60003
-1916000319460003197e000319b2000319e000031a1000031a4000031a70
-00031aa000031ad400031b2a00031b5e00031bbe00031bf200031c4a0003
-1c7e00031cda00031d7800031e4600031f660003202e000320be00032154
-000323400003253c000326b400032830000329da00032b8c00032c740003
-2daa00032ea200032fb4000330d20003320800033372000334e000033676
-000337f2000339020003391200033a3e00033b7a00033cbc00033e400003
-3f1a00033f9000034046000340ec0003425c000342940003430e000343d0
-0003448a000344f2000345f80003472e000347fa00034958000349d20003
-4a4c00034b1800034bd200034c8600034ce200034d3c00034d8400034df4
-00034e7000034eba00034ef400034f3a00034f7e00034fd0000350220003
-50a40003512600035168000351a8000351de000352140003524200035270
-000352a4000352d80003531a0003535c00035398000353d40003540e0003
-54480003547a000354ac000354de000355100003554a00035584000355c6
-000356080003564a0003568c000356da000357280003576a000357ac0003
-57ec0003582c00035866000358a0000358ec0003593800035976000359b6
-000359fc00035a4200035a7e00035ad400035b1000035b4c00035b8c0003
-5bcc00035c0800035c4400035c8400035cc400035d0800035d4c00035da0
-00035e2e00035e7000035eb200035f1a00035f8200035fb400035fe60003
-601e00036056000360ec00036182000361cc00036216000362520003628e
-000362e40003633a00036384000363ce000364260003647e000364be0003
-64fe000365360003656e000365b800036602000366400003667e000366c0
-0003670200036756000367aa000367f0000368360003687c000368c20003
-69180003696e000369c400036a1a00036a6600036ab200036afe00036b4a
-00036bbe00036c3200036ca600036d1a00036d5800036d9600036dd40003
-6e1200036e5000036e8e00036ed200036f1600036f6200036fae0003700e
-0003705a00037098000370e6000371f60003724600037296000372ce0003
-73060003735c000373b2000374260003748a000374cc0003750e00037564
-000375b2000375fe0003764a0003768a000376ca000377120003775a0003
-77c6000378200003785800037890000378d000037910000379e000037adc
-00037b9c00037c8a00037ce000037d3600037d8800037ddc00037e400003
-7ea400037efa00037f5000037fc60003803c0003807e000380c000038102
-0003814400038186000381c80003821e00038274000382c60003831a0003
-83a200038424000384c400038566000385a4000385e2000386200003865c
-0003869a000386d80003871600038752000388360003892200038a380003
-8b5400038c1e00038ce800038de200038edc00038fda000390d8000391f6
-000393140003943a000395600003966200039764000397f6000398880003
-98c6000399040003995e000399b8000399f000039a2800039b3800039b48
-00039b9000039bd800039c3000039c8800039cba00039cec00039d2e0003
-9d7000039daa00039de400039e2800039e6c00039ee400039f5e00039fee
-0003a0320003a0720003a0f40003a1760003a2ce0003a2de0003a32c0003
-a37a0003a3b60003a3f20003a4380003a47e0003a4cc0003a51a0003a56a
-0003a5ba0003a6160003a6720003a7e80003a9500003a9880003a9c20003
-aa0e0003aa5a0003aaac0003aafe0003ab500003aba60003abe20003ac1e
-0003ac740003acc80003ae000003aea00003aeee0003af2e0003af680003
-b0fe0003b3820003b4460003b5dc0003b73a0003b8080003b9ae0003bc02
-0003be3a0003be800003beb20003bf5c0003c0800003c0a40003c13e0003
-c24a0003c35a0003c46a0003c5780003c6fe0003c7300003c7d20003c7fa
-0003c85c0003c8be0003c9200003c9820003c9c00003c9fe0003ca380003
-ca720003ca9e0003caea0003cb240003cb5e0003ccba0003ce0e0003ce1e
-0003cedc0003d0120003d0700003d1880003d3160003d3bc0003d5020003
-d5400003d57e0003d5bc0003d6100003d6380003d6920003d6f60003d73e
-0003d7a00003d8000003d8720003d8ee0003d96a0003d9ec0003da780003
-db040003db8e0003dc0e0003dc480003dc840003dde80003deb20003dee2
-0003df120003e04a0003e19a0003e1aa0003e2980003e36c0003e4640003
-e55a0003e6dc0003e8360003e8460003e95e0003ea0a0003eb4c0003eca2
-0003ecfe0003ee5c0003eeea0003f0900003f2020003f3160003f34e0003
-f3b20003f5620003f6cc0003f72e0003f8960003f99c0003fa520003fafe
-0003fc260003fd140003fdf40003ff34000400600004017a000402ea0004
-046400040474000405540004064a000406fa000407f6000408a2000409ac
-00040a9800040bc200040ce600040dea00040f1800041056000411c20004
-12f80004148c000416340004172c000418400004197200041a6400041a9c
-00041af200041ba000041bb000041c1200041c6e00041cd400041d200004
-1d6000041d9800041dc400041df200041e2c00041f6200041f960004201a
-000420d00004210000042184000421b4000421ec00042384000425100004
-255a00042594000425ea000426360004265c00042682000426c400042706
-0004274800042778000427b0000427e60004281c0004285e0004288e0004
-28be000429b400042ab800042aec00042b2400042b6a00042b9e00042bce
-00042c0600042c3a00042c6e00042c9e00042cce00042d0400042d3a0004
-2d6a00042d9a00042dce00042e0200042e3200042e6200042e9c00042ed0
-00042f0200042f3400042f6800042f9c00042fcc00042ffc0004302a0004
-305800043166000432d2000434060004353a0004356a000435a40004363e
-000437a800043904000439c800043adc00043b0c00043b4000043c380004
-3de800043e4000043eb800043ff400044032000440a4000440d400044104
-0004413e000441c6000441f600044226000443b6000445000004460c0004
-471a000448460004499c00044af800044c5800044d9200044f0400045064
-000450740004522a00045352000453ec0004557400045584000456800004
-58060004595e00045a1000045ae000045bec00045c9600045cce00045cde
-00045d8e00045e3400045eb000046000000460f4000461ea000462f60004
-63ce000464a80004653c0004664e000467de000468fc000469f200046a9c
-00046b4600046c1000046cb800046d8e00046e0a00046e6600046fc80004
-70fc000472980004735a0004745a00047532000476700004771c000477e6
-000478d6000479fc00047ad800047bde00047d1600047e0600047ea40004
-7f960004810600048250000484bc0004858e000486420004871000048804
-000489420004895200048a8600048b9800048ba800048cb400048de40004
-8e3800048fac000490d4000491e80004939a000495ae00049842000499fc
-00049b2800049d0800049eca0004a05c0004a1280004a2c40004a33a0004
-a3e80004a4c40004a5500004a5f20004a6940004a7780004a8b00004ab0c
-0004ac540004ac640004ac740004acd60004ad340004ad960004ae340004
-aecc0004afd00004b0be0004b0ce0004b0de0004b1780004b2120004b24e
-0004b2ca0004b33e0004b3940004b3c80004b44e0004b4da0004b5520004
-b5b00004b64a0004b6dc0004b75c0004b7de0004b8720004b8a60004b908
-0004b9ba0004bb800004bbb80004bd940004bea80004beb80004beee0004
-bf320004bf760004bfba0004bff00004c0220004c0640004c1000004c156
-0004c1fc0004c2740004c2fa0004c36a0004c3cc0004c4520004c4b20004
-c51c0004c5900004c6000004c65e0004c7040004c79c0004c8080004c898
-0004c8f60004c9640004ca0c0004cab80004cb4e0004cbb80004cc3a0004
-cc9e0004cd4a0004ce020004ceae0004cf3c0004cf980004d0040004d05a
-0004d0dc0004d15a0004d1e00004d26c0004d2c60004d3320004d3a20004
-d4120004d4820004d5060004d5960004d5fc0004d6760004d6f20004d76a
-0004d8100004d8ac0004d93c0004d99a0004da380004dab40004db460004
-dbe80004dc920004dd2a0004dd860004dddc0004de440004deea0004df92
-0004e05c0004e1020004e1640004e1bc0004e21c0004e2aa0004e3300004
-e3be0004e41e0004e4820004e4ec0004e5540004e5bc0004e63a0004e6c2
-0004e7560004e7c20004e82a0004e88e0004e9360004e9f00004ea9e0004
-eb2c0004eb8a0004ebf60004ec660004ed0c0004edb60004ee780004ef1a
-0004ef7e0004f00e0004f0800004f1100004f18e0004f20a0004f2760004
-f3040004f3600004f3be0004f4440004f4c00004f5280004f58c0004f5e0
-0004f64e0004f6b60004f7340004f7aa0004f8240004f8a40004f9000004
-f9660004f9ca0004fa6a0004fb0c0004fbc20004fc720004fcce0004fd46
-0004fda40004fe2e0004fec60004ff560004ffbc0005001a000500a80005
-011a000501ae00050246000502b6000503260005039e000503fc0005045c
-000504d60005053000050590000505ea00050646000506ae0005073c0005
-0772000507aa0005083600050860000508a20005093600050a2400050ab4
-00050aea00050b3a00050bac00050c5800050cea00050d4200050d9c0005
-0df400050e4e00050ed200050f5800050ffc000510a4000510e200051152
-000511e60005127e00051314000513be000513f000051440000514940005
-14da0005157e000516080005168e000516ee000517320005178000051820
-000518b000051950000519f600051a9c00051b6000051b9200051bbc0005
-1c4200051cf200051d2400051d4c00051e1a00051e7800051f1200051f60
-00051fc60005206e000520dc00052142000521ce00052240000522b60005
-236a000523c40005243400052470000524c200052548000525a80005264c
-0005272c00052854000529e400052a4000052a9600052dbc00052e560005
-2eb200052efa00053068000531ba000532000005330e000533a6000534b4
-000535be0005366000053748000537da000538760005396800053a680005
-3ae400053b6a00053bb200053d2400053e8000053f6400053fb400053fe8
-000540d6000541fe00054398000544c8000545de000547120005482e0005
-489c0005493000054a7000054b2600054c9000054dc000054ef20005501e
-000550ca0005519000055262000553bc0005553c0005566c000557880005
-594200055a9400055b8000055c5c00055d1e00055e8800055fd800055fe8
-00055ff800056008000560c000056176000561b2000561e8000562200005
-6256000563e2000565f6000566e0000567f80005697000056ade00056bc8
-00056cfa00056e4200056fc800057166000572ba000574a80005766e0005
-78a400057af200057bda00057cb600057dfe00057f800005806800058182
-000581c40005820e0005842a000586420005878e0005890400058b620005
-8d6400058de800058e1800058e6400058f2c00058ffc0005919000059218
-00059280000592c0000592fe000594b0000596e000059816000599f80005
-9ad400059bee00059d9a00059fa60005a0a80005a1940005a3860005a58e
-0005a6fa0005a87e0005a9de0005ab4c0005abda0005ac6a0005ad840005
-ae900005b0520005b1be0005b3ae0005b5780005b60c0005b6a80005b73e
-0005b7c60005b8ac0005b9840005bb1e0005bcb00005bcd60005bcfc0005
-bd0c0005bd3c0005bd6c0005bee60005c0880005c1320005c2140005c2d4
-0005c37e0005c4180005c4fa0005c5b80005c6940005c84a0005c9840005
-ca100005ca400005ca700005caa40005cad80005cae80005caf80005cb28
-0005cb580005cb8c0005cbc00005cbf40005cc280005cc5c0005cc900005
-ce0a0005ce1a0005ce4a0005ce7a0005ceb20005cee60005cf1a0005cf4e
-0005cf820005cfb60005cfea0005d0220005d0580005d0880005d0c80005
-d1000005d1480005d18e0005d1c20005d1f60005d2300005d2680005d308
-0005d3180005d46a0005d6320005d7d80005d9820005dace0005dbe40005
-dcf20005de080005df020005dfea0005e10c0005e2080005e2e00005e3d0
-0005e48c0005e53e0005e6080005e67a0005e7200005e7b00005e8140005
-e9220005e9880005ea360005eb2c0005eb940005ebfc0005ecac0005ee86
-0005ef8a0005f00a0005f0480005f0f40005f1820005f26a0005f3020005
-f3680005f4660005f5280005f5e20005f6200005f6b00005f7b20005f846
-0005f88a0005f9a80005fad20005fcb40005fe760005ffac000600da0006
-01da000602020006022a0006026000060292000602be000602e60006030e
-0006033c0006039a000604080006044000060478000604a8000604ce0006
-0502000605380006055e00060584000605b2000605e00006060c00060682
-000606aa0006070c00060732000607580006077e000607a4000607d40006
-0804000608340006086e0006089e000608d400060904000609360006095c
-00060982000609b6000609ec00060a1c00060a4c00060a7200060a980006
-0abe00060aec00060b2000060ba600060bea00060c2400060c5800060c9c
-00060cd600060d1000060d3600060d6000060dac00060dee00060e140006
-0e4200060e6800060e8e00060ece00060f0000060f3000060f6000060f86
-00060fac00060fdc0006100c00061032000610580006107e000610a40006
-10ca000610f000061118000611a0000611ca0006123e00061266000612dc
-000613040006136600061398000613ca000613fa00061432000614640006
-1492000614cc000614f40006155400061596000615c6000615f200061622
-000616520006167a000616a2000616ca0006172c00061754000617b20006
-17f60006183a0006186a000618a0000618c6000618ee000619140006193c
-000619620006198a000619b2000619dc00061a0200061a2800061a4e0006
-1a8000061aa800061b2e00061b5800061bc200061bf200061c2200061c48
-00061c6e00061cc600061cf600061d3200061d5c00061d8c00061dbc0006
-1df000061e2400061e5400061e9400061ece00061f1600061f3c00061f62
-00061f8800061fae00061fd4000620140006205400062090000620c00006
-20f0000621200006215000062188000621c000062200000622400006227a
-000622b4000622f00006232e00062378000623c2000624080006244e0006
-2490000624d20006250200062532000625660006259a000625d40006260e
-0006265a000626a6000626fe00062756000627ae0006280c0006283c0006
-286c000628a2000628d80006290e0006294a0006297e000629b200062a06
-00062a5a00062aae00062b0200062b5600062baa00062c0200062c5a0006
-2c8800062cb600062ce800062d1a00062d6000062da600062dd800062e0a
-00062e5c00062eb400062ef800062f3c00062f8000062fc4000630180006
-306c0006309c000630cc000631020006313800063176000631bc00063210
-0006325a000632ac000632fe0006335e000633be000633ee000634200006
-345a00063494000634e60006353a00063584000635cc0006360e00063678
-000636c6000637120006374400063776000637aa000637de000638140006
-384a00063888000638be000638f00006392c00063982000639d800063a36
-00063a9400063aea00063b4000063b7400063ba400063be800063c1e0006
-3c4e00063c9200063cd000063d0800063d4000063d7600063db200063de2
-00063e1e00063e5e00063ea400063eee00063f3a00063f8600063fdc0006
-403200064080000640ce0006411c0006416c000641c8000642240006427c
-000642d4000643280006437c000643be0006440000064448000644900006
-44d8000645260006456a000645ae000646140006467a000646e000064746
-000647ac000648120006487c000648e60006492e00064976000649be0006
-4a0600064a5200064a9e00064af200064b3e00064b8200064bd000064c38
-00064ca000064d1000064d8000064de800064e5000064e9000064ece0006
-4f1800064f4200064f8800064fc00006500e0006503e0006506e000650aa
-000650de000651040006515800065196000651ea000652d0000653f80006
-543a00065460000654b6000654e60006552800065570000655be00065608
-000656580006567e000657660006584a0006599c000659ca000659f80006
-5a8c00065b1200065b4000065bca00065bfa00065c2a00065c7800065cc6
-00065daa00065e8600065fca00065ffa0006602a000660c0000661480006
-6178000661a8000661d80006626800066298000662c80006631a00066362
-000663b80006644e000664e60006655a000665ac000665d60006662c0006
-6660000666aa000666e20006673200066770000667bc000667e20006685e
-000668b0000669c200066bcc00066d8000066f0200067074000673160006
-75e6000677a6000678ec00067b4600067c8800067e9e00067ef000067f40
-00067f9600067fec0006804e000680d600068324000684b6000686c20006
-87de0006899200068b1400068bd400068cb600068d1e00068d8000068df6
-00068e5e00068f0a00068f7a0006900a0006911e000691e20006922e0006
-92c40006937000069414000694be000695080006954a000695c000069628
-000696b800069766000697d0000698340006989a00069954000699ea0006
-9a4800069a7200069a9c00069aac00069abc00069b7e00069c8200069e8c
-00069fe200069ff20006a0a20006a1860006a1e60006a1f60006a2520006
-a2b00006a3d00006a4be0006a4ce0006a4de0006a4ee0006a4fe0006a5e4
-0006a6e40006a8bc0006aa780006ab7e0006abf80006ac720006ad240006
-ad340006ae420006ae520006ae620006af240006b0580006b1440006b154
-0006b1640006b1740006b2da0006b4460006b5720006b5820006b5920006
-b5a20006b5b20006b6940006b6a40006b8060006b9100006ba0e0006bb46
-0006bc180006bc960006bd140006be340006beb00006befc0006bf880006
-c09c0006c0f00006c2320006c2f20006c3be0006c4b40006c5be0006c670
-0006c7d60006c83c0006c9000006cb020006cc900006ce0e0006cf3e0006
-d1f00006d3320006d4600006d5d80006d7500006d8d00006da5e0006dc10
-0006dc7e0006dde20006df1a0006e01e0006e1540006e2860006e3560006
-e4260006e5820006e65c0006e6fc0006e8000006e92a0006ea280006eba8
-0006ed120006ee500006efc80006f1140006f1f60006f25e0006f3000006
-f3a00006f49e0006f6060006f7400006f8d40006fa1e0006fb020006fb60
-0006fc660006fcfc0006fdbe0006fe640006fea400070050000701220007
-01e800070310000704b0000705bc00070614000707ac0007083a0007084c
-0007087c000708ac000708e40007091c000709520007098e000709c40007
-0a0000070b6e00070bb800070c5200070cea00070d6400070de800070e4e
-00070efa00070f46000710660007111c000711f20007122a000712680007
-12dc000713d6000714f4000715f6000716380007167a000716e8000716f8
-000717080007171800071728000717380007174800071758000717680007
-17780007178800071798000717980007191c0007192c000719ec00071ab2
-00071be800071dde00071fe0000721dc00072412000726120007267e0007
-27900007292200072a7a00072b2c00072b7000072c0e00072d3e00072d8e
-00072e2400072f6000072f70000731260007325a000732aa000733000007
-33c20007340600073448000734ce0007352c0007361e000736ac000736e2
-0007375c000737d4000738240007393000073a2600073ad000073afa0007
-3b2400073b4e00073b7800073bb800073bf800073c3000073c6800073cb2
-00073cfc00073d3c00073d7c00073dc600073e1000073e5000073e900007
-3eea00073f4400073f7e00073fb800073ffc0007404000074084000740c8
-0007411c00074170000741bc00074208000742460007428a000742da0007
-432a00074384000743e20007440c00074436000744d00007456a000745ae
-000745f2000747080007471800074760000747a8000747fa0007484c0007
-48b60007490a00074956000749b400074a3e00074aa200074ae600074b30
-00074b9800074be200074c2200074c6a00074ca600074ce200074d1e0007
-4d5800074d9a00074ddc00074e1c00074e5c00074ea600074ef000074f46
-00074f9e00074fec0007503a0007507c000750ca0007510c000751560007
-5198000751dc0007523800075294000752e00007532c00075376000753c0
-000753fe0007543c000754ba0007553800075572000755ac000756460007
-56e0000757b400075888000758e400075940000759b400075a2800075b86
-00075b9600075c8000075c9000075cc600075cfc00075d3600075d700007
-5dac00075de800075e2e00075e7400075fda00076190000762dc0007649a
-00076610000767b8000768e8000769ee00076c0c00076d5000076ee60007
-706e000770ec0007723000077438000774cc00077560000776b4000777de
-0007795800077a9800077c0400077cf200077ebc00078050000780d20007
-8204000782ee0007845600078538000786ee000787e00007894200078a7e
-00078b7200078d3600078ebe00079062000791c600079362000795200007
-96a600079742000798b6000799a800079a9000079c1000079d6200079e82
-0007a01a0007a1f00007a37e0007a4280007a4de0007a6900007a7340007
-a7c20007a80e0007a85a0007a8d20007a9b00007aa2a0007aacc0007ab20
-0007ac840007adb00007aec20007afc40007b08c0007b2000007b3400007
-b5660007b6100007b73a0007b83e0007b9de0007baca0007bbc40007bcc2
-0007bda80007bec20007c07c0007c22a0007c3980007c4100007c4840007
-c5a20007c6260007c7280007c8b40007ca2c0007cb620007cc6c0007cde2
-0007cf5a0007d14c0007d33a0007d5000007d5740007d6240007d6da0007
-d78a0007d8480007d9420007da460007db400007dc4c0007dcd40007dd62
-0007ddea0007de7e0007df5a0007e0500007e1340007e22a0007e2be0007
-e37a0007e40e0007e4cc0007e5bc0007e6c40007e7c20007e8d60007e9f8
-0007eb0c0007ec4c0007ed860007eea80007efbc0007f1000007f2540007
-f4680007f61a0007f6ce0007f7ea0007f8c00007f9de0007fabc0007fc50
-0007fd0a0007fda60007fe980007ff800008006c000800ea000801e40008
-03220008044e00080482000804c6000804d600080576000806180008070e
-000807fa000808d4000809ac00080b0a00080c6a00080d0800080d9e0008
-0ddc00080e1c00080e5a00080e9a00080ef400080f4c00080fa60008100a
-0008109600081292000812e20008140e0008149400081514000815ee0008
-16c2000817c6000819b200081aca00081b3a00081bca00081c8c00081d5e
-00081dca00081e4800081f9c00081fe2000820280008210c000821480008
-21a6000821e4000822160008225a0008229c000822cc000100000d3500f2
-003c009d000700020010002f005600000468041d0005000200>
-<0000003a02be0000000300000000006a00000000000300000001000a006a
-0000000300000002000e00740000000300000003005e0082000000030000
-0004000a00e00000000300000005001800ea0000000300000006000e0102
-000000030000000700ba01100000000300000008003001ca000000030000
-0009008a01fa000000030000000d02aa028400010000000000000035052e
-000100000000000100050563000100000000000200070568000100000000
-0003002f056f00010000000000040005059e0001000000000005000c05a3
-0001000000000006000705af0001000000000007005d05b6000100000000
-00080018061300010000000000090045062b000100000000000d01550670
-0003000104030002000c07c50003000104050002001007d1000300010406
-0002000c07e10003000104070002001007ed0003000104080002001007fd
-0003000104090000006a080d0003000104090001000a0877000300010409
-0002000e08810003000104090003005e088f0003000104090004000a08ed
-0003000104090005001808f70003000104090006000e090f000300010409
-000700ba091d0003000104090008003009d70003000104090009008a0a07
-000300010409000d02aa0a9100030001040a0002000c0d3b00030001040b
-000200100d4700030001040c0002000c0d5700030001040e0002000c0d63
-0003000104100002000e0d6f000300010413000200120d7d000300010414
-0002000c0d8f000300010415000200100d9b0003000104160002000c0dab
-0003000104190002000e0db700030001041b000200100dc500030001041d
-0002000c0dd500030001041f0002000c0de10003000104240002000e0ded
-00030001042a0002000e0dfb00030001042d0002000e0e0900030001080a
-0002000c0e170003000108160002000c0e23000300010c0a0002000c0e2f
-000300010c0c0002000c0e3b00a900200032003000300036002000540068
-00650020004d006f006e006f007400790070006500200043006f00720070
-006f0072006100740069006f006e002e00200041006c006c002000520069
-0067006800740073002000520065007300650072007600650064002e0041
-007200690061006c0052006500670075006c00610072004d006f006e006f
-0074007900700065003a0041007200690061006c00200052006500670075
-006c00610072003a00560065007200730069006f006e00200035002e0030
-003100200028004d006900630072006f0073006f00660074002900410072
-00690061006c00560065007200730069006f006e00200035002e00300031
-0041007200690061006c004d00540041007200690061006c002000690073
-00200061002000740072006100640065006d00610072006b0020006f0066
-00200054006800650020004d006f006e006f007400790070006500200043
-006f00720070006f0072006100740069006f006e00200069006e00200074
-0068006500200055006e0069007400650064002000530074006100740065
-007300200061006e0064002f006f00720020006f00740068006500720020
-0063006f0075006e00740072006900650073002e0054006800650020004d
-006f006e006f007400790070006500200043006f00720070006f00720061
-00740069006f006e004d006f006e006f0074007900700065002000540079
-00700065002000440072006100770069006e00670020004f006600660069
-006300650020002d00200052006f00620069006e0020004e006900630068
-006f006c00610073002c0020005000610074007200690063006900610020
-005300610075006e0064006500720073002000310039003800320059006f
-00750020006d006100790020007500730065002000740068006900730020
-0066006f006e007400200074006f00200064006900730070006c00610079
-00200061006e00640020007000720069006e007400200063006f006e0074
-0065006e00740020006100730020007000650072006d0069007400740065
-006400200062007900200074006800650020006c006900630065006e0073
-00650020007400650072006d007300200066006f00720020007400680065
-002000700072006f006400750063007400200069006e0020007700680069
-006300680020007400680069007300200066006f006e0074002000690073
-00200069006e0063006c0075006400650064002e00200059006f00750020
-006d006100790020006f006e006c0079002000280069002900200065006d
-0062006500640020007400680069007300200066006f006e007400200069
-006e00200063006f006e00740065006e0074002000610073002000700065
-0072006d0069007400740065006400200062007900200074006800650020
-0065006d00620065006400640069006e0067002000720065007300740072
-0069006300740069006f006e007300200069006e0063006c007500640065
-006400200069006e0020007400680069007300200066006f006e0074003b
-00200061006e006400200028006900690029002000740065006d0070006f
-0072006100720069006c007900200064006f0077006e006c006f00610064
-0020007400680069007300200066006f006e007400200074006f00200061
-0020007000720069006e0074006500720020006f00720020006f00740068
-006500720020006f00750074007000750074002000640065007600690063
-006500200074006f002000680065006c00700020007000720069006e0074
-00200063006f006e00740065006e0074002ea9203230303620546865204d
-6f6e6f7479706520436f72706f726174696f6e2e20416c6c205269676874
-732052657365727665642e417269616c526567756c61724d6f6e6f747970
-653a417269616c20526567756c61723a56657273696f6e20352e30312028
-4d6963726f736f667429417269616c56657273696f6e20352e3031417269
-616c4d54417269616c20697320612074726164656d61726b206f66205468
-65204d6f6e6f7479706520436f72706f726174696f6e20696e2074686520
-556e697465642053746174657320616e642f6f72206f7468657220636f75
-6e74726965732e546865204d6f6e6f7479706520436f72706f726174696f
-6e4d6f6e6f7479706520547970652044726177696e67204f666669636520
-2d20526f62696e204e6963686f6c61732c20506174726963696120536175
-6e646572732031393832596f75206d617920757365207468697320666f6e
-7420746f20646973706c617920616e64207072696e7420636f6e74656e74
-206173207065726d697474656420627920746865206c6963656e73652074
-65726d7320666f72207468652070726f6475637420696e20776869636820
-7468697320666f6e7420697320696e636c756465642e20596f75206d6179
-206f6e6c792028692920656d626564207468697320666f6e7420696e2063
-6f6e74656e74206173207065726d69747465642062792074686520656d62
-656464696e67207265737472696374696f6e7320696e636c756465642069
-6e207468697320666f6e743b20616e6420286969292074656d706f726172
-696c7920646f776e6c6f6164207468697320666f6e7420746f2061207072
-696e746572206f72206f74686572206f7574707574206465766963652074
-6f2068656c70207072696e7420636f6e74656e742e004e006f0072006d00
-61006c006f00620079010d0065006a006e00e9006e006f0072006d006100
-6c005300740061006e0064006100720064039a03b103bd03bf03bd03b903
-ba03ac00a90020003200300030003600200054006800650020004d006f00
-6e006f007400790070006500200043006f00720070006f00720061007400
-69006f006e002e00200041006c006c002000520069006700680074007300
-2000520065007300650072007600650064002e0041007200690061006c00
-52006500670075006c00610072004d006f006e006f007400790070006500
-3a0041007200690061006c00200052006500670075006c00610072003a00
-560065007200730069006f006e00200035002e0030003100200028004d00
-6900630072006f0073006f0066007400290041007200690061006c005600
-65007200730069006f006e00200035002e00300031004100720069006100
-6c004d00540041007200690061006c002000690073002000610020007400
-72006100640065006d00610072006b0020006f0066002000540068006500
-20004d006f006e006f007400790070006500200043006f00720070006f00
-72006100740069006f006e00200069006e00200074006800650020005500
-6e0069007400650064002000530074006100740065007300200061006e00
-64002f006f00720020006f007400680065007200200063006f0075006e00
-740072006900650073002e0054006800650020004d006f006e006f007400
-790070006500200043006f00720070006f0072006100740069006f006e00
-4d006f006e006f0074007900700065002000540079007000650020004400
-72006100770069006e00670020004f006600660069006300650020002d00
-200052006f00620069006e0020004e006900630068006f006c0061007300
-2c0020005000610074007200690063006900610020005300610075006e00
-64006500720073002000310039003800320059006f00750020006d006100
-7900200075007300650020007400680069007300200066006f006e007400
-200074006f00200064006900730070006c0061007900200061006e006400
-20007000720069006e007400200063006f006e00740065006e0074002000
-6100730020007000650072006d0069007400740065006400200062007900
-200074006800650020006c006900630065006e0073006500200074006500
-72006d007300200066006f00720020007400680065002000700072006f00
-6400750063007400200069006e0020007700680069006300680020007400
-680069007300200066006f006e007400200069007300200069006e006300
-6c0075006400650064002e00200059006f00750020006d00610079002000
-6f006e006c0079002000280069002900200065006d006200650064002000
-7400680069007300200066006f006e007400200069006e00200063006f00
-6e00740065006e00740020006100730020007000650072006d0069007400
-7400650064002000620079002000740068006500200065006d0062006500
-6400640069006e0067002000720065007300740072006900630074006900
-6f006e007300200069006e0063006c007500640065006400200069006e00
-20007400680069007300200066006f006e0074003b00200061006e006400
-200028006900690029002000740065006d0070006f007200610072006900
-6c007900200064006f0077006e006c006f00610064002000740068006900
-7300200066006f006e007400200074006f00200061002000700072006900
-6e0074006500720020006f00720020006f00740068006500720020006f00
-750074007000750074002000640065007600690063006500200074006f00
-2000680065006c00700020007000720069006e007400200063006f006e00
-740065006e0074002e004e006f0072006d0061006c004e006f0072006d00
-610061006c0069004e006f0072006d0061006c004e006f0072006d00e100
-6c004e006f0072006d0061006c0065005300740061006e00640061006100
-720064004e006f0072006d0061006c004e006f0072006d0061006c006e00
-79004e006f0072006d0061006c041e0431044b0447043d044b0439004e00
-6f0072006d00e1006c006e0065004e006f0072006d0061006c004e006f00
-72006d0061006c004e0061007600610064006e006f0074006801b001a103
-00006e00670041007200720075006e00740061004e006f0072006d006100
-6c004e006f0072006d0061006c004e006f0072006d0061006c004e006f00
-72006d0061006c000000b900540328b326181fd0bc032900e00329000203
-29b22b1d1fb90327031db23b1f40b80323b31215320f412d03200001002f
-0320000100200320006f032000af032000bf03200004005f031e00010010
-031e007f031e0080031e00af031e00bf031e00d0031e00060000031e0010
-031e0020031e006f031e009f031e00e0031e0006031d031cb2201f104127
-0319007f03190002000f031700ef031700ff03170003001f0317002f0317
-004f0317005f0317008f0317009f03170006000f0317005f0317006f0317
-007f031700bf031700f00317000600400317b2923340b80317b28b3340b8
-0317b36a6c3240b80317b2613340b80317b35c5d3240b80317b357593240
-b80317b34d513240b80317b344493240b80317b23a3340b80317b3313432
-40b80317b32e423240b80317b3272c3240b80317b312253280b80317b30a
-0d32c04116031600d00316000200700316000102c4000f0101001f00a003
-1500b0031500020306000f0101001f00400312b32426329fbf0304000103
-0203010064001fffc00301b20d1132410a02ff02ef0012001f02ee02ed00
-64001fffc002edb30e11329f414a02e200af02e200bf02e2000302e202e2
-02e102e1007f02e00001001002e0003f02e0009f02e000bf02e000cf02e0
-00ef02e0000602e002e002df02df02de02de000f02dd002f02dd003f02dd
-005f02dd009f02dd00bf02dd00ef02dd000702dd02dd001002dc00010000
-02dc0001001002dc003f02dc000202dc02dc001002db000102db02db000f
-02da000102da02daffc002d3b2373932b9ffc002d3b22b2f32b9ffc002d3
-b21f2532b9ffc002d3b2171b32b9ffc002d3b2121632b802d2b2f9291fb9
-0326031cb23b1f40bb0322003e00330322b225311fb80318b23c691fb802
-e3b3202b1fa0413002d400b002d40002000002d4001002d4002002d40050
-02d4006002d4007002d40006006002d6007002d6008002d6009002d600a0
-02d600b002d60006000002d6001002d6002002ca002002cc002002d60030
-02d6004002d6005002d6000802d0b2202b1fb802cfb226421f411602ce02
-c70017001f02cd02c80017001f02cc02c60017001f02cb02c50017001f02
-c902c5001e001f02ca02c6b21e1f00410b02c6000002c7001002c6001002
-c7002f02c5000502c1b324121fff411102bf0001001f02bf002f02bf003f
-02bf004f02bf005f02bf008f02bf000602bf0222b2641f12410b02bb00ca
-0800001f02b200e90800001f02a600a20800406a1f402643493240204349
-3240263a3d3240203a3d329f209f26024026969932402096993240268e92
-3240208e92324026848c324020848c3240267a813240207a813240266c76
-3240206c76324026646a324020646a3240265a5f3240205a5f3240264f54
-3240204f5432b8029eb724271f374f6b0120410f02770030027700400277
-00500277000402770277027700f90400001f029bb22a2a1fb8029a402b29
-2a1f80ba0180bc0180520180a201806501807e01808101803c01805e0180
-2b01801c01801e0180400180bb0138000100800140b40180400180bb0138
-00010080013940180180ca0180ad01807301802601802501802401802001
-3740b80221b2493340b80221b2453340b80221b341423240b80221b33d3e
-320f410f0221003f0221007f0221000300bf022100cf022100ff02210003
-00400221b320223240b80221b3191e3240b80222b32a3f3240b80221b32e
-3a326f414802c3007f02c3008f02c300df02c30004002f02c3006002c300
-cf02c30003000f02c3003f02c3005f02c300c002c300ef02c300ff02c300
-0600df02220001008f02220001000f0222002f0222003f0222005f022200
-7f022200ef0222000600bf022100ef02210002006f0221007f022100af02
-210003002f0221003f0221004f0221000302c302c3022202220221022140
-1d101c102b1048038f1c010f1e014f1eff1e023700161600000012110811
-b8010db6f70df8f70d00094109028e028f001d001f0290028f001d001f02
-8fb2f91d1fb80198b226bb1f41150197001e0401001f013900260125001f
-013800730401001f0135001c0801001f0134001c02ab001f0132b21c561f
-b8010fb2262c1fba010e001e0401b61ff91ce41fe91cb80201b61fe81cbb
-1fd720b80401b21fd51cb802abb61fd41c891fc92fb80801b21fbc26b801
-01b21fba20b80201b61fb91c381fadcab80401b21f8126b8019ab21f7e26
-b8019ab61f7d1c471f6b1cb80401b21f6526b8019ab21f5e73b80401400f
-1f52265a1f481c891f441c621f4073b80801b61f3f1c5e1f3c26b8019ab2
-1f351cb80401b61f301cbb1f2b1cb80401b61f2a1c561f291cb80101b21f
-231eb80401b21f5537b80168402c07960758074f07360732072c0721071f
-071d071b071408120810080e080c080a080808060804080208000814b8ff
-e0402b000001001406100000010006040000010004100000010010020000
-01000200000001000002010802004a00b013034b024b5342014bb0c06300
-4b6220b0f65323b8010a515ab005234201b0124b004b5442b0382b4bb807
-ff52b0372b4bb007505b58b101018e59b0382bb00288b801005458b801ff
-b101018e851bb0124358b900010111858d1bb900010128858d5959001816
-763f183f123e113946443e113946443e113946443e113946443e11394660
-443e11394660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b2b
-182b1db0964b5358b0aa1d59b0324b5358b0ff1d594bb09353205c58b901
-f201f04544b901f101f045445958b9033e01f2455258b901f2033e445959
-4bb8015653205c58b9002001f14544b9002601f145445958b9081e002045
-5258b90020081e4459594bb8019a53205c58b9002501f24544b9002401f2
-45445958b909090025455258b9002509094459594bb8040153205c58b173
-244544b1242445445958b917200073455258b9007317204459594bb80401
-53205c58b1ca254544b1252545445958b9168000ca455258b900ca168044
-59594bb03e53205c58b11c1c4544b11e1c45445958b9011a001c455258b9
-001c011a4459594bb05653205c58b11c1c4544b12f1c45445958b9018900
-1c455258b9001c01894459594bb8030153205c58b11c1c4544b11c1c4544
-5958b90de0001c455258b9001c0de04459592b2b2b2b2b2b2b2b2b2b2b2b
-2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b65
-422b2b01b33b59635c456523456023456560234560b08b766818b0806220
-20b163594565234520b003266062636820b003266165b059236544b06323
-4420b13b5c4565234520b003266062636820b003266165b05c236544b03b
-2344b1005c455458b15c406544b23b403b4523614459b347503437456523
-456023456560234560b089766818b080622020b134504565234520b00326
-6062636820b003266165b050236544b034234420b147374565234520b003
-266062636820b003266165b037236544b0472344b10037455458b1374065
-44b24740474523614459004b5342014b5058b108004259435c58b1080042
-59b3020b0a124358601b2159421610703eb0124358b93b21187e1bba0400
-01a8000b2b59b00c2342b00d2342b0124358b92d412d411bba0400040000
-0b2b59b00e2342b00f2342b0124358b9187e3b211bba01a80400000b2b59
-b0102342b0112342002b7475737500184569444569444569447373737374
-757374752b2b2b2b74752b2b2b2b2b737373737373737373737373737373
-737373737373737373732b2b2b45b0406144737400004bb02a534bb03f51
-5a58b1070745b040604459004bb03a534bb03f515a58b10b0b45b8ffc060
-4459004bb02e534bb03a515a58b1030345b040604459004bb02e534bb03c
-515a58b1090945b8ffc06044592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
-2b752b2b2b2b2b2b2b435c58b9008002bbb301401e017400735903b01e4b
-5402b0124b545ab012435c5a58ba009f02220001007359002b7473012b01
-732b2b2b2b2b2b2b2b737373732b2b2b2b2b002b2b2b2b2b2b0045694473
-456944734569447374754569447345694445694445694473744569444569
-44732b2b2b2b2b732b002b732b74752b2b2b2b2b2b2b2b2b2b2b2b2b2b73
-7475732b7374757374752b2b2b742b2b000000>
-[15785 15901 16277 16325 16277 16273 15933 16169 16277 15721 16361 15561 15973
-16029 16305 15693 16345 16249 15893 15629 16365 15481 16245 16249 16357 16337
-15821 15749 16345 15937 16257 16033 19077 ] AllocGlyphStorage
-]def 
-124 60 
-PrepFor2015
-Type42DictEnd
-2 3242 17 <000100ba0000018700cd000300254018023c000a023c5f006f007f00af00
-04a0000100a004a198182b10f65d5ded003fed313033353315bacdcdcd00
->ArialMT AddT42Char 
-2 12858 48 <000100980000060f05ba001002e4b10202435458b90008fff6400b0c0c02
-55080e0d11025502b8ffeeb40d11025505b8ffee40280d1102550c120c0c
-0255050f0c030900010208090b0e000809020a0b06101002550b100d0d02
-550bb8fffab60c0c02550b1000b8ffe6b41010025500b8fff8b40f0f0255
-00b8fffcb40d0d0255002f2b2b2bcd2f2b2b2bcd003f3fc0c010d0d0c011
-1217392b2b3130012b2b2b001bb10602435458401f07200b0b065506200b
-0b065503200b0b065504200b0b065505200b0b065508b8fff240230b0b06
-55020c0b0b065503060c0c0655020e0c0c0655090c0c0c06550a0c0c0c06
-5507b8fff8b40d0d065508b8fff8401f0d0d06552605010c200a12340f20
-0a12340f050c0300010e0b00080801020ab8ffeeb40b0b06550ab8ffeeb4
-0c0c06550abb0256001200100256400d000c0b0b065500060c0c065500b8
-fff8b40d0d065500012f2b2b2bf42ff42b2b003f3c3f3c3c111217392b2b
-5d3130012b2b2b2b2b2b2b2b002b2b2b2b2b1b407f00020f0814021b0804
-760c860cc80c03090c490c490f032904250d2c0e58035b04760d780e870d
-080b020508390d360e4f024b03440740084d0d420e0a9802990396079608
-a803a7070612020f0e0e30050214050502080c0d0d300508140505080c52
-0f5201400102020808090a0b0b0d0d0e0e1000080902601280120212ba02
-a8000d0131b2052008b80131400a0c090a20400c7f0b010bba0256000e01
-0bb2052002b8010b40090f0100200f70100110b80256b720056005800503
-05b802a8b3113b59182b1910f45df45d3c18fd3c10ed1a1910edf45d3c1a
-18fd3c10ed1a1910ede45d00183f3f3c3c103c103c103c103c103c103c1a
-10eded87052e2b877dc4872e182b877dc43130004bb00b534bb01e515a58
-bd000cfffb0008ffd60002ffd638383859014bb00c534bb028515a58b900
-0dfff8b10e0a38385901435c58b9000dffd4b621390e2c21390db8ffd4b6
-37390e3237390db8ffd4b52d390e2c2d392b2b2b2b2b2b5972715d00715d
-015d59593311210116173637012111231101230111980124015b30161935
-015f0105bbfe56affe5805bafbf29148509b03fcfa4604cbfb3504e0fb20
->ArialMT AddT42Char 
-2 14402 51 <0002009e000004fd05ba000d001800b2402c65116b14024b104b145b105b
-14040b0c1e0f0e0e0017181e02010200081226080a0d0d025508100b0b06
-5508b8fff4401b0c0c0655081a201a01201a011a180d2001200001002010
-10025500b8fff6b40f0f025500b8fff6b40d0d025500b8fffa400b0c0c02
-55000c0b0b065500b8fffab40c0c065500b8fff0400a0d0d0655005d193b
-5c182b10f62b2b2b2b2b2b2b5d3cfd3c4e10715df62b2b2b4ded003f3f3c
-fd3c12392f3cfd3c3130015d005d33112132171e02151402212111112132
-36353426272623219e0229924d6c9259eefec9fe88017bbc9e5d4c3184fe
-8905ba0e1265b66dbbfefdfdac03018c7f5c83150d00>ArialMT AddT42Char 
-3 0 54 <0001005cffe704eb05d30030021540276303630473037404042527350339
-1c430349074c1d451f44244627530359075c1d572889130e23b8fff2b410
-10025524b8fff2b41010025525b8fff2b41010025526b8fff2b410100255
-27b8fff2b41010025523b8fff6b40d10025524b8fff6b40d10025525b8ff
-f6b40d10025526b8fff6b40d10025527b8fff640460d100255280d262402
-24032725360f34234425452f5a20562355256c0b6a0d6b0e66146518790b
-7a0d7a0f7d107524732586038a0b890d8a0f8d1085248325920d960f9615
-1eb10602435458402d2126121b261a09262901260000291a120432312600
-650002000d2d791b891b021b25160d2d1e27250125051605b8fff4400c0c
-0c0655051e2d091e1e1603003fed3fed2b1112395d1112391112395d1112
-395d01111217392fed2fed2fed2fed1b402d25240e0d0b05211c1d1e1b08
-070604030206012524220e0d0b06051e1b2d1a400c0c02558f1a011aed16
-002d01b8ffc040120c0c02551001200150016001700190010601b801b040
-132d1e1e1603051e2d091b261a4a092600290129b8ffeab40e0e025529b8
-fff4400d0c0c0255291a32212612012612b8ffecb40e0e025512b8fff6b4
-0d0d025512b8fff8400f0c0c02551254200001001931635b182b4e10f45d
-4de42b2b2bed10ed4e10f62b2b5d4dedf4ed003fed3fed10fd5d2be410fd
-5d2bf4111217391117391112393901121739593130005d712b2b2b2b2b2b
-2b2b2b2b015d7113371e0233323636353426272624272626353436363332
-161617072626232206151417160417161615140606232224265cb70d5fc8
-7d6faa53505c3bfe6c5169677ef294a3f98605ba0fada9b0a1393801d958
-807a86fb9dc7fef39901d7106e8d5742734445672317612b37a3656fc164
-69cc810e8b8e815b4f33336b283bb57675cf7374e900>ArialMT AddT42Char 
-3 4064 66 <0001ffe1fe69048afeeb0003001a400c013f00021a050019044341182b4e
-10e410e6002f4ded3130033521151f04a9fe69828200>ArialMT AddT42Char 
-3 4240 68 <0002004affe8041c043e00280037022d402c090d092a190d1a2a290d2a2a
-390d3615371b3a2a492a5d0d5d2a6a0d692a60308a0d86299a169b1aa90d
-1528b8ffe8b40b0b065527b8ffe840190b0b0655a619aa28b619bb28c419
-cf28d215dd28084416011eb8fff440110c0c065512120c0c0655050c0c0c
-065535b8ffe040550c0c06551f171f182b2c2a343904392c4904482c5608
-592b6608692b760c870cc90cf90df92b1137340e0104102f243417322114
-185f296f2902291c2f0e3f0e8f0e9f0eff0e059f0eaf0eef0e030e0c0f0f
-02550eb8ffeab4101002550eb8fff44015101006550e0c0d0d06550e060f
-0f06550e0e1c0317b802aab61895141c1c0700b8fff4401a0c0c06550045
-270a321c030b2961106100060d0d025500252124b8ffecb41010025524b8
-ffec400b0d0d025524040c0c025524b8ffe4b40b0b025524b8fff4b40b0b
-065524b8ffdc400b1010065524060f0f065524b8fffcb40c0c065524b802
-5b400e27400026102620263026af260539b8ffc0b40e0e025526b8ffd6b6
-0e0e0255263139b8ffc0400d1e23343039c03902a039013917b8fff44041
-10100655172518222f24bf06cf06021f063f0602060e0f0f0255060c0d0d
-025506180c0c0255060c0b0b0255060c0b0b0655060e0d0d065506100c0c
-065506313810f62b2b2b2b2b2b2b5d71edf4ed2b105d712bf62b2b5dedf4
-2b2b2b2b2b2b2b2b3cfd2be5e5003fed3fe42b3fedfde41112392f2b2b2b
-2b2b5d71ed711112391112393901111217393130005d2b2b2b2b01715d2b
-2b0071250606232226353436363736373637363534272623220607273e02
-333216161716151514161723260306070e02151416333236373635033c64
-b96aafbc477348356bda67013345887f791db0186ed08988aa5010091722
-bc1c1762c46f5c326d6968a2261d835546ab854e814e140e0d1a24250a6e
-2d3d597118718b4b40614a2e78f0fb853d3801dd281c10284d2f48605b4f
-3d77>ArialMT AddT42Char 
-3 5440 70 <00010050ffe803ed043e001a015ab1020243545840340e7f0f010f0b0140
-0050007000030004121c0b07181c040b010e1507080e0e0255070c0d0d02
-55070c0c0c025507100b0b0255072f2b2b2b2bcdd4c6003fed3fed10c45d
-3210c45d3231301b4047090c011f1c4313431753135317601360179b029b
-039a0da410a41a0c080d190a6a0269036a05750c700d800da60cb509b60a
-b50c0c160c860ce302030e225f0f6f0f7f0f030f01b802aa407930004000
-5000600070009000a000e000f00009000f0f0b000004121c0b07181c040b
-1c0f010f240e080d0d06550e221b000100240b2b1f010100010101400b0b
-065501401010065501480c0c0655011a0d0d065501491c1524cf07011f07
-3f0702070e0b0b0655070a1010065507120c0c065507311b34c4182b10f6
-2b2b2b5d71ed10f62b2b2b2b5d724b53234b515a58b90001ffc03859ed72
-f42bed72003fed3fed12392f11392f105de4105de43130005d71015d7159
-011706062322001134123633321617072626232206151416333236033cb1
-1defaedafef772e989addc1faf197f5a88aaa4846a8e018517b7cf011d01
-0aac010281afa11b6b6cc3d3d6c28200>ArialMT AddT42Char 
-3 6312 72 <0002004bffe8041e043e0015001d015340171f001c150255035d055d0955
-0b65036b056f09650b0815b8ffe4b40d0d065511b8ffe440520d0d06551d
-1c0d0d06552712d905fa14f61a0431123a19311c41124d1a411c51125c19
-521c61126d1a611c78067815f602f618100016010f0d1717501660167016
-03161c0f9010a010021010041b1c0a0700ba02aa0001ffc0b41010025501
-b8ffc04010101006551001010195131c040b17400db8ffdcb40d0d02550d
-b8ffeeb40d0d06550db8ffeab40c0c06550db8ffc04009272a34b00d010d
-1a1fb8ffc0b32526341fb8ffc040411e2334301f011f163310240740242a
-341f073f074f070307200b0b025507180c0c0255071c0d0d0255070e0b0b
-0655071c0c0c065507160d0d065507191e3437182b4e10f42b2b2b2b2b2b
-5d2b4dfde44e10712b2bf6712b2b2b2b4ded003fedfd5d2b2be43fed1239
-2f5d3cfd713c011112393912393130015d005d2b2b2b0171720117060623
-22001110003332001114072116163332360121262726232206035eba2cee
-b9e9feef0114dcd5010e01fce80ab285638cfdda02510c3856897ca90156
-17a3b4011f0103010c0128fedefef91020afba680195864368a6>ArialMT AddT42Char 
-3 6758 73 <000100130000028005d30017010d401e1409010f192f193019401970199b
-0c9c0da90d081a0d280db019c0190419b8ffc040281a1f341d080d030c0f
-1c0a0115022b1413040306000a9f140114ff134004172504000302920101
-00b8ffc0b331383400b8ffc0402b1c1f3490000119400f0f025519400d0e
-025500141010025500280f0f025500220e0e0255002c0d0d025500b8fff2
-400b0c0c025500140b0b065500b8ffeab41010065500b8ffe6b40f0f0655
-00b8fffab70c0c065500a31819bc01ba002100f6010a00182b2bf62b2b2b
-2b2b2b2b2b2b2b2b5d2b2b3c10f43c103ced10eded5d003f3f3c3c3cfd3c
-3fed391139313043794014101106090706080602061009121b0011060f1b
-012b012b2a8181012b715d00723311233533353437363633321707262322
-06151533152311b29f9f131a83764c5c1b38325244cfcf039a8c716b3446
-57129d0a4660628cfc66>ArialMT AddT42Char 
-3 8014 76 <000200880000013c05ba0003000700cd405e09360b0b02554f099009a009
-b009c009df09f0090700091f09700980099f09b009c009df09e009ff090a
-1f09010001070402030906037e0100060506040a0607250500049f04a004
-b004c004e00406c004f0040200042004d004e0040404b8fff8b410100255
-04b8fffa40170e0e025504040c0c0255040a0b0b025504140b0b065504b8
-ffeab41010065504b8fffeb40d0d065504b8fffc400a0c0c0655044e0847
-50182b10f62b2b2b2b2b2b2b2b5d71723cfd3c003f3f3c3fed0111123939
-111239393130015d72712b133533150311331188b4b4b404ebcfcffb1504
-26fbda00>ArialMT AddT42Char 
-3 8538 78 <00010088000003f805ba000b0261401b060c0d0d0655070656065a09030f
-0df305f60603090c1010025506b8fff4b40c0c02550ab8fff4b40c0c0255
-09b8fff4b40c0c025503b8ffe840100d0d06555503770a02120620132134
-08b8fff0b312273409b8fff0b41227341205b8fff0b312213409b8fff040
-84122734060404050406370947040525062d0a580a7703750ada03e30607
-a60601230626072508390638093f0d4f0d59045906580759097d04790599
-09c606d204d606e406e907f706f90815120a0a0503030402060607090908
-0a0a050908082507061407070603040425050a1405050a0a090603040801
-02000405060708080b0b000a04b8010f400905040c0c0655052208b8010f
-402120073f070207100c0c0655071a900d010d0b2500022501019000013f
-004f000200b8fffe40310e0e025500100d0d025500100c0c0255000a0b0b
-025500120b0b065500120c0c065500080d0d065500190c0de1214766182b
-2b4ef42b2b2b2b2b2b2b5d713c4d10ed10ed4e1071f62b5d4dedf42bed00
-3f3c103c103c3f3c3f3c11173987052e2b047d10c487052e182b0e7d10c4
-0710083c083c0310083c083cb10602435458400d4b09011f098403020918
-0d1134002b5d7159313001435c58400a092c1d3909081d1d3c06b8ffdeb2
-1d3906b8ffd4b2203906b8ffd4b121392b2b2b2b2b595d00715d0171002b
-2b435c58b90006ffc0b2213903b8ffc0b2163903b8ffdeb2103906b8ffde
-b2103903b8ffdeb20c3903b8ffdeb10b392b2b2b2b2b2b59012b2b2b435c
-584012dd040108141639090814143c090814143c06b8fff6b2183906b8ff
-ecb11b392b2b2b2b2b015d59005d2b2b2b2b2b015d712b33113311013301
-012301071188b401aae9fe6a01bfdefea17f05bafcbc01b0fe76fd64021f
-7afe5b00>ArialMT AddT42Char 
-3 9202 79 <000100830000013705ba000300e3b605360b0b025505b8ffc0b337383405
-b8ffc0b334353405b8ffc0b330313405b8ffc0b322253405b8ffc0402515
-17340f051f059f05df05044f05df05f005031f0570058005ff0504010000
-0a0203250100b8ffc0b337383400b8ffc040153335349f0001c000f00002
-00002000d000e0000400b8fff8b41010025500b8fffa401d0e0e02550004
-0c0c0255000a0b0b025500140b0b065500081010065500b8fffeb40d0d06
-5500b8ffffb40c0c065500b8fffc400a0c0c0655004e044750182b10f62b
-2b2b2b2b2b2b2b2b5d71722b2b3cfd3c003f3f3130015d71722b2b2b2b2b
-2b3311331183b405bafa4600>ArialMT AddT42Char 
-3 9454 80 <0001008700000626043e002301c7b9000dfff4b40d0d065508b8fff4b40d
-0d065509b8ffd8404d0b0d342504e404e409e117e52005d505f620021708
-202309181b20090303231e1c06151c0b0b06070106231a19100ad0250190
-25a025022517171a0e2590110111041010025511180f0f025511b8ffec40
-0b0e0e025511140c0c025511b8ffe840170b0b025511020b0b0655110c10
-10065511060f0f065511b8fffab40c0c065511b8fff8b40d0d065511b801
-5d400c1825901b011b180f0f02551bb8ffec400b0e0e02551b140c0c0255
-1bb8ffee40110b0b02551b040b0b06551b0a101006551bb8fffe400b0d0d
-06551b0c0f0f06551bb8fffcb40c0c06551bb8015d4016000233232501d0
-00019000a000021f003f004f000300b8fffe401d0e0e025500100d0d0255
-00100c0c0255000c0b0b025500160b0b065500b8fffcb41010065500b8ff
-f440140f0f0655000a0c0c0655000e0d0d065500192425b80178b3214750
-182b2b4ef42b2b2b2b2b2b2b2b2b5d71723c4dfde410f42b2b2b2b2b2b2b
-2b2b5dedf42b2b2b2b2b2b2b2b2b2b5dfd4e456544e67172003f3c3c3c3f
-3f3c4d10ed10ed11173901111239123931304379400e0c141326140c111b
-01120d151b01002b012b2b81015d005d2b2b2b3311331536363332161736
-3332161511231134262623220615112311342623220606151187a132a66a
-76971f7eca9eaab3235c3e7094b458644c813a0426954e5f6258baafb6fd
-27029d6c5f3a95a4fd9702b27878509a91fdd900>ArialMT AddT42Char 
-3 10468 82 <00020044ffe80427043e000d0019016bb615180d0d065513b8ffe8b40d0d
-06550fb8ffe840730d0d065519180d0d065512070a190c47064808560659
-08670669080834103a123a16351845104b124b1645185c055c0952105d12
-5d1652186d056d0964106d126d1664187701150906050d5b035405540a5b
-0c6c036505650a6c0c0a171c0407111c0b0b14241b400d0d02551b400b0b
-025507b8ffea40110f0f025507180d0d025507100b0b025507b8fff0b40b
-0b065507b8fff0b40d0d065507b8fff0b40f0f065507b8fff0b40c0c0655
-07b8ffc04013242534300701000710072007030731df1b011bb8ffc04049
-1e2334301b011b0e24000c0e0f025500120d0d0255000c0c0c0255001c0b
-0b0255000e0b0b0655000e0d0d0655000c1010065500160c0c0655004024
-25341f003f000200311a3437182b10f65d2b2b2b2b2b2b2b2b2bed10712b
-5df65d5d2b2b2b2b2b2b2b2b2b2bed003fed3fed313001715d0071435c58
-4009530553096205620904015d59002b2b2b2b1310373633320015140606
-23220013141633323635342623220644a489c5db01167beb8bdffeedb9b2
-8786b2b38587b2021301278e76fee1fdcdeb82011e010dcccbccd1c5cbca
->ArialMT AddT42Char 
-3 10918 83 <00020087fe690421043e0012001e0162408e0c102d103d104b10043f20b0
-20021f20290c231d3215321d421d70209020083a173a1b4a174a1b59085b
-0c5c175c1b6a086b0c69106d176b1bc020d314dd18dd1ad31ee414e41ee0
-20ff201623042b102b1535043a1046044a105a10e50beb1dfe100b110e03
-161c1c06070106161c0e0b000e1924d00a01100a400a600a800a0420400b
-0b025520400d0d02550ab8ffe6400b0f0f02550a180d0d02550ab8fffab4
-0c0c02550ab8ffeeb40b0b06550ab8fff4b40f0f06550ab8ffe840230c0c
-06550a74011333023312250000c001019001a001b001f001041f013f014f
-010301b8fffc401d0e0e025501100d0d025501100c0c025501100b0b0255
-010c0b0b065501b8fff6b41010065501b8fffc40160f0f0655010c0c0c06
-5501120d0d065501191f473718012b4e10f42b2b2b2b2b2b2b2b2b5d7172
-3c4d10fdf4e410fd2b2b2b2b2b2b2b2b5d71ed003f3fed3f3fed11391239
-3130005d015d717200711311331536363332161615140206232226271103
-141633323635342623220687a43a926888d06a75df7b5a8f2e11a67678ab
-a77473b1fe6905bd8a51518cff98a3fefb8b4c3afdfb03a4cdc4cbd5cbca
-d700>ArialMT AddT42Char 
-3 11776 85 <00010085000002c6043e001100c9403b2f13011004012304340443045304
-66047404060911080908090d1311090d000308010b1c06070106000a0928
-900801082220130113022211250100b8ffc04010333634f0000100002000
-d000e0000400b8fff8b41010025500b8fff840110e0e025500040c0c0255
-00060b0b025500b8fffcb41010065500b8fff440160f0f065500060c0c06
-5500080d0d0655004e1247c4182b10f62b2b2b2b2b2b2b2b5d712b3cfde4
-105df472e4003f3f3fed11393911393901111239390010c9870e7dc43130
-005d72015d33113315363633321707262322060706151185a23e693f5b5e
-3e42423b5e141e0426a171483aa727473f6072fdd400>ArialMT AddT42Char 
-3 12038 86 <0001003fffe803b1043e00300317407b042214223a094a09442456226522
-7c098e098424a613ab2cc2030d09171a1817304b2cd617051b0255020210
-32010a185c085c095c0a5c0b5c0c5c0d6a086a096a0a6a0b6a0c6a0db426
-b4270f27262427242936245a0a590b64266428742374248024930a9c0c92
-28972c9530a40aa90ca327a428b326c5261628b8fff4b40d0d065522b8ff
-f4b40d0d065523b8fff4b40d0d065524b8fff4b40d0d065528b8fff4b40c
-0c065522b8fff4b40c0c065523b8fff4b40c0c065524b8fff4b40c0c0655
-1db8ffde40121e395a0827250c0a041a202615040b2e1d1ab802aa402219
-2c0b0b02551f193f194f195f19af19cf19060f191f196f19df19041f198f
-190219bd02550015000002aa0001ffc040140b0b025510014001021001d0
-0102000110010201b8ffc0b314163401b8ffc040100e113401012e5c1d6c
-1d021d1c150704b8fff4b40b0b025504b8ffe6b41010065504b8ffe64013
-0f0f0655041c2e0b1f1a011a24194013183432b8ffc0402f0f0f02551918
-0f0f025519180d0d025519160c0c025519201010065519200f0f06551910
-0c0c065519160d0d065519b8025bb207242ab8ffc0b51c39d02a012ab8ff
-e6b40c0c02552ab8ffe8b40f0f02552ab8ffe8b40c0c06552ab8ffeab60d
-0d06552a1a32b8ffc04021272a346032c032023f32803202321001010124
-00180d0d025500100d0d06550020b8fff4b40d0d025520b8fff4b4101006
-5520b8fff440190f0f065520240f100b0b02550f160c0c02550f200d0d02
-550fb8fffa40200f0f02550f0e0c0c06550f0c0d0d06550f22df00013f00
-4f00020019313437182b4e10f45d714df42b2b2b2b2b2bed2b2b2b102b2b
-ed724e105d712bf62b2b2b2b712b4dedf42b2b2b2b2b2b2b2b2bed72003f
-ed2b2b2b3fed7112392f2b2b5d71722be410fd5d71722be4111239111239
-0111121739313043794040272d1e2305142c261110121013100306220d20
-1b000928071b01052d071b011e14201b00210e231b0022230d0c08290a1b
-012827090a062b041b001f101d1b01002b2b103c103c2b103c103c2b012b
-2b2b2b2a2b818181002b2b2b2b2b2b2b2b2b5d71015d72715d1337161633
-323635342726272e02353436373636333216161707262623220615141716
-1716171e02151406062322263fb20f897b7c78352593c6994f41382a9153
-7dbd5a11b00c73697c6a16162f1b84bf975669c67dcfd9013d1c6b726544
-3d2318253249814e4779281f2b487b6718525c5237231c1d130a2433417c
-5c5a9f57ac00>ArialMT AddT42Char 
-3 12974 87 <00010024fff2022a0599001700d8b9000affc0b323263409b8ffc0404123
-263480190100010c0d0a0103001610092b0f0a06161c030b0f1022002201
-0d12250c01ff070845094560077007800790070400072007a007b007c007
-d0070607b8ffeeb41010025507b8fff4b40f0f025507b8fff2b40e0e0255
-07b8fff8b40d0d025507b8fff8b40c0c025507b8fffab41010065507b8ff
-f0400b0f0f065507060c0c065507b8ffe8b40d0d065507ba026a00180136
-b166182b10f62b2b2b2b2b2b2b2b2b5d71f4e410ed3cfd3c10e4f43c003f
-ed3f3cfd3c1139123911333310c93130015d2b2b25170623222626351123
-353311371133152311141616333202101a4c3c626c2c8484b3b5b5132b28
-1ea19f103e65a202638c01076cfe8d8cfd934d2c1a00>ArialMT AddT42Char 
-4 0 92 <00010021fe5103ee0426001a01f7b10202435458401d0a140f030b031c19
-0f12060b061340120f200b400c200f180f0f02550f192f2b1add1a18cd1a
-1910dd1a18cd003f3f3fed12173931301bb30f1c010fb8ffde406d1c3928
-14560faf0a03400d400f020f202830341020283034070c0912160d181227
-0b270c270d360c360d350e99110b28122813481659125913591569126913
-69157906760d79117a147a15850d8a118c128c138914980aa80bbc10bb11
-ba14ea0ae714f50dfd10f914ff1c1e12b106024354584016130b1c1b040f
-440f840f030f190b031c190f12060b06003f3f3fed1112395d0111123939
-1b40370f0f0c101112120a00031914131325120a1412120a0f0c0f110c25
-0b0a140b0b0a1312120c0c0b06031c190f001c101c022f1cbf1c021cb802
-3fb50f1340124014b80254400b3f124012025f12bf120212b80142b60f01
-2200451b0ab8025440120f200b4040200c300c4f0c03500cff0c020cb801
-42b32f0f010fb8023fb41b207c66182b1a1910fd71f45d711a18ed1a1910
-ed1810f4e41910e45d71ed1a1810ed1910e45d7100183fed3f3c103c103c
-87052e2b087d10c487052e182b0e7d10c400111239870e103c3c08c44bb0
-0e534bb018515a58bb000cffe8000bffe80138385959313001435c58b900
-14ffdeb637390a2237390eb8ffe8b51539112215392b2b2b2b595d712b2b
-00715d2b015d591327163332363736373637013313161736371333010607
-060623227f143b2c3c48171126050bfe6dc2dd2b221f2be3b4fe6c412430
-7c5634fe67a91028241b6b0f1d0428fd9975817c76026bfbc8af42595300
->ArialMT AddT42Char 
-2 0 0 <00020100000005000500000300070000211121112521112101000400fc20
-03c0fc400500fb002004c000>ArialMT AddT42Char 
-ArialMT /CharStrings get begin
-/period 17 def
-/M 48 def
-/P 51 def
-/S 54 def
-/underscore 66 def
-/a 68 def
-/c 70 def
-/e 72 def
-/f 73 def
-/i 76 def
-/k 78 def
-/l 79 def
-/m 80 def
-/o 82 def
-/p 83 def
-/r 85 def
-/s 86 def
-/t 87 def
-/y 92 def
-end
-ArialMT /Encoding get
-dup 46 /period put
-dup 77 /M put
-dup 80 /P put
-dup 83 /S put
-dup 95 /underscore put
-dup 97 /a put
-dup 99 /c put
-dup 101 /e put
-dup 102 /f put
-dup 105 /i put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 111 /o put
-dup 112 /p put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 121 /y put
-pop
-end
-%ADOEndSubsetFont
-/KUDFOQ+ArialMT /ArialMT findfont ct_VMDictPut
-/KUDFOQ+ArialMT*1 
-[46{/.notdef}rp /period 30{/.notdef}rp /M 2{/.notdef}rp /P 2{/.notdef}rp /S 
-11{/.notdef}rp /underscore /.notdef /a /.notdef /c /.notdef /e 
-/f 2{/.notdef}rp /i /.notdef /k /l /m /.notdef 
-/o /p /.notdef /r /s /t 4{/.notdef}rp /y 
-134{/.notdef}rp]
-KUDFOQ+ArialMT nf
-KUDFOQ+ArialMT*1 [9 0 0 -9 0 0 ]msf
-120 344.76 mo
-(ps_cmyk.icc)
-[5.04 4.563 5.03999 4.563 7.55994 4.437 4.563 2.51999 2.04301 4.563 0 ]xsh
-229.314 173.508 mo
-(SoftMask)
-[6.00307 5.03999 2.52 2.52 7.31693 5.04001 4.56299 0 ]xsh
-269.157 173.508 mo
-(Profiles)
-[6.00305 2.99695 5.04001 2.51999 2.043 2.043 5.04001 0 ]xsh
-/KUDFOQ+ArialMT*1 uf
-/KUDFOQ+ArialMT uf
-/ArialMT uf
-.12 lw
-0 lj
-8 ml
-[] 0 dsh
-222 162 mo
-311.375 162 li
-311.375 179.125 li
-222 179.125 li
-cp
-@
-.75 lw
-1 lj
-168 12 mo
-168 18 li
-@
-grestore
-grestore
-pgrs
-%%PageTrailer
-[
-[/CSA [/0 ]]
-] del_res
-Adobe_AGM_Image/pt gx
-Adobe_CoolType_Core/pt get exec
-Adobe_AGM_Core/restore_mysetup gx
-Adobe_AGM_Core/pt gx
-currentdict Adobe_AGM_Utils eq {end} if
-%%Trailer
-Adobe_AGM_Utils begin
-[/EMC pdfmark_5
-currentdict Adobe_AGM_Utils eq {end} if
-Adobe_AGM_Image/dt get exec
-Adobe_CoolType_Core/dt get exec
-Adobe_AGM_Core/dt get exec
-%%Pages: 1
-%%DocumentNeededResources: 
-%%DocumentSuppliedResources: procset Adobe_AGM_Image 1.0 0
-%%+ procset Adobe_CoolType_Utility_T42 1.0 0
-%%+ procset Adobe_CoolType_Utility_MAKEOCF 1.23 0
-%%+ procset Adobe_CoolType_Core 2.31 0
-%%+ procset Adobe_AGM_Core 2.0 0
-%%+ procset Adobe_AGM_Utils 1.0 0
-%%DocumentNeededFeatures: 
-%%DocumentSuppliedFeatures: 
-%%DocumentCustomColors: 
-%%CMYKCustomColor: 
-%%RGBCustomColor: 
-%%EOF
Binary files /tmp/tEGX4vL79d/ghostscript-9.04~dfsg/doc/GS9_Color_Management.pdf and /tmp/9yWObDIain/ghostscript-9.05~dfsg~20120125/doc/GS9_Color_Management.pdf differ
diff -Nru ghostscript-9.04~dfsg/doc/GS9_Color_Management.tex ghostscript-9.05~dfsg~20120125/doc/GS9_Color_Management.tex
--- ghostscript-9.04~dfsg/doc/GS9_Color_Management.tex	2011-08-05 11:12:21.000000000 +0000
+++ ghostscript-9.05~dfsg~20120125/doc/GS9_Color_Management.tex	2012-01-25 08:44:24.000000000 +0000
@@ -22,33 +22,40 @@
 \usepackage{setspace}
 \usepackage{amsmath}
 \usepackage{color}
+\usepackage{caption} % so that I can have captions that dont wrap back under the caption index
 \usepackage{hyperref}
 \usepackage[ansinew]{inputenc}
+\usepackage[all]{hypcap} % so that links to figures go to the figures and not the captions
+\usepackage{subfig}   % subfigure
+\captionsetup{format=hang,justification=raggedright}
 \pagestyle{myheadings} \markboth{ Artifex Software Inc. www.artifex.com }{Artifex Software Inc. www.artifex.com}
 
+
 \begin{document}
 
 \begin{titlepage}
 
-\begin{center}{\huge \bf Ghostscript 9.0 Color Management\\} \vspace{0.5in} {\Large Michael J.
+\begin{center}{\huge \bf Ghostscript 9.05 Color Management\\} \vspace{0.5in} {\Large Michael J.
 Vrhel, Ph.D.\\} {\Large Artifex Software\\} {\Large 7 Mt. Lassen Drive, A-134\\} {\Large San Rafael, CA 94903, USA\\}
 {\Large www.artifex.com\\}
 \end{center}
 \vspace*{0.5in}
 \begin{abstract}
-This document provides information about Ghostscript 9.0's color architecture. The document is suitable for users who wish to
+This document provides information about the color architecture in Ghostscript 9.05. The document is suitable for users who wish to
 obtain accurate color with their output device as well as for developers who wish to customize Ghostscript to achieve a higher
 level of control and/or interface with a different color management module.
 \end{abstract}
 \begin{center}
 \vspace*{0.25in}
-Revision 1.0
+Revision 1.1
 \vspace*{0.25in}
+\capstartfalse
 \begin{figure}[h]
     \begin{center}
-\includegraphics*[width=1.5in]{figures/Ghost.eps}
+\includegraphics*[width=1.5in]{figures/Ghost.pdf}
     \end{center}
 \end{figure}
+\capstarttrue
 
 \end{center}
 
@@ -63,55 +70,62 @@
 
 \section{Introduction}
 
-As of release 9.0, the color architecture of Ghostscript has been significantly updated to be primarily based upon the ICC\cite{ICC} format.  Prior to this release, Ghostscript's color architecture was based heavily upon PostScript\cite{PS} Color Management (PCM).  This is due to the fact that Ghostscript was designed prior to the ICC format and likely even before there was much thought about digital color management.  At that point in time, color management was very much an art with someone adjusting controls to achieve the proper output color.
+With release 9.0, the color architecture of Ghostscript was updated to primarily use the ICC\cite{ICC} format for its color management needs.  Prior to this release, Ghostscript's color architecture was based heavily upon PostScript\cite{PS} Color Management (PCM).  This is due to the fact that Ghostscript was designed prior to the ICC format and likely even before there was much thought about digital color management.  At that point in time, color management was very much an art with someone adjusting controls to achieve the proper output color.
 
-Today, almost all print color management is performed using ICC profiles as opposed to PCM.  This fact along with the desire to create a faster, more flexible design was the motivation for the color architectural changes in release 9.0.  Features of this new architecture include:
+Today, almost all print color management is performed using ICC profiles as opposed to PCM.  This fact along with the desire to create a faster, more flexible design was the motivation for the color architectural changes in release 9.0.  Since 9.0, several new features and capabilities  have been added. As of the 9.05 release, features of the color architecture include:
 \begin{itemize}
-\item Easy interface of different CMMs (Color Management Modules) with Ghostscript.
-\item Defining of all color spaces in terms of ICC profiles.
-\item Caching of linked transformations and internally generated profiles.
+\item Easy to interface different CMMs (Color Management Modules) with Ghostscript.
+\item ALL color spaces are defined in terms of ICC profiles.
+\item Linked transformations and internally generated profiles are cached.
 \item Easily accessed manager for ICC profiles.
-\item Command line option for setting default profiles for Gray, RGB and CMYK source profiles.
-\item Command line option for setting device profile.
-\item Command line option for overriding input and output rendering intent.
-\item Command line option for specifying DeviceN profiles, named color structures, link profiles and proofing profiles.
-\item Command line option to override embedded profiles.
-\item Passing of object type along to CMM for creation of transforms that account for image, graphic or text.
-\item Efficient operation in multithreaded banded (c-list or display list) rendering.
+\item Easy to specify default profiles for DeviceGray, DeviceRGB and DeviceCMYK color spaces.
+\item Devices can readily communicate their ICC profiles and have their ICC profiles set.
+\item Operates efficiently in a multithreaded environment.
+\item Handles named colors (spots) with ICC named color profile or proprietary format.
+\item ICC color management of Device-N colors or alternatively customizable spot color handing.
+\item Includes object type (e.g. image, graphic, text) and rendering intent into the computation of the linked transform.
+\item Ability to override document embedded ICC profiles with Ghostscript's default ICC profiles.
+\item Easy to specify unique {\bf source} ICC profiles to use with CMYK and RGB graphic, image and text objects.
+\item Easy to specify unique {\bf destination} ICC profiles to use with graphic, image and text objects.
+\item Easy to specify different rendering intents (perceptual, colorimetric, saturation, absolute colorimetric) for graphic, image and text objects.
+\item Control to force gray source colors to black ink only when rendering to output devices that support black ink.
 \end{itemize}
-The document is organized to first provide a higher level overview of the new ICC flow as well as how to make use of the new architecture. This is followed by details of the various functions and structures, which include the information necessary to interface other color management modules to Ghostscript as well as how to interface specialized color handling operations.
+The document is organized to first provide a high level overview of the architecture. This is followed by details of the various functions and structures, which include the information necessary to interface other color management modules to Ghostscript as well as how to interface specialized color handling operations.
 
 \section{Overall Architecture and Typical Flow}
 
 Figure \ref{fig:ICC_ARCH} provides a graphical overview of the various components that make up the architecture.  The primary components are:
 \begin{itemize}
-\item  The ICC Manager, which maintains the various default profiles.
-\item The Link Cache, which stores recently used linked transforms.
-\item The Profile Cache, which stores internally generated ICC profiles created from PostScript CIE based color spaces and CalRGB, CalGray PDF color spaces.
+\item  The ICC manager, which maintains the various default profiles.
+\item The link cache, which stores recently used linked transforms.
+\item The profile cache, which stores internally generated ICC profiles created from PostScript CIE based color spaces and CalRGB, CalGray PDF color spaces.
 \item The profiles contained in the root folder iccprofiles, which are used as default color spaces for the output device and for undefined source colors in the document.
-\item The color management module (CMM), which is the external engine that provides and performs the transformations (e.g. littleCMS).
+\item The color management module (CMM), which is the engine that provides and performs the transformations (e.g. little CMS).
+\item The profiles associated with the device, which include profiles dependent upon object type, a proofing profile and a device link profile.
 \end{itemize}
-In the typical flow, when a thread is ready to transform a buffer of data, it will request a linked transform from the Link Cache. When requesting a link, it is necessary to provide information to the CMM, which consists of a source color space, a destination color space, an object state (e.g. text, graphic, or image) and a rendering type (e.g. perceptual, saturation, colorimetric).  The linked transform provides a mapping directly from the source color space to the destination color space. If a linked transform for these settings does not already exist in the Link Cache, a linked transform from the CMM will be obtained (assuming there is sufficient memory -- if there is not sufficient memory then the requesting thread will need to wait).  Depending upon the CMM, it is possible that the CMM may create a lazy linked object (i.e. create the real thing when it is asked to transform data).  At some point, a linked transform will be returned to the requesting thread.  The thread can then use this mapping to transform buffers of data through calls through an interface to the external CMM.  Once the thread has completed its use of the link transform, it will notify the Link Cache.  The Link Cache will then be able to release the link when it needs additional cache space due to other link requests.
+In the typical flow, when a thread is ready to transform a buffer of data, it will request a linked transform from the link cache. When requesting a link, it is necessary to provide information to the CMM, which consists of a source color space, a destination color space, an object state (e.g. text, graphic, or image) and a rendering type (e.g. perceptual, saturation, colorimetric).  The linked transform provides a mapping directly from the source color space to the destination color space. If a linked transform for these settings does not already exist in the link cache, a linked transform from the CMM will be obtained (assuming there is sufficient memory -- if there is not sufficient memory then the requesting thread will need to wait).  Depending upon the CMM, it is possible that the CMM may create a lazy linked object (i.e. create the real thing when it is asked to transform data).  At some point, a linked transform will be returned to the requesting thread.  The thread can then use this mapping to transform buffers of data through calls through an interface to the external CMM.  Once the thread has completed its use of the link transform, it will notify the link cache.  The link cache will then be able to release the link when it needs additional cache space due to other link requests.
 
 \begin{figure}
     \begin{center}
   %  \leavevmode \epsfysize=3.0in
-\includegraphics*[width=7.5in]{figures/Overview.eps}
+\includegraphics*[width=6.5in]{figures/architecture.pdf}
     \end{center}
-   \caption{Graphical Overview of ICC Architecture}
+   \caption{Graphical Overview of Ghostscript's Color Architecture}
     \label{fig:ICC_ARCH}
 \end{figure}
 
 \section{PDL Color Definitions and ICC Profiles}
 
-To help reduce confusion, it is worthwhile to clarify terminology. In particular, the use of the terms process color and device color need to be defined in the context of ICC profiles. Both PDF\cite{PDF} and PostScript (PS) have a distinction between process colors and device colors.  In both PDF and PS, there is
+To help reduce confusion, it is worthwhile to clarify terminology. In particular, the use of the terms process color and device color need to be defined in the context of ICC profiles. Both PDF\cite{PDF} and PostScript (PS) have a distinction between process colors and device colors.  In PS, there is
 a conversion (e.g. via UCR/BG) from device colors to process colors.  In an ICC work flow, the colors are transformed directly from an input color space (often called the source space) to an output color space (often called the destination space).  The output color space defined by the device's ICC profile is a mapping to what PDF and PS define as the process color space of the device.  In other words, the ``device color space'' as defined by the device's ICC profile IS the process color space of PDF and PS.  The ICC profile of the device is a mapping from a CIE color space to the process color space AND from the process color space to a CIE color space.
 
 To understand this better, it may help to understand the method by which a print based ICC profile is created.  To create an ICC profile for a device, a chart is printed using its process colors (e.g. CMYK).  This chart is measured using a colorimeter or a spectrophotometer.  This provides the forward mapping from process colors to CIELAB values.  The inverse mapping (from CIELAB to process colors) is obtained by inverting this table usually through a brute force search and extrapolation method.  These mappings are both packed into an ICC format, thereby defining mappings between the device ``process colors'' and the CIE color space.
 
 \section{Usage}
 
-The ICC branch introduces several new command line options that can be used for complete color management control.  To define source colors that are not already colorimetrically defined in the source document, the following command line options can be invoked:\\
+There are a number of command line options available for color control.  These options are also available as device parameters and so can be set from Ghostscript's command prompt when Ghostscript is used in ``server-mode'' operation.
+
+To define source colors that are not already colorimetrically defined in the source document, the following command line options can be invoked:\\
 
 \textcolor{red}{-sDefaultGrayProfile = my\_gray\_profile.icc}\\
 
@@ -119,13 +133,19 @@
 
 \textcolor{red}{-sDefaultCMYKProfile = my\_cmyk\_profile.icc}\\
 
- \noindent In this case, for example, any source gray colors will be interpreted as being defined by the ICC profile my\_gray\_profile.icc.  If these profiles are not set, default ICC profiles will be used to define undefined colors.  These default profiles are contained in the gs folder directory iccprofiles and are named default\_gray.icc, default\_rgb.icc and default\_cmyk.icc.  The profile default\_gray.icc is defined to provide output along the neutral axis with an sRGB linearization.  The profile default\_rgb.icc is the V2 sRGB ICC profile and the profile default\_cmyk.icc is a SWOP CMYK ICC profile.
+ \noindent In this case, for example, any source gray colors will be interpreted as being defined by the ICC profile my\_gray\_profile.icc.  If these profiles are not set, default ICC profiles will be used to define undefined colors.  These default profiles are contained in the directory iccprofiles and are named default\_gray.icc, default\_rgb.icc and default\_cmyk.icc.  The profile default\_gray.icc is defined to provide output along the neutral axis with an sRGB linearization.  The profile default\_rgb.icc is the V2 sRGB ICC profile and the profile default\_cmyk.icc is a SWOP CMYK ICC profile.\\
+
+It is possible to have Ghostscript use the above specified ICC profiles in place of ICC profiles embedded in the document.  This is achieved using\\
+
+ \textcolor{red}{-dOverrideICC = true/false}\\
 
-In addition to being able to define undefined colors, it is possible to define the ICC profile for the output device using\\
+\noindent which, when set to true overrides any ICC profiles contained in the source document with the profiles specified by sDefaultGrayProfile, sDefaultRGBProfile, sDefaultCMYKProfile. Note that if no profiles are specified for the default Device color spaces, then the system default profiles will be used. For detailed override control in the specification of source colors see SourceObjectICC.\\
+
+In addition to being able to define undefined source colors, it is possible to define the ICC profile for the output device using\\
 
 \textcolor{red}{-sOutputICCProfile = my\_device\_profile.icc}\\
 
- \noindent Care should be taken to make sure that the number of components associated with the output device is the same as the number of components for the output device ICC profile (i.e. use an RGB profile for an RGB device).  If the destination device is CMYK + SPOT colorants, then it is possible to specify either a CMYK ICC profile or an N-Color ICC profile for the device.  If a CMYK profile is specified, then only the CMYK colorants will be color managed.  If an output profile is not specified, then the default CMYK profile is used as the output profile.
+ \noindent Care should be taken to make sure that the number of components associated with the output device is the same as the number of components for the output device ICC profile (i.e. use an RGB profile for an RGB device).  If the destination device is CMYK + SPOT colorants, then it is possible to specify either a CMYK ICC profile or an N-Color ICC profile for the device.  If a CMYK profile is specified, then only the CMYK colorants will be color managed.  If an output profile is not specified, then the default CMYK profile is used as the output profile.\\
 
 A directory can be defined, which will be searched to find the above defined ICC profiles.  This makes it easier for users who have their profiles contained in a single directory and do not wish to append the full path name in the above command line options.  The directory is set using\\
 
@@ -135,53 +155,194 @@
 
 Named color support for separation color spaces is specified through the command line option\\
 
-\textcolor{red}{-sNamedProfile = c:/my\_namedcolor\_stucture}\\
+\textcolor{red}{-sNamedProfile = c:/my\_namedcolor\_structure}\\
 
- \noindent While the ICC does define a named color format, the above structure can in practice be much more general for those who have more complex handling requirements of separation color spaces. For example, some developers wish to use their own proprietary-based format for spot color management. This command option is for developer use when an implementation for named color management is designed for the function {\bf gsicc\_transform\_named\_color} located in gsicc\_cache.c . An example implementation is currently contained in the code [see comments above {\bf gsicc\_transform\_named\_color} in gsicc\_cache.c]. For the general user, this command option should really not be used.
+ \noindent While the ICC does define a named color format, the above structure can in practice be much more general for those who have more complex handling requirements of separation color spaces. For example, some developers wish to use their own proprietary-based format for spot color management. This command option is for developer use when an implementation for named color management is designed for the function {\bf gsicc\_transform\_named\_color} located in gsicc\_cache.c . An example implementation is currently contained in the code [see comments above {\bf gsicc\_transform\_named\_color} in gsicc\_cache.c]. For the general user, this command option should really not be used.\\
 
-The above option deals with the handling of single spot colors.  It is possible to specify ICC profiles or other structures for managing DeviceN source colors. This is done using the command line option\\
+The above option deals with the handling of single spot colors.  It is possible to specify ICC profiles for managing DeviceN source colors. This is done using the command line option\\
 
 \textcolor{red}{-sDeviceNProfile = c:/my\_devicen\_profile.icc}\\
 
- \noindent Note that neither PS nor PDF provide in-document ICC profile definitions for DeviceN color spaces. With this interface it is possible to provide this definition. The colorants tag order in the ICC profile defines the lay-down order of the inks associated with the profile. A windows-based tool for creating these source profiles is contained in gs/toolbin/color/icc\_creator.  If non-ICC based color management of DeviceN source colors is desired by a developer, it is possible to use the same methods used for the handling of individual spot colors.  In that case, a single proprietary structure could be used, which contains information about how to blend multiple colorants for accurate DeviceN color proofing.
+ \noindent Note that neither PS nor PDF provide in-document ICC profile definitions for DeviceN color spaces. With this interface it is possible to provide this definition. The colorants tag order in the ICC profile defines the lay-down order of the inks associated with the profile. A windows-based tool for creating these source profiles is contained in gs/toolbin/color/icc\_creator.  If non-ICC based color management of DeviceN source colors is desired by a developer, it is possible to use the same methods used for the handling of individual spot colors.  In that case, a single proprietary structure could be used, which contains information about how to blend multiple colorants for accurate DeviceN color proofing.  This would require the addition of code in {\bf gx\_concretize\_DeviceN} similar to what is done in {\bf gx\_concretize\_Separation} (with the call of {\bf gsicc\_transform\_named\_color}) for the specialized handing of spot colors described above.\\
 
 The command line option\\
 
 \textcolor{red}{-sProofProfile = my\_proof\_profile.icc}\\
 
- \noindent enables the specification of a proofing profile, which will make the color management system link multiple profiles together to emulate the device defined by the proofing profile.  This is currently under development and should be in-place before the official release of Ghostscript 9.0
+\noindent enables the specification of a proofing profile, which will make the color management system link multiple profiles together to emulate the device defined by the proofing profile.  See Section \ref{sec:proof_link} for details on this option.\\
 
 The command line option\\
 
 \textcolor{red}{-sDeviceLinkProfile = my\_link\_profile.icc}\\
 
- \noindent makes it possible to include a device link profile in the color transformations.  This is useful for devices that output raster content in a standard color space such as SWOP or Fogra CMYK, but it is desired to redirect this output to other CMYK devices.  While it is possible to handle the color transformations in other manners (e.g. using a proofing profile) the use of device link profiles is not uncommon.  The final linking profile is applied at the device level following rasterization to the destination color space as specified by the device profile.  Ghostscript's rendering of the page description language PCL, which requires rendering into sRGB buffers, will make use of this device link profile to provide final conversion from sRGB to device CMYK prior to halftoning.
+ \noindent makes it possible to include a device link profile in the color transformations.  This is useful for work flows where one wants to map colors first to a standard color space such as SWOP or Fogra CMYK, but it is desired to redirect this output to other CMYK devices. See Section \ref{sec:proof_link} for details on this option.\\
+
+It is possible for a document to specify the rendering intent to be used when performing a color transformation.  Ghostscript is set up to handle four rendering intents with the nomenclature of Perceptual, Colorimetric, Saturation, and Absolute Colorimetric, which matches the terminology used by the ICC format.  By default, per the specification, the rendering intent is Perceptual for PDF and PS documents.  In many cases, it may be desired to ignore the source settings for rendering intent.  This is achieved through the use of two parameter settings which are\\
+
+\textcolor{red}{-dOverrideRI = true/false}\\
+
+\noindent which, when set to true overrides the rendering intent contained in the source document with the rendering intent that has been specified by\\
+
+\textcolor{red}{-dRenderIntent = intent}\\
+
+\noindent which sets the rendering intent that should be used with the profile specified above by -sOutputICCProfile. The options for intent are 0, 1, 2 and 3, which correspond to the ICC intents of Perceptual, Colorimetric, Saturation, and Absolute Colorimetric.\\
+
+There are two additional special color handling options that may be of interest to some users.  One is\\
+
+\textcolor{red}{-dDeviceGrayToK = true/false}\\
+
+\noindent By default, Ghostscript will map DeviceGray color spaces to pure K when the output device is CMYK based. This may not always be desired. In particular, it may be desired to map from the gray ICC profile specified by -sDefaultGrayProfile to the output device profile. To achieve this, one should specify -dDeviceGrayToK=false.   The gray\_to\_k.icc profile in ./profiles is used to achieve this mapping of source gray to the colorant K.\\
+
+In certain cases, it may be desired to {\bf not} perform ICC color management on DeviceGray, DeviceRGB and DeviceCMYK source colors.  This can occur in particular. if one is attempting to create an ICC profile for a target device and needed to print pure colorants.  In this case, one may want instead to use the traditional Postscript 255 minus operations to convert between RGB and CMYK with black generation and undercolor removal mappings.  To achieve these types of color mappings use the following command set to true\\
+
+\textcolor{red}{-dUseFastColor = true/false}\\
+
+\subsection{Object dependent color management}
+
+It is often desired to perform unique mappings based upon object types.  For example, one may want to perform one color transformation on text colors to ensure a black text and a different transformation on image colors to ensure perceptually pleasing images and yet another transformation on graphics to create saturated colors.   To achieve this, Ghostscript provides a unprecedented amount of color control based upon object type.
+
+The following commands, enable one to specify unique {\bf output} ICC profiles and rendering intents for text, graphic and image objects.  As shown in Figure \ref{fig:ICC_ARCH}, these profiles are stored in the device structure.  Specifically, the command options are:\\
+
+\textcolor{red}{-sGraphicICCProfile = filename}\\
+
+\noindent Sets the ICC profile that will be associated with the output device for vector-based graphics (e.g. solid color Fill, Stroke operations). This option can be used to obtain more saturated colors for graphics.  Care should be taken to ensure that the number of colorants associated with the device is the same as the profile. \\
+
+\textcolor{red}{-sGraphicIntent = intent}\\
+
+\noindent Sets the rendering intent that should be used with the profile specified above by -sGraphicICCProfile. The options are the same as specified for -dRenderIntent. It is also necessary to set -dOverrideRI=true.\\
+
+\textcolor{red}{-sImageICCProfile = filename}\\
+
+\noindent Sets the ICC profile that will be associated with the output device for images.  This can be used to obtain perceptually pleasing images.
+Care should be taken to ensure that the number of colorants associated with the device is the same as the profile. \\
+
+\textcolor{red}{-sImageIntent = intent}\\
+
+\noindent Sets the rendering intent that should be used with the profile specified above by -sImageICCProfile. The options are the same as specified for -dRenderIntent. It is also necessary to set -dOverrideRI=true.\\
 
-In some cases, it is desired to override any internal profiles that may exist within a document.  The command line option\\
+\textcolor{red}{-sTextICCProfile = filename}\\
 
-\textcolor{red}{-dOverrideInternalProfiles = true}\\
+\noindent Sets the ICC profile that will be associated with the output device for text.  This can be used ensure K only text at the output. Care should be taken to ensure that the number of colorants associated with the device is the same as the profile.\\
 
- \noindent achieves this by replacing any document embedded ICC profiles with the Gray, RGB or CMYK default profile depending upon the channel count. Note that embedded CIELAB source profiles are obviously not overridden.
+\textcolor{red}{-sTextIntent = intent}\\
 
-The following command specifies the rendering intent to use for the specified output profile.\\
+\noindent Sets the rendering intent that should be used with the profile specified above by -sTextICCProfile. The options are the same as specified for -dRenderIntent. It is also necessary to set -dOverrideRI=true.\\
 
-\textcolor{red}{-sOutputRenderingIntent = Perceptual}\\
+In addition to being able to have the output ICC profile dependent upon object type, it is possible to have the {\bf source} ICC profile and rendering intents be dependent upon object types for RGB and CMYK objects.  Because this requires the specification of 12 new parameters and is only used in specialized situations, the specification is made through a single text file.  The text file is specified to Ghostscript using\\
 
- \noindent The default value is Perceptual.  Other valid values include Saturation, Colorimetric and AbsoluteColorimetric.
+\textcolor{red}{-sSourceObjectICC = filename}\\
+
+This option provides an extreme level of override control to specify the source color spaces and rendering intents to use with graphics, images and text for both RGB and CMYK source objects. The specification is made through a file that contains on a line, a key name to specify the object type (e.g. Image\_CMYK) followed by an ICC profile file name and a rendering intent number (0 for perceptual, 1 for colorimetric, 2 for saturation, 3 for absolute colorimetric). An example file is given in ./gs/toolbin/color/src\_color/objsrc\_profiles\_example.txt. Profiles to demonstrate this method of specification are also included in this folder. Note that if objects are colorimetrically specified through this mechanism, other operations like -sImageIntent, -dOverrideICC, have no affect.\\
+
+The example file mentioned above contains the following tab delimited lines\\
+
+\begin{tabular}{lll}
+Graphic\_CMYK & cmyk\_src\_cyan.icc	& 0 \\
+Image\_CMYK	& cmyk\_src\_magenta.icc &	0 \\
+Text\_CMYK	& cmyk\_src\_yellow.icc	 & 0 \\
+Graphic\_RGB &	rgb\_source\_red.icc	& 0 \\
+Image\_RGB &	rgb\_source\_green.icc	& 0 \\
+Text\_RGB & rgb\_source\_blue.icc & 0 \\
+\end{tabular}\\
+
+\noindent where the first item in the line is the key word, the second item in the line is the file name of the {\bf source} ICC profile to use for that object type and the third item specifies the rendering intent.  Note that not all types need to be specified.  It is possible to have only a single type specified in the file (e.g. Image\_CMYK).  The other items would render in a normal default fashion in this case.\\
+
+For those interested in this level of control, it is recommended to execute a number of examples.
+In the first example, copy the files in ./gs/toolbin/color/src\_color/ to ./iccprofiles and render the file ./examples/text\_graph\_image\_cmyk\_rgb.pdf with the option -sSourceObjectICC = objsrc\_profiles\_example.txt to an RGB device (e.g. tiff24nc).  Note, to ensure that Ghostscript can find all the files and to avoid having to do a full rebuild to create the ROM file system, you may want to specify the icc directory using\\
+ -sICCProfilesDir=``your\_full\_path\_to\_iccprofiles/", which provides the full path to ./iccprofiles/.   Windows users should be sure to use the forward slash delimiter due to the special interpretation of ``\textbackslash'' by the Microsoft C startup code.
+
+\begin{figure}
+    \begin{center}
+  %  \leavevmode \epsfysize=3.0in
+\includegraphics*[width=2.5in]{figures/text_graph_image_cmyk_rgb.pdf}
+    \end{center}
+   \caption{Example file with mixed content. The file includes RGB and CMYK text, graphics, and iamges}
+    \label{fig:normal}
+\end{figure}
+
+\begin{figure}
+  \subfloat[Source profiles vary with object type]{\label{fig:source_icc}\includegraphics[width=0.5\textwidth]{figures/source_profile.pdf}}
+  \subfloat[Rendering intents vary with CMYK source object type]{\label{fig:source_ri}\includegraphics[width=0.5\textwidth]{figures/source_intent.pdf}}
+    \caption{Examples of object based color transformations for the file from Figure \ref{fig:normal} by specifying {\bf source} profiles and/or rendering intents}
+\end{figure}
+
+\begin{figure}
+  \subfloat[Destination profiles vary with object type]{\label{fig:des_icc}\includegraphics[width=0.5\textwidth]{figures/destination_profile.pdf}}
+  \subfloat[Destination intents vary with object type]{\label{fig:des_ri}\includegraphics[width=0.5\textwidth]{figures/des_profile_intent.pdf}}
+    \caption{Examples of object based color transformations for the file from Figure \ref{fig:normal} by specifying {\bf destination} profiles and/or intents}
+  \label{fig:object_based_color}
+\end{figure}
+
+Figure \ref{fig:normal} displays the source file text\_graph\_image\_cmyk\_rgb.pdf rendered with default settings and Figure \ref{fig:source_icc} displays the result when rendered using  -sSourceObjectICC = objsrc\_profiles\_example.txt.   The profiles specified in objsrc\_profiles\_example.txt are designed to render object types to the color specified in their name when used as a source profile.  In this case, RGB graphics, images and text are rendered red, green and blue respectively and CMYK  graphics, images and text are rendered cyan, magenta and yellow respectively.\\
+
+Modifying the contents of the objsrc\_profiles\_example.txt file to\\
+
+\begin{tabular}{lll}
+Graphic\_CMYK & cmyk\_src\_renderintent.icc	& 0 \\
+Image\_CMYK	& cmyk\_src\_renderintent.icc	& 1 \\
+Text\_CMYK	& cmyk\_src\_renderintent.icc	& 2 \\
+\end{tabular}\\
+
+\noindent and rendering the file ./examples/text\_graph\_image\_cmyk\_rgb.pdf to an RGB device, one obtains the output shown in Figure \ref{fig:source_ri}.  In this case, we demonstrated the control of rendering intent based upon object type.  The profile cmyk\_src\_renderintent.icc is designed to create significantly different colors for its different intents. Since we only specified this for the CMYK objects we see that they are the only objects effected and that this profile renders its perceptual intent cyan, its colorimetric intent magenta and its saturation intent yellow.
+
+For another example of object dependent color management, copy the files in\\
+./toolbin/color/icc\_creator/effects to ./iccprofiles.  Now specify unique output ICC profiles for different object types using the command line options\\
+
+\noindent -sGraphicICCProfile = yellow\_output.icc\\
+-sImageICCProfile = magenta\_output.icc\\
+-sTextICCProfile = cyan\_output.icc\\
+
+\noindent while rendering the file text\_graph\_image\_cmyk\_rgb.pdf to a CMYK device (e.g. tiff32nc).  Figure \ref{fig:des_icc} displays the results.  In this case, the profiles,
+cyan\_output.icc, yellow\_output.icc and magenta\_output.icc render a color that is indicated by their name when used as an output profile.
+
+Finally, in yet another example, we can demonstrate the effect of rendering intent for different objects using the command line options\\
+
+\begin{tabular}{l}
+-sGraphicICCProfile = cmyk\_des\_renderintent.icc\\
+-sImageICCProfile = cmyk\_des\_renderintent.icc\\
+ -sTextICCProfile = cmyk\_des\_renderintent.icc\\
+-dImageIntent = 0\\
+-dGraphicIntent = 1\\
+-dTextIntent = 2\\
+-dOverrideRI\\
+\end{tabular}\\
+
+Figure \ref{fig:des_ri} displays the result.  The profile cmyk\_des\_renderintent.icc is designed such that the perceptual rendering intent outputs cyan only, the colorimetric intent outputs magenta only and the saturation intent outputs yellow only.
+
+A graphical overview of the object dependent color control is shown in Figure \ref{fig:object_dep_color}, which shows how both the source and/or the destination ICC profiles can be specified.\\
+
+
+\begin{figure}
+    \begin{center}
+  %  \leavevmode \epsfysize=3.0in
+\includegraphics*[width=5in]{figures/Object_Color.pdf}
+    \end{center}
+   \caption{Overview of profiles that can be used in object dependent color
+            management}
+\label{fig:object_dep_color}
+\end{figure}
 
-Similarly, the desired rendering intents to use with Gray, RGB and CMYK input sources can be specified with the following commands.\\
 
-\textcolor{red}{-sInputGrayRenderIntent = Perceptual}\\
+Finally, it should be mentioned that Ghostscript has the capability to maintain object type information even through transparency blending.  This is achieved through the use of a special tag plane during the blending of the objects.  When the final blending of the objects occurs this tag information is available.  Mixed objects will be indicated as such (e.g text blended with image).  A device can have a specialized put\_image operation that can handle the pixel level color management operation and apply the desired color mapping for different blend cases.  The bittagrgb device in Ghostscript provides a demonstration of the use of the tag information.
 
-\textcolor{red}{-sInputRGBRenderIntent = Perceptual}\\
+\subsection{Proof and Device-Link Profiles}
+\label{sec:proof_link}
 
-\textcolor{red}{-sInputCMYKRenderIntent = Perceptual}\\
+As shown in Figure \ref{fig:ICC_ARCH}, the proofing profile and the device link profile are associated with the device.  If these profiles have been specified using the options
+-sProofProfile = my\_proof\_profile.icc and -sDeviceLinkProfile = my\_link\_profile.icc, then when the graphics library maps a source color defined by the ICC profile source.icc to the device color values, a transformation is computed by the CMM that consists of the steps shown in Figure \ref{fig:proof_link}. In this Figure, Device ICC Profile is the ICC profile specified for the actual device (this can be specified using -sOutputICCProfile).  In practice, the CMM will create a single mapping that performs the transformation of the multiple mappings shown in Figure \ref{fig:proof_link}.  If we specify a proofing profile, then our output should provide a proof of how the output would appear if it had been displayed or printed on the proofing device defined by the proofing profile.  The device link profile is useful for cases where one may have a work flow that consists of always rendering to a common CMYK space such as Fogra 39 followed by a mapping with a specialized device link profile.  In this case, the profile specified by -sOutputICCProfile would be the profile for the common CMYK space.
 
- \noindent These will override any internal specification for rendering intents.
+\begin{figure}
+    \begin{center}
+  %  \leavevmode \epsfysize=3.0in
+\includegraphics*[width=7in]{figures/proof_link.pdf}
+    \end{center}
+   \caption{Flow of data through source, proof, destination and device link ICC profiles}
+   \label{fig:proof_link}
+\end{figure}
 
-\section{Overview of objects and methods}
+\section{Details of objects and methods}
 
-At this point, let us go into further detail of the architecture.  Following this, we will discuss the requirements for interfacing another CMM to Ghostscript as well as where to interface in the new architecture for those who had made use of the now removed CUSTOM\_COLOR\_CALLBACK option in previous versions of Ghostscript.
+At this point, let us go into further detail of the architecture.  Following this, we will discuss the requirements for interfacing another CMM to Ghostscript as well as details for customization of handling Separation and DeviceN color spaces.
 
 \subsection{ICC Manager}
 
@@ -189,78 +350,75 @@
 
 \begin{itemize}
 \item Store the required profile information to use for Gray, RGB, and CMYK source colors that are NOT colorimetrically defined in the source document.  These entries must always be set in the manager and are set to default values unless defined by the command line interface.
-\item Store the required profile information for the output device.
 \item Store the optional profile/structure information related to named colors and DeviceN colors.
-\item Store the proofing profile.
 \item Store the CIELAB source profile.
-\item Store the directory be used to search for ICC profiles specified for the above objects.
+\item Store the specialized profile for mapping gray source colors to K-only CMYK values.
 \item Store settings for profile override, output rendering intent (i.e. perceptual, colorimetric, saturation or absolute colorimetric) and source color rendering intents.
 \item Store the profiles that are used for softmask rendering if soft masks are contained in the document.
+\item Store the profiles used for object dependent source color specification through the use of -sSourceObjectICC.
+\item Store the boolean flags for profile and rendering intent override of source settings.
 \end{itemize}
-The manager is created when the imaging state object is created for the graphics library.  It is reference counted and allocated in garbage collected (GC) memory that is not stable with graphic state restores.  The default gray, RGB and CMYK ICC color spaces as well as the device ICC color space are defined immediately during the initialization of the graphics library.  If no ICC profiles are specified externally, then the ICC profiles that are contained in the root folder iccprofiles will be used.  The ICC Manager is defined by the structure given below.\\
+The manager is created when the imaging state object is created for the graphics library.  It is reference counted and allocated in garbage collected (GC) memory that is stable with graphic state restores.  The default gray, RGB and CMYK ICC color spaces are defined immediately during the initialization of the graphics library.  If no ICC profiles are specified externally, then the ICC profiles that are contained in the root folder iccprofiles will be used.  The ICC Manager is defined by the structure given below.\\
 
 \noindent typedef struct gsicc\_manager\_s \{
 
 \begin{tabular}{lll}
-  &       cmm\_profile\_t *device\_named;   & 	\textcolor{green}{/* The named color profile for the device */}  \\
-  &       cmm\_profile\_t *default\_gray;   & 	\textcolor{green}{/* Default gray profile for device gray */}   \\
-  &       cmm\_profile\_t *default\_rgb;    &	 \textcolor{green}{/* Default RGB profile for device RGB */}    \\
-  &       cmm\_profile\_t *default\_cmyk;   & 	\textcolor{green}{/* Default CMYK profile for device CMKY */} \\
-  &       cmm\_profile\_t *proof\_profile;  & 	\textcolor{green}{/* Proofing profile */} \\
-  &       cmm\_profile\_t *output\_link;    & 	\textcolor{green}{/* Output device Link profile */}    \\
-  &       cmm\_profile\_t *device\_profile; & 	\textcolor{green}{/* The actual profile for the device */}    \\
-  &       cmm\_profile\_t *lab\_profile;    &  \textcolor{green}{/* Colorspace type ICC profile from LAB to LAB */}   \\
-  &       gsicc\_devicen\_t *device\_n;     &  \textcolor{green}{/* A linked list of profiles used for DeviceN support */} \\
-  &       gsicc\_smask\_t *smask\_profiles; &  \textcolor{green}{/* Profiles used when we are in a softmask group */ } \\
-  &       char *profiledir;              	&	 \textcolor{green}{/* Directory used in searching for ICC profiles */}    \\
-  &       uint namelen; & \\
+  & cmm\_profile\_t *device\_named;   & 	\textcolor{green}{/* The named color profile for the device */}  \\
+  & cmm\_profile\_t *default\_gray;   & 	\textcolor{green}{/* Default gray profile for device gray */}   \\
+  & cmm\_profile\_t *default\_rgb;    &	 \textcolor{green}{/* Default RGB profile for device RGB */}    \\
+  & cmm\_profile\_t *default\_cmyk;   & 	\textcolor{green}{/* Default CMYK profile for device CMKY */} \\
+  & cmm\_profile\_t *lab\_profile;    &  \textcolor{green}{/* Colorspace type ICC profile from LAB to LAB */}   \\
+  & cmm\_profile\_t *graytok\_profile;&  \textcolor{green}{/* A specialized profile for mapping gray to K */}   \\
+  & gsicc\_devicen\_t *device\_n;     &  \textcolor{green}{/* A linked list of profiles used for DeviceN support */} \\
+  & gsicc\_smask\_t *smask\_profiles; &  \textcolor{green}{/* Profiles used when we are in a softmask group */ } \\
+  & bool override\_internal; &  \textcolor{green}{/* Override source ICC profiles */ } \\
+  & bool override\_ri;  &  \textcolor{green}{/* Override source rendering intent */ } \\
+  & cmm\_srcgtag\_profile\_t *srcgtag\_profile; &  \textcolor{green}{/* Object dependent source profiles */ } \\
   &       gs\_memory\_t *memory;    & \\
   &       rc\_header rc; &
 \end{tabular}
+
 \noindent  \} gsicc\_manager\_t;\\
 
 \noindent Operators that relate to the ICC Manager are contained in the file gsicc\_manage.c/h and include the following:\\
 
-\singlespace
-\noindent int {\bf gsicc\_init\_device\_profile}(gs\_state * pgs, gx\_device * dev);\\
-
+\noindent gsicc\_manager\_t* {\bf gsicc\_manager\_new}(gs\_memory\_t *memory);\\
+	
 \begin{minipage}[h]{6.0in}
-
-This initializes the device\_profile member variable based upon the properties of the device.  The device may have a profile defined in its
-dev$\rightarrow$color\_info.icc\_profile member variable.  If it does not, then a default profile will be assigned to the device.
+Creator for the ICC Manager.
 \end{minipage}\\
 \\
 
-\noindent int {\bf gsicc\_set\_profile}(gsicc\_manager\_t *icc\_manager, const char *pname, int namelen, \\gsicc\_profile\_t defaulttype);\\
-\\
+\noindent int {\bf gsicc\_init\_iccmanager}(gs\_state * pgs);\\
 
 \begin{minipage}[h]{6.0in}
-This is used to set all the other profile related member variables in the ICC Manager.  The member variable to set is specified by defaulttype.
+Initializes the ICC Manager with all the required default profiles.
 \end{minipage}\\
-\\
 
-\noindent void {\bf gsicc\_set\_icc\_directory}(const gs\_imager\_state *pis, const char* pname, int namelen);\\
+\begin{tabbing}
+\noindent cmm\_profile\_t* {\bf gsicc\_profile\_new}(\=stream *s, gs\_memory\_t *memory, const char* pname, \\
+\>int namelen);\\
+\end{tabbing}
 
 \begin{minipage}[h]{6.0in}
-This is used to set the directory for finding the ICC profiles specified by \\ gsicc\_set\_profile.
-\end{minipage}\\
-\\
-
-\noindent gsicc\_manager\_t* {\bf gsicc\_manager\_new}(gs\_memory\_t *memory);\\
-	
-\begin{minipage}[h]{6.0in}
-Creator for the ICC Manager.
+Returns an ICC object given a stream pointer to the ICC content.  The variables pname and namelen provide the filename and name length of the stream if it is to be created from a file.  If the data is from the source stream, pname should be NULL and namelen should be zero.
 \end{minipage}\\
 \\
 
-\noindent cmm\_profile\_t* {\bf gsicc\_profile\_new}(stream *s, gs\_memory\_t *memory, const char* pname, int namelen);\\
+\begin{tabbing}
+\noindent int {\bf gsicc\_set\_profile}(\=gsicc\_manager\_t *icc\_manager, const char *pname, int namelen, \\
+\>gsicc\_profile\_t defaulttype);\\
+\end{tabbing}
 
 \begin{minipage}[h]{6.0in}
-Returns an ICC object given a stream pointer to the ICC content.  The variables pname and namelen provide the filename and name length of the stream if it is to be created from a file.  If the data is from the source stream, pname should be NULL and namelen should be zero.
+This is used to set the default related member variables in the ICC Manager.  The member variable to set is specified by defaulttype.
 \end{minipage}\\
 \\
 
-\noindent int {\bf gsicc\_set\_gscs\_profile}(gs\_color\_space *pcs, cmm\_profile\_t *icc\_profile, \\gs\_memory\_t * mem);\\
+\begin{tabbing}
+\noindent int {\bf gsicc\_set\_gscs\_profile}(\=gs\_color\_space *pcs, cmm\_profile\_t *icc\_profile, \\
+\> gs\_memory\_t * mem);\\
+\end{tabbing}
 
 \begin{minipage}[h]{6.0in}
 Sets the member variable cmm\_icc\_profile\_data of the gs\_color\_space object (pointed to by pcs) to icc\_profile.
@@ -277,22 +435,22 @@
 \noindent gcmmhprofile\_t {\bf gsicc\_get\_profile\_handle\_buffer}(unsigned char *buffer, int profile\_size);\\
 
 \begin{minipage}[h]{6.0in}
-Returns the CMS handle to the ICC profile contained in the buffer.
+Returns the CMM handle to the ICC profile contained in the buffer.
 \end{minipage}\\
 
-\noindent int {\bf gsicc\_init\_iccmanager}(gs\_state * pgs);\\
+\begin{tabbing}
+\noindent void  {\bf gsicc\_profile\_serialize}(\=gsicc\_serialized\_profile\_t *profile\_data,\\
+\>cmm\_profile\_t *iccprofile);\\
+\end{tabbing}
 
 \begin{minipage}[h]{6.0in}
-Initializes the ICC Manager with all the required default profiles.
+A function used to serialize the icc profile information for embedding into the c-list (display list).
 \end{minipage}\\
 
-\noindent void  {\bf gsicc\_profile\_serialize}(gsicc\_serialized\_profile\_t *profile\_data, cmm\_profile\_t *iccprofile);\\
-
-\begin{minipage}[h]{6.0in}
-A function used to serialize the icc profile information for embedding into the c-list.
-\end{minipage}\\
-
-\noindent cmm\_profile\_t* {\bf gsicc\_get\_profile\_handle\_file}(const char* pname, int namelen, gs\_memory\_t *mem);\\
+\begin{tabbing}
+\noindent cmm\_profile\_t* {\bf gsicc\_get\_profile\_handle\_file}(\=const char* pname, int namelen, \\
+\>gs\_memory\_t *mem);\\
+\end{tabbing}
 
 \begin{minipage}[h]{6.0in}
 Given a profile file name, obtain a handle from the CMM.
@@ -310,7 +468,10 @@
 Get the hash code for a profile.
 \end{minipage}\\
 
-\noindent gcmmhprofile\_t {\bf gsicc\_get\_profile\_handle\_clist}(cmm\_profile\_t *picc\_profile, gs\_memory\_t *memory);\\
+\begin{tabbing}
+\noindent gcmmhprofile\_t {\bf gsicc\_get\_profile\_handle\_clist}(\=cmm\_profile\_t *picc\_profile, \\
+\>gs\_memory\_t *memory);\\
+\end{tabbing}
 
 \begin{minipage}[h]{6.0in}
 For a profile that is embedded inside the c-list, obtain a handle from the CMM.
@@ -334,6 +495,15 @@
 Initialize the icc soft mask structure.   Only invoked when softmask groups are used in rendering.
 \end{minipage}\\
 
+\begin{tabbing}
+\noindent cmm\_profile\_t* {\bf  gsicc\_set\_iccsmaskprofile}(\=const char *pname, int namelen, \\
+\>gsicc\_manager\_t *icc\_manager, gs\_memory\_t *mem);\\
+\end{tabbing}
+
+\begin{minipage}[h]{6.0in}
+Specialized function used in the setting of the soft mask profiles and the gray-to-k profile.
+\end{minipage}\\
+
 \noindent unsigned int {\bf gsicc\_getprofilesize}(unsigned char *buffer);\\
 
 \begin{minipage}[h]{6.0in}
@@ -343,7 +513,7 @@
 \noindent cmm\_profile\_t* {\bf gsicc\_read\_serial\_icc}(gx\_device * dev, int64\_t icc\_hashcode);\\
 
 \begin{minipage}[h]{6.0in}
-Read out the serialized icc data contained in the clist for a given hash code.
+Read out the serialized icc data contained in the c-list for a given hash code.
 \end{minipage}\\
 
 \noindent cmm\_profile\_t* {\bf gsicc\_finddevicen}(const gs\_color\_space *pcs, gsicc\_manager\_t *icc\_manager);\\
@@ -358,6 +528,7 @@
 Detect profiles that were set as part of the default settings.  These are needed to differentiate between embedded document icc profiles and ones that were supplied to undefined device source colors (e.g. DeviceRGB).  During high level device writing (e.g. pdfwrite), these default profiles are usually NOT written out.
 \end{minipage}\\
 
+
 \noindent void {\bf gsicc\_profile\_reference}(cmm\_profile\_t *icc\_profile, int delta);\\
 
 \begin{minipage}[h]{6.0in}
@@ -370,13 +541,155 @@
 Returns the number of device channels for a profile.
 \end{minipage}\\
 
+\noindent int {\bf gsicc\_init\_gs\_colors}(gs\_state *pgs);\\
+
+\begin{minipage}[h]{6.0in}
+Used during start-up to ensure that the initial default color spaces are associated with ICC profiles.
+\end{minipage}\\
+
+\noindent void {\bf gs\_setoverrideicc}(gs\_imager\_state *pis, bool value);\\
+
+\begin{minipage}[h]{6.0in}
+Set the override\_internal variable in the icc manager.
+\end{minipage}\\
+
+\noindent bool {\bf gs\_currentoverrideicc}(gs\_imager\_state *pis);\\
+
+\begin{minipage}[h]{6.0in}
+Get the override\_internal variable in the icc manager.
+\end{minipage}\\
+
+\noindent void {\bf gs\_setoverride\_ri}(gs\_imager\_state *pis, bool value);\\
+
+\begin{minipage}[h]{6.0in}
+Set the override\_ri variable in the icc manager.
+\end{minipage}\\
+
+\noindent bool {\bf gs\_currentoverride\_ri}(gs\_imager\_state *pis);\\
+
+\begin{minipage}[h]{6.0in}
+Get the override\_ri variable in the icc manager.
+\end{minipage}\\
+
+\noindent void {\bf gscms\_set\_icc\_range}(cmm\_profile\_t **icc\_profile);\\
+
+\begin{minipage}[h]{6.0in}
+Set the range values to default of 0 to 1 for the profile data.
+\end{minipage}\\
+
+\noindent void {\bf gsicc\_setrange\_lab}(cmm\_profile\_t *profile);\\
+
+\begin{minipage}[h]{6.0in}
+Set the range values to default of 0 to 100 for the first component and -128 to 127 for components two and three.
+\end{minipage}\\
+
+
+\begin{tabbing}
+\noindent int {\bf gsicc\_set\_srcgtag\_struct}(\=gsicc\_manager\_t *icc\_manager, const char* pname, \\
+\>int namelen);\\
+\end{tabbing}
+
+\begin{minipage}[h]{6.0in}
+Initializes the srcgtag\_profile member variable of the ICC manager.  This is set using -sSourceObjectICC.
+\end{minipage}\\
+
+\begin{tabbing}
+\noindent void {\bf gsicc\_get\_srcprofile}(\=gsicc\_colorbuffer\_t data\_cs,
+                     gs\_graphics\_type\_tag\_t graphics\_type\_tag,\\
+                     \>cmm\_srcgtag\_profile\_t *srcgtag\_profile,
+                     cmm\_profile\_t **profile,\\
+                     \>gsicc\_rendering\_intents\_t *rendering\_intent);\\
+\end{tabbing}
+
+\begin{minipage}[h]{6.0in}
+Given a particular object type this function will return the source profile and rendering intent that should be used
+it it has been specified using -sSourceObjectICC.
+\end{minipage}\\
+
 \singlespace
 
-\subsection{Link Cache}
+\subsection{Device Profile Structure}
+
+The device structure contains a member variable called icc\_struct, which is of type *cmm\_dev\_profile\_t.  The details
+of this structure are shown below.\\
 
-The Link Cache is a reference counted member variable of Ghostscript's imager state.  Its function is to maintain a cache of recently used links that had been provided by the CMM.  The Link Cache is designed with semaphore calls to allow multi-threaded c-list (display list) rendering to share a common cache.
+\noindent typedef struct cmm\_dev\_profile\_s \{
+
+\begin{tabular}{lll}
+ & cmm\_profile\_t  *device\_profile[]; & \textcolor{green}{/* Object dependent (and default) device profiles */}  \\
+ & cmm\_profile\_t  *proof\_profile; & \textcolor{green}{/* The proof profile */}  \\
+ & cmm\_profile\_t  *link\_profile; & \textcolor{green}{/* The device link profile */}  \\
+ & gsicc\_rendering\_intents\_t intent[]; & \textcolor{green}{/* Object dependent rendering intents */}  \\
+ & bool devicegraytok;    &    \textcolor{green}{/* Force source gray to device black */}  \\
+ & bool usefastcolor;     &   \textcolor{green}{/* No color management */} \\
+  &       gs\_memory\_t *memory;    & \\
+  &       rc\_header rc; &
+\end{tabular}
+
+\noindent  \}  cmm\_dev\_profile\_t;\\
+
+There are a number of operators associated with the device profiles.  These include:\\
+
+\noindent cmm\_dev\_profile\_t* {\bf gsicc\_new\_device\_profile\_array}(gs\_memory\_t *memory);\\
+
+\begin{minipage}[h]{6.0in}
+This allocates the above structure.
+\end{minipage}\\
+
+\begin{tabbing}
+\noindent int {\bf gsicc\_set\_device\_profile\_intent}(\=gx\_device *dev, gsicc\_profile\_types\_t intent,\\
+\>gsicc\_profile\_types\_t profile\_type);\\
+\end{tabbing}
+
+\begin{minipage}[h]{6.0in}
+This sets the rendering intent for a particular object type.
+\end{minipage}\\
+
+\begin{tabbing}
+\noindent int {\bf gsicc\_init\_device\_profile\_struct}(\=gx\_device * dev,  char *profile\_name,\\
+\>gsicc\_profile\_types\_t profile\_type);\\
+\end{tabbing}
+
+\begin{minipage}[h]{6.0in}
+This sets the device profiles. If the device does not have a defined profile, then a default one is selected.
+\end{minipage}\\
+
+\begin{tabbing}
+\noindent void {\bf gsicc\_extract\_profile}(\=gs\_graphics\_type\_tag\_t graphics\_type\_tag,\\
+                       \>cmm\_dev\_profile\_t *profile\_struct,
+                       cmm\_profile\_t **profile,\\
+                       \>gsicc\_rendering\_intents\_t *rendering\_intent);\\
+\end{tabbing}
+
+\begin{minipage}[h]{6.0in}
+Given a particular object type, this will return the device ICC profile and rendering intent to use.
+\end{minipage}\\
 
-The Link Cache is allocated in stable GC memory.  Operators that relate to the Link Cache are contained in the file gsicc\_cache.c/h and include the following:\\
+\begin{tabbing}
+\noindent int {\bf gsicc\_set\_device\_profile}(\=gx\_device * pdev, gs\_memory\_t * mem,
+                             char *file\_name,\\
+                             \>gsicc\_profile\_types\_t defaulttype);\\
+\end{tabbing}
+
+
+\begin{minipage}[h]{6.0in}
+This sets the specified device profile.  This is used by gsicc\_init\_device\_profile\_struct, which
+will specify the default profile to this function if one was not specified.
+\end{minipage}\\
+
+\noindent int  {\bf gsicc\_get\_device\_profile\_comps}(cmm\_dev\_profile\_t *dev\_profile);\\
+
+\begin{minipage}[h]{6.0in}
+Returns the number of device components of the profile associated with the device.
+\end{minipage}\\
+
+\singlespace
+
+\subsection{Link Cache}
+
+The Link Cache is a reference counted member variable of Ghostscript's imager state and maintains recently used links that were provided by the CMM.  These links are handles or context pointers provided by the CMM and are opaque to Ghostscript.  As mentioned above, the link is related to the rendering intents, the object type and the source and destination ICC profile.  From these items, a hash code is computed.  This hash code is then used to check if the link is already present in the Link Cache.  A reference count variable is included in the table entry so that it is possible to determine if any entries can be removed if there is insufficient space in the Link Cache for a new link.
+The Link Cache is allocated in stable GC memory and is designed with semaphore calls to allow multi-threaded c-list (display list) rendering to share a common cache.   Sharing does require that the CMM be thread safe.
+Operators that relate to the Link Cache are contained in the file gsicc\_cache.c/h and include the following:\\
 
 \singlespace
 
@@ -387,31 +700,42 @@
 \end{minipage}\\
 \\
 
-\noindent void {\bf gsicc\_init\_buffer}(gsicc\_bufferdesc\_t *buffer\_desc, unsigned char num\_chan,
-                                     unsigned char bytes\_per\_chan, bool has\_alpha, bool alpha\_first,
-                                     bool is\_planar, int plane\_stride, int row\_stride, int num\_rows, int
-                                     pixels\_per\_row);\\
+\begin{tabbing}
+\noindent void {\bf gsicc\_init\_buffer}(\=gsicc\_bufferdesc\_t *buffer\_desc, unsigned char num\_chan,\\
+\>unsigned char bytes\_per\_chan, bool has\_alpha, bool alpha\_first,\\
+\>bool is\_planar, int plane\_stride, int row\_stride, int num\_rows, \\
+\> int pixels\_per\_row);\\
+\end{tabbing}
 
 \begin{minipage}[h]{6.0in}
-This is used to initialize a gsicc\_bufferdesc\_t object. Two of these objects are used to describe the format of the buffers that are used in transforming color data.
+This is used to initialize a gsicc\_bufferdesc\_t object. Two of these objects are used to describe the format of the source and destination buffers when transforming a buffer of color values.
 \end{minipage}\\
 \\
 
-\noindent gsicc\_link\_t* {\bf gsicc\_get\_link}(gs\_imager\_state * pis, gs\_color\_space  *input\_colorspace,
-                                               gs\_color\_space *output\_colorspace,
-                                               gsicc\_rendering\_param\_t *rendering\_params, gs\_memory\_t
-                                               *memory, bool include\_softproof);\\
+\begin{tabbing}
+\noindent gsicc\_link\_t* {\bf gsicc\_get\_link}(\=gs\_imager\_state * pis, gx\_device *dev, gs\_color\_space  *input\_colorspace,\\
+                                               \>gs\_color\_space *output\_colorspace,\\
+                                               \> gsicc\_rendering\_param\_t *rendering\_params
+                                               gs\_memory\_t
+                                               *memory);\\
+\end{tabbing}
 
 \begin{minipage}[h]{6.0in}
 This returns the link given the input color space, the output color space, and the rendering intent.   When the requester of the link is finished using the link, it should release the link.  When a link request is made, the Link Cache will use the parameters to compute a hash code.  This hash code is used to determine if there is already a link transform that meets the needs of the request.  If there is not a link present, the Link Cache will obtain a new one from the CMM (assuming there is sufficient memory), updating the cache.\\
 
-The linked hash code is a unique code that identifies the link for an input color space, an object type, a rendering intent and an output color space.  The operation that does the merging of these four pieces of information can easily be altered to ignore object type and/or rendering intent if so desired.\\
+The linked hash code is a unique code that identifies the link for an input color space, an object type, a rendering intent and an output color space.\\
 
-Note, that the output color space can be different than the device space.  This occurs for example, when we have a transparency blending color space that is different than the device color space.
+Note, that the output color space can be different than the device space.  This occurs for example, when we have a transparency blending color space that is different than the device color space.  If the output\_colorspace variable is NULL, then the ICC profile associated with dev will be used as the destination color space.
 \end{minipage}\\
 \\
 
-\noindent gsicc\_link\_t* {\bf gsicc\_get\_link\_profile}(gs\_imager\_state *pis, cmm\_profile\_t *gs\_input\_profile, cmm\_profile\_t *gs\_output\_profile, gsicc\_rendering\_param\_t *rendering\_params, gs\_memory\_t *memory, bool include\_softproof);\\
+\begin{tabbing}
+\noindent gsicc\_link\_t* {\bf gsicc\_get\_link\_profile}(\=gs\_imager\_state *pis, gx\_device *dev,\\
+\> cmm\_profile\_t *gs\_input\_profile, \\
+\> cmm\_profile\_t *gs\_output\_profile, \\
+\> gsicc\_rendering\_param\_t *rendering\_params,\\
+\> gs\_memory\_t *memory, bool devicegraytok);\\
+\end{tabbing}
 
 \begin{minipage}[h]{6.0in}
 This is similar to the above operation {\bf gsicc\_get\_link} but will obtain the link with profiles that are not member variables of the gs\_color\_space object.
@@ -425,10 +749,15 @@
 \end{minipage}\\
 \\
 
-\noindent int {\bf gsicc\_transform\_named\_color}(float tint\_value, byte *color\_name, uint name\_size, gx\_color\_value device\_values[], const gs\_imager\_state *pis, cmm\_profile\_t *gs\_output\_profile, gsicc\_rendering\_param\_t *rendering\_params, bool include\_softproof);\\
+\begin{tabbing}
+\noindent int {\bf gsicc\_transform\_named\_color}(\=float tint\_value, byte *color\_name, uint name\_size,\\
+\> gx\_color\_value device\_values[], const gs\_imager\_state *pis, \\
+\> gx\_device *dev, cmm\_profile\_t *gs\_output\_profile, \\
+\> gsicc\_rendering\_param\_t *rendering\_params);\\
+\end{tabbing}
 
 \begin{minipage}[h]{6.0in}
-This performs a transformation on the named color given a particular tint value return device\_values. 
+This performs a transformation on the named color given a particular tint value and returns device\_values.
 \end{minipage}\\
 \\
 
@@ -444,7 +773,7 @@
 
 \subsection{Interface of Ghostscript to CMM}
 
-Ghostscript interfaces to the CMM through a single file.  The file gsicc\_littlecms.c/h is a reference interface between littleCMS and Ghostscript.  If a new library is used (for example, if littleCMS is replaced with Windows ICM on a Windows platform (giving Windows color system (WCS) access on Vista or System 7)), the interface of these functions will remain the same, but internally they will need to be changed.  Specifically, the functions are as follows:\\
+Ghostscript interfaces to the CMM through a single file.  The file gsicc\_littlecms.c/h is a reference interface between littleCMS and Ghostscript.  If a new library is used (for example, if littleCMS is replaced with Windows ICM on a Windows platform (giving Windows color system (WCS) access on Vista, Windows 7 and Windows 8)), the interface of these functions will remain the same, but internally they will need to be changed.  Specifically, the functions are as follows:\\
 
 \singlespace
 
@@ -462,8 +791,10 @@
 \end{minipage}\\
 \\
 
-\noindent gcmmhprofile\_t {\bf gscms\_get\_profile\_handle\_mem}(unsigned char *buffer, unsigned int
-input\_size);\\
+\begin{tabbing}
+\noindent gcmmhprofile\_t {\bf gscms\_get\_profile\_handle\_mem}(\=unsigned char *buffer, \\
+\> unsigned int input\_size);\\
+\end{tabbing}
 
 \begin{minipage}[h]{6.0in}
 	This returns a profile handle for the profile contained in the specified buffer.
@@ -491,20 +822,28 @@
 \end{minipage}\\
 \\
 
-\noindent gcmmhlink\_t {\bf gscms\_get\_link}(gcmmhprofile\_t  lcms\_srchandle, gcmmhprofile\_t
-lcms\_deshandle, gsicc\_rendering\_param\_t
+\begin{tabbing}
+\noindent gcmmhlink\_t {\bf gscms\_get\_link}(\=gcmmhprofile\_t  lcms\_srchandle, gcmmhprofile\_t
+lcms\_deshandle, \\
+\> gsicc\_rendering\_param\_t
 *rendering\_params);\\
+\end{tabbing}
 
 \begin{minipage}[h]{6.0in}
 This is the function that obtains the linkhandle from the CMM.  The call {\bf gscms\_get\_link} is usually called from the Link Cache.  In the graphics library, calls are made to obtain links using {\bf gsicc\_get\_link}, since the link may already be available.  However, it is possible to use {\bf gscms\_get\_link} to obtain linked transforms outside the graphics library.  For example, this is the case with the XPS interpreter, where minor color management needs to occur to properly handle gradient stops.
 \end{minipage}\\
 \\
 
-\noindent gcmmhlink\_t {\bf gscms\_get\_link\_proof}(gcmmhprofile\_t  lcms\_srchandle, gcmmhprofile\_t
-lcms\_deshandle, gcmmhprofile\_t lcms\_proofhandle, gsicc\_rendering\_param\_t *rendering\_params);\\
+\begin{tabbing}
+\noindent gcmmhlink\_t {\bf gscms\_get\_link\_proof\_devlink}(\=gcmmhprofile\_t  lcms\_srchandle,\\
+\> gcmmhprofile\_t lcms\_proofhandle,\\
+\> gcmmhprofile\_t lcms\_deshandle,\\
+\> gcmmhprofile\_t lcms\_devlinkhandle,\\
+\> gsicc\_rendering\_param\_t *rendering\_params);\\
+\end{tabbing}
 
 \begin{minipage}[h]{6.0in}
-This function is similar to the above function but includes a proofing ICC profile.   If the proofing profile is defined, then the output should appear as if it were printed on the device defined by the proofing profile.
+This function is similar to the above function but includes a proofing ICC profile and/or a device link ICC profile in the calculation of the link transform.  See Section \ref{sec:proof_link}.
 \end{minipage}\\
 \\
 
@@ -515,38 +854,51 @@
 \end{minipage}\\
 \\
 
-\noindent void {\bf gscms\_transform\_color\_buffer}(gsicc\_link\_t *icclink, gsicc\_bufferdesc\_t
-*input\_buff\_desc,  gsicc\_bufferdesc\_t
-*output\_buff\_desc, void *inputbuffer, void *outputbuffer);\\
+\begin{tabbing}
+\noindent void {\bf gscms\_transform\_color\_buffer}(\=gx\_device *dev, gsicc\_link\_t *icclink, \\
+\> gsicc\_bufferdesc\_t *input\_buff\_desc,  \\
+\> gsicc\_bufferdesc\_t *output\_buff\_desc, \\
+\> void *inputbuffer, void *outputbuffer);\\
+\end{tabbing}
 
 \begin{minipage}[h]{6.0in}
-This is the function through which all color transformations will occur if they are to go through the CMM.  This function will be called in the code anytime that we are transforming color from the current graphic state color to the Output Device color space or to the Blending Color Space, or out of the Blending color space to the Color Space of the parent layer in the transparency stack.  Note that if the source hash code and the destination hash code are the same, the transformation will not occur as the source and destination color spaces are identical.  This feature can be used to enable ``device colors'' to pass unmolested through the color processing.
+This is the function through which all color transformations on chunks of data will occur.    Note that if the source hash code and the destination hash code are the same, the transformation will not occur as the source and destination color spaces are identical.  This feature can be used to enable ``device colors'' to pass unmolested through the color processing.  Note that a pointer to this function is stored in a member variable of Ghostscript's ICC link structure (gsicc\_link\_t.procs.map\_buffer).
 \end{minipage}\\
 \\
 
-\noindent void {\bf gscms\_transform\_color}(gsicc\_link\_t *icclink,  void *inputcolor, void
-*outputcolor, int num\_bytes, void **contextptr);\\
+\begin{tabbing}
+\noindent void {\bf gscms\_transform\_color}(\=gx\_device *dev, gsicc\_link\_t *icclink,  void *inputcolor, \\
+\> void *outputcolor, int num\_bytes);\\
+\end{tabbing}
 
 \begin{minipage}[h]{6.0in}
-This is a special case where we desire to transform a single color.  While it would be possible to use {\bf gscms\_transform\_color\_buffer} for this operation, single color transformations are frequently required and it is possible that the CMM may have special optimized code for this operation.
+This is a special case where we desire to transform a single color.  While it would be possible to use {\bf gscms\_transform\_color\_buffer} for this operation, single color transformations are frequently required and it is possible that the CMM may have special optimized code for this operation.  Note that a pointer to this function is stored in a member variable of Ghostscript's ICC link structure (gsicc\_link\_t.procs.map\_color).
 \end{minipage}\\
 \\
 
-\noindent int {\bf gscms\_transform\_named\_color}(gsicc\_link\_t *icclink,  float tint\_value, const char*\\
-    ColorName,  gx\_color\_value device\_values[] );\\
+\begin{tabbing}
+\noindent int {\bf gscms\_transform\_named\_color}(\=gsicc\_link\_t *icclink,  float tint\_value, \\
+\> const char* ColorName,  gx\_color\_value device\_values[] );\\
+\end{tabbing}
 
 \begin{minipage}[h]{6.0in}
-Get a device value for the named color.  While there exist named color ICC profiles and littleCMS supports them, the code in gsicc\_littlecms.c is not designed to use that format.   The named color object need not be an ICC named color profile but can be a proprietary type table. This is discussed further where -sNamedProfile is defined in the Usage section.
+ This function obtains a device value for the named color.  While there exist named color ICC profiles and littleCMS supports them, the code in gsicc\_littlecms.c is not designed to use that format.   The named color object need not be an ICC named color profile but can be a proprietary type table. This is discussed further where -sNamedProfile is defined in the Usage section.
 \end{minipage}\\
 \\
 
-\noindent void {\bf gscms\_get\_name2device\_link}(gsicc\_link\_t *icclink, gcmmhprofile\_t
-lcms\_srchandle, gcmmhprofile\_t lcms\_deshandle, gcmmhprofile\_t lcms\_proofhandle,
-gsicc\_rendering\_param\_t *rendering\_params, gsicc\_manager\_t *icc\_manager);\\
+\begin{tabbing}
+\noindent void {\bf gscms\_get\_name2device\_link}(\=gsicc\_link\_t *icclink, gcmmhprofile\_t
+lcms\_srchandle, \\
+\> gcmmhprofile\_t lcms\_deshandle, \\
+\> gcmmhprofile\_t lcms\_proofhandle,\\
+\> gsicc\_rendering\_param\_t *rendering\_params, \\
+\> gsicc\_manager\_t *icc\_manager);\\
+\end{tabbing}
 
 \begin{minipage}[h]{6.0in}
 This is the companion operator to {\bf gscms\_transform\_named\_color} in that it provides the link transform that should be used when transforming named colors when named color ICC profiles are used for named color management.  Since {\bf gscms\_transform\_named\_color} currently is set up to use a non-ICC table format, this function is not used.
 \end{minipage}\\
+\\
 
 \noindent gcmmhprofile\_t {\bf gscms\_get\_profile\_handle\_file}(const char *filename);\\
 
@@ -573,43 +925,110 @@
 Get the color space type associated with the profile.
 \end{minipage}\\
 
+\noindent int {\bf gscms\_get\_channel\_count}(gcmmhprofile\_t profile);\\
+
+\begin{minipage}[h]{6.0in}
+Return the number of colorants or primaries associated with the profile.
+\end{minipage}\\
+
+\noindent int {\bf gscms\_get\_pcs\_channel\_count}(gcmmhprofile\_t profile);\\
+
+\begin{minipage}[h]{6.0in}
+Get the channel count for the profile connection space.  In general this will be three but could be larger for device link profiles.
+\end{minipage}\\
+
 \singlespace
 
-\section{PDF and PS CIE color space handling}
+\section{ICC Color, the Display List and Multi-Threaded Rendering}
+
+Ghostscript's display list is referred to the c-list (command list).  Using the option\\ -dNumRenderingThreads=$X$, it is possible to have Ghostscript's c-list rendered with $X$ threads.  In this case, each thread will simultaneously render different horizontal bands of the page.  When a thread completes a band, it will move on to the next one that has not yet been started or completed by another thread.
+Since color transformations are computationally expensive, it makes sense to perform these operations during the multi-threaded rendering.  To achieve this, ICC profiles can be stored in the c-list and the associated color data stored in the c-list in its original source space.
 
-If a color space is a PDF or PostScript (PS) CIE color space type (other than ICC), these color spaces are converted to appropriate ICC objects.  The profiles are created by the functions in gsicc\_create.c.   Since this file is only needed by the PS and PDF interpreter, it is contained in the psi subdirectory of Ghostscript's folder tree and is not needed for PCL or XPS builds.  
+Vector colors are typically passed into the c-list in their destination color space, which is to say that they are already converted through the CMM.  Images however are not necessarily pre-converted but are usually put into the c-list in their source color space.  In this way, the more time consuming color conversions required for images occurs during the multi-threaded rendering phase of the c-list list.  Transparency buffers also require extensive color conversions.  These buffers are created during the c-list rendering phase and will thus benefit from having their color conversions occur during the multi-threaded rendering process.
 
-Performing this conversion, enables the ICC based CMM full control over all color management.  To avoid frequent conversions due to frequent color space changes, these color spaces are cached in the profile cache and indexed using a value related to their resource IDs.  This is the profile cache object that is indicated in Figure \ref{fig:ICC_ARCH}.  In PDF, it is possible to define CIELAB color values directly.  The ICC profile lab.icc contained in iccprofiles of Figure \ref{fig:ICC_ARCH} is used as the source ICC profile for color defined in this manner.
+\section{PDF and PS CIE color space handling}
 
-Currently PostScript color rendering dictionaries (CRDs) are ignored if defined in the current code.  Instead, a device ICC profile should be used to define the color for the output device.  An upcoming change will be to convert CRDs to equivalent ICC profiles, which will then work with the existing workflow.
+One feature of Ghostscript is that all color conversions can be handled by the external CMM.  This enables more consistent specialized rendering based upon object type and rendering intents.  Most CMMs cannot directly handle CIE color spaces defined in PostScript or the CalGray and CalRGB color spaces defined in PDF.  Instead most CMMs are limited to handling only ICC-based color conversions.  To enable the handling of the non ICC-based color spaces, Ghostscript converts these to equivalent ICC forms.   The profiles are created by the functions in gsicc\_create.c.
 
-Note that if littleCMS is replaced, gsicc\_create.c still requires icc34.h, since it uses the type definitions in that file in creating the ICC profiles from the PS and PDF CIE color spaces.
+PostScript color spaces can be quite complex, including functional mappings defined by programming procedures.  Representing these operations can require a sampling of the 1-D procedures.  Sampling of functions can be computationally expensive if the same non-ICC color space is repeatedly encountered.  To address this issue, the equivalent ICC profiles are cached and a resource id is used to detect repeated color space settings within the source document when possible.
+The profiles are stored in the profile cache indicated in Figure \ref{fig:ICC_ARCH}.  In PDF, it is possible to define CIELAB color values directly.  The ICC profile lab.icc contained in iccprofiles of Figure \ref{fig:ICC_ARCH} is used as the source ICC profile for color defined in this manner.
 
-\section{Device Interaction}
+Currently PostScript color rendering dictionaries (CRDs) are ignored.  Instead, a device ICC profile should be used to define the color for the output device.  There is currently an enhancement request to enable the option of converting CRDs to equivalent ICC profiles.
 
-From Figure \ref{fig:ICC_ARCH}, it is clear that the device can communicate to the graphics library its ICC profiles.  Depending upon the settings of the device (e.g. paper type, ink, driver settings) it may provide a different profile as well as indicate a desired rendering intent.  Unless overridden by command line arguments, this information will be used to populate the ICC manager's Device Profile. Currently, this interaction is under development and should be in place with the official release of Ghostscript 9.0.
+Note that gsicc\_create.c requires icc34.h, since it uses the type definitions in that file in creating the ICC profiles from the PS and PDF CIE color spaces.
 
 \section{DeviceN and Separation colors}
 
-DeviceN and Separation colors are handled differently depending upon the source PDL that is being processed.  In Microsoft's XPS format, all input DeviceN or Separation type colors are required to have an associated ICC profile.  If one is not provided, then per the XPS specification\cite{XPS} a SWOP CMYK profile is assumed for the first four colorants and the remaining colorants are ignored. With PDF DeviceN or Separation colors, the document defines a tint transform and an alternate color space, which could be any of the CIE (e.g. CalGray, CalRGB, Lab, ICC) or device (e.g. Gray, RGB, CMYK) color spaces.  If the input source document is PDF or PS and the output device does not understand the colorants defined in the DeviceN color space, then the colors will be transformed to the alternate color space and color managed from there.
+\subsection{Spot Colors}
 
-For cases when the device {\bf does} understand the spot colorants of the DeviceN color space, the preferred handling of DeviceN varies.  Many prefer to color manage the CMYK components with a defined CMYK profile, while the other spot colorants pass through unmolested. This will be the default manner by which Ghostscript will handle DeviceN input colors.  In other words, if the device profile is set to a particular CMYK profile, and the output device is a separation device, which can handle all spot colors, then the CMYK process colorants will be color managed, but the other colorants will not be managed.  If it is desired that the CMYK colorants not be altered also, it will be possible to achieve this by having the source and destination ICC profiles the same.  This will result in an identity transform, which will not be used when processing the CMYK colorants.
+Spot colors, which are sometimes referred to as named colors, are colorants that are different than the standard cyan, magenta, yellow or black colorants.  Spot colors are commonly used in the printing of labels or for special corporate logos for example.  In PostScript and PDF documents, color spaces associated with spot colors are referred to as separation color spaces.  The ICC format defines a structure for managing spot colors called a named color profile.  The structure consists of a table of names with associated CIELAB values for 100 percent tint coverage.  In addition, the table can contain optional CMYK device values that can be used to print the same color as the spot color.  In practice, these profiles are rarely used and instead the proofing of spot colors with CMYK colors is often achieved with proprietary mixing models.  The color architecture of Ghostscript enables the specification of a structure that contains the data necessary for these mixing models.  When a fill is to be made with a color in a separation color space, a call is made passing along the tint value, the spot color name and a pointer to the structure so that the proprietary function can return the device values to be used for that particular spot color.  If the function cannot perform the mapping, then a NULL valued pointer is returned for the device values, in which case the alternate tint transform specified in the PDF or PS content is used to map the spot tint color.
+
+\subsection{DeviceN Colors}
+
+DeviceN color spaces are defined to be spaces consisting of a spot color combined with one or more additional colorants. A DeviceN color space can be handled in a similar proprietary fashion as spot colors if desired.
+ The details of this implementation are given in Section \ref{sec:devn}.  Ghostscript also provides an ICC-based approach for handling DeviceN source colors.  In this approach, xCLR ICC source profiles can be provided to Ghostscript upon execution through the command line interface using -sDeviceNProfile.  These profiles describe how to map from DeviceN tint values to CIELAB values.  The profiles must include the colorantTableTag.  This tag is used to indicate the colorant names and the lay-down order of the inks.  The colorant names are associated with the colorant names in a DeviceN color space when it is encountered.  If a match is found, the xCLR ICC profile will be used to characterize the source DeviceN colors.  Note that the colorant orders specified by the names may be different in the source profile, necessitating the use of a permutation of the DeviceN tint values prior to color management.  An overview of the process is shown in Figure \ref{fig:DeviceN}.  The directory ./gs/toolbin/color/icc\_creator contains a Windows application for creating these DeviceN source ICC profiles.  Refer to the README.txt file for details and for an example.
+
+\begin{figure}
+    \begin{center}
+  %  \leavevmode \epsfysize=3.0in
+\includegraphics*[width=5.5in]{figures/DeviceN_Figure1.pdf}
+    \end{center}
+   \caption{Flow for use of xCLR source profiles to define DeviceN color in PDF and PS source files }
+    \label{fig:DeviceN}
+\end{figure}
+
+In Microsoft's XPS format, all input DeviceN and Separation type colors are required to have an associated ICC profile.  If one is not provided, then per the XPS specification\cite{XPS} a SWOP CMYK profile is assumed for the first four colorants and the remaining colorants are ignored. With PDF DeviceN or Separation colors, the document defines a tint transform and an alternate color space, which could be any of the CIE (e.g. CalGray, CalRGB, Lab, ICC) or device (e.g. Gray, RGB, CMYK) color spaces.  If the input source document is PDF or PS and the output device does not understand the colorants defined in the DeviceN color space, then the colors will be transformed to the alternate color space and color managed from there assuming an external xCLR ICC profile was not specified as described above.
+
+For cases when the device {\bf does} understand the spot colorants of the DeviceN color space, the preferred handling of DeviceN varies.  Many prefer to color manage the CMYK components with a defined CMYK profile, while the other spot colorants pass through unmolested. This is the default manner by which Ghostscript handles DeviceN input colors.  In other words, if the device profile is set to a particular CMYK profile, and the output device is a separation device, which can handle all spot colors, then the CMYK process colorants will be color managed, but the other colorants will not be managed.  If it is desired that the CMYK colorants not be altered also, it is possible to achieve this by having the source and destination ICC profiles the same.  This will result in an identity transform for the CMYK colorants.
 
 It should be noted that an ICC profile can define color spaces with up to 15 colorants.  For a device that has 15 or fewer colorants, it is possible to provide an ICC profile for such a device.  In this case, all the colorants will be color managed through the ICC profile.  For cases beyond 15, the device will be doing direct printing of the DeviceN colors outside of the 15 colorants.
 
-\section{PCL and XPS Support}
+\subsection{DeviceN and Spot Color Customization}
+\label{sec:devn}
+
+In earlier versions of Ghostscript, there existed a compile define named \\
+CUSTOM\_COLOR\_CALLBACK, which provided developers with a method to intercept color conversions and provide customized processing in particular for Separation and DeviceN input color spaces.  Using specialized mixing models in place of the standard tint transforms, accurate proofing of the spot colorants was obtainable.  An interface for custom handling of separation colors is now performed by customization of the function gsicc\_transform\_named\_color.  An example, implementation is currently in place, which uses a look-up-table based upon the colorant name.  The look-up-table is stored in the device\_named object of the icc manager.  The structure can be stored in the location using \textcolor{red}{-sNamedProfile = c:/my\_namedcolor\_stucture}.
 
-PCL\cite{PCL} makes use of the new color management architecture primarily in its output devices.  Source colors are specified to be in the sRGB color space.  If the commands in the PCL file require rendering into an RGB buffer due to blending of transparency operations, then these buffers will be converted to the appropriate CMYK color space using the CMM, when the drawing commands have completed in that region.  If the commands do not require rendering into a continuous tone RGB buffer, then the conversion from RGB to CMYK will occur prior to rendering into a halftone CMYK buffer.
+DeviceN color handling is defined by an object stored in the device\_n entry of the icc\_manager.  Currently, the example implementation is to use an array of ICC profiles that describe the mixing of the DeviceN colors of interest.  This array of profiles is contained in the device\_n entry of the icc\_manager.  In this case, a multi-dimensional look-up-table is essentially used to map the overlayed DeviceN colors to the output device colorants.
 
-Full ICC support for XPS\cite{XPS} is now contained in ghostxps. This includes the handling of profiles for DeviceN color spaces, Named colors and for profiles embedded within images.
+If a mathematical mixing model is to be used for the DeviceN colors instead of an ICC-based approach, it will be necessary to store the data required for mixing either in the device\_n entry or, if the same data is used for separation colors, the data in the named\_color location can be used.  In either case, a single line change will be required in {\bf gx\_install\_DeviceN} where a call is currently made to {\bf gsicc\_finddevicen} to locate a matching DeviceN ICC profile for DeviceN color management.  In place of this call, it will be necessary to make a call to a function that will prepare an object that can map colors in this DeviceN space to the real device values.  A pointer to this object is then returned by the function.  If the colorants cannot be handled, the function should return NULL.  If the function can handle the colorants, then when the link request is made between this color space and the output device profile with the function {\bf gsicc\_get\_link} it will be necessary to populate the procs of Ghostscript's link structure with the proper pointers to functions that will use the link and transform the colors.  The procedure structure, which is a member variable of gsicc\_link\_t is defined in gscms.h and given as\\
 
-\section{CUSTOM\_COLOR\_CALLBACK developers}
+\noindent typedef struct gscms\_procs\_s \{
 
-In earlier versions of Ghostscript, there existed a compile define named CUSTOM\_COLOR\_CALLBACK, which provided developers with a method to intercept color conversions and provide customized processing in particular for Separation and DeviceN input color spaces.  Using specialized mixing models in place of the standard tint transforms, accurate proofing of the spot colorants was obtainable.  An interface for custom handling of separation colors is now performed by customization of the function gsicc\_transform\_named\_color.  An example, implementation is currently in place, which uses a look-up-table based upon the colorant name.  The look-up-table is stored in the device\_named object of the icc manager.  The structure can be stored in the location using \textcolor{red}{-sNamedProfile = c:/my\_namedcolor\_stucture}.
+\begin{tabular}{lll}
+  & gscms\_trans\_buffer\_proc\_t map\_buffer;   & 	\textcolor{green}{/* Use link to map buffer */}  \\
+  & gscms\_trans\_color\_proc\_t  map\_color;   & 	\textcolor{green}{/* Use link to map single color */}   \\
+  & gscms\_link\_free\_proc\_t free\_link    &	 \textcolor{green}{/* Free link */}    \\
+\end{tabular}
+
+\noindent  \} gscms\_procs\_t;\\
+
+For the CMM that is interfaced with Ghostscript, these procedures are populated with\\
+
+\noindent map\_buffer = gscms\_transform\_color\_buffer;\\
+map\_color = gscms\_transform\_color;\\
+free\_link = gscms\_release\_link;\\
+
+Assuming the DeviceN color manager can handle the DeviceN color space, when it returns the opaque link handle, which is assigned to the link\_handle member variable of gsicc\_link\_t, the above procs should be populated with the procedures that will actually make use of the link.  For example,\\
+
+\noindent map\_buffer = devn\_transform\_buffer;\\
+map\_color = devn\_transform\_color;\\
+free\_link = devn\_release\_link;\\
+
+In this case, the graphics library will make the appropriate calls when it is making use of the link.  As an example template, The unmanaged color option -dUseFastColor makes use of this approach to provide ``links'' that use special mapping procedures where\\
+
+\noindent map\_buffer = gsicc\_nocm\_transform\_color\_buffer;\\
+map\_color = gsicc\_nocm\_transform\_color;\\
+free\_link = gsicc\_nocm\_freelink;\\
+
+In this way, the fact that unmanaged color is occurring is opaque to Ghostscript.   Similarly, the use of special mixing model links for DeviceN color would be unknown to Ghostscript with this approach and requires nothing more than the minor interface procedure settings (as well as the actual code to compute the mixing result).
+
+
+\section{PCL and XPS Support}
 
-DeviceN color handling is defined by an object stored in the device\_n entry of the icc\_manager.  Currently, the example implementation is to use an array of ICC profiles that describe the mixing of the DeviceN colors of interest.  This array of profiles is contained in the device\_n entry of the icc\_manager.  In this case, a multi-dimensional look-up-table is essentially used to map the overlayed DeviceN colors to the output device colorants.  
+PCL\cite{PCL} makes use of the new color management architecture primarily through the output device profiles as source colors are typically specified to be in the sRGB color space.
 
-If a mathematical mixing model is to be used for the DeviceN colors instead of an ICC-based approach, it will be necessary to store the data required for mixing either in the device\_n entry or, if the same data is used for separation colors, the data in the named\_color location can be used.  In either case, a single line change will be required in {\bf gx\_install\_DeviceN} where a call is currently made to {\bf gsicc\_finddevicen} to locate a matching DeviceN ICC profile for DeviceN color management.  In place of this call, it will be necessary to make a call to a function that will prepare an object that can map colors in this DeviceN space to the real device values.  A pointer to this object is then returned by the function.  If the colorants cannot be handled, the function should return NULL.  If the function can handle the colorants, then when the link request is made between this color space and the output device profile with the function {\bf gsicc\_get\_link} it will be necessary to detect that the source object is not a standard ICC profile but a special customized object.  This may require the addition of a special flag in the cmm\_profile\_t structure.  This flag would then be checked to determine if a call should be made to the CMM or to a custom color management function that makes use of the pointer previously obtained from {\bf gsicc\_finddevicen}. When the call is made to apply the transformation using {\bf gscms\_transform\_color\_buffer} or {\bf gscms\_transform\_color}, the appropriate operation should be applied to the incoming data in place of the standard call to the CMM.  Artifex will be able to assist those developers who need help in the transition from the previous CUSTOM\_COLOR\_CALLBACK architecture to the new design.
+Full ICC support for XPS\cite{XPS} is contained in ghostxps. This includes the handling of profiles for DeviceN color spaces, Named colors and for profiles embedded within images.
 
 \begin{thebibliography}{99}
 
@@ -628,7 +1047,7 @@
 \end{thebibliography}
 
 \vspace*{1.25in}
-Copyright (c) 2010, Artifex Software Inc. All rights reserved.
+Copyright (c) 2011, Artifex Software Inc. All rights reserved.
 
 
 \end{document}
diff -Nru ghostscript-9.04~dfsg/doc/History9.htm ghostscript-9.05~dfsg~20120125/doc/History9.htm
--- ghostscript-9.04~dfsg/doc/History9.htm	2011-08-05 11:12:21.000000000 +0000
+++ ghostscript-9.05~dfsg~20120125/doc/History9.htm	2011-09-29 11:01:34.000000000 +0000
@@ -82,13 +82,13 @@
 
  • Transition source base to git source control - not a big deal for most users, -but an important change for those develop Ghostscript and GhostPDL. +but an important change for those who develop Ghostscript and GhostPDL.

  • This release introduces flexibility for controlling color based upon the graphic object type. In particular, it is now possible to specify unique -output ICC profiles and rendering intents for vector graphic, image and tex +output ICC profiles and rendering intents for vector graphic, image and text portions of a document. It is also possible to override source color specifications and use specified ICC profiles and rendering intents for RGB and CMYK vector graphics, images and text portions of a document. Finally, @@ -98,7 +98,7 @@
  • New tiffscaled8 and tiffscaled24 devices. Add new tiffscaled8 and tiffscaled24 -devices, copied and modified from tiffscaled. These output greyscale and 24bit rgb +devices, copied and modified from tiffscaled. These output grayscale and 24bit rgb instead of tiffscaleds mono output. MinFeatureSize is ignored for these devices as it's meaningless for contone output. Downscaling is also now supported for png16m and pnggray, and a new pngmonod device has been implemented which uses grayscale @@ -106,7 +106,7 @@

  • -The PDF interpreter will now try continue interpreting a PDF after encountering +The PDF interpreter will now try to continue interpreting a PDF after encountering an error in a stream. The previous bevahior can be reinstated by passing -dPDFSTOPONERROR to Ghostscript.
  • @@ -182,7 +182,7 @@ change is that ghostscript will now be able to cope with accessing files with unicode characters (i.e. codes >= 256) in their pathnames. -

    This behaviour is all completely transparent to users, with the exception +

    This behavior is all completely transparent to users, with the exception of those calling the gsapi functions with strings including 'extended ascii' (i.e. characters with codes >= 128 and <= 255). These characters include accented latin characters, such as u + umlaut, a + grave etc. diff -Nru ghostscript-9.04~dfsg/doc/Install.htm ghostscript-9.05~dfsg~20120125/doc/Install.htm --- ghostscript-9.04~dfsg/doc/Install.htm 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/doc/Install.htm 2012-01-07 20:18:22.000000000 +0000 @@ -252,13 +252,13 @@

    -The actual executable files, in the gs#.##\bin +The actual executable files for the 32-bit Windows install, in the gs#.##\bin subdirectory, are:

    GSWIN32C.EXE   - Ghostscript as a command line Windows program. + Ghostscript as a 32-bit Windows command line program. This is usually the preferred executable.
    GSWIN32.EXE   @@ -270,6 +270,24 @@

    +For the 64-bit Windows install, also in the gs#.##\bin +subdirectory, they are: + +

    +
    GSWIN64C.EXE +   + Ghostscript as a 64-bit Windows command line program. + This is usually the preferred executable. +
    GSWIN64.EXE +   + 64-bit Ghostscript using its own window for commands +
    GSDLL64.DLL +   + 64-bit dynamic link library containing most of Ghostscript's +functionality +
    + +

    See "Using fonts from Adobe Type Manager" below for information about using Adobe Type Manager, Adobe Type Basics, or Adobe Acrobat fonts. If your system uses TrueType fonts, you can get them diff -Nru ghostscript-9.04~dfsg/doc/Language.htm ghostscript-9.05~dfsg~20120125/doc/Language.htm --- ghostscript-9.04~dfsg/doc/Language.htm 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/doc/Language.htm 2011-11-21 08:55:19.000000000 +0000 @@ -2181,31 +2181,6 @@ The topological grid fitting is a new original Ghostscript method. -

    -
    UseWTS <boolean> -
    If true, and if AccurateScreens are specified (either as -a user parameter, or as a type 1 halftone dictionary parameter), then -the Well Tempered Screening algorithm is used for -halftoning. Otherwise, a rational tangent algorithm is chosen, which -will typically result in significant differences between the screen -angle and ruling requested, and actually rendered. Currently, the -performance of WTS is reasonably good when rendering to a full page -buffer, but not optimized for banded mode. Thus, when using WTS, -disable banding (setting --dMaxBitmap=500000000 should work). In a future -version, WTS will be optimized for banded mode, and -UseWTS will be true by default. - -

    -Note: Currently, UseWTS can only be set using -the PostScript user parameters mechanism, not on the command line with -a -d switch. Use this code to enable it: - -

    -<< /UseWTS true >> setuserparams
    -
    -
    -

    Miscellaneous additions

    diff -Nru ghostscript-9.04~dfsg/doc/Make.htm ghostscript-9.05~dfsg~20120125/doc/Make.htm --- ghostscript-9.04~dfsg/doc/Make.htm 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/doc/Make.htm 2012-01-25 08:44:24.000000000 +0000 @@ -398,7 +398,25 @@ and wish the compile them into Ghostscript, the build system expects them to be in directories named luratech/ldf_jb2 and luratech/lwf_jp2 in the top level gs source directory, alongside -the other third-party libraries. +the other third-party libraries. With the Luratech source directories in the +expected place, the build system will automatically include them. +

    +If you have the Luratech code but wish to build without it, on "configure" +based builds you can acheive this by doing: +
    +

    +./configure --without-luratech +
    +

    +On Windows, you can acheive it by adding: +
    +

    +NO_LURATECH=1 +
    +to your nmake command line. +

    +With either of these options, the build will fall back to the defaults for +both JBIG2 and JPEG2000 decoding.


    @@ -1491,7 +1509,13 @@ to rasterize postscript and pdf to image files, and convert between the high-level formats supported by Ghostscript. See the instructions for the unix build below for details of how to customize this build. - +

    +NOTE: If you have MacPorts (http://www.macports.org/) installed, it can +"confuse" the configure script because it includes some librares which +duplicate the "system" ones. This can cause missing symbol link errors. +In order to resolve this, you can do: LDFLAGS="-L/usr/lib" ./configure. +That will force the linker to search the default directory first, and thus pick +up the system libraries first.

    There is also a support for building Ghostscript as a framework. This is a special encapsulated shared library format specific to MacOS X. To build diff -Nru ghostscript-9.04~dfsg/doc/News.htm ghostscript-9.05~dfsg~20120125/doc/News.htm --- ghostscript-9.04~dfsg/doc/News.htm 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/doc/News.htm 2011-09-29 11:01:34.000000000 +0000 @@ -74,13 +74,13 @@

    • Transition source base to git source control - not a big deal for most users, -but an important change for those develop Ghostscript and GhostPDL. +but an important change for those who develop Ghostscript and GhostPDL.

    • This release introduces flexibility for controlling color based upon the graphic object type. In particular, it is now possible to specify unique -output ICC profiles and rendering intents for vector graphic, image and tex +output ICC profiles and rendering intents for vector graphic, image and text portions of a document. It is also possible to override source color specifications and use specified ICC profiles and rendering intents for RGB and CMYK vector graphics, images and text portions of a document. Finally, @@ -90,7 +90,7 @@
    • New tiffscaled8 and tiffscaled24 devices. Add new tiffscaled8 and tiffscaled24 -devices, copied and modified from tiffscaled. These output greyscale and 24bit rgb +devices, copied and modified from tiffscaled. These output grayscale and 24bit rgb instead of tiffscaleds mono output. MinFeatureSize is ignored for these devices as it's meaningless for contone output. Downscaling is also now supported for png16m and pnggray, and a new pngmonod device has been implemented which uses grayscale @@ -98,7 +98,7 @@

    • -The PDF interpreter will now try continue interpreting a PDF after encountering +The PDF interpreter will now try to continue interpreting a PDF after encountering an error in a stream. The previous bevahior can be reinstated by passing -dPDFSTOPONERROR to Ghostscript.
    • @@ -174,7 +174,7 @@ change is that ghostscript will now be able to cope with accessing files with unicode characters (i.e. codes >= 256) in their pathnames. -

      This behaviour is all completely transparent to users, with the exception +

      This behavior is all completely transparent to users, with the exception of those calling the gsapi functions with strings including 'extended ascii' (i.e. characters with codes >= 128 and <= 255). These characters include accented latin characters, such as u + umlaut, a + grave etc. diff -Nru ghostscript-9.04~dfsg/doc/Ps2pdf.htm ghostscript-9.05~dfsg~20120125/doc/Ps2pdf.htm --- ghostscript-9.04~dfsg/doc/Ps2pdf.htm 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/doc/Ps2pdf.htm 2012-01-25 08:44:24.000000000 +0000 @@ -39,8 +39,7 @@ -

      For other information, see the Ghostscript -overview. +

      For other information, see the Ghostscript overview. @@ -131,6 +130,19 @@ different name, you must set GSC to the name of the executable. +

      +Ordinarily a single PDF file will be written that includes all input files + (concatenated), but if the OutputFile is changed then the current pages +will be written and a new PDF file will be started. +

      +Note that the OutputFile will always be written, and if there is no (further) +input the file will be a single blank page. +

      +Also, if the OutputFile (or -o outputfile specification) contains a +format specifier then there will be +one extra (blank page) file created as a result. + +


      Setting page orientation

      @@ -885,8 +897,8 @@
      • Specify the pdfwrite device or use the ps2pdf script.
      • Specify the -dPDFA option. -
      • Specify -sProcessColorModel=DeviceGray or -sProcessColorModel=DeviceCMYK - (DeviceRGB is not allowed). You must specify a ProcessColorModel, even if you plan +
      • Specify -sProcessColorModel=DeviceGray, -sProcessColorModel=DeviceRGB or -sProcessColorModel=DeviceCMYK + You must specify a ProcessColorModel, even if you plan to create a device-independent colour PDF file using -dUseCIEColor.
      • Specify the -dUseCIEColor option if necessary (see PDF/X above).
      • Specify a PDF/A definition file before running the input document. diff -Nru ghostscript-9.04~dfsg/doc/Ps2ps2.htm ghostscript-9.05~dfsg~20120125/doc/Ps2ps2.htm --- ghostscript-9.04~dfsg/doc/Ps2ps2.htm 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/doc/Ps2ps2.htm 2012-01-25 08:44:24.000000000 +0000 @@ -215,6 +215,11 @@ Only use with printers which can handle random PageSize. Must be false if -dRotatePages=true, -dCenterPages=true or -dFitPages=true. +
        -dDoNumCopies=boolean. +
        The PostScript emitted by ps2write will try to use copypage to create the number of copies originally requested. Note that this relies on the level 2 semantics for copypage +and will not reliably work on language level 3 devices (such as Ghostscript itself). +Defaults to false. This flag is not compatible with the ProduceDSC flag which will take precedence if set. +

        diff -Nru ghostscript-9.04~dfsg/doc/thirdparty.htm ghostscript-9.05~dfsg~20120125/doc/thirdparty.htm --- ghostscript-9.04~dfsg/doc/thirdparty.htm 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/doc/thirdparty.htm 2012-01-25 08:44:24.000000000 +0000 @@ -0,0 +1,475 @@ + + + + + +Third Party Libraries Used by Ghostscript and GhostPDL + + + + + + + + + + + +

        Third Party Libraries Used by +
        +Ghostscript and GhostPDL

        + + + + + + + + + +

        +The table below details the third party libraries that Ghostscript and/or +GhostPDL include, the versions QA tested and shipped with our releases, +the relevant license, and the "upstream" URL. +

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +Library Name + +Version + +Function + +License + +URL +
        +CUPS +
        +(GPL Release Only) +
        +2.8.0 + +CUPS raster format output + +GPL Version 3 + +http://www.cups.org/ +
        +eXpat + +2.0.1 + +XML parsing for XPS interpreter + +MIT/eXpat License + +http://expat.sourceforge.net/ +
        +FreeType + +2.4.3 + +Font scaling and rendering for Ghostscript + +FreeType License +
        +(BSD-style license with a credit clause) +
        +http://www.freetype.org/ +
        +jbig2dec + +0.11 + +JBIG2 decoding for the PDF interpreter + +Licensed with Ghostscript/GhostPDL +
        +(copyright owned by Artifex) +
        +http://www.ghostscript.com/ +
        +libjpeg + +8.3 +
        +with patches +
        +JPEG/DCT decoding/encoding + +"Free" +
        +Can be used in commercial applications without royalty, with acknowledgement. +
        +http://www.ijg.org/ +
        +jpegxr +
        +(JPEG XR reference software) +
        +1.8 + +HDPhoto/JPEG-XR image decoding for the XPS interpreter. + +ITU/ISO/IEC "Free" Licence +
        +Reference implementation +
        +http://www.itu.int/rec/T-REC-T.835 +
        +LittleCMS 2 +
        +(lcms2) +
        +2.03 +
        +with patches +
        +ICC profile based color conversion and management + +MIT LICENSE + +http://www.littlecms.com/ +
        +libpng + +1.2.42 + +PNG image encoding/decoding. + +libpng license +
        +classified as "a permissive free software license" +
        +http://www.libpng.org/ +
        +OpenJPEG + +1.4.0 +
        +with patches backported from OpenJPEG development tree +
        +JPEG2000 image decoding for the PDF interpreter + +BSD-style + +http://www.openjpeg.org/ +
        +libtiff + +3.9.2 + +TIFF image encoding/decoding + +BSD-style + +http://www.remotesensing.org/libtiff/ +
        +zlib + +1.2.3 + +(De)Flate compression. + +zlib License +
        +classified as "a permissive free software license" +
        +http://www.zlib.net/ +
        +
        +
        + + + +
        +The following are relevant to Artifex commercial releases only + + + + +
        +AGFA UFST +
        +Optional +
        +5.x/6.x +
        +with patches +
        +Access, scale and render AGFA MicroType fonts + +Commercial + +http://www.monotypeimaging.com/ +
        +Luratech LuraDocument JBIG2 C-SDK +
        +Included in commercial release +
        +1.08 +
        +with patches +
        +Replacement JBIG2 image decoder for the PDF interpreter + +Commercial + +http://www.luratech.com/ +
        +Luratech LuraWave JP2 C-SDK +
        +Included in commercial release +
        +2.10 +
        +with patches +
        +Replacement JPEG2000 image decoder for the PDF interpreter + +Commercial + +http://www.luratech.com/ +
        +
        +
        + + + +
        +The following are deprecated but still available for use + +Support will be removed in a future release + + + +
        +JasPer + +1.701.0 +
        +(with patches, hence v1.701.0-gs5) +
        +JPEG2000 image decoding for the PDF interpreter + +JasPer License Version 2.0 +
        +based on MIT License +
        +http://www.ece.uvic.ca/~frodo/jasper/ +
        +LittleCMS +
        +(lcms2) +
        +1.1.8 +
        +with patches +
        +ICC profile base color conversion and management + +MIT LICENSE + +http://www.littlecms.com/ +
        + + + +


        + +

        +Copyright © 2005-2012 Artifex Software, Inc. +All rights reserved. + +

        +This software is provided AS-IS with no warranty, either express or +implied. + +This software is distributed under license and may not be copied, modified +or distributed except as expressly authorized under the terms of that +license. Refer to licensing information at http://www.artifex.com/ +or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, +San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. + +

        +Ghostscript version 9.04, 5 August 2011 + + + + + diff -Nru ghostscript-9.04~dfsg/doc/Use.htm ghostscript-9.05~dfsg~20120125/doc/Use.htm --- ghostscript-9.04~dfsg/doc/Use.htm 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/doc/Use.htm 2012-01-25 08:44:24.000000000 +0000 @@ -328,13 +328,26 @@ Please see Ghostscript and the PostScript Language and the PostScript Language Reference Manual for more details on % and filedevices. -

        -Note that on MS Windows systems, the % character also has a special meaning for the command processor (shell), so you will have to double it: +

        +Note that on MS Windows systems, the % character also has a special meaning for the command processor (shell), so you will have to double it.

        gs -sOutputFile=%%os%%%%abc (on MS Windows)
        +

        +Note, some devices (e.g. pdfwrite, ps2write, ...) only write the output file +upon exit, but changing the OutputFile device parameter will cause these +devices to emit the pages received up to that point and then open the new +file name given by OutputFile. + +

        +For example, in order to create two PDF files from a single invocation of +ghostscript the following can be used: +

        +gs -sDEVICE=pdfwrite -o tiger.pdf examples/tiger.eps -c "<< /OutputFile (colorcir.pdf) >> setpagedevice" -f examples/colorcir.ps +
        +

        One page per file

        @@ -375,11 +388,9 @@

        -Note however that the one page per file feature is not supported by all devices; -in particular it does not work with document-oriented output devices like -pdfwrite and pswrite. See the -dFirstPage and --dLastPage switches below for a way to extract -single pdf pages. +Note, however that the one page per file feature may not supported by all devices. +Also, since some devices write output files when opened, there may be an extra +blank page written (pdfwrite, ps2write, pswrite, pxlmono, pxlcolor, ...).

        @@ -668,7 +679,7 @@ width of the missing glyph, or the width of the /.notdef glyph if no /Widths array is present. Ghostscript now attempts to mimic this undocumented feature using a user parameter RenderTTNotdef. The PDF interpreter sets this -user paramter to the value of RENDERTTNOTDEF in systemdict, +user parameter to the value of RENDERTTNOTDEF in systemdict, when rendering PDF files. To restore rendering of /.notdef glyphs from TrueType fonts in PDF files, set this parameter to true. @@ -1223,17 +1234,67 @@ on the search path or font path.

        CID font substitution

        - +

        Automatic CIDFont Substitution

        +In general, it is highly recommended that CIDFonts used in the creation of PDF +jobs should be embedded or available to Ghostscript as CIDFont resources, this +ensures that the character set, and typeface style are as intended by the +author. +

        +In cases where the original CIDFont is not available, the next best option is +to provide Ghostscript with a mapping to a suitable alternative CIDFont - see +below for details on how this is achieved. However, Ghostscript does provide the +ability to use a "fall back" CIDFont substitute. As shipped, this uses the +DroidSansFallback.ttf font. This font contains a large number of glyphs covering +several languages, but it is not comprehensive. There is, therefore, a chance +that glyphs may be wrong, or missing in the output when this fallback is used. +

        +Internally, the font is referenced as CIDFont resource called CIDFallBack, thus +a different fallback from DroidSansFallback.ttf can be specified adding a +mapping to your cidfmap file (see below for details) to map the name "CIDFallBack" +as you prefer. For CIDFallBack the mapping must be a TrueType +font or TrueType collection, it cannot be a Postscript CIDFont file. +

        +As with any font containing large numbers of glyphs, DroidSansFallback.ttf is +quite large (~3.5Mb at the of writing). If this is space you cannot afford in +your use of Ghostscript, you can simply delete the file from: +Resource/CIDFSubst/DroidSansFallback.ttf. The build system will cope with the +file being removed, and the initialization code will avoid adding the internal +fall back mapping if the file is missing. +

        +If DroidSansFallback.ttf is removed, and no other CIDFallBack mapping is supplied, +the final "fall back" is to use a "dumb" bullet CIDFont, called ArtifexBullet. As +the name suggests, this will result in all the glyphs from a missing CIDFont being replaced with +a simple bullet point. +

        +This type of generic fall back CIDFont substitution can be very useful for +viewing and proofing jobs, but may not be appropriate for a "production" +workflow, where it is expected that only the original font should be +used. For this situation, you can supply Ghostscript with the command line option: +-dPDFNOCIDFALLBACK. By combining -dPDFNOCIDFALLBACK with -dPDFSTOPONERROR +a production workflow can force a PDF with missing CIDFonts to error, and avoid +realising a CIDFont was missing only after printing. +

        +The directory in which the fallback TrueType font or collection can be specified by the +command line parameter -sCIDFSubstPath="path/to/TTF", or with the environment +variable CIDFSUBSTPATH. The file name of the substitute TrueType font can be +specified using the command line parameter -sCIDFSubstFont="TTF file name" or +the environment variable CIDFSUBSTFONT. -

        +

        Explicit CIDFont Substitution

        Substitution of CID font resources is controlled by the Ghostscript -configuration file lib/cidfmap, -which defines a CID font resource map. -The file forms a table of records, each of which should use one of two formats, -explained below. Users may modify lib/cidfmap to configure -Ghostscript for a specific need. +configuration file lib/cidfmap, which defines a CID font resource map. +

        +The file forms a table of records, each of which should use one of three formats, +explained below. Users may modify Resource/Init/cidfmap to configure +Ghostscript for a specific need. Note that the default Ghostscript build includes +such configuration and resource files in a rom file system built into the executable. +So, to ensure your changes have an effect, you should do one of the following: rebuild +the executable; use the "-I" command line option to add the directory containing your +modified file to Ghostscript's search path; or, finally, build Ghostscript to use disk +based resources. +

        Format 1

        To substitute a CID font resource with another CID font resource, add a record like this :

        @@ -1248,9 +1309,8 @@ lib/cidfmap. The trailing semicolon and the space before it are both required. -

        - -To substitute (emulate) a CID font resource with a TrueType font file, add a record like this : +

        Format 2

        +

        To substitute (emulate) a CID font resource with a TrueType font file, add a record like this :

        /Substituted << keys&values >> ; @@ -1296,26 +1356,57 @@ The TrueType font must contain enough characters to cover an Adobe character collection, which is specified in Ordering and used in documents. +

        Format 3

        +

        To point Ghostscript at a specific CIDFont file outside it's "normal" resource search path : + +

        +/CIDName (path/to/cid/font/file) ; +
        +where CIDName is a name of CID font resource being used +by a document, and "path/to/cid/font/file" is the path to the +Postscript CIDFont file, including the file name. NOTE: the CIDFont file, when +executed by the Postscript interpreter, must result in a CIDFont resource being +defined whose CIDFontName matches the "CIDName" key for the current record. +I.E. an entry with the key /PingHei-Bold must reference a file which creates a +CIDFont resource called "PingHei-Bold". To substitute a file based CIDFont for +a differently named CIDFont, use formats 1 and 3 in combination (the order of the +entries is not important). + +The trailing semicolon and the space before it are both required. + +

        +

        NOTE: Environment Variables

        +

        It is also possible to influence the path using standard, or your own environment variables, using +the custom Postscript operator getenv. Said operator takes a string parameter on the stack +which is the environment variable to interrogate, and returns either a string, containing the value of +the environment variable, and boolean true to indicate success, or just a boolean +false to indicate failure. See below for an example of its use. +

        Examples :

        +
        Format 1:
        /Ryumin-Medium /ShinGo-Bold ;
        -/MS-Mincho << /FileType /TrueType /Path (C:/WINDOWS/fonts/msmincho.ttc) /SubfontID 0 /CSI [(Japan1) 3] >> ;
        /Ryumin-Light /MS-Mincho ;
        -
        +
        Format 2:
        /Batang << /FileType /TrueType /Path (C:/WINDOWS/fonts/batang.ttc) /SubfontID 0 /CSI [(Korea1) 3] >> ;
        /Gulim << /FileType /TrueType /Path (C:/WINDOWS/fonts/gulim.ttc) /SubfontID 0 /CSI [(Korea1) 3] >> ;
        /Dotum << /FileType /TrueType /Path (C:/WINDOWS/fonts/gulim.ttc) /SubfontID 2 /CSI [(Korea1) 3] >> ;
        -/HYSMyeongJo-Medium /Batang ;
        -/HYRGoThic-Medium /Gulim ;
        -/HYGoThic-Medium /Dotum ;

        +
        Format 2 & environment variable:
        +/SimHei << /FileType /TrueType /Path (windir) getenv not {(c:/windows)}if (/fonts/simhei.ttf) concatstrings /SubfontID 0 /CSI [(GB1) 2] >> ;
        +
        Format 1 & 2
        /SimSun << /FileType /TrueType /Path (C:/WINDOWS/fonts/simsun.ttc) /SubfontID 0 /CSI [(GB1) 2] >> ;
        /SimHei << /FileType /TrueType /Path (C:/WINDOWS/fonts/simhei.ttf) /SubfontID 0 /CSI [(GB1) 2] >> ;
        /STSong-Light /SimSun ;
        /STHeiti-Regular /SimHei ;
        +
        Format 3:
        +/PMingLiU (/usr/local/share/font/cidfont/PMingLiU.cid) ;
        +
        Format 1 & 3
        +/Ryumin-Light /PMingLiU ;
        +/PMingLiU (/usr/local/share/font/cidfont/PMingLiU.cid) ;

        The win32 installer of recent version of ghostscript has a checkbox for @@ -3356,6 +3447,13 @@ +

        In addition, calling ghostscript with --debug will list all the currently +defined (non visual trace) debugging flags, both in their short form (as listed +above for use with -Z) and in a long form, which can be used as in: +--debug=tiling,alloc. All the short form flags for -Z +have an equivalent long form. Future flags may be added with a long form only +(due to all the short form flags being used already). +

        Visual Trace

        diff -Nru ghostscript-9.04~dfsg/DroidSansFallback.NOTICE ghostscript-9.05~dfsg~20120125/DroidSansFallback.NOTICE --- ghostscript-9.04~dfsg/DroidSansFallback.NOTICE 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/DroidSansFallback.NOTICE 2012-01-07 20:18:21.000000000 +0000 @@ -0,0 +1,189 @@ + + Copyright (c) 2005-2008, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff -Nru ghostscript-9.04~dfsg/ghostscript.vcproj ghostscript-9.05~dfsg~20120125/ghostscript.vcproj --- ghostscript-9.04~dfsg/ghostscript.vcproj 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/ghostscript.vcproj 2012-01-25 08:44:24.000000000 +0000 @@ -40,8 +40,8 @@ + + + + + + @@ -695,10 +735,6 @@ > - - @@ -851,10 +887,6 @@ > - - @@ -1130,10 +1162,6 @@ RelativePath="base\vdtrace.c" > - - @@ -1366,15 +1394,15 @@ > + + @@ -2126,10 +2158,6 @@ > - - @@ -3578,6 +3606,10 @@ RelativePath=".\lcms\src\cmsxform.h" > + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -4447,10 +4423,6 @@ > - - @@ -5071,6 +5043,10 @@ > + + @@ -7861,6 +7837,122 @@ > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + data; - ucrCurve->count = UCR_CURVE_SIZE; - for (i=0; icount; i++) - ucrCurve->curve[i] = (icUInt16Number)i; - - bgCurve = (icUcrBgCurve *)((char *)ucrCurve + ucr_nbytes); - bgCurve->count = BG_CURVE_SIZE; - for (i=0; icount; i++) - bgCurve->curve[i] = 255 - (icUInt16Number)i; - - ucr_char = (char *)((char *)bgCurve + bg_nbytes); - memcpy(ucr_char, ucr_string, string_bytes); - * - */ - -/* - * Many of the structures contain variable length arrays. This - * is represented by the use of the convention. - * - * type data[icAny]; - */ - -/* Some compilers accept unsigned value in enum, some don't ... */ -/* #define icMaxTagVal 0xFFFFFFFFL */ - -#define icMaxTagVal -1 - -/*------------------------------------------------------------------------*/ -/* - * Defines used in the specification - */ -#define icMagicNumber 0x61637370L /* 'acsp' */ -#define icVersionNumber 0x02200000L /* 2.2.0, BCD */ - -/* Screening Encodings */ -#define icPrtrDefaultScreensFalse 0x00000000L /* Bit pos 0 */ -#define icPrtrDefaultScreensTrue 0x00000001L /* Bit pos 0 */ -#define icLinesPerInch 0x00000002L /* Bit pos 1 */ -#define icLinesPerCm 0x00000000L /* Bit pos 1 */ - -/* - * Device attributes, currently defined values correspond - * to the least-significant 4 bytes of the 8 byte attribute - * quantity, see the header for their location. - */ -#define icReflective 0x00000000L /* Bit pos 0 */ -#define icTransparency 0x00000001L /* Bit pos 0 */ -#define icGlossy 0x00000000L /* Bit pos 1 */ -#define icMatte 0x00000002L /* Bit pos 1 */ -#define icPositive 0x00000000L /* Bit pos 2 */ -#define icNegative 0x00000004L /* Bit pos 2 */ -#define icColor 0x00000000L /* Bit pos 3 */ -#define icBlackAndWhite 0x00000008L /* Bit pos 3 */ - -/* - * Profile header flags, the least-significant 16 bits are reserved - * for consortium use. - */ -#define icEmbeddedProfileFalse 0x00000000L /* Bit pos 0 */ -#define icEmbeddedProfileTrue 0x00000001L /* Bit pos 0 */ -#define icUseAnywhere 0x00000000L /* Bit pos 1 */ -#define icUseWithEmbeddedDataOnly 0x00000002L /* Bit pos 1 */ - -/* Ascii or Binary data */ -#define icAsciiData 0x00000000L -#define icBinaryData 0x00000001L - -/* Phosphor or Colorant sets */ -#define icPhColUnknown 0x0000 /* Specified */ -#define icPhColITU_R_BT_709 0x0001 /* ITU-R BT.709 */ -#define icPhColSMPTE_RP145_1994 0x0002 /* SMPTE RP145-1994 */ -#define icPhColEBU_Tech_3213_E 0x0003 /* EBU Tech.3213-E */ -#define icPhColP22 0x0004 /* P22 */ - -/* Video card gamma formats (ColorSync 2.5 specific) */ -#define icVideoCardGammaTable 0x00000000 -#define icVideoCardGammaFormula 0x00000001 - -/* - * Define used to indicate that this is a variable length array - */ -#define icAny 1 - -/*------------------------------------------------------------------------*/ -/* - * Use this area to translate platform definitions of long - * etc into icXXX form. The rest of the header uses the icXXX - * typedefs. Signatures are 4 byte quantities. - */ -#ifdef ORD32 /* Formal sizes defined */ - -typedef INR32 icSignature; - -/* Unsigned integer numbers */ -typedef ORD8 icUInt8Number; -typedef ORD16 icUInt16Number; -typedef ORD32 icUInt32Number; -typedef ORD32 icUInt64Number[2]; - -/* Signed numbers */ -typedef INR8 icInt8Number; -typedef INR16 icInt16Number; -typedef INR32 icInt32Number; -typedef INR32 icInt64Number[2]; - -/* Fixed numbers */ -typedef INR32 icS15Fixed16Number; -typedef ORD32 icU16Fixed16Number; - -#else /* Not formal */ - -#ifdef __sgi -#include "sgidefs.h" - -typedef __int32_t icSignature; - -/* - * Number definitions - */ - -/* Unsigned integer numbers */ -typedef unsigned char icUInt8Number; -typedef unsigned short icUInt16Number; -typedef __uint32_t icUInt32Number; -typedef __uint32_t icUInt64Number[2]; - -/* Signed numbers */ -typedef char icInt8Number; -typedef short icInt16Number; -typedef __int32_t icInt32Number; -typedef __int32_t icInt64Number[2]; - -/* Fixed numbers */ -typedef __int32_t icS15Fixed16Number; -typedef __uint32_t icU16Fixed16Number; - -#else /* default definitions */ - -typedef long icSignature; - -/* - * Number definitions - */ - -/* Unsigned integer numbers */ -typedef unsigned char icUInt8Number; -typedef unsigned short icUInt16Number; -typedef unsigned long icUInt32Number; -typedef unsigned long icUInt64Number[2]; - -/* Signed numbers */ -typedef char icInt8Number; -typedef short icInt16Number; -typedef long icInt32Number; -typedef long icInt64Number[2]; - -/* Fixed numbers */ -typedef long icS15Fixed16Number; -typedef unsigned long icU16Fixed16Number; -#endif /* default defs */ -#endif /* Not formal */ - -/*------------------------------------------------------------------------*/ -/* public tags and sizes */ -typedef enum { - icSigAToB0Tag = 0x41324230L, /* 'A2B0' */ - icSigAToB1Tag = 0x41324231L, /* 'A2B1' */ - icSigAToB2Tag = 0x41324232L, /* 'A2B2' */ - icSigBlueColorantTag = 0x6258595AL, /* 'bXYZ' */ - icSigBlueTRCTag = 0x62545243L, /* 'bTRC' */ - icSigBToA0Tag = 0x42324130L, /* 'B2A0' */ - icSigBToA1Tag = 0x42324131L, /* 'B2A1' */ - icSigBToA2Tag = 0x42324132L, /* 'B2A2' */ - icSigCalibrationDateTimeTag = 0x63616C74L, /* 'calt' */ - icSigCharTargetTag = 0x74617267L, /* 'targ' */ - icSigChromaticityTag = 0x6368726DL, /* 'chrm' */ - icSigCopyrightTag = 0x63707274L, /* 'cprt' */ - icSigCrdInfoTag = 0x63726469L, /* 'crdi' */ - icSigDeviceMfgDescTag = 0x646D6E64L, /* 'dmnd' */ - icSigDeviceModelDescTag = 0x646D6464L, /* 'dmdd' */ - icSigDeviceSettingsTag = 0x64657673L, /* 'devs' */ - icSigGamutTag = 0x67616D74L, /* 'gamt ' */ - icSigGrayTRCTag = 0x6b545243L, /* 'kTRC' */ - icSigGreenColorantTag = 0x6758595AL, /* 'gXYZ' */ - icSigGreenTRCTag = 0x67545243L, /* 'gTRC' */ - icSigLuminanceTag = 0x6C756d69L, /* 'lumi' */ - icSigMeasurementTag = 0x6D656173L, /* 'meas' */ - icSigMediaBlackPointTag = 0x626B7074L, /* 'bkpt' */ - icSigMediaWhitePointTag = 0x77747074L, /* 'wtpt' */ - icSigNamedColorTag = 0x6E636f6CL, /* 'ncol' - * OBSOLETE, use ncl2 */ - icSigNamedColor2Tag = 0x6E636C32L, /* 'ncl2' */ - icSigOutputResponseTag = 0x72657370L, /* 'resp' */ - icSigPreview0Tag = 0x70726530L, /* 'pre0' */ - icSigPreview1Tag = 0x70726531L, /* 'pre1' */ - icSigPreview2Tag = 0x70726532L, /* 'pre2' */ - icSigProfileDescriptionTag = 0x64657363L, /* 'desc' */ - icSigProfileSequenceDescTag = 0x70736571L, /* 'pseq' */ - icSigPs2CRD0Tag = 0x70736430L, /* 'psd0' */ - icSigPs2CRD1Tag = 0x70736431L, /* 'psd1' */ - icSigPs2CRD2Tag = 0x70736432L, /* 'psd2' */ - icSigPs2CRD3Tag = 0x70736433L, /* 'psd3' */ - icSigPs2CSATag = 0x70733273L, /* 'ps2s' */ - icSigPs2RenderingIntentTag = 0x70733269L, /* 'ps2i' */ - icSigRedColorantTag = 0x7258595AL, /* 'rXYZ' */ - icSigRedTRCTag = 0x72545243L, /* 'rTRC' */ - icSigScreeningDescTag = 0x73637264L, /* 'scrd' */ - icSigScreeningTag = 0x7363726EL, /* 'scrn' */ - icSigTechnologyTag = 0x74656368L, /* 'tech' */ - icSigUcrBgTag = 0x62666420L, /* 'bfd ' */ - icSigVideoCardGammaTag = 0x76636774L, /* 'vcgt' ColorSync 2.5 */ - icSigViewingCondDescTag = 0x76756564L, /* 'vued' */ - icSigViewingConditionsTag = 0x76696577L, /* 'view' */ - icMaxEnumTag = icMaxTagVal -} icTagSignature; - -/* technology signature descriptions */ -typedef enum { - icSigDigitalCamera = 0x6463616DL, /* 'dcam' */ - icSigFilmScanner = 0x6673636EL, /* 'fscn' */ - icSigReflectiveScanner = 0x7273636EL, /* 'rscn' */ - icSigInkJetPrinter = 0x696A6574L, /* 'ijet' */ - icSigThermalWaxPrinter = 0x74776178L, /* 'twax' */ - icSigElectrophotographicPrinter = 0x6570686FL, /* 'epho' */ - icSigElectrostaticPrinter = 0x65737461L, /* 'esta' */ - icSigDyeSublimationPrinter = 0x64737562L, /* 'dsub' */ - icSigPhotographicPaperPrinter = 0x7270686FL, /* 'rpho' */ - icSigFilmWriter = 0x6670726EL, /* 'fprn' */ - icSigVideoMonitor = 0x7669646DL, /* 'vidm' */ - icSigVideoCamera = 0x76696463L, /* 'vidc' */ - icSigProjectionTelevision = 0x706A7476L, /* 'pjtv' */ - icSigCRTDisplay = 0x43525420L, /* 'CRT ' */ - icSigPMDisplay = 0x504D4420L, /* 'PMD ' */ - icSigAMDisplay = 0x414D4420L, /* 'AMD ' */ - icSigPhotoCD = 0x4B504344L, /* 'KPCD' */ - icSigPhotoImageSetter = 0x696D6773L, /* 'imgs' */ - icSigGravure = 0x67726176L, /* 'grav' */ - icSigOffsetLithography = 0x6F666673L, /* 'offs' */ - icSigSilkscreen = 0x73696C6BL, /* 'silk' */ - icSigFlexography = 0x666C6578L, /* 'flex' */ - icMaxEnumTechnology = icMaxTagVal -} icTechnologySignature; - -/* type signatures */ -typedef enum { - icSigCurveType = 0x63757276L, /* 'curv' */ - icSigChromaticityType = 0x6368726DL, /* 'chrm' */ - icSigDataType = 0x64617461L, /* 'data' */ - icSigDateTimeType = 0x6474696DL, /* 'dtim' */ - icSigDeviceSettingsType = 0x64657673L, /* 'devs' */ - icSigLut16Type = 0x6d667432L, /* 'mft2' */ - icSigLut8Type = 0x6d667431L, /* 'mft1' */ - icSigMeasurementType = 0x6D656173L, /* 'meas' */ - icSigNamedColorType = 0x6E636f6CL, /* 'ncol' - * OBSOLETE, use ncl2 */ - icSigProfileSequenceDescType = 0x70736571L, /* 'pseq' */ - icSigResponseCurveSet16Type = 0x72637332L, /* 'rcs2' */ - icSigS15Fixed16ArrayType = 0x73663332L, /* 'sf32' */ - icSigScreeningType = 0x7363726EL, /* 'scrn' */ - icSigSignatureType = 0x73696720L, /* 'sig ' */ - icSigTextType = 0x74657874L, /* 'text' */ - icSigTextDescriptionType = 0x64657363L, /* 'desc' */ - icSigU16Fixed16ArrayType = 0x75663332L, /* 'uf32' */ - icSigUcrBgType = 0x62666420L, /* 'bfd ' */ - icSigUInt16ArrayType = 0x75693136L, /* 'ui16' */ - icSigUInt32ArrayType = 0x75693332L, /* 'ui32' */ - icSigUInt64ArrayType = 0x75693634L, /* 'ui64' */ - icSigUInt8ArrayType = 0x75693038L, /* 'ui08' */ - icSigVideoCardGammaType = 0x76636774L, /* 'vcgt' ColorSync 2.5 */ - icSigViewingConditionsType = 0x76696577L, /* 'view' */ - icSigXYZType = 0x58595A20L, /* 'XYZ ' */ - icSigXYZArrayType = 0x58595A20L, /* 'XYZ ' */ - icSigNamedColor2Type = 0x6E636C32L, /* 'ncl2' */ - icSigCrdInfoType = 0x63726469L, /* 'crdi' */ - icMaxEnumType = icMaxTagVal -} icTagTypeSignature; - -/* - * Color Space Signatures - * Note that only icSigXYZData and icSigLabData are valid - * Profile Connection Spaces (PCSs) - */ -typedef enum { - icSigXYZData = 0x58595A20L, /* 'XYZ ' */ - icSigLabData = 0x4C616220L, /* 'Lab ' */ - icSigLuvData = 0x4C757620L, /* 'Luv ' */ - icSigYCbCrData = 0x59436272L, /* 'YCbr' */ - icSigYxyData = 0x59787920L, /* 'Yxy ' */ - icSigRgbData = 0x52474220L, /* 'RGB ' */ - icSigGrayData = 0x47524159L, /* 'GRAY' */ - icSigHsvData = 0x48535620L, /* 'HSV ' */ - icSigHlsData = 0x484C5320L, /* 'HLS ' */ - icSigCmykData = 0x434D594BL, /* 'CMYK' */ - icSigCmyData = 0x434D5920L, /* 'CMY ' */ - icSigMch5Data = 0x4D434835L, /* 'MCH5' Colorsync ? */ - icSigMch6Data = 0x4D434836L, /* 'MCH6' Hexachrome: CMYKOG */ - icSigMch7Data = 0x4D434837L, /* 'MCH7' Colorsync ? */ - icSigMch8Data = 0x4D434838L, /* 'MCH8' Colorsync ? */ - icSig2colorData = 0x32434C52L, /* '2CLR' */ - icSig3colorData = 0x33434C52L, /* '3CLR' */ - icSig4colorData = 0x34434C52L, /* '4CLR' */ - icSig5colorData = 0x35434C52L, /* '5CLR' */ - icSig6colorData = 0x36434C52L, /* '6CLR' */ - icSig7colorData = 0x37434C52L, /* '7CLR' */ - icSig8colorData = 0x38434C52L, /* '8CLR' */ - icSig9colorData = 0x39434C52L, /* '9CLR' */ - icSig10colorData = 0x41434C52L, /* 'ACLR' */ - icSig11colorData = 0x42434C52L, /* 'BCLR' */ - icSig12colorData = 0x43434C52L, /* 'CCLR' */ - icSig13colorData = 0x44434C52L, /* 'DCLR' */ - icSig14colorData = 0x45434C52L, /* 'ECLR' */ - icSig15colorData = 0x46434C52L, /* 'FCLR' */ - icMaxEnumData = icMaxTagVal -} icColorSpaceSignature; - -/* profileClass enumerations */ -typedef enum { - icSigInputClass = 0x73636E72L, /* 'scnr' */ - icSigDisplayClass = 0x6D6E7472L, /* 'mntr' */ - icSigOutputClass = 0x70727472L, /* 'prtr' */ - icSigLinkClass = 0x6C696E6BL, /* 'link' */ - icSigAbstractClass = 0x61627374L, /* 'abst' */ - icSigColorSpaceClass = 0x73706163L, /* 'spac' */ - icSigNamedColorClass = 0x6e6d636cL, /* 'nmcl' */ - icMaxEnumClass = icMaxTagVal -} icProfileClassSignature; - -/* Platform Signatures */ -typedef enum { - icSigMacintosh = 0x4150504CL, /* 'APPL' */ - icSigMicrosoft = 0x4D534654L, /* 'MSFT' */ - icSigSolaris = 0x53554E57L, /* 'SUNW' */ - icSigSGI = 0x53474920L, /* 'SGI ' */ - icSigTaligent = 0x54474E54L, /* 'TGNT' */ - icMaxEnumPlatform = icMaxTagVal -} icPlatformSignature; - -/*------------------------------------------------------------------------*/ -/* - * Other enums - */ - -/* Measurement Flare, used in the measurmentType tag */ -typedef enum { - icFlare0 = 0x00000000L, /* 0% flare */ - icFlare100 = 0x00000001L, /* 100% flare */ - icMaxFlare = icMaxTagVal -} icMeasurementFlare; - -/* Measurement Geometry, used in the measurmentType tag */ -typedef enum { - icGeometryUnknown = 0x00000000L, /* Unknown */ - icGeometry045or450 = 0x00000001L, /* 0/45, 45/0 */ - icGeometry0dord0 = 0x00000002L, /* 0/d or d/0 */ - icMaxGeometry = icMaxTagVal -} icMeasurementGeometry; - -/* Rendering Intents, used in the profile header */ -typedef enum { - icPerceptual = 0, - icRelativeColorimetric = 1, - icSaturation = 2, - icAbsoluteColorimetric = 3, - icMaxEnumIntent = icMaxTagVal -} icRenderingIntent; - -/* Different Spot Shapes currently defined, used for screeningType */ -typedef enum { - icSpotShapeUnknown = 0, - icSpotShapePrinterDefault = 1, - icSpotShapeRound = 2, - icSpotShapeDiamond = 3, - icSpotShapeEllipse = 4, - icSpotShapeLine = 5, - icSpotShapeSquare = 6, - icSpotShapeCross = 7, - icMaxEnumSpot = icMaxTagVal -} icSpotShape; - -/* Standard Observer, used in the measurmentType tag */ -typedef enum { - icStdObsUnknown = 0x00000000L, /* Unknown */ - icStdObs1931TwoDegrees = 0x00000001L, /* 2 deg */ - icStdObs1964TenDegrees = 0x00000002L, /* 10 deg */ - icMaxStdObs = icMaxTagVal -} icStandardObserver; - -/* Pre-defined illuminants, used in measurement and viewing conditions type */ -typedef enum { - icIlluminantUnknown = 0x00000000L, - icIlluminantD50 = 0x00000001L, - icIlluminantD65 = 0x00000002L, - icIlluminantD93 = 0x00000003L, - icIlluminantF2 = 0x00000004L, - icIlluminantD55 = 0x00000005L, - icIlluminantA = 0x00000006L, - icIlluminantEquiPowerE = 0x00000007L, - icIlluminantF8 = 0x00000008L, - icMaxEnumIluminant = icMaxTagVal -} icIlluminant; - -/* media type for icSigDeviceSettingsTag */ -typedef enum { - icStandard = 1, - icTrans = 2, /* transparency */ - icGloss = 3, - icUser1 = 256, - icMaxDeviceMedia = icMaxTagVal -} icDeviceMedia; - -/* halftone settings for icSigDeviceSettingTag */ -typedef enum { - icNone = 1, - icCoarse = 2, - icFine = 3, - icLineArt = 4, - icErrorDiffusion = 5, - icReserved6 = 6, - icReserved7 = 7, - icReserved8 = 8, - icReserved9 = 9, - icGrayScale = 10, - icUser2 = 256, - icMaxDither = icMaxTagVal -} icDeviceDither; - -/* signatures for icSigDeviceSettingsTag */ -typedef enum { - icSigResolution = 0x72736c6eL, /* 'rsln' */ - icSigMedia = 0x6d747970L, /* 'mtyp' */ - icSigHalftone = 0x6866746eL, /* 'hftn' */ - icMaxSettings = icMaxTagVal -} icSettingsSig; - -/* measurement units for the icResponseCurveSet16Type */ -typedef enum { - icStaA = 0x53746141L, /* 'StaA' */ - icStaE = 0x53746145L, /* 'StaE' */ - icStaI = 0x53746149L, /* 'StaI' */ - icStaT = 0x53746154L, /* 'StaT' */ - icStaM = 0x5374614dL, /* 'StaM' */ - icDN = 0x444e2020L, /* 'DN ' */ - icDNP = 0x444e2050L, /* 'DN P' */ - icDNN = 0x444e4e20L, /* 'DNN ' */ - icDNNP = 0x444e4e50L, /* 'DNNP' */ - icMaxUnits = icMaxTagVal -} icMeasUnitsSig; - -/*------------------------------------------------------------------------*/ -/* - * Arrays of numbers - */ - -/* Int8 Array */ -typedef struct { - icInt8Number data[icAny]; /* Variable array of values */ -} icInt8Array; - -/* UInt8 Array */ -typedef struct { - icUInt8Number data[icAny]; /* Variable array of values */ -} icUInt8Array; - -/* uInt16 Array */ -typedef struct { - icUInt16Number data[icAny]; /* Variable array of values */ -} icUInt16Array; - -/* Int16 Array */ -typedef struct { - icInt16Number data[icAny]; /* Variable array of values */ -} icInt16Array; - -/* uInt32 Array */ -typedef struct { - icUInt32Number data[icAny]; /* Variable array of values */ -} icUInt32Array; - -/* Int32 Array */ -typedef struct { - icInt32Number data[icAny]; /* Variable array of values */ -} icInt32Array; - -/* UInt64 Array */ -typedef struct { - icUInt64Number data[icAny]; /* Variable array of values */ -} icUInt64Array; - -/* Int64 Array */ -typedef struct { - icInt64Number data[icAny]; /* Variable array of values */ -} icInt64Array; - -/* u16Fixed16 Array */ -typedef struct { - icU16Fixed16Number data[icAny]; /* Variable array of values */ -} icU16Fixed16Array; - -/* s15Fixed16 Array */ -typedef struct { - icS15Fixed16Number data[icAny]; /* Variable array of values */ -} icS15Fixed16Array; - -/* The base date time number */ -typedef struct { - icUInt16Number year; - icUInt16Number month; - icUInt16Number day; - icUInt16Number hours; - icUInt16Number minutes; - icUInt16Number seconds; -} icDateTimeNumber; - -/* XYZ Number */ -typedef struct { - icS15Fixed16Number X; - icS15Fixed16Number Y; - icS15Fixed16Number Z; -} icXYZNumber; - -/* XYZ Array */ -typedef struct { - icXYZNumber data[icAny]; /* Variable array of XYZ numbers */ -} icXYZArray; - -/* Curve */ -typedef struct { - icUInt32Number count; /* Number of entries */ - icUInt16Number data[icAny]; /* The actual table data, real - * number is determined by count - * Interpretation depends on how - * data is used with a given tag - */ -} icCurve; - -/* Data */ -typedef struct { - icUInt32Number dataFlag; /* 0 = ascii, 1 = binary */ - icInt8Number data[icAny]; /* Data, size from tag */ -} icData; - -/* lut16 */ -typedef struct { - icUInt8Number inputChan; /* Number of input channels */ - icUInt8Number outputChan; /* Number of output channels */ - icUInt8Number clutPoints; /* Number of grid points */ - icInt8Number pad; /* Padding for byte alignment */ - icS15Fixed16Number e00; /* e00 in the 3 * 3 */ - icS15Fixed16Number e01; /* e01 in the 3 * 3 */ - icS15Fixed16Number e02; /* e02 in the 3 * 3 */ - icS15Fixed16Number e10; /* e10 in the 3 * 3 */ - icS15Fixed16Number e11; /* e11 in the 3 * 3 */ - icS15Fixed16Number e12; /* e12 in the 3 * 3 */ - icS15Fixed16Number e20; /* e20 in the 3 * 3 */ - icS15Fixed16Number e21; /* e21 in the 3 * 3 */ - icS15Fixed16Number e22; /* e22 in the 3 * 3 */ - icUInt16Number inputEnt; /* Num of in-table entries */ - icUInt16Number outputEnt; /* Num of out-table entries */ - icUInt16Number data[icAny]; /* Data follows see spec */ -/* - * Data that follows is of this form - * - * icUInt16Number inputTable[inputChan][icAny]; * The in-table - * icUInt16Number clutTable[icAny]; * The clut - * icUInt16Number outputTable[outputChan][icAny]; * The out-table - */ -} icLut16; - -/* lut8, input & output tables are always 256 bytes in length */ -typedef struct { - icUInt8Number inputChan; /* Num of input channels */ - icUInt8Number outputChan; /* Num of output channels */ - icUInt8Number clutPoints; /* Num of grid points */ - icInt8Number pad; - icS15Fixed16Number e00; /* e00 in the 3 * 3 */ - icS15Fixed16Number e01; /* e01 in the 3 * 3 */ - icS15Fixed16Number e02; /* e02 in the 3 * 3 */ - icS15Fixed16Number e10; /* e10 in the 3 * 3 */ - icS15Fixed16Number e11; /* e11 in the 3 * 3 */ - icS15Fixed16Number e12; /* e12 in the 3 * 3 */ - icS15Fixed16Number e20; /* e20 in the 3 * 3 */ - icS15Fixed16Number e21; /* e21 in the 3 * 3 */ - icS15Fixed16Number e22; /* e22 in the 3 * 3 */ - icUInt8Number data[icAny]; /* Data follows see spec */ -/* - * Data that follows is of this form - * - * icUInt8Number inputTable[inputChan][256]; * The in-table - * icUInt8Number clutTable[icAny]; * The clut - * icUInt8Number outputTable[outputChan][256]; * The out-table - */ -} icLut8; - -/* Measurement Data */ -typedef struct { - icStandardObserver stdObserver; /* Standard observer */ - icXYZNumber backing; /* XYZ for backing */ - icMeasurementGeometry geometry; /* Meas. geometry */ - icMeasurementFlare flare; /* Measurement flare */ - icIlluminant illuminant; /* Illuminant */ -} icMeasurement; - -/* Named color */ - -/* - * icNamedColor2 takes the place of icNamedColor - */ -typedef struct { - icUInt32Number vendorFlag; /* Bottom 16 bits for IC use */ - icUInt32Number count; /* Count of named colors */ - icUInt32Number nDeviceCoords; /* Num of device coordinates */ - icInt8Number prefix[32]; /* Prefix for each color name */ - icInt8Number suffix[32]; /* Suffix for each color name */ - icInt8Number data[icAny]; /* Named color data follows */ -/* - * Data that follows is of this form - * - * icInt8Number root1[32]; * Root name for 1st color - * icUInt16Number pcsCoords1[icAny]; * PCS coords of 1st color - * icUInt16Number deviceCoords1[icAny]; * Dev coords of 1st color - * icInt8Number root2[32]; * Root name for 2nd color - * icUInt16Number pcsCoords2[icAny]; * PCS coords of 2nd color - * icUInt16Number deviceCoords2[icAny]; * Dev coords of 2nd color - * : - * : - * Repeat for name and PCS and device color coordinates up to (count-1) - * - * NOTES: - * PCS and device space can be determined from the header. - * - * PCS coordinates are icUInt16 numbers and are described in Annex A of - * the ICC spec. Only 16 bit L*a*b* and XYZ are allowed. The number of - * coordinates is consistent with the headers PCS. - * - * Device coordinates are icUInt16 numbers where 0x0000 represents - * the minimum value and 0xFFFF represents the maximum value. - * If the nDeviceCoords value is 0 this field is not given. - */ -} icNamedColor2; - -/* Profile sequence structure */ -typedef struct { - icSignature deviceMfg; /* Dev Manufacturer */ - icSignature deviceModel; /* Dev Model */ - icUInt64Number attributes; /* Dev attributes */ - icTechnologySignature technology; /* Technology sig */ - icInt8Number data[icAny]; /* Desc text follows */ -/* - * Data that follows is of this form, this is an icInt8Number - * to avoid problems with a compiler generating bad code as - * these arrays are variable in length. - * - * icTextDescription deviceMfgDesc; * Manufacturer text - * icTextDescription modelDesc; * Model text - */ -} icDescStruct; - -/* Profile sequence description */ -typedef struct { - icUInt32Number count; /* Number of descriptions */ - icUInt8Number data[icAny]; /* Array of desc structs */ -} icProfileSequenceDesc; - -/* textDescription */ -typedef struct { - icUInt32Number count; /* Description length */ - icInt8Number data[icAny]; /* Descriptions follow */ -/* - * Data that follows is of this form - * - * icInt8Number desc[count] * NULL terminated ascii string - * icUInt32Number ucLangCode; * UniCode language code - * icUInt32Number ucCount; * UniCode description length - * icInt16Number ucDesc[ucCount];* The UniCode description - * icUInt16Number scCode; * ScriptCode code - * icUInt8Number scCount; * ScriptCode count - * icInt8Number scDesc[67]; * ScriptCode Description - */ -} icTextDescription; - -/* Screening Data */ -typedef struct { - icS15Fixed16Number frequency; /* Frequency */ - icS15Fixed16Number angle; /* Screen angle */ - icSpotShape spotShape; /* Spot Shape encodings below */ -} icScreeningData; - -typedef struct { - icUInt32Number screeningFlag; /* Screening flag */ - icUInt32Number channels; /* Number of channels */ - icScreeningData data[icAny]; /* Array of screening data */ -} icScreening; - -/* Text Data */ -typedef struct { - icInt8Number data[icAny]; /* Variable array of chars */ -} icText; - -/* Structure describing either a UCR or BG curve */ -typedef struct { - icUInt32Number count; /* Curve length */ - icUInt16Number curve[icAny]; /* The array of curve values */ -} icUcrBgCurve; - -/* Under color removal, black generation */ -typedef struct { - icInt8Number data[icAny]; /* The Ucr BG data */ -/* - * Data that follows is of this form, this is a icInt8Number - * to avoid problems with a compiler generating bad code as - * these arrays are variable in length. - * - * icUcrBgCurve ucr; * Ucr curve - * icUcrBgCurve bg; * Bg curve - * icInt8Number string; * UcrBg description - */ -} icUcrBg; - -/* viewingConditionsType */ -typedef struct { - icXYZNumber illuminant; /* In candelas per sq. meter */ - icXYZNumber surround; /* In candelas per sq. meter */ - icIlluminant stdIluminant; /* See icIlluminant defines */ -} icViewingCondition; - -/* CrdInfo type */ -typedef struct { - icUInt32Number count; /* Char count includes NULL */ - icInt8Number desc[icAny]; /* Null terminated string */ -} icCrdInfo; - -/* support structures for the icSigDeviceSettingsTag */ -typedef struct { - icUInt32Number numPlatforms; /* number of platforms */ - icUInt32Number data[icAny]; -}icSettingsData; - -/* where data is "numPlatforms" of the following structure - * - *typedef struct { - * icPlatformSignature platform; - * icUInt32Number size; total size of all settings - * icUInt32Number combCount; # of settings - * icSettingsStruct data[icAny]; - *}; - * - * where data is "combCount" of the following structure - * - *typedef struct { - * icUInt32Number structSize; size in bytes of entire structure - * icUInt32Number numStructs; # of setting structures inlcuded - * icSettings data[icAny]; - *}icSettingsStruct; - * - * where data is "numStructs" of the following structure - * - *typedef struct { - * icSettingsSig settingSig; - * icUInt32Number size; size in bytes per setting value - * icUInt32Number numSettings; number of seting values - * icUInt32Number data[icAny]; - *}icSettings; - * - * where data is "numsettings" of one of the following: - * icUInt64Number resolution; - * icDeviceMedia media; - * icDeviceDither halftone; -*/ - -/* for use with the icResponseCurveSet16Type */ -typedef struct { - icUInt16Number channels; /* number of channels */ - icUInt16Number numTypes; /* count of meas. types */ - icUInt32Number data[icAny]; -}icResponse; - -/* where data is "numTypes" of the following - * icMeasUnitsSig sigType; - * icUInt32Number numMeas; one entry for each "channels" - * icXYZNumber meas; one xyz entry for each "channels" - * respective "numMeas" - * icResponse16Number respNum; one structure for each "channels" - * respective "numMeas" -*/ - -typedef struct { - icUInt16Number interval; /* device value scaled 0-FFFF */ - icUInt16Number pad; /* 0 */ - icS15Fixed16Number measurement; /* actual measurement value */ -} icResponse16Number; - -/*------------------------------------------------------------------------*/ -/* - * Tag Type definitions - */ - -/* - * Many of the structures contain variable length arrays. This - * is represented by the use of the convention. - * - * type data[icAny]; - */ - -/* The base part of each tag */ -typedef struct { - icTagTypeSignature sig; /* Signature */ - icInt8Number reserved[4]; /* Reserved, set to 0 */ -} icTagBase; - -/* curveType */ -typedef struct { - icTagBase base; /* Signature, "curv" */ - icCurve curve; /* The curve data */ -} icCurveType; - -/* dataType */ -typedef struct { - icTagBase base; /* Signature, "data" */ - icData data; /* The data structure */ -} icDataType; - -/* dateTimeType */ -typedef struct { - icTagBase base; /* Signature, "dtim" */ - icDateTimeNumber date; /* The date */ -} icDateTimeType; - -/* lut16Type */ -typedef struct { - icTagBase base; /* Signature, "mft2" */ - icLut16 lut; /* Lut16 data */ -} icLut16Type; - -/* lut8Type, input & output tables are always 256 bytes in length */ -typedef struct { - icTagBase base; /* Signature, "mft1" */ - icLut8 lut; /* Lut8 data */ -} icLut8Type; - -/* Measurement Type */ -typedef struct { - icTagBase base; /* Signature, "meas" */ - icMeasurement measurement; /* Measurement data */ -} icMeasurementType; - -/* Named color type */ -/* icNamedColor2Type, replaces icNamedColorType */ -typedef struct { - icTagBase base; /* Signature, "ncl2" */ - icNamedColor2 ncolor; /* Named color data */ -} icNamedColor2Type; - -/* Profile sequence description type */ -typedef struct { - icTagBase base; /* Signature, "pseq" */ - icProfileSequenceDesc desc; /* The seq description */ -} icProfileSequenceDescType; - -/* textDescriptionType */ -typedef struct { - icTagBase base; /* Signature, "desc" */ - icTextDescription desc; /* The description */ -} icTextDescriptionType; - -/* s15Fixed16Type */ -typedef struct { - icTagBase base; /* Signature, "sf32" */ - icS15Fixed16Array data; /* Array of values */ -} icS15Fixed16ArrayType; - -typedef struct { - icTagBase base; /* Signature, "scrn" */ - icScreening screen; /* Screening structure */ -} icScreeningType; - -/* sigType */ -typedef struct { - icTagBase base; /* Signature, "sig" */ - icSignature signature; /* The signature data */ -} icSignatureType; - -/* textType */ -typedef struct { - icTagBase base; /* Signature, "text" */ - icText data; /* Variable array of chars */ -} icTextType; - -/* u16Fixed16Type */ -typedef struct { - icTagBase base; /* Signature, "uf32" */ - icU16Fixed16Array data; /* Variable array of values */ -} icU16Fixed16ArrayType; - -/* Under color removal, black generation type */ -typedef struct { - icTagBase base; /* Signature, "bfd " */ - icUcrBg data; /* ucrBg structure */ -} icUcrBgType; - -/* uInt16Type */ -typedef struct { - icTagBase base; /* Signature, "ui16" */ - icUInt16Array data; /* Variable array of values */ -} icUInt16ArrayType; - -/* uInt32Type */ -typedef struct { - icTagBase base; /* Signature, "ui32" */ - icUInt32Array data; /* Variable array of values */ -} icUInt32ArrayType; - -/* uInt64Type */ -typedef struct { - icTagBase base; /* Signature, "ui64" */ - icUInt64Array data; /* Variable array of values */ -} icUInt64ArrayType; - -/* uInt8Type */ -typedef struct { - icTagBase base; /* Signature, "ui08" */ - icUInt8Array data; /* Variable array of values */ -} icUInt8ArrayType; - -/* viewingConditionsType */ -typedef struct { - icTagBase base; /* Signature, "view" */ - icViewingCondition view; /* Viewing conditions */ -} icViewingConditionType; - -/* XYZ Type */ -typedef struct { - icTagBase base; /* Signature, "XYZ" */ - icXYZArray data; /* Variable array of XYZ nums */ -} icXYZType; - -/* CRDInfoType where [0] is the CRD product name count and string and - * [1] -[5] are the rendering intents 0-4 counts and strings - */ -typedef struct { - icTagBase base; /* Signature, "crdi" */ - icCrdInfo info; /* 5 sets of counts & strings */ -}icCrdInfoType; - /* icCrdInfo productName; PS product count/string */ - /* icCrdInfo CRDName0; CRD name for intent 0 */ - /* icCrdInfo CRDName1; CRD name for intent 1 */ - /* icCrdInfo CRDName2; CRD name for intent 2 */ - /* icCrdInfo CRDName3; CRD name for intent 3 */ - -typedef struct { - icTagBase base; /* Signature, 'devs' */ - icSettingsData data; -}icDeviceSettingsType; - -typedef struct { - icTagBase base; /* Signature, 'rcs2' */ - icResponse data; -}icResponseCurveSet16Type; - -/* where data is structured as follows - * icUInt16Number channels; number of channels - * icUInt16Number numTypes; count of measurement types - * icUInt32Number offset[numTypes]; offset from byte 0 of tag to each - * response data set - * - * plus one or more of the following structures - * typedef struct { - * icMeasUnitsSig measurementUnit; sig of the meas. unit - * icUInt32Number perChannel[channels]; # of meas's per chan - * icXYZNumber measure[channels]; measurements of patch - * w/max colorant value - * icResponse16Number response[channels][perChannel[channels]]; - * } - */ - -/*------------------------------------------------------------------------*/ - -/* - * Lists of tags, tags, profile header and profile structure - */ - -/* A tag */ -typedef struct { - icTagSignature sig; /* The tag signature */ - icUInt32Number offset; /* Start of tag relative to - * start of header, Spec - * Clause 5 */ - icUInt32Number size; /* Size in bytes */ -} icTag; - -/* A Structure that may be used independently for a list of tags */ -typedef struct { - icUInt32Number count; /* Num tags in the profile */ - icTag tags[icAny]; /* Variable array of tags */ -} icTagList; - -/* The Profile header */ -typedef struct { - icUInt32Number size; /* Prof size in bytes */ - icSignature cmmId; /* CMM for profile */ - icUInt32Number version; /* Format version */ - icProfileClassSignature deviceClass; /* Type of profile */ - icColorSpaceSignature colorSpace; /* Clr space of data */ - icColorSpaceSignature pcs; /* PCS, XYZ or Lab */ - icDateTimeNumber date; /* Creation Date */ - icSignature magic; /* icMagicNumber */ - icPlatformSignature platform; /* Primary Platform */ - icUInt32Number flags; /* Various bits */ - icSignature manufacturer; /* Dev manufacturer */ - icUInt32Number model; /* Dev model number */ - icUInt64Number attributes; /* Device attributes */ - icUInt32Number renderingIntent;/* Rendering intent */ - icXYZNumber illuminant; /* Profile illuminant */ - icSignature creator; /* Profile creator */ - icInt8Number reserved[44]; /* Reserved */ -} icHeader; - -/* - * A profile, - * we can't use icTagList here because its not at the end of the structure - */ -typedef struct { - icHeader header; /* The header */ - icUInt32Number count; /* Num tags in the profile */ - icInt8Number data[icAny]; /* The tagTable and tagData */ -/* - * Data that follows is of the form - * - * icTag tagTable[icAny]; * The tag table - * icInt8Number tagData[icAny]; * The tag data - */ -} icProfile; - -/*------------------------------------------------------------------------*/ -/* Obsolete entries */ - -/* icNamedColor was replaced with icNamedColor2 */ -typedef struct { - icUInt32Number vendorFlag; /* Bottom 16 bits for IC use */ - icUInt32Number count; /* Count of named colors */ - icInt8Number data[icAny]; /* Named color data follows */ -/* - * Data that follows is of this form - * - * icInt8Number prefix[icAny]; * Prefix - * icInt8Number suffix[icAny]; * Suffix - * icInt8Number root1[icAny]; * Root name - * icInt8Number coords1[icAny]; * Color coordinates - * icInt8Number root2[icAny]; * Root name - * icInt8Number coords2[icAny]; * Color coordinates - * : - * : - * Repeat for root name and color coordinates up to (count-1) - */ -} icNamedColor; - -/* icNamedColorType was replaced by icNamedColor2Type */ -typedef struct { - icTagBase base; /* Signature, "ncol" */ - icNamedColor ncolor; /* Named color data */ -} icNamedColorType; - -#endif /* ICC9809_H */ diff -Nru ghostscript-9.04~dfsg/icclib/icc.c ghostscript-9.05~dfsg~20120125/icclib/icc.c --- ghostscript-9.04~dfsg/icclib/icc.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/icclib/icc.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,13094 +0,0 @@ -/* - * International Color Consortium Format Library (icclib) - * For ICC profile version 3.4 - * - * Author: Graeme W. Gill - * Date: 2002/04/22 - * Version: 2.02 - * - * Copyright 1997 - 2002 Graeme W. Gill - * See Licence.txt file for conditions of use. - */ - -/* - * TTBD: - * - * Add a "warning mode" to file reading, in which file format - * errors are ignored where possible, rather than generating - * a fatal error (see ICM_STRICT #define). - * - * NameColor Dump doesn't handle device space correctly - - * should use appropriate interpretation in case device is Lab etc. - * - * Should recognise & honour unicode 0xFFFE endian marker. - * Should generate it on writing too ? - * - * Should fix all write_number failure errors to indicate failed value. - * (Partially implemented - need to check all write_number functions) - * - * Make write fail error messages be specific on which element failed. - * - * Should add named color space lookup function support. - * - * Should probably reject reading or writing profiles with majv != 2 ? - * - * Would be nice to add generic ability to add new tag type handling, - * so that the base library doesn't need to be modified (ie. VideoCardGamma) ? - * - * Need to add DeviceSettings and OutputResponse tags to bring up to - * ICC.1:1998-09 [started but not complete] - * - */ - -#undef ICM_STRICT /* Not fully implimented - switch off strict checking of file format */ - -/* Trial: Make the default grid points of the Lab clut be symetrical about */ -/* a/b 0.0, and also make L = 100.0 fall on a grid point. */ -/* This seems a good idea. */ - -#define SYMETRICAL_DEFAULT_LAB_RANGE - -/* - * Change History: - * - * 2.02 - * Merged rename of [u]int64 to icm[Ui][I]nt64 (to work around - * AIX 5.1L portability bug) from Raph Levien. - * - * Fixed stray , in icmLookupOrder structure definition (from Dan Coby) - * - * 2.01 - * Change TextDescription code to not barf if #undef ICM_STRICT and - * Apple scriptcode not padded to 67 bytes. - * - * Add get_ranges() method to all Lu types, not just LuLut. - * Fix bug in PCS overide logic that was causing - * reverse conversions to apply the wrong conversion. - * - * Added Delta E convenience functions icmLabDE() and - * icmCIE94() etc. - * - * Merged Raph Levien's cleanups, to quiet gcc warnings. - * - * Merged another couple of warning cleanups from Jouk Jansen. - * - * 2.00 - * Change absolute conversion to be white point only, and use - * Bradford transform by default. (ie. we are now ignoring the - * comment in section 6.4.22 of the 1998 spec. about the - * media black point being used for absolute colorimetry, - * ignoring the recommendation on page 118 in section E.5, - * and are taking up the recommendation on page 124 in section - * E.16 that a more sophisticated chromatic adaption model be used.) - * - * This is for better compatibility with other CMM's, and to - * improve the results when using simple links between - * profiles with non-D50 white points. Standard profiles - * like sRGB will also be more accurate when interpreted - * with absolute colorimetric intent. - * This will cause some slight incompatibilty with previous - * versions of icclib. - * - * Added ColorSync 2.5 specific VideoCardGamma tag support - * (from Neil Okamoto) - * - * 1.31 - * Added file I/O class to allow substitution of alternative ICC profile - * file access. Provide standard file class instance, and memory image - * instance of file I/O class as default and example. - * Added an optional new_icc_a() object creator, that takes a memory - * allocator class instance. This allows an alternate memory heap to - * be used with the icc class. - * Renamed object free() methods to del() for more consistency with new(). - * - * 1.30 - * Added workaround for reading some Adobe profiles with confused header DateTime. - * Enhanced tag allocate() methods so that they can resize allocations. - * Enhanced icmLut_set_tables() to access grid points in a cache friendly order. - * Fixed bug in check_icc_legal() that caused bogus errors, removed - * uneccessary static declarations in icc.h, and fixed a bug in - * icmTable_lookup_bwd() that effected both accuracy and speed. (Thanks to Andrei Frolov) - * Removed icmAbsoluteColorimetricXYZ intent, and replaced it with - * a PCS overide capability. This adds a new parameter to get_luobj() - * Added Lab translations of some XYZ "dump" strings. - * Fix memory leak after failed tag read + rename_tag function - * + shared library support changes. (Thanks to Carles Llopis). - * Changed all the public 2str utility routines to a single function - * that can be used to interpret an enumeration or tag in a human - * readable form. - * - * 1.23 - * Fixed important bug in Lut read/write. The matrix values had their - * rows and columns switched. Not many profiles exercise this code. - * Thanks to David Gillman for discovering this problem. - * Fixup compiler complains about illegal enum values for icmCurveStyle, - * and icmDataStyle. Malloc memory icmLut_lookup_clut_nl for gw[], so that - * it is more friendly to systems with a limited stack. (Thanks to Dave White) - * - * 1.22 99/11/11 Snapshot of current code. - * Added more hooks to support inherited implementation of - * color conversion, used in Argyll to support reversing - * multi-dimentional table lookups. - * Cleaned up color conversion code to make it easier to follow. - * Adding simplex interpolation for non-Lab style input space interpolation. - * Fix Sun misalignment and realloc problems (Thanks to Allan N. Hessenflow) - * Fixed endian problem with Unicode on read and write. - * Expanded icmTextDescription_dump() to do hex dump of Unicode and ScriptCode. - * Changed over to ICC.1:1998-09 .h file. - * Started implementing ICC.1:1998-09, but not complete yet! - * - * 1.21 99/2/14 - * After re-reading Michael Bourgoin's 1998 SIGGRAPH notes, - * I have consolidated the Lut input index, and table value encodings. - * The default set_tables() scaling has been adjusted appropriately - * for this correction of Lab encoding. - * Trying to create an 8 bit XYZ Lut will now fail if icclib helper - * functions are used to create it. - * - * 1.20 99/2/7 - * Added profile color lookup functon. - * Added set_tables() support. - * Various bug fixes and enhancements. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef __sun -#include -#endif -#if defined(__IBMC__) && defined(_M_IX86) -#include -#endif -#include "icc.h" - -/* stdint.h defines SIZE_MAX, but not all platforms provide it */ -#ifndef SIZE_MAX -#define SIZE_MAX ((size_t)-1) -#endif - -/* ========================================================== */ -/* Default system interface object implementations */ - -/* Standard Stream file I/O icmFile compatible class */ -/* Note that this uses malloc, so replace class if */ -/* you need a different memory allocator. */ - -/* Set current position to offset. Return 0 on success, nz on failure. */ -static int icmFileStd_seek( -icmFile *pp, -long int offset -) { - icmFileStd *p = (icmFileStd *)pp; - - return fseek(p->fp, offset, SEEK_SET); -} - -/* Read count items of size length. Return number of items successfully read. */ -static size_t icmFileStd_read( -icmFile *pp, -void *buffer, -size_t size, -size_t count -) { - icmFileStd *p = (icmFileStd *)pp; - - return fread(buffer, size, count, p->fp); -} - -/* write count items of size length. Return number of items successfully written. */ -static size_t icmFileStd_write( -icmFile *pp, -void *buffer, -size_t size, -size_t count -) { - icmFileStd *p = (icmFileStd *)pp; - - return fwrite(buffer, size, count, p->fp); -} - -/* flush all write data out to secondary storage. Return nz on failure. */ -static int icmFileStd_flush( -icmFile *pp -) { - icmFileStd *p = (icmFileStd *)pp; - - return fflush(p->fp); -} - -/* we're done with the file object, return nz on failure */ -static int icmFileStd_delete( -icmFile *pp -) { - icmFileStd *p = (icmFileStd *)pp; - - if (p->doclose != 0) { - if (fclose(p->fp) != 0) - return 2; - } - - free(p); - return 0; -} - -/* Create icmFile given a (binary) FILE* */ -icmFile *new_icmFileStd_fp( -FILE *fp -) { - icmFileStd *p; - if ((p = (icmFileStd *) calloc(1,sizeof(icmFileStd))) == NULL) - return NULL; - p->seek = icmFileStd_seek; - p->read = icmFileStd_read; - p->write = icmFileStd_write; - p->flush = icmFileStd_flush; - p->del = icmFileStd_delete; - - p->fp = fp; - p->doclose = 0; - - return (icmFile *)p; -} - -/* Create icmFile given a file name */ -icmFile *new_icmFileStd_name( -char *name, -char *mode -) { - FILE *fp; - icmFile *p; -#if defined(O_BINARY) - char nmode[50]; -#endif - - if ((fp = fopen(name,mode)) == NULL) - return NULL; - -#if defined(O_BINARY) - strcpy(nmode, mode); - strcat(nmode, "b"); - if ((fp = freopen(name, nmode, fp)) == NULL) - return NULL; -#endif - - p = new_icmFileStd_fp(fp); - - if (p != NULL) { - icmFileStd *pp = (icmFileStd *)p; - pp->doclose = 1; - } - return p; -} - -/* ------------------------------------------------- */ -/* Memory image icmFile compatible class */ -/* Note that this uses malloc, so replace class if */ -/* you need a different memory allocator. */ - -/* Set current position to offset. Return 0 on success, nz on failure. */ -static int icmFileMem_seek( -icmFile *pp, -long int offset -) { - icmFileMem *p = (icmFileMem *)pp; - unsigned char *np; - - np = p->start + offset; - if (np < p->start || np >= p->end) - return 1; - p->cur = np; - return 0; -} - -/* Read count items of size length. Return number of items successfully read. */ -static size_t icmFileMem_read( -icmFile *pp, -void *buffer, -size_t size, -size_t count -) { - icmFileMem *p = (icmFileMem *)pp; - size_t len; - - if (count > 0 && size > SIZE_MAX / count) - return 0; - - len = size * count; - if (len > (p->end - p->cur)) { /* Too much */ - if (size > 0) - count = (p->end - p->cur)/size; - else - count = 0; - } - len = size * count; - if (len > 0) - memcpy (buffer, p->cur, len); - p->cur += len; - return count; -} - -/* write count items of size length. Return number of items successfully written. */ -static size_t icmFileMem_write( -icmFile *pp, -void *buffer, -size_t size, -size_t count -) { - icmFileMem *p = (icmFileMem *)pp; - size_t len; - - len = size * count; - if ((p->cur + len) >= p->end) { /* Too much */ - if (size > 0) - count = (p->end - p->cur)/size; - else - count = 0; - } - len = size * count; - if (len > 0) - memcpy (p->cur, buffer, len); - p->cur += len; - return count; -} - -/* flush all write data out to secondary storage. Return nz on failure. */ -static int icmFileMem_flush( -icmFile *pp -) { - return 0; -} - -/* we're done with the file object, return nz on failure */ -static int icmFileMem_delete( -icmFile *pp -) { - icmFileMem *p = (icmFileMem *)pp; - - free(p); - return 0; -} - -/* Create a memory image file access class */ -icmFile *new_icmFileMem( -void *base, /* Pointer to base of memory buffer */ -size_t length /* Number of bytes in buffer */ -) { - icmFileMem *p; - if ((p = (icmFileMem *) calloc(1,sizeof(icmFileMem))) == NULL) - return NULL; - p->seek = icmFileMem_seek; - p->read = icmFileMem_read; - p->write = icmFileMem_write; - p->flush = icmFileMem_flush; - p->del = icmFileMem_delete; - - p->cur = p->start = base; - p->end = p->start + length; - - return (icmFile *)p; -} - -/* ------------------------------------------------- */ -/* Standard Heap allocator icmAlloc compatible class */ -/* Just call the standard system function */ - -static void *icmAllocStd_malloc( -struct _icmAlloc *pp, -size_t size -) { - return malloc(size); -} - -static void *icmAllocStd_calloc( -struct _icmAlloc *pp, -size_t num, -size_t size -) { - return calloc(num, size); -} - -static void *icmAllocStd_realloc( -struct _icmAlloc *pp, -void *ptr, -size_t size -) { - return realloc(ptr, size); -} - -static void icmAllocStd_free( -struct _icmAlloc *pp, -void *ptr -) { - free(ptr); -} - -/* we're done with the AllocStd object */ -static void icmAllocStd_delete( -icmAlloc *pp -) { - icmAllocStd *p = (icmAllocStd *)pp; - - free(p); -} - -/* Create icmAllocStd */ -icmAlloc *new_icmAllocStd() { - icmAllocStd *p; - if ((p = (icmAllocStd *) calloc(1,sizeof(icmAllocStd))) == NULL) - return NULL; - p->malloc = icmAllocStd_malloc; - p->calloc = icmAllocStd_calloc; - p->realloc = icmAllocStd_realloc; - p->free = icmAllocStd_free; - p->del = icmAllocStd_delete; - - return (icmAlloc *)p; -} - -/* ========================================================== */ -/* Conversion support functions */ -/* Convert between ICC storage types and native C types */ -/* Write routine return non-zero if numbers can't be represented */ - -/* Unsigned */ -static unsigned int read_UInt8Number(char *p) { - unsigned int rv; - rv = (unsigned int)((ORD8 *)p)[0]; - return rv; -} - -static int write_UInt8Number(unsigned int d, char *p) { - if (d > 255) - return 1; - ((ORD8 *)p)[0] = (ORD8)d; - return 0; -} - -static unsigned int read_UInt16Number(char *p) { - unsigned int rv; - rv = 256 * (unsigned int)((ORD8 *)p)[0] - + (unsigned int)((ORD8 *)p)[1]; - return rv; -} - -static int write_UInt16Number(unsigned int d, char *p) { - if (d > 65535) - return 1; - ((ORD8 *)p)[0] = (ORD8)(d >> 8); - ((ORD8 *)p)[1] = (ORD8)(d); - return 0; -} - -static unsigned int read_UInt32Number(char *p) { - unsigned int rv; - rv = 16777216 * (unsigned int)((ORD8 *)p)[0] - + 65536 * (unsigned int)((ORD8 *)p)[1] - + 256 * (unsigned int)((ORD8 *)p)[2] - + (unsigned int)((ORD8 *)p)[3]; - return rv; -} - -static int write_UInt32Number(unsigned int d, char *p) { - ((ORD8 *)p)[0] = (ORD8)(d >> 24); - ((ORD8 *)p)[1] = (ORD8)(d >> 16); - ((ORD8 *)p)[2] = (ORD8)(d >> 8); - ((ORD8 *)p)[3] = (ORD8)(d); - return 0; -} - -static void read_UInt64Number(icmUint64 *d, char *p) { - d->h = 16777216 * (unsigned int)((ORD8 *)p)[0] - + 65536 * (unsigned int)((ORD8 *)p)[1] - + 256 * (unsigned int)((ORD8 *)p)[2] - + (unsigned int)((ORD8 *)p)[3]; - d->l = 16777216 * (unsigned int)((ORD8 *)p)[4] - + 65536 * (unsigned int)((ORD8 *)p)[5] - + 256 * (unsigned int)((ORD8 *)p)[6] - + (unsigned int)((ORD8 *)p)[7]; -} - -static int write_UInt64Number(icmUint64 *d, char *p) { - ((ORD8 *)p)[0] = (ORD8)(d->h >> 24); - ((ORD8 *)p)[1] = (ORD8)(d->h >> 16); - ((ORD8 *)p)[2] = (ORD8)(d->h >> 8); - ((ORD8 *)p)[3] = (ORD8)(d->h); - ((ORD8 *)p)[4] = (ORD8)(d->l >> 24); - ((ORD8 *)p)[5] = (ORD8)(d->l >> 16); - ((ORD8 *)p)[6] = (ORD8)(d->l >> 8); - ((ORD8 *)p)[7] = (ORD8)(d->l); - return 0; -} - -static double read_U8Fixed8Number(char *p) { - ORD32 o32; - o32 = 256 * (ORD32)((ORD8 *)p)[0] /* Read big endian 16 bit unsigned */ - + (ORD32)((ORD8 *)p)[1]; - return (double)o32/256.0; -} - -static int write_U8Fixed8Number(double d, char *p) { - ORD32 o32; - d = d * 256.0 + 0.5; - if (d >= 65536.0) - return 1; - if (d < 0.0) - return 1; - o32 = (ORD32)d; - ((ORD8 *)p)[0] = (ORD8)((o32) >> 8); - ((ORD8 *)p)[1] = (ORD8)((o32)); - return 0; -} - -static double read_U16Fixed16Number(char *p) { - ORD32 o32; - o32 = 16777216 * (ORD32)((ORD8 *)p)[0] /* Read big endian 32 bit unsigned */ - + 65536 * (ORD32)((ORD8 *)p)[1] - + 256 * (ORD32)((ORD8 *)p)[2] - + (ORD32)((ORD8 *)p)[3]; - return (double)o32/65536.0; -} - -static int write_U16Fixed16Number(double d, char *p) { - ORD32 o32; - d = d * 65536.0 + 0.5; - if (d >= 4294967296.0) - return 1; - if (d < 0.0) - return 1; - o32 = (ORD32)d; - ((ORD8 *)p)[0] = (ORD8)((o32) >> 24); - ((ORD8 *)p)[1] = (ORD8)((o32) >> 16); - ((ORD8 *)p)[2] = (ORD8)((o32) >> 8); - ((ORD8 *)p)[3] = (ORD8)((o32)); - return 0; -} - -#ifdef NEVER /* Not currently used anywhere */ - -/* Signed numbers */ -static int read_SInt8Number(char *p) { - int rv; - rv = (int)((INR8 *)p)[0]; - return rv; -} - -static int write_SInt8Number(int d, char *p) { - if (d > 127) - return 1; - else if (d < -128) - return 1; - ((INR8 *)p)[0] = (INR8)d; - return 0; -} - -static int read_SInt16Number(char *p) { - int rv; - rv = 256 * (int)((INR8 *)p)[0] - + (int)((ORD8 *)p)[1]; - return rv; -} - -static int write_SInt16Number(int d, char *p) { - if (d > 32767) - return 1; - else if (d < -32768) - return 1; - ((INR8 *)p)[0] = (INR8)(d >> 8); - ((ORD8 *)p)[1] = (ORD8)(d); - return 0; -} - -#endif /* NEVER */ - -static int read_SInt32Number(char *p) { - int rv; - rv = 16777216 * (int)((INR8 *)p)[0] - + 65536 * (int)((ORD8 *)p)[1] - + 256 * (int)((ORD8 *)p)[2] - + (int)((ORD8 *)p)[3]; - return rv; -} - -static int write_SInt32Number(int d, char *p) { - ((INR8 *)p)[0] = (INR8)(d >> 24); - ((ORD8 *)p)[1] = (ORD8)(d >> 16); - ((ORD8 *)p)[2] = (ORD8)(d >> 8); - ((ORD8 *)p)[3] = (ORD8)(d); - return 0; -} - -#ifdef NEVER /* Not currently used anywhere */ - -static void read_SInt64Number(icmInt64 *d, char *p) { - d->h = 16777216 * (int)((INR8 *)p)[0] - + 65536 * (int)((ORD8 *)p)[1] - + 256 * (int)((ORD8 *)p)[2] - + (int)((ORD8 *)p)[3]; - d->l = 16777216 * (unsigned int)((ORD8 *)p)[4] - + 65536 * (unsigned int)((ORD8 *)p)[5] - + 256 * (unsigned int)((ORD8 *)p)[6] - + (unsigned int)((ORD8 *)p)[7]; -} - -static int write_SInt64Number(icmInt64 *d, char *p) { - ((INR8 *)p)[0] = (INR8)(d->h >> 24); - ((ORD8 *)p)[1] = (ORD8)(d->h >> 16); - ((ORD8 *)p)[2] = (ORD8)(d->h >> 8); - ((ORD8 *)p)[3] = (ORD8)(d->h); - ((ORD8 *)p)[4] = (ORD8)(d->l >> 24); - ((ORD8 *)p)[5] = (ORD8)(d->l >> 16); - ((ORD8 *)p)[6] = (ORD8)(d->l >> 8); - ((ORD8 *)p)[7] = (ORD8)(d->l); - return 0; -} - -#endif /* NEVER */ - -static double read_S15Fixed16Number(char *p) { - INR32 i32; - i32 = 16777216 * (INR32)((INR8 *)p)[0] /* Read big endian 32 bit signed */ - + 65536 * (INR32)((ORD8 *)p)[1] - + 256 * (INR32)((ORD8 *)p)[2] - + (INR32)((ORD8 *)p)[3]; - return (double)i32/65536.0; -} - -static int write_S15Fixed16Number(double d, char *p) { - INR32 i32; - d = ceil(d * 65536.0); /* Beware! (int)(d + 0.5) doesn't work! */ - if (d >= 2147483648.0) - return 1; - if (d < -2147483648.0) - return 1; - i32 = (INR32)d; - ((INR8 *)p)[0] = (INR8)((i32) >> 24); /* Write big endian 32 bit signed */ - ((ORD8 *)p)[1] = (ORD8)((i32) >> 16); - ((ORD8 *)p)[2] = (ORD8)((i32) >> 8); - ((ORD8 *)p)[3] = (ORD8)((i32)); - return 0; -} - -/* PCS encoded numbers */ - -/* 16 bit XYZ - value range 0.0 - 1.9997 */ -static double read_PCSXYZ16Number(char *p) { - ORD32 o32; - o32 = 256 * (ORD32)((ORD8 *)p)[0] /* Read big endian 16 bit unsigned */ - + (ORD32)((ORD8 *)p)[1]; - return (double)o32/32768.0; -} - -static int write_PCSXYZ16Number(double d, char *p) { - ORD32 o32; - d = d * 32768.0 + 0.5; - if (d >= 65536.0) - return 1; - if (d < 0.0) - return 1; - o32 = (ORD32)d; - ((ORD8 *)p)[0] = (ORD8)((o32) >> 8); - ((ORD8 *)p)[1] = (ORD8)((o32)); - return 0; -} - -#ifdef NEVER /* Not currently used */ - -/* L part of 8 bit Lab - value range 0.0 - 100.0 */ -static double read_PCSL8Number(char *p) { - ORD32 o32; - o32 = (ORD32)((ORD8 *)p)[0]; /* Read big endian 8 bit unsigned */ - return (double)o32/2.550; -} - -static int write_PCSL8Number(double d, char *p) { - ORD32 o32; - d = d * 2.550 + 0.5; - if (d >= 256.0) - return 1; - if (d < 0.0) - return 1; - o32 = (ORD32)d; - ((ORD8 *)p)[0] = (ORD8)((o32)); - return 0; -} - -/* ab part of 8 bit Lab - value range -128.0 - 127.0 */ -static double read_PCSab8Number(char *p) { - ORD32 o32; - o32 = (ORD32)((ORD8 *)p)[0]; /* Read big endian 8 bit unsigned */ - return (double)o32-128.0; -} - -static int write_PCSab8Number(double d, char *p) { - ORD32 o32; - d = (d+128.0) + 0.5; - if (d >= 256.0) - return 1; - if (d < 0.0) - return 1; - o32 = (ORD32)d; - ((ORD8 *)p)[0] = (ORD8)((o32)); - return 0; -} - -#endif /* NEVER */ - -/* L part of 16 bit Lab - value range 0.0 - 100.0 */ -static double read_PCSL16Number(char *p) { - ORD32 o32; - o32 = 256 * (ORD32)((ORD8 *)p)[0] /* Read big endian 16 bit unsigned */ - + (ORD32)((ORD8 *)p)[1]; - return (double)o32/652.800; /* 0xff00/100.0 */ -} - -static int write_PCSL16Number(double d, char *p) { - ORD32 o32; - d = d * 652.800 + 0.5; - if (d >= 65536.0) - return 1; - if (d < 0.0) - return 1; - o32 = (ORD32)d; - ((ORD8 *)p)[0] = (ORD8)((o32) >> 8); - ((ORD8 *)p)[1] = (ORD8)((o32)); - return 0; -} - -/* ab part of 16 bit Lab - value range -128.0 - 127.9961 */ -static double read_PCSab16Number(char *p) { - ORD32 o32; - o32 = 256 * (ORD32)((ORD8 *)p)[0] /* Read big endian 16 bit unsigned */ - + (ORD32)((ORD8 *)p)[1]; - return ((double)o32/256.0)-128.0; -} - -static int write_PCSab16Number(double d, char *p) { - ORD32 o32; - d = (d+128.0) * 256.0 + 0.5; - if (d >= 65536.0) - return 1; - if (d < 0.0) - return 1; - o32 = (ORD32)d; - ((ORD8 *)p)[0] = (ORD8)((o32) >> 8); - ((ORD8 *)p)[1] = (ORD8)((o32)); - return 0; -} - -/* Device coordinate as 8 bit value range 0.0 - 1.0 */ -static double read_DCS8Number(char *p) { - unsigned int rv; - rv = (unsigned int)((ORD8 *)p)[0]; - return (double)rv/255.0; -} - -static int write_DCS8Number(double d, char *p) { - ORD32 o32; - d = d * 255.0 + 0.5; - if (d >= 256.0) - return 1; - if (d < 0.0) - return 1; - o32 = (ORD32)d; - ((ORD8 *)p)[0] = (ORD8)(o32); - return 0; -} - -/* Device coordinate as 16 bit value range 0.0 - 1.0 */ -static double read_DCS16Number(char *p) { - unsigned int rv; - rv = 256 * (unsigned int)((ORD8 *)p)[0] - + (unsigned int)((ORD8 *)p)[1]; - return (double)rv/65535.0; -} - -static int write_DCS16Number(double d, char *p) { - ORD32 o32; - d = d * 65535.0 + 0.5; - if (d >= 65536.0) - return 1; - if (d < 0.0) - return 1; - o32 = (ORD32)d; - ((ORD8 *)p)[0] = (ORD8)(o32 >> 8); - ((ORD8 *)p)[1] = (ORD8)(o32); - return 0; -} - -/* ---------------------------------------------------------- */ -/* Auiliary function - return a string that represents a tag */ -/* Note - returned buffers are static, can only be used 5 */ -/* times before buffers get reused. */ -char *tag2str( - int tag -) { - int i; - static int si = 0; /* String buffer index */ - static char buf[5][20]; /* String buffers */ - char *bp; - unsigned char c[4]; - - bp = buf[si++]; - si %= 5; /* Rotate through buffers */ - - c[0] = 0xff & (tag >> 24); - c[1] = 0xff & (tag >> 16); - c[2] = 0xff & (tag >> 8); - c[3] = 0xff & (tag >> 0); - for (i = 0; i < 4; i++) { /* Can we represent it as a string ? */ - if (!isprint(c[i])) - break; - } - if (i < 4) { /* Not printable - use hex */ - sprintf(bp,"0x%x",tag); - } else { /* Printable */ - sprintf(bp,"'%c%c%c%c'",c[0],c[1],c[2],c[3]); - } - return bp; -} - -/* Auiliary function - return a tag created from a string */ -int str2tag( - const char *str -) { - unsigned long tag; - tag = (((unsigned long)str[0]) << 24) - + (((unsigned long)str[1]) << 16) - + (((unsigned long)str[2]) << 8) - + (((unsigned long)str[3])); - return (int)tag; -} - -/* helper - return 1 if the string doesn't have a */ -/* null terminator, return 0 if it does. */ -/* Note: will return 1 if len == 0 */ -static int check_null_string(char *cp, int len) { - for (; len > 0; len--) { - if (*cp++ == '\000') - break; - } - if (len == 0) - return 1; - return 0; -} - -/* helper - return 1 if the string doesn't have a */ -/* null terminator, return 0 if it does. */ -/* Note: will return 1 if len == 0 */ -/* Unicode version */ -static int check_null_string16(char *cp, int len) { - for (; len > 0; len--) { /* Length is in characters */ - if (cp[0] == 0 && cp[1] == 0) - break; - cp += 2; - } - if (len == 0) - return 1; - return 0; -} - -/* Color Space to number of component conversion */ -/* Return 0 on error */ -static unsigned int number_ColorSpaceSignature(icColorSpaceSignature sig) { - switch(sig) { - case icSigXYZData: - return 3; - case icSigLabData: - return 3; - case icSigLuvData: - return 3; - case icSigYCbCrData: - return 3; - case icSigYxyData: - return 3; - case icSigRgbData: - return 3; - case icSigGrayData: - return 1; - case icSigHsvData: - return 3; - case icSigHlsData: - return 3; - case icSigCmykData: - return 4; - case icSigCmyData: - return 3; - case icSig2colorData: - return 2; - case icSig3colorData: - return 3; - case icSig4colorData: - return 4; - case icSig5colorData: - case icSigMch5Data: - return 5; - case icSig6colorData: - case icSigMch6Data: - return 6; - case icSig7colorData: - case icSigMch7Data: - return 7; - case icSig8colorData: - case icSigMch8Data: - return 8; - case icSig9colorData: - return 9; - case icSig10colorData: - return 10; - case icSig11colorData: - return 11; - case icSig12colorData: - return 12; - case icSig13colorData: - return 13; - case icSig14colorData: - return 14; - case icSig15colorData: - return 15; - default: - return 0; - } -} - -/* ------------------------------------------------------- */ -/* Flag dump functions */ -/* Note - returned buffers are static, can only be used 5 */ -/* times before buffers get reused. */ - -/* Screening Encodings */ -static char *string_ScreenEncodings(unsigned long flags) { - static int si = 0; /* String buffer index */ - static char buf[5][80]; /* String buffers */ - char *bp, *cp; - - cp = bp = buf[si++]; - si %= 5; /* Rotate through buffers */ - - if (flags & icPrtrDefaultScreensTrue) { - sprintf(cp,"Default Screen"); - } else { - sprintf(cp,"No Default Screen"); - } - cp = cp + strlen(cp); - if (flags & icLinesPerInch) { - sprintf(cp,", Lines Per Inch"); - } else { - sprintf(cp,", Lines Per cm"); - } - cp = cp + strlen(cp); - - return bp; -} - -/* Device attributes */ -static char *string_DeviceAttributes(unsigned long flags) { - static int si = 0; /* String buffer index */ - static char buf[5][80]; /* String buffers */ - char *bp, *cp; - - cp = bp = buf[si++]; - si %= 5; /* Rotate through buffers */ - - if (flags & icTransparency) { - sprintf(cp,"Transparency"); - } else { - sprintf(cp,"Reflective"); - } - cp = cp + strlen(cp); - if (flags & icMatte) { - sprintf(cp,", Matte"); - } else { - sprintf(cp,", Glossy"); - } - cp = cp + strlen(cp); - - return bp; -} - -/* Profile header flags */ -static char *string_ProfileHeaderFlags(unsigned long flags) { - static int si = 0; /* String buffer index */ - static char buf[5][80]; /* String buffers */ - char *bp, *cp; - - cp = bp = buf[si++]; - si %= 5; /* Rotate through buffers */ - - if (flags & icEmbeddedProfileTrue) { - sprintf(cp,"Embedded Profile"); - } else { - sprintf(cp,"Not Embedded Profile"); - } - cp = cp + strlen(cp); - if (flags & icUseWithEmbeddedDataOnly) { - sprintf(cp,", Use with embedded data only"); - } else { - sprintf(cp,", Use anywhere"); - } - cp = cp + strlen(cp); - - return bp; -} - -static char *string_AsciiOrBinaryData(unsigned long flags) { - static int si = 0; /* String buffer index */ - static char buf[5][80]; /* String buffers */ - char *bp, *cp; - - cp = bp = buf[si++]; - si %= 5; /* Rotate through buffers */ - - if (flags & icBinaryData) { - sprintf(cp,"Binary"); - } else { - sprintf(cp,"Ascii"); - } - cp = cp + strlen(cp); - - return bp; -} - -/* ------------------------------------------------------------ */ -/* Enumeration dump functions */ -/* Note - returned buffers are static, can only be used once */ -/* before buffers get reused if type is unknown. */ - -/* public tags and sizes */ -static const char *string_TagSignature(icTagSignature sig) { - static char buf[80]; - switch(sig) { - case icSigAToB0Tag: - return "AToB0 Multidimentional Transform"; - case icSigAToB1Tag: - return "AToB1 Multidimentional Transform"; - case icSigAToB2Tag: - return "AToB2 Multidimentional Transform"; - case icSigBlueColorantTag: - return "Blue Colorant"; - case icSigBlueTRCTag: - return "Blue Tone Reproduction Curve"; - case icSigBToA0Tag: - return "BToA0 Multidimentional Transform"; - case icSigBToA1Tag: - return "BToA1 Multidimentional Transform"; - case icSigBToA2Tag: - return "BToA2 Multidimentional Transform"; - case icSigCalibrationDateTimeTag: - return "Calibration Date & Time"; - case icSigCharTargetTag: - return "Characterization Target"; - case icSigCopyrightTag: - return "Copyright"; - case icSigCrdInfoTag: - return "CRD Info"; - case icSigDeviceMfgDescTag: - return "Device Manufacturer Description"; - case icSigDeviceModelDescTag: - return "Device Model Description"; - case icSigGamutTag: - return "Gamut"; - case icSigGrayTRCTag: - return "Gray Tone Reproduction Curve"; - case icSigGreenColorantTag: - return "Green Colorant"; - case icSigGreenTRCTag: - return "Green Tone Reproduction Curve"; - case icSigLuminanceTag: - return "Luminance"; - case icSigMeasurementTag: - return "Measurement"; - case icSigMediaBlackPointTag: - return "Media Black Point"; - case icSigMediaWhitePointTag: - return "Media White Point"; - case icSigNamedColorTag: - return "Named Color"; - case icSigNamedColor2Tag: - return "Named Color 2"; - case icSigPreview0Tag: - return "Preview0"; - case icSigPreview1Tag: - return "Preview1"; - case icSigPreview2Tag: - return "Preview2"; - case icSigProfileDescriptionTag: - return "Profile Description"; - case icSigProfileSequenceDescTag: - return "Profile Sequence"; - case icSigPs2CRD0Tag: - return "PS Level 2 CRD perceptual"; - case icSigPs2CRD1Tag: - return "PS Level 2 CRD colorimetric"; - case icSigPs2CRD2Tag: - return "PS Level 2 CRD saturation"; - case icSigPs2CRD3Tag: - return "PS Level 2 CRD absolute"; - case icSigPs2CSATag: - return "PS Level 2 color space array"; - case icSigPs2RenderingIntentTag: - return "PS Level 2 Rendering Intent"; - case icSigRedColorantTag: - return "Red Colorant"; - case icSigRedTRCTag: - return "Red Tone Reproduction Curve"; - case icSigScreeningDescTag: - return "Screening Description"; - case icSigScreeningTag: - return "Screening Attributes"; - case icSigTechnologyTag: - return "Device Technology"; - case icSigUcrBgTag: - return "Under Color Removal & Black Generation"; - case icSigVideoCardGammaTag: - return "Video Card Gamma Curve"; - case icSigViewingCondDescTag: - return "Viewing Condition Description"; - case icSigViewingConditionsTag: - return "Viewing Condition Paramaters"; - default: - sprintf(buf,"Unrecognized - %s",tag2str(sig)); - return buf; - } -} - -/* technology signature descriptions */ -static const char *string_TechnologySignature(icTechnologySignature sig) { - static char buf[80]; - switch(sig) { - case icSigDigitalCamera: - return "Digital Camera"; - case icSigFilmScanner: - return "Film Scanner"; - case icSigReflectiveScanner: - return "Reflective Scanner"; - case icSigInkJetPrinter: - return "InkJet Printer"; - case icSigThermalWaxPrinter: - return "Thermal WaxPrinter"; - case icSigElectrophotographicPrinter: - return "Electrophotographic Printer"; - case icSigElectrostaticPrinter: - return "Electrostatic Printer"; - case icSigDyeSublimationPrinter: - return "DyeSublimation Printer"; - case icSigPhotographicPaperPrinter: - return "Photographic Paper Printer"; - case icSigFilmWriter: - return "Film Writer"; - case icSigVideoMonitor: - return "Video Monitor"; - case icSigVideoCamera: - return "Video Camera"; - case icSigProjectionTelevision: - return "Projection Television"; - case icSigCRTDisplay: - return "Cathode Ray Tube Display"; - case icSigPMDisplay: - return "Passive Matrix Display"; - case icSigAMDisplay: - return "Active Matrix Display"; - case icSigPhotoCD: - return "Photo CD"; - case icSigPhotoImageSetter: - return "Photo ImageSetter"; - case icSigGravure: - return "Gravure"; - case icSigOffsetLithography: - return "Offset Lithography"; - case icSigSilkscreen: - return "Silkscreen"; - case icSigFlexography: - return "Flexography"; - default: - sprintf(buf,"Unrecognized - %s",tag2str(sig)); - return buf; - } -} - -/* type signatures */ -static const char *string_TypeSignature(icTagTypeSignature sig) { - static char buf[80]; - switch(sig) { - case icSigCurveType: - return "Curve"; - case icSigDataType: - return "Data"; - case icSigDateTimeType: - return "DateTime"; - case icSigLut16Type: - return "Lut16"; - case icSigLut8Type: - return "Lut8"; - case icSigMeasurementType: - return "Measurement"; - case icSigNamedColorType: - return "Named Color"; - case icSigProfileSequenceDescType: - return "Profile Sequence Desc"; - case icSigS15Fixed16ArrayType: - return "S15Fixed16 Array"; - case icSigScreeningType: - return "Screening"; - case icSigSignatureType: - return "Signature"; - case icSigTextType: - return "Text"; - case icSigTextDescriptionType: - return "Text Description"; - case icSigU16Fixed16ArrayType: - return "U16Fixed16 Array"; - case icSigUcrBgType: - return "Under Color Removal & Black Generation"; - case icSigUInt16ArrayType: - return "UInt16 Array"; - case icSigUInt32ArrayType: - return "UInt32 Array"; - case icSigUInt64ArrayType: - return "UInt64 Array"; - case icSigUInt8ArrayType: - return "UInt8 Array"; - case icSigVideoCardGammaType: - return "Video Card Gamma"; - case icSigViewingConditionsType: - return "Viewing Conditions"; - case icSigXYZType: - return "XYZ (Array?)"; - case icSigNamedColor2Type: - return "Named Color 2"; - case icSigCrdInfoType: - return "CRD Info"; - default: - sprintf(buf,"Unrecognized - %s",tag2str(sig)); - return buf; - } -} - -/* Color Space Signatures */ -static const char *string_ColorSpaceSignature(icColorSpaceSignature sig) { - static char buf[80]; - switch(sig) { - case icSigXYZData: - return "XYZ"; - case icSigLabData: - return "Lab"; - case icSigLuvData: - return "Luv"; - case icSigYCbCrData: - return "YCbCr"; - case icSigYxyData: - return "Yxy"; - case icSigRgbData: - return "RGB"; - case icSigGrayData: - return "Gray"; - case icSigHsvData: - return "HSV"; - case icSigHlsData: - return "HLS"; - case icSigCmykData: - return "CMYK"; - case icSigCmyData: - return "CMY"; - case icSig2colorData: - return "2 Color"; - case icSig3colorData: - return "3 Color"; - case icSig4colorData: - return "4 Color"; - case icSig5colorData: - case icSigMch5Data: - return "5 Color"; - case icSig6colorData: - case icSigMch6Data: - return "6 Color"; - case icSig7colorData: - case icSigMch7Data: - return "7 Color"; - case icSig8colorData: - case icSigMch8Data: - return "8 Color"; - case icSig9colorData: - return "9 Color"; - case icSig10colorData: - return "10 Color"; - case icSig11colorData: - return "11 Color"; - case icSig12colorData: - return "12 Color"; - case icSig13colorData: - return "13 Color"; - case icSig14colorData: - return "14 Color"; - case icSig15colorData: - return "15 Color"; - default: - sprintf(buf,"Unrecognized - %s",tag2str(sig)); - return buf; - } -} - -#ifdef NEVER -/* Public version of above */ -char *ColorSpaceSignature2str(icColorSpaceSignature sig) { - return string_ColorSpaceSignature(sig); -} -#endif - -/* profileClass enumerations */ -static const char *string_ProfileClassSignature(icProfileClassSignature sig) { - static char buf[80]; - switch(sig) { - case icSigInputClass: - return "Input"; - case icSigDisplayClass: - return "Display"; - case icSigOutputClass: - return "Output"; - case icSigLinkClass: - return "Link"; - case icSigAbstractClass: - return "Abstract"; - case icSigColorSpaceClass: - return "Color Space"; - case icSigNamedColorClass: - return "Named Color"; - default: - sprintf(buf,"Unrecognized - %s",tag2str(sig)); - return buf; - } -} - -/* Platform Signatures */ -static const char *string_PlatformSignature(icPlatformSignature sig) { - static char buf[80]; - switch(sig) { - case icSigMacintosh: - return "Macintosh"; - case icSigMicrosoft: - return "Microsoft"; - case icSigSolaris: - return "Solaris"; - case icSigSGI: - return "SGI"; - case icSigTaligent: - return "Taligent"; - default: - sprintf(buf,"Unrecognized - %s",tag2str(sig)); - return buf; - } -} - -/* Measurement Geometry, used in the measurmentType tag */ -static const char *string_MeasurementGeometry(icMeasurementGeometry sig) { - static char buf[30]; - switch(sig) { - case icGeometryUnknown: - return "Unknown"; - case icGeometry045or450: - return "0/45 or 45/0"; - case icGeometry0dord0: - return "0/d or d/0"; - default: - sprintf(buf,"Unrecognized - 0x%x",sig); - return buf; - } -} - -/* Rendering Intents, used in the profile header */ -static const char *string_RenderingIntent(icRenderingIntent sig) { - static char buf[30]; - switch(sig) { - case icPerceptual: - return "Perceptual"; - case icRelativeColorimetric: - return "Relative Colorimetric"; - case icSaturation: - return "Saturation"; - case icAbsoluteColorimetric: - return "Absolute Colorimetric"; - default: - sprintf(buf,"Unrecognized - 0x%x",sig); - return buf; - } -} - -/* Different Spot Shapes currently defined, used for screeningType */ -static const char *string_SpotShape(icSpotShape sig) { - static char buf[30]; - switch(sig) { - case icSpotShapeUnknown: - return "Unknown"; - case icSpotShapePrinterDefault: - return "Printer Default"; - case icSpotShapeRound: - return "Round"; - case icSpotShapeDiamond: - return "Diamond"; - case icSpotShapeEllipse: - return "Ellipse"; - case icSpotShapeLine: - return "Line"; - case icSpotShapeSquare: - return "Square"; - case icSpotShapeCross: - return "Cross"; - default: - sprintf(buf,"Unrecognized - 0x%x",sig); - return buf; - } -} - -/* Standard Observer, used in the measurmentType tag */ -static const char *string_StandardObserver(icStandardObserver sig) { - static char buf[30]; - switch(sig) { - case icStdObsUnknown: - return "Unknown"; - case icStdObs1931TwoDegrees: - return "1931 Two Degrees"; - case icStdObs1964TenDegrees: - return "1964 Ten Degrees"; - default: - sprintf(buf,"Unrecognized - 0x%x",sig); - return buf; - } -} - -/* Pre-defined illuminants, used in measurement and viewing conditions type */ -static const char *string_Illuminant(icIlluminant sig) { - static char buf[30]; - switch(sig) { - case icIlluminantUnknown: - return "Unknown"; - case icIlluminantD50: - return "D50"; - case icIlluminantD65: - return "D65"; - case icIlluminantD93: - return "D93"; - case icIlluminantF2: - return "F2"; - case icIlluminantD55: - return "D55"; - case icIlluminantA: - return "A"; - case icIlluminantEquiPowerE: - return "Equi-Power(E)"; - case icIlluminantF8: - return "F8"; - default: - sprintf(buf,"Unrecognized - 0x%x",sig); - return buf; - } -} - -/* Return a text abreviation of a color lookup algorithm */ -static const char *string_LuAlg(icmLuAlgType alg) { - static char buf[80]; - - switch(alg) { - case icmMonoFwdType: - return "MonoFwd"; - case icmMonoBwdType: - return "MonoBwd"; - case icmMatrixFwdType: - return "MatrixFwd"; - case icmMatrixBwdType: - return "MatrixBwd"; - case icmLutType: - return "Lut"; - default: - sprintf(buf,"Unrecognized - %d",alg); - return buf; - } -} - -/* Return a string description of the given enumeration value */ -/* Public: */ -const char *icm2str(icmEnumType etype, int enumval) { - - switch(etype) { - case icmScreenEncodings: - return string_ScreenEncodings((unsigned long) enumval); - case icmDeviceAttributes: - return string_DeviceAttributes((unsigned long) enumval); - case icmProfileHeaderFlags: - return string_ProfileHeaderFlags((unsigned long) enumval); - case icmAsciiOrBinaryData: - return string_AsciiOrBinaryData((unsigned long) enumval); - case icmTagSignature: - return string_TagSignature((icTagSignature) enumval); - case icmTechnologySignature: - return string_TechnologySignature((icTechnologySignature) enumval); - case icmTypeSignature: - return string_TypeSignature((icTagTypeSignature) enumval); - case icmColorSpaceSignature: - return string_ColorSpaceSignature((icColorSpaceSignature) enumval); - case icmProfileClassSignaure: - return string_ProfileClassSignature((icProfileClassSignature) enumval); - case icmPlatformSignature: - return string_PlatformSignature((icPlatformSignature) enumval); - case icmMeasurementGeometry: - return string_MeasurementGeometry((icMeasurementGeometry) enumval); - case icmRenderingIntent: - return string_RenderingIntent((icRenderingIntent) enumval); - case icmSpotShape: - return string_SpotShape((icSpotShape) enumval); - case icmStandardObserver: - return string_StandardObserver((icStandardObserver) enumval); - case icmIlluminant: - return string_Illuminant((icIlluminant) enumval); - case icmLuAlg: - return string_LuAlg((icmLuAlgType) enumval); - default: - return "enum2str got unknown type"; - } -} - -/* ========================================================== */ -/* Object I/O routines */ -/* ========================================================== */ -/* icmUInt8Array object */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmUInt8Array_get_size( - icmBase *pp -) { - icmUInt8Array *p = (icmUInt8Array *)pp; - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ - len += p->size * 1; /* 1 byte for each UInt8 */ - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmUInt8Array_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmUInt8Array *p = (icmUInt8Array *)pp; - icc *icp = p->icp; - int rv = 0; - unsigned long i, size; - char *bp, *buf; - - if (len < 8) { - sprintf(icp->err,"icmUInt8Array_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmUInt8Array_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmUInt8Array_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - p->size = size = (len - 8)/1; /* Number of elements in the array */ - - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - icp->al->free(icp->al, buf); - sprintf(icp->err,"icmUInt8Array_read: Wrong tag type for icmUInt8Array"); - return icp->errc = 1; - } - bp += 8; /* Skip padding */ - - /* Read all the data from the buffer */ - for (i = 0; i < size; i++, bp += 1) { - p->data[i] = read_UInt8Number(bp); - } - icp->al->free(p->icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmUInt8Array_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmUInt8Array *p = (icmUInt8Array *)pp; - icc *icp = p->icp; - unsigned long i; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmUInt8Array_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmUInt8Array_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - bp += 8; /* Skip padding */ - - /* Write all the data to the buffer */ - for (i = 0; i < p->size; i++, bp += 1) { - if ((rv = write_UInt8Number(p->data[i],bp)) != 0) { - sprintf(icp->err,"icmUInt8Array_write: write_UInt8umber() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmUInt8Array_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmUInt8Array_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmUInt8Array *p = (icmUInt8Array *)pp; - if (verb <= 0) - return; - - fprintf(op,"UInt8Array:\n"); - fprintf(op," No. elements = %lu\n",p->size); - if (verb >= 2) { - unsigned long i; - for (i = 0; i < p->size; i++) - fprintf(op," %lu: %u\n",i,p->data[i]); - } -} - -/* Allocate variable sized data elements */ -static int icmUInt8Array_allocate( - icmBase *pp -) { - icmUInt8Array *p = (icmUInt8Array *)pp; - icc *icp = p->icp; - - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); - if ((p->data = (unsigned int *) icp->al->calloc(icp->al, p->size, sizeof(unsigned int))) == NULL) { - sprintf(icp->err,"icmUInt8Array_alloc: calloc() of icmUInt8Array data failed"); - return icp->errc = 2; - } - p->_size = p->size; - } - return 0; -} - -/* Free all storage in the object */ -static void icmUInt8Array_delete( - icmBase *pp -) { - icmUInt8Array *p = (icmUInt8Array *)pp; - icc *icp = p->icp; - - if (p->data != NULL) - icp->al->free(icp->al, p->data); - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmUInt8Array( - icc *icp -) { - icmUInt8Array *p; - if ((p = (icmUInt8Array *) icp->al->calloc(icp->al,1,sizeof(icmUInt8Array))) == NULL) - return NULL; - p->ttype = icSigUInt8ArrayType; - p->refcount = 1; - p->get_size = icmUInt8Array_get_size; - p->read = icmUInt8Array_read; - p->write = icmUInt8Array_write; - p->dump = icmUInt8Array_dump; - p->allocate = icmUInt8Array_allocate; - p->del = icmUInt8Array_delete; - p->icp = icp; - - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ -/* icmUInt16Array object */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmUInt16Array_get_size( - icmBase *pp -) { - icmUInt16Array *p = (icmUInt16Array *)pp; - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ - if (p->size > (UINT_MAX - len) / 2) { - p->icp->errc = 1; - return (unsigned int) -1; - } - len += p->size * 2; /* 2 bytes for each UInt16 */ - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmUInt16Array_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmUInt16Array *p = (icmUInt16Array *)pp; - icc *icp = p->icp; - int rv = 0; - unsigned long i, size; - char *bp, *buf; - - if (len < 8) { - sprintf(icp->err,"icmUInt16Array_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmUInt16Array_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmUInt16Array_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - p->size = size = (len - 8)/2; /* Number of elements in the array */ - - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - sprintf(icp->err,"icmUInt16Array_read: Wrong tag type for icmUInt16Array"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - bp += 8; /* Skip padding */ - - /* Read all the data from the buffer */ - for (i = 0; i < size; i++, bp += 2) { - p->data[i] = read_UInt16Number(bp); - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmUInt16Array_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmUInt16Array *p = (icmUInt16Array *)pp; - icc *icp = p->icp; - unsigned long i; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmUInt16Array_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmUInt16Array_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - - /* Write all the data to the buffer */ - bp += 8; /* Skip padding */ - for (i = 0; i < p->size; i++, bp += 2) { - if ((rv = write_UInt16Number(p->data[i],bp)) != 0) { - sprintf(icp->err,"icmUInt16Array_write: write_UInt16umber() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmUInt16Array_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmUInt16Array_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmUInt16Array *p = (icmUInt16Array *)pp; - if (verb <= 0) - return; - - fprintf(op,"UInt16Array:\n"); - fprintf(op," No. elements = %lu\n",p->size); - if (verb >= 2) { - unsigned long i; - for (i = 0; i < p->size; i++) - fprintf(op," %lu: %u\n",i,p->data[i]); - } -} - -/* Allocate variable sized data elements */ -static int icmUInt16Array_allocate( - icmBase *pp -) { - icmUInt16Array *p = (icmUInt16Array *)pp; - icc *icp = p->icp; - - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); - if ((p->data = (unsigned int *) icp->al->calloc(icp->al, p->size, sizeof(unsigned int))) == NULL) { - sprintf(icp->err,"icmUInt16Array_alloc: calloc() of icmUInt16Array data failed"); - return icp->errc = 2; - } - p->_size = p->size; - } - return 0; -} - -/* Free all storage in the object */ -static void icmUInt16Array_delete( - icmBase *pp -) { - icmUInt16Array *p = (icmUInt16Array *)pp; - icc *icp = p->icp; - - if (p->data != NULL) - icp->al->free(icp->al, p->data); - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmUInt16Array( - icc *icp -) { - icmUInt16Array *p; - if ((p = (icmUInt16Array *) icp->al->calloc(icp->al,1,sizeof(icmUInt16Array))) == NULL) - return NULL; - p->ttype = icSigUInt16ArrayType; - p->refcount = 1; - p->get_size = icmUInt16Array_get_size; - p->read = icmUInt16Array_read; - p->write = icmUInt16Array_write; - p->dump = icmUInt16Array_dump; - p->allocate = icmUInt16Array_allocate; - p->del = icmUInt16Array_delete; - p->icp = icp; - - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ -/* icmUInt32Array object */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmUInt32Array_get_size( - icmBase *pp -) { - icmUInt32Array *p = (icmUInt32Array *)pp; - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ - if (p->size > (UINT_MAX - len) / 4) { - p->icp->errc = 1; - return (unsigned int) -1; - } - len += p->size * 4; /* 4 bytes for each UInt32 */ - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmUInt32Array_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmUInt32Array *p = (icmUInt32Array *)pp; - icc *icp = p->icp; - int rv = 0; - unsigned long i, size; - char *bp, *buf; - - if (len < 8) { - sprintf(icp->err,"icmUInt32Array_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmUInt32Array_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmUInt32Array_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - p->size = size = (len - 8)/4; /* Number of elements in the array */ - - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - sprintf(icp->err,"icmUInt32Array_read: Wrong tag type for icmUInt32Array"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - bp += 8; /* Skip padding */ - - /* Read all the data from the buffer */ - for (i = 0; i < size; i++, bp += 4) { - p->data[i] = read_UInt32Number(bp); - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmUInt32Array_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmUInt32Array *p = (icmUInt32Array *)pp; - icc *icp = p->icp; - unsigned long i; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmUInt32Array_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmUInt32Array_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - - /* Write all the data to the buffer */ - bp += 8; /* Skip padding */ - for (i = 0; i < p->size; i++, bp += 4) { - if ((rv = write_UInt32Number(p->data[i],bp)) != 0) { - sprintf(icp->err,"icmUInt32Array_write: write_UInt32umber() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmUInt32Array_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmUInt32Array_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmUInt32Array *p = (icmUInt32Array *)pp; - if (verb <= 0) - return; - - fprintf(op,"UInt32Array:\n"); - fprintf(op," No. elements = %lu\n",p->size); - if (verb >= 2) { - unsigned long i; - for (i = 0; i < p->size; i++) - fprintf(op," %lu: %u\n",i,p->data[i]); - } -} - -/* Allocate variable sized data elements */ -static int icmUInt32Array_allocate( - icmBase *pp -) { - icmUInt32Array *p = (icmUInt32Array *)pp; - icc *icp = p->icp; - - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); - if ((p->data = (unsigned int *) icp->al->calloc(icp->al, p->size, sizeof(unsigned int))) == NULL) { - sprintf(icp->err,"icmUInt32Array_alloc: calloc() of icmUInt32Array data failed"); - return icp->errc = 2; - } - p->_size = p->size; - } - return 0; -} - -/* Free all storage in the object */ -static void icmUInt32Array_delete( - icmBase *pp -) { - icmUInt32Array *p = (icmUInt32Array *)pp; - icc *icp = p->icp; - - if (p->data != NULL) - icp->al->free(icp->al, p->data); - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmUInt32Array( - icc *icp -) { - icmUInt32Array *p; - if ((p = (icmUInt32Array *) icp->al->calloc(icp->al,1,sizeof(icmUInt32Array))) == NULL) - return NULL; - p->ttype = icSigUInt32ArrayType; - p->refcount = 1; - p->get_size = icmUInt32Array_get_size; - p->read = icmUInt32Array_read; - p->write = icmUInt32Array_write; - p->dump = icmUInt32Array_dump; - p->allocate = icmUInt32Array_allocate; - p->del = icmUInt32Array_delete; - p->icp = icp; - - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ -/* icmUInt64Array object */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmUInt64Array_get_size( - icmBase *pp -) { - icmUInt64Array *p = (icmUInt64Array *)pp; - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ - if (p->size > (UINT_MAX - len) / 8) { - p->icp->errc = 1; - return (unsigned int) -1; - } - len += p->size * 8; /* 8 bytes for each UInt64 */ - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmUInt64Array_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmUInt64Array *p = (icmUInt64Array *)pp; - icc *icp = p->icp; - int rv = 0; - unsigned long i, size; - char *bp, *buf; - - if (len < 8) { - sprintf(icp->err,"icmUInt64Array_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmUInt64Array_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmUInt64Array_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - p->size = size = (len - 8)/8; /* Number of elements in the array */ - - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - sprintf(icp->err,"icmUInt64Array_read: Wrong tag type for icmUInt64Array"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - bp += 8; /* Skip padding */ - - /* Read all the data from the buffer */ - for (i = 0; i < size; i++, bp += 8) { - read_UInt64Number(&p->data[i], bp); - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmUInt64Array_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmUInt64Array *p = (icmUInt64Array *)pp; - icc *icp = p->icp; - unsigned long i; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmUInt64Array_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmUInt64Array_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - - /* Write all the data to the buffer */ - bp += 8; /* Skip padding */ - for (i = 0; i < p->size; i++, bp += 8) { - if ((rv = write_UInt64Number(&p->data[i],bp)) != 0) { - sprintf(icp->err,"icmUInt64Array_write: write_UInt64umber() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmUInt64Array_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmUInt64Array_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmUInt64Array *p = (icmUInt64Array *)pp; - if (verb <= 0) - return; - - fprintf(op,"UInt64Array:\n"); - fprintf(op," No. elements = %lu\n",p->size); - if (verb >= 2) { - unsigned long i; - for (i = 0; i < p->size; i++) - fprintf(op," %lu: h=%lu, l=%lu\n",i,p->data[i].h,p->data[i].l); - } -} - -/* Allocate variable sized data elements */ -static int icmUInt64Array_allocate( - icmBase *pp -) { - icmUInt64Array *p = (icmUInt64Array *)pp; - icc *icp = p->icp; - - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); - if ((p->data = (icmUint64 *) icp->al->calloc(icp->al, p->size, sizeof(icmUint64))) == NULL) { - sprintf(icp->err,"icmUInt64Array_alloc: calloc() of icmUInt64Array data failed"); - return icp->errc = 2; - } - p->_size = p->size; - } - return 0; -} - -/* Free all storage in the object */ -static void icmUInt64Array_delete( - icmBase *pp -) { - icmUInt64Array *p = (icmUInt64Array *)pp; - icc *icp = p->icp; - - if (p->data != NULL) - icp->al->free(icp->al, p->data); - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmUInt64Array( - icc *icp -) { - icmUInt64Array *p; - if ((p = (icmUInt64Array *) icp->al->calloc(icp->al,1,sizeof(icmUInt64Array))) == NULL) - return NULL; - p->ttype = icSigUInt64ArrayType; - p->refcount = 1; - p->get_size = icmUInt64Array_get_size; - p->read = icmUInt64Array_read; - p->write = icmUInt64Array_write; - p->dump = icmUInt64Array_dump; - p->allocate = icmUInt64Array_allocate; - p->del = icmUInt64Array_delete; - p->icp = icp; - - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ -/* icmU16Fixed16Array object */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmU16Fixed16Array_get_size( - icmBase *pp -) { - icmU16Fixed16Array *p = (icmU16Fixed16Array *)pp; - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ - if (p->size > (UINT_MAX - len) / 4) { - p->icp->errc = 1; - return (unsigned int) -1; - } - len += p->size * 4; /* 4 byte for each U16Fixed16 */ - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmU16Fixed16Array_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmU16Fixed16Array *p = (icmU16Fixed16Array *)pp; - icc *icp = p->icp; - int rv = 0; - unsigned long i, size; - char *bp, *buf; - - if (len < 8) { - sprintf(icp->err,"icmU16Fixed16Array_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmU16Fixed16Array_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmU16Fixed16Array_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - p->size = size = (len - 8)/4; /* Number of elements in the array */ - - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - sprintf(icp->err,"icmU16Fixed16Array_read: Wrong tag type for icmU16Fixed16Array"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - bp += 8; /* Skip padding */ - - /* Read all the data from the buffer */ - for (i = 0; i < size; i++, bp += 4) { - p->data[i] = read_U16Fixed16Number(bp); - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmU16Fixed16Array_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmU16Fixed16Array *p = (icmU16Fixed16Array *)pp; - icc *icp = p->icp; - unsigned long i; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmU16Fixed16Array_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmU16Fixed16Array_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - - /* Write all the data to the buffer */ - bp += 8; /* Skip padding */ - for (i = 0; i < p->size; i++, bp += 4) { - if ((rv = write_U16Fixed16Number(p->data[i],bp)) != 0) { - sprintf(icp->err,"icmU16Fixed16Array_write: write_U16Fixed16umber() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmU16Fixed16Array_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmU16Fixed16Array_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmU16Fixed16Array *p = (icmU16Fixed16Array *)pp; - if (verb <= 0) - return; - - fprintf(op,"U16Fixed16Array:\n"); - fprintf(op," No. elements = %lu\n",p->size); - if (verb >= 2) { - unsigned long i; - for (i = 0; i < p->size; i++) - fprintf(op," %lu: %f\n",i,p->data[i]); - } -} - -/* Allocate variable sized data elements */ -static int icmU16Fixed16Array_allocate( - icmBase *pp -) { - icmU16Fixed16Array *p = (icmU16Fixed16Array *)pp; - icc *icp = p->icp; - - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); - if ((p->data = (double *) icp->al->calloc(icp->al, p->size, sizeof(double))) == NULL) { - sprintf(icp->err,"icmU16Fixed16Array_alloc: calloc() of icmU16Fixed16Array data failed"); - return icp->errc = 2; - } - p->_size = p->size; - } - return 0; -} - -/* Free all storage in the object */ -static void icmU16Fixed16Array_delete( - icmBase *pp -) { - icmU16Fixed16Array *p = (icmU16Fixed16Array *)pp; - icc *icp = p->icp; - - if (p->data != NULL) - icp->al->free(icp->al, p->data); - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmU16Fixed16Array( - icc *icp -) { - icmU16Fixed16Array *p; - if ((p = (icmU16Fixed16Array *) icp->al->calloc(icp->al,1,sizeof(icmU16Fixed16Array))) == NULL) - return NULL; - p->ttype = icSigU16Fixed16ArrayType; - p->refcount = 1; - p->get_size = icmU16Fixed16Array_get_size; - p->read = icmU16Fixed16Array_read; - p->write = icmU16Fixed16Array_write; - p->dump = icmU16Fixed16Array_dump; - p->allocate = icmU16Fixed16Array_allocate; - p->del = icmU16Fixed16Array_delete; - p->icp = icp; - - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ -/* icmS15Fixed16Array object */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmS15Fixed16Array_get_size( - icmBase *pp -) { - icmS15Fixed16Array *p = (icmS15Fixed16Array *)pp; - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ - if (p->size > (UINT_MAX - len) / 4) { - p->icp->errc = 1; - return (unsigned int) - 1; - } - len += p->size * 4; /* 4 byte for each S15Fixed16 */ - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmS15Fixed16Array_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmS15Fixed16Array *p = (icmS15Fixed16Array *)pp; - icc *icp = p->icp; - int rv = 0; - unsigned long i, size; - char *bp, *buf; - - if (len < 8) { - sprintf(icp->err,"icmS15Fixed16Array_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmS15Fixed16Array_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmS15Fixed16Array_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - p->size = size = (len - 8)/4; /* Number of elements in the array */ - - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - sprintf(icp->err,"icmS15Fixed16Array_read: Wrong tag type for icmS15Fixed16Array"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - bp += 8; /* Skip padding */ - - /* Read all the data from the buffer */ - for (i = 0; i < size; i++, bp += 4) { - p->data[i] = read_S15Fixed16Number(bp); - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmS15Fixed16Array_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmS15Fixed16Array *p = (icmS15Fixed16Array *)pp; - icc *icp = p->icp; - unsigned long i; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmS15Fixed16Array_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmS15Fixed16Array_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - - /* Write all the data to the buffer */ - bp += 8; /* Skip padding */ - for (i = 0; i < p->size; i++, bp += 4) { - if ((rv = write_S15Fixed16Number(p->data[i],bp)) != 0) { - sprintf(icp->err,"icmS15Fixed16Array_write: write_S15Fixed16umber() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmS15Fixed16Array_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmS15Fixed16Array_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmS15Fixed16Array *p = (icmS15Fixed16Array *)pp; - if (verb <= 0) - return; - - fprintf(op,"S15Fixed16Array:\n"); - fprintf(op," No. elements = %lu\n",p->size); - if (verb >= 2) { - unsigned long i; - for (i = 0; i < p->size; i++) - fprintf(op," %lu: %f\n",i,p->data[i]); - } -} - -/* Allocate variable sized data elements */ -static int icmS15Fixed16Array_allocate( - icmBase *pp -) { - icmS15Fixed16Array *p = (icmS15Fixed16Array *)pp; - icc *icp = p->icp; - - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); - if ((p->data = (double *) icp->al->calloc(icp->al, p->size, sizeof(double))) == NULL) { - sprintf(icp->err,"icmS15Fixed16Array_alloc: calloc() of icmS15Fixed16Array data failed"); - return icp->errc = 2; - } - p->_size = p->size; - } - return 0; -} - -/* Free all storage in the object */ -static void icmS15Fixed16Array_delete( - icmBase *pp -) { - icmS15Fixed16Array *p = (icmS15Fixed16Array *)pp; - icc *icp = p->icp; - - if (p->data != NULL) - icp->al->free(icp->al, p->data); - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmS15Fixed16Array( - icc *icp -) { - icmS15Fixed16Array *p; - if ((p = (icmS15Fixed16Array *) icp->al->calloc(icp->al,1,sizeof(icmS15Fixed16Array))) == NULL) - return NULL; - p->ttype = icSigS15Fixed16ArrayType; - p->refcount = 1; - p->get_size = icmS15Fixed16Array_get_size; - p->read = icmS15Fixed16Array_read; - p->write = icmS15Fixed16Array_write; - p->dump = icmS15Fixed16Array_dump; - p->allocate = icmS15Fixed16Array_allocate; - p->del = icmS15Fixed16Array_delete; - p->icp = icp; - - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ - -/* Data conversion support functions */ -static int write_XYZNumber(icmXYZNumber *p, char *d) { - int rv; - if ((rv = write_S15Fixed16Number(p->X, d + 0)) != 0) - return rv; - if ((rv = write_S15Fixed16Number(p->Y, d + 4)) != 0) - return rv; - if ((rv = write_S15Fixed16Number(p->Z, d + 8)) != 0) - return rv; - return 0; -} - -static int read_XYZNumber(icmXYZNumber *p, char *d) { - p->X = read_S15Fixed16Number(d + 0); - p->Y = read_S15Fixed16Number(d + 4); - p->Z = read_S15Fixed16Number(d + 8); - return 0; -} - -/* Helper: Return a string that shows the XYZ number value */ -static char *string_XYZNumber(icmXYZNumber *p) { - static char buf[40]; - - sprintf(buf,"%f, %f, %f", p->X, p->Y, p->Z); - return buf; -} - -/* Helper: Return a string that shows the XYZ number value, */ -/* and the Lab D50 number in paren. */ -static char *string_XYZNumber_and_Lab(icmXYZNumber *p) { - static char buf[50]; - double lab[3]; - lab[0] = p->X; - lab[1] = p->Y; - lab[2] = p->Z; - icmXYZ2Lab(&icmD50, lab, lab); - sprintf(buf,"%f, %f, %f [Lab %f, %f, %f]", p->X, p->Y, p->Z, lab[0], lab[1], lab[2]); - return buf; -} - -/* icmXYZArray object */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmXYZArray_get_size( - icmBase *pp -) { - icmXYZArray *p = (icmXYZArray *)pp; - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ - if (p->size > (UINT_MAX - len) / 12) { - p->icp->errc = 1; - return (unsigned int) - 1; - } - len += p->size * 12; /* 12 bytes for each XYZ */ - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmXYZArray_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmXYZArray *p = (icmXYZArray *)pp; - icc *icp = p->icp; - int rv = 0; - unsigned long i, size; - char *bp, *buf; - - if (len < 8) { - sprintf(icp->err,"icmXYZArray_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmXYZArray_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmXYZArray_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - p->size = size = (len - 8)/12; /* Number of elements in the array */ - - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - sprintf(icp->err,"icmXYZArray_read: Wrong tag type for icmXYZArray"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - bp += 8; /* Skip padding */ - - /* Read all the data from the buffer */ - for (i = 0; i < size; i++, bp += 12) { - read_XYZNumber(&p->data[i], bp); - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmXYZArray_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmXYZArray *p = (icmXYZArray *)pp; - icc *icp = p->icp; - unsigned long i; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmXYZArray_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmXYZArray_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - - /* Write all the data to the buffer */ - bp += 8; /* Skip padding */ - for (i = 0; i < p->size; i++, bp += 12) { - if ((rv = write_XYZNumber(&p->data[i],bp)) != 0) { - sprintf(icp->err,"icmXYZArray_write: write_XYZumber() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmXYZArray_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmXYZArray_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmXYZArray *p = (icmXYZArray *)pp; - if (verb <= 0) - return; - - fprintf(op,"XYZArray:\n"); - fprintf(op," No. elements = %lu\n",p->size); - if (verb >= 2) { - unsigned long i; - for (i = 0; i < p->size; i++) { - fprintf(op," %lu: %s\n",i,string_XYZNumber_and_Lab(&p->data[i])); - - } - } -} - -/* Allocate variable sized data elements */ -static int icmXYZArray_allocate( - icmBase *pp -) { - icmXYZArray *p = (icmXYZArray *)pp; - icc *icp = p->icp; - - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); - if ((p->data = (icmXYZNumber *) icp->al->calloc(icp->al, p->size, sizeof(icmXYZNumber))) == NULL) { - sprintf(icp->err,"icmXYZArray_alloc: calloc() of icmXYZArray data failed"); - return icp->errc = 2; - } - p->_size = p->size; - } - return 0; -} - -/* Free all storage in the object */ -static void icmXYZArray_delete( - icmBase *pp -) { - icmXYZArray *p = (icmXYZArray *)pp; - icc *icp = p->icp; - - if (p->data != NULL) - icp->al->free(icp->al, p->data); - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmXYZArray( - icc *icp -) { - icmXYZArray *p; - if ((p = (icmXYZArray *) icp->al->calloc(icp->al,1,sizeof(icmXYZArray))) == NULL) - return NULL; - p->ttype = icSigXYZArrayType; - p->refcount = 1; - p->get_size = icmXYZArray_get_size; - p->read = icmXYZArray_read; - p->write = icmXYZArray_write; - p->dump = icmXYZArray_dump; - p->allocate = icmXYZArray_allocate; - p->del = icmXYZArray_delete; - p->icp = icp; - - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ -/* icmCurve object */ - -/* Do a forward lookup through the curve */ -/* Return 0 on success, 1 if clipping occured, 2 on other error */ -static int icmCurve_lookup_fwd( - icmCurve *p, - double *out, - double *in -) { - int rv = 0; - if (p->flag == icmCurveLin) { - *out = *in; - } else if (p->flag == icmCurveGamma) { - double val = *in; - if (val <= 0.0) - *out = 0.0; - else - *out = pow(val, p->data[0]); - } else { /* Use linear interpolation */ - int ix; - double val, w; - double inputEnt_1 = (double)(p->size-1); - - val = *in * inputEnt_1; - if (val < 0.0) { - val = 0.0; - rv |= 1; - } else if (val > inputEnt_1) { - val = inputEnt_1; - rv |= 1; - } - ix = (int)floor(val); /* Coordinate */ - if (ix < 0 || ix > (p->size-2)) - ix = (p->size-2); - w = val - (double)ix; /* weight */ - val = p->data[ix]; - *out = val + w * (p->data[ix+1] - val); - } - return rv; -} - -/* - - - - - - - - - - - - */ -/* Support for reverse interpolation of 1D lookup tables */ - -/* Create a reverse curve lookup acceleration table */ -/* return non-zero on error, 2 = malloc error. */ -static int icmTable_setup_bwd( - icc *icp, /* Base icc object */ - icmRevTable *rt, /* Reverse table data to setup */ - unsigned long size, /* Size of fwd table */ - double *data /* Table */ -) { - int i; - - if (size > INT_MAX - 2) - /* Although rt->size is unsigned long, the rt data - * structure uses int data types to store indices. */ - return 2; - - rt->size = size; /* Stash pointers to these away */ - rt->data = data; - - /* Find range of output values */ - rt->rmin = 1e300; - rt->rmax = -1e300; - for (i = 0; i < rt->size; i++) { - if (rt->data[i] > rt->rmax) - rt->rmax = rt->data[i]; - if (rt->data[i] < rt->rmin) - rt->rmin = rt->data[i]; - } - - /* Decide on reverse granularity */ - rt->rsize = (rt->size+2)/2; - rt->qscale = (double)rt->rsize/(rt->rmax - rt->rmin); /* Scale factor to quantize to */ - - /* Initialize the reverse lookup structures, and get overall min/max */ - if ((rt->rlists = (int **) icp->al->calloc(icp->al, rt->rsize, sizeof(int *))) == NULL) { - return 2; - } - - /* Assign each output value range bucket lists it intersects */ - for (i = 0; i < (rt->size-1); i++) { - int s, e, j; /* Start and end indexes (inclusive) */ - s = (int)((rt->data[i] - rt->rmin) * rt->qscale); - e = (int)((rt->data[i+1] - rt->rmin) * rt->qscale); - if (s > e) { /* swap */ - int t; - t = s; s = e; e = t; - } - /* s and e should both be in the range [0,rt->size] - * now, but let's not rely on floating point - * calculations -- clamp to [0,rt->size) */ - if (s < 0) - s = 0; - if (e < 0) - e = 0; - if (s >= rt->rsize) - s = rt->rsize-1; - if (e >= rt->rsize) - e = rt->rsize-1; - - /* For all buckets that may contain this output range, add index of this output */ - for (j = s; j <= e; j++) { - int as; /* Allocation size */ - int nf; /* Next free slot */ - if (rt->rlists[j] == NULL) { /* No allocation */ - as = 5; /* Start with space for 5 */ - if ((rt->rlists[j] = (int *) icp->al->calloc(icp->al, sizeof(int), as)) == NULL) { - return 2; - } - rt->rlists[j][0] = as; - nf = rt->rlists[j][1] = 2; - } else { - as = rt->rlists[j][0]; /* Allocate space for this list */ - nf = rt->rlists[j][1]; /* Next free location in list */ - if (nf >= as) { /* need to expand space */ - if (as > INT_MAX / 2 / sizeof(int)) - return 2; - as *= 2; - rt->rlists[j] = (int *) icp->al->realloc(icp->al,rt->rlists[j], sizeof(int) * as); - if (rt->rlists[j] == NULL) { - return 2; - } - rt->rlists[j][0] = as; - } - } - rt->rlists[j][nf++] = i; - rt->rlists[j][1] = nf; - } - } - rt->inited = 1; - return 0; -} - -/* Free up any data */ -static void icmTable_delete_bwd( - icc *icp, /* Base icc */ - icmRevTable *rt /* Reverse table data to setup */ -) { - if (rt->inited != 0) { - while (rt->rsize > 0) - icp->al->free(icp->al, rt->rlists[--rt->rsize]); - icp->al->free(icp->al, rt->rlists); - rt->size = 0; /* Don't keep these */ - rt->data = NULL; - } -} - -/* Do a reverse lookup through the curve */ -/* Return 0 on success, 1 if clipping occured, 2 on other error */ -static int icmTable_lookup_bwd( - icmRevTable *rt, - double *out, - double *in -) { - int rv = 0; - int ix, i, k; - double oval, ival = *in, val; - double rsize_1; - - /* Find appropriate reverse list */ - rsize_1 = (double)(rt->rsize-1); - val = ((ival - rt->rmin) * rt->qscale); - if (val < 0.0) - val = 0.0; - else if (val > rsize_1) - val = rsize_1; - ix = (int)floor(val); /* Coordinate */ - - if (ix < 0 || ix > (rt->size-2)) - ix = (rt->size-2); - if (rt->rlists[ix] != NULL) { /* There is a list of fwd candidates */ - /* For each candidate forward range */ - for (i = 2; i < rt->rlists[ix][1]; i++) { /* For all fwd indexes */ - double lv,hv; - k = rt->rlists[ix][i]; /* Base index */ - lv = rt->data[k]; - hv = rt->data[k+1]; - if ((ival >= lv && ival <= hv) /* If this slot contains output value */ - || (ival >= hv && ival <= lv)) { - /* Reverse linear interpolation */ - if (hv == lv) { /* Technically non-monotonic - due to quantization ? */ - oval = (k + 0.5)/(rt->size-1.0); - } else - oval = (k + ((ival - lv)/(hv - lv)))/(rt->size-1.0); - /* If we kept looking, we would find multiple */ - /* solution for non-monotonic curve */ - *out = oval; - return rv; - } - } - } - - /* We have failed to find an exact value, so return the nearest value */ - /* (This is slow !) */ - val = fabs(ival - rt->data[0]); - /* rt->size is known to be < INT_MAX */ - for (k = 0, i = 1; i < rt->size; i++) { - double er; - er = fabs(ival - rt->data[i]); - if (er < val) { /* new best */ - val = er; - k = i; - } - } - *out = k/(rt->size-1.0); - rv |= 1; - return rv; -} - -/* - - - - - - - - - - - - */ - -/* Do a reverse lookup through the curve */ -/* Return 0 on success, 1 if clipping occured, 2 on other error */ -static int icmCurve_lookup_bwd( - icmCurve *p, - double *out, - double *in -) { - icc *icp = p->icp; - int rv = 0; - if (p->flag == icmCurveLin) { - *out = *in; - } else if (p->flag == icmCurveGamma) { - double val = *in; - if (val <= 0.0) - *out = 0.0; - else - *out = pow(val, 1.0/p->data[0]); - } else { /* Use linear interpolation */ - if (p->rt.inited == 0) { - rv = icmTable_setup_bwd(icp, &p->rt, p->size, p->data); - if (rv != 0) { - sprintf(icp->err,"icmCurve_lookup: Malloc failure in reverse lookup init."); - return icp->errc = rv; - } - } - rv = icmTable_lookup_bwd(&p->rt, out, in); - } - return rv; -} - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmCurve_get_size( - icmBase *pp -) { - icmCurve *p = (icmCurve *)pp; - unsigned int len = 0; - len += 12; /* 12 bytes for tag, padding and count */ - if (p->size > (UINT_MAX - len) / 2) { - p->icp->errc = 1; - return (unsigned int) - 1; - } - len += p->size * 2; /* 2 bytes for each UInt16 */ - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmCurve_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmCurve *p = (icmCurve *)pp; - icc *icp = p->icp; - int rv = 0; - unsigned long i; - char *bp, *buf, *end; - - if (len < 12) { - sprintf(icp->err,"icmCurve_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmCurve_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - end = buf + len; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmCurve_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - sprintf(icp->err,"icmCurve_read: Wrong tag type for icmCurve"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - p->size = read_UInt32Number(bp+8); - bp = bp + 12; - - /* Set flag up before allocating */ - if (p->size == 0) { /* Linear curve */ - p->flag = icmCurveLin; - } else if (p->size == 1) { /* Gamma curve */ - p->flag = icmCurveGamma; - } else { - p->flag = icmCurveSpec; - } - - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - - if (p->flag == icmCurveGamma) { /* Gamma curve */ - if ((bp + 1) > end) { - sprintf(icp->err,"icmCurve_read: Data too short to curve gamma"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - p->data[0] = read_U8Fixed8Number(bp); - } else if (p->flag == icmCurveSpec) { - /* Read all the data from the buffer */ - for (i = 0; i < p->size; i++, bp += 2) { - if ((bp + 2) > end) { - sprintf(icp->err,"icmData_read: Data too short to curve value"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - p->data[i] = read_DCS16Number(bp); - } - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmCurve_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmCurve *p = (icmCurve *)pp; - icc *icp = p->icp; - unsigned long i; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmCurve_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmCurve_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - /* Write count */ - if ((rv = write_UInt32Number(p->size,bp+8)) != 0) { - sprintf(icp->err,"icmCurve_write: write_UInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - /* Write all the data to the buffer */ - bp += 12; /* Skip padding */ - if (p->flag == icmCurveLin) { - if (p->size != 0) { - sprintf(icp->err,"icmCurve_write: Must be exactly 0 entry for Linear"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - } else if (p->flag == icmCurveGamma) { - if (p->size != 1) { - sprintf(icp->err,"icmCurve_write: Must be exactly 1 entry for Gamma"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - if ((rv = write_U8Fixed8Number(p->data[0],bp)) != 0) { - sprintf(icp->err,"icmCurve_write: write_U8Fixed8umber(%f) failed",p->data[0]); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } else if (p->flag == icmCurveSpec) { - if (p->size < 2) { - sprintf(icp->err,"icmCurve_write: Must be 2 or more entries for Specified curve"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - for (i = 0; i < p->size; i++, bp += 2) { - if ((rv = write_DCS16Number(p->data[i],bp)) != 0) { - sprintf(icp->err,"icmCurve_write: write_UInt16umber(%f) failed",p->data[i]); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmCurve_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmCurve_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmCurve *p = (icmCurve *)pp; - if (verb <= 0) - return; - - fprintf(op,"Curve:\n"); - - if (p->flag == icmCurveLin) { - fprintf(op," Curve is linear\n"); - } else if (p->flag == icmCurveGamma) { - fprintf(op," Curve is gamma of %f\n",p->data[0]); - } else { - fprintf(op," No. elements = %lu\n",p->size); - if (verb >= 2) { - unsigned long i; - for (i = 0; i < p->size; i++) - fprintf(op," %3lu: %f\n",i,p->data[i]); - } - } -} - -/* Allocate variable sized data elements */ -static int icmCurve_allocate( - icmBase *pp -) { - icmCurve *p = (icmCurve *)pp; - icc *icp = p->icp; - - if (p->flag == icmCurveUndef) { - sprintf(icp->err,"icmCurve_alloc: flag not set"); - return icp->errc = 1; - } else if (p->flag == icmCurveLin) { - p->size = 0; - } else if (p->flag == icmCurveGamma) { - p->size = 1; - } - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); - if ((p->data = (double *) icp->al->calloc(icp->al, p->size, sizeof(double))) == NULL) { - sprintf(icp->err,"icmCurve_alloc: calloc() of icmCurve data failed"); - return icp->errc = 2; - } - p->_size = p->size; - } - return 0; -} - -/* Free all storage in the object */ -static void icmCurve_delete( - icmBase *pp -) { - icmCurve *p = (icmCurve *)pp; - icc *icp = p->icp; - - if (p->data != NULL) - icp->al->free(icp->al, p->data); - icmTable_delete_bwd(icp, &p->rt); /* Free reverse table info */ - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmCurve( - icc *icp -) { - icmCurve *p; - if ((p = (icmCurve *) icp->al->calloc(icp->al,1,sizeof(icmCurve))) == NULL) - return NULL; - p->ttype = icSigCurveType; - p->refcount = 1; - p->get_size = icmCurve_get_size; - p->read = icmCurve_read; - p->write = icmCurve_write; - p->dump = icmCurve_dump; - p->allocate = icmCurve_allocate; - p->del = icmCurve_delete; - p->icp = icp; - - p->lookup_fwd = icmCurve_lookup_fwd; - p->lookup_bwd = icmCurve_lookup_bwd; - - p->rt.inited = 0; - - p->flag = icmCurveUndef; - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ -/* icmData object */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmData_get_size( - icmBase *pp -) { - icmData *p = (icmData *)pp; - unsigned int len = 0; - len += 12; /* 12 bytes for tag and padding */ - len += p->size * 1; /* 1 byte for each data element */ - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmData_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmData *p = (icmData *)pp; - icc *icp = p->icp; - int rv = 0; - unsigned size, f; - char *bp, *buf; - - if (len < 12) { - sprintf(icp->err,"icmData_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmData_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmData_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - p->size = size = (len - 12)/1; /* Number of elements in the array */ - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - sprintf(icp->err,"icmData_read: Wrong tag type for icmData"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - /* Read the data type flag */ - f = read_UInt32Number(bp+8); - if (f == 0) { - p->flag = icmDataASCII; - } else if (f == 1) { - p->flag = icmDataBin; - } else { - sprintf(icp->err,"icmData_read: Unknown flag value 0x%x",f); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - bp += 12; /* Skip padding and flag */ - - if (p->size > 0) { - if (p->flag == icmDataASCII) { - if (check_null_string(bp,p->size) != 0) { - sprintf(icp->err,"icmData_read: ACSII is not null terminated"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - } - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - - memcpy((void *)p->data, (void *)bp, p->size); - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmData_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmData *p = (icmData *)pp; - icc *icp = p->icp; - unsigned int len, f; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmData_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmData_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - switch(p->flag) { - case icmDataASCII: - f = 0; - break; - case icmDataBin: - f = 1; - break; - default: - sprintf(icp->err,"icmData_write: Unknown Data Flag value"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - /* Write data flag descriptor to the buffer */ - if ((rv = write_UInt32Number(f,bp+8)) != 0) { - sprintf(icp->err,"icmData_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - bp += 12; /* Skip padding */ - - if (p->data != NULL) { - if (p->flag == icmDataASCII) { - if ((rv = check_null_string((char *)p->data, p->size)) != 0) { - sprintf(icp->err,"icmData_write: ASCII is not null terminated"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - } - memcpy((void *)bp, (void *)p->data, p->size); - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmData_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmData_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmData *p = (icmData *)pp; - unsigned long i, r, c, size = 0; - - if (verb <= 0) - return; - - fprintf(op,"Data:\n"); - switch(p->flag) { - case icmDataASCII: - fprintf(op," ASCII data\n"); - size = p->size > 0 ? p->size-1 : 0; - break; - case icmDataBin: - fprintf(op," Binary data\n"); - size = p->size; - break; - case icmDataUndef: - fprintf(op," Undefined data\n"); - size = p->size; - break; - } - fprintf(op," No. elements = %lu\n",p->size); - - i = 0; - for (r = 1;; r++) { /* count rows */ - if (i >= size) { - fprintf(op,"\n"); - break; - } - if (r > 1 && verb < 2) { - fprintf(op,"...\n"); - break; /* Print 1 row if not verbose */ - } - c = 1; - fprintf(op," 0x%04lx: ",i); - c += 10; - while (i < size && c < 75) { - if (p->flag == icmDataASCII) { - if (isprint(p->data[i])) { - fprintf(op,"%c",p->data[i]); - c++; - } else { - fprintf(op,"\\%03o",p->data[i]); - c += 4; - } - } else { - fprintf(op,"%02x ",p->data[i]); - c += 3; - } - i++; - } - if (i < size) - fprintf(op,"\n"); - } -} - -/* Allocate variable sized data elements */ -static int icmData_allocate( - icmBase *pp -) { - icmData *p = (icmData *)pp; - icc *icp = p->icp; - - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); - if ((p->data = (unsigned char *) icp->al->calloc(icp->al, p->size, sizeof(unsigned char))) == NULL) { - sprintf(icp->err,"icmData_alloc: calloc() of icmData data failed"); - return icp->errc = 2; - } - p->_size = p->size; - } - return 0; -} - -/* Free all storage in the object */ -static void icmData_delete( - icmBase *pp -) { - icmData *p = (icmData *)pp; - icc *icp = p->icp; - - if (p->data != NULL) - icp->al->free(icp->al, p->data); - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmData( - icc *icp -) { - icmData *p; - if ((p = (icmData *) icp->al->calloc(icp->al,1,sizeof(icmData))) == NULL) - return NULL; - p->ttype = icSigDataType; - p->refcount = 1; - p->get_size = icmData_get_size; - p->read = icmData_read; - p->write = icmData_write; - p->dump = icmData_dump; - p->allocate = icmData_allocate; - p->del = icmData_delete; - p->icp = icp; - - p->flag = icmDataUndef; - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ -/* icmText object */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmText_get_size( - icmBase *pp -) { - icmText *p = (icmText *)pp; - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ - len += p->size; /* 1 byte for each character element (inc. null) */ - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmText_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmText *p = (icmText *)pp; - icc *icp = p->icp; - int rv = 0; - char *bp, *buf; - - if (len < 8) { - sprintf(icp->err,"icmText_read: Tag too short to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmText_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmText_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - p->size = (len - 8)/1; /* Number of elements in the array */ - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - sprintf(icp->err,"icmText_read: Wrong tag type for icmText"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - bp = bp + 8; - - if (p->size > 0) { - if (check_null_string(bp,p->size) != 0) { - sprintf(icp->err,"icmText_read: text is not null terminated"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - memcpy((void *)p->data, (void *)bp, p->size); - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmText_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmText *p = (icmText *)pp; - icc *icp = p->icp; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmText_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmText_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - bp = bp + 8; - - if (p->data != NULL) { - if ((rv = check_null_string(p->data, p->size)) != 0) { - sprintf(icp->err,"icmText_write: text is not null terminated"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - memcpy((void *)bp, (void *)p->data, p->size); - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmText_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmText_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmText *p = (icmText *)pp; - unsigned long i, r, c, size; - - if (verb <= 0) - return; - - fprintf(op,"Text:\n"); - fprintf(op," No. chars = %lu\n",p->size); - - size = p->size > 0 ? p->size-1 : 0; - i = 0; - for (r = 1;; r++) { /* count rows */ - if (i >= size) { - fprintf(op,"\n"); - break; - } - if (r > 1 && verb < 2) { - fprintf(op,"...\n"); - break; /* Print 1 row if not verbose */ - } - c = 1; - fprintf(op," 0x%04lx: ",i); - c += 10; - while (i < size && c < 75) { - if (isprint(p->data[i])) { - fprintf(op,"%c",p->data[i]); - c++; - } else { - fprintf(op,"\\%03o",p->data[i]); - c += 4; - } - i++; - } - if (i < size) - fprintf(op,"\n"); - } -} - -/* Allocate variable sized data elements */ -static int icmText_allocate( - icmBase *pp -) { - icmText *p = (icmText *)pp; - icc *icp = p->icp; - - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); - if ((p->data = (char *) icp->al->calloc(icp->al, p->size, sizeof(char))) == NULL) { - sprintf(icp->err,"icmText_alloc: calloc() of icmText data failed"); - return icp->errc = 2; - } - p->_size = p->size; - } - return 0; -} - -/* Free all storage in the object */ -static void icmText_delete( - icmBase *pp -) { - icmText *p = (icmText *)pp; - icc *icp = p->icp; - - if (p->data != NULL) - icp->al->free(icp->al, p->data); - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmText( - icc *icp -) { - icmText *p; - if ((p = (icmText *) icp->al->calloc(icp->al,1,sizeof(icmText))) == NULL) - return NULL; - p->ttype = icSigTextType; - p->refcount = 1; - p->get_size = icmText_get_size; - p->read = icmText_read; - p->write = icmText_write; - p->dump = icmText_dump; - p->allocate = icmText_allocate; - p->del = icmText_delete; - p->icp = icp; - - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ - -/* Data conversion support functions */ -static int write_DateTimeNumber(icmDateTimeNumber *p, char *d) { - int rv; - if (p->year < 1900 || p->year > 3000 - || p->month == 0 || p->month > 12 - || p->day == 0 || p->day > 31 - || p->hours > 23 - || p->minutes > 59 - || p->seconds > 59) - return 1; - - if ((rv = write_UInt16Number(p->year, d + 0)) != 0) - return rv; - if ((rv = write_UInt16Number(p->month, d + 2)) != 0) - return rv; - if ((rv = write_UInt16Number(p->day, d + 4)) != 0) - return rv; - if ((rv = write_UInt16Number(p->hours, d + 6)) != 0) - return rv; - if ((rv = write_UInt16Number(p->minutes, d + 8)) != 0) - return rv; - if ((rv = write_UInt16Number(p->seconds, d + 10)) != 0) - return rv; - return 0; -} - -static int read_DateTimeNumber(icmDateTimeNumber *p, char *d) { - p->year = read_UInt16Number(d + 0); - p->month = read_UInt16Number(d + 2); - p->day = read_UInt16Number(d + 4); - p->hours = read_UInt16Number(d + 6); - p->minutes = read_UInt16Number(d + 8); - p->seconds = read_UInt16Number(d + 10); - - if (p->year < 1900 || p->year > 3000 - || p->month == 0 || p->month > 12 - || p->day == 0 || p->day > 31 - || p->hours > 23 - || p->minutes > 59 - || p->seconds > 59) { - unsigned int tt; - - /* Check for Adobe problem */ - if (p->month < 1900 || p->month > 3000 - || p->year == 0 || p->year > 12 - || p->hours == 0 || p->hours > 31 - || p->day > 23 - || p->seconds > 59 - || p->minutes > 59) - return 1; /* Nope */ - - /* Correct Adobe's faulty profile */ - tt = p->month; p->month = p->year; p->year = tt; - tt = p->hours; p->hours = p->day; p->day = tt; - tt = p->seconds; p->seconds = p->minutes; p->minutes = tt; - return 0; - } - return 0; -} - -/* Return a string that shows the given date and time */ -static char *string_DateTimeNumber(icmDateTimeNumber *p) { - static const char *mstring[13] = {"Bad", "Jan","Feb","Mar","Apr","May","Jun", - "Jul","Aug","Sep","Oct","Nov","Dec"}; - static char buf[80]; - - sprintf(buf,"%d %s %4d, %d:%02d:%02d", - p->day, mstring[p->month > 12 ? 0 : p->month], p->year, - p->hours, p->minutes, p->seconds); - return buf; -} - -/* Set the DateTime structure to the current date and time */ -static void setcur_DateTimeNumber(icmDateTimeNumber *p) { - time_t cclk; - struct tm *ctm; - - cclk = time(NULL); - ctm = localtime(&cclk); - - p->year = ctm->tm_year + 1900; - p->month = ctm->tm_mon + 1; - p->day = ctm->tm_mday; - p->hours = ctm->tm_hour; - p->minutes = ctm->tm_min; - p->seconds = ctm->tm_sec; -} - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmDateTimeNumber_get_size( - icmBase *pp -) { - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ - len += 12; /* 12 bytes for Date & Time */ - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmDateTimeNumber_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmDateTimeNumber *p = (icmDateTimeNumber *)pp; - icc *icp = p->icp; - int rv; - char *bp, *buf; - - if (len < 20) { - sprintf(icp->err,"icmDateTimeNumber_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmDateTimeNumber_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmDateTimeNumber_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - sprintf(icp->err,"icmDateTimeNumber_read: Wrong tag type for icmDateTimeNumber"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - bp += 8; /* Skip padding */ - - /* Read the time and date from buffer */ - if((rv = read_DateTimeNumber(p, bp)) != 0) { - sprintf(icp->err,"icmDateTimeNumber_read: Corrupted DateTime"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmDateTimeNumber_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmDateTimeNumber *p = (icmDateTimeNumber *)pp; - icc *icp = p->icp; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmDateTimeNumber_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmDateTimeNumber_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - - /* Write all the data to the buffer */ - bp += 8; /* Skip padding */ - if ((rv = write_DateTimeNumber(p, bp)) != 0) { - sprintf(icp->err,"icmDateTimeNumber_write: write_DateTimeNumber() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmDateTimeNumber_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmDateTimeNumber_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmDateTimeNumber *p = (icmDateTimeNumber *)pp; - if (verb <= 0) - return; - - fprintf(op,"DateTimeNumber:\n"); - fprintf(op," Date = %s\n", string_DateTimeNumber(p)); -} - -/* Allocate variable sized data elements */ -static int icmDateTimeNumber_allocate( - icmBase *pp -) { - /* Nothing to do */ - return 0; -} - -/* Free all storage in the object */ -static void icmDateTimeNumber_delete( - icmBase *pp -) { - icmDateTimeNumber *p = (icmDateTimeNumber *)pp; - icc *icp = p->icp; - - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmDateTimeNumber( - icc *icp -) { - icmDateTimeNumber *p; - if ((p = (icmDateTimeNumber *) icp->al->calloc(icp->al,1,sizeof(icmDateTimeNumber))) == NULL) - return NULL; - p->ttype = icSigDateTimeType; - p->refcount = 1; - p->get_size = icmDateTimeNumber_get_size; - p->read = icmDateTimeNumber_read; - p->write = icmDateTimeNumber_write; - p->dump = icmDateTimeNumber_dump; - p->allocate = icmDateTimeNumber_allocate; - p->del = icmDateTimeNumber_delete; - p->icp = icp; - - setcur_DateTimeNumber(p); /* Default to current date and time */ - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ -/* icmLut object */ - -/* Utility function - raise one integer to an integer power */ -static int uipow(unsigned int a, unsigned int b, unsigned int *ret) { - unsigned int rv = 1; - for (; b > 0; b--) { - if (a > 0 && rv > UINT_MAX / a) - return 1; - rv *= a; - } - *ret = rv; - return 0; -} - -/* - - - - - - - - - - - - - - - - */ -/* Check if the matrix is non-zero */ -static int icmLut_nu_matrix( - icmLut *p /* Pointer to Lut object */ -) { - int i, j; - - for (j = 0; j < 3; j++) { /* Rows */ - for (i = 0; i < 3; i++) { /* Columns */ - if ( (i == j && p->e[j][i] != 1.0) - || (i != j && p->e[j][i] != 0.0)) - return 1; - } - } - return 0; -} - -/* return the locations of the minimum and */ -/* maximum values of the given channel, in the clut */ -static void icmLut_min_max( - icmLut *p, /* Pointer to Lut object */ - double *minp, /* Return position of min/max */ - double *maxp, - int chan /* Channel, -1 for average of all */ -) { - double *tp; - double minv, maxv; /* Values */ - int e, ee, f; - double gc[MAX_CHAN]; /* Grid coordinate */ - - minv = 1e6; - maxv = -1e6; - - for (e = 0; e < p->inputChan; e++) - gc[e] = 0; /* init coords */ - - /* Search the whole table */ - for (tp = p->clutTable, e = 0; e < p->inputChan; tp += p->outputChan) { - double v; - if (chan == -1) { - for (v = 0.0, f = 0; f < p->outputChan; f++) - v += tp[f]; - } else { - v = tp[chan]; - } - if (v < minv) { - minv = v; - for (ee = 0; ee < p->inputChan; ee++) - minp[ee] = gc[ee]/(p->clutPoints-1.0); - } - if (v > maxv) { - maxv = v; - for (ee = 0; ee < p->inputChan; ee++) - maxp[ee] = gc[ee]/(p->clutPoints-1.0); - } - - /* Increment coord */ - for (e = 0; e < p->inputChan; e++) { - gc[e]++; - if (gc[e] < p->clutPoints) - break; /* No carry */ - gc[e] = 0; - } - } -} - -/* Convert XYZ throught Luts matrix */ -/* Return 0 on success, 1 if clipping occured, 2 on other error */ -static int icmLut_lookup_matrix( -icmLut *p, /* Pointer to Lut object */ -double *out, /* Output array[outputChan] in ICC order - see Table 39 in 6.5.5 */ -double *in /* Input array[inputChan] */ -) { - double t0,t1; /* Take care if out == in */ - t0 = p->e[0][0] * in[0] + p->e[0][1] * in[1] + p->e[0][2] * in[2]; - t1 = p->e[1][0] * in[0] + p->e[1][1] * in[1] + p->e[1][2] * in[2]; - out[2] = p->e[2][0] * in[0] + p->e[2][1] * in[1] + p->e[2][2] * in[2]; - out[0] = t0; - out[1] = t1; - - return 0; -} - -/* Convert normalized numbers though this Luts input tables. */ -/* Return 0 on success, 1 if clipping occured, 2 on other error */ -static int icmLut_lookup_input( -icmLut *p, /* Pointer to Lut object */ -double *out, /* Output array[inputChan] */ -double *in /* Input array[inputChan] */ -) { - int rv = 0; - int ix,n; - double inputEnt_1 = (double)(p->inputEnt-1); - double *table = p->inputTable; - - /* Use linear interpolation */ - for (n = 0; n < p->inputChan; n++, table += p->inputEnt) { - double val, w; - val = in[n] * inputEnt_1; - if (val < 0.0) { - val = 0.0; - rv |= 1; - } else if (val > inputEnt_1) { - val = inputEnt_1; - rv |= 1; - } - ix = (int)floor(val); /* Grid coordinate */ - if (ix < 0 || ix > (p->inputEnt-2)) - ix = (p->inputEnt-2); - w = val - (double)ix; /* weight */ - val = table[ix]; - out[n] = val + w * (table[ix+1] - val); - } - return rv; -} - -/* Convert normalized numbers though this Luts multi-dimensional table. */ -/* using n-linear interpolation. */ -static int icmLut_lookup_clut_nl( -/* Return 0 on success, 1 if clipping occured, 2 on other error */ -icmLut *p, /* Pointer to Lut object */ -double *out, /* Output array[inputChan] */ -double *in /* Input array[outputChan] */ -) { - icc *icp = p->icp; - int rv = 0; - double *gp; /* Pointer to grid cube base */ - double co[MAX_CHAN]; /* Coordinate offset with the grid cell */ - double *gw, GW[1 << 8]; /* weight for each grid cube corner */ - - if (p->inputChan <= 8) { - gw = GW; /* Use stack allocation */ - } else { - if ((gw = (double *) icp->al->calloc(icp->al, (1 << p->inputChan), sizeof(double))) == NULL) { - sprintf(icp->err,"icmLut_lookup_clut: calloc() failed"); - return icp->errc = 2; - } - } - - /* We are using an n-linear (ie. Trilinear for 3D input) interpolation. */ - /* The implementation here uses more multiplies that some other schemes, */ - /* (for instance, see "Tri-Linear Interpolation" by Steve Hill, */ - /* Graphics Gems IV, page 521), but has less involved bookeeping, */ - /* needs less local storage for intermediate output values, does fewer */ - /* output and intermediate value reads, and fp multiplies are fast on */ - /* todays processors! */ - - /* Compute base index into grid and coordinate offsets */ - { - int e; - double clutPoints_1 = (double)(p->clutPoints-1); - int clutPoints_2 = p->clutPoints-2; - gp = p->clutTable; /* Base of grid array */ - - for (e = 0; e < p->inputChan; e++) { - int x; - double val; - val = in[e] * clutPoints_1; - if (val < 0.0) { - val = 0.0; - rv |= 1; - } else if (val > clutPoints_1) { - val = clutPoints_1; - rv |= 1; - } - x = (int)floor(val); /* Grid coordinate */ - if (x < 0 || x > clutPoints_2) - x = clutPoints_2; - co[e] = val - (double)x; /* 1.0 - weight */ - gp += x * p->dinc[e]; /* Add index offset for base of cube */ - } - } - /* Compute corner weights needed for interpolation */ - { - int e, i, g = 1; - gw[0] = 1.0; - for (e = 0; e < p->inputChan; e++) { - for (i = 0; i < g; i++) { - gw[g+i] = gw[i] * co[e]; - gw[i] *= (1.0 - co[e]); - } - g *= 2; - } - } - /* Now compute the output values */ - { - int i, f; - double w = gw[0]; - double *d = gp + p->dcube[0]; - for (f = 0; f < p->outputChan; f++) /* Base of cube */ - out[f] = w * d[f]; - for (i = 1; i < (1 << p->inputChan); i++) { /* For all other corners of cube */ - w = gw[i]; /* Strength reduce */ - d = gp + p->dcube[i]; - for (f = 0; f < p->outputChan; f++) { - out[f] += w * d[f]; - } - } - } - if (gw != GW) - icp->al->free(icp->al, (void *)gw); - return rv; -} - -/* Convert normalized numbers though this Luts multi-dimensional table */ -/* using simplex interpolation. */ -static int icmLut_lookup_clut_sx( -/* Return 0 on success, 1 if clipping occured, 2 on other error */ -icmLut *p, /* Pointer to Lut object */ -double *out, /* Output array[inputChan] */ -double *in /* Input array[outputChan] */ -) { - int rv = 0; - double *gp; /* Pointer to grid cube base */ - double co[MAX_CHAN]; /* Coordinate offset with the grid cell */ - int si[MAX_CHAN]; /* co[] Sort index, [0] = smalest */ - - /* We are using a simplex (ie. tetrahedral for 3D input) interpolation. */ - /* This method is more appropriate for XYZ/RGB/CMYK input spaces, */ - - /* Compute base index into grid and coordinate offsets */ - { - int e; - double clutPoints_1 = (double)(p->clutPoints-1); - int clutPoints_2 = p->clutPoints-2; - gp = p->clutTable; /* Base of grid array */ - - for (e = 0; e < p->inputChan; e++) { - int x; - double val; - val = in[e] * clutPoints_1; - if (val < 0.0) { - val = 0.0; - rv |= 1; - } else if (val > clutPoints_1) { - val = clutPoints_1; - rv |= 1; - } - x = (int)floor(val); /* Grid coordinate */ - if (x < 0 || x > clutPoints_2) - x = clutPoints_2; - co[e] = val - (double)x; /* 1.0 - weight */ - gp += x * p->dinc[e]; /* Add index offset for base of cube */ - } - } - /* Do selection sort on coordinates */ - { - int e, f; - for (e = 0; e < p->inputChan; e++) - si[e] = e; /* Initial unsorted indexes */ - for (e = 0; e < (p->inputChan-1); e++) { - double cosn; - cosn = co[si[e]]; /* Current smallest value */ - for (f = e+1; f < p->inputChan; f++) { /* Check against rest */ - int tt; - tt = si[f]; - if (cosn > co[tt]) { - si[f] = si[e]; /* Exchange */ - si[e] = tt; - cosn = co[tt]; - } - } - } - } - /* Now compute the weightings, simplex vertices and output values */ - { - int e, f; - double w; /* Current vertex weight */ - - w = 1.0 - co[si[p->inputChan-1]]; /* Vertex at base of cell */ - for (f = 0; f < p->outputChan; f++) - out[f] = w * gp[f]; - - for (e = p->inputChan-1; e > 0; e--) { /* Middle verticies */ - w = co[si[e]] - co[si[e-1]]; - gp += p->dinc[si[e]]; /* Move to top of cell in next largest dimension */ - for (f = 0; f < p->outputChan; f++) - out[f] += w * gp[f]; - } - - w = co[si[0]]; - gp += p->dinc[si[0]]; /* Far corner from base of cell */ - for (f = 0; f < p->outputChan; f++) - out[f] += w * gp[f]; - } - return rv; -} - -/* Convert normalized numbers though this Luts output tables. */ -/* Return 0 on success, 1 if clipping occured, 2 on other error */ -static int icmLut_lookup_output( -icmLut *p, /* Pointer to Lut object */ -double *out, /* Output array[outputChan] */ -double *in /* Input array[outputChan] */ -) { - int rv = 0; - int ix,n; - double outputEnt_1 = (double)(p->outputEnt-1); - double *table = p->outputTable; - - /* Use linear interpolation */ - for (n = 0; n < p->outputChan; n++, table += p->outputEnt) { - double val, w; - val = in[n] * outputEnt_1; - if (val < 0.0) { - val = 0.0; - rv |= 1; - } else if (val > outputEnt_1) { - val = outputEnt_1; - rv |= 1; - } - ix = (int)floor(val); /* Grid coordinate */ - if (ix < 0 || ix > (p->outputEnt-2)) - ix = (p->outputEnt-2); - w = val - (double)ix; /* weight */ - val = table[ix]; - out[n] = val + w * (table[ix+1] - val); - } - return rv; -} - -/* ----------------------------------------------- */ -/* Pseudo - Hilbert count sequencer */ - -/* This multi-dimensional count sequence is a distributed */ -/* Gray code sequence, with direction reversal on every */ -/* alternate power of 2 scale. */ -/* It is intended to aid cache coherence in multi-dimensional */ -/* regular sampling. It approximates the Hilbert curve sequence. */ - -/* Initialise, returns total usable count */ -unsigned -psh_init( -psh *p, /* Pointer to structure to initialise */ -int di, /* Dimensionality */ -unsigned res, /* Size per coordinate */ -int co[] /* Coordinates to initialise (May be NULL) */ -) { - int e; - - p->di = di; - p->res = res; - - /* Compute bits */ - for (p->bits = 0; (1 << p->bits) < res; p->bits++) - ; - - /* Compute the total count mask */ - p->tmask = ((((unsigned)1) << (p->bits * di))-1); - - /* Compute usable count */ - p->count = 1; - for (e = 0; e < di; e++) - p->count *= res; - - p->ix = 0; - - if (co != NULL) { - for (e = 0; e < di; e++) - co[e] = 0; - } - - return p->count; -} - -/* Reset the counter */ -void -psh_reset( -psh *p /* Pointer to structure */ -) { - p->ix = 0; -} - -/* Increment pseudo-hilbert coordinates */ -/* Return non-zero if count rolls over to 0 */ -int -psh_inc( -psh *p, /* Pointer to structure */ -int co[] /* Coordinates to return */ -) { - int di = p->di; - int res = p->res; - int bits = p->bits; - int e; - - do { - int b; - int gix; /* Gray code index */ - - p->ix = (p->ix + 1) & p->tmask; - - gix = p->ix ^ (p->ix >> 1); /* Convert to gray code index */ - - for (e = 0; e < di; e++) - co[e] = 0; - - for (b = 0; b < bits; b++) { /* Distribute bits */ - if (b & 1) { - for (e = di-1; e >= 0; e--) { /* In reverse order */ - co[e] |= (gix & 1) << b; - gix >>= 1; - } - } else { - for (e = 0; e < di; e++) { /* In normal order */ - co[e] |= (gix & 1) << b; - gix >>= 1; - } - } - } - - /* Convert from Gray to binary coordinates */ - for (e = 0; e < di; e++) { - unsigned sh, tv; - - for(sh = 1, tv = co[e];; sh <<= 1) { - unsigned ptv = tv; - tv ^= (tv >> sh); - if (ptv <= 1 || sh == 16) - break; - } - if (tv >= res) /* Dumbo filter - increment again if outside cube range */ - break; - co[e] = tv; - } - - } while (e < di); - - return (p->ix == 0); -} - -/* ------------------------------------------------------- */ -/* Parameter to getNormFunc function */ -typedef enum { - icmFromLuti = 0, /* return "fromo Lut normalized index" conversion function */ - icmToLuti = 1, /* return "to Lut normalized index" conversion function */ - icmFromLutv = 2, /* return "from Lut normalized value" conversion function */ - icmToLutv = 3 /* return "to Lut normalized value" conversion function */ -} icmNormFlag; - -/* Return an appropriate color space normalization function, */ -/* given the color space and Lut type */ -/* Return 0 on success, 1 on match failure */ -static int getNormFunc( - icColorSpaceSignature csig, - icTagTypeSignature tagSig, - icmNormFlag flag, - void (**nfunc)(double *out, double *in) -); - -/* Helper function to initialize the three tables contents */ -/* from supplied transfer functions. */ -/* Set errc and return error number */ -static int icmLut_set_tables ( -icmLut *p, /* Pointer to Lut object */ -void *cbctx, /* Opaque callback context pointer value */ -icColorSpaceSignature insig, /* Input color space */ -icColorSpaceSignature outsig, /* Output color space */ -void (*infunc)(void *cbcntx, double *out, double *in), - /* Input transfer function, inspace->inspace' (NULL = default) */ -double *inmin, double *inmax, /* Maximum range of inspace' values (NULL = default) */ -void (*clutfunc)(void *cbctx, double *out, double *in), - /* inspace' -> outspace' transfer function */ -double *clutmin, double *clutmax, /* Maximum range of outspace' values (NULL = default) */ -void (*outfunc)(void *cbctx, double *out, double *in) - /* Output transfer function, outspace'->outspace (NULL = deflt) */ -) { - icc *icp = p->icp; - int n, e; - int ii[MAX_CHAN]; /* Index value */ - psh counter; /* Pseudo-Hilbert counter */ - double _iv[2 * MAX_CHAN], *iv = &_iv[MAX_CHAN]; /* Real index value/table value */ - double imin[MAX_CHAN], imax[MAX_CHAN]; - double omin[MAX_CHAN], omax[MAX_CHAN]; - void (*ifromindex)(double *out, double *in); /* Index to input color space function */ - void (*itoentry)(double *out, double *in); /* Input color space to entry function */ - void (*ifromentry)(double *out, double *in); /* Entry to input color space function */ - void (*otoentry)(double *out, double *in); /* Output colorspace to table value function */ - void (*ofromentry)(double *out, double *in); /* Table value to output color space function */ - - if (getNormFunc(insig, p->ttype, icmFromLuti, &ifromindex) != 0) { - sprintf(icp->err,"icmLut_set_tables index to input colorspace function lookup failed"); - return icp->errc = 1; - } - if (getNormFunc(insig, p->ttype, icmToLutv, &itoentry) != 0) { - sprintf(icp->err,"icmLut_set_tables input colorspace to table entry function lookup failed"); - return icp->errc = 1; - } - if (getNormFunc(insig, p->ttype, icmFromLutv, &ifromentry) != 0) { - sprintf(icp->err,"icmLut_set_tables table entry to input colorspace function lookup failed"); - return icp->errc = 1; - } - - if (getNormFunc(outsig, p->ttype, icmToLutv, &otoentry) != 0) { - sprintf(icp->err,"icmLut_set_tables output colorspace to table entry function lookup failed"); - return icp->errc = 1; - } - if (getNormFunc(outsig, p->ttype, icmFromLutv, &ofromentry) != 0) { - sprintf(icp->err,"icmLut_set_tables table entry to output colorspace function lookup failed"); - return icp->errc = 1; - } - - /* Setup input table value min-max */ - if (inmin == NULL) { -#ifdef SYMETRICAL_DEFAULT_LAB_RANGE /* Try symetrical range */ - if (insig == icSigLabData) { /* Special case Lab */ - double mn[3], mx[3]; - /* Because the symetric range will cause slight clipping, */ - /* only do it if the input table has sufficient resolution */ - /* to represent the clipping faithfuly. */ - if (p->inputEnt >= 64) { - mn[0] = 0.0, mn[1] = -127.0, mn[2] = -127.0; - mx[0] = 100.0, mx[1] = 127.0, mx[2] = 127.0; - itoentry(imin, mn); /* Convert from input color space to table representation */ - itoentry(imax, mx); - } else { - for (e = 0; e < p->inputChan; e++) { - imin[e] = 0.0; - imax[e] = 1.0; - } - } - } else -#endif - { - for (e = 0; e < p->inputChan; e++) { - imin[e] = 0.0; /* We are assuming this is true for all other color spaces. */ - imax[e] = 1.0; - } - } - } else { - itoentry(imin, inmin); /* Convert from input color space to table representation */ - itoentry(imax, inmax); - } - - /* Setup output table value min-max */ - if (clutmin == NULL) { -#ifdef SYMETRICAL_DEFAULT_LAB_RANGE /* Try symetrical range */ - if (outsig == icSigLabData) { /* Special case Lab */ - double mn[3], mx[3]; - /* Because the symetric range will cause slight clipping, */ - /* only do it if the output table has sufficient resolution */ - /* to represent the clipping faithfuly. */ - if (p->outputEnt >= 64) { - mn[0] = 0.0, mn[1] = -127.0, mn[2] = -127.0; - mx[0] = 100.0, mx[1] = 127.0, mx[2] = 127.0; - otoentry(omin, mn);/* Convert from output color space to table representation */ - otoentry(omax, mx); - } else { - for (e = 0; e < p->inputChan; e++) { - omin[e] = 0.0; - omax[e] = 1.0; - } - } - } else -#endif - { - for (e = 0; e < p->outputChan; e++) { - omin[e] = 0.0; /* We are assuming this is true for all other color spaces. */ - omax[e] = 1.0; - } - } - } else { - otoentry(omin, clutmin);/* Convert from output color space to table representation */ - otoentry(omax, clutmax); - } - - /* Create the input table entry values */ - for (n = 0; n < p->inputEnt; n++) { - double fv; - fv = n/(p->inputEnt-1.0); - for (e = 0; e < p->inputChan; e++) - iv[e] = fv; - - ifromindex(iv,iv); /* Convert from index value to input color space value */ - - if (infunc != NULL) - infunc(cbctx, iv, iv); /* In colorspace -> input table -> In colorspace. */ - - itoentry(iv,iv); /* Convert from input color space value to table value */ - - /* Expand used range to 0.0 - 1.0, and clip to legal values */ - /* Note that if the range is reduced, and clipping occurs, */ - /* then there should be enough resolution within the input */ - /* table, to represent the sharp edges of the clipping. */ - for (e = 0; e < p->inputChan; e++) { - double tt; - tt = (iv[e] - imin[e])/(imax[e] - imin[e]); - if (tt < 0.0) - tt = 0.0; - else if (tt > 1.0) - tt = 1.0; - iv[e] = tt; - } - - for (e = 0; e < p->inputChan; e++) /* Input tables */ - p->inputTable[e * p->inputEnt + n] = iv[e]; - } - - /* Create the multi-dimensional lookup table values */ - - /* To make this clut function cache friendly, we use the pseudo-hilbert */ - /* count sequence. This keeps each point close to the last in the */ - /* multi-dimensional space. */ - - psh_init(&counter, p->inputChan, p->clutPoints, ii); /* Initialise counter */ - - /* Itterate through all verticies in the grid */ - for (;;) { - int ti; /* Table index */ - - for (ti = e = 0; e < p->inputChan; e++) { /* Input tables */ - ti += ii[e] * p->dinc[e]; /* Clut index */ - iv[e] = ii[e]/(p->clutPoints-1.0); /* Vertex coordinates */ - iv[e] = iv[e] * (imax[e] - imin[e]) + imin[e]; /* Undo expansion to 0.0 - 1.0 */ - *((int *)&iv[-e-1]) = ii[e]; /* Trick to supply grid index in iv[] */ - } - - ifromentry(iv,iv); /* Convert from table value to input color space */ - - /* Apply incolor -> outcolor function we want to represent */ - clutfunc(cbctx, iv, iv); - - otoentry(iv,iv); /* Convert from output color space value to table value */ - - /* Expand used range to 0.0 - 1.0, and clip to legal values */ - for (e = 0; e < p->outputChan; e++) { - double tt; - tt = (iv[e] - omin[e])/(omax[e] - omin[e]); - if (tt < 0.0) - tt = 0.0; - else if (tt > 1.0) - tt = 1.0; - iv[e] = tt; - } - - for (e = 0; e < p->outputChan; e++) /* Output chans */ - p->clutTable[ti++] = iv[e]; - - /* Increment index within block (Reverse index significancd) */ - if (psh_inc(&counter, ii)) - break; - } - - /* Create the output table entry values */ - for (n = 0; n < p->outputEnt; n++) { - double fv; - fv = n/(p->outputEnt-1.0); - for (e = 0; e < p->outputChan; e++) - iv[e] = fv; - - /* Undo expansion to 0.0 - 1.0 */ - for (e = 0; e < p->outputChan; e++) /* Output tables */ - iv[e] = iv[e] * (omax[e] - omin[e]) + omin[e]; - - ofromentry(iv,iv); /* Convert from table value to output color space value */ - - if (outfunc != NULL) - outfunc(cbctx, iv, iv); /* Out colorspace -> output table -> out colorspace. */ - - otoentry(iv,iv); /* Convert from output color space value to table value */ - - /* Clip to legal values */ - for (e = 0; e < p->outputChan; e++) { - double tt; - tt = iv[e]; - if (tt < 0.0) - tt = 0.0; - else if (tt > 1.0) - tt = 1.0; - iv[e] = tt; - } - - for (e = 0; e < p->outputChan; e++) /* Input tables */ - p->outputTable[e * p->outputEnt + n] = iv[e]; - } - return 0; -} - -/* - - - - - - - - - - - - - - - - */ -/* Return the number of bytes needed to write this tag */ -static unsigned int icmLut_get_size( - icmBase *pp -) { - icmLut *p = (icmLut *)pp; - unsigned int len = 0; - unsigned int pw; - - if (p->ttype == icSigLut8Type) { - len += 48; /* tag and header */ - if (p->inputChan > 0 && - p->inputEnt > (UINT_MAX - len) / p->inputChan / 1) - goto overflow; - - len += 1 * (p->inputChan * p->inputEnt); - if (uipow(p->clutPoints,p->inputChan, &pw) || - (p->outputChan > 0 && - pw > (UINT_MAX - len) / p->outputChan / 1)) - goto overflow; - - len += 1 * (p->outputChan * pw); - if (p->outputChan > 0 && - p->outputEnt > (UINT_MAX - len) / p->outputChan / 1) - goto overflow; - - len += 1 * (p->outputChan * p->outputEnt); - } else { - len += 52; /* tag and header */ - if (p->inputChan > 0 && - p->inputEnt > (UINT_MAX - len) / p->inputChan / 2) - goto overflow; - - len += 2 * (p->inputChan * p->inputEnt); - if (uipow(p->clutPoints,p->inputChan, &pw) || - (p->outputChan > 0 && - pw > (UINT_MAX - len) / p->outputChan / 2)) - goto overflow; - - len += 2 * (p->outputChan * pw); - if (p->outputChan > 0 && - p->outputEnt > (UINT_MAX - len) / p->outputChan / 2) - goto overflow; - - len += 2 * (p->outputChan * p->outputEnt); - } - return len; - - overflow: - p->icp->errc = 1; - return (unsigned int) -1; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmLut_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmLut *p = (icmLut *)pp; - icc *icp = p->icp; - int rv = 0; - unsigned long i, j, g, size; - unsigned int pw; - char *bp, *buf; - - if (len < 4) { - sprintf(icp->err,"icmLut_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmLut_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmLut_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read type descriptor from the buffer */ - p->ttype = (icTagTypeSignature)read_SInt32Number(bp); - if (p->ttype != icSigLut8Type && p->ttype != icSigLut16Type) { - sprintf(icp->err,"icmLut_read: Wrong tag type for icmLut"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - if (p->ttype == icSigLut8Type) { - if (len < 48) { - sprintf(icp->err,"icmLut_read: Tag too small to be legal"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - } else { - if (len < 52) { - sprintf(icp->err,"icmLut_read: Tag too small to be legal"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - } - - /* Read in the info common to 8 and 16 bit Lut */ - p->inputChan = read_UInt8Number(bp+8); - p->outputChan = read_UInt8Number(bp+9); - p->clutPoints = read_UInt8Number(bp+10); - - /* Sanity check */ - if (p->inputChan > MAX_CHAN) { - sprintf(icp->err,"icmLut_read: Can't handle > %d input channels\n",MAX_CHAN); - return icp->errc = 1; - } - - if (p->outputChan > MAX_CHAN) { - sprintf(icp->err,"icmLut_read: Can't handle > %d output channels\n",MAX_CHAN); - return icp->errc = 1; - } - - if (p->clutPoints > 255) { - sprintf(icp->err,"icmLut_read: too many clutPoints"); - return icp->errc = 1; - } - - /* Read 3x3 transform matrix */ - for (j = 0; j < 3; j++) { /* Rows */ - for (i = 0; i < 3; i++) { /* Columns */ - p->e[j][i] = read_S15Fixed16Number(bp + 12 + ((j * 3 + i) * 4)); - } - } - /* Read 16 bit specific stuff */ - if (p->ttype == icSigLut8Type) { - p->inputEnt = 256; /* By definition */ - p->outputEnt = 256; /* By definition */ - bp = buf+48; - } else { - p->inputEnt = read_UInt16Number(bp+48); - p->outputEnt = read_UInt16Number(bp+50); - bp = buf+52; - } - - if (len < icmLut_get_size((icmBase *)p) || icp->errc) { - sprintf(icp->err,"icmLut_read: Tag too small for contents"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read the input tables */ - if (p->inputEnt > 0 && p->inputChan > UINT_MAX / p->inputEnt) { - sprintf(icp->err,"icmLut_read: overflow"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - size = (p->inputChan * p->inputEnt); - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - if (p->ttype == icSigLut8Type) { - for (i = 0; i < size; i++, bp += 1) - p->inputTable[i] = read_DCS8Number(bp); - } else { - for (i = 0; i < size; i++, bp += 2) - p->inputTable[i] = read_DCS16Number(bp); - } - - /* Read the clut table */ - if (uipow(p->clutPoints,p->inputChan,&pw) || - (p->outputChan > 0 && - pw > UINT_MAX / p->outputChan)) { - sprintf(icp->err,"icmLut_read: overflow"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - size = (p->outputChan * pw); - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - if (p->ttype == icSigLut8Type) { - for (i = 0; i < size; i++, bp += 1) - p->clutTable[i] = read_DCS8Number(bp); - } else { - for (i = 0; i < size; i++, bp += 2) - p->clutTable[i] = read_DCS16Number(bp); - } - - /* Read the output tables */ - if (p->outputChan > 0 && p->outputEnt > UINT_MAX / p->outputChan) { - sprintf(icp->err,"icmLut_read: overflow"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - size = (p->outputChan * p->outputEnt); - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - if (p->ttype == icSigLut8Type) { - for (i = 0; i < size; i++, bp += 1) - p->outputTable[i] = read_DCS8Number(bp); - } else { - for (i = 0; i < size; i++, bp += 2) - p->outputTable[i] = read_DCS16Number(bp); - } - - /* Private: compute dimensional increment though clut */ - /* Note that first channel varies least rapidly. */ - i = p->inputChan-1; - p->dinc[i--] = p->outputChan; - for (; i < p->inputChan; i--) - p->dinc[i] = p->dinc[i+1] * p->clutPoints; - - /* Private: compute offsets from base of cube to other corners */ - for (p->dcube[0] = 0, g = 1, j = 0; j < p->inputChan; j++) { - for (i = 0; i < g; i++) - p->dcube[g+i] = p->dcube[i] + p->dinc[j]; - g *= 2; - } - - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmLut_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmLut *p = (icmLut *)pp; - icc *icp = p->icp; - unsigned long i,j; - unsigned int len, size, pw; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmLut_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmLut_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - - /* Write the info common to 8 and 16 bit Lut */ - if ((rv = write_UInt8Number(p->inputChan, bp+8)) != 0) { - sprintf(icp->err,"icmLut_write: write_UInt8Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_UInt8Number(p->outputChan, bp+9)) != 0) { - sprintf(icp->err,"icmLut_write: write_UInt8Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_UInt8Number(p->clutPoints, bp+10)) != 0) { - sprintf(icp->err,"icmLut_write: write_UInt8Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - /* Write 3x3 transform matrix */ - for (j = 0; j < 3; j++) { /* Rows */ - for (i = 0; i < 3; i++) { /* Columns */ - if ((rv = write_S15Fixed16Number(p->e[j][i],bp + 12 + ((j * 3 + i) * 4))) != 0) { - sprintf(icp->err,"icmLut_write: write_S15Fixed16Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } - } - - /* Write 16 bit specific stuff */ - if (p->ttype == icSigLut8Type) { - if (p->inputEnt != 256 || p->outputEnt != 256) { - sprintf(icp->err,"icmLut_write: 8 bit Input and Output tables must be 256 entries"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - bp = buf+48; - } else { - if ((rv = write_UInt16Number(p->inputEnt, bp+48)) != 0) { - sprintf(icp->err,"icmLut_write: write_UInt16Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_UInt16Number(p->outputEnt, bp+50)) != 0) { - sprintf(icp->err,"icmLut_write: write_UInt16Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - bp = buf+52; - } - - /* Write the input tables */ - if (p->inputEnt > 0 && p->inputChan > UINT_MAX / p->inputEnt) { - sprintf(icp->err,"icmLut_write: overflow"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - size = (p->inputChan * p->inputEnt); - if (p->ttype == icSigLut8Type) { - for (i = 0; i < size; i++, bp += 1) { - if ((rv = write_DCS8Number(p->inputTable[i], bp)) != 0) { - sprintf(icp->err,"icmLut_write: inputTable write_DCS8Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } - } else { - for (i = 0; i < size; i++, bp += 2) { - if ((rv = write_DCS16Number(p->inputTable[i], bp)) != 0) { - sprintf(icp->err,"icmLut_write: inputTable write_DCS16Number(%f) failed",p->inputTable[i]); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } - } - - /* Write the clut table */ - if (uipow(p->clutPoints,p->inputChan,&pw) || - (p->outputChan > 0 && - pw > UINT_MAX / p->outputChan)) { - sprintf(icp->err,"icmLut_write: overflow"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - size = (p->outputChan * pw); - if (p->ttype == icSigLut8Type) { - for (i = 0; i < size; i++, bp += 1) { - if ((rv = write_DCS8Number(p->clutTable[i], bp)) != 0) { - sprintf(icp->err,"icmLut_write: clutTable write_DCS8Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } - } else { - for (i = 0; i < size; i++, bp += 2) { - if ((rv = write_DCS16Number(p->clutTable[i], bp)) != 0) { - sprintf(icp->err,"icmLut_write: clutTable write_DCS16Number(%f) failed",p->clutTable[i]); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } - } - - /* Write the output tables */ - if (p->outputChan > 0 && p->outputEnt > UINT_MAX / p->outputChan) { - sprintf(icp->err,"icmLut_write: overflow"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - size = (p->outputChan * p->outputEnt); - if (p->ttype == icSigLut8Type) { - for (i = 0; i < size; i++, bp += 1) { - if ((rv = write_DCS8Number(p->outputTable[i], bp)) != 0) { - sprintf(icp->err,"icmLut_write: outputTable write_DCS8Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } - } else { - for (i = 0; i < size; i++, bp += 2) { - if ((rv = write_DCS16Number(p->outputTable[i], bp)) != 0) { - sprintf(icp->err,"icmLut_write: outputTable write_DCS16Number(%f) failed",p->outputTable[i]); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } - } - - /* Write buffer to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmLut_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmLut_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmLut *p = (icmLut *)pp; - if (verb <= 0) - return; - - if (p->ttype == icSigLut8Type) { - fprintf(op,"Lut8:\n"); - } else { - fprintf(op,"Lut16:\n"); - } - fprintf(op," Input Channels = %u\n",p->inputChan); - fprintf(op," Output Channels = %u\n",p->outputChan); - fprintf(op," CLUT resolution = %u\n",p->clutPoints); - fprintf(op," Input Table entries = %u\n",p->inputEnt); - fprintf(op," Output Table entries = %u\n",p->outputEnt); - fprintf(op," XYZ matrix = %f, %f, %f\n",p->e[0][0],p->e[0][1],p->e[0][2]); - fprintf(op," %f, %f, %f\n",p->e[1][0],p->e[1][1],p->e[1][2]); - fprintf(op," %f, %f, %f\n",p->e[2][0],p->e[2][1],p->e[2][2]); - - if (verb >= 2) { - unsigned int i,size; - int j; - unsigned int ii[MAX_CHAN]; /* maximum no of input channels */ - - fprintf(op," Input table:\n"); - for (i = 0; i < p->inputEnt; i++) { - fprintf(op," %3u: ",i); - for (j = 0; j < p->inputChan; j++) - fprintf(op," %1.10f",p->inputTable[j * p->inputEnt + i]); - fprintf(op,"\n"); - } - - fprintf(op,"\n CLUT table:\n"); - if (p->inputChan > MAX_CHAN) { - fprintf(op," !!Can't dump > %d input channel CLUT table!!\n",MAX_CHAN); - } else { - unsigned int pw; - if (uipow(p->clutPoints,p->inputChan,&pw) || - (p->outputChan > 0 && - pw > UINT_MAX / p->outputChan)) { - fprintf(op,"Would overflow.\n"); - return; - } - size = (p->outputChan * pw); - for (j = 0; j < p->inputChan; j++) - ii[j] = 0; - for (i = 0; i < size;) { - int k; - /* Print table entry index */ - fprintf(op," "); - for (j = p->inputChan-1; j >= 0; j--) - fprintf(op," %2u",ii[j]); - fprintf(op,":"); - /* Print table entry contents */ - for (k = 0; k < p->outputChan; k++, i++) - fprintf(op," %1.10f",p->clutTable[i]); - fprintf(op,"\n"); - - for (j = 0; j < p->inputChan; j++) { /* Increment index */ - ii[j]++; - if (ii[j] < p->clutPoints) - break; /* No carry */ - ii[j] = 0; - } - } - } - - fprintf(op,"\n Output table:\n"); - for (i = 0; i < p->outputEnt; i++) { - fprintf(op," %3u: ",i); - for (j = 0; j < p->outputChan; j++) - fprintf(op," %1.10f",p->outputTable[j * p->outputEnt + i]); - fprintf(op,"\n"); - } - - } -} - -/* Allocate variable sized data elements */ -static int icmLut_allocate( - icmBase *pp -) { - unsigned int i, j, g, size, pw; - icmLut *p = (icmLut *)pp; - icc *icp = p->icp; - - /* Sanity check */ - if (p->inputChan > MAX_CHAN) { - sprintf(icp->err,"icmLut_alloc: Can't handle > %d input channels\n",MAX_CHAN); - return icp->errc = 1; - } - - if (p->outputChan > MAX_CHAN) { - sprintf(icp->err,"icmLut_alloc: Can't handle > %d output channels\n",MAX_CHAN); - return icp->errc = 1; - } - - if (p->inputEnt > 0 && p->inputChan > UINT_MAX / p->inputEnt) { - sprintf(icp->err,"icmLut_alloc: too many entries"); - return icp->errc = 1; - } - size = (p->inputChan * p->inputEnt); - if (size != p->inputTable_size) { - if (p->inputTable != NULL) - icp->al->free(icp->al, p->inputTable); - if ((p->inputTable = (double *) icp->al->calloc(icp->al,sizeof(double), size)) == NULL) { - sprintf(icp->err,"icmLut_alloc: calloc() of Lut inputTable data failed"); - return icp->errc = 2; - } - p->inputTable_size = size; - } - if (uipow(p->clutPoints,p->inputChan,&pw) || - (p->outputChan > 0 && - pw > UINT_MAX / p->outputChan)) { - sprintf(icp->err,"icmLut_alloc: overflow"); - return icp->errc = 1; - } - size = (p->outputChan * pw); - if (size != p->clutTable_size) { - if (p->clutTable != NULL) - icp->al->free(icp->al, p->clutTable); - if ((p->clutTable = (double *) icp->al->calloc(icp->al,sizeof(double), size)) == NULL) { - sprintf(icp->err,"icmLut_alloc: calloc() of Lut clutTable data failed"); - return icp->errc = 2; - } - p->clutTable_size = size; - } - if (p->outputChan > 0 && p->outputEnt > UINT_MAX / p->outputChan) { - sprintf(icp->err,"icmLut_alloc: overflow"); - return icp->errc = 1; - } - size = (p->outputChan * p->outputEnt); - if (size != p->outputTable_size) { - if (p->outputTable != NULL) - icp->al->free(icp->al, p->outputTable); - if ((p->outputTable = (double *) icp->al->calloc(icp->al,sizeof(double), size)) == NULL) { - sprintf(icp->err,"icmLut_alloc: calloc() of Lut outputTable data failed"); - return icp->errc = 2; - } - p->outputTable_size = size; - } - - /* Private: compute dimensional increment though clut */ - /* Note that first channel varies least rapidly. */ - i = p->inputChan-1; - p->dinc[i--] = p->outputChan; - for (; i < p->inputChan; i--) - p->dinc[i] = p->dinc[i+1] * p->clutPoints; - - /* Private: compute offsets from base of cube to other corners */ - for (p->dcube[0] = 0, g = 1, j = 0; j < p->inputChan; j++) { - for (i = 0; i < g; i++) - p->dcube[g+i] = p->dcube[i] + p->dinc[j]; - g *= 2; - } - - return 0; -} - -/* Free all storage in the object */ -static void icmLut_delete( - icmBase *pp -) { - icmLut *p = (icmLut *)pp; - icc *icp = p->icp; - - if (p->inputTable != NULL) - icp->al->free(icp->al, p->inputTable); - if (p->clutTable != NULL) - icp->al->free(icp->al, p->clutTable); - if (p->outputTable != NULL) - icp->al->free(icp->al, p->outputTable); - icmTable_delete_bwd(icp, &p->rit); - icmTable_delete_bwd(icp, &p->rot); - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmLut( - icc *icp -) { - int i,j; - icmLut *p; - if ((p = (icmLut *) icp->al->calloc(icp->al,1,sizeof(icmLut))) == NULL) - return NULL; - p->ttype = icSigLut16Type; - p->refcount = 1; - p->get_size = icmLut_get_size; - p->read = icmLut_read; - p->write = icmLut_write; - p->dump = icmLut_dump; - p->allocate = icmLut_allocate; - p->del = icmLut_delete; - - /* Lookup methods */ - p->nu_matrix = icmLut_nu_matrix; - p->min_max = icmLut_min_max; - p->lookup_matrix = icmLut_lookup_matrix; - p->lookup_input = icmLut_lookup_input; - p->lookup_clut_nl = icmLut_lookup_clut_nl; - p->lookup_clut_sx = icmLut_lookup_clut_sx; - p->lookup_output = icmLut_lookup_output; - - /* Set method */ - p->set_tables = icmLut_set_tables; - - p->icp = icp; - - /* Set matrix to reasonable default */ - for (i = 0; i < 3; i++) - for (j = 0; j < 3; j++) { - if (i == j) - p->e[i][j] = 1.0; - else - p->e[i][j] = 0.0; - } - - /* Init lookups to non-dangerous values */ - for (i = 0; i < MAX_CHAN; i++) - p->dinc[i] = 0; - - for (i = 0; i < (1 << MAX_CHAN); i++) - p->dcube[i] = 0; - - p->rit.inited = 0; - p->rot.inited = 0; - - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ -/* Measurement */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmMeasurement_get_size( - icmBase *pp -) { - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ - len += 4; /* 4 for standard observer */ - len += 12; /* 12 for XYZ of measurement backing */ - len += 4; /* 4 for measurement geometry */ - len += 4; /* 4 for measurement flare */ - len += 4; /* 4 for standard illuminant */ - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmMeasurement_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmMeasurement *p = (icmMeasurement *)pp; - icc *icp = p->icp; - int rv; - char *bp, *buf; - - if (len < 36) { - sprintf(icp->err,"icmMeasurement_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmMeasurement_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmMeasurement_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - sprintf(icp->err,"icmMeasurement_read: Wrong tag type for icmMeasurement"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read the encoded standard observer */ - p->observer = (icStandardObserver)read_SInt32Number(bp + 8); - - /* Read the XYZ values for measurement backing */ - if ((rv = read_XYZNumber(&p->backing, bp+12)) != 0) { - sprintf(icp->err,"icmMeasurement: read_XYZNumber error"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - /* Read the encoded measurement geometry */ - p->geometry = (icMeasurementGeometry)read_SInt32Number(bp + 24); - - /* Read the proportion of flare */ - p->flare = read_U16Fixed16Number(bp + 28); - - /* Read the encoded standard illuminant */ - p->illuminant = (icIlluminant)read_SInt32Number(bp + 32); - - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmMeasurement_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmMeasurement *p = (icmMeasurement *)pp; - icc *icp = p->icp; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmMeasurement_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmMeasurement_write, type: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - - /* Write the encoded standard observer */ - if ((rv = write_SInt32Number((int)p->observer, bp + 8)) != 0) { - sprintf(icp->err,"icmMeasurementa_write, observer: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - /* Write the XYZ values for measurement backing */ - if ((rv = write_XYZNumber(&p->backing, bp+12)) != 0) { - sprintf(icp->err,"icmMeasurement, backing: write_XYZNumber error"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - /* Write the encoded measurement geometry */ - if ((rv = write_SInt32Number((int)p->geometry, bp + 24)) != 0) { - sprintf(icp->err,"icmMeasurementa_write, geometry: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - /* Write the proportion of flare */ - if ((rv = write_U16Fixed16Number(p->flare, bp + 28)) != 0) { - sprintf(icp->err,"icmMeasurementa_write, flare: write_U16Fixed16Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - /* Write the encoded standard illuminant */ - if ((rv = write_SInt32Number((int)p->illuminant, bp + 32)) != 0) { - sprintf(icp->err,"icmMeasurementa_write, illuminant: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmMeasurement_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmMeasurement_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmMeasurement *p = (icmMeasurement *)pp; - if (verb <= 0) - return; - - fprintf(op,"Measurement:\n"); - fprintf(op," Standard Observer = %s\n", string_StandardObserver(p->observer)); - fprintf(op," XYZ for Measurement Backing = %s\n", string_XYZNumber_and_Lab(&p->backing)); - fprintf(op," Measurement Geometry = %s\n", string_MeasurementGeometry(p->geometry)); - fprintf(op," Measurement Flare = %5.1f%%\n", p->flare * 100.0); - fprintf(op," Standard Illuminant = %s\n", string_Illuminant(p->illuminant)); -} - -/* Allocate variable sized data elements */ -static int icmMeasurement_allocate( - icmBase *pp -) { - /* Nothing to do */ - return 0; -} - -/* Free all storage in the object */ -static void icmMeasurement_delete( - icmBase *pp -) { - icmMeasurement *p = (icmMeasurement *)pp; - icc *icp = p->icp; - - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmMeasurement( - icc *icp -) { - icmMeasurement *p; - if ((p = (icmMeasurement *) icp->al->calloc(icp->al,1,sizeof(icmMeasurement))) == NULL) - return NULL; - p->ttype = icSigMeasurementType; - p->refcount = 1; - p->get_size = icmMeasurement_get_size; - p->read = icmMeasurement_read; - p->write = icmMeasurement_write; - p->dump = icmMeasurement_dump; - p->allocate = icmMeasurement_allocate; - p->del = icmMeasurement_delete; - p->icp = icp; - - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ - -/* Named color structure read/write support */ -static int read_NamedColorVal( - icmNamedColorVal *p, - char *bp, - char *end, - icColorSpaceSignature pcs, /* Header Profile Connection Space */ - unsigned int ndc /* Number of device corrds */ -) { - icc *icp = p->icp; - int i; - unsigned int mxl; /* Max possible string length */ - - mxl = (end - bp) < 32 ? (end - bp) : 32; - if (check_null_string(bp,mxl)) { - sprintf(icp->err,"icmNamedColorVal_read: Root name string not terminated"); - return icp->errc = 1; - } - strcpy((void *)p->root, (void *)bp); - bp += strlen(p->root) + 1; - if ((bp + ndc) > end) { - sprintf(icp->err,"icmNamedColorVal_read: Data too short to read device coords"); - return icp->errc = 1; - } - for (i = 0; i < ndc; i++) { - p->deviceCoords[i] = read_DCS8Number(bp); - bp += 1; - } - return 0; -} - -static int read_NamedColorVal2( - icmNamedColorVal *p, - char *bp, - char *end, - icColorSpaceSignature pcs, /* Header Profile Connection Space */ - unsigned int ndc /* Number of device corrds */ -) { - icc *icp = p->icp; - int i; - if ((bp + 32 + 6 + ndc * 2) > end) { - sprintf(icp->err,"icmNamedColorVal2_read: Data too short to read"); - return icp->errc = 1; - } - if (check_null_string(bp,32)) { - sprintf(icp->err,"icmNamedColorVal2_read: Root name string not terminated"); - return icp->errc = 1; - } - memcpy((void *)p->root,(void *)(bp + 0),32); - switch(pcs) { - case icSigXYZData: - p->pcsCoords[0] = read_PCSXYZ16Number(bp+32); - p->pcsCoords[1] = read_PCSXYZ16Number(bp+34); - p->pcsCoords[2] = read_PCSXYZ16Number(bp+36); - break; - case icSigLabData: - p->pcsCoords[0] = read_PCSL16Number(bp+32); - p->pcsCoords[1] = read_PCSab16Number(bp+34); - p->pcsCoords[2] = read_PCSab16Number(bp+36); - break; - default: - return 1; /* Unknown PCS */ - } - for (i = 0; i < ndc; i++) - p->deviceCoords[i] = read_DCS16Number(bp + 32 + 6 + 2 * i); - return 0; -} - -static int write_NamedColorVal( - icmNamedColorVal *p, - char *d, - icColorSpaceSignature pcs, /* Header Profile Connection Space */ - unsigned int ndc /* Number of device corrds */ -) { - icc *icp = p->icp; - int i, rv = 0; - if (check_null_string(p->root,32) != 0) { - sprintf(icp->err,"icmNamedColorVal_write: Root string names is unterminated"); - return icp->errc = 1; - } - strcpy((void *)d,(void *)p->root); - d += strlen(p->root) + 1; - for (i = 0; i < ndc; i++) { - if ((rv = write_DCS8Number(p->deviceCoords[i], d)) != 0) { - sprintf(icp->err,"icmNamedColorVal_write: write of device coord failed"); - return icp->errc = 1; - } - d += 1; - } - return 0; -} - -static int write_NamedColorVal2( - icmNamedColorVal *p, - char *bp, - icColorSpaceSignature pcs, /* Header Profile Connection Space */ - unsigned int ndc /* Number of device corrds */ -) { - icc *icp = p->icp; - int i, rv = 0; - if (check_null_string(p->root,32)) { - sprintf(icp->err,"icmNamedColorVal2_write: Root string names is unterminated"); - return icp->errc = 1; - } - memcpy((void *)(bp + 0),(void *)p->root,32); - switch(pcs) { - case icSigXYZData: - rv |= write_PCSXYZ16Number(p->pcsCoords[0], bp+32); - rv |= write_PCSXYZ16Number(p->pcsCoords[1], bp+34); - rv |= write_PCSXYZ16Number(p->pcsCoords[2], bp+36); - break; - case icSigLabData: - rv |= write_PCSL16Number(p->pcsCoords[0], bp+32); - rv |= write_PCSab16Number(p->pcsCoords[1], bp+34); - rv |= write_PCSab16Number(p->pcsCoords[2], bp+36); - break; - default: - sprintf(icp->err,"icmNamedColorVal2_write: Unknown PCS"); - return icp->errc = 1; - } - if (rv) { - sprintf(icp->err,"icmNamedColorVal2_write: write of PCS coord failed"); - return icp->errc = 1; - } - for (i = 0; i < ndc; i++) { - if ((rv = write_DCS16Number(p->deviceCoords[i], bp + 32 + 6 + 2 * i)) != 0) { - sprintf(icp->err,"icmNamedColorVal2_write: write of device coord failed"); - return icp->errc = 1; - } - } - return 0; -} - -/* - - - - - - - - - - - */ -/* icmNamedColor object */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmNamedColor_get_size( - icmBase *pp -) { - icmNamedColor *p = (icmNamedColor *)pp; - unsigned int len = 0; - if (p->ttype == icSigNamedColorType) { - unsigned int i; - len += 8; /* 8 bytes for tag and padding */ - len += 4; /* 4 for vendor specific flags */ - len += 4; /* 4 for count of named colors */ - len += strlen(p->prefix) + 1; /* prefix of color names */ - len += strlen(p->suffix) + 1; /* suffix of color names */ - for (i = 0; i < p->count; i++) { - len += strlen(p->data[i].root) + 1; /* color names */ - len += p->nDeviceCoords * 1; /* bytes for each named color */ - } - } else { /* Named Color 2 */ - unsigned int col; - len += 8; /* 8 bytes for tag and padding */ - len += 4; /* 4 for vendor specific flags */ - len += 4; /* 4 for count of named colors */ - len += 4; /* 4 for number of device coords */ - len += 32; /* 32 for prefix of color names */ - len += 32; /* 32 for suffix of color names */ - col = 32 + 6 + p->nDeviceCoords * 2; - if (p->nDeviceCoords > (UINT_MAX - (32 + 6)) / 2 || - (p->count > 0 && col > (UINT_MAX - len) / p->count)) { - p->icp->errc = 1; - return (unsigned int) -1; - } - len += p->count * col; /* bytes for each named color */ - } - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmNamedColor_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmNamedColor *p = (icmNamedColor *)pp; - icc *icp = p->icp; - unsigned long i; - char *bp, *buf, *end; - int rv = 0; - - if (len < 4) { - sprintf(icp->err,"icmNamedColor_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmNamedColor_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - end = buf + len; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmNamedColor_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read type descriptor from the buffer */ - p->ttype = (icTagTypeSignature)read_SInt32Number(bp); - if (p->ttype != icSigNamedColorType && p->ttype != icSigNamedColor2Type) { - sprintf(icp->err,"icmNamedColor_read: Wrong tag type for icmNamedColor"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - if (p->ttype == icSigNamedColorType) { - if (len < 16) { - sprintf(icp->err,"icmNamedColor_read: Tag too small to be legal"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - /* Make sure that the number of device coords in known */ - p->nDeviceCoords = number_ColorSpaceSignature(icp->header->colorSpace); - if (p->nDeviceCoords > MAX_CHAN) { - sprintf(icp->err,"icmNamedColor_read: Can't handle more than %d device channels",MAX_CHAN); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - } else { /* icmNC2 */ - if (len < 84) { - sprintf(icp->err,"icmNamedColor_read: Tag too small to be legal"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - } - - /* Read vendor specific flag */ - p->vendorFlag = read_UInt32Number(bp+8); - - /* Read count of named colors */ - p->count = read_UInt32Number(bp+12); - - if (p->ttype == icSigNamedColorType) { - unsigned int mxl; /* Max possible string length */ - bp = bp + 16; - - /* Prefix for each color name */ - mxl = (end - bp) < 32 ? (end - bp) : 32; - if (check_null_string(bp,mxl) != 0) { - sprintf(icp->err,"icmNamedColor_read: Color prefix is not null terminated"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - strcpy((void *)p->prefix, (void *)bp); - bp += strlen(p->prefix) + 1; - - /* Suffix for each color name */ - mxl = (end - bp) < 32 ? (end - bp) : 32; - if (check_null_string(bp,mxl) != 0) { - sprintf(icp->err,"icmNamedColor_read: Color suffix is not null terminated"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - strcpy((void *)p->suffix, (void *)bp); - bp += strlen(p->suffix) + 1; - - if ((rv = p->allocate((void *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - - /* Read all the data from the buffer */ - for (i = 0; i < p->count; i++) { - if ((rv = read_NamedColorVal(p->data+i, bp, end, icp->header->pcs, p->nDeviceCoords)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - bp += strlen(p->data[i].root) + 1; - bp += p->nDeviceCoords * 1; - } - } else { /* icmNC2 */ - /* Number of device coords per color */ - p->nDeviceCoords = read_UInt32Number(bp+16); - - /* Prefix for each color name */ - memcpy((void *)p->prefix, (void *)(bp + 20), 32); - if (check_null_string(p->prefix,32) != 0) { - sprintf(icp->err,"icmNamedColor_read: Color prefix is not null terminated"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Suffix for each color name */ - memcpy((void *)p->suffix, (void *)(bp + 52), 32); - if (check_null_string(p->suffix,32) != 0) { - sprintf(icp->err,"icmNamedColor_read: Color suffix is not null terminated"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - - /* Read all the data from the buffer */ - bp = bp + 84; - for (i = 0; i < p->count; i++, bp += (32 + 6 + p->nDeviceCoords * 2)) { - if ((rv = read_NamedColorVal2(p->data+i, bp, end, icp->header->pcs, p->nDeviceCoords)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - } - } - icp->al->free(icp->al, buf); - return rv; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmNamedColor_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmNamedColor *p = (icmNamedColor *)pp; - icc *icp = p->icp; - unsigned long i; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmNamedColor_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmNamedColor_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - - /* Write vendor specific flag */ - if ((rv = write_UInt32Number(p->vendorFlag, bp+8)) != 0) { - sprintf(icp->err,"icmNamedColor_write: write_UInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - /* Write count of named colors */ - if ((rv = write_UInt32Number(p->count, bp+12)) != 0) { - sprintf(icp->err,"icmNamedColor_write: write_UInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - if (p->ttype == icSigNamedColorType) { - bp = bp + 16; - - /* Prefix for each color name */ - if ((rv = check_null_string(p->prefix,32)) != 0) { - sprintf(icp->err,"icmNamedColor_write: Color prefix is not null terminated"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - strcpy((void *)bp, (void *)p->prefix); - bp += strlen(p->prefix) + 1; - - /* Suffix for each color name */ - if (check_null_string(p->suffix,32)) { - sprintf(icp->err,"icmNamedColor_write: Color sufix is not null terminated"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - strcpy((void *)bp, (void *)p->suffix); - bp += strlen(p->suffix) + 1; - - /* Write all the data to the buffer */ - - for (i = 0; i < p->count; i++) { - if ((rv = write_NamedColorVal(p->data+i, bp, icp->header->pcs, p->nDeviceCoords)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - bp += strlen(p->data[i].root) + 1; - bp += p->nDeviceCoords * 1; - } - } else { /* icmNC2 */ - /* Number of device coords per color */ - if ((rv = write_UInt32Number(p->nDeviceCoords, bp+16)) != 0) { - sprintf(icp->err,"icmNamedColor_write: write_UInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - /* Prefix for each color name */ - if ((rv = check_null_string(p->prefix,32)) != 0) { - sprintf(icp->err,"icmNamedColor_write: Color prefix is not null terminated"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - memcpy((void *)(bp + 20), (void *)p->prefix, 32); - - /* Suffix for each color name */ - if (check_null_string(p->suffix,32)) { - sprintf(icp->err,"icmNamedColor_write: Color sufix is not null terminated"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - memcpy((void *)(bp + 52), (void *)p->suffix, 32); - - /* Write all the data to the buffer */ - bp = bp + 84; - for (i = 0; i < p->count; i++, bp += (32 + 6 + p->nDeviceCoords * 2)) { - if ((rv = write_NamedColorVal2(p->data+i, bp, icp->header->pcs, p->nDeviceCoords)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - } - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmNamedColor_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmNamedColor_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmNamedColor *p = (icmNamedColor *)pp; - icc *icp = p->icp; - if (verb <= 0) - return; - - if (p->ttype == icSigNamedColorType) - fprintf(op,"NamedColor:\n"); - else - fprintf(op,"NamedColor2:\n"); - fprintf(op," Vendor Flag = 0x%x\n",p->vendorFlag); - fprintf(op," No. colors = %u\n",p->count); - fprintf(op," No. dev. coords = %u\n",p->nDeviceCoords); - fprintf(op," Name prefix = '%s'\n",p->prefix); - fprintf(op," Name suffix = '%s'\n",p->suffix); - if (verb >= 2) { - unsigned long i, n; - icmNamedColorVal *vp; - for (i = 0; i < p->count; i++) { - vp = p->data + i; - fprintf(op," Color %lu:\n",i); - fprintf(op," Name root = '%s'\n",vp->root); - - if (p->ttype == icSigNamedColor2Type) { - switch(icp->header->pcs) { - case icSigXYZData: - fprintf(op," XYZ = %f, %f, %f'\n", - vp->pcsCoords[0],vp->pcsCoords[1],vp->pcsCoords[2]); - break; - case icSigLabData: - fprintf(op," Lab = %f, %f, %f'\n", - vp->pcsCoords[0],vp->pcsCoords[1],vp->pcsCoords[2]); - break; - default: - fprintf(op," Unexpected PCS\n"); - break; - } - } - if (p->nDeviceCoords > 0) { - fprintf(op," Device Coords = "); - for (n = 0; n < p->nDeviceCoords; n++) { - if (n > 0) - printf(", "); - printf("%f",vp->deviceCoords[n]); - } - printf("\n"); - } - } - } -} - -/* Allocate variable sized data elements */ -static int icmNamedColor_allocate( - icmBase *pp -) { - icmNamedColor *p = (icmNamedColor *)pp; - icc *icp = p->icp; - - if (p->count != p->_count) { - unsigned int i; - if (p->data != NULL) - icp->al->free(icp->al, p->data); - if ((p->data = (icmNamedColorVal *) icp->al->calloc(icp->al,p->count, sizeof(icmNamedColorVal))) == NULL) { - sprintf(icp->err,"icmNamedColor_alloc: calloc() of icmNamedColor data failed"); - return icp->errc = 2; - } - for (i = 0; i < p->count; i++) { - p->data[i].icp = icp; /* Do init */ - } - p->_count = p->count; - } - return 0; -} - -/* Free all storage in the object */ -static void icmNamedColor_delete( - icmBase *pp -) { - icmNamedColor *p = (icmNamedColor *)pp; - icc *icp = p->icp; - - if (p->data != NULL) - icp->al->free(icp->al, p->data); - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmNamedColor( - icc *icp -) { - icmNamedColor *p; - if ((p = (icmNamedColor *) icp->al->calloc(icp->al,1,sizeof(icmNamedColor))) == NULL) - return NULL; - p->ttype = icSigNamedColor2Type; - p->refcount = 1; - p->get_size = icmNamedColor_get_size; - p->read = icmNamedColor_read; - p->write = icmNamedColor_write; - p->dump = icmNamedColor_dump; - p->allocate = icmNamedColor_allocate; - p->del = icmNamedColor_delete; - p->icp = icp; - - /* Default the the number of device coords appropriately for NamedColorType */ - p->nDeviceCoords = number_ColorSpaceSignature(icp->header->colorSpace); - - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ -/* textDescription */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmTextDescription_get_size( - icmBase *pp -) { - icmTextDescription *p = (icmTextDescription *)pp; - unsigned int len = 0; - if (p->size > UINT_MAX - (8 + 4 + 8)) { - p->icp->errc = 1; - return (unsigned int) -1; - } - len += 8; /* 8 bytes for tag and padding */ - len += 4 + p->size; /* Ascii string length + ascii string */ - len += 8; /* Unicode language code + length */ - if (p->ucSize > (UINT_MAX - len) / 2) { - p->icp->errc = 1; - return (unsigned int) -1; - } - len += 2 * p->ucSize; /* Unicode string */ - if (len > (UINT_MAX - (3 + 67))) { - p->icp->errc = 1; - return (unsigned int) -1; - } - len += 3 + 67; /* ScriptCode code, length string */ - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmTextDescription_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmTextDescription *p = (icmTextDescription *)pp; - icc *icp = p->icp; - int rv; - char *bp, *buf, *end; - -#ifdef ICM_STRICT - if (len < (8 + 4 + 8 + 3 /* + 67 */)) { -#else - if (len < (8 + 4 + 8 + 3)) { -#endif - sprintf(icp->err,"icmTextDescription_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmTextDescription_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - end = buf + len; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmTextDescription_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read from the buffer into the structure */ - if ((rv = p->core_read(p, &bp, end)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - - icp->al->free(icp->al, buf); - return 0; -} - -/* core read the object, return 0 on success, error code on fail */ -static int icmTextDescription_core_read( - icmTextDescription *p, - char **bpp, /* Pointer to buffer pointer, returns next after read */ - char *end /* Pointer to past end of read buffer */ -) { - icc *icp = p->icp; - int rv = 0; - char *bp = *bpp; - - if ((bp + 8) > end) { - sprintf(icp->err,"icmTextDescription_read: Data too short to type descriptor"); - *bpp = bp; - return icp->errc = 1; - } - - p->size = read_UInt32Number(bp); - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - *bpp = bp; - sprintf(icp->err,"icmTextDescription_read: Wrong tag type ('%s') for icmTextDescription", - tag2str((icTagTypeSignature)read_SInt32Number(bp))); - return icp->errc = 1; - } - bp = bp + 8; - - /* Read the Ascii string */ - if ((bp + 4) > end) { - *bpp = bp; - sprintf(icp->err,"icmTextDescription_read: Data too short to read Ascii header"); - return icp->errc = 1; - } - p->size = read_UInt32Number(bp); - bp += 4; - if (p->size > 0) { - if ((bp + p->size) > end) { - *bpp = bp; - sprintf(icp->err,"icmTextDescription_read: Data to short to read Ascii string"); - return icp->errc = 1; - } - if (check_null_string(bp,p->size)) { - *bpp = bp; - sprintf(icp->err,"icmTextDescription_read: ascii string is not terminated"); - return icp->errc = 1; - } - if ((rv = p->allocate((icmBase *)p)) != 0) { - return rv; - } - strcpy((void *)p->desc, (void *)bp); - bp += p->size; - } - - /* Read the Unicode string */ - if ((bp + 8) > end) { - *bpp = bp; - sprintf(icp->err,"icmTextDescription_read: Data too short to read Unicode string"); - return icp->errc = 1; - } - p->ucLangCode = read_UInt32Number(bp); - bp += 4; - p->ucSize = read_UInt32Number(bp); - bp += 4; - if (p->ucSize > 0) { - ORD16 *up; - if ((bp + 2 * p->ucSize) > end) { - *bpp = bp; - sprintf(icp->err,"icmTextDescription_read: Data too short to read Unicode string"); - return icp->errc = 1; - } - if (check_null_string16(bp,p->ucSize)) { - *bpp = bp; - sprintf(icp->err,"icmTextDescription_read: Unicode string is not terminated"); - return icp->errc = 1; - } - if ((rv = p->allocate((icmBase *)p)) != 0) { - return rv; - } - for(up = p->ucDesc; bp[0] != 0 || bp[1] != 0; up++, bp += 2) - *up = read_UInt16Number(bp); - *up = 0; /* Unicode null */ - bp += 2; - } - - /* Read the ScriptCode string */ - if ((bp + 3) > end) { - *bpp = bp; - sprintf(icp->err,"icmTextDescription_read: Data too short to read ScriptCode header"); - return icp->errc = 1; - } - p->scCode = read_UInt16Number(bp); - bp += 2; - p->scSize = read_UInt8Number(bp); - bp += 1; - if (p->scSize > 0) { - if (p->scSize > 67) { - *bpp = bp; - sprintf(icp->err,"icmTextDescription_read: ScriptCode string too long"); - return icp->errc = 1; - } - if ((bp + p->scSize) > end) { - *bpp = bp; - sprintf(icp->err,"icmTextDescription_read: Data too short to read ScriptCode string"); - return icp->errc = 1; - } - if (check_null_string(bp,p->scSize)) { - *bpp = bp; - sprintf(icp->err,"icmTextDescription_read: ScriptCode string is not terminated"); - return icp->errc = 1; - } - memcpy((void *)p->scDesc, (void *)bp, p->scSize); - } else { - memset((void *)p->scDesc, 0, 67); - } - bp += 67; - - *bpp = bp; - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmTextDescription_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmTextDescription *p = (icmTextDescription *)pp; - icc *icp = p->icp; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmTextDescription_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write to the buffer from the structure */ - if ((rv = p->core_write(p, &bp)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmTextDescription_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Core write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmTextDescription_core_write( - icmTextDescription *p, - char **bpp /* Pointer to buffer pointer, returns next after read */ -) { - icc *icp = p->icp; - char *bp = *bpp; - int rv = 0; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmTextDescription_write: write_SInt32Number() failed"); - *bpp = bp; - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - bp = bp + 8; - - /* Write the Ascii string */ - if ((rv = write_UInt32Number(p->size,bp)) != 0) { - sprintf(icp->err,"icmTextDescription_write: write_UInt32Number() failed"); - *bpp = bp; - return icp->errc = rv; - } - bp += 4; - if (p->size > 0) { - if (check_null_string(p->desc,p->size)) { - *bpp = bp; - sprintf(icp->err,"icmTextDescription_write: ascii string is not terminated"); - return icp->errc = 1; - } - strcpy((void *)bp, (void *)p->desc); - bp += p->size; - } - - /* Write the Unicode string */ - if ((rv = write_UInt32Number(p->ucLangCode, bp)) != 0) { - sprintf(icp->err,"icmTextDescription_write: write_UInt32Number() failed"); - *bpp = bp; - return icp->errc = rv; - } - bp += 4; - if ((rv = write_UInt32Number(p->ucSize, bp)) != 0) { - sprintf(icp->err,"icmTextDescription_write: write_UInt32Number() failed"); - *bpp = bp; - return icp->errc = rv; - } - bp += 4; - if (p->ucSize > 0) { - ORD16 *up; - if (check_null_string16((char *)p->ucDesc,p->ucSize)) { - *bpp = bp; - sprintf(icp->err,"icmTextDescription_write: Unicode string is not terminated"); - return icp->errc = 1; - } - for(up = p->ucDesc; *up != 0; up++, bp += 2) { - if ((rv = write_UInt16Number(((unsigned int)*up), bp)) != 0) { - sprintf(icp->err,"icmTextDescription_write: write_UInt16Number() failed"); - *bpp = bp; - return icp->errc = rv; - } - } - bp[0] = 0; /* null */ - bp[1] = 0; - bp += 2; - } - - /* Write the ScriptCode string */ - if ((rv = write_UInt16Number(p->scCode, bp)) != 0) { - sprintf(icp->err,"icmTextDescription_write: write_UInt16Number() failed"); - *bpp = bp; - return icp->errc = rv; - } - bp += 2; - if ((rv = write_UInt8Number(p->scSize, bp)) != 0) { - sprintf(icp->err,"icmTextDescription_write: write_UInt8Number() failed"); - *bpp = bp; - return icp->errc = rv; - } - bp += 1; - if (p->scSize > 0) { - if (p->scSize > 67) { - *bpp = bp; - sprintf(icp->err,"icmTextDescription_write: ScriptCode string too long"); - return icp->errc = 1; - } - if (check_null_string((char *)p->scDesc,p->scSize)) { - *bpp = bp; - sprintf(icp->err,"icmTextDescription_write: ScriptCode string is not terminated"); - return icp->errc = 1; - } - memcpy((void *)bp, (void *)p->scDesc, 67); - } else { - memset((void *)bp, 0, 67); - } - bp += 67; - - *bpp = bp; - return 0; -} - -/* Dump a text description of the object */ -static void icmTextDescription_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmTextDescription *p = (icmTextDescription *)pp; - unsigned long i, r, c; - - if (verb <= 0) - return; - - fprintf(op,"TextDescription:\n"); - - if (p->size > 0) { - unsigned long size = p->size > 0 ? p->size-1 : 0; - fprintf(op," ASCII data, length %lu chars:\n",p->size); - - i = 0; - for (r = 1;; r++) { /* count rows */ - if (i >= size) { - fprintf(op,"\n"); - break; - } - if (r > 1 && verb < 2) { - fprintf(op,"...\n"); - break; /* Print 1 row if not verbose */ - } - c = 1; - fprintf(op," 0x%04lx: ",i); - c += 10; - while (i < size && c < 75) { - if (isprint((unsigned char) p->desc[i])) { - fprintf(op,"%c",p->desc[i]); - c++; - } else { - fprintf(op,"\\%03o",p->desc[i]); - c += 4; - } - i++; - } - if (i < size) - fprintf(op,"\n"); - } - } else { - fprintf(op," No ASCII data\n"); - } - - /* Can't dump Unicode or ScriptCode as text with portable code */ - if (p->ucSize > 0) { - unsigned long size = p->ucSize; - fprintf(op," Unicode Data, Language code 0x%x, length %lu chars\n", - p->ucLangCode, p->ucSize); - i = 0; - for (r = 1;; r++) { /* count rows */ - if (i >= size) { - fprintf(op,"\n"); - break; - } - if (r > 1 && verb < 2) { - fprintf(op,"...\n"); - break; /* Print 1 row if not verbose */ - } - c = 1; - fprintf(op," 0x%04lx: ",i); - c += 10; - while (i < size && c < 75) { - fprintf(op,"%04x ",p->ucDesc[i]); - c += 5; - i++; - } - if (i < size) - fprintf(op,"\n"); - } - } else { - fprintf(op," No Unicode data\n"); - } - if (p->scSize > 0) { - unsigned long size = p->scSize; - fprintf(op," ScriptCode Data, Code 0x%x, length %lu chars\n", - p->scCode, p->scSize); - i = 0; - for (r = 1;; r++) { /* count rows */ - if (i >= size) { - fprintf(op,"\n"); - break; - } - if (r > 1 && verb < 2) { - fprintf(op,"...\n"); - break; /* Print 1 row if not verbose */ - } - c = 1; - fprintf(op," 0x%04lx: ",i); - c += 10; - while (i < size && c < 75) { - fprintf(op,"%02x ",p->scDesc[i]); - c += 3; - i++; - } - if (i < size) - fprintf(op,"\n"); - } - } else { - fprintf(op," No ScriptCode data\n"); - } -} - -/* Allocate variable sized data elements */ -static int icmTextDescription_allocate( - icmBase *pp -) { - icmTextDescription *p = (icmTextDescription *)pp; - icc *icp = p->icp; - - if (p->size != p->_size) { - if (p->desc != NULL) - icp->al->free(icp->al, p->desc); - if ((p->desc = (char *) icp->al->calloc(icp->al, p->size, sizeof(char))) == NULL) { - sprintf(icp->err,"icmTextDescription_alloc: calloc() of Ascii description failed"); - return icp->errc = 2; - } - p->_size = p->size; - } - if (p->ucSize != p->uc_size) { - if (p->ucDesc != NULL) - icp->al->free(icp->al, p->ucDesc); - if ((p->ucDesc = (ORD16 *) icp->al->calloc(icp->al, p->ucSize, sizeof(ORD16))) == NULL) { - sprintf(icp->err,"icmTextDescription_alloc: calloc() of Unicode description failed"); - return icp->errc = 2; - } - p->uc_size = p->ucSize; - } - return 0; -} - -/* Free all variable sized elements */ -static void icmTextDescription_unallocate( - icmTextDescription *p -) { - icc *icp = p->icp; - - if (p->desc != NULL) - icp->al->free(icp->al, p->desc); - if (p->ucDesc != NULL) - icp->al->free(icp->al, p->ucDesc); -} - -/* Free all storage in the object */ -static void icmTextDescription_delete( - icmBase *pp -) { - icmTextDescription *p = (icmTextDescription *)pp; - icc *icp = p->icp; - - icmTextDescription_unallocate(p); - icp->al->free(icp->al, p); -} - -/* Initialze a named object */ -static void icmTextDescription_init( - icmTextDescription *p, - icc *icp -) { - memset((void *)p, 0, sizeof(icmTextDescription)); /* Imitate calloc */ - - p->ttype = icSigTextDescriptionType; - p->refcount = 1; - p->get_size = icmTextDescription_get_size; - p->read = icmTextDescription_read; - p->write = icmTextDescription_write; - p->dump = icmTextDescription_dump; - p->allocate = icmTextDescription_allocate; - p->del = icmTextDescription_delete; - p->icp = icp; - - p->core_read = icmTextDescription_core_read; - p->core_write = icmTextDescription_core_write; -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmTextDescription( - icc *icp -) { - icmTextDescription *p; - if ((p = (icmTextDescription *) icp->al->calloc(icp->al,1,sizeof(icmTextDescription))) == NULL) - return NULL; - - icmTextDescription_init(p,icp); - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ - -/* Support for icmDescStruct */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmDescStruct_get_size( - icmDescStruct *p -) { - unsigned int len = 0; - len += 20; /* 20 bytes for header info */ - len += p->device.get_size((icmBase *)&p->device); - len += p->model.get_size((icmBase *)&p->model); - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmDescStruct_read( - icmDescStruct *p, - char **bpp, /* Pointer to buffer pointer, returns next after read */ - char *end /* Pointer to past end of read buffer */ -) { - icc *icp = p->icp; - char *bp = *bpp; - int rv = 0; - - if ((bp + 20) > end) { - sprintf(icp->err,"icmDescStruct_read: Data too short read header"); - *bpp = bp; - return icp->errc = 1; - } - - p->deviceMfg = read_SInt32Number(bp + 0); - p->deviceModel = read_UInt32Number(bp + 4); - read_UInt64Number(&p->attributes, bp + 8); - p->technology = read_UInt32Number(bp + 16); - *bpp = bp += 20; - - /* Read the device text description */ - if ((rv = p->device.core_read(&p->device, bpp, end)) != 0) { - return rv; - } - - /* Read the model text description */ - if ((rv = p->model.core_read(&p->model, bpp, end)) != 0) { - return rv; - } - - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmDescStruct_write( - icmDescStruct *p, - char **bpp /* Pointer to buffer pointer, returns next after read */ -) { - icc *icp = p->icp; - char *bp = *bpp; - int rv = 0; - - if ((rv = write_SInt32Number(p->deviceMfg, bp + 0)) != 0) { - sprintf(icp->err,"icmDescStruct_write: write_SInt32Number() failed"); - *bpp = bp; - return icp->errc = rv; - } - if ((rv = write_UInt32Number(p->deviceModel, bp + 4)) != 0) { - sprintf(icp->err,"icmDescStruct_write: write_UInt32Number() failed"); - *bpp = bp; - return icp->errc = rv; - } - if ((rv = write_UInt64Number(&p->attributes, bp + 8)) != 0) { - sprintf(icp->err,"icmDescStruct_write: write_UInt64Number() failed"); - *bpp = bp; - return icp->errc = rv; - } - if ((rv = write_UInt32Number(p->technology, bp + 16)) != 0) { - sprintf(icp->err,"icmDescStruct_write: write_UInt32Number() failed"); - *bpp = bp; - return icp->errc = rv; - } - *bpp = bp += 20; - - /* Write the device text description */ - if ((rv = p->device.core_write(&p->device, bpp)) != 0) { - return rv; - } - - /* Write the model text description */ - if ((rv = p->model.core_write(&p->model, bpp)) != 0) { - return rv; - } - - return 0; -} - -/* Dump a text description of the object */ -static void icmDescStruct_dump( - icmDescStruct *p, - FILE *op, /* Output to dump to */ - int verb, /* Verbosity level */ - int index /* Description index */ -) { - if (verb <= 0) - return; - - fprintf(op,"DescStruct %u:\n",index); - if (verb >= 1) { - fprintf(op," Dev. Mnfctr. = %s\n",tag2str(p->deviceMfg)); /* ~~~ */ - fprintf(op," Dev. Model = %s\n",tag2str(p->deviceModel)); /* ~~~ */ - fprintf(op," Dev. Attrbts = %s\n", string_DeviceAttributes(p->attributes.l)); - fprintf(op," Dev. Technology = %s\n", string_TechnologySignature(p->technology)); - p->device.dump((icmBase *)&p->device, op,verb); - p->model.dump((icmBase *)&p->model, op,verb); - fprintf(op,"\n"); - } -} - -/* Allocate variable sized data elements (ie. descriptions) */ -static int icmDescStruct_allocate( - icmDescStruct *p -) { - int rv; - - if ((rv = p->device.allocate((icmBase *)&p->device)) != 0) { - return rv; - } - if ((rv = p->model.allocate((icmBase *)&p->model)) != 0) { - return rv; - } - return 0; -} - -/* Free all storage in the object */ -static void icmDescStruct_delete( - icmDescStruct *p -) { - icmTextDescription_unallocate(&p->device); - icmTextDescription_unallocate(&p->model); -} - -/* Init a DescStruct object */ -static void icmDescStruct_init( - icmDescStruct *p, - icc *icp -) { - - p->allocate = icmDescStruct_allocate; - p->icp = icp; - - icmTextDescription_init(&p->device, icp); - icmTextDescription_init(&p->model, icp); -} - -/* - - - - - - - - - - - - - - - */ -/* icmProfileSequenceDesc object */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmProfileSequenceDesc_get_size( - icmBase *pp -) { - icmProfileSequenceDesc *p = (icmProfileSequenceDesc *)pp; - unsigned int len = 0; - unsigned int i; - len += 12; /* 8 bytes for tag, padding and count */ - for (i = 0; i < p->count; i++) { /* All the description structures */ - len += icmDescStruct_get_size(&p->data[i]); - } - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmProfileSequenceDesc_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmProfileSequenceDesc *p = (icmProfileSequenceDesc *)pp; - icc *icp = p->icp; - unsigned long i; - char *bp, *buf, *end; - int rv = 0; - - if (len < 12) { - sprintf(icp->err,"icmProfileSequenceDesc_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmProfileSequenceDesc_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - end = buf + len; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmProfileSequenceDesc_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - sprintf(icp->err,"icmProfileSequenceDesc_read: Wrong tag type for icmProfileSequenceDesc"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - bp += 8; /* Skip padding */ - - p->count = read_UInt32Number(bp); /* Number of sequence descriptions */ - if (p->count > 1000) { - /* This limit is arbitrary and simply intended to limit - * resource use by corrupt profiles. The spec allows - * 2^32 sequence descriptions, although fewer than that - * can be literally encapsulated. A sequence description - * table takes 20 bytes for the header plus at least - * 20 bytes per entry. */ - sprintf(icp->err,"icmProfileSequenceDesc_read: too many sequence descriptions"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - bp += 4; - - /* Read all the sequence descriptions */ - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - for (i = 0; i < p->count; i++) { - if ((rv = icmDescStruct_read(&p->data[i], &bp, end)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - } - - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmProfileSequenceDesc_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmProfileSequenceDesc *p = (icmProfileSequenceDesc *)pp; - icc *icp = p->icp; - unsigned long i; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmProfileSequenceDesc_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmProfileSequenceDesc_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - - if ((rv = write_UInt32Number(p->count,bp+8)) != 0) { - sprintf(icp->err,"icmProfileSequenceDesc_write: write_UInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - bp = bp + 12; - - /* Write all the description structures */ - for (i = 0; i < p->count; i++) { - if ((rv = icmDescStruct_write(&p->data[i], &bp)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmProfileSequenceDesc_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmProfileSequenceDesc_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmProfileSequenceDesc *p = (icmProfileSequenceDesc *)pp; - if (verb <= 0) - return; - - fprintf(op,"ProfileSequenceDesc:\n"); - fprintf(op," No. elements = %u\n",p->count); - if (verb >= 2) { - unsigned long i; - for (i = 0; i < p->count; i++) - icmDescStruct_dump(&p->data[i], op, verb-1, i); - } -} - -/* Allocate variable sized data elements (ie. count of profile descriptions) */ -static int icmProfileSequenceDesc_allocate( - icmBase *pp -) { - icmProfileSequenceDesc *p = (icmProfileSequenceDesc *)pp; - icc *icp = p->icp; - unsigned int i; - - if (p->count != p->_count) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); - if ((p->data = (icmDescStruct *) icp->al->calloc(icp->al, p->count, sizeof(icmDescStruct))) == NULL) { - sprintf(icp->err,"icmProfileSequenceDesc_allocate Allocation of DescStruct array failed"); - return icp->errc = 2; - } - /* Now init the DescStructs */ - for (i = 0; i < p->count; i++) { - icmDescStruct_init(&p->data[i], icp); - } - p->_count = p->count; - } - return 0; -} - -/* Free all storage in the object */ -static void icmProfileSequenceDesc_delete( - icmBase *pp -) { - icmProfileSequenceDesc *p = (icmProfileSequenceDesc *)pp; - icc *icp = p->icp; - unsigned int i; - - for (i = 0; i < p->count; i++) { - icmDescStruct_delete(&p->data[i]); /* Free allocated contents */ - } - if (p->data != NULL) - icp->al->free(icp->al, p->data); - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmProfileSequenceDesc( - icc *icp -) { - icmProfileSequenceDesc *p; - if ((p = (icmProfileSequenceDesc *) icp->al->calloc(icp->al,1,sizeof(icmProfileSequenceDesc))) == NULL) - return NULL; - p->ttype = icSigProfileSequenceDescType; - p->refcount = 1; - p->get_size = icmProfileSequenceDesc_get_size; - p->read = icmProfileSequenceDesc_read; - p->write = icmProfileSequenceDesc_write; - p->dump = icmProfileSequenceDesc_dump; - p->allocate = icmProfileSequenceDesc_allocate; - p->del = icmProfileSequenceDesc_delete; - p->icp = icp; - - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ -/* Signature */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmSignature_get_size( - icmBase *pp -) { - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ - len += 4; /* 4 for signature */ - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmSignature_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmSignature *p = (icmSignature *)pp; - icc *icp = p->icp; - char *bp, *buf; - - if (len < 12) { - sprintf(icp->err,"icmSignature_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmSignature_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmSignature_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - sprintf(icp->err,"icmSignaturSignatureng tag type for icmSignature"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read the encoded measurement geometry */ - p->sig = (icTechnologySignature)read_SInt32Number(bp + 8); - - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmSignature_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmSignature *p = (icmSignature *)pp; - icc *icp = p->icp; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmSignature_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmSignature_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - - /* Write the signature */ - if ((rv = write_SInt32Number((int)p->sig, bp + 8)) != 0) { - sprintf(icp->err,"icmSignaturea_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmSignature_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmSignature_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmSignature *p = (icmSignature *)pp; - if (verb <= 0) - return; - - fprintf(op,"Signature\n"); - fprintf(op," Technology = %s\n", string_TechnologySignature(p->sig)); -} - -/* Allocate variable sized data elements */ -static int icmSignature_allocate( - icmBase *pp -) { - /* Nothing to do */ - return 0; -} - -/* Free all storage in the object */ -static void icmSignature_delete( - icmBase *pp -) { - icmSignature *p = (icmSignature *)pp; - icc *icp = p->icp; - - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmSignature( - icc *icp -) { - icmSignature *p; - if ((p = (icmSignature *) icp->al->calloc(icp->al,1,sizeof(icmSignature))) == NULL) - return NULL; - p->ttype = icSigSignatureType; - p->refcount = 1; - p->get_size = icmSignature_get_size; - p->read = icmSignature_read; - p->write = icmSignature_write; - p->dump = icmSignature_dump; - p->allocate = icmSignature_allocate; - p->del = icmSignature_delete; - p->icp = icp; - - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ - -/* Data conversion support functions */ -static int read_ScreeningData(icmScreeningData *p, char *d) { - p->frequency = read_S15Fixed16Number(d + 0); - p->angle = read_S15Fixed16Number(d + 4); - p->spotShape = (icSpotShape)read_SInt32Number(d + 8); - return 0; -} - -static int write_ScreeningData(icmScreeningData *p, char *d) { - int rv; - if ((rv = write_S15Fixed16Number(p->frequency, d + 0)) != 0) - return rv; - if ((rv = write_S15Fixed16Number(p->angle, d + 4)) != 0) - return rv; - if ((rv = write_SInt32Number((int)p->spotShape, d + 8)) != 0) - return rv; - return 0; -} - -/* icmScreening object */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmScreening_get_size( - icmBase *pp -) { - icmScreening *p = (icmScreening *)pp; - unsigned int len = 0; - len += 16; /* 16 bytes for tag, padding, flag & channeles */ - if (p->channels > (UINT_MAX - len) / 12) { - p->icp->errc = 1; - return (unsigned int) -1; - } - len += p->channels * 12; /* 12 bytes for each channel */ - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmScreening_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmScreening *p = (icmScreening *)pp; - icc *icp = p->icp; - int rv = 0; - unsigned long i; - char *bp, *buf, *end; - - if (len < 12) { - sprintf(icp->err,"icmScreening_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmScreening_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - end = buf + len; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmScreening_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - sprintf(icp->err,"icmScreening_read: Wrong tag type for icmScreening"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - p->screeningFlag = read_UInt32Number(bp+8); /* Flags */ - p->channels = read_UInt32Number(bp+12); /* Number of channels */ - bp = bp + 16; - - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - - /* Read all the data from the buffer */ - for (i = 0; i < p->channels; i++, bp += 12) { - if ((bp + 12) > end) { - sprintf(icp->err,"icmScreening_read: Data too short to read Screening Data"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - read_ScreeningData(&p->data[i], bp); - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmScreening_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmScreening *p = (icmScreening *)pp; - icc *icp = p->icp; - unsigned long i; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmScreening_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmScreening_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - - if ((rv = write_UInt32Number(p->screeningFlag,bp+8)) != 0) { - sprintf(icp->err,"icmScreening_write: write_UInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_UInt32Number(p->channels,bp+12)) != 0) { - sprintf(icp->err,"icmScreening_write: write_UInt32NumberXYZumber() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - bp = bp + 16; - - /* Write all the data to the buffer */ - for (i = 0; i < p->channels; i++, bp += 12) { - if ((rv = write_ScreeningData(&p->data[i],bp)) != 0) { - sprintf(icp->err,"icmScreening_write: write_ScreeningData() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmScreening_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmScreening_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmScreening *p = (icmScreening *)pp; - if (verb <= 0) - return; - - fprintf(op,"Screening:\n"); - fprintf(op," Flags = %s\n", string_ScreenEncodings(p->screeningFlag)); - fprintf(op," No. channels = %u\n",p->channels); - if (verb >= 2) { - unsigned long i; - for (i = 0; i < p->channels; i++) { - fprintf(op," %lu:\n",i); - fprintf(op," Frequency: %f\n",p->data[i].frequency); - fprintf(op," Angle: %f\n",p->data[i].angle); - fprintf(op," Spot shape: %s\n", string_SpotShape(p->data[i].spotShape)); - } - } -} - -/* Allocate variable sized data elements */ -static int icmScreening_allocate( - icmBase *pp -) { - icmScreening *p = (icmScreening *)pp; - icc *icp = p->icp; - - if (p->channels != p->_channels) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); - if ((p->data = (icmScreeningData *) icp->al->calloc(icp->al, p->channels, sizeof(icmScreeningData))) == NULL) { - sprintf(icp->err,"icmScreening_alloc: calloc() of icmScreening data failed"); - return icp->errc = 2; - } - p->_channels = p->channels; - } - return 0; -} - -/* Free all storage in the object */ -static void icmScreening_delete( - icmBase *pp -) { - icmScreening *p = (icmScreening *)pp; - icc *icp = p->icp; - - if (p->data != NULL) - icp->al->free(icp->al, p->data); - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmScreening( - icc *icp -) { - icmScreening *p; - if ((p = (icmScreening *) icp->al->calloc(icp->al,1,sizeof(icmScreening))) == NULL) - return NULL; - p->ttype = icSigScreeningType; - p->refcount = 1; - p->get_size = icmScreening_get_size; - p->read = icmScreening_read; - p->write = icmScreening_write; - p->dump = icmScreening_dump; - p->allocate = icmScreening_allocate; - p->del = icmScreening_delete; - p->icp = icp; - - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ -/* icmUcrBg object */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmUcrBg_get_size( - icmBase *pp -) { - icmUcrBg *p = (icmUcrBg *)pp; - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ - if (p->UCRcount > (UINT_MAX - len - 4) / 2) - goto overflow; - - len += 4 + p->UCRcount * 2; /* Undercolor Removal */ - if (p->BGcount > (UINT_MAX - len - 4 - p->size) / 2) - goto overflow; - - len += 4 + p->BGcount * 2; /* Black Generation */ - len += p->size; /* Description string */ - return len; - - overflow: - p->icp->errc = 1; - return (unsigned int) -1; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmUcrBg_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmUcrBg *p = (icmUcrBg *)pp; - icc *icp = p->icp; - unsigned long i; - int rv = 0; - char *bp, *buf, *end; - - if (len < 16) { - sprintf(icp->err,"icmUcrBg_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmUcrBg_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - end = buf + len; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmUcrBg_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - sprintf(icp->err,"icmUcrBg_read: Wrong tag type for icmUcrBg"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - p->UCRcount = read_UInt32Number(bp+8); /* First curve count */ - bp = bp + 12; - - if (p->UCRcount > 0) { - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - for (i = 0; i < p->UCRcount; i++, bp += 2) { - if ((bp + 2) > end) { - sprintf(icp->err,"icmUcrBg_read: Data too short to read UCR Data"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - if (p->UCRcount == 1) /* % */ - p->UCRcurve[i] = (double)read_UInt16Number(bp); - else /* 0.0 - 1.0 */ - p->UCRcurve[i] = read_DCS16Number(bp); - } - } else { - p->UCRcurve = NULL; - } - - if ((bp + 4) > end) { - sprintf(icp->err,"icmData_read: Data too short to read Black Gen count"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - p->BGcount = read_UInt32Number(bp); /* First curve count */ - bp += 4; - - if (p->BGcount > 0) { - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - for (i = 0; i < p->BGcount; i++, bp += 2) { - if ((bp + 2) > end) { - sprintf(icp->err,"icmUcrBg_read: Data too short to read BG Data"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - if (p->BGcount == 1) /* % */ - p->BGcurve[i] = (double)read_UInt16Number(bp); - else /* 0.0 - 1.0 */ - p->BGcurve[i] = read_DCS16Number(bp); - } - } else { - p->BGcurve = NULL; - } - - p->size = end - bp; /* Nominal string length */ - if (p->size > 0) { - if (check_null_string(bp, p->size) != 0) { - sprintf(icp->err,"icmUcrBg_read: string is not null terminated"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - p->size = strlen(bp) + 1; - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - memcpy((void *)p->string, (void *)bp, p->size); - bp += p->size; - } else { - p->string = NULL; - } - - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmUcrBg_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmUcrBg *p = (icmUcrBg *)pp; - icc *icp = p->icp; - unsigned long i; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmUcrBg_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmUcrBg_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - bp = bp + 8; - - /* Write UCR curve */ - if ((rv = write_UInt32Number(p->UCRcount,bp)) != 0) { - sprintf(icp->err,"icmUcrBg_write: write_UInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - bp += 4; - - for (i = 0; i < p->UCRcount; i++, bp += 2) { - if (p->UCRcount == 1) { /* % */ - if ((rv = write_UInt16Number((unsigned int)(p->UCRcurve[i]+0.5),bp)) != 0) { - sprintf(icp->err,"icmUcrBg_write: write_UInt16umber() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } else { - if ((rv = write_DCS16Number(p->UCRcurve[i],bp)) != 0) { - sprintf(icp->err,"icmUcrBg_write: write_DCS16umber(%f) failed",p->UCRcurve[i]); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } - } - - /* Write BG curve */ - if ((rv = write_UInt32Number(p->BGcount,bp)) != 0) { - sprintf(icp->err,"icmUcrBg_write: write_UInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - bp += 4; - - for (i = 0; i < p->BGcount; i++, bp += 2) { - if (p->BGcount == 1) { /* % */ - if ((rv = write_UInt16Number((unsigned int)(p->BGcurve[i]+0.5),bp)) != 0) { - sprintf(icp->err,"icmUcrBg_write: write_UInt16umber() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } else { - if ((rv = write_DCS16Number(p->BGcurve[i],bp)) != 0) { - sprintf(icp->err,"icmUcrBg_write: write_DCS16umber(%f) failed",p->BGcurve[i]); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - } - } - - if (p->string != NULL) { - if ((rv = check_null_string(p->string,p->size)) != 0) { - sprintf(icp->err,"icmUcrBg_write: text is not null terminated"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - memcpy((void *)bp, (void *)p->string, p->size); - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmUcrBg_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmUcrBg_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmUcrBg *p = (icmUcrBg *)pp; - if (verb <= 0) - return; - - fprintf(op,"Undercolor Removal Curve & Black Generation:\n"); - - if (p->UCRcount == 0) { - fprintf(op," UCR: Not specified\n"); - } else if (p->UCRcount == 1) { - fprintf(op," UCR: %f%%\n",p->UCRcurve[0]); - } else { - fprintf(op," UCR curve no. elements = %u\n",p->UCRcount); - if (verb >= 2) { - unsigned long i; - for (i = 0; i < p->UCRcount; i++) - fprintf(op," %3lu: %f\n",i,p->UCRcurve[i]); - } - } - if (p->BGcount == 0) { - fprintf(op," BG: Not specified\n"); - } else if (p->BGcount == 1) { - fprintf(op," BG: %f%%\n",p->BGcurve[0]); - } else { - fprintf(op," BG curve no. elements = %u\n",p->BGcount); - if (verb >= 2) { - unsigned long i; - for (i = 0; i < p->BGcount; i++) - fprintf(op," %3lu: %f\n",i,p->BGcurve[i]); - } - } - - { - unsigned long i, r, c, size; - fprintf(op," Description:\n"); - fprintf(op," No. chars = %lu\n",p->size); - - size = p->size > 0 ? p->size-1 : 0; - i = 0; - for (r = 1;; r++) { /* count rows */ - if (i >= size) { - fprintf(op,"\n"); - break; - } - if (r > 1 && verb < 2) { - fprintf(op,"...\n"); - break; /* Print 1 row if not verbose */ - } - c = 1; - fprintf(op," 0x%04lx: ",i); - c += 10; - while (i < size && c < 73) { - if (isprint((unsigned char) p->string[i])) { - fprintf(op,"%c",p->string[i]); - c++; - } else { - fprintf(op,"\\%03o",p->string[i]); - c += 4; - } - i++; - } - if (i < size) - fprintf(op,"\n"); - } - } -} - -/* Allocate variable sized data elements */ -static int icmUcrBg_allocate( - icmBase *pp -) { - icmUcrBg *p = (icmUcrBg *)pp; - icc *icp = p->icp; - - if (p->UCRcount != p->UCR_count) { - if (p->UCRcurve != NULL) - icp->al->free(icp->al, p->UCRcurve); - if ((p->UCRcurve = (double *) icp->al->calloc(icp->al, p->UCRcount, sizeof(double))) == NULL) { - sprintf(icp->err,"icmUcrBg_allocate: calloc() of UCR curve data failed"); - return icp->errc = 2; - } - p->UCR_count = p->UCRcount; - } - if (p->BGcount != p->BG_count) { - if (p->BGcurve != NULL) - icp->al->free(icp->al, p->BGcurve); - if ((p->BGcurve = (double *) icp->al->calloc(icp->al, p->BGcount, sizeof(double))) == NULL) { - sprintf(icp->err,"icmUcrBg_allocate: calloc() of BG curve data failed"); - return icp->errc = 2; - } - p->BG_count = p->BGcount; - } - if (p->size != p->_size) { - if (p->string != NULL) - icp->al->free(icp->al, p->string); - if ((p->string = (char *) icp->al->calloc(icp->al, p->size, sizeof(char))) == NULL) { - sprintf(icp->err,"icmUcrBg_allocate: calloc() of string data failed"); - return icp->errc = 2; - } - p->_size = p->size; - } - return 0; -} - -/* Free all storage in the object */ -static void icmUcrBg_delete( - icmBase *pp -) { - icmUcrBg *p = (icmUcrBg *)pp; - icc *icp = p->icp; - - if (p->UCRcurve != NULL) - icp->al->free(icp->al, p->UCRcurve); - if (p->BGcurve != NULL) - icp->al->free(icp->al, p->BGcurve); - if (p->string != NULL) - icp->al->free(icp->al, p->string); - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmUcrBg( - icc *icp -) { - icmUcrBg *p; - if ((p = (icmUcrBg *) icp->al->calloc(icp->al,1,sizeof(icmUcrBg))) == NULL) - return NULL; - p->ttype = icSigUcrBgType; - p->refcount = 1; - p->get_size = icmUcrBg_get_size; - p->read = icmUcrBg_read; - p->write = icmUcrBg_write; - p->dump = icmUcrBg_dump; - p->allocate = icmUcrBg_allocate; - p->del = icmUcrBg_delete; - p->icp = icp; - - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ -/* VideoCardGamma (ColorSync 2.5 specific - c/o Neil Okamoto) */ - -static unsigned int icmVideoCardGamma_get_size( - icmBase *pp -) { - icmVideoCardGamma *p = (icmVideoCardGamma *)pp; - unsigned int len = 0; - - len += 8; /* 8 bytes for tag and padding */ - len += 4; /* 4 for gamma type */ - - /* compute size of remainder */ - if (p->tagType == icmVideoCardGammaTableType) { - len += 2; /* 2 bytes for channels */ - len += 2; /* 2 for entry count */ - len += 2; /* 2 for entry size */ - if (p->u.table.entryCount > 0 && - p->u.table.entrySize > 0 && - p->u.table.channels > - (UINT_MAX - len) / - p->u.table.entryCount / - p->u.table.entrySize) { - p->icp->errc = 1; - return (unsigned int) -1; - } - len += ( p->u.table.channels * /* compute table size */ - p->u.table.entryCount * - p->u.table.entrySize ); - } - else if (p->tagType == icmVideoCardGammaFormulaType) { - len += 12; /* 4 bytes each for red gamma, min, & max */ - len += 12; /* 4 bytes each for green gamma, min & max */ - len += 12; /* 4 bytes each for blue gamma, min & max */ - } - return len; -} -/* read the object, return 0 on success, error code on fail */ -static int icmVideoCardGamma_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmVideoCardGamma *p = (icmVideoCardGamma *)pp; - icc *icp = p->icp; - int rv; - char *bp, *buf; - unsigned char *pchar; - unsigned short *pshort; - unsigned long c; - - if (len < 18) { - sprintf(icp->err,"icmVideoCardGamma_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmVideoCardGamma_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmVideoCardGamma_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - sprintf(icp->err,"icmVideoCardGamma_read: Wrong tag type for icmVideoCardGamma"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read gamma format (eg. table or formula) from the buffer */ - p->tagType = read_UInt32Number(bp+8); - - /* Read remaining gamma data based on format */ - switch ((int)p->tagType) { - case icmVideoCardGammaTableType: - p->u.table.channels = read_UInt16Number(bp+12); - p->u.table.entryCount = read_UInt16Number(bp+14); - p->u.table.entrySize = read_UInt16Number(bp+16); - if (p->u.table.entrySize > 65530 || p->u.table.entrySize == 0) { - sprintf(icp->err,"icmVideoCardGamma_read: Too many entries (or none)"); - return icp->errc = 1; - } - if (p->u.table.entryCount > 0 && p->u.table.entrySize > 0 && - p->u.table.channels > - UINT_MAX / p->u.table.entryCount / p->u.table.entrySize) { - sprintf(icp->err,"icmVideoCardGamma_read: Overflow reading tag"); - return icp->errc = 1; - } - if (len-18 < p->u.table.channels*p->u.table.entryCount*p->u.table.entrySize) { - sprintf(icp->err,"icmVideoCardGamma_read: Tag too small to be legal"); - return icp->errc = 1; - } - if ((rv = pp->allocate(pp)) != 0) { /* make space for table */ - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - pchar = (unsigned char*)p->u.table.data; - pshort = (unsigned short*)p->u.table.data; - for (c=0, bp=bp+18; cu.table.channels*p->u.table.entryCount; c++) { - switch (p->u.table.entrySize) { - case 1: - *pchar++ = read_UInt8Number(bp); - bp++; - break; - case 2: - *pshort++ = read_UInt16Number(bp); - bp+=2; - break; - default: - sprintf(icp->err,"icmVideoCardGamma_read: unsupported table entry size"); - pp->del(pp); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - } - break; - case icmVideoCardGammaFormulaType: - if (len < 48) { - sprintf(icp->err,"icmVideoCardGamma_read: Tag too small to be legal"); - return icp->errc = 1; - } - p->u.formula.redGamma = read_S15Fixed16Number(bp+12); - p->u.formula.redMin = read_S15Fixed16Number(bp+16); - p->u.formula.redMax = read_S15Fixed16Number(bp+20); - p->u.formula.greenGamma = read_S15Fixed16Number(bp+24); - p->u.formula.greenMin = read_S15Fixed16Number(bp+28); - p->u.formula.greenMax = read_S15Fixed16Number(bp+32); - p->u.formula.blueGamma = read_S15Fixed16Number(bp+36); - p->u.formula.blueMin = read_S15Fixed16Number(bp+40); - p->u.formula.blueMax = read_S15Fixed16Number(bp+44); - break; - default: - sprintf(icp->err,"icmVideoCardGammaTable_read: Unknown gamma format for icmVideoCardGamma"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmVideoCardGamma_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmVideoCardGamma *p = (icmVideoCardGamma *)pp; - icc *icp = p->icp; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0, c; - unsigned char *pchar; - unsigned short *pshort; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmViewingConditions_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmVideoCardGamma_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - - /* Write gamma format (eg. table of formula) */ - if ((rv = write_UInt32Number(p->tagType,bp+8)) != 0) { - sprintf(icp->err,"icmVideoCardGamma_write: write_UInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - /* Write remaining gamma data based on format */ - switch ((int)p->tagType) { - case icmVideoCardGammaTableType: - if ((rv = write_UInt16Number(p->u.table.channels,bp+12)) != 0) { - sprintf(icp->err,"icmVideoCardGamma_write: write_UInt16Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_UInt16Number(p->u.table.entryCount,bp+14)) != 0) { - sprintf(icp->err,"icmVideoCardGamma_write: write_UInt16Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_UInt16Number(p->u.table.entrySize,bp+16)) != 0) { - sprintf(icp->err,"icmVideoCardGamma_write: write_UInt16Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - pchar = (unsigned char*)p->u.table.data; - pshort = (unsigned short*)p->u.table.data; - for (c=0, bp=bp+18; cu.table.channels*p->u.table.entryCount; c++) { - switch (p->u.table.entrySize) { - case 1: - write_UInt8Number(*pchar++,bp); - bp++; - break; - case 2: - write_UInt16Number(*pshort++,bp); - bp+=2; - break; - default: - sprintf(icp->err,"icmVideoCardGamma_write: unsupported table entry size"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - } - break; - case icmVideoCardGammaFormulaType: - if ((rv = write_S15Fixed16Number(p->u.formula.redGamma,bp+12)) != 0) { - sprintf(icp->err,"icmVideoCardGamma_write: write_S15Fixed16Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_S15Fixed16Number(p->u.formula.redMin,bp+16)) != 0) { - sprintf(icp->err,"icmVideoCardGamma_write: write_S15Fixed16Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_S15Fixed16Number(p->u.formula.redMax,bp+20)) != 0) { - sprintf(icp->err,"icmVideoCardGamma_write: write_S15Fixed16Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_S15Fixed16Number(p->u.formula.greenGamma,bp+24)) != 0) { - sprintf(icp->err,"icmVideoCardGamma_write: write_S15Fixed16Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_S15Fixed16Number(p->u.formula.greenMin,bp+28)) != 0) { - sprintf(icp->err,"icmVideoCardGamma_write: write_S15Fixed16Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_S15Fixed16Number(p->u.formula.greenMax,bp+32)) != 0) { - sprintf(icp->err,"icmVideoCardGamma_write: write_S15Fixed16Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_S15Fixed16Number(p->u.formula.blueGamma,bp+36)) != 0) { - sprintf(icp->err,"icmVideoCardGamma_write: write_S15Fixed16Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_S15Fixed16Number(p->u.formula.blueMin,bp+40)) != 0) { - sprintf(icp->err,"icmVideoCardGamma_write: write_S15Fixed16Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_S15Fixed16Number(p->u.formula.blueMax,bp+44)) != 0) { - sprintf(icp->err,"icmVideoCardGamma_write: write_S15Fixed16Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - break; - default: - sprintf(icp->err,"icmVideoCardGammaTable_write: Unknown gamma format for icmVideoCardGamma"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmViewingConditions_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmVideoCardGamma_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmVideoCardGamma *p = (icmVideoCardGamma *)pp; - int c,i; - - if (verb <= 0) - return; - - switch ((int)p->tagType) { - case icmVideoCardGammaTableType: - fprintf(op,"VideoCardGammaTable:\n"); - fprintf(op," channels = %d\n", p->u.table.channels); - fprintf(op," entries = %d\n", p->u.table.entryCount); - fprintf(op," entrysize = %d\n", p->u.table.entrySize); - if (verb >= 2) { - /* dump array contents also */ - for (c=0; cu.table.channels; c++) { - fprintf(op," channel #%d\n",c); - for (i=0; iu.table.entryCount; i++) { - if (p->u.table.entrySize == 1) { - fprintf(op," %d: %d\n",i,((unsigned char*)p->u.table.data)[c*p->u.table.entryCount+i]); - } - else if (p->u.table.entrySize == 2) { - fprintf(op," %d: %d\n",i,((unsigned short*)p->u.table.data)[c*p->u.table.entryCount+i]); - } - } - } - } - break; - case icmVideoCardGammaFormulaType: - fprintf(op,"VideoCardGammaFormula:\n"); - fprintf(op," red gamma = %f\n", p->u.formula.redGamma); - fprintf(op," red min = %f\n", p->u.formula.redMin); - fprintf(op," red max = %f\n", p->u.formula.redMax); - fprintf(op," green gamma = %f\n", p->u.formula.greenGamma); - fprintf(op," green min = %f\n", p->u.formula.greenMin); - fprintf(op," green max = %f\n", p->u.formula.greenMax); - fprintf(op," blue gamma = %f\n", p->u.formula.blueGamma); - fprintf(op," blue min = %f\n", p->u.formula.blueMin); - fprintf(op," blue max = %f\n", p->u.formula.blueMax); - break; - default: - fprintf(op," Unknown tag format\n"); - } -} - -/* Allocate variable sized data elements */ -static int icmVideoCardGamma_allocate( - icmBase *pp -) { - icmVideoCardGamma *p = (icmVideoCardGamma *)pp; - icc *icp = p->icp; - unsigned int size; - - /* note: allocation is only relevant for table type - * and in that case the channels, entryCount, and entrySize - * fields must all be set prior to getting here - */ - - if (p->tagType == icmVideoCardGammaTableType) { - if (p->u.table.data != NULL) - icp->al->free(icp->al, p->u.table.data); - if (p->u.table.entryCount > 0 && - p->u.table.channels > UINT_MAX / p->u.table.entryCount) { - sprintf(icp->err,"icmVideoCardGamma_alloc: table too large"); - return icp->errc = 1; - } - size = (p->u.table.channels * - p->u.table.entryCount); - switch (p->u.table.entrySize) { - case 1: - size *= sizeof(unsigned char); - break; - case 2: - if (size > UINT_MAX / sizeof(unsigned short)) { - sprintf(icp->err,"icmVideoCardGamma_alloc: table too large"); - return icp->errc = 1; - } - size *= sizeof(unsigned short); - break; - default: - sprintf(icp->err,"icmVideoCardGamma_alloc: unsupported table entry size"); - return icp->errc = 1; - } - if ((p->u.table.data = (void*) icp->al->malloc(icp->al, size)) == NULL) { - sprintf(icp->err,"icmVideoCardGamma_alloc: malloc() of table data failed"); - return icp->errc = 2; - } - } - - return 0; -} - -/* Free all storage in the object */ -static void icmVideoCardGamma_delete( - icmBase *pp -) { - icmVideoCardGamma *p = (icmVideoCardGamma *)pp; - icc *icp = p->icp; - - if (p->tagType == icmVideoCardGammaTableType && p->u.table.data != NULL) - icp->al->free(icp->al, p->u.table.data); - - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmVideoCardGamma( - icc *icp -) { - icmVideoCardGamma *p; - if ((p = (icmVideoCardGamma *) icp->al->calloc(icp->al,1,sizeof(icmVideoCardGamma))) == NULL) - return NULL; - p->ttype = icSigVideoCardGammaType; - p->refcount = 1; - p->get_size = icmVideoCardGamma_get_size; - p->read = icmVideoCardGamma_read; - p->write = icmVideoCardGamma_write; - p->dump = icmVideoCardGamma_dump; - p->allocate = icmVideoCardGamma_allocate; - p->del = icmVideoCardGamma_delete; - p->icp = icp; - - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ -/* ViewingConditions */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmViewingConditions_get_size( - icmBase *pp -) { - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ - len += 12; /* 12 for XYZ of illuminant */ - len += 12; /* 12 for XYZ of surround */ - len += 4; /* 4 for illuminant type */ - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmViewingConditions_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmViewingConditions *p = (icmViewingConditions *)pp; - icc *icp = p->icp; - int rv; - char *bp, *buf; - - if (len < 36) { - sprintf(icp->err,"icmViewingConditions_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmViewingConditions_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmViewingConditions_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - sprintf(icp->err,"icmViewingConditions_read: Wrong tag type for icmViewingConditions"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read the XYZ values for the illuminant */ - if ((rv = read_XYZNumber(&p->illuminant, bp+8)) != 0) { - sprintf(icp->err,"icmViewingConditions: read_XYZNumber error"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - /* Read the XYZ values for the surround */ - if ((rv = read_XYZNumber(&p->surround, bp+20)) != 0) { - sprintf(icp->err,"icmViewingConditions: read_XYZNumber error"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - /* Read the encoded standard illuminant */ - p->stdIlluminant = (icIlluminant)read_SInt32Number(bp + 32); - - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmViewingConditions_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmViewingConditions *p = (icmViewingConditions *)pp; - icc *icp = p->icp; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmViewingConditions_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmViewingConditions_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - - /* Write the XYZ values for the illuminant */ - if ((rv = write_XYZNumber(&p->illuminant, bp+8)) != 0) { - sprintf(icp->err,"icmViewingConditions: write_XYZNumber error"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - /* Write the XYZ values for the surround */ - if ((rv = write_XYZNumber(&p->surround, bp+20)) != 0) { - sprintf(icp->err,"icmViewingConditions: write_XYZNumber error"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - /* Write the encoded standard illuminant */ - if ((rv = write_SInt32Number((int)p->stdIlluminant, bp + 32)) != 0) { - sprintf(icp->err,"icmViewingConditionsa_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmViewingConditions_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmViewingConditions_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmViewingConditions *p = (icmViewingConditions *)pp; - if (verb <= 0) - return; - - fprintf(op,"Viewing Conditions:\n"); - fprintf(op," XYZ value of illuminant in cd/m^2 = %s\n", string_XYZNumber(&p->illuminant)); - fprintf(op," XYZ value of surround in cd/m^2 = %s\n", string_XYZNumber(&p->surround)); - fprintf(op," Illuminant type = %s\n", string_Illuminant(p->stdIlluminant)); -} - -/* Allocate variable sized data elements */ -static int icmViewingConditions_allocate( - icmBase *pp -) { - /* Nothing to do */ - return 0; -} - -/* Free all storage in the object */ -static void icmViewingConditions_delete( - icmBase *pp -) { - icmViewingConditions *p = (icmViewingConditions *)pp; - icc *icp = p->icp; - - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmViewingConditions( - icc *icp -) { - icmViewingConditions *p; - if ((p = (icmViewingConditions *) icp->al->calloc(icp->al,1,sizeof(icmViewingConditions))) == NULL) - return NULL; - p->ttype = icSigViewingConditionsType; - p->refcount = 1; - p->get_size = icmViewingConditions_get_size; - p->read = icmViewingConditions_read; - p->write = icmViewingConditions_write; - p->dump = icmViewingConditions_dump; - p->allocate = icmViewingConditions_allocate; - p->del = icmViewingConditions_delete; - p->icp = icp; - - return (icmBase *)p; -} - -/* ---------------------------------------------------------- */ -/* icmCrdInfo object */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmCrdInfo_get_size( - icmBase *pp -) { - icmCrdInfo *p = (icmCrdInfo *)pp; - unsigned int len = 0, t; - len += 8; /* 8 bytes for tag and padding */ - len += 4 + p->ppsize; /* Postscript product name */ - for (t = 0; t < 4; t++) { /* For all 4 intents */ - len += 4 + p->crdsize[t]; /* crd names */ - } - return len; -} - -/* read the object, return 0 on success, error code on fail */ -static int icmCrdInfo_read( - icmBase *pp, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icmCrdInfo *p = (icmCrdInfo *)pp; - icc *icp = p->icp; - unsigned long t; - int rv = 0; - char *bp, *buf, *end; - - if (len < 28) { - sprintf(icp->err,"icmCrdInfo_read: Tag too small to be legal"); - return icp->errc = 1; - } - - /* Allocate a file read buffer */ - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmCrdInfo_read: malloc() failed"); - return icp->errc = 2; - } - bp = buf; - end = buf + len; - - /* Read portion of file into buffer */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, bp, 1, len) != len) { - sprintf(icp->err,"icmCrdInfo_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read type descriptor from the buffer */ - if (((icTagTypeSignature)read_SInt32Number(bp)) != p->ttype) { - sprintf(icp->err,"icmCrdInfo_read: Wrong tag type for icmCrdInfo"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - bp = bp + 8; - - /* Postscript product name */ - if ((bp + 4) > end) { - sprintf(icp->err,"icmCrdInfo_read: Data too short to read Postscript product name"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - p->ppsize = read_UInt32Number(bp); - bp += 4; - if (p->ppsize > 0) { - if ((bp + p->ppsize) > end) { - sprintf(icp->err,"icmCrdInfo_read: Data to short to read Postscript product string"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - if (check_null_string(bp,p->ppsize)) { - sprintf(icp->err,"icmCrdInfo_read: Postscript product name is not terminated"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - memcpy((void *)p->ppname, (void *)bp, p->ppsize); - bp += p->ppsize; - } - - /* CRD names for the four rendering intents */ - for (t = 0; t < 4; t++) { /* For all 4 intents */ - if ((bp + 4) > end) { - sprintf(icp->err,"icmCrdInfo_read: Data too short to read CRD%ld name",t); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - p->crdsize[t] = read_UInt32Number(bp); - bp += 4; - if (p->crdsize[t] > 0) { - if ((bp + p->crdsize[t]) > end) { - sprintf(icp->err,"icmCrdInfo_read: Data to short to read CRD%ld string",t); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - if (check_null_string(bp,p->crdsize[t])) { - sprintf(icp->err,"icmCrdInfo_read: CRD%ld name is not terminated",t); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; - } - memcpy((void *)p->crdname[t], (void *)bp, p->crdsize[t]); - bp += p->crdsize[t]; - } - } - - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmCrdInfo_write( - icmBase *pp, - unsigned long of /* File offset to write from */ -) { - icmCrdInfo *p = (icmCrdInfo *)pp; - icc *icp = p->icp; - unsigned long t; - unsigned int len; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmCrdInfo_write malloc() failed"); - return icp->errc = 2; - } - bp = buf; - - /* Write type descriptor to the buffer */ - if ((rv = write_SInt32Number((int)p->ttype,bp)) != 0) { - sprintf(icp->err,"icmCrdInfo_write: write_SInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - write_SInt32Number(0,bp+4); /* Set padding to 0 */ - bp = bp + 8; - - /* Postscript product name */ - if ((rv = write_UInt32Number(p->ppsize,bp)) != 0) { - sprintf(icp->err,"icmCrdInfo_write: write_UInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - bp += 4; - if (p->ppsize > 0) { - if ((rv = check_null_string(p->ppname,p->ppsize)) != 0) { - sprintf(icp->err,"icmCrdInfo_write: Postscript product name is not terminated"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - memcpy((void *)bp, (void *)p->ppname, p->ppsize); - bp += p->ppsize; - } - - /* CRD names for the four rendering intents */ - for (t = 0; t < 4; t++) { /* For all 4 intents */ - if ((rv = write_UInt32Number(p->crdsize[t],bp)) != 0) { - sprintf(icp->err,"icmCrdInfo_write: write_UInt32Number() failed"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - bp += 4; - if (p->ppsize > 0) { - if ((rv = check_null_string(p->crdname[t],p->crdsize[t])) != 0) { - sprintf(icp->err,"icmCrdInfo_write: CRD%ld name is not terminated",t); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - memcpy((void *)bp, (void *)p->crdname[t], p->crdsize[t]); - bp += p->crdsize[t]; - } - } - - /* Write to the file */ - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmCrdInfo_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - icp->al->free(icp->al, buf); - return 0; -} - -/* Dump a text description of the object */ -static void icmCrdInfo_dump( - icmBase *pp, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - icmCrdInfo *p = (icmCrdInfo *)pp; - unsigned long i, r, c, size, t; - - if (verb <= 0) - return; - - fprintf(op,"PostScript Product name and CRD names:\n"); - - fprintf(op," Product name:\n"); - fprintf(op," No. chars = %lu\n",p->ppsize); - - size = p->ppsize > 0 ? p->ppsize-1 : 0; - i = 0; - for (r = 1;; r++) { /* count rows */ - if (i >= size) { - fprintf(op,"\n"); - break; - } - if (r > 1 && verb < 2) { - fprintf(op,"...\n"); - break; /* Print 1 row if not verbose */ - } - c = 1; - fprintf(op," 0x%04lx: ",i); - c += 10; - while (i < size && c < 73) { - if (isprint((unsigned char) p->ppname[i])) { - fprintf(op,"%c",p->ppname[i]); - c++; - } else { - fprintf(op,"\\%03o",p->ppname[i]); - c += 4; - } - i++; - } - if (i < size) - fprintf(op,"\n"); - } - - for (t = 0; t < 4; t++) { /* For all 4 intents */ - fprintf(op," CRD%ld name:\n",t); - fprintf(op," No. chars = %lu\n",p->crdsize[t]); - - size = p->crdsize[t] > 0 ? p->crdsize[t]-1 : 0; - i = 0; - for (r = 1;; r++) { /* count rows */ - if (i >= size) { - fprintf(op,"\n"); - break; - } - if (r > 1 && verb < 2) { - fprintf(op,"...\n"); - break; /* Print 1 row if not verbose */ - } - c = 1; - fprintf(op," 0x%04lx: ",i); - c += 10; - while (i < size && c < 73) { - if (isprint((unsigned char) p->crdname[t][i])) { - fprintf(op,"%c",p->crdname[t][i]); - c++; - } else { - fprintf(op,"\\%03o",p->crdname[t][i]); - c += 4; - } - i++; - } - if (i < size) - fprintf(op,"\n"); - } - } -} - -/* Allocate variable sized data elements */ -static int icmCrdInfo_allocate( - icmBase *pp -) { - icmCrdInfo *p = (icmCrdInfo *)pp; - icc *icp = p->icp; - unsigned int t; - - if (p->ppsize != p->_ppsize) { - if (p->ppname != NULL) - icp->al->free(icp->al, p->ppname); - if ((p->ppname = (char *) icp->al->calloc(icp->al, p->ppsize, sizeof(char))) == NULL) { - sprintf(icp->err,"icmCrdInfo_alloc: calloc() of string data failed"); - return icp->errc = 2; - } - p->_ppsize = p->ppsize; - } - for (t = 0; t < 4; t++) { /* For all 4 intents */ - if (p->crdsize[t] != p->_crdsize[t]) { - if (p->crdname[t] != NULL) - icp->al->free(icp->al, p->crdname[t]); - if ((p->crdname[t] = (char *) icp->al->calloc(icp->al, p->crdsize[t], sizeof(char))) == NULL) { - sprintf(icp->err,"icmCrdInfo_alloc: calloc() of CRD%d name string failed",t); - return icp->errc = 2; - } - p->_crdsize[t] = p->crdsize[t]; - } - } - return 0; -} - -/* Free all storage in the object */ -static void icmCrdInfo_delete( - icmBase *pp -) { - icmCrdInfo *p = (icmCrdInfo *)pp; - icc *icp = p->icp; - unsigned int t; - - if (p->ppname != NULL) - icp->al->free(icp->al, p->ppname); - for (t = 0; t < 4; t++) { /* For all 4 intents */ - if (p->crdname[t] != NULL) - icp->al->free(icp->al, p->crdname[t]); - } - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmBase *new_icmCrdInfo( - icc *icp -) { - icmCrdInfo *p; - if ((p = (icmCrdInfo *) icp->al->calloc(icp->al,1,sizeof(icmCrdInfo))) == NULL) - return NULL; - p->ttype = icSigCrdInfoType; - p->refcount = 1; - p->get_size = icmCrdInfo_get_size; - p->read = icmCrdInfo_read; - p->write = icmCrdInfo_write; - p->dump = icmCrdInfo_dump; - p->allocate = icmCrdInfo_allocate; - p->del = icmCrdInfo_delete; - p->icp = icp; - - return (icmBase *)p; -} - -/* ========================================================== */ -/* icmHeader object */ -/* ========================================================== */ - -/* Return the number of bytes needed to write this tag */ -static unsigned int icmHeader_get_size( - icmHeader *p -) { - return 128; /* By definition */ -} - -/* read the object, return 0 on success, error code on fail */ -static int icmHeader_read( - icmHeader *p, - unsigned long len, /* tag length */ - unsigned long of /* start offset within file */ -) { - icc *icp = p->icp; - char *buf; - unsigned int tt; - int rv = 0; - - if (len != 128) { - sprintf(icp->err,"icmHeader_read: Length expected to be 128"); - return icp->errc = 1; - } - - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmHeader_read: malloc() failed"); - return icp->errc = 2; - } - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->read(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmHeader_read: fseek() or fread() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Fill in the in-memory structure */ - p->size = read_UInt32Number(buf + 0); /* Profile size in bytes */ - p->cmmId = read_SInt32Number(buf + 4); /* CMM for profile */ - tt = read_UInt8Number(buf + 8); /* Raw major version number */ - p->majv = (tt >> 4) * 10 + (tt & 0xf); /* Integer major version number */ - tt = read_UInt8Number(buf + 9); /* Raw minor/bug fix version numbers */ - p->minv = (tt >> 4); /* Integer minor version number */ - p->bfv = (tt & 0xf); /* Integer bug fix version number */ - p->deviceClass = (icProfileClassSignature) - read_SInt32Number(buf + 12); /* Type of profile */ - p->colorSpace = (icColorSpaceSignature) - read_SInt32Number(buf + 16); /* Color space of data */ - p->pcs = (icColorSpaceSignature) - read_SInt32Number(buf + 20); /* PCS: XYZ or Lab */ - if ((rv = read_DateTimeNumber(&p->date, buf + 24)) != 0) { /* Creation Date */ - sprintf(icp->err,"icmHeader_read: read_DateTimeNumber corrupted"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - tt = read_SInt32Number(buf+36); - if (tt != icMagicNumber) { /* Check magic number */ - sprintf(icp->err,"icmHeader_read: wrong magic number 0x%x",tt); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - p->platform = (icPlatformSignature) - read_SInt32Number(buf + 40); /* Primary platform */ - p->flags = read_UInt32Number(buf + 44); /* Various bits */ - p->manufacturer = read_SInt32Number(buf + 48); /* Dev manufacturer */ - p->model = read_SInt32Number(buf + 52); /* Dev model */ - read_UInt64Number(&p->attributes, buf + 56); /* Device attributes */ - p->renderingIntent = (icRenderingIntent) - read_SInt32Number(buf + 64); /* Rendering intent */ - if ((rv = read_XYZNumber(&p->illuminant, buf + 68)) != 0) { /* Profile illuminant */ - sprintf(icp->err,"icmHeader_read: read_XYZNumber error"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - p->creator = read_SInt32Number(buf + 80); /* Profile creator */ - - icp->al->free(icp->al, buf); - return 0; -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icmHeader_write( - icmHeader *p, - unsigned long of /* File offset to write from */ -) { - icc *icp = p->icp; - char *buf; /* Buffer to write from */ - unsigned int len; - unsigned int tt; - int rv = 0; - - len = p->get_size(p); - if (icp->errc) - return icp->errc; - if ((buf = (char *) icp->al->calloc(icp->al,1,len)) == NULL) { /* Zero it - some CMS are fussy */ - sprintf(icp->err,"icmHeader_write calloc() failed"); - return icp->errc = 2; - } - - /* Fill in the write buffer */ - if ((rv = write_UInt32Number(p->size, buf + 0)) != 0) { /* Profile size in bytes */ - sprintf(icp->err,"icmHeader_write: profile size"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - if ((rv = write_SInt32Number(p->cmmId, buf + 4)) != 0) { /* CMM for profile */ - sprintf(icp->err,"icmHeader_write: cmmId"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if (p->majv < 0 || p->majv > 99 /* Sanity check version numbers */ - || p->minv < 0 || p->minv > 9 - || p->bfv < 0 || p->bfv > 9) { - sprintf(icp->err,"icmHeader_write: version number"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - tt = ((p->majv/10) << 4) + (p->majv % 10); - if ((rv = write_UInt8Number(tt, buf + 8)) != 0) { /* Raw major version number */ - sprintf(icp->err,"icmHeader_write: Uint8Number major version"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - tt = (p->minv << 4) + p->bfv; - if ((rv = write_UInt8Number(tt, buf + 9)) != 0) { /* Raw minor/bug fix version numbers */ - sprintf(icp->err,"icmHeader_write: Uint8Number minor/bug fix"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_SInt32Number((int)p->deviceClass, buf + 12)) != 0) { /* Type of profile */ - sprintf(icp->err,"icmHeader_write: SInt32Number deviceClass"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_SInt32Number((int)p->colorSpace, buf + 16)) != 0) { /* Color space of data */ - sprintf(icp->err,"icmHeader_write: SInt32Number data color space"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_SInt32Number((int)p->pcs, buf + 20)) != 0) { /* PCS: XYZ or Lab */ - sprintf(icp->err,"icmHeader_write: SInt32Number PCS"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_DateTimeNumber(&p->date, buf + 24)) != 0) { /* Creation Date */ - sprintf(icp->err,"icmHeader_write: DateTimeNumber creation"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_SInt32Number(icMagicNumber, buf+36)) != 0) { /* Magic number */ - sprintf(icp->err,"icmHeader_write: SInt32Number magic"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_SInt32Number((int)p->platform, buf + 40)) != 0) { /* Primary platform */ - sprintf(icp->err,"icmHeader_write: SInt32Number platform"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_UInt32Number(p->flags, buf + 44)) != 0) { /* Various bits */ - sprintf(icp->err,"icmHeader_write: UInt32Number flags"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_SInt32Number(p->manufacturer, buf + 48)) != 0) { /* Dev manufacturer */ - sprintf(icp->err,"icmHeader_write: SInt32Number manufaturer"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((write_SInt32Number(p->model, buf + 52)) != 0) { /* Dev model */ - sprintf(icp->err,"icmHeader_write: SInt32Number model"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_UInt64Number(&p->attributes, buf + 56)) != 0) { /* Device attributes */ - sprintf(icp->err,"icmHeader_write: UInt64Number attributes"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_SInt32Number((int)p->renderingIntent, buf + 64)) != 0) { /* Rendering intent */ - sprintf(icp->err,"icmHeader_write: SInt32Number rendering intent"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_XYZNumber(&p->illuminant, buf + 68)) != 0) { /* Profile illuminant */ - sprintf(icp->err,"icmHeader_write: XYZNumber illuminant"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - if ((rv = write_SInt32Number(p->creator, buf + 80)) != 0) { /* Profile creator */ - sprintf(icp->err,"icmHeader_write: SInt32Number creator"); - icp->al->free(icp->al, buf); - return icp->errc = rv; - } - - if ( icp->fp->seek(icp->fp, of) != 0 - || icp->fp->write(icp->fp, buf, 1, len) != len) { - sprintf(icp->err,"icmHeader_write fseek() or fwrite() failed"); - icp->al->free(icp->al, buf); - return icp->errc = 2; - } - - icp->al->free(icp->al, buf); - return rv; -} - -static void icmHeader_dump( - icmHeader *p, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - if (verb <= 0) - return; - - fprintf(op,"Header:\n"); - fprintf(op," size = %d bytes\n",p->size); - fprintf(op," CMM = %s\n",tag2str(p->cmmId)); - fprintf(op," Version = %d.%d.%d\n",p->majv, p->minv, p->bfv); - fprintf(op," Device Class = %s\n", string_ProfileClassSignature(p->deviceClass)); - fprintf(op," Color Space = %s\n", string_ColorSpaceSignature(p->colorSpace)); - fprintf(op," Conn. Space = %s\n", string_ColorSpaceSignature(p->pcs)); - fprintf(op," Date, Time = %s\n", string_DateTimeNumber(&p->date)); - fprintf(op," Platform = %s\n", string_PlatformSignature(p->platform)); - fprintf(op," Flags = %s\n", string_ProfileHeaderFlags(p->flags)); - fprintf(op," Dev. Mnfctr. = %s\n",tag2str(p->manufacturer)); /* ~~~ */ - fprintf(op," Dev. Model = %s\n",tag2str(p->model)); /* ~~~ */ - fprintf(op," Dev. Attrbts = %s\n", string_DeviceAttributes(p->attributes.l)); - fprintf(op," Rndrng Intnt = %s\n", string_RenderingIntent(p->renderingIntent)); - fprintf(op," Illuminant = %s\n", string_XYZNumber_and_Lab(&p->illuminant)); - fprintf(op," Creator = %s\n",tag2str(p->creator)); /* ~~~ */ - fprintf(op,"\n"); -} - -static void icmHeader_delete( - icmHeader *p -) { - icc *icp = p->icp; - - icp->al->free(icp->al, p); -} - -/* Create an empty object. Return null on error */ -static icmHeader *new_icmHeader( - icc *icp -) { - icmHeader *p; - if ((p = (icmHeader *) icp->al->calloc(icp->al,1,sizeof(icmHeader))) == NULL) - return NULL; - p->icp = icp; - p->get_size = icmHeader_get_size; - p->read = icmHeader_read; - p->write = icmHeader_write; - p->dump = icmHeader_dump; - p->del = icmHeader_delete; - - return p; -} - -/* ---------------------------------------------------------- */ -/* Type vector table. Match the Tag type against the object creator */ -static struct { - icTagTypeSignature ttype; /* The tag type signature */ - icmBase * (*new_obj)(icc *icp); -} typetable[] = { - {icSigCrdInfoType, new_icmCrdInfo}, - {icSigCurveType, new_icmCurve}, - {icSigDataType, new_icmData}, - {icSigDateTimeType, new_icmDateTimeNumber}, - {icSigLut16Type, new_icmLut}, - {icSigLut8Type, new_icmLut}, - {icSigMeasurementType, new_icmMeasurement}, - {icSigNamedColorType, new_icmNamedColor}, - {icSigNamedColor2Type, new_icmNamedColor}, - {icSigProfileSequenceDescType, new_icmProfileSequenceDesc}, - {icSigS15Fixed16ArrayType, new_icmS15Fixed16Array}, - {icSigScreeningType, new_icmScreening}, - {icSigSignatureType, new_icmSignature}, - {icSigTextDescriptionType, new_icmTextDescription}, - {icSigTextType, new_icmText}, - {icSigU16Fixed16ArrayType, new_icmU16Fixed16Array}, - {icSigUcrBgType, new_icmUcrBg}, - {icSigVideoCardGammaType, new_icmVideoCardGamma}, - {icSigUInt16ArrayType, new_icmUInt16Array}, - {icSigUInt32ArrayType, new_icmUInt32Array}, - {icSigUInt64ArrayType, new_icmUInt64Array}, - {icSigUInt8ArrayType, new_icmUInt8Array}, - {icSigViewingConditionsType, new_icmViewingConditions}, - {icSigXYZArrayType, new_icmXYZArray}, - {icMaxEnumType, NULL} -}; - -/* Table that lists the legal Types for each Tag Signature */ -static struct { - icTagSignature sig; - icTagTypeSignature ttypes[4]; /* Arbitrary max of 4 */ -} sigtypetable[] = { - {icSigAToB0Tag, {icSigLut8Type,icSigLut16Type,icMaxEnumType}}, - {icSigAToB1Tag, {icSigLut8Type,icSigLut16Type,icMaxEnumType}}, - {icSigAToB2Tag, {icSigLut8Type,icSigLut16Type,icMaxEnumType}}, - {icSigBlueColorantTag, {icSigXYZType,icMaxEnumType}}, - {icSigBlueTRCTag, {icSigCurveType,icMaxEnumType}}, - {icSigBToA0Tag, {icSigLut8Type,icSigLut16Type,icMaxEnumType}}, - {icSigBToA1Tag, {icSigLut8Type,icSigLut16Type,icMaxEnumType}}, - {icSigBToA2Tag, {icSigLut8Type,icSigLut16Type,icMaxEnumType}}, - {icSigCalibrationDateTimeTag, {icSigDateTimeType,icMaxEnumType}}, - {icSigCharTargetTag, {icSigTextType,icMaxEnumType}}, - {icSigCopyrightTag, {icSigTextType,icMaxEnumType}}, - {icSigCrdInfoTag, {icSigCrdInfoType,icMaxEnumType}}, - {icSigDeviceMfgDescTag, {icSigTextDescriptionType,icMaxEnumType}}, - {icSigDeviceModelDescTag, {icSigTextDescriptionType,icMaxEnumType}}, - {icSigGamutTag, {icSigLut8Type,icSigLut16Type,icMaxEnumType}}, - {icSigGrayTRCTag, {icSigCurveType,icMaxEnumType}}, - {icSigGreenColorantTag, {icSigXYZType,icMaxEnumType}}, - {icSigGreenTRCTag, {icSigCurveType,icMaxEnumType}}, - {icSigLuminanceTag, {icSigXYZType,icMaxEnumType}}, - {icSigMeasurementTag, {icSigMeasurementType,icMaxEnumType}}, - {icSigMediaBlackPointTag, {icSigXYZType,icMaxEnumType}}, - {icSigMediaWhitePointTag, {icSigXYZType,icMaxEnumType}}, - {icSigNamedColorTag, {icSigNamedColorType,icMaxEnumType}}, - {icSigNamedColor2Tag, {icSigNamedColor2Type,icMaxEnumType}}, - {icSigPreview0Tag, {icSigLut8Type,icSigLut16Type,icMaxEnumType}}, - {icSigPreview1Tag, {icSigLut8Type,icSigLut16Type,icMaxEnumType}}, - {icSigPreview2Tag, {icSigLut8Type,icSigLut16Type,icMaxEnumType}}, - {icSigProfileDescriptionTag, {icSigTextDescriptionType,icMaxEnumType}}, - {icSigProfileSequenceDescTag, {icSigProfileSequenceDescType,icMaxEnumType}}, - {icSigPs2CRD0Tag, {icSigDataType,icMaxEnumType}}, - {icSigPs2CRD1Tag, {icSigDataType,icMaxEnumType}}, - {icSigPs2CRD2Tag, {icSigDataType,icMaxEnumType}}, - {icSigPs2CRD3Tag, {icSigDataType,icMaxEnumType}}, - {icSigPs2CSATag, {icSigDataType,icMaxEnumType}}, - {icSigPs2RenderingIntentTag, {icSigDataType,icMaxEnumType}}, - {icSigRedColorantTag, {icSigXYZType,icMaxEnumType}}, - {icSigRedTRCTag, {icSigCurveType,icMaxEnumType}}, - {icSigScreeningDescTag, {icSigTextDescriptionType,icMaxEnumType}}, - {icSigScreeningTag, {icSigScreeningType,icMaxEnumType}}, - {icSigTechnologyTag, {icSigSignatureType,icMaxEnumType}}, - {icSigUcrBgTag, {icSigUcrBgType,icMaxEnumType}}, - {icSigVideoCardGammaTag, {icSigVideoCardGammaType,icMaxEnumType}}, - {icSigViewingCondDescTag, {icSigTextDescriptionType,icMaxEnumType}}, - {icSigViewingConditionsTag, {icSigViewingConditionsType,icMaxEnumType}}, - {icMaxEnumType, {icMaxEnumType}} -}; - -/* Fake color tag for specifying PCS */ -#define icSigPCSData ((icColorSpaceSignature) 0x50435320L) - -/* Table that lists the required tags for various profiles */ -static struct { - icProfileClassSignature sig; /* Profile signature */ - int chans; /* Data Color channels, -ve for match but try next, */ - /* -100 for ignore, -200 for ignore and try next */ - icColorSpaceSignature colsig; /* Data Color space signature, icMaxEnumData for ignore, */ - /* icSigPCSData for XYZ of Lab */ - icColorSpaceSignature pcssig; /* PCS Color space signature, icMaxEnumData for ignore, */ - /* icSigPCSData for XYZ or Lab */ - icTagSignature tags[12]; /* Arbitrary max of 12 */ -} tagchecktable[] = { - {icSigInputClass, -1, icMaxEnumData, icSigPCSData, - {icSigProfileDescriptionTag, - icSigGrayTRCTag, - icSigMediaWhitePointTag, - icSigCopyrightTag, icMaxEnumType}}, - - {icSigInputClass, -3, icMaxEnumData, icSigXYZData, - {icSigProfileDescriptionTag, - icSigRedColorantTag, - icSigGreenColorantTag, - icSigBlueColorantTag, - icSigRedTRCTag, - icSigGreenTRCTag, - icSigBlueTRCTag, - icSigMediaWhitePointTag, - icSigCopyrightTag, icMaxEnumType}}, - - {icSigInputClass, -100, icMaxEnumData, icSigPCSData, - {icSigProfileDescriptionTag, - icSigAToB0Tag, - icSigMediaWhitePointTag, - icSigCopyrightTag, icMaxEnumType}}, - - {icSigDisplayClass, -1, icMaxEnumData, icSigPCSData, - {icSigProfileDescriptionTag, - icSigGrayTRCTag, - icSigMediaWhitePointTag, - icSigCopyrightTag, icMaxEnumType}}, - - {icSigDisplayClass, -3, icSigRgbData, icSigXYZData, /* Rgb or any 3 component space ?? */ - {icSigProfileDescriptionTag, - icSigRedColorantTag, - icSigGreenColorantTag, - icSigBlueColorantTag, - icSigRedTRCTag, - icSigGreenTRCTag, - icSigBlueTRCTag, - icSigMediaWhitePointTag, - icSigCopyrightTag, icMaxEnumType}}, - - /* Non-3 component Display device */ - {icSigDisplayClass, -100, icMaxEnumData, icSigPCSData, - {icSigProfileDescriptionTag, - icSigAToB0Tag, /* BToA doesn't seem to be required, which is strange... */ - icSigMediaWhitePointTag, - icSigCopyrightTag, icMaxEnumType}}, - - {icSigOutputClass, -1, icMaxEnumData, icSigPCSData, - {icSigProfileDescriptionTag, - icSigGrayTRCTag, - icSigMediaWhitePointTag, - icSigCopyrightTag, icMaxEnumType}}, - - {icSigOutputClass, -1, icMaxEnumData, icSigPCSData, - {icSigProfileDescriptionTag, - icSigAToB0Tag, - icSigBToA0Tag, - icSigGamutTag, - icSigAToB1Tag, - icSigBToA1Tag, - icSigAToB2Tag, - icSigBToA2Tag, - icSigMediaWhitePointTag, - icSigCopyrightTag, icMaxEnumType}}, - - {icSigOutputClass, -2, icMaxEnumData, icSigPCSData, - {icSigProfileDescriptionTag, - icSigAToB0Tag, - icSigBToA0Tag, - icSigGamutTag, - icSigAToB1Tag, - icSigBToA1Tag, - icSigAToB2Tag, - icSigBToA2Tag, - icSigMediaWhitePointTag, - icSigCopyrightTag, icMaxEnumType}}, - - {icSigOutputClass, -3, icMaxEnumData, icSigPCSData, - {icSigProfileDescriptionTag, - icSigAToB0Tag, - icSigBToA0Tag, - icSigGamutTag, - icSigAToB1Tag, - icSigBToA1Tag, - icSigAToB2Tag, - icSigBToA2Tag, - icSigMediaWhitePointTag, - icSigCopyrightTag, icMaxEnumType}}, - - {icSigOutputClass, -4, icMaxEnumData, icSigPCSData, - {icSigProfileDescriptionTag, - icSigAToB0Tag, - icSigBToA0Tag, - icSigGamutTag, - icSigAToB1Tag, - icSigBToA1Tag, - icSigAToB2Tag, - icSigBToA2Tag, - icSigMediaWhitePointTag, - icSigCopyrightTag, icMaxEnumType}}, - - {icSigOutputClass, -100, icMaxEnumData, icSigPCSData, /* Assumed from Hexachrome examples */ - {icSigProfileDescriptionTag, - icSigBToA0Tag, - icSigBToA1Tag, - icSigBToA2Tag, - icSigMediaWhitePointTag, - icSigCopyrightTag, icMaxEnumType}}, - - {icSigLinkClass, -100, icMaxEnumData, icMaxEnumData, - {icSigProfileDescriptionTag, - icSigAToB0Tag, - icSigProfileSequenceDescTag, - icSigCopyrightTag, icMaxEnumType}}, - - {icSigColorSpaceClass, -100, icMaxEnumData, icSigPCSData, - {icSigProfileDescriptionTag, - icSigBToA0Tag, - icSigAToB0Tag, - icSigMediaWhitePointTag, - icSigCopyrightTag, icMaxEnumType}}, - - {icSigAbstractClass, -100, icSigPCSData, icSigPCSData, - {icSigProfileDescriptionTag, - icSigAToB0Tag, - icSigMediaWhitePointTag, - icSigCopyrightTag, icMaxEnumType}}, - - {icSigNamedColorClass, -200, icMaxEnumData, icMaxEnumData, - {icSigProfileDescriptionTag, - icSigNamedColor2Tag, - icSigMediaWhitePointTag, - icSigCopyrightTag, icMaxEnumType}}, - - {icSigNamedColorClass, -100, icMaxEnumData, icMaxEnumData, - {icSigProfileDescriptionTag, - icSigNamedColorTag, /* Not strictly V3.4 */ - icSigMediaWhitePointTag, - icSigCopyrightTag, icMaxEnumType}}, - - {icMaxEnumType,-1,icMaxEnumData, icMaxEnumData, {icMaxEnumType}} -}; - -/* ------------------------------------------------------------- */ -/* Check that the ICC profile looks like it will be legal. */ -/* Return non-zero and set error string if not */ -static int check_icc_legal( - icc *p -) { - int i, j; - icProfileClassSignature sig; - icColorSpaceSignature colsig; - icColorSpaceSignature pcssig; - int dchans; - - if (p->header == NULL) { - sprintf(p->err,"icc_check_legal: Header is missing"); - return p->errc = 1; - } - - sig = p->header->deviceClass; - colsig = p->header->colorSpace; - dchans = number_ColorSpaceSignature(colsig); - pcssig = p->header->pcs; - - /* Find a matching table entry */ - for (i = 0; tagchecktable[i].sig != icMaxEnumType; i++) { - if ( tagchecktable[i].sig == sig - && ( tagchecktable[i].chans == dchans /* Exactly matches */ - || tagchecktable[i].chans == -dchans /* Exactly matches, but can try next table */ - || tagchecktable[i].chans < -99) /* Doesn't have to match or try next table */ - && ( tagchecktable[i].colsig == colsig - || (tagchecktable[i].colsig == icSigPCSData - && (colsig == icSigXYZData || colsig == icSigLabData)) - || tagchecktable[i].colsig == icMaxEnumData) - && ( tagchecktable[i].pcssig == pcssig - || (tagchecktable[i].pcssig == icSigPCSData - && (pcssig == icSigXYZData || pcssig == icSigLabData)) - || tagchecktable[i].pcssig == icMaxEnumData)) { - - /* Found entry, so now check that all the required tags are present. */ - for (j = 0; tagchecktable[i].tags[j] != icMaxEnumType; j++) { - if (p->find_tag(p, tagchecktable[i].tags[j]) != 0) { /* Not present! */ - if (tagchecktable[i].chans == -200 - || tagchecktable[i].chans == -dchans) { /* But can try next table */ - break; - } - sprintf(p->err,"icc_check_legal: deviceClass %s is missing required tag %s", - tag2str(sig), tag2str(tagchecktable[i].tags[j])); - return p->errc = 1; - } - } - if (tagchecktable[i].tags[j] == icMaxEnumType) { - break; /* Fount all required tags */ - } - } - } - - /* According to the spec. if the deviceClass is: - an Abstract Class: both in and out color spaces should be PCS - an Link Class: both in and out color spaces can be any, and should - be the input space of the first profile in the link, and the - input space of the last profile in the link respectively. - a Named Class: in and out color spaces are not defined in the spec. - Input, Display, Output and ColorSpace Classes, input color - space can be any, and the output space must be PCS. - ~~ should check this here ??? - */ - - return 0; /* Assume anything is ok */ -} - -/* read the object, return 0 on success, error code on fail */ -/* NOTE: this doesn't read the tag types, they should be read on demand. */ -static int icc_read( - icc *p, - icmFile *fp, /* File to read from */ - unsigned long of /* File offset to read from */ -) { - char tcbuf[4]; /* Tag count read buffer */ - int i; - unsigned int len; - int er = 0; /* Error code */ - - p->fp = fp; - p->of = of; - if (p->header == NULL) { - sprintf(p->err,"icc_read: No header defined"); - return p->errc = 1; - } - - /* Read the header */ - if (p->header->read(p->header, 128, of)) { - return 1; - } - - /* Read the tag count */ - if ( p->fp->seek(p->fp, of + 128) != 0 - || p->fp->read(p->fp, tcbuf, 1, 4) != 4) { - sprintf(p->err,"icc_read: fseek() or fread() failed on tag count"); - return p->errc = 1; - } - - p->count = read_UInt32Number(tcbuf); /* Tag count */ - if (p->count > 100) { - /* This is an arbitrary check designed to limit - * resource use by corrupt profiles. A safer - * check would be to compare against the maximum - * number of tags which could fit in the declared - * length. */ - sprintf(p->err,"icc_read: too many table tags"); - return p->errc = 1; - } - if (p->count > 0) { - char *bp, *buf; - if ((p->data = (icmTag *) p->al->calloc(p->al, p->count, sizeof(icmTag))) == NULL) { - sprintf(p->err,"icc_read: Tag table calloc() failed"); - return p->errc = 2; - } - - if (p->count > (UINT_MAX - 4) / 12) { - sprintf(p->err,"icc_read: overflow"); - p->al->free(p->al, p->data); - p->data = NULL; - return p->errc = 1; - } - len = 4 + p->count * 12; - if ((buf = (char *) p->al->malloc(p->al, len)) == NULL) { - sprintf(p->err,"icc_read: Tag table read buffer malloc() failed"); - p->al->free(p->al, p->data); - p->data = NULL; - return p->errc = 2; - } - if ( p->fp->seek(p->fp, of + 128) != 0 - || p->fp->read(p->fp, buf, 1, len) != len) { - sprintf(p->err,"icc_read: fseek() or fread() failed on tag table"); - p->al->free(p->al, p->data); - p->data = NULL; - p->al->free(p->al, buf); - return p->errc = 1; - } - - /* Fill in the tag table structure */ - bp = buf+4; - for (i = 0; i < p->count; i++, bp += 12) { - p->data[i].sig = (icTagSignature)read_SInt32Number(bp + 0); - p->data[i].offset = read_UInt32Number(bp + 4); - if (p->data[i].offset < 128) { /* to catch 0 offset */ - sprintf(p->err, "icc_read: Impossible offset %u in tag %d", p->data[i].offset, i); - p->al->free(p->al, p->data); - p->data = NULL; - p->al->free(p->al, buf); - return p->errc = 1; - } - p->data[i].size = read_UInt32Number(bp + 8); - if (p->data[i].offset + p->data[i].size > - p->header->size) { - sprintf(p->err,"icc_read: tag out of bounds"); - p->al->free(p->al, p->data); - p->data = NULL; - p->al->free(p->al, buf); - return p->errc = 1; - } - if ( p->fp->seek(p->fp, of + p->data[i].offset) != 0 - || p->fp->read(p->fp, tcbuf, 1, 4) != 4) { - sprintf(p->err,"icc_read: fseek() or fread() failed on tag headers"); - p->al->free(p->al, p->data); - p->data = NULL; - p->al->free(p->al, buf); - return p->errc = 1; - } - p->data[i].ttype = read_SInt32Number(tcbuf); /* Tag type */ - p->data[i].objp = NULL; /* Read on demand */ - } - p->al->free(p->al, buf); - } /* p->count > 0 */ - - return er; -} - -#define DO_ALIGN(val) (((val) + 3) & ~3) - -/* Return the total size needed for the profile */ -/* Return 0 on error. */ -static unsigned int icc_get_size( - icc *p -) { - unsigned int size = 0; - int i; - - /* Check that the right tags etc. are present for a legal ICC profile */ - if (check_icc_legal(p) != 0) { - return 0; - } - - /* Compute the total size and tag element data offsets */ - if (p->header == NULL) { - sprintf(p->err,"icc_get_size: No header defined"); - p->errc = 1; - return 0; - } - - size += p->header->get_size(p->header); - if (p->errc) - return (unsigned int) -1; - - size = DO_ALIGN(size); - if (size == 0 || p->count > (UINT_MAX - 4 - size) / 12) { - p->errc = 1; - return (unsigned int) -1; - } - size += 4 + p->count * 12; /* Tag table length */ - - /* Reset touched flag for each tag type */ - for (i = 0; i < p->count; i++) { - if (p->data[i].objp == NULL) { - sprintf(p->err,"icc_get_size: Internal error - NULL tag element"); - p->errc = 1; - return 0; - } - p->data[i].objp->touched = 0; - } - /* Get size for each tag type, skipping links */ - for (i = 0; i < p->count; i++) { - if (p->data[i].objp->touched == 0) { /* Not alllowed for previously */ - unsigned int obj_size; - size = DO_ALIGN(size); - obj_size = p->data[i].objp->get_size(p->data[i].objp); - if (size == 0 || p->errc || - obj_size > UINT_MAX - size) - return (unsigned int) -1; - size += obj_size; - p->data[i].objp->touched = 1; /* Don't account for this again */ - } - } - - return size; /* Total size needed */ -} - -/* Write the contents of the object. Return 0 on sucess, error code on failure */ -static int icc_write( - icc *p, - icmFile *fp, /* File to write to */ - unsigned long of /* File offset to write to */ -) { - char *bp, *buf; /* Buffer to write to */ - unsigned int len = 0; - int rv = 0; - int i; - unsigned int size = 0; - - /* Check that the right tags etc. are present for a legal ICC profile */ - if ((rv = check_icc_legal(p)) != 0) { - return rv; - } - - p->fp = fp; /* Open file pointer */ - p->of = of; /* Offset of ICC profile */ - - /* Compute the total size and tag element data offsets */ - if (p->header == NULL) { - sprintf(p->err,"icc_write: No header defined"); - return p->errc = 1; - } - - size += p->header->get_size(p->header); - if (p->errc) - return p->errc; - - if (p->count > (UINT_MAX - 4 - len) / 12) { - sprintf(p->err,"icc_write: too many tags"); - return p->errc = 1; - } - len = 4 + p->count * 12; /* Tag table length */ - size = DO_ALIGN(size); - if (size == 0 || size > UINT_MAX - len) { - sprintf(p->err,"icc_write: overflow writing tag table"); - return p->errc = 1; - } - size += len; - - /* Allocate memory buffer for tag table */ - if ((buf = (char *) p->al->malloc(p->al, len)) == NULL) { - sprintf(p->err,"icc_write malloc() failed"); - return p->errc = 2; - } - bp = buf; - - if ((rv = write_UInt32Number(p->count, bp)) != 0) { /* Tag count */ - sprintf(p->err,"icc_write: write_UInt32Number() failed on tag count"); - p->al->free(p->al, buf); - return p->errc = rv; - } - bp += 4; - /* Reset touched flag for each tag type */ - for (i = 0; i < p->count; i++) { - if (p->data[i].objp == NULL) { - sprintf(p->err,"icc_write: Internal error - NULL tag element"); - p->al->free(p->al, buf); - return p->errc = 1; - } - p->data[i].objp->touched = 0; - } - /* Set the offset and size for each tag type */ - for (i = 0; i < p->count; i++) { - if (p->data[i].objp->touched == 0) { /* Allocate space for tag type */ - size = DO_ALIGN(size); - p->data[i].offset = size; /* Profile relative target */ - p->data[i].size = p->data[i].objp->get_size(p->data[i].objp); - if (size == 0 || - p->errc || p->data[i].size > UINT_MAX - size) { - sprintf(p->err,"icc_write: internal error - overflow?"); - p->al->free(p->al, buf); - return p->errc; - } - size += p->data[i].size; - p->data[i].objp->touched = 1; /* Allocated space for it */ - } else { /* must be linked - copy allocation */ - int k; - for (k = 0; k < p->count; k++) { /* Find linked tag */ - if (p->data[k].objp == p->data[i].objp) - break; - } - if (k == p->count) { - sprintf(p->err,"icc_write: corrupted link"); - return p->errc = 2; - } - p->data[i].offset = p->data[k].offset; - p->data[i].size = p->data[k].size; - } - /* Write tag table entry for this tag */ - if ((rv = write_SInt32Number((int)p->data[i].sig,bp + 0)) != 0) { - sprintf(p->err,"icc_write: write_SInt32Number() failed on tag signature"); - p->al->free(p->al, buf); - return p->errc = rv; - } - if ((rv = write_UInt32Number(p->data[i].offset, bp + 4)) != 0) { - sprintf(p->err,"icc_write: write_UInt32Number() failed on tag offset"); - p->al->free(p->al, buf); - return p->errc = rv; - } - if ((rv = write_UInt32Number(p->data[i].size, bp + 8)) != 0) { - sprintf(p->err,"icc_write: write_UInt32Number() failed on tag size"); - p->al->free(p->al, buf); - return p->errc = rv; - } - bp += 12; - } - p->header->size = size; /* Record total icc size */ - - /* Write the header */ - if ((rv = p->header->write(p->header, of)) != 0) { - p->al->free(p->al, buf); - return rv; - } - - /* Write the tag table */ - if ( p->fp->seek(p->fp, of + 128) != 0 - || p->fp->write(p->fp, buf, 1, len) != len) { - sprintf(p->err,"icc_write: fseek() or fwrite() failed"); - p->al->free(p->al, buf); - return p->errc = 1; - } - p->al->free(p->al, buf); - - /* Write all the tag element data */ - for (i = 0; i < p->count; i++) { /* For all the tag element data */ - if (p->data[i].objp->touched == 0) - continue; /* Must be linked, and we've already written it */ - if ((rv = p->data[i].objp->write(p->data[i].objp, of + p->data[i].offset)) != 0) { - return rv; - } - p->data[i].objp->touched = 0; /* Written it */ - } - - if (p->fp->flush(p->fp) != 0) { - sprintf(p->err,"icc_write flush() failed"); - p->al->free(p->al, buf); - return p->errc = 2; - } - return rv; -} -#undef DO_ALIGN - -/* Create and add a tag with the given signature. */ -/* Returns a pointer to the element object */ -/* Returns NULL if error - icc->errc will contain */ -/* 2 on system error, */ -/* 3 if unknown tag */ -/* NOTE: that we prevent tag duplication */ -static icmBase *icc_add_tag( - icc *p, - icTagSignature sig, /* Tag signature - may be unknown */ - icTagTypeSignature ttype /* Tag type */ -) { - icmBase *tp; - icmBase *nob; - int i, j, ok = 1; - - /* Check that a known signature has an acceptable type */ - for (i = 0; sigtypetable[i].sig != icMaxEnumType; i++) { - if (sigtypetable[i].sig == sig) { /* recognized signature */ - ok = 0; - for (j = 0; sigtypetable[i].ttypes[j] != icMaxEnumType; j++) { - if (sigtypetable[i].ttypes[j] == ttype) /* recognized type */ - ok = 1; - } - break; - } - } - if (!ok) { - sprintf(p->err,"icc_add_tag: wrong tag type for signature"); - p->errc = 1; - return NULL; - } - - /* Check that we know how to handle this type */ - for (i = 0; typetable[i].ttype != icMaxEnumType; i++) { - if (typetable[i].ttype == ttype) - break; - } - if (typetable[i].ttype == icMaxEnumType) { - sprintf(p->err,"icc_add_tag: unsupported tag type"); - p->errc = 1; - return NULL; - } - - /* Check that this tag doesn't already exits */ - /* (Perhaps we should simply replace it, rather than erroring ?) */ - for (j = 0; j < p->count; j++) { - if (p->data[j].sig == sig) { - sprintf(p->err,"icc_add_tag: Already have tag '%s' in profile",tag2str(p->data[j].sig)); - p->errc = 1; - return NULL; - } - } - - /* Make space in tag table for new tag item */ - if (p->count > (UINT_MAX / sizeof(icmTag)) - 1) { - sprintf(p->err,"icc_add_tag: overflow"); - p->errc = 1; - return NULL; - } - if (p->data == NULL) - tp = p->al->malloc(p->al, (p->count+1) * sizeof(icmTag)); - else - tp = p->al->realloc(p->al, (void *)p->data, (p->count+1) * sizeof(icmTag)); - if (tp == NULL) { - sprintf(p->err,"icc_add_tag: Tag table realloc() failed"); - p->errc = 2; - return NULL; - } - p->data = (icmTag *)tp; - - /* Allocate the empty object */ - if ((nob = typetable[i].new_obj(p)) == NULL) - return NULL; - - /* Fill out our tag table entry */ - p->data[p->count].sig = sig; /* The tag signature */ - p->data[p->count].ttype = nob->ttype = ttype; /* The tag type signature */ - p->data[p->count].offset = 0; /* Unknown offset yet */ - p->data[p->count].size = 0; /* Unknown size yet */ - p->data[p->count].objp = nob; /* Empty object */ - p->count++; - - return nob; -} - -/* Create and add a tag which is a link to an existing tag. */ -/* Returns a pointer to the element object */ -/* Returns NULL if error - icc->errc will contain */ -/* 3 if incompatible tag */ -/* NOTE: that we prevent tag duplication */ -static icmBase *icc_link_tag( - icc *p, - icTagSignature sig, /* Tag signature - may be unknown */ - icTagSignature ex_sig /* Tag signature of tag to link to */ -) { - icmBase *tp; - int i, j, exi, ok = 1; - - /* Search for existing signature */ - for (exi = 0; exi < p->count; exi++) { - if (p->data[exi].sig == ex_sig) /* Found it */ - break; - } - if (exi == p->count) { - sprintf(p->err,"icc_link_tag: Can't find existing tag '%s'",tag2str(ex_sig)); - p->errc = 1; - return NULL; - } - - if (p->data[exi].objp == NULL) { - sprintf(p->err,"icc_link_tag: Existing tag '%s' isn't loaded",tag2str(ex_sig)); - p->errc = 1; - return NULL; - } - - /* Check that a known signature has an acceptable type */ - for (i = 0; sigtypetable[i].sig != icMaxEnumType; i++) { - if (sigtypetable[i].sig == sig) { /* recognized signature */ - ok = 0; - for (j = 0; sigtypetable[i].ttypes[j] != icMaxEnumType; j++) { - if (sigtypetable[i].ttypes[j] == p->data[exi].ttype) /* recognized type */ - ok = 1; - } - break; - } - } - if (!ok) { - sprintf(p->err,"icc_link_tag: wrong tag type for signature"); - p->errc = 1; - return NULL; - } - - /* Check that this tag doesn't already exits */ - for (j = 0; j < p->count; j++) { - if (p->data[j].sig == sig) { - sprintf(p->err,"icc_link_tag: Already have tag '%s' in profile",tag2str(p->data[j].sig)); - p->errc = 1; - return NULL; - } - } - - /* Make space in tag table for new tag item */ - if (p->count > (UINT_MAX / sizeof(icmTag)) - 1) { - sprintf(p->err,"icc_link_tag: overflow"); - p->errc = 1; - return NULL; - } - if (p->data == NULL) - tp = p->al->malloc(p->al, (p->count+1) * sizeof(icmTag)); - else - tp = p->al->realloc(p->al, (void *)p->data, (p->count+1) * sizeof(icmTag)); - if (tp == NULL) { - sprintf(p->err,"icc_link_tag: Tag table realloc() failed"); - p->errc = 2; - return NULL; - } - p->data = (icmTag *)tp; - - /* Fill out our tag table entry */ - p->data[p->count].sig = sig; /* The tag signature */ - p->data[p->count].ttype = p->data[exi].ttype; /* The tag type signature */ - p->data[p->count].offset = p->data[exi].offset; /* Same offset (may not be allocated yet) */ - p->data[p->count].size = p->data[exi].size; /* Same size (may not be allocated yet) */ - p->data[p->count].objp = p->data[exi].objp; /* Shared object */ - p->data[exi].objp->refcount++; /* Bump reference count on tag type */ - p->count++; - - return p->data[exi].objp; -} - -/* Search for tag signature */ -/* return: */ -/* 0 if found */ -/* 1 if found but not handled type */ -/* 2 if not found */ -/* NOTE: doesn't set icc->errc or icc->err[] */ -/* NOTE: we don't handle tag duplication - you'll always get the first in the file. */ -static int icc_find_tag( - icc *p, - icTagSignature sig /* Tag signature - may be unknown */ -) { - int i,j; - - /* Search for signature */ - for (i = 0; i < p->count; i++) { - if (p->data[i].sig == sig) /* Found it */ - break; - } - if (i == p->count) - return 2; - - /* See if we can handle this type */ - for (j = 0; typetable[j].ttype != icMaxEnumType; j++) { - if (typetable[j].ttype == p->data[i].ttype) - break; - } - if (typetable[j].ttype == icMaxEnumType) - return 1; - - return 0; -} - -/* Read the tag element data, and return a pointer to the object */ -/** - * Returns NULL if error - icc->errc will contain: - * 1 if found but not handled type - * 2 if not found - **/ -/* NOTE: we don't handle tag duplication - you'll always get the first in the file */ -static icmBase *icc_read_tag( - icc *p, - icTagSignature sig /* Tag signature - may be unknown */ -) { - icmBase *nob; - int i,j,k; - - /* Search for signature */ - for (i = 0; i < p->count; i++) { - if (p->data[i].sig == sig) /* Found it */ - break; - } - if (i >= p->count) { - sprintf(p->err,"icc_read_tag: Tag '%s' not found",string_TagSignature(sig)); - p->errc = 2; - return NULL; - } - - /* See if it's already been read */ - if (p->data[i].objp != NULL) { - return p->data[i].objp; /* Just return it */ - } - - /* See if this should be a link */ - for (k = 0; k < p->count; k++) { - if (i == k) - continue; - if (p->data[i].ttype == p->data[k].ttype /* Exact match and already read */ - && p->data[i].offset == p->data[k].offset - && p->data[i].size == p->data[k].size - && p->data[k].objp != NULL) - break; - } - if (k < p->count) { /* Make this a link */ - p->data[i].objp = p->data[k].objp; - p->data[k].objp->refcount++; /* Bump reference count */ - return p->data[k].objp; /* Done */ - } - - /* See if we can handle this type */ - for (j = 0; typetable[j].ttype != icMaxEnumType; j++) { - if (typetable[j].ttype == p->data[i].ttype) - break; - } - if (typetable[j].ttype == icMaxEnumType) { - sprintf(p->err,"icc_read_tag: Unhandled tag type '%s'",string_TypeSignature(p->data[i].ttype)); - p->errc = 1; - return NULL; - } - - /* Creat and read in the object */ - if ((nob = typetable[j].new_obj(p)) == NULL) - return NULL; - if ((nob->read(nob, p->data[i].size, p->of + p->data[i].offset)) != 0) { - nob->del(nob); /* Failed, so destroy it */ - return NULL; - } - p->data[i].objp = nob; - return nob; -} - -/* Rename a tag signature */ -static int icc_rename_tag( - icc *p, - icTagSignature sig, /* Existing Tag signature - may be unknown */ - icTagSignature sigNew /* New Tag signature - may be unknown */ -) { - int i, j, k, ok = 1; - - /* Search for signature */ - for (k = 0; k < p->count; k++) { - if (p->data[k].sig == sig) /* Found it */ - break; - } - if (k >= p->count) { - sprintf(p->err,"icc_rename_tag: Tag '%s' not found",string_TagSignature(sig)); - return p->errc = 2; - } - - /* Check that a known new signature has an acceptable type */ - for (i = 0; sigtypetable[i].sig != icMaxEnumType; i++) { - if (sigtypetable[i].sig == sigNew) { /* recognized signature */ - ok = 0; - for (j = 0; sigtypetable[i].ttypes[j] != icMaxEnumType; j++) { - if (sigtypetable[i].ttypes[j] == p->data[k].ttype) /* recognized type */ - ok = 1; - } - break; - } - } - - if (!ok) { - sprintf(p->err,"icc_rename_tag: wrong signature for tag type"); - p->errc = 1; - return p->errc; - } - - /* change its signature */ - p->data[k].sig = sigNew; - - return 0; -} - -/* Unread the tag, and free the underlying tag type */ -/* if this was the last reference to it. */ -/* Returns non-zero on error: */ -/* tag not found - icc->errc will contain 2 */ -/* tag not read - icc->errc will contain 2 */ -static int icc_unread_tag( - icc *p, - icTagSignature sig /* Tag signature - may be unknown */ -) { - int i; - - /* Search for signature */ - for (i = 0; i < p->count; i++) { - if (p->data[i].sig == sig) /* Found it */ - break; - } - if (i >= p->count) { - sprintf(p->err,"icc_unread_tag: Tag '%s' not found",string_TagSignature(sig)); - return p->errc = 2; - } - - /* See if it's been read */ - if (p->data[i].objp == NULL) { - sprintf(p->err,"icc_unread_tag: Tag '%s' not currently loaded",string_TagSignature(sig)); - return p->errc = 2; - } - - if (--(p->data[i].objp->refcount) == 0) /* decrement reference count */ - (p->data[i].objp->del)(p->data[i].objp); /* Last reference */ - p->data[i].objp = NULL; - - return 0; -} - -/* Delete the tag, and free the underlying tag type */ -/* if this was the last reference to it. */ -/* Returns non-zero on error: */ -/* tag not found - icc->errc will contain 2 */ -static int icc_delete_tag( - icc *p, - icTagSignature sig /* Tag signature - may be unknown */ -) { - int i; - - /* Search for signature */ - for (i = 0; i < p->count; i++) { - if (p->data[i].sig == sig) /* Found it */ - break; - } - if (i >= p->count) { - sprintf(p->err,"icc_delete_tag: Tag '%s' not found",string_TagSignature(sig)); - return p->errc = 2; - } - - /* If it's been read into memory, decrement the reference count */ - if (p->data[i].objp != NULL) { - if (--(p->data[i].objp->refcount) == 0) /* decrement reference count */ - (p->data[i].objp->del)(p->data[i].objp); /* Last reference */ - p->data[i].objp = NULL; - } - - /* Now remove it from the tag list */ - for (; i < (p->count-1); i++) - p->data[i] = p->data[i+1]; /* Copy the structure down */ - - p->count--; /* One less tag in list */ - - return 0; -} - -/* Read all the tags into memory. */ -/* Returns non-zero on error. */ -static int icc_read_all_tags( - icc *p -) { - int i; - - for (i = 0; i < p->count; i++) { /* For all the tag element data */ - icmBase *ob; - if ((ob = p->read_tag(p, p->data[i].sig)) == NULL) { - return p->errc; - } - } - return 0; -} - -static void icc_dump( - icc *p, - FILE *op, /* Output to dump to */ - int verb /* Verbosity level */ -) { - int i; - if (verb <= 0) - return; - - fprintf(op,"icc:\n"); - - /* Dump the header */ - if (p->header != NULL) - p->header->dump(p->header,op,verb); - - /* Dump all the tag elements */ - for (i = 0; i < p->count; i++) { /* For all the tag element data */ - icmBase *ob; - int tr; - fprintf(op,"tag %d:\n",i); - fprintf(op," sig %s\n",tag2str(p->data[i].sig)); - fprintf(op," type %s\n",tag2str(p->data[i].ttype)); - fprintf(op," offset %d\n", p->data[i].offset); - fprintf(op," size %d\n", p->data[i].size); - tr = 0; - if ((ob = p->data[i].objp) == NULL) { - /* The object is not loaded, so load it then free it */ - if ((ob = p->read_tag(p, p->data[i].sig)) == NULL) { - fprintf(op,"Unable to read: %d, %s\n",p->errc,p->err); - } - tr = 1; - } - if (ob != NULL) { - /* fprintf(op," refcount %d\n", ob->refcount); */ - ob->dump(ob,op,verb-1); - - if (tr != 0) { /* Cleanup if temporary */ - ob->refcount--; - (ob->del)(ob); - p->data[i].objp = NULL; - } - } - fprintf(op,"\n"); - } -} - -static void icc_delete( - icc *p -) { - int i; - icmAlloc *al = p->al; - int del_al = p->del_al; - - /* Free up the header */ - if (p->header != NULL) - (p->header->del)(p->header); - - if (p->data != NULL) { - /* Free up the tag data objects */ - for (i = 0; i < p->count; i++) { - if (p->data[i].objp != NULL) { - if (--(p->data[i].objp->refcount) == 0) /* decrement reference count */ - (p->data[i].objp->del)(p->data[i].objp); /* Last reference */ - p->data[i].objp = NULL; - } - } - - /* Free tag table */ - al->free(al, p->data); - } - - /* This object */ - al->free(al, p); - - if (del_al) /* We are responsible for deleting allocator */ - al->del(al); -} - -/* ================================================== */ -/* Lut Color normalizing and de-normalizing functions */ - -/* As a rule, I am representing Lut in memory as values in machine form as real */ -/* numbers in the range 0.0 - 1.0. For many color spaces (ie. RGB, Gray, */ -/* hsv, hls, cmyk and other device coords), this is entirely appropriate. */ -/* For the PCS though, this is not correct, since (I assume!) the binary */ -/* representation will be consistent with the encoding in Annex A, page 74 */ -/* of the standard. Note that the standard doesn't specify the encoding of */ -/* many color spaces (ie. Yuv, Yxy etc.), and is unclear about PCS. */ - -/* The following functions convert to and from the PCS spaces (XYZ or Lab) */ -/* and the real Lut input/output values. These are used to convert real color */ -/* space values into/out of the raw lut 0.0-1.0 representation. */ - -/* This is used internally to support the Lut->lookup() function, */ -/* and can also be used by someone writing a Lut based profile to determine */ -/* the colorspace range that the input lut indexes cover, as well */ -/* as processing the output luts values into normalized form ready */ -/* for writing. */ - -/* These functions should be accessed by calling icc.getNormFuncs() */ - -/* - - - - - - - - - - - - - - - - */ -/* According to 6.5.5 and 6.5.6 of the spec., */ -/* XYZ index values are represented the same as their table */ -/* values, ie. as a u1.15 representation, with a value */ -/* range from 0.0 -> 1.999969482422 */ - -/* Convert Lut index/value to XYZ coord. */ -static void Lut_Lut2XYZ(double *out, double *in) { - out[0] = in[0] * (1.0 + 32767.0/32768); /* X */ - out[1] = in[1] * (1.0 + 32767.0/32768); /* Y */ - out[2] = in[2] * (1.0 + 32767.0/32768); /* Z */ -} - -/* Convert XYZ coord to Lut index/value. */ -static void Lut_XYZ2Lut(double *out, double *in) { - out[0] = in[0] * (1.0/(1.0 + 32767.0/32768)); - out[1] = in[1] * (1.0/(1.0 + 32767.0/32768)); - out[2] = in[2] * (1.0/(1.0 + 32767.0/32768)); -} - -/* - - - - - - - - - - - - - - - - */ -/* Convert Lab to Lut numbers */ -/* Annex A specifies 8 and 16 bit encoding, but is */ -/* silent on the Lut index normalization. */ -/* Following Michael Bourgoin's 1998 SIGGRAPH course comment on this, */ -/* we assume here that the index encoding is the same as the */ -/* value encoding. */ - -/* Convert Lut16 table index/value to Lab */ -static void Lut_Lut2Lab16(double *out, double *in) { - out[0] = in[0] * (100.0 * 65535.0)/65280.0; /* L */ - out[1] = (in[1] * (255.0 * 65535.0)/65280) - 128.0; /* a */ - out[2] = (in[2] * (255.0 * 65535.0)/65280) - 128.0; /* b */ -} - -/* Convert Lab to Lut16 table index/value */ -static void Lut_Lab2Lut16(double *out, double *in) { - out[0] = in[0] * 65280.0/(100.0 * 65535.0); /* L */ - out[1] = (in[1] + 128.0) * 65280.0/(255.0 * 65535.0); /* a */ - out[2] = (in[2] + 128.0) * 65280.0/(255.0 * 65535.0); /* b */ -} - -/* Convert Lut8 table index/value to Lab */ -static void Lut_Lut2Lab8(double *out, double *in) { - out[0] = in[0] * 100.0; /* L */ - out[1] = (in[1] * 255.0) - 128.0; /* a */ - out[2] = (in[2] * 255.0) - 128.0; /* b */ -} - -/* Convert Lab to Lut8 table index/value */ -static void Lut_Lab2Lut8(double *out, double *in) { - out[0] = in[0] * 1.0/100.0; /* L */ - out[1] = (in[1] + 128.0) * 1.0/255.0; /* a */ - out[2] = (in[2] + 128.0) * 1.0/255.0; /* b */ -} - -/* - - - - - - - - - - - - - - - - */ -/* Convert Luv to Lut number */ -/* This data normalization is taken from Apples */ -/* Colorsync specification. */ -/* As per other color spaces, we assume that the index */ -/* normalization is the same as the data normalization. */ - -/* Convert Lut table index/value to Luv */ -static void Lut_Lut2Luv(double *out, double *in) { - out[0] = in[0] * 100.0; /* L */ - out[1] = (in[1] * 65535.0/256.0) - 128.0; /* u */ - out[2] = (in[2] * 65535.0/256.0) - 128.0; /* v */ -} - -/* Convert Luv to Lut table index/value */ -static void Lut_Luv2Lut(double *out, double *in) { - out[0] = in[0] * 1.0/100.0; /* L */ - out[1] = (in[1] + 128.0) * 256.0/65535.0; /* u */ - out[2] = (in[2] + 128.0) * 256.0/65535.0; /* v */ -} - -/* - - - - - - - - - - - - - - - - */ -/* Default N component conversions */ -static void Lut_N(double *out, double *in, int nc) { - for (--nc; nc >= 0; nc--) - out[nc] = in[nc]; -} - -/* 1 */ -static void Lut_1(double *out, double *in) { - out[0] = in[0]; -} - -/* 2 */ -static void Lut_2(double *out, double *in) { - out[0] = in[0]; - out[1] = in[1]; -} - -/* 3 */ -static void Lut_3(double *out, double *in) { - out[0] = in[0]; - out[1] = in[1]; - out[2] = in[2]; -} - -/* 4 */ -static void Lut_4(double *out, double *in) { - out[0] = in[0]; - out[1] = in[1]; - out[2] = in[2]; - out[3] = in[3]; -} - -/* 5 */ -static void Lut_5(double *out, double *in) { - out[0] = in[0]; - out[1] = in[1]; - out[2] = in[2]; - out[3] = in[3]; - out[4] = in[4]; -} - -/* 6 */ -static void Lut_6(double *out, double *in) { - out[0] = in[0]; - out[1] = in[1]; - out[2] = in[2]; - out[3] = in[3]; - out[4] = in[4]; - out[5] = in[5]; -} - -/* 7 */ -static void Lut_7(double *out, double *in) { - Lut_N(out, in, 7); -} - -/* 8 */ -static void Lut_8(double *out, double *in) { - Lut_N(out, in, 8); -} - -/* 9 */ -static void Lut_9(double *out, double *in) { - Lut_N(out, in, 9); -} - -/* 10 */ -static void Lut_10(double *out, double *in) { - Lut_N(out, in, 10); -} - -/* 11 */ -static void Lut_11(double *out, double *in) { - Lut_N(out, in, 11); -} - -/* 12 */ -static void Lut_12(double *out, double *in) { - Lut_N(out, in, 12); -} - -/* 13 */ -static void Lut_13(double *out, double *in) { - Lut_N(out, in, 13); -} - -/* 14 */ -static void Lut_14(double *out, double *in) { - Lut_N(out, in, 14); -} - -/* 15 */ -static void Lut_15(double *out, double *in) { - Lut_N(out, in, 15); -} - -/* Function table - match conversions to color spaces. */ -/* Anything not here, we don't know how to convert. */ -/* (ie. YCbCr) */ -static struct { - icColorSpaceSignature csig; - void (*fromLut8)(double *out, double *in); /* 8 bit from Lut index/entry */ - void (*fromLut16)(double *out, double *in); /* 16 bit from Lut index/entry */ - void (*toLut8)(double *out, double *in); /* 8 bit to Lut index/entry */ - void (*toLut16)(double *out, double *in); /* 16 bit to Lut index/entry */ -} colnormtable[] = { - {icSigXYZData, NULL, Lut_Lut2XYZ, NULL, Lut_XYZ2Lut }, - {icSigLabData, Lut_Lut2Lab8, Lut_Lut2Lab16, Lut_Lab2Lut8, Lut_Lab2Lut16 }, - {icSigLuvData, Lut_Lut2Luv, Lut_Lut2Luv, Lut_Luv2Lut, Lut_Luv2Lut }, - {icSigYxyData, Lut_3, Lut_3, Lut_3, Lut_3 }, - {icSigRgbData, Lut_3, Lut_3, Lut_3, Lut_3 }, - {icSigGrayData, Lut_1, Lut_1, Lut_1, Lut_1 }, - {icSigHsvData, Lut_3, Lut_3, Lut_3, Lut_3 }, - {icSigHlsData, Lut_3, Lut_3, Lut_3, Lut_3 }, - {icSigCmykData, Lut_4, Lut_4, Lut_4, Lut_4 }, - {icSigCmyData, Lut_3, Lut_3, Lut_3, Lut_3 }, - {icSigMch6Data, Lut_6, Lut_6, Lut_6, Lut_6 }, - {icSig2colorData, Lut_2, Lut_2, Lut_2, Lut_2 }, - {icSig3colorData, Lut_3, Lut_3, Lut_3, Lut_3 }, - {icSig4colorData, Lut_4, Lut_4, Lut_4, Lut_4 }, - {icSig5colorData, Lut_5, Lut_5, Lut_5, Lut_5 }, - {icSig6colorData, Lut_6, Lut_6, Lut_6, Lut_6 }, - {icSig7colorData, Lut_7, Lut_7, Lut_7, Lut_7 }, - {icSig8colorData, Lut_8, Lut_8, Lut_8, Lut_8 }, - {icSig9colorData, Lut_9, Lut_9, Lut_9, Lut_9 }, - {icSig10colorData, Lut_10, Lut_10, Lut_10, Lut_10 }, - {icSig11colorData, Lut_11, Lut_11, Lut_11, Lut_11 }, - {icSig12colorData, Lut_12, Lut_12, Lut_12, Lut_12 }, - {icSig13colorData, Lut_13, Lut_13, Lut_13, Lut_13 }, - {icSig14colorData, Lut_14, Lut_14, Lut_14, Lut_14 }, - {icSig15colorData, Lut_15, Lut_15, Lut_15, Lut_15 }, - {icMaxEnumData, NULL, NULL, NULL, NULL } -}; - -/* Find appropriate conversion functions */ -/* given the color space and Lut type */ -/* Return 0 on success, 1 on match failure */ -/* NOTE: doesn't set error value, message etc.! */ -static int getNormFunc( - icColorSpaceSignature csig, - icTagTypeSignature tagSig, - icmNormFlag flag, - void (**nfunc)(double *out, double *in) -) { - int i; - for (i = 0; colnormtable[i].csig != icMaxEnumData; i++) { - if (colnormtable[i].csig == csig) - break; /* Found it */ - } - if (colnormtable[i].csig == icMaxEnumData) { /* Oops */ - *nfunc = NULL; - return 1; - } - - if (flag == icmFromLuti || flag == icmFromLutv) { /* Table index/value decoding functions */ - if (tagSig == icSigLut8Type) { - *nfunc = colnormtable[i].fromLut8; - return 0; - } else if (tagSig == icSigLut16Type) { - *nfunc = colnormtable[i].fromLut16; - return 0; - } else { - *nfunc = NULL; - return 1; - } - } else if (flag == icmToLuti || flag == icmToLutv) { /* Table index/value encoding functions */ - if (tagSig == icSigLut8Type) { - *nfunc = colnormtable[i].toLut8; - return 0; - } else if (tagSig == icSigLut16Type) { - *nfunc = colnormtable[i].toLut16; - return 0; - } else { - *nfunc = NULL; - return 1; - } - } else { - *nfunc = NULL; - return 1; - } - return 0; -} - -/* - - - - - - - - - - - - - - - - - - - - - - - - */ -/* Colorspace ranges - used instead of norm/denorm by Mono & Matrix */ - -/* Function table - match ranges to color spaces. */ -/* Anything not here, we don't know how to convert. */ -/* (ie. YCbCr) */ -static struct { - icColorSpaceSignature csig; - int same; /* Non zero if first entry applies to all channels */ - double min[15]; /* Minimum value for this colorspace */ - double max[15]; /* Maximum value for this colorspace */ -} colorrangetable[] = { - {icSigXYZData, 1, { 0.0 } , { 1.0 + 32767.0/32768.0 } }, - {icSigLabData, 0, { 0.0, -128.0, -128.0 }, - { 100.0 + 25500.0/65280.0, 127.0 + 255.0/256.0, 127.0 + 255.0/256.0 } }, - {icSigLuvData, 0, { 0.0, -128.0, -128.0 }, - { 100.0, 127.0 + 255.0/256.0, 127.0 + 255.0/256.0 } }, - {icSigYxyData, 1, { 0.0 }, { 1.0 } }, - {icSigRgbData, 1, { 0.0 }, { 1.0 } }, - {icSigGrayData, 1, { 0.0 }, { 1.0 } }, - {icSigHsvData, 1, { 0.0 }, { 1.0 } }, - {icSigHlsData, 1, { 0.0 }, { 1.0 } }, - {icSigCmykData, 1, { 0.0 }, { 1.0 } }, - {icSigCmyData, 1, { 0.0 }, { 1.0 } }, - {icSigMch6Data, 1, { 0.0 }, { 1.0 } }, - {icSig2colorData, 1, { 0.0 }, { 1.0 } }, - {icSig3colorData, 1, { 0.0 }, { 1.0 } }, - {icSig4colorData, 1, { 0.0 }, { 1.0 } }, - {icSig5colorData, 1, { 0.0 }, { 1.0 } }, - {icSig6colorData, 1, { 0.0 }, { 1.0 } }, - {icSig7colorData, 1, { 0.0 }, { 1.0 } }, - {icSig8colorData, 1, { 0.0 }, { 1.0 } }, - {icSig9colorData, 1, { 0.0 }, { 1.0 } }, - {icSig10colorData, 1, { 0.0 }, { 1.0 } }, - {icSig11colorData, 1, { 0.0 }, { 1.0 } }, - {icSig12colorData, 1, { 0.0 }, { 1.0 } }, - {icSig13colorData, 1, { 0.0 }, { 1.0 } }, - {icSig14colorData, 1, { 0.0 }, { 1.0 } }, - {icSig15colorData, 1, { 0.0 }, { 1.0 } }, - {icMaxEnumData } -}; - -/* Find appropriate typical encoding ranges for a */ -/* colorspace given the color space. */ -/* Return 0 on success, 1 on match failure */ -static int getRange( - icColorSpaceSignature csig, - double *min, double *max -) { - int i, e, ee; - for (i = 0; colorrangetable[i].csig != icMaxEnumData; i++) { - if (colorrangetable[i].csig == csig) - break; /* Found it */ - } - if (colorrangetable[i].csig == icMaxEnumData) { /* Oops */ - return 1; - } - ee = number_ColorSpaceSignature(csig); /* Get number of components */ - - if (colorrangetable[i].same) { /* All channels are the same */ - for (e = 0; e < ee; e++) { - if (min != NULL) - min[e] = colorrangetable[i].min[0]; - if (max != NULL) - max[e] = colorrangetable[i].max[0]; - } - } else { - for (e = 0; e < ee; e++) { - if (min != NULL) - min[e] = colorrangetable[i].min[e]; - if (max != NULL) - max[e] = colorrangetable[i].max[e]; - } - } - return 0; -} - -/* - - - - - - - - - - - - - - - - - - - - - - - - */ - -/* - Matrix Inversion - by Richard Carling - from "Graphics Gems", Academic Press, 1990 -*/ - -/* - * adjoint( original_matrix, inverse_matrix ) - * - * calculate the adjoint of a 3x3 matrix - * - * Let a denote the minor determinant of matrix A obtained by - * ij - * - * deleting the ith row and jth column from A. - * - * i+j - * Let b = (-1) a - * ij ji - * - * The matrix B = (b ) is the adjoint of A - * ij - */ - -#define det2x2(a, b, c, d) (a * d - b * c) - -static void adjoint( -double out[3][3], -double in[3][3] -) { - double a1, a2, a3, b1, b2, b3, c1, c2, c3; - - /* assign to individual variable names to aid */ - /* selecting correct values */ - - a1 = in[0][0]; b1 = in[0][1]; c1 = in[0][2]; - a2 = in[1][0]; b2 = in[1][1]; c2 = in[1][2]; - a3 = in[2][0]; b3 = in[2][1]; c3 = in[2][2]; - - /* row column labeling reversed since we transpose rows & columns */ - - out[0][0] = det2x2(b2, b3, c2, c3); - out[1][0] = - det2x2(a2, a3, c2, c3); - out[2][0] = det2x2(a2, a3, b2, b3); - - out[0][1] = - det2x2(b1, b3, c1, c3); - out[1][1] = det2x2(a1, a3, c1, c3); - out[2][1] = - det2x2(a1, a3, b1, b3); - - out[0][2] = det2x2(b1, b2, c1, c2); - out[1][2] = - det2x2(a1, a2, c1, c2); - out[2][2] = det2x2(a1, a2, b1, b2); -} - -/* - * double = det3x3( a1, a2, a3, b1, b2, b3, c1, c2, c3 ) - * - * calculate the determinant of a 3x3 matrix - * in the form - * - * | a1, b1, c1 | - * | a2, b2, c2 | - * | a3, b3, c3 | - */ - -static double det3x3(double in[3][3]) { - double a1, a2, a3, b1, b2, b3, c1, c2, c3; - double ans; - - a1 = in[0][0]; b1 = in[0][1]; c1 = in[0][2]; - a2 = in[1][0]; b2 = in[1][1]; c2 = in[1][2]; - a3 = in[2][0]; b3 = in[2][1]; c3 = in[2][2]; - - ans = a1 * det2x2(b2, b3, c2, c3) - - b1 * det2x2(a2, a3, c2, c3) - + c1 * det2x2(a2, a3, b2, b3); - return ans; -} - -#define SMALL_NUMBER 1.e-8 -/* - * inverse( original_matrix, inverse_matrix ) - * - * calculate the inverse of a 4x4 matrix - * - * -1 - * A = ___1__ adjoint A - * det A - */ - -/* Return non-zero if not invertable */ -static int inverse3x3( -double out[3][3], -double in[3][3] -) { - int i, j; - double det; - - /* calculate the 3x3 determinant - * if the determinant is zero, - * then the inverse matrix is not unique. - */ - det = det3x3(in); - - if ( fabs(det) < SMALL_NUMBER) - return 1; - - /* calculate the adjoint matrix */ - adjoint(out, in); - - /* scale the adjoint matrix to get the inverse */ - for (i = 0; i < 3; i++) - for(j = 0; j < 3; j++) - out[i][j] /= det; - return 0; -} - -/* - - - - - - - - - - - - - - - - - - - - - - - - */ - -/* Multuply XYZ array by 3x3 transform matrix */ -static void icmMulBy3x3(double out[3], double mat[3][3], double in[3]) { - double tt[3]; - - tt[0] = mat[0][0] * in[0] + mat[0][1] * in[1] + mat[0][2] * in[2]; - tt[1] = mat[1][0] * in[0] + mat[1][1] * in[1] + mat[1][2] * in[2]; - tt[2] = mat[2][0] * in[0] + mat[2][1] * in[1] + mat[2][2] * in[2]; - - out[0] = tt[0]; - out[1] = tt[1]; - out[2] = tt[2]; -} - -/* - - - - - - - - - - - - - - - - - - - - - - - - */ -/* CIE XYZ to perceptual Lab */ -void -icmXYZ2Lab(icmXYZNumber *w, double *out, double *in) { - double X = in[0], Y = in[1], Z = in[2]; - double x,y,z,fx,fy,fz; - double L; - - x = X/w->X; - if (x > 0.008856451586) - fx = pow(x,1.0/3.0); - else - fx = 7.787036979 * x + 16.0/116.0; - - y = Y/w->Y; - if (y > 0.008856451586) { - fy = pow(y,1.0/3.0); - L = 116.0 * fy - 16.0; - } else { - fy = 7.787036979 * y + 16.0/116.0; - L = 903.2963058 * y; - } - - z = Z/w->Z; - if (z > 0.008856451586) - fz = pow(z,1.0/3.0); - else - fz = 7.787036979 * z + 16.0/116.0; - - out[0] = L; - out[1] = 500.0 * (fx - fy); - out[2] = 200.0 * (fy - fz); -} - -/* Perceptual Lab to CIE XYZ */ -void -icmLab2XYZ(icmXYZNumber *w, double *out, double *in) { - double L = in[0], a = in[1], b = in[2]; - double x,y,z,fx,fy,fz; - - if (L > 8.0) { - fy = (L + 16.0)/116.0; - y = pow(fy,3.0); - } else { - y = L/903.2963058; - fy = 7.787036979 * y + 16.0/116.0; - } - - fx = a/500.0 + fy; - if (fx > 24.0/116.0) - x = pow(fx,3.0); - else - x = (fx - 16.0/116.0)/7.787036979; - - fz = fy - b/200.0; - if (fz > 24.0/116.0) - z = pow(fz,3.0); - else - z = (fz - 16.0/116.0)/7.787036979; - - out[0] = x * w->X; - out[1] = y * w->Y; - out[2] = z * w->Z; -} - -/* available D50 Illuminant */ -icmXYZNumber icmD50 = { /* Profile illuminant - D50 */ - 0.9642, 1.0000, 0.8249 -}; - -/* available D65 Illuminant */ -icmXYZNumber icmD65 = { /* Profile illuminant - D65 */ - 0.9505, 1.0000, 1.0890 -}; - -/* Default black point */ -icmXYZNumber icmBlack = { - 0.0000, 0.0000, 0.0000 -}; - -/* Return the normal Delta E given two Lab values */ -double icmLabDE(double *Lab1, double *Lab2) { - double rv = 0.0, tt; - - tt = Lab1[0] - Lab2[0]; - rv += tt * tt; - tt = Lab1[1] - Lab2[1]; - rv += tt * tt; - tt = Lab1[2] - Lab2[2]; - rv += tt * tt; - - return sqrt(rv); -} - -/* Return the normal Delta E squared, given two Lab values */ -double icmLabDEsq(double *Lab1, double *Lab2) { - double rv = 0.0, tt; - - tt = Lab1[0] - Lab2[0]; - rv += tt * tt; - tt = Lab1[1] - Lab2[1]; - rv += tt * tt; - tt = Lab1[2] - Lab2[2]; - rv += tt * tt; - - return rv; -} - -/* Return the CIE94 Delta E color difference measure */ -double icmCIE94(double Lab1[3], double Lab2[3]) { - double desq, dhsq; - double dlsq, dcsq; - double c12; - - { - double dl, da, db; - dl = Lab1[0] - Lab2[0]; - dlsq = dl * dl; /* dl squared */ - da = Lab1[1] - Lab2[1]; - db = Lab1[2] - Lab2[2]; - - /* Compute normal Lab delta E squared */ - desq = dlsq + da * da + db * db; - } - - { - double c1, c2, dc; - - /* Compute chromanance for the two colors */ - c1 = sqrt(Lab1[1] * Lab1[1] + Lab1[2] * Lab1[2]); - c2 = sqrt(Lab2[1] * Lab2[1] + Lab2[2] * Lab2[2]); - c12 = sqrt(c1 * c2); /* Symetric chromanance */ - - /* delta chromanance squared */ - dc = c2 - c1; - dcsq = dc * dc; - } - - /* Compute delta hue squared */ - if ((dhsq = desq - dlsq - dcsq) < 0.0) - dhsq = 0.0; - - { - double sc, sh; - - /* Weighting factors for delta chromanance & delta hue */ - sc = 1.0 + 0.048 * c12; - sh = 1.0 + 0.014 * c12; - - return sqrt(dlsq + dcsq/(sc * sc) + dhsq/(sh * sh)); - } -} - -/* Return the CIE94 Delta E color difference measure, squared */ -double icmCIE94sq(double Lab1[3], double Lab2[3]) { - double desq, dhsq; - double dlsq, dcsq; - double c12; - - { - double dl, da, db; - dl = Lab1[0] - Lab2[0]; - dlsq = dl * dl; /* dl squared */ - da = Lab1[1] - Lab2[1]; - db = Lab1[2] - Lab2[2]; - - /* Compute normal Lab delta E squared */ - desq = dlsq + da * da + db * db; - } - - { - double c1, c2, dc; - - /* Compute chromanance for the two colors */ - c1 = sqrt(Lab1[1] * Lab1[1] + Lab1[2] * Lab1[2]); - c2 = sqrt(Lab2[1] * Lab2[1] + Lab2[2] * Lab2[2]); - c12 = sqrt(c1 * c2); /* Symetric chromanance */ - - /* delta chromanance squared */ - dc = c2 - c1; - dcsq = dc * dc; - } - - /* Compute delta hue squared */ - if ((dhsq = desq - dlsq - dcsq) < 0.0) - dhsq = 0.0; - - { - double sc, sh; - - /* Weighting factors for delta chromanance & delta hue */ - sc = 1.0 + 0.048 * c12; - sh = 1.0 + 0.014 * c12; - - return dlsq + dcsq/(sc * sc) + dhsq/(sh * sh); - } -} - -/* - - - - - - - - - - - - - - - - - - - - - - - - */ - -/* Multiply one 3x3 with another */ -static void mul3x3(double dst[3][3], double src[3][3]) { - int i, j, k; - double td[3][3]; /* Temporary dest */ - - for (j = 0; j < 3; j++) { - for (i = 0; i < 3; i++) { - double tt = 0.0; - for (k = 0; k < 3; k++) - tt += src[j][k] * dst[k][i]; - td[j][i] = tt; - } - } - - /* Copy result out */ - for (j = 0; j < 3; j++) - for (i = 0; i < 3; i++) - dst[j][i] = td[j][i]; -} - -/* Chrmatic Adaption transform utility */ -/* Return a 3x3 chromatic adaption matrix */ -void icmChromAdaptMatrix( - int flags, - icmXYZNumber d_wp, /* Destination white point */ - icmXYZNumber s_wp, /* Source white point */ - double mat[3][3] /* Destination matrix */ -) { - double dst[3], src[3]; /* Source & destination white points */ - double vkmat[3][3]; /* Von Kries matrix */ - double bradford[3][3] = { /* Bradford cone space matrix */ - { 0.8951, 0.2664, -0.1614 }, - { -0.7502, 1.7135, 0.0367 }, - { 0.0389, -0.0685, 1.0296 } - }; - double ibradford[3][3]; /* Inverse Bradford */ - - /* Set initial matrix to unity */ - if (!(flags & ICM_CAM_MULMATRIX)) { - mat[0][0] = mat[1][1] = mat[2][2] = 1.0; - mat[0][1] = mat[0][2] = 0.0; - mat[1][0] = mat[1][2] = 0.0; - mat[2][0] = mat[2][1] = 0.0; - } - - icmXYZ2Ary(src, s_wp); - icmXYZ2Ary(dst, d_wp); - - if (flags & ICM_CAM_BRADFORD) { - icmMulBy3x3(src, bradford, src); - icmMulBy3x3(dst, bradford, dst); - } - - /* Setup the Von Kries white point adaption matrix */ - vkmat[0][0] = dst[0]/src[0]; - vkmat[1][1] = dst[1]/src[1]; - vkmat[2][2] = dst[2]/src[2]; - vkmat[0][1] = vkmat[0][2] = 0.0; - vkmat[1][0] = vkmat[1][2] = 0.0; - vkmat[2][0] = vkmat[2][1] = 0.0; - - /* Transform to Bradford space if requested */ - if (flags & ICM_CAM_BRADFORD) { - mul3x3(mat, bradford); - } - - /* Apply chromatic adaption */ - mul3x3(mat, vkmat); - - /* Transform from Bradford space */ - if (flags & ICM_CAM_BRADFORD) { - inverse3x3(ibradford, bradford); - mul3x3(mat, ibradford); - } - - /* We're done */ -} - -/* - - - - - - - - - - - - - - - - - - - - - - - - */ - -/* Return information about the native lut in/out colorspaces. */ -/* Any pointer may be NULL if value is not to be returned */ -static void -icmLutSpaces( - struct _icmLuBase *p, /* This */ - icColorSpaceSignature *ins, /* Return Native input color space */ - int *inn, /* Return number of input components */ - icColorSpaceSignature *outs, /* Return Native output color space */ - int *outn /* Return number of output components */ -) { - if (ins != NULL) - *ins = p->inSpace; - if (inn != NULL) - *inn = (int)number_ColorSpaceSignature(p->inSpace); - - if (outs != NULL) - *outs = p->outSpace; - if (outn != NULL) - *outn = (int)number_ColorSpaceSignature(p->outSpace); -} - -/* Return information about the effective lookup in/out colorspaces, */ -/* including allowance for PCS overide. */ -/* Any pointer may be NULL if value is not to be returned */ -static void -icmLuSpaces( - struct _icmLuBase *p, /* This */ - icColorSpaceSignature *ins, /* Return effective input color space */ - int *inn, /* Return number of input components */ - icColorSpaceSignature *outs, /* Return effective output color space */ - int *outn, /* Return number of output components */ - icmLuAlgType *alg, /* Return type of lookup algorithm used */ - icRenderingIntent *intt, /* Return the intent being implented */ - icmLookupFunc *fnc, /* Return the profile function being implemented */ - icColorSpaceSignature *pcs /* Return the profile effective PCS */ -) { - if (ins != NULL) - *ins = p->e_inSpace; - if (inn != NULL) - *inn = (int)number_ColorSpaceSignature(p->e_inSpace); - - if (outs != NULL) - *outs = p->e_outSpace; - if (outn != NULL) - *outn = (int)number_ColorSpaceSignature(p->e_outSpace); - - if (alg != NULL) - *alg = p->ttype; - - if (intt != NULL) - *intt = p->intent; - - if (fnc != NULL) - *fnc = p->function; - - if (pcs != NULL) - *pcs = p->e_pcs; -} - -/* Return the media white and black points in XYZ space. */ -/* Note that if not in the icc, the black point will be returned as 0, 0, 0 */ -/* Any pointer may be NULL if value is not to be returned */ -static void icmLuWh_bk_points( -struct _icmLuBase *p, -icmXYZNumber *wht, -icmXYZNumber *blk -) { - if (wht != NULL) - *wht = p->whitePoint; /* Structure copy */ - - if (blk != NULL) - *blk = p->blackPoint; /* Structure copy */ -} - -/* Get the effective (externally visible) ranges for the Monochrome or Matrix profile */ -/* Arguments may be NULL */ -static void -icmLu_get_ranges ( - struct _icmLuBase *p, - double *inmin, double *inmax, /* Return maximum range of inspace values */ - double *outmin, double *outmax /* Return maximum range of outspace values */ -) { - /* Hmm. we have no way of handlin an error from getRange. */ - /* It shouldn't ever return one unless there is a mismatch between */ - /* getRange and Lu creation... */ - getRange(p->e_inSpace, inmin, inmax); - getRange(p->e_outSpace, outmin, outmax); -} - -/* - - - - - - - - - - - - - - - - - - - - - - - - */ -/* Forward and Backward Monochrome type conversion */ -/* Return 0 on success, 1 if clipping occured, 2 on other error */ - -/* Individual components of Fwd conversion: */ - -/* Actual device to linearised device */ -static int -icmLuMonoFwd_curve ( -icmLuMono *p, /* This */ -double *out, /* Vector of output values */ -double *in /* Vector of input values */ -) { - icc *icp = p->icp; - int rv = 0; - - /* Translate from device to PCS scale */ - if ((rv |= p->grayCurve->lookup_fwd(p->grayCurve,&out[0],&in[0])) > 1) { - sprintf(icp->err,"icc_lookup: Curve->lookup_fwd() failed"); - icp->errc = rv; - return 2; - } - - return rv; -} - -/* Linearised device to relative PCS */ -static int -icmLuMonoFwd_map ( -icmLuMono *p, /* This */ -double *out, /* Vector of output values (native space) */ -double *in /* Vector of input values (native space) */ -) { - int rv = 0; - double Y = in[0]; /* In case out == in */ - - out[0] = p->pcswht.X; - out[1] = p->pcswht.Y; - out[2] = p->pcswht.Z; - if (p->pcs == icSigLabData) - icmXYZ2Lab(&p->pcswht, out, out); /* in Lab */ - - /* Scale linearized device level to PCS white */ - out[0] *= Y; - out[1] *= Y; - out[2] *= Y; - - return rv; -} - -/* relative PCS to absolute PCS (if required) */ -static int -icmLuMonoFwd_abs ( /* Abs comes last in Fwd conversion */ -icmLuMono *p, /* This */ -double *out, /* Vector of output values in Effective PCS */ -double *in /* Vector of input values in Native PCS */ -) { - int rv = 0; - - if (out != in) { - int i; - for (i = 0; i < 3; i++) /* Don't alter input values */ - out[i] = in[i]; - } - - /* Do absolute conversion */ - if (p->intent == icAbsoluteColorimetric) { - - if (p->pcs == icSigLabData) /* Convert L to Y */ - icmLab2XYZ(&p->pcswht, out, out); - - /* Convert from Relative to Absolute colorometric */ - icmMulBy3x3(out, p->toAbs, out); - - if (p->e_pcs == icSigLabData) - icmXYZ2Lab(&p->pcswht, out, out); - - } else { - - /* Convert from Native to Effective output space */ - if (p->pcs == icSigLabData && p->e_pcs == icSigXYZData) - icmLab2XYZ(&p->pcswht, out, out); - else if (p->pcs == icSigXYZData && p->e_pcs == icSigLabData) - icmXYZ2Lab(&p->pcswht, out, out); - } - - return rv; -} - -/* Overall Fwd conversion routine */ -static int -icmLuMonoFwd_lookup ( -icmLuBase *pp, /* This */ -double *out, /* Vector of output values */ -double *in /* Input value */ -) { - int rv = 0; - icmLuMono *p = (icmLuMono *)pp; - rv |= icmLuMonoFwd_curve(p, out, in); - rv |= icmLuMonoFwd_map(p, out, out); - rv |= icmLuMonoFwd_abs(p, out, out); - return rv; -} - -/* Individual components of Bwd conversion: */ - -/* Convert from relative PCS to absolute PCS (if required) */ -static int -icmLuMonoBwd_abs ( /* Abs comes first in Bwd conversion */ -icmLuMono *p, /* This */ -double *out, /* Vector of output values in Native PCS */ -double *in /* Vector of input values in Effective PCS */ -) { - int rv = 0; - - if (out != in) { - int i; - for (i = 0; i < 3; i++) /* Don't alter input values */ - out[i] = in[i]; - } - - /* Force to monochrome locus in correct space */ - if (p->e_pcs == icSigLabData) { - double wp[3]; - - if (p->intent == icAbsoluteColorimetric) { - wp[0] = p->whitePoint.X; - wp[1] = p->whitePoint.Y; - wp[2] = p->whitePoint.Z; - } else { - wp[0] = p->pcswht.X; - wp[1] = p->pcswht.Y; - wp[2] = p->pcswht.Z; - } - icmXYZ2Lab(&p->pcswht, wp, wp); /* Convert to Lab white point */ - out[1] = out[0]/wp[0] * wp[1]; - out[2] = out[0]/wp[0] * wp[2]; - - } else { - if (p->intent == icAbsoluteColorimetric) { - out[0] = out[1]/p->whitePoint.Y * p->whitePoint.X; - out[2] = out[1]/p->whitePoint.Y * p->whitePoint.Z; - } else { - out[0] = out[1]/p->pcswht.Y * p->pcswht.X; - out[2] = out[1]/p->pcswht.Y * p->pcswht.Z; - } - } - - /* Do absolute conversion to */ - if (p->intent == icAbsoluteColorimetric) { - - if (p->e_pcs == icSigLabData) - icmLab2XYZ(&p->pcswht, out, out); - - icmMulBy3x3(out, p->fromAbs, out); - - /* Convert from Effective to Native input space */ - if (p->pcs == icSigLabData) - icmXYZ2Lab(&p->pcswht, out, out); - - } else { - - /* Convert from Effective to Native input space */ - if (p->e_pcs == icSigLabData && p->pcs == icSigXYZData) - icmLab2XYZ(&p->pcswht, out, out); - else if (p->e_pcs == icSigXYZData && p->pcs == icSigLabData) - icmXYZ2Lab(&p->pcswht, out, out); - } - - return rv; -} - -/* Map from relative PCS to linearised device */ -static int -icmLuMonoBwd_map ( -icmLuMono *p, /* This */ -double *out, /* Output value */ -double *in /* Vector of input values (native space) */ -) { - int rv = 0; - double pcsw[3]; - - pcsw[0] = p->pcswht.X; - pcsw[1] = p->pcswht.Y; - pcsw[2] = p->pcswht.Z; - if (p->pcs == icSigLabData) - icmXYZ2Lab(&p->pcswht, pcsw, pcsw); /* in Lab (should be 100.0!) */ - - /* Divide linearized device level into PCS white luminence */ - if (p->pcs == icSigLabData) - out[0] = in[0]/pcsw[0]; - else - out[0] = in[1]/pcsw[1]; - - return rv; -} - -/* Map from linearised device to actual device */ -static int -icmLuMonoBwd_curve ( -icmLuMono *p, /* This */ -double *out, /* Output value */ -double *in /* Input value */ -) { - icc *icp = p->icp; - int rv = 0; - - /* Convert to device value through curve */ - if ((rv = p->grayCurve->lookup_bwd(p->grayCurve,&out[0],&in[0])) > 1) { - sprintf(icp->err,"icc_lookup: Curve->lookup_bwd() failed"); - icp->errc = rv; - return 2; - } - - return rv; -} - -/* Overall Bwd conversion routine */ -static int -icmLuMonoBwd_lookup ( -icmLuBase *pp, /* This */ -double *out, /* Output value */ -double *in /* Vector of input values */ -) { - double temp[3]; - int rv = 0; - icmLuMono *p = (icmLuMono *)pp; - rv |= icmLuMonoBwd_abs(p, temp, in); - rv |= icmLuMonoBwd_map(p, out, temp); - rv |= icmLuMonoBwd_curve(p, out, out); - return rv; -} - -static void -icmLuMono_delete( -icmLuBase *p -) { - icc *icp = p->icp; - - icp->al->free(icp->al, p); -} - -static icmLuBase * -new_icmLuMono( - struct _icc *icp, - icColorSpaceSignature inSpace, /* Native Input color space */ - icColorSpaceSignature outSpace, /* Native Output color space */ - icColorSpaceSignature pcs, /* Native PCS */ - icColorSpaceSignature e_inSpace, /* Effective Input color space */ - icColorSpaceSignature e_outSpace, /* Effective Output color space */ - icColorSpaceSignature e_pcs, /* Effective PCS */ - icmXYZNumber whitePoint, /* Profile absolute white point */ - icmXYZNumber blackPoint, /* Profile absolute black point */ - icRenderingIntent intent, /* Rendering intent */ - icmLookupFunc func, /* Functionality requested */ - int dir /* 0 = fwd, 1 = bwd */ -) { - icmLuMono *p; - - if ((p = (icmLuMono *) icp->al->calloc(icp->al,1,sizeof(icmLuMono))) == NULL) - return NULL; - p->icp = icp; - p->del = icmLuMono_delete; - p->lutspaces= icmLutSpaces; - p->spaces = icmLuSpaces; - p->get_ranges = icmLu_get_ranges; - p->wh_bk_points = icmLuWh_bk_points; - p->fwd_lookup = icmLuMonoFwd_lookup; - p->fwd_curve = icmLuMonoFwd_curve; - p->fwd_map = icmLuMonoFwd_map; - p->fwd_abs = icmLuMonoFwd_abs; - p->bwd_lookup = icmLuMonoBwd_lookup; - p->bwd_abs = icmLuMonoFwd_abs; - p->bwd_map = icmLuMonoFwd_map; - p->bwd_curve = icmLuMonoFwd_curve; - if (dir) { - p->ttype = icmMonoBwdType; - p->lookup = icmLuMonoBwd_lookup; - } else { - p->ttype = icmMonoFwdType; - p->lookup = icmLuMonoFwd_lookup; - } - - /* See if the color spaces are appropriate for the mono type */ - if (number_ColorSpaceSignature(icp->header->colorSpace) != 1 - || ( icp->header->pcs != icSigXYZData && icp->header->pcs != icSigLabData)) { - p->del((icmLuBase *)p); - return NULL; - } - - /* Find the appropriate tags */ - if ((p->grayCurve = (icmCurve *)icp->read_tag(icp, icSigGrayTRCTag)) == NULL - || p->grayCurve->ttype != icSigCurveType) { - p->del((icmLuBase *)p); - return NULL; - } - - p->pcswht = icp->header->illuminant; - p->whitePoint = whitePoint; - p->blackPoint = blackPoint; - p->intent = intent; - p->function = func; - p->inSpace = inSpace; - p->outSpace = outSpace; - p->pcs = pcs; - p->e_inSpace = e_inSpace; - p->e_outSpace = e_outSpace; - p->e_pcs = e_pcs; - - /* Create absolute <-> relative conversion matricies */ - icmChromAdaptMatrix(ICM_CAM_BRADFORD, whitePoint, icmD50, p->toAbs); - icmChromAdaptMatrix(ICM_CAM_BRADFORD, icmD50, whitePoint, p->fromAbs); - - return (icmLuBase *)p; -} - -static icmLuBase * -new_icmLuMonoFwd( - struct _icc *icp, - icColorSpaceSignature inSpace, /* Native Input color space */ - icColorSpaceSignature outSpace, /* Native Output color space */ - icColorSpaceSignature pcs, /* Native PCS */ - icColorSpaceSignature e_inSpace, /* Effective Input color space */ - icColorSpaceSignature e_outSpace, /* Effective Output color space */ - icColorSpaceSignature e_pcs, /* Effective PCS */ - icmXYZNumber whitePoint, /* Profile absolute white point */ - icmXYZNumber blackPoint, /* Profile absolute black point */ - icRenderingIntent intent, /* Rendering intent */ - icmLookupFunc func /* Functionality requested */ -) { - return new_icmLuMono(icp, inSpace, outSpace, pcs, e_inSpace, e_outSpace, e_pcs, - whitePoint, blackPoint, intent, func, 0); -} - -static icmLuBase * -new_icmLuMonoBwd( - struct _icc *icp, - icColorSpaceSignature inSpace, /* Native Input color space */ - icColorSpaceSignature outSpace, /* Native Output color space */ - icColorSpaceSignature pcs, /* Native PCS */ - icColorSpaceSignature e_inSpace, /* Effective Input color space */ - icColorSpaceSignature e_outSpace, /* Effective Output color space */ - icColorSpaceSignature e_pcs, /* Effective PCS */ - icmXYZNumber whitePoint, /* Profile absolute white point */ - icmXYZNumber blackPoint, /* Profile absolute black point */ - icRenderingIntent intent, /* Rendering intent */ - icmLookupFunc func /* Functionality requested */ -) { - return new_icmLuMono(icp, inSpace, outSpace, pcs, e_inSpace, e_outSpace, e_pcs, - whitePoint, blackPoint, intent, func, 1); -} - -/* - - - - - - - - - - - - - - - - - - - - - - - */ -/* Forward and Backward Matrix type conversion */ -/* Return 0 on success, 1 if clipping occured, 2 on other error */ - -/* Individual components of Fwd conversion: */ -static int -icmLuMatrixFwd_curve ( -icmLuMatrix *p, /* This */ -double *out, /* Vector of output values */ -double *in /* Vector of input values */ -) { - icc *icp = p->icp; - int rv = 0; - - /* Curve lookups */ - if ((rv |= p->redCurve->lookup_fwd( p->redCurve, &out[0],&in[0])) > 1 - || (rv |= p->greenCurve->lookup_fwd(p->greenCurve,&out[1],&in[1])) > 1 - || (rv |= p->blueCurve->lookup_fwd( p->blueCurve, &out[2],&in[2])) > 1) { - sprintf(icp->err,"icc_lookup: Curve->lookup_fwd() failed"); - icp->errc = rv; - return 2; - } - - return rv; -} - -static int -icmLuMatrixFwd_matrix ( -icmLuMatrix *p, /* This */ -double *out, /* Vector of output values */ -double *in /* Vector of input values */ -) { - int rv = 0; - double tt[3]; - - /* Matrix */ - tt[0] = p->mx[0][0] * in[0] + p->mx[0][1] * in[1] + p->mx[0][2] * in[2]; - tt[1] = p->mx[1][0] * in[0] + p->mx[1][1] * in[1] + p->mx[1][2] * in[2]; - tt[2] = p->mx[2][0] * in[0] + p->mx[2][1] * in[1] + p->mx[2][2] * in[2]; - - out[0] = tt[0]; - out[1] = tt[1]; - out[2] = tt[2]; - - return rv; -} - -static int -icmLuMatrixFwd_abs (/* Abs comes last in Fwd conversion */ -icmLuMatrix *p, /* This */ -double *out, /* Vector of output values */ -double *in /* Vector of input values */ -) { - int rv = 0; - - if (out != in) { - int i; - for (i = 0; i < 3; i++) /* Don't alter input values */ - out[i] = in[i]; - } - - /* If required, convert from Relative to Absolute colorometric */ - if (p->intent == icAbsoluteColorimetric) { - icmMulBy3x3(out, p->toAbs, out); - } - - /* If e_pcs is Lab, then convert XYZ to Lab */ - if (p->e_pcs == icSigLabData) - icmXYZ2Lab(&p->pcswht, out, out); - - return rv; -} - -/* Overall Fwd conversion */ -static int -icmLuMatrixFwd_lookup ( -icmLuBase *pp, /* This */ -double *out, /* Vector of output values */ -double *in /* Vector of input values */ -) { - int rv = 0; - icmLuMatrix *p = (icmLuMatrix *)pp; - rv |= icmLuMatrixFwd_curve(p, out, in); - rv |= icmLuMatrixFwd_matrix(p, out, out); - rv |= icmLuMatrixFwd_abs(p, out, out); - return rv; -} - -/* Individual components of Bwd conversion: */ - -static int -icmLuMatrixBwd_abs (/* Abs comes first in Bwd conversion */ -icmLuMatrix *p, /* This */ -double *out, /* Vector of output values */ -double *in /* Vector of input values */ -) { - int rv = 0; - - if (out != in) { - int i; - for (i = 0; i < 3; i++) /* Don't alter input values */ - out[i] = in[i]; - } - - /* If e_pcs is Lab, then convert Lab to XYZ */ - if (p->e_pcs == icSigLabData) - icmLab2XYZ(&p->pcswht, out, out); - - /* If required, convert from Absolute to Relative colorometric */ - if (p->intent == icAbsoluteColorimetric) { - icmMulBy3x3(out, p->fromAbs, out); - } - - return rv; -} - -static int -icmLuMatrixBwd_matrix ( -icmLuMatrix *p, /* This */ -double *out, /* Vector of output values */ -double *in /* Vector of input values */ -) { - int rv = 0; - double tt[3]; - - /* Matrix */ - tt[0] = p->bmx[0][0] * in[0] + p->bmx[0][1] * in[1] + p->bmx[0][2] * in[2]; - tt[1] = p->bmx[1][0] * in[0] + p->bmx[1][1] * in[1] + p->bmx[1][2] * in[2]; - tt[2] = p->bmx[2][0] * in[0] + p->bmx[2][1] * in[1] + p->bmx[2][2] * in[2]; - - out[0] = tt[0]; - out[1] = tt[1]; - out[2] = tt[2]; - - return rv; -} - -static int -icmLuMatrixBwd_curve ( -icmLuMatrix *p, /* This */ -double *out, /* Vector of output values */ -double *in /* Vector of input values */ -) { - icc *icp = p->icp; - int rv = 0; - - /* Curves */ - if ((rv |= p->redCurve->lookup_bwd(p->redCurve,&out[0],&out[0])) > 1 - || (rv |= p->greenCurve->lookup_bwd(p->greenCurve,&out[1],&out[1])) > 1 - || (rv |= p->blueCurve->lookup_bwd(p->blueCurve,&out[2],&out[2])) > 1) { - sprintf(icp->err,"icc_lookup: Curve->lookup_bwd() failed"); - icp->errc = rv; - return 2; - } - return rv; -} - -/* Overall Bwd conversion */ -static int -icmLuMatrixBwd_lookup ( -icmLuBase *pp, /* This */ -double *out, /* Vector of output values */ -double *in /* Vector of input values */ -) { - int rv = 0; - icmLuMatrix *p = (icmLuMatrix *)pp; - rv |= icmLuMatrixBwd_abs(p, out, in); - rv |= icmLuMatrixBwd_matrix(p, out, out); - rv |= icmLuMatrixBwd_curve(p, out, out); - return rv; -} - -static void -icmLuMatrix_delete( -icmLuBase *p -) { - icc *icp = p->icp; - - icp->al->free(icp->al, p); -} - -/* We setup valid fwd and bwd component conversions, */ -/* but setup only the asked for overal conversion. */ -static icmLuBase * -new_icmLuMatrix( - struct _icc *icp, - icColorSpaceSignature inSpace, /* Native Input color space */ - icColorSpaceSignature outSpace, /* Native Output color space */ - icColorSpaceSignature pcs, /* Native PCS */ - icColorSpaceSignature e_inSpace, /* Effective Input color space */ - icColorSpaceSignature e_outSpace, /* Effective Output color space */ - icColorSpaceSignature e_pcs, /* Effective PCS */ - icmXYZNumber whitePoint, /* Profile absolute white point */ - icmXYZNumber blackPoint, /* Profile absolute black point */ - icRenderingIntent intent, /* Rendering intent */ - icmLookupFunc func, /* Functionality requested */ - int dir /* 0 = fwd, 1 = bwd */ -) { - icmLuMatrix *p; - - if ((p = (icmLuMatrix *) icp->al->calloc(icp->al,1,sizeof(icmLuMatrix))) == NULL) - return NULL; - p->icp = icp; - p->del = icmLuMatrix_delete; - p->lutspaces= icmLutSpaces; - p->spaces = icmLuSpaces; - p->get_ranges = icmLu_get_ranges; - p->wh_bk_points = icmLuWh_bk_points; - p->fwd_lookup = icmLuMatrixFwd_lookup; - p->fwd_curve = icmLuMatrixFwd_curve; - p->fwd_matrix = icmLuMatrixFwd_matrix; - p->fwd_abs = icmLuMatrixFwd_abs; - p->bwd_lookup = icmLuMatrixBwd_lookup; - p->bwd_abs = icmLuMatrixBwd_abs; - p->bwd_matrix = icmLuMatrixBwd_matrix; - p->bwd_curve = icmLuMatrixBwd_curve; - if (dir) { - p->ttype = icmMatrixBwdType; - p->lookup = icmLuMatrixBwd_lookup; - } else { - p->ttype = icmMatrixFwdType; - p->lookup = icmLuMatrixFwd_lookup; - } - - /* Note that we can use matrix type even if PCS is Lab, */ - /* by simply converting it. */ - - /* Find the appropriate tags */ - if ((p->redCurve = (icmCurve *)icp->read_tag(icp, icSigRedTRCTag)) == NULL - || p->redCurve->ttype != icSigCurveType - || (p->greenCurve = (icmCurve *)icp->read_tag(icp, icSigGreenTRCTag)) == NULL - || p->greenCurve->ttype != icSigCurveType - || (p->blueCurve = (icmCurve *)icp->read_tag(icp, icSigBlueTRCTag)) == NULL - || p->blueCurve->ttype != icSigCurveType - || (p->redColrnt = (icmXYZArray *)icp->read_tag(icp, icSigRedColorantTag)) == NULL - || p->redColrnt->ttype != icSigXYZType || p->redColrnt->size < 1 - || (p->greenColrnt = (icmXYZArray *)icp->read_tag(icp, icSigGreenColorantTag)) == NULL - || p->greenColrnt->ttype != icSigXYZType || p->greenColrnt->size < 1 - || (p->blueColrnt = (icmXYZArray *)icp->read_tag(icp, icSigBlueColorantTag)) == NULL - || p->blueColrnt->ttype != icSigXYZType || p->blueColrnt->size < 1) { - p->del((icmLuBase *)p); - return NULL; - } - - /* Setup the matrix */ - p->mx[0][0] = p->redColrnt->data[0].X; - p->mx[0][1] = p->greenColrnt->data[0].X; - p->mx[0][2] = p->blueColrnt->data[0].X; - p->mx[1][1] = p->greenColrnt->data[0].Y; - p->mx[1][0] = p->redColrnt->data[0].Y; - p->mx[1][2] = p->blueColrnt->data[0].Y; - p->mx[2][1] = p->greenColrnt->data[0].Z; - p->mx[2][0] = p->redColrnt->data[0].Z; - p->mx[2][2] = p->blueColrnt->data[0].Z; - - if (inverse3x3(p->bmx, p->mx) != 0) { /* Compute inverse */ - sprintf(icp->err,"icc_new_iccLuMatrix: Matrix wasn't invertable"); - icp->errc = 2; - p->del((icmLuBase *)p); - return NULL; - } - - p->pcswht = icp->header->illuminant; - p->whitePoint = whitePoint; - p->blackPoint = blackPoint; - p->intent = intent; - p->function = func; - p->inSpace = inSpace; - p->outSpace = outSpace; - p->pcs = pcs; - p->e_inSpace = e_inSpace; - p->e_outSpace = e_outSpace; - p->e_pcs = e_pcs; - - /* Create absolute <-> relative conversion matricies */ - icmChromAdaptMatrix(ICM_CAM_BRADFORD, whitePoint, icmD50, p->toAbs); - icmChromAdaptMatrix(ICM_CAM_BRADFORD, icmD50, whitePoint, p->fromAbs); - - return (icmLuBase *)p; -} - -static icmLuBase * -new_icmLuMatrixFwd( - struct _icc *icp, - icColorSpaceSignature inSpace, /* Native Input color space */ - icColorSpaceSignature outSpace, /* Native Output color space */ - icColorSpaceSignature pcs, /* Native PCS */ - icColorSpaceSignature e_inSpace, /* Effective Input color space */ - icColorSpaceSignature e_outSpace, /* Effective Output color space */ - icColorSpaceSignature e_pcs, /* Effective PCS */ - icmXYZNumber whitePoint, /* Profile absolute white point */ - icmXYZNumber blackPoint, /* Profile absolute black point */ - icRenderingIntent intent, /* Rendering intent */ - icmLookupFunc func /* Functionality requested */ -) { - return new_icmLuMatrix(icp, inSpace, outSpace, pcs, e_inSpace, e_outSpace, e_pcs, - whitePoint, blackPoint, intent, func, 0); -} - -static icmLuBase * -new_icmLuMatrixBwd( - struct _icc *icp, - icColorSpaceSignature inSpace, /* Native Input color space */ - icColorSpaceSignature outSpace, /* Native Output color space */ - icColorSpaceSignature pcs, /* Native PCS */ - icColorSpaceSignature e_inSpace, /* Effective Input color space */ - icColorSpaceSignature e_outSpace, /* Effective Output color space */ - icColorSpaceSignature e_pcs, /* Effective PCS */ - icmXYZNumber whitePoint, /* Profile absolute white point */ - icmXYZNumber blackPoint, /* Profile absolute black point */ - icRenderingIntent intent, /* Rendering intent */ - icmLookupFunc func /* Functionality requested */ -) { - return new_icmLuMatrix(icp, inSpace, outSpace, pcs, e_inSpace, e_outSpace, e_pcs, - whitePoint, blackPoint, intent, func, 1); -} - -/* - - - - - - - - - - - - - - - - - - - - - - - */ -/* Forward and Backward Multi-Dimensional Interpolation type conversion */ -/* Return 0 on success, 1 if clipping occured, 2 on other error */ - -/* Components of overall lookup, in order */ -static int icmLuLut_in_abs(icmLuLut *p, double *out, double *in) { - icmLut *lut = p->lut; - int rv = 0; - - if (out != in) { - int i; - for (i = 0; i < lut->inputChan; i++) /* Don't alter input values */ - out[i] = in[i]; - } - - /* If Bwd Lut, take care of Absolute color space and effective input space */ - if ((p->function == icmBwd || p->function == icmGamut || p->function == icmPreview) - && p->intent == icAbsoluteColorimetric) { - - if (p->e_inSpace == icSigLabData) - icmLab2XYZ(&p->pcswht, out, out); - - /* Convert from Absolute to Relative colorometric */ - icmMulBy3x3(out, p->fromAbs, out); - - if (p->inSpace == icSigLabData) - icmXYZ2Lab(&p->pcswht, out, out); - - } else { - - /* Convert from Effective to Native input space */ - if (p->e_inSpace == icSigLabData && p->inSpace == icSigXYZData) - icmLab2XYZ(&p->pcswht, out, out); - else if (p->e_inSpace == icSigXYZData && p->inSpace == icSigLabData) - icmXYZ2Lab(&p->pcswht, out, out); - } - - return rv; -} - -/* Possible matrix lookup */ -static int icmLuLut_matrix(icmLuLut *p, double *out, double *in) { - icmLut *lut = p->lut; - int rv = 0; - - if (p->usematrix) - rv |= lut->lookup_matrix(lut,out,in); - else if (out != in) { - int i; - for (i = 0; i < lut->inputChan; i++) - out[i] = in[i]; - } - return rv; -} - -/* Do input -> input' lookup */ -static int icmLuLut_input(icmLuLut *p, double *out, double *in) { - icmLut *lut = p->lut; - int rv = 0; - - p->in_normf(out, in); /* Normalize from input color space */ - rv |= lut->lookup_input(lut,out,out); /* Lookup though input tables */ - p->in_denormf(out,out); /* De-normalize to input color space */ - return rv; -} - -/* Do input'->output' lookup */ -static int icmLuLut_clut(icmLuLut *p, double *out, double *in) { - icmLut *lut = p->lut; - double temp[MAX_CHAN]; - int rv = 0; - - p->in_normf(temp, in); /* Normalize from input color space */ - rv |= p->lookup_clut(lut,out,temp); /* Lookup though clut tables */ - p->out_denormf(out,out); /* De-normalize to output color space */ - return rv; -} - -/* Do output'->output lookup */ -static int icmLuLut_output(icmLuLut *p, double *out, double *in) { - icmLut *lut = p->lut; - int rv = 0; - - p->out_normf(out,in); /* Normalize from output color space */ - rv |= lut->lookup_output(lut,out,out); /* Lookup though output tables */ - p->out_denormf(out, out); /* De-normalize to output color space */ - return rv; -} - -static int icmLuLut_out_abs(icmLuLut *p, double *out, double *in) { - icmLut *lut = p->lut; - int rv = 0; - - if (out != in) { - int i; - for (i = 0; i < lut->inputChan; i++) /* Don't alter input values */ - out[i] = in[i]; - } - - /* If Fwd Lut, take care of Absolute color space */ - /* and convert from native to effective out PCS */ - if ((p->function == icmFwd || p->function == icmPreview) - && p->intent == icAbsoluteColorimetric) { - - if (p->outSpace == icSigLabData) - icmLab2XYZ(&p->pcswht, out, out); - - /* Convert from Relative to Absolute colorometric XYZ */ - icmMulBy3x3(out, p->toAbs, out); - - if (p->e_outSpace == icSigLabData) - icmXYZ2Lab(&p->pcswht, out, out); - } else { - - /* Convert from Native to Effective output space */ - if (p->outSpace == icSigLabData && p->e_outSpace == icSigXYZData) - icmLab2XYZ(&p->pcswht, out, out); - else if (p->outSpace == icSigXYZData && p->e_outSpace == icSigLabData) - icmXYZ2Lab(&p->pcswht, out, out); - } - return rv; -} - -/* Overall lookup */ -static int -icmLuLut_lookup ( -icmLuBase *pp, /* This */ -double *out, /* Vector of output values */ -double *in /* Vector of input values */ -) { - int rv = 0; - icmLuLut *p = (icmLuLut *)pp; - icmLut *lut = p->lut; - double temp[MAX_CHAN]; - - rv |= p->in_abs(p,temp,in); /* Possible absolute conversion */ - if (p->usematrix) - rv |= lut->lookup_matrix(lut,temp,temp);/* If XYZ, multiply by non-unity matrix */ - p->in_normf(temp, temp); /* Normalize for input color space */ - rv |= lut->lookup_input(lut,temp,temp); /* Lookup though input tables */ - rv |= p->lookup_clut(lut,out,temp); /* Lookup though clut tables */ - rv |= lut->lookup_output(lut,out,out); /* Lookup though output tables */ - p->out_denormf(out,out); /* Normalize for output color space */ - rv |= p->out_abs(p,out,out); /* Possible absolute conversion */ - - return rv; -} - -#ifdef NEVER /* The following should be identical in effect to the above. */ - -/* Overall lookup */ -static int -icmLuLut_lookup ( -icmLuBase *pp, /* This */ -double *out, /* Vector of output values */ -double *in /* Vector of input values */ -) { - int i, rv = 0; - icmLuLut *p = (icmLuLut *)pp; - icmLut *lut = p->lut; - double temp[MAX_CHAN]; - - rv |= p->in_abs(p,temp,in); - rv |= p->matrix(p,temp,temp); - rv |= p->input(p,temp,temp); - rv |= p->clut(p,out,temp); - rv |= p->output(p,out,out); - rv |= p->out_abs(p,out,out); - - return rv; -} -#endif /* NEVER */ -/* - - - - - - - - - - - - - - - - - - - - - - - - - - */ -/* Some components of inverse lookup, in order */ -/* ~~ should these be in icmLut (like all the fwd transforms)? */ - -static int icmLuLut_inv_out_abs(icmLuLut *p, double *out, double *in) { - icmLut *lut = p->lut; - int rv = 0; - - if (out != in) { - int i; - for (i = 0; i < lut->inputChan; i++) /* Don't alter input values */ - out[i] = in[i]; - } - - /* If Fwd Lut, take care of Absolute color space */ - /* and convert from effective to native inverse output PCS */ - /* OutSpace must be PCS: XYZ or Lab */ - if ((p->function == icmFwd || p->function == icmPreview) - && p->intent == icAbsoluteColorimetric) { - - if (p->e_outSpace == icSigLabData) - icmLab2XYZ(&p->pcswht, out, out); - - /* Convert from Absolute to Relative colorometric */ - icmMulBy3x3(out, p->fromAbs, out); - - if (p->outSpace == icSigLabData) - icmXYZ2Lab(&p->pcswht, out, out); - - } else { - - /* Convert from Effective to Native output space */ - if (p->e_outSpace == icSigLabData && p->outSpace == icSigXYZData) - icmLab2XYZ(&p->pcswht, out, out); - else if (p->e_outSpace == icSigXYZData && p->outSpace == icSigLabData) - icmXYZ2Lab(&p->pcswht, out, out); - } - return rv; -} - -/* Do output->output' inverse lookup */ -static int icmLuLut_inv_output(icmLuLut *p, double *out, double *in) { - icc *icp = p->icp; - icmLut *lut = p->lut; - int rv = 0; - - if (lut->rot.inited == 0) { - rv = icmTable_setup_bwd(icp, &lut->rot, lut->outputEnt, lut->outputTable); - if (rv != 0) { - sprintf(icp->err,"icc_Lut_inv_input: Malloc failure in inverse lookup init."); - return icp->errc = rv; - } - } - - p->out_normf(out,in); /* Normalize from output color space */ - rv |= icmTable_lookup_bwd(&lut->rot, out, out); /* Reverse lookup though output tables */ - p->out_denormf(out, out); /* De-normalize to output color space */ - return rv; -} - -/* No output' -> input inverse lookup. */ -/* This is non-trivial ! */ - -/* Do input' -> input inverse lookup */ -static int icmLuLut_inv_input(icmLuLut *p, double *out, double *in) { - icc *icp = p->icp; - icmLut *lut = p->lut; - int rv = 0; - - if (lut->rit.inited == 0) { - rv = icmTable_setup_bwd(icp, &lut->rit, lut->inputEnt, lut->inputTable); - if (rv != 0) { - sprintf(icp->err,"icc_Lut_inv_input: Malloc failure in inverse lookup init."); - return icp->errc = rv; - } - } - - p->in_normf(out, in); /* Normalize from input color space */ - rv |= icmTable_lookup_bwd(&lut->rit, out, out); /* Reverse lookup though input tables */ - p->in_denormf(out,out); /* De-normalize to input color space */ - return rv; -} - -/* Possible inverse matrix lookup */ -static int icmLuLut_inv_matrix(icmLuLut *p, double *out, double *in) { - icc *icp = p->icp; - icmLut *lut = p->lut; - int rv = 0; - - if (p->usematrix) { - double tt[3]; - if (p->imx_valid == 0) { - if (inverse3x3(p->imx, lut->e) != 0) { /* Compute inverse */ - sprintf(icp->err,"icc_new_iccLuMatrix: Matrix wasn't invertable"); - icp->errc = 2; - return 2; - } - p->imx_valid = 1; - } - /* Matrix multiply */ - tt[0] = p->imx[0][0] * in[0] + p->imx[0][1] * in[1] + p->imx[0][2] * in[2]; - tt[1] = p->imx[1][0] * in[0] + p->imx[1][1] * in[1] + p->imx[1][2] * in[2]; - tt[2] = p->imx[2][0] * in[0] + p->imx[2][1] * in[1] + p->imx[2][2] * in[2]; - out[0] = tt[0], out[1] = tt[1], out[2] = tt[2]; - } else if (out != in) { - int i; - for (i = 0; i < lut->inputChan; i++) - out[i] = in[i]; - } - return rv; -} - -static int icmLuLut_inv_in_abs(icmLuLut *p, double *out, double *in) { - icmLut *lut = p->lut; - int rv = 0; - - if (out != in) { - int i; - for (i = 0; i < lut->inputChan; i++) /* Don't alter input values */ - out[i] = in[i]; - } - - /* If Bwd Lut, take care of Absolute color space, and */ - /* convert from native to effective input space */ - if ((p->function == icmBwd || p->function == icmGamut || p->function == icmPreview) - && p->intent == icAbsoluteColorimetric) { - - if (p->inSpace == icSigLabData) - icmLab2XYZ(&p->pcswht, out, out); - - /* Convert from Relative to Absolute colorometric XYZ */ - icmMulBy3x3(out, p->toAbs, out); - - if (p->e_inSpace == icSigLabData) - icmXYZ2Lab(&p->pcswht, out, out); - } else { - - /* Convert from Native to Effective input space */ - if (p->inSpace == icSigLabData && p->e_inSpace == icSigXYZData) - icmLab2XYZ(&p->pcswht, out, out); - else if (p->inSpace == icSigXYZData && p->e_inSpace == icSigLabData) - icmXYZ2Lab(&p->pcswht, out, out); - } - return rv; -} - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - */ - -/* Return LuLut information */ -static void icmLuLut_get_info( - icmLuLut *p, /* this */ - icmLut **lutp, /* Pointer to icc lut type */ - icmXYZNumber *pcswhtp, /* Pointer to profile PCS white point */ - icmXYZNumber *whitep, /* Pointer to profile absolute white point */ - icmXYZNumber *blackp /* Pointer to profile absolute black point */ -) { - if (lutp != NULL) - *lutp = p->lut; - if (pcswhtp != NULL) - *pcswhtp = p->pcswht; - if (whitep != NULL) - *whitep = p->whitePoint; - if (blackp != NULL) - *blackp = p->blackPoint; -} - -/* Get the native ranges for the LuLut */ -static void -icmLuLut_get_lutranges ( - struct _icmLuLut *p, - double *inmin, double *inmax, /* Return maximum range of inspace values */ - double *outmin, double *outmax /* Return maximum range of outspace values */ -) { - int i; - - for (i = 0; i < p->lut->inputChan; i++) { - inmin[i] = 0.0; /* Normalized range of input space values */ - inmax[i] = 1.0; - } - p->in_denormf(inmin,inmin); /* Convert to real colorspace range */ - p->in_denormf(inmax,inmax); - - /* Make sure min and max are so. */ - for (i = 0; i < p->lut->inputChan; i++) { - if (inmin[i] > inmax[i]) { - double tt; - tt = inmin[i]; - inmin[i] = inmax[i]; - inmax[i] = tt; - } - } - - for (i = 0; i < p->lut->outputChan; i++) { - outmin[i] = 0.0; /* Normalized range of output space values */ - outmax[i] = 1.0; - } - p->out_denormf(outmin,outmin); /* Convert to real colorspace range */ - p->out_denormf(outmax,outmax); - - /* Make sure min and max are so. */ - for (i = 0; i < p->lut->outputChan; i++) { - if (outmin[i] > outmax[i]) { - double tt; - tt = outmin[i]; - outmin[i] = outmax[i]; - outmax[i] = tt; - } - } -} - -/* Get the effective (externally visible) ranges for the LuLut */ -/* Arguments may be NULL */ -static void -icmLuLut_get_ranges ( - struct _icmLuBase *pp, - double *inmin, double *inmax, /* Return maximum range of inspace values */ - double *outmin, double *outmax /* Return maximum range of outspace values */ -) { - icmLuLut *p = (icmLuLut *)pp; - double tinmin[MAX_CHAN], tinmax[MAX_CHAN], toutmin[MAX_CHAN], toutmax[MAX_CHAN]; - int i; - - /* fudge NULL arguments so that they don't bomb */ - if (inmin == NULL) - inmin = tinmin; - if (inmax == NULL) - inmax = tinmax; - if (outmin == NULL) - outmin = toutmin; - if (outmax == NULL) - outmax = toutmax; - - for (i = 0; i < p->lut->inputChan; i++) { - inmin[i] = 0.0; /* Normalized range of input space values */ - inmax[i] = 1.0; - } - p->e_in_denormf(inmin,inmin); /* Convert to real colorspace range */ - p->e_in_denormf(inmax,inmax); - - /* Make sure min and max are so. */ - for (i = 0; i < p->lut->inputChan; i++) { - if (inmin[i] > inmax[i]) { - double tt; - tt = inmin[i]; - inmin[i] = inmax[i]; - inmax[i] = tt; - } - } - - for (i = 0; i < p->lut->outputChan; i++) { - outmin[i] = 0.0; /* Normalized range of output space values */ - outmax[i] = 1.0; - } - p->e_out_denormf(outmin,outmin); /* Convert to real colorspace range */ - p->e_out_denormf(outmax,outmax); - - /* Make sure min and max are so. */ - for (i = 0; i < p->lut->outputChan; i++) { - if (outmin[i] > outmax[i]) { - double tt; - tt = outmin[i]; - outmin[i] = outmax[i]; - outmax[i] = tt; - } - } -} - -/* Return the underlying Lut matrix */ -static void -icmLuLut_get_matrix ( - struct _icmLuLut *p, - double m[3][3] -) { - int i, j; - icmLut *lut = p->lut; - - if (p->usematrix) { - for (i = 0; i < 3; i++) - for (j = 0; j < 3; j++) - m[i][j] = lut->e[i][j]; /* Copy from Lut */ - - } else { /* return unity matrix */ - for (i = 0; i < 3; i++) { - for (j = 0; j < 3; j++) { - if (i == j) - m[i][j] = 1.0; - else - m[i][j] = 0.0; - } - } - } -} - -static void -icmLuLut_delete( -icmLuBase *p -) { - icc *icp = p->icp; - - icp->al->free(icp->al, p); -} - -static icmLuBase * -new_icmLuLut( - icc *icp, - icTagSignature ttag, /* Target Lut tag */ - icColorSpaceSignature inSpace, /* Native Input color space */ - icColorSpaceSignature outSpace, /* Native Output color space */ - icColorSpaceSignature pcs, /* Native PCS */ - icColorSpaceSignature e_inSpace, /* Effective Input color space */ - icColorSpaceSignature e_outSpace, /* Effective Output color space */ - icColorSpaceSignature e_pcs, /* Effective PCS */ - icmXYZNumber whitePoint, /* Profile absolute white point */ - icmXYZNumber blackPoint, /* Profile absolute black point */ - icRenderingIntent intent, /* Rendering intent */ - icmLookupFunc func /* Functionality requested */ -) { - icmLuLut *p; - - if ((p = (icmLuLut *) icp->al->calloc(icp->al,1,sizeof(icmLuLut))) == NULL) - return NULL; - p->ttype = icmLutType; - p->icp = icp; - p->del = icmLuLut_delete; - p->lutspaces= icmLutSpaces; - p->spaces = icmLuSpaces; - p->wh_bk_points = icmLuWh_bk_points; - - p->lookup = icmLuLut_lookup; - p->in_abs = icmLuLut_in_abs; - p->matrix = icmLuLut_matrix; - p->input = icmLuLut_input; - p->clut = icmLuLut_clut; - p->output = icmLuLut_output; - p->out_abs = icmLuLut_out_abs; - - p->inv_in_abs = icmLuLut_inv_in_abs; - p->inv_matrix = icmLuLut_inv_matrix; - p->inv_input = icmLuLut_inv_input; - p->inv_output = icmLuLut_inv_output; - p->inv_out_abs = icmLuLut_inv_out_abs; - - p->pcswht = icp->header->illuminant; - p->whitePoint = whitePoint; - p->blackPoint = blackPoint; - p->intent = intent; - p->function = func; - p->inSpace = inSpace; - p->outSpace = outSpace; - p->pcs = pcs; - p->e_inSpace = e_inSpace; - p->e_outSpace = e_outSpace; - p->e_pcs = e_pcs; - p->get_info = icmLuLut_get_info; - p->get_lutranges = icmLuLut_get_lutranges; - p->get_ranges = icmLuLut_get_ranges; - p->get_matrix = icmLuLut_get_matrix; - - /* Create absolute <-> relative conversion matricies */ - icmChromAdaptMatrix(ICM_CAM_BRADFORD, whitePoint, icmD50, p->toAbs); - icmChromAdaptMatrix(ICM_CAM_BRADFORD, icmD50, whitePoint, p->fromAbs); - - /* Get the Lut tag, & check that it is expected type */ - if ((p->lut = (icmLut *)icp->read_tag(icp, ttag)) == NULL - || (p->lut->ttype != icSigLut8Type && p->lut->ttype != icSigLut16Type)) { - p->del((icmLuBase *)p); - return NULL; - } - - /* Check if matrix should be used */ - if (inSpace == icSigXYZData && p->lut->nu_matrix(p->lut)) - p->usematrix = 1; - else - p->usematrix = 0; - - /* Lookup input color space to normalized index function */ - if (getNormFunc(inSpace, p->lut->ttype, icmToLuti, &p->in_normf)) { - sprintf(icp->err,"icc_get_luobj: Unknown colorspace"); - icp->errc = 1; - p->del((icmLuBase *)p); - return NULL; - } - - /* Lookup normalized index to input color space function */ - if (getNormFunc(inSpace, p->lut->ttype, icmFromLuti, &p->in_denormf)) { - sprintf(icp->err,"icc_get_luobj: Unknown colorspace"); - icp->errc = 1; - p->del((icmLuBase *)p); - return NULL; - } - - /* Lookup output color space to normalized Lut entry value function */ - if (getNormFunc(outSpace, p->lut->ttype, icmToLutv, &p->out_normf)) { - sprintf(icp->err,"icc_get_luobj: Unknown colorspace"); - icp->errc = 1; - p->del((icmLuBase *)p); - return NULL; - } - - /* Lookup normalized Lut entry value to output color space function */ - if (getNormFunc(outSpace, p->lut->ttype, icmFromLutv, &p->out_denormf)) { - sprintf(icp->err,"icc_get_luobj: Unknown colorspace"); - icp->errc = 1; - p->del((icmLuBase *)p); - return NULL; - } - - /* Lookup normalized index to effective input color space function */ - if (getNormFunc(e_inSpace, p->lut->ttype, icmFromLuti, &p->e_in_denormf)) { - sprintf(icp->err,"icc_get_luobj: Unknown effective colorspace"); - icp->errc = 1; - p->del((icmLuBase *)p); - return NULL; - } - - /* Lookup normalized Lut entry value to effective output color space function */ - if (getNormFunc(e_outSpace, p->lut->ttype, icmFromLutv, &p->e_out_denormf)) { - sprintf(icp->err,"icc_get_luobj: Unknown effective colorspace"); - icp->errc = 1; - p->del((icmLuBase *)p); - return NULL; - } - - /* Determine appropriate clut lookup algorithm */ - { - int use_sx; /* -1 = undecided, 0 = N-linear, 1 = Simplex lookup */ - icColorSpaceSignature ins, outs; /* In and out Lut color spaces */ - int inn, outn; /* in and out number of Lut components */ - - p->lutspaces((icmLuBase *)p, &ins, &inn, &outs, &outn); - - /* Determine if the input space is "Device" like, */ - /* ie. luminance will be expected to vary most strongly */ - /* with the diagonal change in input coordinates. */ - switch(ins) { - - /* Luminence is carried by the sum of all the output channels, */ - /* so output luminence will dominantly be in diagonal direction. */ - case icSigRgbData: - case icSigGrayData: - case icSigCmykData: - case icSigCmyData: - case icSigMch6Data: - use_sx = 1; /* Simplex interpolation is appropriate */ - break; - - /* A single channel carries the luminence information */ - case icSigLabData: - case icSigLuvData: - case icSigYCbCrData: - case icSigYxyData: - case icSigXYZData: - case icSigHlsData: - case icSigHsvData: - use_sx = 0; /* N-linear interpolation is appropriate */ - break; - default: - use_sx = -1; /* undecided */ - break; - } - - /* If we couldn't figure it out from the input space, */ - /* check output luminance variation with a diagonal input */ - /* change. */ - if (use_sx == -1) { - int lc; /* Luminance channel */ - - /* Determine where the luminence is carried in the output */ - switch(outs) { - - /* Luminence is carried by the sum of all the output channels */ - case icSigRgbData: - case icSigGrayData: - case icSigCmykData: - case icSigCmyData: - case icSigMch6Data: - lc = -1; /* Average all channels */ - break; - - /* A single channel carries the luminence information */ - case icSigLabData: - case icSigLuvData: - case icSigYCbCrData: - case icSigYxyData: - lc = 0; - break; - - case icSigXYZData: - case icSigHlsData: - lc = 1; - break; - - case icSigHsvData: - lc = 2; - break; - - /* default means give up and use N-linear type lookup */ - default: - lc = -2; - break; - } - - /* If we know how luminance is represented in output space */ - if (lc != -2) { - double tout1[MAX_CHAN]; /* Test output values */ - double tout2[MAX_CHAN]; - double tt, diag; - int n; - - /* Determine input space location of min and max of */ - /* given output channel (chan = -1 means average of all) */ - p->lut->min_max(p->lut, tout1, tout2, lc); - - /* Convert to vector and then calculate normalized */ - /* dot product with diagonal vector (1,1,1...) */ - for (tt = 0.0, n = 0; n < inn; n++) { - tout1[n] = tout2[n] - tout1[n]; - tt += tout1[n] * tout1[n]; - } - if (tt > 0.0) - tt = sqrt(tt); /* normalizing factor for maximum delta */ - else - tt = 1.0; /* Hmm. */ - tt *= sqrt((double)inn); /* Normalizing factor for diagonal vector */ - for (diag = 0.0, n = 0; n < outn; n++) - diag += tout1[n] / tt; - diag = fabs(diag); - - /* I'm not really convinced that this is a reliable */ - /* indicator of whether simplex interpolation should be used ... */ - /* It does seem to do the right thing with YCC space though. */ - if (diag > 0.8) /* Diagonal is dominant ? */ - use_sx = 1; - - /* If we couldn't figure it out, use N-linear interpolation */ - if (use_sx == -1) - use_sx = 0; - } - } - - if (use_sx) { - p->lookup_clut = p->lut->lookup_clut_sx; - } else - p->lookup_clut = p->lut->lookup_clut_nl; - } - return (icmLuBase *)p; -} - -/* - - - - - - - - - - - - - - - - - - - - - - - */ - -/* Return an appropriate lookup object */ -/* Return NULL on error, and detailed error in icc */ -static icmLuBase* icc_get_luobj ( - icc *p, /* ICC */ - icmLookupFunc func, /* Conversion functionality */ - icRenderingIntent intent, /* Rendering intent, including icmAbsoluteColorimetricXYZ */ - icColorSpaceSignature pcsor,/* PCS overide (0 = def) */ - icmLookupOrder order /* Conversion representation search Order */ -) { - int rv; - icmLuBase *luobj = NULL; /* Lookup object to return */ - icmXYZNumber whitePoint, blackPoint; - icColorSpaceSignature pcs, e_pcs; /* PCS and effective PCS */ - - /* Check that the profile is legal, since we depend on it */ - if ((rv = check_icc_legal(p)) != 0) - return NULL; - - /* Figure out the native and effective PCS */ - e_pcs = pcs = p->header->pcs; - if (pcsor != icmSigDefaultData) - e_pcs = pcsor; /* Overide */ - - /* Get White and Black points from the profile */ - { - icmXYZArray *whitePointTag, *blackPointTag; - - if ((whitePointTag = (icmXYZArray *)p->read_tag(p, icSigMediaWhitePointTag)) == NULL - || whitePointTag->ttype != icSigXYZType || whitePointTag->size < 1) { - if (intent == icAbsoluteColorimetric) { - sprintf(p->err,"icc_lookup: Profile is missing Media White Point Tag"); - p->errc = 1; - return NULL; - } - whitePoint = icmD50; /* safe value */ - } else - whitePoint = whitePointTag->data[0]; /* Copy structure */ - - if ((blackPointTag = (icmXYZArray *)p->read_tag(p, icSigMediaBlackPointTag)) == NULL - || blackPointTag->ttype != icSigXYZType || blackPointTag->size < 1) { - blackPoint = icmBlack; /* default */ - p->errc = 0; /* reset the error code. black point is NOT required */ - } else - blackPoint = blackPointTag->data[0]; /* Copy structure */ - } - - /* How we expect to execute the request depends firstly on the type of profile */ - switch (p->header->deviceClass) { - case icSigInputClass: - case icSigDisplayClass: - /* Look for AToB0 based profile + optional BToA0 reverse */ - /* or three component matrix profile (reversable) */ - /* or momochrome table profile (reversable) */ - /* No intent */ - /* Device <-> PCS */ - /* Determine the algorithm and set its parameters */ - - if (intent != icmDefaultIntent - && intent != icAbsoluteColorimetric) { - sprintf(p->err,"icc_get_luobj: Intent is inappropriate for Input/Display profile"); - p->errc = 1; - return NULL; - } - - switch (func) { - case icmFwd: /* Device to PCS */ - if (order != icmLuOrdRev) { - /* Try Lut type lookup first */ - if ((luobj = new_icmLuLut(p, icSigAToB0Tag, - p->header->colorSpace, pcs, pcs, - p->header->colorSpace, e_pcs, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - - /* See if it could be a matrix lookup */ - if ((luobj = new_icmLuMatrixFwd(p, - p->header->colorSpace, pcs, pcs, - p->header->colorSpace, e_pcs, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - - /* See if it could be a monochrome lookup */ - if ((luobj = new_icmLuMonoFwd(p, - p->header->colorSpace, pcs, pcs, - p->header->colorSpace, e_pcs, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - - } else { - /* See if it could be a monochrome lookup */ - if ((luobj = new_icmLuMonoFwd(p, - p->header->colorSpace, pcs, pcs, - p->header->colorSpace, e_pcs, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - - /* See if it could be a matrix lookup */ - if ((luobj = new_icmLuMatrixFwd(p, - p->header->colorSpace, pcs, pcs, - p->header->colorSpace, e_pcs, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - - /* Try Lut type lookup last */ - if ((luobj = new_icmLuLut(p, icSigAToB0Tag, - p->header->colorSpace, pcs, pcs, - p->header->colorSpace, e_pcs, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - } - break; - - case icmBwd: /* PCS to Device */ - if (order != icmLuOrdRev) { - /* Try Lut type lookup first */ - if ((luobj = new_icmLuLut(p, icSigBToA0Tag, - pcs, p->header->colorSpace, pcs, - e_pcs, p->header->colorSpace, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - - /* See if it could be a matrix lookup */ - if ((luobj = new_icmLuMatrixBwd(p, - pcs, p->header->colorSpace, pcs, - e_pcs, p->header->colorSpace, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - - /* See if it could be a monochrome lookup */ - if ((luobj = new_icmLuMonoBwd(p, - pcs, p->header->colorSpace, pcs, - e_pcs, p->header->colorSpace, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - } else { - /* See if it could be a monochrome lookup */ - if ((luobj = new_icmLuMonoBwd(p, - pcs, p->header->colorSpace, pcs, - e_pcs, p->header->colorSpace, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - - /* See if it could be a matrix lookup */ - if ((luobj = new_icmLuMatrixBwd(p, - pcs, p->header->colorSpace, pcs, - e_pcs, p->header->colorSpace, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - - /* Try Lut type lookup last */ - if ((luobj = new_icmLuLut(p, icSigBToA0Tag, - pcs, p->header->colorSpace, pcs, - e_pcs, p->header->colorSpace, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - } - break; - - default: - sprintf(p->err,"icc_get_luobj: Inaproptiate function requested"); - p->errc = 1; - return NULL; - } - break; - - case icSigOutputClass: - /* Expect BToA Lut and optional AToB Lut, All intents, expect gamut */ - /* or momochrome table profile (reversable) */ - /* Device <-> PCS */ - /* Gamut Lut - no intent */ - /* Optional preview links PCS <-> PCS */ - - /* Determine the algorithm and set its parameters */ - switch (func) { - icTagSignature ttag; - - case icmFwd: /* Device to PCS */ - - if (intent == icmDefaultIntent) - intent = icRelativeColorimetric; /* Make this the default */ - - switch (intent) { - case icRelativeColorimetric: - case icAbsoluteColorimetric: - ttag = icSigAToB1Tag; - break; - case icPerceptual: - ttag = icSigAToB0Tag; - break; - case icSaturation: - ttag = icSigAToB2Tag; - break; - default: - sprintf(p->err,"icc_get_luobj: Unknown intent"); - p->errc = 1; - return NULL; - } - - if (order != icmLuOrdRev) { - /* Try Lut type lookup first */ - if ((luobj = new_icmLuLut(p, ttag, - p->header->colorSpace, pcs, pcs, - p->header->colorSpace, e_pcs, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - - /* See if it could be a matrix lookup */ - if ((luobj = new_icmLuMatrixFwd(p, - p->header->colorSpace, pcs, pcs, - p->header->colorSpace, e_pcs, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - - /* See if it could be a monochrome lookup */ - if ((luobj = new_icmLuMonoFwd(p, - p->header->colorSpace, pcs, pcs, - p->header->colorSpace, e_pcs, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - } else { - /* See if it could be a monochrome lookup */ - if ((luobj = new_icmLuMonoFwd(p, - p->header->colorSpace, pcs, pcs, - p->header->colorSpace, e_pcs, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - - /* See if it could be a matrix lookup */ - if ((luobj = new_icmLuMatrixFwd(p, - p->header->colorSpace, pcs, pcs, - p->header->colorSpace, e_pcs, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - - /* Try Lut type lookup last */ - if ((luobj = new_icmLuLut(p, ttag, - p->header->colorSpace, pcs, pcs, - p->header->colorSpace, e_pcs, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - } - break; - - case icmBwd: /* PCS to Device */ - - if (intent == icmDefaultIntent) - intent = icRelativeColorimetric; /* Make this the default */ - - switch (intent) { - case icRelativeColorimetric: - case icAbsoluteColorimetric: - ttag = icSigBToA1Tag; - break; - case icPerceptual: - ttag = icSigBToA0Tag; - break; - case icSaturation: - ttag = icSigBToA2Tag; - break; - default: - sprintf(p->err,"icc_get_luobj: Unknown intent"); - p->errc = 1; - return NULL; - } - - if (order != icmLuOrdRev) { - /* Try Lut type lookup first */ - if ((luobj = new_icmLuLut(p, ttag, - pcs, p->header->colorSpace, pcs, - e_pcs, p->header->colorSpace, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - - /* See if it could be a matrix lookup */ - if ((luobj = new_icmLuMatrixBwd(p, - pcs, p->header->colorSpace, pcs, - e_pcs, p->header->colorSpace, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - - /* See if it could be a monochrome lookup */ - if ((luobj = new_icmLuMonoBwd(p, - pcs, p->header->colorSpace, pcs, - e_pcs, p->header->colorSpace, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - } else { - /* See if it could be a monochrome lookup */ - if ((luobj = new_icmLuMonoBwd(p, - pcs, p->header->colorSpace, pcs, - e_pcs, p->header->colorSpace, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - - /* See if it could be a matrix lookup */ - if ((luobj = new_icmLuMatrixBwd(p, - pcs, p->header->colorSpace, pcs, - e_pcs, p->header->colorSpace, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - - /* Try Lut type lookup last */ - if ((luobj = new_icmLuLut(p, ttag, - pcs, p->header->colorSpace, pcs, - e_pcs, p->header->colorSpace, e_pcs, - whitePoint, blackPoint, intent, func)) != NULL) - break; - } - break; - - case icmGamut: /* PCS to 1D */ - - if (intent != icmDefaultIntent) { - sprintf(p->err,"icc_get_luobj: Intent is inappropriate for type of function"); - p->errc = 1; - return NULL; - } - - /* If the target tag exists, and it is a Lut */ - luobj = new_icmLuLut(p, icSigGamutTag, - pcs, icSigGrayData, pcs, - e_pcs, icSigGrayData, e_pcs, - whitePoint, blackPoint, intent, func); - break; - - case icmPreview: /* PCS to PCS */ - - switch (intent) { - case icRelativeColorimetric: - ttag = icSigPreview1Tag; - break; - case icPerceptual: - ttag = icSigPreview0Tag; - break; - case icSaturation: - ttag = icSigPreview2Tag; - break; - case icAbsoluteColorimetric: - sprintf(p->err,"icc_get_luobj: Intent is inappropriate for type of function"); - p->errc = 1; - return NULL; - default: - sprintf(p->err,"icc_get_luobj: Unknown intent"); - p->errc = 1; - return NULL; - } - - /* If the target tag exists, and it is a Lut */ - luobj = new_icmLuLut(p, ttag, - pcs, pcs, pcs, - e_pcs, e_pcs, e_pcs, - whitePoint, blackPoint, intent, func); - break; - - default: - sprintf(p->err,"icc_get_luobj: Inaproptiate function requested"); - p->errc = 1; - return NULL; - } - break; - - case icSigLinkClass: - /* Expect AToB0 Lut and optional BToA0 Lut, One intent in header */ - /* Device <-> Device */ - - if (intent != p->header->renderingIntent - && intent != icmDefaultIntent) { - sprintf(p->err,"icc_get_luobj: Intent is inappropriate for Link profile"); - p->errc = 1; - return NULL; - } - intent = p->header->renderingIntent; - - /* Determine the algorithm and set its parameters */ - switch (func) { - case icmFwd: /* Device to PCS (== Device) */ - - luobj = new_icmLuLut(p, icSigAToB0Tag, - p->header->colorSpace, pcs, pcs, - p->header->colorSpace, pcs, pcs, - whitePoint, blackPoint, intent, func); - break; - - case icmBwd: /* PCS (== Device) to Device */ - - luobj = new_icmLuLut(p, icSigBToA0Tag, - pcs, p->header->colorSpace, pcs, - pcs, p->header->colorSpace, pcs, - whitePoint, blackPoint, intent, func); - break; - - default: - sprintf(p->err,"icc_get_luobj: Inaproptiate function requested"); - p->errc = 1; - return NULL; - } - break; - - case icSigAbstractClass: - /* Expect AToB0 Lut and BToA Lut, no intents */ - /* PCS <-> PCS */ - /* Determine the algorithm and set its parameters */ - - if (intent != icmDefaultIntent) { - sprintf(p->err,"icc_get_luobj: Intent is inappropriate for Abstract profile"); - p->errc = 1; - return NULL; - } - - switch (func) { - case icmFwd: /* PCS (== Device) to PCS */ - - luobj = new_icmLuLut(p, icSigAToB0Tag, - p->header->colorSpace, pcs, pcs, - e_pcs, e_pcs, e_pcs, - whitePoint, blackPoint, intent, func); - break; - - case icmBwd: /* PCS to PCS (== Device) */ - - luobj = new_icmLuLut(p, icSigBToA0Tag, - pcs, p->header->colorSpace, pcs, - e_pcs, e_pcs, e_pcs, - whitePoint, blackPoint, intent, func); - break; - - default: - sprintf(p->err,"icc_get_luobj: Inaproptiate function requested"); - p->errc = 1; - return NULL; - } - break; - - case icSigColorSpaceClass: - /* Expect AToB0 Lut and BToA0 Lut, no intents, */ - /* Device <-> PCS */ - - if (intent != icmDefaultIntent) { - sprintf(p->err,"icc_get_luobj: Intent is inappropriate for Colorspace profile"); - p->errc = 1; - return NULL; - } - - /* Determine the algorithm and set its parameters */ - switch (func) { - case icmFwd: /* Device to PCS */ - - luobj = new_icmLuLut(p, icSigAToB0Tag, - p->header->colorSpace, pcs, pcs, - p->header->colorSpace, e_pcs, e_pcs, - whitePoint, blackPoint, intent, func); - break; - - case icmBwd: /* PCS to Device */ - - luobj = new_icmLuLut(p, icSigBToA0Tag, - pcs, p->header->colorSpace, pcs, - e_pcs, p->header->colorSpace, e_pcs, - whitePoint, blackPoint, intent, func); - break; - - default: - sprintf(p->err,"icc_get_luobj: Inaproptiate function requested"); - p->errc = 1; - return NULL; - } - break; - - case icSigNamedColorClass: - /* Expect Name -> Device, Optional PCS */ - /* and a reverse lookup would be useful */ - /* (ie. PCS or Device coords to closest named color) */ - /* ~~ to be implemented ~~ */ - - /* ~~ Absolute intent is valid for processing of */ - /* PCS from named Colors. Also allow for e_pcs */ - if (intent != icmDefaultIntent) { - sprintf(p->err,"icc_get_luobj: Intent is inappropriate for Named Color profile"); - p->errc = 1; - return NULL; - } - - sprintf(p->err,"icc_get_luobj: Named Colors not handled yet"); - p->errc = 1; - return NULL; - - default: - sprintf(p->err,"icc_get_luobj: Unknown profile class"); - p->errc = 1; - return NULL; - } - - return luobj; -} - -/* - - - - - - - - - - - - - - - - - - - - - - - - */ - -/* Create an empty object. Return null on error */ -icc *new_icc_a( -icmAlloc *al /* Optional memory allocator. NULL for default */ -) { - icc *p; - int del_al = 0; - - if (al == NULL) { /* None provided, create default */ - if ((al = new_icmAllocStd()) == NULL) - return NULL; - del_al = 1; /* We need to delete it */ - } - - if ((p = (icc *) al->calloc(al, 1,sizeof(icc))) == NULL) - return NULL; - p->al = al; /* Heap allocator */ - p->del_al = del_al; /* Flag noting whether we delete it */ - - p->get_size = icc_get_size; - p->read = icc_read; - p->write = icc_write; - p->dump = icc_dump; - p->del = icc_delete; - p->add_tag = icc_add_tag; - p->link_tag = icc_link_tag; - p->find_tag = icc_find_tag; - p->read_tag = icc_read_tag; - p->rename_tag = icc_rename_tag; - p->unread_tag = icc_unread_tag; - p->read_all_tags = icc_read_all_tags; - p->delete_tag = icc_delete_tag; - - p->get_luobj = icc_get_luobj; - -#if defined(__IBMC__) && defined(_M_IX86) - _control87(EM_UNDERFLOW, EM_UNDERFLOW); -#endif - - /* Allocate a header object */ - if ((p->header = new_icmHeader(p)) == NULL) { - al->free(al, p); - if (del_al) - al->del(al); - return NULL; - } - - /* Values that must be set before writing */ - p->header->deviceClass = icMaxEnumClass;/* Type of profile - must be set! */ - p->header->colorSpace = icMaxEnumData; /* Clr space of data - must be set! */ - p->header->pcs = icMaxEnumData; /* PCS: XYZ or Lab - must be set! */ - p->header->renderingIntent = icMaxEnumIntent; /* Rendering intent - must be set ! */ - - /* Values that should be set before writing */ - p->header->manufacturer = -1; /* Dev manufacturer - should be set ! */ - p->header->model = -1; /* Dev model number - should be set ! */ - p->header->attributes.l = 0; /* ICC Device attributes - should set ! */ - p->header->flags = 0; /* Embedding flags - should be set ! */ - - /* Values that may be set before writing */ - p->header->attributes.h = 0; /* Dev Device attributes - may be set ! */ - p->header->creator = str2tag("argl"); /* Profile creator - Argyll - may be set ! */ - - /* Init default values in header */ - p->header->cmmId = str2tag("argl"); /* CMM for profile - Argyll CMM */ - p->header->majv = 2; /* Current version 2.1.0 */ - p->header->minv = 1; - p->header->bfv = 0; - setcur_DateTimeNumber(&p->header->date);/* Creation Date */ - p->header->platform = icSigMicrosoft; /* Primary Platform */ - p->header->illuminant = icmD50; /* Profile illuminant - D50 */ - - return p; -} - -/* For backwards compatibility - a NULL allocator version */ -icc *new_icc(void) { - return new_icc_a(NULL); -} - -/* ---------------------------------------------------------- */ diff -Nru ghostscript-9.04~dfsg/icclib/icc.h ghostscript-9.05~dfsg~20120125/icclib/icc.h --- ghostscript-9.04~dfsg/icclib/icc.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/icclib/icc.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,1110 +0,0 @@ -#ifndef ICC_H -#define ICC_H -/* - * International Color Consortium Format Library (icclib) - * - * Author: Graeme W. Gill - * Date: 99/11/29 - * Version: 2.01 - * - * Copyright 1997, 1998, 1999, 2000, 2001 Graeme W. Gill - * Please refer to Licence.txt file for details. - */ - -/* We can get some subtle errors if certain headers aren't included */ -#include -#include -#include -#include -#include -#include -#include - -/* - * Note XYZ scaling to 1.0, not 100.0 - */ - -/* Make allowance for shared library use */ -#ifdef ICCLIB_SHARED /* Compiling or Using shared library version */ -# ifdef ICCLIB_EXPORTS /* Compiling shared library */ -# ifdef NT -# define ICCLIB_API __declspec(dllexport) -# endif /* NT */ -# else /* Using shared library */ -# ifdef NT -# define ICCLIB_API __declspec(dllimport) -# ifdef ICCLIB_DEBUG -# pragma comment (lib, "icclibd.lib") -# else -# pragma comment (lib, "icclib.lib") -# endif /* DEBUG */ -# endif /* NT */ -# endif -#else /* Using static library */ -# define ICCLIB_API /* empty */ -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -/* ---------------------------------------------- */ -/* Platform specific defines */ -/* It is assumed that the native machine size is 32 bits */ -#ifndef INR8 -#define INR8 signed char /* 8 bit signed */ -#endif -#ifndef INR16 -#define INR16 signed short /* 16 bit signed */ -#endif -#ifndef INR32 -#define INR32 signed long /* 32 bit signed */ -#endif -#ifndef ORD8 -#define ORD8 unsigned char /* 8 bit unsigned */ -#endif -#ifndef ORD16 -#define ORD16 unsigned short /* 16 bit unsigned */ -#endif -#ifndef ORD32 -#define ORD32 unsigned long /* 32 bit unsigned */ -#endif - -#include "icc9809.h" /* Standard ICC definitions, version ICC.1:1998-09 with mods noted. */ - -/* Note that the prefix icm is used for the native Machine */ -/* equivalents of the file structures defined in icc34.h */ - -/* ---------------------------------------------- */ -/* System interface objects. The defaults can be replaced */ -/* for adaption to different system environments */ - -/* File access class interface definition */ -#define ICM_FILE_BASE \ - /* Public: */ \ - \ - /* Set current position to offset. Return 0 on success, nz on failure. */ \ - int (*seek) (struct _icmFile *p, long int offset); \ - \ - /* Read count items of size length. Return number of items successfully read. */ \ - size_t (*read) (struct _icmFile *p, void *buffer, size_t size, size_t count); \ - \ - /* write count items of size length. Return number of items successfully written. */ \ - size_t (*write)(struct _icmFile *p, void *buffer, size_t size, size_t count); \ - \ - /* flush all write data out to secondary storage. Return nz on failure. */ \ - int (*flush)(struct _icmFile *p); \ - \ - /* we're done with the file object, return nz on failure */ \ - int (*del)(struct _icmFile *p); \ - -/* Common file interface class */ -struct _icmFile { - ICM_FILE_BASE -}; typedef struct _icmFile icmFile; - -/* - - - - - - - - - - - - - - - - - - - - - */ - -/* Implementation of file access class based on standard file I/O */ -struct _icmFileStd { - ICM_FILE_BASE - - /* Private: */ - FILE *fp; - int doclose; /* nz if free should close */ -}; typedef struct _icmFileStd icmFileStd; - -/* Create given a file name */ -icmFile *new_icmFileStd_name(char *name, char *mode); - -/* Create given a (binary) FILE* */ -icmFile *new_icmFileStd_fp(FILE *fp); - -/* - - - - - - - - - - - - - - - - - - - - - */ -/* Implementation of file access class based on a memory image */ -struct _icmFileMem { - ICM_FILE_BASE - - /* Private: */ - unsigned char *start, *cur, *end; - -}; typedef struct _icmFileMem icmFileMem; - -/* Create a memory image file access class */ -icmFile *new_icmFileMem(void *base, size_t length); - -/* - - - - - - - - - - - - - - - - - - - - - */ -/* Heap allocator class interface definition */ -#define ICM_ALLOC_BASE \ - /* Public: */ \ - \ - void *(*malloc) (struct _icmAlloc *p, size_t size); \ - void *(*calloc) (struct _icmAlloc *p, size_t num, size_t size); \ - void *(*realloc)(struct _icmAlloc *p, void *ptr, size_t size); \ - void (*free) (struct _icmAlloc *p, void *ptr); \ - \ - /* we're done with the allocator object */ \ - void (*del)(struct _icmAlloc *p); \ - -/* Common heap allocator interface class */ -struct _icmAlloc { - ICM_ALLOC_BASE -}; typedef struct _icmAlloc icmAlloc; - -/* - - - - - - - - - - - - - - - - - - - - - */ - -/* Implementation of heap class based on standard system malloc */ -struct _icmAllocStd { - ICM_ALLOC_BASE -}; typedef struct _icmAllocStd icmAllocStd; - -/* Create a standard alloc object */ -icmAlloc *new_icmAllocStd(void); - -/* --------------------------------- */ -/* Assumed constants */ - -#define MAX_CHAN 15 /* Maximum number of color channels */ - -/* --------------------------------- */ -/* tag and other compound structures */ - -typedef int icmSig; /* Otherwise un-enumerated 4 byte signature */ - -typedef struct { - ORD32 l; /* High and low components of signed 64 bit */ - INR32 h; -} icmInt64; - -typedef struct { - ORD32 l,h; /* High and low components of unsigned 64 bit */ -} icmUint64; - -/* XYZ Number */ -typedef struct { - double X; - double Y; - double Z; -} icmXYZNumber; - -/* Response 16 number */ -typedef struct { - double deviceValue; /* The device value in range 0.0 - 1.0 */ - double measurement; /* The reading value */ -} icmResponse16Number; - -/* - * read and write method error codes: - * 0 = sucess - * 1 = file format/logistical error - * 2 = system error - */ - -#define ICM_BASE_MEMBERS \ - /* Private: */ \ - icTagTypeSignature ttype; /* The tag type signature */ \ - struct _icc *icp; /* Pointer to ICC we're a part of */ \ - int touched; /* Flag for write bookeeping */ \ - int refcount; /* Reference count for sharing */ \ - unsigned int (*get_size)(struct _icmBase *p); \ - int (*read)(struct _icmBase *p, unsigned long len, unsigned long of); \ - int (*write)(struct _icmBase *p, unsigned long of); \ - void (*del)(struct _icmBase *p); \ - \ - /* Public: */ \ - void (*dump)(struct _icmBase *p, FILE *op, int verb); \ - int (*allocate)(struct _icmBase *p); - -/* Base tag element data object */ -struct _icmBase { - ICM_BASE_MEMBERS -}; typedef struct _icmBase icmBase; - -/* UInt8 Array */ -struct _icmUInt8Array { - ICM_BASE_MEMBERS - - /* Private: */ - unsigned int _size; /* Size currently allocated */ - - /* Public: */ - unsigned long size; /* Allocated and used size of the array */ - unsigned int *data; /* Pointer to array of data */ -}; typedef struct _icmUInt8Array icmUInt8Array; - -/* uInt16 Array */ -struct _icmUInt16Array { - ICM_BASE_MEMBERS - - /* Private: */ - unsigned int _size; /* Size currently allocated */ - - /* Public: */ - unsigned long size; /* Allocated and used size of the array */ - unsigned int *data; /* Pointer to array of data */ -}; typedef struct _icmUInt16Array icmUInt16Array; - -/* uInt32 Array */ -struct _icmUInt32Array { - ICM_BASE_MEMBERS - - /* Private: */ - unsigned int _size; /* Size currently allocated */ - - /* Public: */ - unsigned long size; /* Allocated and used size of the array */ - unsigned int *data; /* Pointer to array of data */ -}; typedef struct _icmUInt32Array icmUInt32Array; - -/* UInt64 Array */ -struct _icmUInt64Array { - ICM_BASE_MEMBERS - - /* Private: */ - unsigned int _size; /* Size currently allocated */ - - /* Public: */ - unsigned long size; /* Allocated and used size of the array */ - icmUint64 *data; /* Pointer to array of hight data */ -}; typedef struct _icmUInt64Array icmUInt64Array; - -/* u16Fixed16 Array */ -struct _icmU16Fixed16Array { - ICM_BASE_MEMBERS - - /* Private: */ - unsigned int _size; /* Size currently allocated */ - - /* Public: */ - unsigned long size; /* Allocated and used size of the array */ - double *data; /* Pointer to array of hight data */ -}; typedef struct _icmU16Fixed16Array icmU16Fixed16Array; - -/* s15Fixed16 Array */ -struct _icmS15Fixed16Array { - ICM_BASE_MEMBERS - - /* Private: */ - unsigned int _size; /* Size currently allocated */ - - /* Public: */ - unsigned long size; /* Allocated and used size of the array */ - double *data; /* Pointer to array of hight data */ -}; typedef struct _icmS15Fixed16Array icmS15Fixed16Array; - -/* XYZ Array */ -struct _icmXYZArray { - ICM_BASE_MEMBERS - - /* Private: */ - unsigned int _size; /* Size currently allocated */ - - /* Public: */ - unsigned long size; /* Allocated and used size of the array */ - icmXYZNumber *data; /* Pointer to array of data */ -}; typedef struct _icmXYZArray icmXYZArray; - -/* Curve */ -typedef enum { - icmCurveUndef = -1, /* Undefined curve */ - icmCurveLin = 0, /* Linear transfer curve */ - icmCurveGamma = 1, /* Gamma power transfer curve */ - icmCurveSpec = 2 /* Specified curve */ -} icmCurveStyle; - -/* Curve reverse lookup information */ -typedef struct { - int inited; /* Flag */ - double rmin, rmax; /* Range of reverse grid */ - double qscale; /* Quantising scale factor */ - long rsize; /* Number of reverse lists */ - int **rlists; /* Array of list of fwd values that may contain output value */ - /* Offset 0 = allocated size */ - /* Offset 1 = next free index */ - /* Offset 2 = first fwd index */ - unsigned long size; /* Copy of forward table size */ - double *data; /* Copy of forward table data */ -} icmRevTable; - -struct _icmCurve { - ICM_BASE_MEMBERS - - /* Private: */ - unsigned int _size; /* Size currently allocated */ - icmRevTable rt; /* Reverse table information */ - - /* Public: */ - icmCurveStyle flag; /* Style of curve */ - unsigned long size; /* Allocated and used size of the array */ - double *data; /* Curve data scaled to range 0.0 - 1.0 */ - /* or data[0] = gamma value */ - /* Translate a value through the curve, return warning flags */ - int (*lookup_fwd) (struct _icmCurve *p, double *out, double *in); /* Forwards */ - int (*lookup_bwd) (struct _icmCurve *p, double *out, double *in); /* Backwards */ - -}; typedef struct _icmCurve icmCurve; - -/* Data */ -typedef enum { - icmDataUndef = -1, /* Undefined data curve */ - icmDataASCII = 0, /* ASCII data curve */ - icmDataBin = 1 /* Binary data */ -} icmDataStyle; - -struct _icmData { - ICM_BASE_MEMBERS - - /* Private: */ - unsigned int _size; /* Size currently allocated */ - - /* Public: */ - icmDataStyle flag; /* Style of data */ - unsigned long size; /* Allocated and used size of the array (inc ascii null) */ - unsigned char *data; /* data or string, NULL if size == 0 */ -}; typedef struct _icmData icmData; - -/* text */ -struct _icmText { - ICM_BASE_MEMBERS - - /* Private: */ - unsigned int _size; /* Size currently allocated */ - - /* Public: */ - unsigned long size; /* Allocated and used size of desc, inc null */ - char *data; /* ascii string (null terminated), NULL if size==0 */ -}; typedef struct _icmText icmText; - -/* The base date time number */ -struct _icmDateTimeNumber { - ICM_BASE_MEMBERS - - /* Public: */ - unsigned int year; - unsigned int month; - unsigned int day; - unsigned int hours; - unsigned int minutes; - unsigned int seconds; -}; typedef struct _icmDateTimeNumber icmDateTimeNumber; - -#ifdef NEW -/ * DeviceSettings */ - -/* - I think this all works like this: - -Valid setting = ( (platform == platform1 and platform1.valid) - or (platform == platform2 and platform2.valid) - or ... - ) - -where - platformN.valid = ( platformN.combination1.valid - or platformN.combination2.valid - or ... - ) - -where - platformN.combinationM.valid = ( platformN.combinationM.settingstruct1.valid - and platformN.combinationM.settingstruct2.valid - and ... - ) - -where - platformN.combinationM.settingstructP.valid = ( platformN.combinationM.settingstructP.setting1.valid - or platformN.combinationM.settingstructP.setting2.valid - or ... - ) - - */ - -/* The Settings Structure holds an array of settings of a particular type */ -struct _icmSettingStruct { - ICM_BASE_MEMBERS - - /* Private: */ - unsigned int _num; /* Size currently allocated */ - - /* Public: */ - icSettingsSig settingSig; /* Setting identification */ - unsigned long numSettings; /* number of setting values */ - union { /* Setting values - type depends on Sig */ - icUInt64Number *resolution; - icDeviceMedia *media; - icDeviceDither *halftone; - } -}; typedef struct _icmSettingStruct icmSettingStruct; - -/* A Setting Combination holds all arrays of different setting types */ -struct _icmSettingComb { - /* Private: */ - unsigned int _num; /* number currently allocated */ - - /* Public: */ - unsigned long numStructs; /* num of setting structures */ - icmSettingStruct *data; -}; typedef struct _icmSettingComb icmSettingComb; - -/* A Platform Entry holds all setting combinations */ -struct _icmPlatformEntry { - /* Private: */ - unsigned int _num; /* number currently allocated */ - - /* Public: */ - icPlatformSignature platform; - unsigned long numCombinations; /* num of settings and allocated array size */ - icmSettingComb *data; -}; typedef struct _icmPlatformEntry icmPlatformEntry; - -/* The Device Settings holds all platform settings */ -struct _icmDeviceSettings { - /* Private: */ - unsigned int _num; /* number currently allocated */ - - /* Public: */ - unsigned long numPlatforms; /* num of platforms and allocated array size */ - icmPlatformEntry *data; /* Array of pointers to platform entry data */ -}; typedef struct _icmDeviceSettings icmDeviceSettings; - -#endif /* NEW */ - -/* lut */ -struct _icmLut { - ICM_BASE_MEMBERS - - /* Private: */ - /* Cache appropriate normalization routines */ - int dinc[MAX_CHAN]; /* Dimensional increment through clut */ - int dcube[1 << MAX_CHAN]; /* Hyper cube offsets */ - icmRevTable rit; /* Reverse input table information */ - icmRevTable rot; /* Reverse output table information */ - - unsigned int inputTable_size; /* size allocated to input table */ - unsigned int clutTable_size; /* size allocated to clut table */ - unsigned int outputTable_size; /* size allocated to output table */ - - /* return the minimum and maximum values of the given channel in the clut */ - void (*min_max) (struct _icmLut *pp, double *minv, double *maxv, int chan); - - /* Translate color values through 3x3 matrix, input tables only, multi-dimensional lut, */ - /* or output tables, */ - int (*lookup_matrix) (struct _icmLut *pp, double *out, double *in); - int (*lookup_input) (struct _icmLut *pp, double *out, double *in); - int (*lookup_clut_nl) (struct _icmLut *pp, double *out, double *in); - int (*lookup_clut_sx) (struct _icmLut *pp, double *out, double *in); - int (*lookup_output) (struct _icmLut *pp, double *out, double *in); - - /* Public: */ - - /* return non zero if matrix is non-unity */ - int (*nu_matrix) (struct _icmLut *pp); - - unsigned int inputChan; /* Num of input channels */ - unsigned int outputChan; /* Num of output channels */ - unsigned int clutPoints; /* Num of grid points */ - unsigned int inputEnt; /* Num of in-table entries (must be 256 for Lut8) */ - unsigned int outputEnt; /* Num of out-table entries (must be 256 for Lut8) */ - double e[3][3]; /* 3 * 3 array */ - double *inputTable; /* The in-table: [inputChan * inputEnt] */ - double *clutTable; /* The clut: [(clutPoints ^ inputChan) * outputChan] */ - double *outputTable; /* The out-table: [outputChan * outputEnt] */ - /* inputTable is organized [inputChan 0..ic-1][inputEnt 0..ie-1] */ - /* clutTable is organized [inputChan 0, 0..cp-1]..[inputChan ic-1, 0..cp-1] - [outputChan 0..oc-1] */ - /* outputTable is organized [outputChan 0..oc-1][outputEnt 0..oe-1] */ - - /* Helper function to setup the three tables contents */ - int (*set_tables) ( - struct _icmLut *p, /* Pointer to Lut object */ - void *cbctx, /* Opaque callback context pointer value */ - icColorSpaceSignature insig, /* Input color space */ - icColorSpaceSignature outsig, /* Output color space */ - void (*infunc)(void *cbctx, double *out, double *in), - /* Input transfer function, inspace->inspace' (NULL = default) */ - double *inmin, double *inmax, /* Maximum range of inspace' values */ - /* (NULL = default) */ - void (*clutfunc)(void *cbntx, double *out, double *in), - /* inspace' -> outspace' transfer function */ - double *clutmin, double *clutmax, /* Maximum range of outspace' values */ - /* (NULL = default) */ - void (*outfunc)(void *cbntx, double *out, double *in)); - /* Output transfer function, outspace'->outspace (NULL = deflt) */ - -}; typedef struct _icmLut icmLut; - -/* Measurement Data */ -struct _icmMeasurement { - ICM_BASE_MEMBERS - - /* Public: */ - icStandardObserver observer; /* Standard observer */ - icmXYZNumber backing; /* XYZ for backing */ - icMeasurementGeometry geometry; /* Meas. geometry */ - double flare; /* Measurement flare */ - icIlluminant illuminant; /* Illuminant */ -}; typedef struct _icmMeasurement icmMeasurement; - -/* Named color */ - -/* Structure that holds each named color data */ -typedef struct { - struct _icc *icp; /* Pointer to ICC we're a part of */ - char root[32]; /* Root name for color */ - double pcsCoords[3]; /* icmNC2: PCS coords of color */ - double deviceCoords[MAX_CHAN]; /* Dev coords of color */ -} icmNamedColorVal; - -struct _icmNamedColor { - ICM_BASE_MEMBERS - - /* Private: */ - unsigned int _count; /* Count currently allocated */ - - /* Public: */ - unsigned int vendorFlag; /* Bottom 16 bits for IC use */ - unsigned int count; /* Count of named colors */ - unsigned int nDeviceCoords; /* Num of device coordinates */ - char prefix[32]; /* Prefix for each color name (null terminated) */ - char suffix[32]; /* Suffix for each color name (null terminated) */ - icmNamedColorVal *data; /* Array of [count] color values */ -}; typedef struct _icmNamedColor icmNamedColor; - -/* textDescription */ -struct _icmTextDescription { - ICM_BASE_MEMBERS - - /* Private: */ - unsigned long _size; /* Size currently allocated */ - unsigned long uc_size; /* uc Size currently allocated */ - int (*core_read)(struct _icmTextDescription *p, char **bpp, char *end); - int (*core_write)(struct _icmTextDescription *p, char **bpp); - - /* Public: */ - unsigned long size; /* Allocated and used size of desc, inc null */ - char *desc; /* ascii string (null terminated) */ - - unsigned int ucLangCode; /* UniCode language code */ - unsigned long ucSize; /* Allocated and used size of ucDesc in wchars, inc null */ - ORD16 *ucDesc; /* The UniCode description (null terminated) */ - - ORD16 scCode; /* ScriptCode code */ - unsigned long scSize; /* Used size of scDesc in bytes, inc null */ - ORD8 scDesc[67]; /* ScriptCode Description (null terminated, max 67) */ -}; typedef struct _icmTextDescription icmTextDescription; - -/* Profile sequence structure */ -struct _icmDescStruct { - /* Private: */ - struct _icc *icp; /* Pointer to ICC we're a part of */ - - /* Public: */ - int (*allocate)(struct _icmDescStruct *p); /* Allocate method */ - icmSig deviceMfg; /* Dev Manufacturer */ - unsigned int deviceModel; /* Dev Model */ - icmUint64 attributes; /* Dev attributes */ - icTechnologySignature technology; /* Technology sig */ - icmTextDescription device; /* Manufacturer text (sub structure) */ - icmTextDescription model; /* Model text (sub structure) */ -}; typedef struct _icmDescStruct icmDescStruct; - -/* Profile sequence description */ -struct _icmProfileSequenceDesc { - ICM_BASE_MEMBERS - - /* Private: */ - unsigned int _count; /* number currently allocated */ - - /* Public: */ - unsigned int count; /* Number of descriptions */ - icmDescStruct *data; /* array of [count] descriptions */ -}; typedef struct _icmProfileSequenceDesc icmProfileSequenceDesc; - -/* signature (only ever used for technology ??) */ -struct _icmSignature { - ICM_BASE_MEMBERS - - /* Public: */ - icTechnologySignature sig; /* Signature */ -}; typedef struct _icmSignature icmSignature; - -/* Per channel Screening Data */ -typedef struct { - /* Public: */ - double frequency; /* Frequency */ - double angle; /* Screen angle */ - icSpotShape spotShape; /* Spot Shape encodings below */ -} icmScreeningData; - -struct _icmScreening { - ICM_BASE_MEMBERS - - /* Private: */ - unsigned int _channels; /* number currently allocated */ - - /* Public: */ - unsigned int screeningFlag; /* Screening flag */ - unsigned int channels; /* Number of channels */ - icmScreeningData *data; /* Array of screening data */ -}; typedef struct _icmScreening icmScreening; - -/* Under color removal, black generation */ -struct _icmUcrBg { - ICM_BASE_MEMBERS - - /* Private: */ - unsigned int UCR_count; /* Currently allocated UCR count */ - unsigned int BG_count; /* Currently allocated BG count */ - unsigned long _size; /* Currently allocated string size */ - - /* Public: */ - unsigned int UCRcount; /* Undercolor Removal Curve length */ - double *UCRcurve; /* The array of UCR curve values, 0.0 - 1.0 */ - /* or 0.0 - 100 % if count = 1 */ - unsigned int BGcount; /* Black generation Curve length */ - double *BGcurve; /* The array of BG curve values, 0.0 - 1.0 */ - /* or 0.0 - 100 % if count = 1 */ - unsigned long size; /* Allocated and used size of desc, inc null */ - char *string; /* UcrBg description (null terminated) */ -}; typedef struct _icmUcrBg icmUcrBg; - -/* viewingConditionsType */ -struct _icmViewingConditions { - ICM_BASE_MEMBERS - - /* Public: */ - icmXYZNumber illuminant; /* In candelas per sq. meter */ - icmXYZNumber surround; /* In candelas per sq. meter */ - icIlluminant stdIlluminant; /* See icIlluminant defines */ -}; typedef struct _icmViewingConditions icmViewingConditions; - -/* Postscript Color Rendering Dictionary names type */ -struct _icmCrdInfo { - ICM_BASE_MEMBERS - /* Private: */ - unsigned long _ppsize; /* Currently allocated size */ - unsigned long _crdsize[4]; /* Currently allocated sizes */ - - /* Public: */ - unsigned long ppsize; /* Postscript product name size (including null) */ - char *ppname; /* Postscript product name (null terminated) */ - unsigned long crdsize[4]; /* Rendering intent 0-3 CRD names sizes (icluding null) */ - char *crdname[4]; /* Rendering intent 0-3 CRD names (null terminated) */ -}; typedef struct _icmCrdInfo icmCrdInfo; - -/* Apple ColorSync 2.5 video card gamma type */ -struct _icmVideoCardGammaTable { - unsigned short channels; /* # of gamma channels (1 or 3) */ - unsigned short entryCount; /* 1-based number of entries per channel */ - unsigned short entrySize; /* size in bytes of each entry */ - void *data; /* variable size data */ -}; typedef struct _icmVideoCardGammaTable icmVideoCardGammaTable; - -struct _icmVideoCardGammaFormula { - double redGamma; /* must be > 0.0 */ - double redMin; /* must be > 0.0 and < 1.0 */ - double redMax; /* must be > 0.0 and < 1.0 */ - double greenGamma; /* must be > 0.0 */ - double greenMin; /* must be > 0.0 and < 1.0 */ - double greenMax; /* must be > 0.0 and < 1.0 */ - double blueGamma; /* must be > 0.0 */ - double blueMin; /* must be > 0.0 and < 1.0 */ - double blueMax; /* must be > 0.0 and < 1.0 */ -}; typedef struct _icmVideoCardGammaFormula icmVideoCardGammaFormula; - -enum { - icmVideoCardGammaTableType = 0, - icmVideoCardGammaFormulaType = 1 -}; - -struct _icmVideoCardGamma { - ICM_BASE_MEMBERS - unsigned long tagType; /* eg. table or formula, use above enum */ - union { - icmVideoCardGammaTable table; - icmVideoCardGammaFormula formula; - } u; -}; typedef struct _icmVideoCardGamma icmVideoCardGamma; - -/* ------------------------------------------------- */ -/* The Profile header */ -struct _icmHeader { - /* Private: */ - unsigned int (*get_size)(struct _icmHeader *p); - int (*read)(struct _icmHeader *p, unsigned long len, unsigned long of); - int (*write)(struct _icmHeader *p, unsigned long of); - void (*del)(struct _icmHeader *p); - struct _icc *icp; /* Pointer to ICC we're a part of */ - unsigned int size; /* Profile size in bytes */ - - /* public: */ - void (*dump)(struct _icmHeader *p, FILE *op, int verb); - - /* Values that must be set before writing */ - icProfileClassSignature deviceClass; /* Type of profile */ - icColorSpaceSignature colorSpace; /* Clr space of data */ - icColorSpaceSignature pcs; /* PCS: XYZ or Lab */ - icRenderingIntent renderingIntent;/* Rendering intent */ - - /* Values that should be set before writing */ - icmSig manufacturer; /* Dev manufacturer */ - icmSig model; /* Dev model */ - icmUint64 attributes; /* Device attributes.l */ - unsigned int flags; /* Various bits */ - - /* Values that may optionally be set before writing */ - /* icmUint64 attributes; Device attributes.h (see above) */ - icmSig creator; /* Profile creator */ - - /* Values that are not normally set, since they have defaults */ - icmSig cmmId; /* CMM for profile */ - int majv, minv, bfv;/* Format version - major, minor, bug fix */ - icmDateTimeNumber date; /* Creation Date */ - icPlatformSignature platform; /* Primary Platform */ - icmXYZNumber illuminant; /* Profile illuminant */ - -}; typedef struct _icmHeader icmHeader; - -/* ---------------------------------------------------------- */ -/* Objects for accessing lookup functions */ - -/* Public: Parameter to get_luobj function */ -typedef enum { - icmFwd = 0, /* Device to PCS, or Device 1 to Last Device */ - icmBwd = 1, /* PCS to Device, or Last Device to Device */ - icmGamut = 2, /* PCS Gamut check */ - icmPreview = 3 /* PCS to PCS preview */ -} icmLookupFunc; - -/* Public: Parameter to get_luobj function */ -typedef enum { - icmLuOrdNorm = 0, /* Normal profile preference: Lut, matrix, monochrome */ - icmLuOrdRev = 1 /* Reverse profile preference: monochrome, matrix, monochrome */ -} icmLookupOrder; - -/* Public: Lookup algorithm object type */ -typedef enum { - icmMonoFwdType = 0, /* Monochrome, Forward */ - icmMonoBwdType = 1, /* Monochrome, Backward */ - icmMatrixFwdType = 2, /* Matrix, Forward */ - icmMatrixBwdType = 3, /* Matrix, Backward */ - icmLutType = 4 /* Multi-dimensional Lookup Table */ -} icmLuAlgType; - -#define LU_ICM_BASE_MEMBERS \ - /* Private: */ \ - icmLuAlgType ttype; /* The object tag */ \ - struct _icc *icp; /* Pointer to ICC we're a part of */ \ - icRenderingIntent intent; /* Effective intent */ \ - icmLookupFunc function; /* Functionality being used */ \ - icmXYZNumber pcswht, whitePoint, blackPoint; /* White and black point info */ \ - double toAbs[3][3]; /* Matrix to convert from relative to absolute */ \ - double fromAbs[3][3]; /* Matrix to convert from absolute to relative */ \ - icColorSpaceSignature inSpace; /* Native Clr space of input */ \ - icColorSpaceSignature outSpace; /* Native Clr space of output */ \ - icColorSpaceSignature pcs; /* Native PCS */ \ - icColorSpaceSignature e_inSpace; /* Effective Clr space of input */ \ - icColorSpaceSignature e_outSpace; /* Effective Clr space of output */ \ - icColorSpaceSignature e_pcs; /* Effective PCS */ \ - \ - /* Public: */ \ - void (*del)(struct _icmLuBase *p); \ - /* Internal native colorspaces */ \ - void (*lutspaces) (struct _icmLuBase *p, icColorSpaceSignature *ins, int *inn, \ - icColorSpaceSignature *outs, int *outn); \ - \ - /* External effecive colorspaces */ \ - void (*spaces) (struct _icmLuBase *p, icColorSpaceSignature *ins, int *inn, \ - icColorSpaceSignature *outs, int *outn, \ - icmLuAlgType *alg, icRenderingIntent *intt, \ - icmLookupFunc *fnc, icColorSpaceSignature *pcs); \ - \ - /* Get the effective input space and output space ranges */ \ - void (*get_ranges) (struct _icmLuBase *p, \ - double *inmin, double *inmax, /* Maximum range of inspace values */ \ - double *outmin, double *outmax); /* Maximum range of outspace values */ \ - \ - void (*wh_bk_points)(struct _icmLuBase *p, icmXYZNumber *wht, icmXYZNumber *blk); \ - int (*lookup) (struct _icmLuBase *p, double *out, double *in); - - /* Translate color values through profile */ - /* 0 = success */ - /* 1 = warning: clipping occured */ - /* 2 = fatal: other error */ - -/* Base lookup object */ -struct _icmLuBase { - LU_ICM_BASE_MEMBERS -}; typedef struct _icmLuBase icmLuBase; - -/* Monochrome Fwd & Bwd type object */ -struct _icmLuMono { - LU_ICM_BASE_MEMBERS - icmCurve *grayCurve; - - /* Overall lookups */ - int (*fwd_lookup) (struct _icmLuBase *p, double *out, double *in); - int (*bwd_lookup) (struct _icmLuBase *p, double *out, double *in); - - /* Components of lookup */ - int (*fwd_curve) (struct _icmLuMono *p, double *out, double *in); - int (*fwd_map) (struct _icmLuMono *p, double *out, double *in); - int (*fwd_abs) (struct _icmLuMono *p, double *out, double *in); - int (*bwd_abs) (struct _icmLuMono *p, double *out, double *in); - int (*bwd_map) (struct _icmLuMono *p, double *out, double *in); - int (*bwd_curve) (struct _icmLuMono *p, double *out, double *in); - -}; typedef struct _icmLuMono icmLuMono; - -/* 3D Matrix Fwd & Bwd type object */ -struct _icmLuMatrix { - LU_ICM_BASE_MEMBERS - icmCurve *redCurve, *greenCurve, *blueCurve; - icmXYZArray *redColrnt, *greenColrnt, *blueColrnt; - double mx[3][3]; /* 3 * 3 conversion matrix */ - double bmx[3][3]; /* 3 * 3 backwards conversion matrix */ - - /* Overall lookups */ - int (*fwd_lookup) (struct _icmLuBase *p, double *out, double *in); - int (*bwd_lookup) (struct _icmLuBase *p, double *out, double *in); - - /* Components of lookup */ - int (*fwd_curve) (struct _icmLuMatrix *p, double *out, double *in); - int (*fwd_matrix) (struct _icmLuMatrix *p, double *out, double *in); - int (*fwd_abs) (struct _icmLuMatrix *p, double *out, double *in); - int (*bwd_abs) (struct _icmLuMatrix *p, double *out, double *in); - int (*bwd_matrix) (struct _icmLuMatrix *p, double *out, double *in); - int (*bwd_curve) (struct _icmLuMatrix *p, double *out, double *in); - -}; typedef struct _icmLuMatrix icmLuMatrix; - -/* Multi-D. Lut type object */ -struct _icmLuLut { - LU_ICM_BASE_MEMBERS - - /* private: */ - icmLut *lut; /* Lut to use */ - int usematrix; /* non-zero if matrix should be used */ - double imx[3][3]; /* 3 * 3 inverse conversion matrix */ - int imx_valid; /* Inverse matrix is valid */ - void (*in_normf)(double *out, double *in); /* Lut input data normalizing function */ - void (*in_denormf)(double *out, double *in);/* Lut input data de-normalizing function */ - void (*out_normf)(double *out, double *in); /* Lut output data normalizing function */ - void (*out_denormf)(double *out, double *in);/* Lut output de-normalizing function */ - void (*e_in_denormf)(double *out, double *in);/* Effective input de-normalizing function */ - void (*e_out_denormf)(double *out, double *in);/* Effecive output de-normalizing function */ - /* function chosen out of lut->lookup_clut_sx and lut->lookup_clut_nl to imp. clut() */ - int (*lookup_clut) (struct _icmLut *pp, double *out, double *in); /* clut function */ - - /* public: */ - - /* Components of lookup */ - int (*in_abs) (struct _icmLuLut *p, double *out, double *in); /* Should be in icmLut ? */ - int (*matrix) (struct _icmLuLut *p, double *out, double *in); - int (*input) (struct _icmLuLut *p, double *out, double *in); - int (*clut) (struct _icmLuLut *p, double *out, double *in); - int (*output) (struct _icmLuLut *p, double *out, double *in); - int (*out_abs) (struct _icmLuLut *p, double *out, double *in); /* Should be in icmLut ? */ - - /* Some inverse components */ - /* Should be in icmLut ??? */ - int (*inv_out_abs) (struct _icmLuLut *p, double *out, double *in); - int (*inv_output) (struct _icmLuLut *p, double *out, double *in); - /* inv_clut is beyond scope of icclib. See argyll for solution! */ - int (*inv_input) (struct _icmLuLut *p, double *out, double *in); - int (*inv_matrix) (struct _icmLuLut *p, double *out, double *in); - int (*inv_in_abs) (struct _icmLuLut *p, double *out, double *in); - - /* Get various types of information about the LuLut */ - void (*get_info) (struct _icmLuLut *p, icmLut **lutp, - icmXYZNumber *pcswhtp, icmXYZNumber *whitep, - icmXYZNumber *blackp); - - /* Get the native input space and output space ranges */ - void (*get_lutranges) (struct _icmLuLut *p, - double *inmin, double *inmax, /* Maximum range of inspace values */ - double *outmin, double *outmax); /* Maximum range of outspace values */ - - /* Get the matrix contents */ - void (*get_matrix) (struct _icmLuLut *p, double m[3][3]); - -}; typedef struct _icmLuLut icmLuLut; - -/* ---------------------------------------------------------- */ -/* A tag */ -typedef struct { - icTagSignature sig; /* The tag signature */ - icTagTypeSignature ttype; /* The tag type signature */ - unsigned int offset; /* File offset to start header */ - unsigned int size; /* Size in bytes */ - icmBase *objp; /* In memory data structure */ -} icmTag; - -/* Pseudo enumerations valid as parameter to get_luobj(): */ - -/* To be specified where an intent is not appropriate */ -#define icmDefaultIntent ((icRenderingIntent)98) - -/* Pseudo PCS colospace used to indicate the native PCS */ -#define icmSigDefaultData ((icColorSpaceSignature) 0x0) - -/* The ICC object */ -struct _icc { - /* Public: */ - unsigned int (*get_size)(struct _icc *p); /* Return total size needed, 0 = err. */ - int (*read)(struct _icc *p, icmFile *fp, unsigned long of); /* Returns error code */ - int (*write)(struct _icc *p, icmFile *fp, unsigned long of);/* Returns error code */ - void (*dump)(struct _icc *p, FILE *op, int verb); /* Dump whole icc */ - void (*del)(struct _icc *p); /* Free whole icc */ - int (*find_tag)(struct _icc *p, icTagSignature sig); - /* Returns 1 if found, 2 readable */ - icmBase * (*read_tag)(struct _icc *p, icTagSignature sig); - /* Returns pointer to object */ - icmBase * (*add_tag)(struct _icc *p, icTagSignature sig, icTagTypeSignature ttype); - /* Returns pointer to object */ - int (*rename_tag)(struct _icc *p, icTagSignature sig, icTagSignature sigNew); - /* Rename and existing tag */ - icmBase * (*link_tag)(struct _icc *p, icTagSignature sig, icTagSignature ex_sig); - /* Returns pointer to object */ - int (*unread_tag)(struct _icc *p, icTagSignature sig); - /* Unread a tag (free on refcount == 0 */ - int (*read_all_tags)(struct _icc *p); /* Read all the tags, non-zero on error. */ - - int (*delete_tag)(struct _icc *p, icTagSignature sig); - /* Returns 0 if deleted OK */ - icmLuBase * (*get_luobj) (struct _icc *p, - icmLookupFunc func, /* Functionality */ - icRenderingIntent intent, /* Intent */ - icColorSpaceSignature pcsor, /* PCS overide (0 = def) */ - icmLookupOrder order); /* Search Order */ - /* Return appropriate lookup object */ - /* NULL on error, check errc+err for reason */ - - icmHeader *header; /* The header */ - char err[512]; /* Error message */ - int errc; /* Error code */ - - /* Private: ? */ - icmAlloc *al; /* Heap allocator */ - int del_al; /* NZ if heap allocator should be deleted */ - icmFile *fp; /* File associated with object */ - unsigned long of; /* Offset of the profile within the file */ - unsigned int count; /* Num tags in the profile */ - icmTag *data; /* The tagTable and tagData */ - - }; typedef struct _icc icc; - -/* ========================================================== */ -/* Utility structures and declarations */ - -/* Structure to hold pseudo-hilbert counter info */ -struct _psh { - int di; /* Dimensionality */ - unsigned res; /* Resolution per coordinate */ - unsigned bits; /* Bits per coordinate */ - unsigned ix; /* Current binary index */ - unsigned tmask; /* Total 2^n count mask */ - unsigned count; /* Usable count */ -}; typedef struct _psh psh; - -/* Type of encoding to be returned as a string */ -typedef enum { - icmScreenEncodings, - icmDeviceAttributes, - icmProfileHeaderFlags, - icmAsciiOrBinaryData, - icmTagSignature, - icmTechnologySignature, - icmTypeSignature, - icmColorSpaceSignature, - icmProfileClassSignaure, - icmPlatformSignature, - icmMeasurementFlare, - icmMeasurementGeometry, - icmRenderingIntent, - icmSpotShape, - icmStandardObserver, - icmIlluminant, - icmLuAlg -} icmEnumType; - -/* ========================================================== */ -/* Public function declarations */ -/* Create an empty object. Return null on error */ -extern ICCLIB_API icc *new_icc(void); /* Default allocator */ -extern ICCLIB_API icc *new_icc_a(icmAlloc *al); /* With allocator class */ - -/* - - - - - - - - - - - - - */ -/* Some useful utilities: */ - -/* Return a string that represents a tag */ -extern ICCLIB_API char *tag2str(int tag); - -/* Return a tag created from a string */ -extern ICCLIB_API int str2tag(const char *str); - -/* Return a string description of the given enumeration value */ -extern ICCLIB_API const char *icm2str(icmEnumType etype, int enumval); - -/* CIE XYZ to perceptual Lab */ -extern ICCLIB_API void icmXYZ2Lab(icmXYZNumber *w, double *out, double *in); - -/* Perceptual Lab to CIE XYZ */ -extern ICCLIB_API void icmLab2XYZ(icmXYZNumber *w, double *out, double *in); - -/* The standard D50 illuminant value */ -extern ICCLIB_API icmXYZNumber icmD50; - -/* The standard D65 illuminant value */ -extern ICCLIB_API icmXYZNumber icmD65; - -/* The default black value */ -extern ICCLIB_API icmXYZNumber icmBlack; - -/* Initialise a pseudo-hilbert grid counter, return total usable count. */ -extern ICCLIB_API unsigned psh_init(psh *p, int di, unsigned res, int co[]); - -/* Reset the counter */ -extern ICCLIB_API void psh_reset(psh *p); - -/* Increment pseudo-hilbert coordinates */ -/* Return non-zero if count rolls over to 0 */ -extern ICCLIB_API int psh_inc(psh *p, int co[]); - -/* Chromatic Adaption transform utility */ -/* Return a 3x3 chromatic adaption matrix */ -void icmChromAdaptMatrix( - int flags, /* Flags as defined below */ - icmXYZNumber d_wp, /* Destination white point */ - icmXYZNumber s_wp, /* Source white point */ - double mat[3][3] /* Destination matrix */ -); - -#define ICM_CAM_BRADFORD 0x0001 /* Use Bradford sharpened response space */ -#define ICM_CAM_MULMATRIX 0x0002 /* Transform the given matrix */ - -/* Return the normal Delta E given two Lab values */ -extern ICCLIB_API double icmLabDE(double *in1, double *in2); - -/* Return the normal Delta E squared, given two Lab values */ -extern ICCLIB_API double icmLabDEsq(double *in1, double *in2); - -/* Return the CIE94 Delta E color difference measure for two Lab values */ -extern ICCLIB_API double icmCIE94(double *in1, double *in2); - -/* Return the CIE94 Delta E color difference measure squared, for two Lab values */ -extern ICCLIB_API double icmCIE94sq(double *in1, double *in2); - -/* Simple macro to transfer an array to an XYZ number */ -#define icmAry2XYZ(xyz, ary) ((xyz).X = (ary)[0], (xyz).Y = (ary)[1], (xyz).Z = (ary)[2]) - -/* And the reverse */ -#define icmXYZ2Ary(ary, xyz) ((ary)[0] = (xyz).X, (ary)[1] = (xyz).Y, (ary)[2] = (xyz).Z) - -/* ---------------------------------------------------------- */ - -#ifdef __cplusplus - } -#endif - -#endif /* ICC_H */ diff -Nru ghostscript-9.04~dfsg/icclib/Licence.txt ghostscript-9.05~dfsg~20120125/icclib/Licence.txt --- ghostscript-9.04~dfsg/icclib/Licence.txt 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/icclib/Licence.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -************************************************************************* -Copyright (c) 1997-2002 Graeme W. Gill - -Permission is hereby granted, to use, copy, modify, distribute, -and sell this software and its associated documentation files -(the "Software") for any purpose without fee, provided -that: - - 1) The above copyright notices and this permission notice - accompany all source code copies of the Software and - related documentation. -and - - 2) If executable code based on the Software only is distributed, - then the accompanying documentation must aknowledge that - "this software is based in part on the work of Graeme W. Gill". -and - - 3) It is accepted that Graeme W. Gill (the "Author") accepts - NO LIABILITY for damages of any kind. The Software is - provided without fee by the Author "AS-IS" and without - warranty of any kind, express, implied or otherwise, - including without limitation, any warranty of merchantability - or fitness for a particular purpose. -and - - 4) These conditions apply to any software derived from or based - on the Software, not just to the unmodified library. -and - - 5) Except as contained in this notice, or in the required - acknowledgment, the name of the Author, or the name of - any organization or company affiliated with the Author - may not be used in any advertising or publicity relating - to the Software, without the specific, prior written - permission of the Author. - -************************************************************************* diff -Nru ghostscript-9.04~dfsg/icclib/NOTES ghostscript-9.05~dfsg~20120125/icclib/NOTES --- ghostscript-9.04~dfsg/icclib/NOTES 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/icclib/NOTES 1970-01-01 00:00:00.000000000 +0000 @@ -1,310 +0,0 @@ -This directory contains a subset of the icclib 2.0 distribution for -use with Ghostscript. The full version of icclib is available from -Graeme Gill's website: http://web.access.net.au/argyll/color.html - -In the near future, we expect to treat icclib much the same way we -do libjpeg and friends. At that point, it will be available from -the Ghostscript download locations, but won't actually be included -in the Ghostscript distribution proper, or in the source tree. - -Raph Levien -18 October 2001 - -Release notes by Jan Stoeckenius follow (lightly edited by Raph Levien -to reflect the icclib 2.0 integration): - -This patch integrates Graeme W. Gill's icclib code into ghostscript, -to support ICCBased color spaces for both PostScript and PDF. - -The PDF support is as documented in version 1.3 of PDF; see the "PDR -Reference", 2nd. ed., Sec. 4.5.4 (pp. 165 - 180). - -Support for PostScript is essentially identical. An ICCBased color space is -array of the form: - - [ /ICCBased ] - -The recognized entries in the dictionary are: - - N integer (Required) The number of color space components, - as in the PDF dictionary. This may be 1, 3, or 4. - - Alternate array or (Optional) The alternative color space to use if - name the ICC profile is not useable (for any reason). - If this entry is not provided, its default value - is determined by N, using the rule 1 ==> DeviceGray, - 3 ==> DeviceRGB, 4 ==> DeviceCMYK. All this is - the same as in the PDF dictionary. - - Range array (Optional) An array of 2 * N numbers, which obey - the relationship Range[2 * i] <= Range[2 * i + 1]. - The i'th component of a color, c[i], is - constrained such that: - - Range[2 * i] <= c[i] <= Range[2 * i + 1] - - If this entry is not provided, its default value - is an array of length 2 * N with the form - [ 0 1 0 1 ... ]. All of this is the same as for - the PDF dictionary. - - DataSource file or (Required)The ICC profile data. If this is a - string file it must be positionable. - -With the exception of running out of memory, most errors discovered while -reading the profile will result in the alternative space being used. - - -New Files: - - src/gsicc.c - Implementation of the methods associated with the ICCBased color space - structure (a gs_color_space_s structure of type gs_color_space_index_CIEICC). - The gs_cspace_build_CIEICC procedure is also implemented in this file. - - src/gsicc.h - Definition of the gs_cie_icc_s structure, which is the essential - parameter structure for ICCBased color spaces. The files in this - structure are all straightforward, except for the file_id field. This - latter field is compared with the read_id and write_id of a stream, - to verify that the stream is still valid. This is the same mechanism - as is used by the ref structure, and for the same reason. - - src/zicc.c - Implementation of the .seticcspace operator, which is used to set the - current color space to be an ICCBased color space. - - src/icclib.mak - Makefile for building the icclib code (which is in a separate directory). - The mechanism used is identical to that used by zlib.mak. - - lib/gs_icc.ps - Implementation of the ICCBased color space specific routine in - colorspacedict. This routine is much more extensive that those used - for the other color spaces, both due to the greater complexity of the - color space and because we have chosen to implement much of the error - checking in this routine. - - NB: To disable support for ICCBased color spaces, replace "NOCIE" in - this file with "true". Though ICCBased will still be a recognized - color space family, the alternative space will always be used. - - gs_icclib/icc.c - gs_icclib/icc.h - gs_icclib/icc9809.h - The gs_icclib directory is the default location of the icclib code. - The files in this directory are identical to those of the usual - distribution of this library. - - -Modified Files: - - src/gdevpdfc.c - Added support for ICCBased color spaces to the pdf_color_space procedure. - These are effectively translated into themselves, with the DataSource - component replaced by a (PDF) stream. - - src/gdevpx.c - Added ICCBased to the set of color spaces that - pclxl_can_handle_color_space reports as one that cannot be handled. - - src/gscie.c - Added support for ICCBased color spaces in the cie_cs_common_abc - procedure. Also exported gx_cie_common_complete (previously - cie_common_complete) and gx_cie_load_common_cache (previously - cie_load_common_cache) for use in gsicc.c. - - src/gscie.h - Modified the definitions of st_cie_common and st_cie_common_elements - to be public. - - src/gsciemap.c - Removed the definition of the macro CIE_CHECK_RENDERING (it is now in - gxcie.h). Exported gx_cie_remap_finish (previously cie_remap_finish) - for use in gsicc.c. - - src/gscolor.c - Added support for ICCBased color spaces in gs_currentrgbcolor. - - src/gscolor1.c - Added support for ICCBased color spaces in gs_currentcmykcolor. - - src/gscscie.c - Exported st_cie_common, st_cie_common_elements, gx_concrete_space_CIE, - gx_install_CIE, gx_set_common_cie_defaults (previously - set_common_cie_defaults), and gx_build_cie_space (previously - build_cie_space) for use in gsicc.c. - - src/gscspace.h - Added the gs_icc_params data structure (for ICCBased color spaces), - and the associated type indicator (gs_color_space_index_CIEICC). Also - broke what had been the gs_base_color_space structure into two, with - gs_small_base_color_space covering all the prior base color spaces, - and gs_base_color_space covering these and the ICCBased color space. - See the comments in the file for an explanation as to why this was - necessary. - - src/gscssub.c - Added code to allow ICCBased color spaces to be substituted for the - device specific color spaces. This is necessary to support the - DefaultDevice* color spaces in PDF. - - src/gxcie.h - Moved the definition of the CIE_CHECK_RENDERING macro to this file - (it was in gsciemap.c). Added prototypes for st_cie_common, - st_cie_common_elemets_t, gx_set_common_cie_defaults, - gx_cie_load_common_cache, gx_cie_common_complete, gx_install_CIE, - gx__build_cie_space, and gs_concrete_cspace_CIE. - - src/gxshade.c - Added support for ICCBased color spaces in shade_init_fill_state. - - src/icie.h - Added a prototype for cie_set_finish. - - src/zcie.c - Exported cie_set_finish (previously set_cie_finish) for use in zicc.c - (the name change maintains consistency with other exported CIE-specific - interpreter routines). - - src/lib.mak - Added the sicclib.dev feature device, and the associated compilation - directives and dependency lists. Also updated the dependency lists - for gscie.c and gxshade.c (both now require gsicc.h). - - src/int.mak - Added the icc.dev feature device, and the associated compilation - directives and dependency lists. This pdf.dev feature device now - lists icc.dev as a prerequisite. - - src/devs.mak - Updated the dependency list for gdevpdfc.c. - - src/bcwin32.mak - src/dvx-gcc.mak - src/msvc32.mak - src/msvclib.mak - src/openvms.mak - src/os2.mak - src/ugcclib.mak - src/unix-gcc.mak - src/unixansi.mak - src/unixtrad.mak - src/watc.mak - src/watclib.mak - src/watcw32.mak - Added a default definition for ICCSRCDIR, the source directory for - the icclib code. - - src/gs.mak - Added default definitions for ICCGENDIR, ICCOBJDIR, ICCI_ (ICC specific - include directories), and ICCF_ (currently empty). - - - lib/pdf_draw.ps - Added ICCBased color space specific procedures for csncompdict and - defaultdecodedict. Modified the ICCBased color space procedure in - csrdict to map a PDF-form color space to the PostScript form. - - lib/pdf__ops.ps - Added ICCBased color space specific procedure to CSdict and Cdict. - -Additional notes by Jan Stoeckenius: - -1. The color produced when ICCBased color spaces are employed is - dependent on the installed color rendering dictionary. For the - default X11 device, this dictionary does not provide correction - for the relative white point (at least, not as far as we can tell). - ICC profiles use the D50 white point. In the absence of white point - adjustment, "white" in the associated color space appears to be - a moderate yellow on the output device (other colors are similarly - "red-shifted"). - - This arrangement has the advantage of making it obvious when ICCBased - color spaces are supported (useful for testing). On the other hand, - the output is probably not what the user intended. - - If you have any devices with known "good" color rendering dictionaries, - it would be useful to test ICCBased color space support on those - devices as soon as possible. - -2. The tests we have run do not exercise the memory handling facilities - in ghostscript to any extent. The support for ICCBased color spaces - involves two new structures, for which we have provided structure - descriptors. We believe these have been correctly constructed, and - that the one reference-counted structure is being handled properly, - but we have no simple way of testing for this. - -3. Changes were required in an unexpectedly large number of files - (9 new files, 34 existing files [these figures refer to the - integration into 7.00 - RLL]), though in many cases only a few - lines needed to be modified. - - The primary reason for this is that the graphic library color space - code severely violates the principles of object-oriented programming. - Color space objects have a visible type indicator, and this type is - directly used in many places. When adding a new color space type, it - was not sufficient to create the associated methods. We also had to - search the code for all places in which a color space type indicator - was explicitly accessed. - - We believe we have found all the places where this occurs, and have - modified them appropriately (see the ReleaseNotes file for details). - On the other hand, we have not come remotely close to testing all of - these changes, nor is there any easy test to see if there are places - we missed. - - When Peter was the only person working on the graphic library, - this situation was bothersome but probably not critical. In the - new environment in which ghostscript is being developed, we believe - this situation will lead to serious problems. We recommend that a - project be started to make the color space code much more object- - oriented, by creating color space methods for all of the required - color space properties. - -4. The current method of "inline" storage of alternative/base color spaces - is becoming hard to maintain. Strictly speaking, ICCBased color spaces - cannot be implemented within this mechanism: the color spaces may be - (and are) used as alternative color spaces for Separation and DeviceN - color spaces, and may in turn access such color spaces as their own - alternative color space. We hacked around this problem by disallowing - the latter possibility, and introducing yet another layer in the - color space hierarchy. The class gs_base_color_space is now split - into gs_small_base_color_space (all of the previous base color spaces) - and gs_base_color_space (gs_small_base_color_space and ICCBased color - spaces). This is an unholy mess, but at least it seems to be functional. - - As the number of layers in the color space hierarchy grows, so does the - potential for serious and well-hidden problems. The reason is that - pointers to alternative/base color spaces may point into the middle of - an object. If such a pointer is accessible via the heap, and is subject - to relocation, the location of the structure descriptor will be read - incorrectly. By the time this error is apparent, much of the affected - memory may be overwritten. Tracing such problems is typically quite - time-consuming. - - The original guard against this problem was to perform all color space - assignments by value. This worked when Peter was the only person regularly - changing the code, and may continue to work under the current arrangement. - We believe, however, that this situation will cause trouble in the - future. - - We recommend that the current color space mechanism be discarded. A new - mechanism should allow alternative/base color spaces to be included by - reference rather than by value. Such a mechanism should also move the - generic color space parameters (number of components, additive/subtractive - indicator, etc.) into the base structure, even if these parameters are - fixed for certain color spaces. - -5. The PDF device code currently attempts to translate PostScript's - CIEBased color spaces into the more restrictive set of CIE color spaces - in PDF. Many color spaces cannot be translated directly, and the code - will fail if such a color space is encountered. - - We have generalized this code to handle ICCBased color spaces, which - effectively are translated to themselves. A much more complete solution - could be provided by mapping PostScript's CIEBased color spaces into - ICCBased color spaces in PDF. Essentially all CIEBased color spaces - could be handled in this manner (via sample and generation of a lookup - table). - diff -Nru ghostscript-9.04~dfsg/icclib/Readme.txt ghostscript-9.05~dfsg~20120125/icclib/Readme.txt --- ghostscript-9.04~dfsg/icclib/Readme.txt 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/icclib/Readme.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,153 +0,0 @@ -ICC profile I/O library (icclib), README file - -Date 2002/4/22, Version 2.02 - -This distribution contains source code which implements the reading and -writing of color profile files that conform to the International Color -Consortium (ICC) Profile Format Specification, Version 3.4. - -For more information about the ICC, and for copies of the specification, -please refer to http://www.color.org/. - -(Note that this software is written from the ICC V3.4 standard, but the -software and its author are not affiliated with, or otherwise connected -with the ICC.) - -The ICC profile I/O library archive is kept at -http://web.access.net.au/argyll/color.html - -(Version 2.02 is has a few minor changes and fixups from V2.00. -See icc.c for a more detailed change history.) - -Motivation - -Color is still very much a black art to many programmers dealing with -computer graphics. The ICC Profile Format is an industry attempt to provide -an interchange format to help solve the problems of specifying color, and -in transferring color graphics from, and between systems and devices. -Although the ICC format has been around a number of years, and has long -been adopted by companies in the business of providing systems for -publishing and printing, and is now widely used as part of commercial -operating system support for device independent color, its uptake in the -general world of computer graphics has been slow. - -The writing of this library was prompted by my private and professional -enthusiasm for computer graphics, and color. Inspired by other examples of -freely usable software (notably the Independent JPEG Group's free JPEG -software, and Sam Leffler's TIFF library), I have decided to make this -library available under similar terms. I hope that this library will -provide a starting point for including ICC profile support more widely that -is currently the case, particularly in open source code projects. - -Overview - -This package contains a C software implementation of the ICC Profile -Format, Version 3.4. The ICC Profile Format attempts to provide a -cross-platform device profile format, that can be used to translate color -data created on one device into another device's native color space. For a -fuller explanation of what the ICC Profile Format is all about, please -refer to http://www.color.org, and the profile specification. - -In summary this library provides: - - * Full source code, free for commercial and non-commercial use. - * Support for all version 3.4 header elements, Tags and Tag Types. - * Conversion to/from machine native representation of all data - types. - * Support for user defined Tags. - * Support for adding/deleting Tags. - * Support for Tag type sharing within a file (often used for - sharing LUTs amongst intents). - * Support for reading/writing embedded profiles, including - from/to a memory buffer, rather than a file. - * Provides a single function for transforming color values through - a profile, including support for intents, forward and reverse - transforms, gamut lookup or preview lookup. - * Provides support and code examples for creating all profile - types, monochrome, matrix and Lut. - * Attempts to be platform neutral. - * Loads Tag Types on demand to conserve memory space. - -Changes from V1.30 - - Change absolute conversion to be white point only, and use - Bradford transform by default. (ie. we are now ignoring the - comment in section 6.4.22 of the 1998 spec. about the - media black point being used for absolute colorimetry, - ignoring the recommendation on page 118 in section E.5, - and are taking up the recommendation on page 124 in section - E.16 that a more sophisticated chromatic adaption model be used.) - - This is for better compatibility with other CMM's, and to - improve the results when using simple links between - profiles with non-D50 white points. Standard profiles - like sRGB will also be more accurate when interpreted - with absolute colorimetric intent. - This will cause some slight profile inaccuracy when used - with profile created with previous versions of icclib. - - Added file I/O class to allow substitution of alternative ICC profile - file access. Provide standard file class instance, and memory image - instance of file I/O class as default and example. - Added an optional new_icc_a() object creator, that takes a memory - allocator class instance. This allows an alternate memory heap to - be used with the icc class. - Renamed object free() methods to del() for more consistency with new(). - - Added ColorSync 2.5 specific VideoCardGamma tag support (from Neil Okamoto) - -Package contents: - - icclib.zip ZIP archive of the following files - README This file. - Licence.txt Important! - Permissions for use of this package. - icc.c Library source file. - - icc.h Library include file. Note machine dependent defines. Includes - icc9809.h. - icc9809.h Lightly modified standard ICC header file. - iccdump.c Program that dumps ASCII description of a profile. - - icclu.c Program that allows interactive or batch translation of color - values though a profile. - icctest.c Basic library tag Read/Write example and regression test code. - - lutest.c Color lookup regression test code, and example for creating - color profiles. - iccrw.c Source code skeleton for reading and then re-writing a profile. - jamfile JAM style "makefile" see http://www.perforce.com/jam/jam.html - makefile UNIX style makefile. Modify this to suite your system. - - -Style - -For handling convenience, I have included all the library source code in -two files. The down side is that they are both hard to read and navigate -through. The code could do with some cleaning up and rearrangement, to make -clear the distinction between public and private elements. (C++ would help -here, but is less portable.) The code attempts to be ANSI C compliant, -written in an object oriented style. Unfortunately, it has not been tested -on a wide variety of platforms, nor with a very wide set of color profiles, -so there my well be a number of bugs to discover. A tutorial on how to use -the library would also be a good thing ! - -The best way to learn how to use the library, is to take a look at -icctest.c, lutest.c and iccrw.c. The first is used to test writing and -reading to every type of element, with every possible variation of usage. -You will need a copy of the ICC spec. handy to understand what it all -means. The second source file specifically creates and then tests various -types of profiles, including monochrome, matrix and Lut style profiles. The -last is a source code skeleton, that reads a profile completely into -memory, and then writes it out again to a different file. - -With the release of version 2.02 of icclib, the library is now as useful as -it is likely to be, allowing convenient color conversion between PCS -(profile connection spaces, either XYZ or Lab) and device specific color -spaces. The library does not attempt to be a complete color management -system however, lacking profile creation and linking functionality. -(The Argyll CMS provides full CMS functionality.) - -I welcome feedback, positive or negative, so please mail me at -GraemeGill@access.net.au - -Graeme Gill diff -Nru ghostscript-9.04~dfsg/imdi/arch.h ghostscript-9.05~dfsg~20120125/imdi/arch.h --- ghostscript-9.04~dfsg/imdi/arch.h 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/imdi/arch.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -#ifndef ARCH_H -#define ARCH_H - -/* Integer Multi-Dimensional Interpolation */ -/* - * Copyright 2000 Graeme W. Gill - * - * This material is licenced under the GNU GENERAL PUBLIC LICENCE :- - * see the Licence.txt file for licencing details. - */ - -#define STR_DEF(def) #def - -#ifdef ALLOW64 - -/* Detect machine/compiler specifics here */ -#if defined(NT) || defined(__WIN32__) -#define longlong __int64 -#else /* !NT, assume standard */ -#define longlong long long -#endif /* !NT */ -#define str_longlong STR_DEF(longlong) - -#endif /* ALLOW64 */ - -/* Machine/Language architectural specifications */ -typedef struct { - int bits; /* Bits in this data type */ - char *name; /* Name used to specify this type */ - int align; /* Non-zero if this type should be accessed aligned */ -} dtypes; - -#define MXDTYPES 6 - -typedef struct { - int bigend; /* Non-zero if this is a bigendian architecture */ - int uwa; /* Use wide memory access */ - - int pbits; /* Number of bits in a pointer */ - - int nords; /* Number of ord types */ - dtypes ords[MXDTYPES]; /* Ordinal types, in size order */ - int natord; /* Index of natural machine ordinal */ - - int nints; /* Number of int types */ - dtypes ints[MXDTYPES]; /* Integer types, in size order */ - int natint; /* Index of natural machine integer */ - - /* Optimisation settings */ - int shfm; /* Non-zero to use shifts for masking */ - int oscale; /* Maximum power of 2 scaled indexing mode, 0 for none. */ - int smmul; /* Has fast small multiply for index scaling */ - -} mach_arch; - -#endif /* ARCH_H */ diff -Nru ghostscript-9.04~dfsg/imdi/cctiff.c ghostscript-9.05~dfsg~20120125/imdi/cctiff.c --- ghostscript-9.04~dfsg/imdi/cctiff.c 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/imdi/cctiff.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1186 +0,0 @@ -/* - * Color Correct a TIFF file, using an ICC Device link profile. - * - * Author: Graeme W. Gill - * Date: 00/3/8 - * Version: 1.30 - * - * Copyright 2000 - 2004 Graeme W. Gill - * All rights reserved. - * - * This material is licenced under the GNU GENERAL PUBLIC LICENCE :- - * see the Licence.txt file for licencing details. - */ - -/* - * Thanks to Neil Okamoto for the 16 bit TIFF mods. - */ - -/* TTBD: - */ - -/* - This program is a framework that exercises the - IMDI code, as well as a demonstration of simple - profile linking. It can also do the conversion using the - floating point code in ICCLIB as a reference. - - */ - -#include -#include -#include -#include -#include -#include -#include "copyright.h" -#include "config.h" -#include "tiffio.h" -#include "icc.h" -#include "imdi.h" - -#undef TREAT_CMY_AS_RGB - -void error(char *fmt, ...), warning(char *fmt, ...); - -void usage(void) { - fprintf(stderr,"Color Correct a TIFF file using an ICC device link profile, V%s\n",ARGYLL_VERSION_STR); - fprintf(stderr,"Author: Graeme W. Gill, licensed under the GPL\n"); - fprintf(stderr,"usage: cctiff [-options] devlinkprofile.icm infile.tif outfile.tif\n"); - fprintf(stderr,"usage: cctiff [-options] -l inprofile.icm outprofile.icm infile.tif outfile.tif\n"); - fprintf(stderr," -v Verbose\n"); - fprintf(stderr," -c Combine linearisation curves into one transform\n"); - fprintf(stderr," -p Use slow precise correction\n"); - fprintf(stderr," -k Check fast result against precise, and report\n"); - fprintf(stderr," -l Link input and output profiles\n"); - fprintf(stderr," -i in_intent p = perceptual, r = relative colorimetric,\n"); - fprintf(stderr," s = saturation, a = absolute colorimetric\n"); - fprintf(stderr," -o out_intent p = perceptual, r = relative colorimetric,\n"); - fprintf(stderr," s = saturation, a = absolute colorimetric\n"); - exit(1); -} - -/* Convert an ICC colorspace to the corresponding possible TIFF Photometric tags. */ -/* Return the number of matching tags, and 0 if there is no corresponding tag. */ -int -ColorSpaceSignature2TiffPhotometric( -uint16 tags[10], /* Pointer to return array, up to 10 */ -icColorSpaceSignature cspace /* Input ICC colorspace */ -) { - switch(cspace) { - case icSigGrayData: - tags[0] = PHOTOMETRIC_MINISBLACK; - return 1; - case icSigRgbData: -#ifdef TREAT_CMY_AS_RGB - case icSigCmyData: -#endif - tags[0] = PHOTOMETRIC_RGB; - return 1; -#ifndef TREAT_CMY_AS_RGB - case icSigCmyData: -#endif - case icSigCmykData: - tags[0] = PHOTOMETRIC_SEPARATED; - return 1; - case icSigYCbCrData: - tags[0] = PHOTOMETRIC_YCBCR; - return 1; - case icSigLabData: - tags[0] = PHOTOMETRIC_CIELAB; -#ifdef PHOTOMETRIC_ICCLAB - tags[1] = PHOTOMETRIC_ICCLAB; - tags[2] = PHOTOMETRIC_ITULAB; -#endif - return 3; - - case icSigXYZData: - case icSigLuvData: - case icSigYxyData: - case icSigHsvData: - case icSigHlsData: - return 0; - - case icSig2colorData: - tags[0] = PHOTOMETRIC_SEPARATED; - tags[1] = 2; /* Cheat */ - return 1; - - case icSig3colorData: - tags[0] = PHOTOMETRIC_SEPARATED; - tags[1] = 3; /* Cheat */ - return 1; - - case icSig4colorData: - tags[0] = PHOTOMETRIC_SEPARATED; - tags[1] = 4; /* Cheat */ - return 1; - - case icSig5colorData: - case icSigMch5Data: - tags[0] = PHOTOMETRIC_SEPARATED; - tags[1] = 5; /* Cheat */ - return 1; - - case icSig6colorData: - case icSigMch6Data: - tags[0] = PHOTOMETRIC_SEPARATED; - tags[1] = 6; /* Cheat */ - return 1; - - case icSig7colorData: - case icSigMch7Data: - tags[0] = PHOTOMETRIC_SEPARATED; - tags[1] = 7; /* Cheat */ - return 1; - - case icSig8colorData: - case icSigMch8Data: - tags[0] = PHOTOMETRIC_SEPARATED; - tags[1] = 8; /* Cheat */ - return 1; - - case icSig9colorData: - tags[0] = PHOTOMETRIC_SEPARATED; - tags[1] = 9; /* Cheat */ - return 1; - - case icSig10colorData: - tags[0] = PHOTOMETRIC_SEPARATED; - tags[1] = 10; /* Cheat */ - return 1; - - case icSig11colorData: - tags[0] = PHOTOMETRIC_SEPARATED; - tags[1] = 11; /* Cheat */ - return 1; - - case icSig12colorData: - tags[0] = PHOTOMETRIC_SEPARATED; - tags[1] = 12; /* Cheat */ - return 1; - - case icSig13colorData: - tags[0] = PHOTOMETRIC_SEPARATED; - tags[1] = 13; /* Cheat */ - return 1; - - case icSig14colorData: - tags[0] = PHOTOMETRIC_SEPARATED; - tags[1] = 14; /* Cheat */ - return 1; - - case icSig15colorData: - tags[0] = PHOTOMETRIC_SEPARATED; - tags[1] = 15; /* Cheat */ - return 1; - - default: - return 0; - } - return 0; -} - -/* Compute the length of a double nul terminated string, including */ -/* the nuls. */ -static int zzstrlen(char *s) { - int i; - for (i = 0;; i++) { - if (s[i] == '\000' && s[i+1] == '\000') - return i+2; - } - return 0; -} - -/* Convert an ICC colorspace to the corresponding TIFF Inkset tag */ -/* return 0xffff if not possible or applicable. */ - -int -ColorSpaceSignature2TiffInkset( -icColorSpaceSignature cspace, -int *len, /* Return length of ASCII inknames */ -char **inknames /* Return ASCII inknames if non NULL */ -) { - switch(cspace) { - case icSigCmyData: - return 0xffff; /* ~~9999 */ - if (inknames != NULL) { - *inknames = "cyan\000magenta\000yellow\000\000"; - *len = zzstrlen(*inknames); - } - return 0; /* Not CMYK */ - case icSigCmykData: - if (inknames != NULL) { - *inknames = NULL; /* No inknames */ - *len = 0; - } - return INKSET_CMYK; - - case icSigGrayData: - case icSigRgbData: - case icSigYCbCrData: - case icSigLabData: - case icSigXYZData: - case icSigLuvData: - case icSigYxyData: - case icSigHsvData: - case icSigHlsData: - case icSig2colorData: - case icSig3colorData: - case icSig4colorData: - case icSig5colorData: - case icSigMch5Data: - return 0xffff; - - case icSig6colorData: - case icSigMch6Data: - /* This is a cheat and a hack. Should really make sure that icclink */ - /* transfers the right information from the destination */ - /* profile, and then copies it to the device profile, */ - /* allowing cctiff to read it. */ - if (inknames != NULL) { - *inknames = "cyan\000magenta\000yellow\000black\000orange\000green\000\000"; - *len = zzstrlen(*inknames); - } - return 0; /* Not CMYK */ - - case icSig7colorData: - case icSigMch7Data: - return 0xffff; - - case icSig8colorData: - case icSigMch8Data: - /* This is a cheat and a hack. Should really make sure that icclink */ - /* transfers the right information from the destination */ - /* profile, and then copies it to the device profile, */ - /* allowing cctiff to read it. */ - if (inknames != NULL) { - *inknames = "cyan\000magenta\000yellow\000black\000orange\000green\000lightcyan\000lightmagenta\000\000"; - *len = zzstrlen(*inknames); - } - return 0; /* Not CMYK */ - case icSig9colorData: - case icSig10colorData: - case icSig11colorData: - case icSig12colorData: - case icSig13colorData: - case icSig14colorData: - case icSig15colorData: - default: - return 0xffff; - } - return 0xffff; -} - -char * -Photometric2str( -int pmtc -) { - static char buf[80]; - switch (pmtc) { - case PHOTOMETRIC_MINISWHITE: - return "Subtractive Gray"; - case PHOTOMETRIC_MINISBLACK: - return "Additive Gray"; - case PHOTOMETRIC_RGB: - return "RGB"; - case PHOTOMETRIC_PALETTE: - return "Indexed"; - case PHOTOMETRIC_MASK: - return "Transparency Mask"; - case PHOTOMETRIC_SEPARATED: - return "Separated"; - case PHOTOMETRIC_YCBCR: - return "YCbCr"; - case PHOTOMETRIC_CIELAB: - return "CIELab"; -#ifdef PHOTOMETRIC_ICCLAB - case PHOTOMETRIC_ICCLAB: - return "ICCLab"; - case PHOTOMETRIC_ITULAB: - return "ITULab"; -#endif - case PHOTOMETRIC_LOGL: - return "CIELog2L"; - case PHOTOMETRIC_LOGLUV: - return "CIELog2Luv"; - } - sprintf(buf,"Unknonw Tag %d",pmtc); - return buf; -} - -/* Callbacks used to initialise imdi */ - -/* Information needed from a profile */ -struct _profinfo { - char name[100]; - icmFile *fp; - icc *c; - icmHeader *h; - icRenderingIntent intent; - icmLuBase *luo; /* Base Lookup type object */ - icmLuAlgType alg; /* Type of lookup algorithm */ - int chan; /* Device channels */ -}; typedef struct _profinfo profinfo; - -/* Context for imdi setup callbacks */ -typedef struct { - /* Overall parameters */ - int verb; /* Non-zero if verbose */ - icColorSpaceSignature ins, outs; /* Input/Output spaces */ - int id, od; /* Input/Output dimensions */ - int icombine; /* Non-zero if input curves are to be combined */ - int ocombine; /* Non-zero if output curves are to be combined */ - int link; /* Non-zero if input and output profiles are to be linked */ - - profinfo dev; /* Device link profile */ - profinfo in; /* Device to PCS profile */ - profinfo out; /* PCS to Device profile */ -} sucntx; - -/* Input curve function */ -double input_curve( - void *cntx, - int ch, - double in_val -) { - sucntx *rx = (sucntx *)cntx; - int i; - double vals[MAX_CHAN]; - - if (rx->icombine) - return in_val; - - if (rx->link) { - - for (i = 0; i < rx->id; i++) - vals[i] = 0.0; - vals[ch] = in_val; - - switch(rx->in.alg) { - case icmMonoFwdType: { - icmLuMono *lu = (icmLuMono *)rx->in.luo; /* Safe to coerce */ - lu->fwd_curve(lu, vals, vals); - break; - } - case icmMatrixFwdType: { - icmLuMatrix *lu = (icmLuMatrix *)rx->in.luo; /* Safe to coerce */ - lu->fwd_curve(lu, vals, vals); - break; - } - case icmLutType: { - icmLuLut *lu = (icmLuLut *)rx->in.luo; /* Safe to coerce */ - /* Since not PCS, in_abs and matrix cannot be valid, */ - /* so input curve on own is ok to use. */ - lu->input(lu, vals, vals); - break; - } - default: - error("Unexpected algorithm type in input curve"); - } - } else { - icmLuLut *lu = (icmLuLut *)rx->dev.luo; /* Safe to coerce */ - - for (i = 0; i < rx->id; i++) - vals[i] = 0.0; - vals[ch] = in_val; - - /* Since input not PCS, in_abs and matrix cannot be valid, */ - /* so input curve on own is ok to use. */ - lu->input(lu, vals, vals); - - } - return vals[ch]; -} - -/* Multi-dim table function */ -void md_table( -void *cntx, -double *out_vals, -double *in_vals -) { - sucntx *rx = (sucntx *)cntx; - double pcsv[3]; - int i; - - if (rx->link) { - double vals[MAX_CHAN]; - - switch(rx->in.alg) { - case icmMonoFwdType: { - icmLuMono *lu = (icmLuMono *)rx->in.luo; /* Safe to coerce */ - if (rx->icombine) { - lu->fwd_curve(lu, vals, in_vals); - lu->fwd_map(lu, pcsv, vals); - } else { - lu->fwd_map(lu, pcsv, in_vals); - } - lu->fwd_abs(lu, pcsv, pcsv); - break; - } - case icmMatrixFwdType: { - icmLuMatrix *lu = (icmLuMatrix *)rx->in.luo; /* Safe to coerce */ - if (rx->icombine) { - lu->fwd_curve(lu, vals, in_vals); - lu->fwd_matrix(lu, pcsv, vals); - } else { - lu->fwd_matrix(lu, pcsv, in_vals); - } - lu->fwd_abs(lu, pcsv, pcsv); - break; - } - case icmLutType: { - icmLuLut *lu = (icmLuLut *)rx->in.luo; /* Safe to coerce */ - if (rx->icombine) { - /* Since not PCS, in_abs and matrix cannot be valid, */ - /* so input curve on own is ok to use. */ - lu->input(lu, vals, in_vals); - lu->clut(lu, pcsv, vals); - } else { - lu->clut(lu, pcsv, in_vals); - } - lu->output(lu, pcsv, pcsv); - lu->out_abs(lu, pcsv, pcsv); - break; - } - default: - error("Unexpected algorithm type in clut lookup"); - } - - switch(rx->out.alg) { - case icmMonoBwdType: { - icmLuMono *lu = (icmLuMono *)rx->out.luo; /* Safe to coerce */ - lu->bwd_abs(lu, pcsv, pcsv); - lu->bwd_map(lu, out_vals, pcsv); - if (rx->ocombine) { - lu->bwd_curve(lu, out_vals, out_vals); - } - break; - } - case icmMatrixBwdType: { - icmLuMatrix *lu = (icmLuMatrix *)rx->out.luo; /* Safe to coerce */ - lu->bwd_abs(lu, pcsv, pcsv); - lu->bwd_matrix(lu, out_vals, pcsv); - if (rx->ocombine) { - lu->bwd_curve(lu, out_vals, out_vals); - } - break; - } - case icmLutType: { - icmLuLut *lu = (icmLuLut *)rx->out.luo; /* Safe to coerce */ - lu->in_abs(lu, pcsv, pcsv); - lu->matrix(lu, pcsv, pcsv); - lu->input(lu, pcsv, pcsv); - lu->clut(lu, out_vals, pcsv); - if (rx->ocombine) { - lu->output(lu, out_vals, out_vals); - /* Since not PCS, out_abs is never used */ - } - break; - } - - default: - error("Unexpected algorithm type in clut lookup"); - } - } else { - icmLuLut *lu = (icmLuLut *)rx->dev.luo; /* Safe to coerce */ - - if (rx->icombine && rx->ocombine) { - lu->lookup((icmLuBase *)lu, out_vals, in_vals); /* Do everything here */ - } else { - lu->clut(lu, out_vals, in_vals); - } - } -} - -/* Output curve function */ -double output_curve( -void *cntx, -int ch, -double in_val -) { - sucntx *rx = (sucntx *)cntx; - int i; - double vals[MAX_CHAN]; - - if (rx->ocombine) - return in_val; - - if (rx->link) { - for (i = 0; i < rx->od; i++) - vals[i] = 0.0; - vals[ch] = in_val; - - switch(rx->out.alg) { - case icmMonoBwdType: { - icmLuMono *lu = (icmLuMono *)rx->out.luo; /* Safe to coerce */ - lu->bwd_curve(lu, vals, vals); - break; - } - case icmMatrixBwdType: { - icmLuMatrix *lu = (icmLuMatrix *)rx->out.luo; /* Safe to coerce */ - lu->bwd_curve(lu, vals, vals); - break; - } - case icmLutType: { - icmLuLut *lu = (icmLuLut *)rx->out.luo; /* Safe to coerce */ - lu->output(lu, vals, vals); - /* Since not PCS, out_abs is never used */ - break; - } - default: - error("Unexpected algorithm type in devop_devo()"); - } - - } else { - icmLuLut *lu = (icmLuLut *)rx->dev.luo; /* Safe to coerce */ - - for (i = 0; i < rx->od; i++) - vals[i] = 0.0; - vals[ch] = in_val; - - /* Since output not PCS, out_abs cannot be valid, */ - lu->output(lu, vals, vals); - - } - return vals[ch]; -} - -int -main(int argc, char *argv[]) { - int fa,nfa; /* argument we're looking at */ - char in_name[100]; /* Raster file name */ - char out_name[100]; /* Raster file name */ - int slow = 0; - int check = 0; - int i, rv = 0; - - TIFF *rh = NULL, *wh = NULL; - int x, y, width, height; /* Size of image */ - uint16 samplesperpixel, bitspersample; - int no_pmtc; /* Number of input photometrics */ - uint16 photometric, pmtc[10]; /* Photometrics of input file, and input profile */ - uint16 pconfig; /* Planar configuration */ - uint16 resunits; - float resx, resy; - tdata_t *inbuf, *outbuf, *checkbuf; - - /* IMDI */ - imdi *s = NULL; - sucntx su; /* Setup context */ - unsigned char *inp[MAX_CHAN]; - unsigned char *outp[MAX_CHAN]; - int clutres = 33; - - /* Error check */ - int mxerr = 0; - double avgerr = 0.0; - double avgcount = 0.0; - - if (argc < 2) - usage(); - - su.verb = 0; - su.icombine = 0; - su.ocombine = 0; - su.link = 0; - su.in.intent = icmDefaultIntent; - su.out.intent = icmDefaultIntent; - - /* Process the arguments */ - for(fa = 1;fa < argc;fa++) { - nfa = fa; /* skip to nfa if next argument is used */ - if (argv[fa][0] == '-') { /* Look for any flags */ - char *na = NULL; /* next argument after flag, null if none */ - - if (argv[fa][2] != '\000') - na = &argv[fa][2]; /* next is directly after flag */ - else { - if ((fa+1) < argc) { - if (argv[fa+1][0] != '-') { - nfa = fa + 1; - na = argv[nfa]; /* next is seperate non-flag argument */ - } - } - } - - if (argv[fa][1] == '?') - usage(); - - /* Slow, Precise */ - else if (argv[fa][1] == 'p' || argv[fa][1] == 'P') { - slow = 1; - } - - /* Combine per channel curves */ - else if (argv[fa][1] == 'c' || argv[fa][1] == 'C') { - su.icombine = 1; - su.ocombine = 1; - } - - /* Check curves */ - else if (argv[fa][1] == 'k' || argv[fa][1] == 'K') { - check = 1; - } - - /* Link profiles */ - else if (argv[fa][1] == 'l' || argv[fa][1] == 'L') { - su.link = 1; - } - - /* Input profile Intent */ - else if (argv[fa][1] == 'i' || argv[fa][1] == 'I') { - fa = nfa; - if (na == NULL) usage(); - switch (na[0]) { - case 'p': - case 'P': - su.in.intent = icPerceptual; - break; - case 'r': - case 'R': - su.in.intent = icRelativeColorimetric; - break; - case 's': - case 'S': - su.in.intent = icSaturation; - break; - case 'a': - case 'A': - su.in.intent = icAbsoluteColorimetric; - break; - default: - usage(); - } - } - - /* Output profile Intent */ - else if (argv[fa][1] == 'o' || argv[fa][1] == 'O') { - fa = nfa; - if (na == NULL) usage(); - switch (na[0]) { - case 'p': - case 'P': - su.out.intent = icPerceptual; - break; - case 'r': - case 'R': - su.out.intent = icRelativeColorimetric; - break; - case 's': - case 'S': - su.out.intent = icSaturation; - break; - case 'a': - case 'A': - su.out.intent = icAbsoluteColorimetric; - break; - default: - usage(); - } - } - - /* Verbosity */ - else if (argv[fa][1] == 'v' || argv[fa][1] == 'V') { - su.verb = 1; - } - - else - usage(); - } else - break; - } - - if (su.link) { - if (fa >= argc || argv[fa][0] == '-') usage(); - strcpy(su.in.name,argv[fa++]); - - if (fa >= argc || argv[fa][0] == '-') usage(); - strcpy(su.out.name,argv[fa++]); - } else { - if (fa >= argc || argv[fa][0] == '-') usage(); - strcpy(su.dev.name,argv[fa++]); - } - - if (fa >= argc || argv[fa][0] == '-') usage(); - strcpy(in_name,argv[fa++]); - - if (fa >= argc || argv[fa][0] == '-') usage(); - strcpy(out_name,argv[fa++]); - - /* - - - - - - - - - - - - - - - - */ - - if (su.link) { - icColorSpaceSignature natpcs; - - /* Open up the input device profile for reading */ - if ((su.in.fp = new_icmFileStd_name(su.in.name,"r")) == NULL) - error ("Can't open file '%s'",su.in.name); - - if ((su.in.c = new_icc()) == NULL) - error ("Creation of Input profile ICC object failed"); - - /* Read header etc. */ - if ((rv = su.in.c->read(su.in.c,su.in.fp,0)) != 0) - error ("%d, %s on file '%s'",rv,su.in.c->err,su.in.name); - su.in.h = su.in.c->header; - - /* Check that it is a suitable device input icc */ - if (su.in.h->deviceClass != icSigInputClass - && su.in.h->deviceClass != icSigDisplayClass - && su.in.h->deviceClass != icSigOutputClass - && su.in.h->deviceClass != icSigColorSpaceClass) /* For sRGB etc. */ - error("Input profile isn't a device profile"); - - /* Get a conversion object */ - if ((su.in.luo = su.in.c->get_luobj(su.in.c, icmFwd, su.in.intent, - icSigLabData, icmLuOrdNorm)) == NULL) - error ("%d, %s for profile '%s'",su.in.c->errc, su.in.c->err, su.in.name); - - /* Get details of conversion (Arguments may be NULL if info not needed) */ - su.in.luo->spaces(su.in.luo, &su.ins, &su.id, NULL, NULL, &su.in.alg, NULL, NULL, NULL); - - /* Get native PCS space */ - su.in.luo->lutspaces(su.in.luo, NULL, NULL, NULL, NULL, &natpcs); - - if (natpcs == icSigXYZData) { - su.icombine = 1; /* XYZ is to non-linear to be a benefit */ - } - - /* Open up the output device profile for reading */ - if ((su.out.fp = new_icmFileStd_name(su.out.name,"r")) == NULL) - error ("Can't open file '%s'",su.out.name); - - if ((su.out.c = new_icc()) == NULL) - error ("Creation of Output profile ICC object failed"); - - /* Read header etc. */ - if ((rv = su.out.c->read(su.out.c,su.out.fp,0)) != 0) - error ("%d, %s on file '%s'",rv,su.out.c->err,su.out.name); - su.out.h = su.out.c->header; - - /* Check that it is a suitable device output icc */ - if (su.out.h->deviceClass != icSigInputClass - && su.out.h->deviceClass != icSigDisplayClass - && su.out.h->deviceClass != icSigOutputClass - && su.out.h->deviceClass != icSigColorSpaceClass) /* For sRGB etc. */ - error("Output profile isn't a device profile"); - - /* Get a conversion object */ - if ((su.out.luo = su.out.c->get_luobj(su.out.c, icmBwd, su.out.intent, - icSigLabData, icmLuOrdNorm)) == NULL) - error ("%d, %s for profile '%s'",su.out.c->errc, su.out.c->err, su.out.name); - - /* Get details of conversion (Arguments may be NULL if info not needed) */ - su.out.luo->spaces(su.out.luo, NULL, NULL, &su.outs, &su.od, &su.out.alg, NULL, NULL, NULL); - - /* Get native PCS space */ - su.out.luo->lutspaces(su.out.luo, NULL, NULL, NULL, NULL, &natpcs); - - if (natpcs == icSigXYZData) { - su.ocombine = 1; /* XYZ is to non-linear to be a benefit */ - } - - /* See discussion in imdi/imdi_gen.c for ideal numbers */ - /* Use "high quality" resolution numbers */ - switch (su.id) { - case 0: - error ("Illegal number of input chanels"); - case 1: - clutres = 256; - break; - case 2: - clutres = 256; - break; - case 3: - clutres = 33; - break; - case 4: - clutres = 18; - break; - case 5: - clutres = 16; - break; - case 6: - clutres = 9; - break; - case 7: - clutres = 7; - break; - case 8: - clutres = 6; - break; - deault: /* > 8 chan */ - clutres = 3; - break; - } - - } else { - icmLut *lut; /* ICC LUT table */ - icmLuLut *luluo; /* LUT lookup object */ - - /* Open up the device link profile for reading */ - if ((su.dev.fp = new_icmFileStd_name(su.dev.name,"r")) == NULL) - error ("Can't open file '%s'",su.dev.name); - - if ((su.dev.c = new_icc()) == NULL) - error ("Creation of ICC object failed"); - - if ((rv = su.dev.c->read(su.dev.c, su.dev.fp, 0)) != 0) - error ("%d, %s",rv,su.dev.c->err); - su.dev.h = su.dev.c->header; - - if (su.verb) { - icmFile *op; - if ((op = new_icmFileStd_fp(stdout)) == NULL) - error ("Can't open stdout"); - su.dev.h->dump(su.dev.h, op, 1); - op->del(op); - } - - /* Check that the profile is appropriate */ - if (su.dev.h->deviceClass != icSigLinkClass) - error("Profile isn't a device link profile"); - - /* Get a conversion object */ - if ((su.dev.luo = su.dev.c->get_luobj(su.dev.c, icmFwd, icmDefaultIntent, - icmSigDefaultData, icmLuOrdNorm)) == NULL) - error ("%d, %s",su.dev.c->errc, su.dev.c->err); - - /* Get details of conversion (Arguments may be NULL if info not needed) */ - su.dev.luo->spaces(su.dev.luo, &su.ins, &su.id, &su.outs, &su.od, &su.dev.alg, NULL, NULL, NULL); - - if (su.dev.alg != icmLutType) - error ("DeviceLink profile doesn't have Lut !"); - - luluo = (icmLuLut *)su.dev.luo; /* Safe to coerce */ - luluo->get_info(luluo, &lut, NULL, NULL, NULL); /* Get some details */ - clutres = lut->clutPoints; /* Desired table resolution */ - } - - /* - - - - - - - - - - - - - - - */ - /* Open up input tiff file ready for reading */ - /* Got arguments, so setup to process the file */ - if ((rh = TIFFOpen(in_name, "r")) == NULL) - error("error opening read file '%s'",in_name); - - TIFFGetField(rh, TIFFTAG_IMAGEWIDTH, &width); - TIFFGetField(rh, TIFFTAG_IMAGELENGTH, &height); - - TIFFGetField(rh, TIFFTAG_BITSPERSAMPLE, &bitspersample); - if (bitspersample != 8 && bitspersample != 16) { - error("TIFF Input file must be 8 or 16 bit/channel"); - } - - TIFFGetField(rh, TIFFTAG_PHOTOMETRIC, &photometric); - if ((no_pmtc = ColorSpaceSignature2TiffPhotometric(pmtc, su.ins)) == 0) - error("ICC input colorspace '%s' can't be handled by a TIFF file!", - icm2str(icmColorSpaceSignature, su.ins)); - for (i = 0; i < no_pmtc; i++) { - if (pmtc[i] == photometric) - break; /* Matches */ - } - if (i >= no_pmtc) { - switch (no_pmtc) { - case 1: - error("ICC input colorspace '%s' doesn't match TIFF photometric '%s'!", - icm2str(icmColorSpaceSignature, su.ins), Photometric2str(pmtc[0])); - case 2: - error("ICC input colorspace '%s' doesn't match TIFF photometric '%s' or '%s'!", - icm2str(icmColorSpaceSignature, su.ins), Photometric2str(pmtc[0]), - Photometric2str(pmtc[1])); - default: - error("ICC input colorspace '%s' doesn't match TIFF photometric '%s', '%s' or '%s'!", - icm2str(icmColorSpaceSignature, su.ins), Photometric2str(pmtc[0]), - Photometric2str(pmtc[1]), Photometric2str(pmtc[2])); - } - } - - TIFFGetField(rh, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel); - if (su.id != samplesperpixel) - error ("TIFF Input file has %d input channels mismatched to colorspace '%s'", - samplesperpixel, icm2str(icmColorSpaceSignature, su.ins)); - - TIFFGetField(rh, TIFFTAG_PLANARCONFIG, &pconfig); - if (pconfig != PLANARCONFIG_CONTIG) - error ("TIFF Input file must be planar"); - - TIFFGetField(rh, TIFFTAG_RESOLUTIONUNIT, &resunits); - TIFFGetField(rh, TIFFTAG_XRESOLUTION, &resx); - TIFFGetField(rh, TIFFTAG_YRESOLUTION, &resy); - - /* - - - - - - - - - - - - - - - */ - if ((wh = TIFFOpen(out_name, "w")) == NULL) - error("Can\'t create TIFF file '%s'!",out_name); - - TIFFSetField(wh, TIFFTAG_IMAGEWIDTH, width); - TIFFSetField(wh, TIFFTAG_IMAGELENGTH, height); - TIFFSetField(wh, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); - TIFFSetField(wh, TIFFTAG_SAMPLESPERPIXEL, su.od); - TIFFSetField(wh, TIFFTAG_BITSPERSAMPLE, bitspersample); - TIFFSetField(wh, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); - if ((no_pmtc = ColorSpaceSignature2TiffPhotometric(pmtc, su.outs)) == 0) - error("TIFF file can't handle output colorspace '%s'!", - icm2str(icmColorSpaceSignature, su.outs)); - TIFFSetField(wh, TIFFTAG_PHOTOMETRIC, pmtc[0]); /* Use first returned */ - if (pmtc[0] == PHOTOMETRIC_SEPARATED) { - int iset; - int inlen; - char *inames; - iset = ColorSpaceSignature2TiffInkset(su.outs, &inlen, &inames); - if (iset != 0xffff && inlen > 0 && inames != NULL) { - TIFFSetField(wh, TIFFTAG_INKSET, iset); - if (inames != NULL) { - TIFFSetField(wh, TIFFTAG_INKNAMES, inlen, inames); - } - } - } - TIFFSetField(wh, TIFFTAG_COMPRESSION, COMPRESSION_NONE); - if (resunits) { - TIFFSetField(wh, TIFFTAG_RESOLUTIONUNIT, resunits); - TIFFSetField(wh, TIFFTAG_XRESOLUTION, resx); - TIFFSetField(wh, TIFFTAG_YRESOLUTION, resy); - } - TIFFSetField(wh, TIFFTAG_IMAGEDESCRIPTION, "Color corrected by Argyll"); - - /* - - - - - - - - - - - - - - - */ - /* Setup the imdi */ - - if (!slow) { - s = new_imdi( - su.id, /* Number of input dimensions */ - su.od, /* Number of output dimensions */ - /* Input pixel representation */ - bitspersample == 8 ? pixint8 : pixint16, - /* Output pixel representation */ - 0x0, /* Treat every channel as unsigned */ - bitspersample == 8 ? pixint8 : pixint16, - 0x0, /* Treat every channel as unsigned */ - clutres, /* Desired table resolution */ - input_curve, /* Callback functions */ - md_table, - output_curve, - (void *)&su /* Context to callbacks */ - ); - - if (s == NULL) - error("new_imdi failed"); - } - - /* - - - - - - - - - - - - - - - */ - /* Process colors to translate */ - /* (Should fix this to process a group of lines at a time ?) */ - - inbuf = _TIFFmalloc(TIFFScanlineSize(rh)); - outbuf = _TIFFmalloc(TIFFScanlineSize(wh)); - if (check) - checkbuf = _TIFFmalloc(TIFFScanlineSize(wh)); - - inp[0] = (unsigned char *)inbuf; - outp[0] = (unsigned char *)outbuf; - - if (!slow) { /* Fast */ - for (y = 0; y < height; y++) { - - /* Read in the next line */ - if (TIFFReadScanline(rh, inbuf, y, 0) < 0) - error ("Failed to read TIFF line %d",y); - - /* Do fast conversion */ - s->interp(s, (void **)outp, (void **)inp, width); - - if (check) { - /* Do floating point conversion */ - for (x = 0; x < width; x++) { - int i; - double in[MAX_CHAN], out[MAX_CHAN]; - - if (bitspersample == 8) - for (i = 0; i < su.id; i++) - in[i] = ((unsigned char *)inbuf)[x * su.id + i]/255.0; - else - for (i = 0; i < su.id; i++) - in[i] = ((unsigned short *)inbuf)[x * su.id + i]/65535.0; - - if (su.link) { - if ((rv = su.in.luo->lookup(su.in.luo, out, in)) > 1) - error ("%d, %s",su.dev.c->errc,su.dev.c->err); - if ((rv = su.out.luo->lookup(su.out.luo, out, out)) > 1) - error ("%d, %s",su.dev.c->errc,su.dev.c->err); - } else { - if ((rv = su.dev.luo->lookup(su.dev.luo, out, in)) > 1) - error ("%d, %s",su.dev.c->errc,su.dev.c->err); - } - - if (bitspersample == 8) - for (i = 0; i < su.od; i++) - ((unsigned char *)checkbuf)[x * su.od + i] = (int)(out[i] * 255.0 + 0.5); - else - for (i = 0; i < su.od; i++) - ((unsigned short *)checkbuf)[x * su.od + i] = (int)(out[i] * 65535.0 + 0.5); - } - /* Compute the errors */ - for (x = 0; x < (width * su.od); x++) { - int err; - if (bitspersample == 8) - err = ((unsigned char *)outbuf)[x] - ((unsigned char *)checkbuf)[x]; - else - err = ((unsigned short *)outbuf)[x] - ((unsigned short *)checkbuf)[x]; - if (err < 0) - err = -err; - if (err > mxerr) - mxerr = err; - avgerr += (double)err; - avgcount++; - } - } - - if (TIFFWriteScanline(wh, outbuf, y, 0) < 0) - error ("Failed to write TIFF line %d",y); - - } - - } else { /* Slow but precise */ - if (bitspersample == 8) { - for (y = 0; y < height; y++) { - - /* Read in the next line */ - if (TIFFReadScanline(rh, inbuf, y, 0) < 0) - error ("Failed to read TIFF line %d",y); - - /* Do floating point conversion */ - for (x = 0; x < width; x++) { - int i; - double in[MAX_CHAN], out[MAX_CHAN]; - - for (i = 0; i < su.id; i++) { - in[i] = ((unsigned char *)inbuf)[x * su.id + i]/255.0; - } - - if (su.link) { - if ((rv = su.in.luo->lookup(su.in.luo, out, in)) > 1) - error ("%d, %s",su.dev.c->errc,su.dev.c->err); - if ((rv = su.out.luo->lookup(su.out.luo, out, out)) > 1) - error ("%d, %s",su.dev.c->errc,su.dev.c->err); - } else { - if ((rv = su.dev.luo->lookup(su.dev.luo, out, in)) > 1) - error ("%d, %s",su.dev.c->errc,su.dev.c->err); - } - - for (i = 0; i < su.od; i++) { - double outi = out[i]; - if (outi < 0.0) /* Protect against sillies */ - outi = 0.0; - else if (outi > 1.0) - outi = 1.0; - ((unsigned char *)outbuf)[x * su.od + i] = (int)(outi * 255.0 + 0.5); - } - } - if (TIFFWriteScanline(wh, outbuf, y, 0) < 0) - error ("Failed to write TIFF line %d",y); - } - } else if (bitspersample == 16) { - for (y = 0; y < height; y++) { - - /* Read in the next line */ - if (TIFFReadScanline(rh, inbuf, y, 0) < 0) - error ("Failed to read TIFF line %d",y); - - /* Do floating point conversion */ - for (x = 0; x < width; x++) { - int i; - double in[MAX_CHAN], out[MAX_CHAN]; - - for (i = 0; i < su.id; i++) { - in[i] = ((unsigned short *)inbuf)[x * su.id + i]/65535.0; - } - - if (su.link) { - if ((rv = su.in.luo->lookup(su.in.luo, out, in)) > 1) - error ("%d, %s",su.dev.c->errc,su.dev.c->err); - if ((rv = su.out.luo->lookup(su.out.luo, out, out)) > 1) - error ("%d, %s",su.dev.c->errc,su.dev.c->err); - } else { - if ((rv = su.dev.luo->lookup(su.dev.luo, out, in)) > 1) - error ("%d, %s",su.dev.c->errc,su.dev.c->err); - } - - for (i = 0; i < su.od; i++) { - double outi = out[i]; - if (outi < 0.0) /* Protect against sillies */ - outi = 0.0; - else if (outi > 1.0) - outi = 1.0; - ((unsigned short *)outbuf)[x * su.od + i] = (int)(outi * 65535.0 + 0.5); - } - } - if (TIFFWriteScanline(wh, outbuf, y, 0) < 0) - error ("Failed to write TIFF line %d",y); - } - } - } - - if (check) { - printf("Worst error = %d bits, average error = %f bits\n", mxerr, avgerr/avgcount); - if (bitspersample == 8) - printf("Worst error = %f%%, average error = %f%%\n", - mxerr/2.55, avgerr/(2.55 * avgcount)); - else - printf("Worst error = %f%%, average error = %f%%\n", - mxerr/655.35, avgerr/(655.35 * avgcount)); - } - - /* Done with lookup object */ - if (s != NULL) - s->done(s); - - if (su.link) { - su.in.luo->del(su.in.luo); - su.in.c->del(su.in.c); - su.in.fp->del(su.in.fp); - su.out.luo->del(su.out.luo); - su.out.c->del(su.out.c); - su.out.fp->del(su.out.fp); - } else { - su.dev.luo->del(su.dev.luo); - su.dev.c->del(su.dev.c); - su.dev.fp->del(su.dev.fp); - } - - _TIFFfree(inbuf); - _TIFFfree(outbuf); - if (check) - _TIFFfree(checkbuf); - - TIFFClose(rh); /* Close Input file */ - TIFFClose(wh); /* Close Output file */ - - return 0; -} - -/* Basic printf type error() and warning() routines */ - -void -error(char *fmt, ...) -{ - va_list args; - - fprintf(stderr,"cctiff: Error - "); - va_start(args, fmt); - vfprintf(stderr, fmt, args); - va_end(args); - fprintf(stderr, "\n"); - exit (-1); -} - -void -warning(char *fmt, ...) -{ - va_list args; - - fprintf(stderr,"cctiff: Warning - "); - va_start(args, fmt); - vfprintf(stderr, fmt, args); - va_end(args); - fprintf(stderr, "\n"); -} diff -Nru ghostscript-9.04~dfsg/imdi/cgen.c ghostscript-9.05~dfsg~20120125/imdi/cgen.c --- ghostscript-9.04~dfsg/imdi/cgen.c 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/imdi/cgen.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1848 +0,0 @@ -/* Integer Multi-Dimensional Interpolation */ - -/* - * Copyright 2000 - 2002 Graeme W. Gill - * All rights reserved. - * - * This material is licenced under the GNU GENERAL PUBLIC LICENCE :- - * see the Licence.txt file for licencing details. - */ - -/* 'C' code color transform kernel code generator. */ - -/* - This module generates C code routines which implement - an integer multi-channel transform. The input values - are read, passed through per channel lookup tables, - a multi-dimentional interpolation table, and then - a per channel output lookup table, before being written. -*/ - -#include -#include -#include -#include -#include - -#include "imdi_imp.h" -#include "imdi_gen.h" -#include "imdi_tab.h" - -#undef VERBOSE -#undef FORCESORT /* Use sort algorithm allways */ - -/* - * TTBD: - * Need to implement g->dir - * Haven't used t->it_map[] or t->im_map[]. - * - * - */ - -/* ------------------------------------ */ -/* Context */ -typedef struct { - FILE *of; /* Output file */ - int indt; /* Indent */ - - /* Other info */ - genspec *g; /* Generation specifications */ - tabspec *t; /* Table setup data */ - mach_arch *a; /* Machine architecture and tuning data */ - - /* Code generation information */ - /* if() conditions are for entry usage */ - - /* Pixel read information */ - int ipt[IXDI]; /* Input pointer types */ - int nip; /* Actual number of input pointers, accounting for pint */ - int chv_bits; /* Bits in chv temp variable ?? */ - - /* Input table entry */ - int itet; /* Input table entry type */ - int itvt; /* Input table variable type */ - int itmnb; /* Input table minimum bits (actual is it_ab) */ - - /* Interpolation index */ - int ixet; /* Interpolation index entry type */ - int ixvt; /* Interpolation index variable type */ - int ixmnb; /* Interpolation index minimum bits (actual is ix_ab) */ - int ixmxres; /* Interpolation table maximum resolution */ - - /* Simplex index: if(!sort && it_xs) */ - int sxet; /* Simplex index entry type */ - int sxvt; /* Simplex index variable type */ - int sxmnb; /* Simplex index bits minimum (actual is sx_ab) */ - int sxmxres; /* Simplex table maximum resolution (0 if sort) */ - - /* Combination Weighting + Vertex offset values: if(it_xs && !wo_xs) */ - int woet; /* Weighting+offset entry type */ - int wovt; /* Weighting+offset variable type */ - int womnb; /* Weighting+offset index bits minimum (actual is wo_ab) */ - - /* Weighting value: if(it_xs && wo_xs) */ - int weet; /* Weighting entry type */ - int wevt; /* Weighting variable type */ - int wemnb; /* Weighting index bits minimum (actual is we_ab) */ - - /* Vertex offset value: if(it_xs && wo_xs) */ - int voet; /* Vertex offset entry type */ - int vovt; /* Vertex offset variable type */ - int vomnb; /* Vertex offset index bits minimum (actual is vo_ab) */ - - /* Interpolation table entry: */ - int imovb; /* Interpolation output value bits per channel required */ - int imfvt; /* Interpolation full entry & variable type */ - int impvt; /* Interpolation partial entry variable type */ - - /* Interpolation accumulators: */ - int iaovb; /* Interpolation output value bits per channel required */ - int iafvt; /* Interpolation full entry & variable type */ - int iapvt; /* Interpolation partial entry variable type */ - int ian; /* Total number of accumulators */ - - /* Output table lookup */ - int otit; /* Output table index type */ - int otvt; /* Output table value type (size is ot_ts bytes) */ - - /* Write information */ - int opt[IXDO]; /* Output pointer types */ - int nop; /* Actual number of output pointers, accounting for pint */ - -} fileo; - -void line(fileo *f, char *fmt, ...); /* Output one line */ -void sline(fileo *f, char *fmt, ...); /* Output start of line line */ -void mline(fileo *f, char *fmt, ...); /* Output middle of line */ -void eline(fileo *f, char *fmt, ...); /* Output end of line */ -void cr(fileo *f) { line(f,""); } /* Output a blank line */ -void inc(fileo *f) { f->indt++; } /* Increment the indent level */ -void dec(fileo *f) { f->indt--; } /* Decrement the indent level */ -/* ------------------------------------ */ - -int findord(fileo *f, int bits); /* Find ordinal with bits or more */ -int nord(fileo *f, int ov); /* Round ordinal type up to natural size */ -int findnord(fileo *f, int bits); /* Find ordinal with bits, or natural larger */ -int findint(fileo *f, int bits); /* Find integer with bits or more */ -int nint(fileo *f, int iv); /* Round integer type up to natural size */ -int findnint(fileo *f, int bits); /* Find integer with bits, or natural larger */ -static void doheader(fileo *f); - -static int calc_bits(int dim, int res); -static int calc_res(int dim, int bits); -static int calc_obits(int dim, int res, int esize); -static int calc_ores(int dim, int bits, int esize); - -/* return a hexadecimal mask string */ -/* take care of the case when bits >= 32 */ -char *hmask(int bits) { - static char buf[20]; - - if (bits < 32) { - sprintf(buf, "0x%x",(1 << bits)-1); - } else if (bits == 32) { - return "0xffffffff"; - } else if (bits == 64) { - return "0xffffffffffffffff"; - } else { /* Bits > 32 */ - sprintf(buf, "0x%xffffffff",(1 << (bits-32))-1); - } - return buf; -} - -/* Generate a source file to implement the specified */ -/* interpolation kernel. Fill in return values and return 0 if OK. */ -/* Return non-zero on error. */ -int gen_c_kernel( - genspec *g, /* Specification of what to generate */ - mach_arch *a, - FILE *fp, /* File to write to */ - int index /* Identification index, 1 = first */ -) { - unsigned char kk[] = { 0x43, 0x6F, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6D, 0x65, 0x20, 0x57, 0x2E, - 0x20, 0x47, 0x69, 0x6C, 0x6C, 0x00 }; - fileo f[1]; - int e, i; - tabspec tabsp, *t = &tabsp; - int timp = 0; /* Flag to use temporary imp pointer. */ - /* Seem to make x86 MSVC++ slower */ - /* Has no effect on x86 IBMCC */ - - sprintf(g->kname, "imdi_k%d",index); /* Kernel routine base name */ - strcpy(g->kkeys, kk); /* Kernel keys for this session */ - - /* Setup the file output context */ - f->of = fp; - f->indt = 0; /* Start with no indentation */ - f->g = g; - f->t = t; - f->a = a; - - if (g->prec == 8) { - if (g->id <= 4) - t->sort = 0; /* Implicit sort using simplex table lookup */ - else - t->sort = 1; /* Explicit sort */ - - } else if (g->prec == 16) { - t->sort = 1; /* Explit sort, no simplex table */ - - } else { - fprintf(stderr,"Can't cope with requested precision of %d bits\n",g->prec); - exit(-1); - } -#ifdef FORCESORT - t->sort = 1; -#endif - - /* Compute input read and input table lookup stuff */ - - /* Compute number of input pointers */ - if (g->in.pint != 0) /* Pixel interleaved */ - f->nip = 1; - else - f->nip = g->id; - - /* Figure out the input pointer types */ - for (e = 0; e < f->nip; e++) { - if ((f->ipt[e] = findord(f, g->in.bpch[e])) < 0) { - fprintf(stderr,"Input channel size can't be handled\n"); - exit(-1); - } - } - - /* Set a default input channel mapping */ - for (e = 0; e < g->id; e++) - t->it_map[e] = e; - - /* Do the rest of the input table size calculations after figuring */ - /* out simplex and interpolation table sizes. */ - - /* Figure out the interpolation multi-dimentional table structure */ - /* and output accumulation variable sizes. */ - - if (g->prec == 8 - || g->prec == 16 && a->ords[a->nords-1].bits >= (g->prec * 4)) { - int tiby; /* Total interpolation bytes needed */ - - /* We assume that we can normally compute more than one */ - /* output value at a time, so we need to hold the interpolation */ - /* output data in the expanded fixed point format in both the */ - /* table and accumulator. */ - t->im_cd = 1; - f->imovb = g->prec * 2; /* 16 bits needed for 8 bit precision, */ - f->iaovb = g->prec * 2; /* 32 bits needed for 16 bit precision */ - f->imfvt = a->nords-1; /* Full variable entry type is biggest available */ - f->iafvt = a->nords-1; /* Full variable accum. type is same */ - - if (a->ords[f->imfvt].bits < f->imovb) { - fprintf(stderr,"Interpolation table entry size can't be handled\n"); - exit(-1); - } - - /* Compute details of table entry sizes, number */ - tiby = (f->imovb * g->od)/8; /* Total table bytes needed */ - t->im_fs = a->ords[f->imfvt].bits/8; /* Full entry bytes */ - t->im_fv = (t->im_fs * 8)/f->imovb; /* output values per full entry . */ - t->im_fn = tiby/t->im_fs; /* Number of full entries (may be 0) */ - t->im_ts = t->im_fn * t->im_fs; /* Structure size so far */ - tiby -= t->im_fn * t->im_fs; /* Remaining bytes */ - - if (tiby <= 0) { - t->im_pn = 0; /* No partials */ - t->im_ps = 0; - t->im_pv = 0; - f->impvt = 0; - f->iapvt = 0; - - } else { - t->im_pn = 1; /* Must be just 1 partial */ - t->im_pv = (tiby * 8)/f->imovb; /* Partial holds remaining entries */ - - if ((f->impvt = findnord(f, tiby * 8)) < 0) { - fprintf(stderr,"Can't find partial interp table entry variable size\n"); - exit(-1); - } - f->iapvt = f->impvt; - t->im_ps = a->ords[f->impvt].bits/8;/* Partial entry bytes */ - - if (a->ords[f->imfvt].align) /* If full entry's need to be aligned */ - t->im_ts += t->im_fs; /* Round out struct size by full entry */ - else - t->im_ts += t->im_ps; /* Round out to natural size */ - } - - } else { - /* One 16 bit output value per entry + 32 bit accumulator. */ - /* We can conserve table space by not holding the table data in expanded */ - /* fixed point format, but expanding it when it is read. */ - /* Without resorting to compicated code, this restricts us */ - /* to only computing one output value per accumulator. */ - t->im_cd = 0; - f->imovb = g->prec; /* Table holds 16 bit entries with no fractions */ - f->iaovb = g->prec * 2; /* 32 bits needed for 16 bit precision in comp. */ - - if ((f->imfvt = findord(f, f->imovb)) < 0) { - fprintf(stderr,"Interpolation table entry size can't be handled\n"); - exit(-1); - } - if ((f->iafvt = findord(f, f->iaovb)) < 0) { - fprintf(stderr,"Interpolation accumulator size can't be handled\n"); - exit(-1); - } - - /* Compute details of table entry sizes, number */ - t->im_fs = a->ords[f->imfvt].bits/8; /* Full entry bytes */ - t->im_fv = 1; /* output values per full entry . */ - t->im_fn = g->od; /* Number of full entries */ - t->im_ts = t->im_fn * t->im_fs; /* Total structure size */ - - t->im_pn = 0; /* No partials */ - t->im_ps = 0; - t->im_pv = 0; - f->impvt = 0; - f->iapvt = 0; - } - f->ian = t->im_fn + t->im_pn; /* Total number of output accumulators */ - - /* Figure out how much of the interpolation entry offset to put in the */ - /* vertex offset value, and how much to make explicit in accessing the */ - /* interpolation table enty. */ - if (a->oscale > 0) { /* We have a scaled index mode */ - /* Use as much of the scaled index mode as possible */ - /* and then do the balance by scaling the simplex index entry. */ - for (t->im_oc = a->oscale; ; t->im_oc >>= 1) { - t->vo_om = t->im_ts/t->im_oc; /* Simplex index multiplier */ - if ((t->vo_om * t->im_oc) == t->im_ts) - break; /* Got appropriate offset scale */ - } - } else if (a->smmul) { /* Architecure supports fast small multiply */ - t->im_oc = t->im_ts; /* Do scale by structure size explicitly */ - t->vo_om = 1; /* Do none in the Simplex index */ - } else { /* We have no fast tricks */ - t->im_oc = 1; /* Do none explicitly */ - t->vo_om = t->im_ts; /* Do all in Simplex index */ - } - - /* Compute the number of bits needed to hold an index into */ - /* the interpolation table (index is in terms of table entry size). */ - /* This value is used to figure out the room needed in the input */ - /* table to accumulate the interpolation cube base offset value. (IM_O macro) */ - f->ixmnb = calc_bits(g->id, g->itres); - - /* Set a default output channel mapping */ - for (e = 0; e < g->od; e++) - t->im_map[e] = e; - -#ifdef VERBOSE - /* Summarise the interpolation table arrangements */ - printf("\n"); - printf("Interpolation table structure:\n"); - printf(" Minimum bits needed to index table %d\n", f->ixmnb); - printf(" Entry total size %d bytes\n", t->im_ts); - printf(" Simplex entry offset scale %d\n", t->vo_om); - printf(" Explicit entry offset scale %d\n", t->im_oc); - printf(" %d full entries, size %d bytes\n", t->im_fn, t->im_fs); - printf(" %d partial entries, size %d bytes\n", t->im_pn, t->im_ps); - printf(" to hold %d output values of %d bits\n", g->od, f->imovb); - -#endif /* VERBOSE */ - - /* Number of bits needed for the weighting value */ - f->wemnb = g->prec+1; /* Need to hold a weighting factor of 0 - 256 for 8 bits */ - /* Need to hold a weighting factor of 0 - 65536 for 16 bits */ - - /* Variable that would be used to hold it */ - if ((f->wevt = findnord(f, f->wemnb)) < 0) { - fprintf(stderr,"Can't find entry size to hold weighting variable\n"); - exit(-1); - } - - /* Number of bits needed for vertex offset value */ - f->vomnb = calc_obits(g->id, g->itres, t->vo_om); - - /* Variable that would be used to hold it */ - if ((f->vovt = findnord(f, f->vomnb)) < 0) { - fprintf(stderr,"Can't find entry size to hold vertex offset variable\n"); - exit(-1); - } - - if (t->sort) { - /* If we are using an explicit sort, we need to figure how many */ - /* separate entries we need to use to hold the interpolation index, */ - /* weighting factor and vertex offset values in the input table. */ - - /* First try all three in one entry */ - if ((f->itet = findord(f, f->ixmnb + f->wemnb + f->vomnb)) >= 0) {/* size to read */ - int rem; /* Remainder bits */ - - t->it_xs = 0; /* Combined interp+weight+offset */ - t->wo_xs = 0; - t->it_ab = a->ords[f->itet].bits; /* Bits in combined input entry */ - rem = t->it_ab - f->ixmnb - f->wemnb - f->vomnb; /* Spair bits */ - t->we_ab = f->wemnb; /* Get minimum weight bits */ - t->vo_ab = f->vomnb + rem/2; /* vertex offset index bits actually available */ - t->ix_ab = t->it_ab - t->vo_ab - t->we_ab; /* interp index bits actually available */ - t->wo_ab = t->we_ab + t->vo_ab; /* Weight & offset total bits */ - t->it_ts = a->ords[f->itet].bits/8; /* total size in bytes */ - f->itvt = nord(f, f->itet); /* Variable type */ - - if ((f->wovt = findnord(f, t->we_ab + t->vo_ab)) < 0) { - fprintf(stderr,"Can't find variable size to hold weight/offset\n"); - exit(-1); - } - if ((f->wevt = findnord(f, t->we_ab)) < 0) { - fprintf(stderr,"Can't find variable size to hold weighting factor\n"); - exit(-1); - } - if ((f->vovt = findnord(f, t->vo_ab)) < 0) { - fprintf(stderr,"Can't find variable size to hold vertex offset index\n"); - exit(-1); - } - if ((f->ixvt = findnord(f, t->ix_ab)) < 0) { - fprintf(stderr,"Interp index variable size can't be handled\n"); - exit(-1); - } - } else { /* Interp index will be a separate entry */ - int wit, oft, bigt; /* weighting type, offset type, biggest type */ - int combt; /* Combined type */ - int sepbits, combits; /* Total separate, combined bits */ - - t->it_xs = 1; /* Separate interp index and weighting+offset */ - if ((f->ixet = findord(f, f->ixmnb)) < 0) { - fprintf(stderr,"Interp index entry size can't be handled\n"); - exit(-1); - } - f->ixvt = nord(f, f->ixet); /* Variable type */ - t->ix_ab = a->ords[f->ixet].bits; - t->ix_es = t->ix_ab/8; - t->ix_eo = 0; - t->it_ts = t->ix_es; /* Input table size so far */ - - /* Now figure weighting and vertex offset */ - - /* See if we can fit them into separately readable entries, or whether */ - /* they should be combined to minimise overall table size. */ - - if ((wit = findord(f, f->wemnb)) < 0) { - fprintf(stderr,"Can't find entry size to hold weighting factor\n"); - exit(-1); - } - if ((oft = findord(f, f->vomnb)) < 0) { - fprintf(stderr,"Can't find entry size to hold vertex offset index\n"); - exit(-1); - } - bigt = wit > oft ? wit : oft; /* Bigest separate type */ - - if ((combt = findord(f, f->wemnb + f->vomnb)) < 0) {/* Combined isn't possible */ - sepbits = 2 * a->ords[bigt].bits; /* Total separate bits */ - combits = sepbits; /* Force separate entries */ - } else { - sepbits = 2 * a->ords[bigt].bits; /* Total separate bits */ - combits = a->ords[combt].bits; /* Total combined bits */ - } - - if (sepbits <= combits) { /* We will use separate entries */ - t->wo_xs = 1; - t->we_es = a->ords[bigt].bits/8; /* size in bytes for weighting entry */ - t->we_ab = a->ords[bigt].bits; /* bits available for weighting */ - t->we_eo = t->ix_es; /* Entry offset in input table */ - t->vo_es = a->ords[bigt].bits/8; /* size in bytes for vertex offset entry */ - t->vo_ab = a->ords[bigt].bits; /* bits available for vertex offset */ - t->vo_eo = t->ix_es + t->we_es; /* Entry offset in input table */ - t->wo_es = t->we_es + t->vo_es; /* Total entry size for each vertex */ - t->it_ts += t->we_es + t->vo_es; /* Total input entry size in bytes */ - - f->weet = bigt; /* Variable type for accessing weighting entry */ - f->voet = bigt; /* Variable type for accessing vertex offset entry */ - f->wevt = nord(f, wit); /* Variable type for holding weight value */ - f->vovt = nord(f, oft); /* Variable type for holding offset value */ - - } else { /* We will combine the two entries */ - t->wo_xs = 0; - t->wo_es = a->ords[combt].bits/8; /* entry size in bytes for each entry */ - t->wo_ab = a->ords[combt].bits; /* bits in weightig + offset */ - t->we_ab = f->wemnb; /* bits available for weighting */ - t->vo_ab = t->wo_ab - t->we_ab; /* Allow all spare bits to vertex offset */ - t->wo_eo = t->ix_es; /* entry offset in input table */ - t->it_ts += t->wo_es; /* Final input table size */ - - f->woet = combt; /* Variable type for accessing combined entry */ - f->wovt = nord(f, combt); /* Variable type holding weight/offset read value */ - - if ((f->wevt = findnord(f, t->we_ab)) < 0) { - fprintf(stderr,"Can't find variable size to hold weighting factor\n"); - exit(-1); - } - if ((f->vovt = findnord(f, t->vo_ab)) < 0) { - fprintf(stderr,"Can't find variable size to hold vertex offset index\n"); - exit(-1); - } - } - } -#ifdef VERBOSE - /* Summarise the input table arrangements */ - printf("\n"); - printf("Input table structure:\n"); - printf(" Input value re-ordering is ["); - for (e = 0; e < g->id; e++) - printf("%s%d",e > 0 ? " " : "", t->it_map[e]); - printf("]\n"); - printf(" Input table entry size = %d bytes\n",t->it_ts); - if (t->it_ix) { - printf(" Input table extracts value from read values\n"); - if (t->wo_xs) { - printf(" Separate Interp., Weighting and Offset values\n"); - printf(" Interp. index is at offset %d, size %d bytes\n",t->ix_eo, t->ix_es); - printf(" Weighting is at offset %d, size %d bytes\n",t->we_eo, t->we_es); - printf(" Vertex offset is at offset %d, size %d bytes\n",t->vo_eo, t->vo_es); - } else { - printf(" Separate Interp. index and Weightint+Offset value\n"); - printf(" Interp. index is at offset %d, size %d bytes\n",t->ix_eo, t->ix_es); - printf(" Weighting+Offset is at offset %d, size %d bytes\n",t->wo_eo, t->wo_es); - printf(" Weighting = %d bits\n",t->we_ab); - printf(" Vertex offset = %d bits\n",t->vo_ab); - } - } else { - printf(" Combined InterpIndex+Weighting+Voffset values\n"); - printf(" Values are stored in size %d bytes\n",t->it_ts); - printf(" Interp. index = %d bits\n",t->ix_ab); - printf(" Weighting = %d bits\n",t->we_ab); - printf(" Vertex offset = %d bits\n",t->vo_ab); - } -#endif /* VERBOSE */ - - } else { /* Simplex table */ - /* If we are going to use a simplex table, figure out how we */ - /* will store the weighting value and vertex offset values in it, */ - /* as well as the size of index we'll need to address it. */ - int wit, oft, bigt; /* weighting type, offset type, biggest type */ - int combt; /* Combined type */ - int sepbits, combits; /* Total separate, combined bits */ - - /* See if we can fit them into separately readable entries, or whether */ - /* they should be combined to minimise overall table size. */ - - if ((wit = findord(f, f->wemnb)) < 0) { - fprintf(stderr,"Can't find entry size to hold weighting factor\n"); - exit(-1); - } - if ((oft = findord(f, f->vomnb)) < 0) { - fprintf(stderr,"Can't find entry size to hold vertex offset index\n"); - exit(-1); - } - bigt = wit > oft ? wit : oft; /* Bigest separate type */ - - if ((combt = findord(f, f->wemnb + f->vomnb)) < 0) {/* Combined isn't possible */ - sepbits = 2 * a->ords[bigt].bits; /* Total separate bits */ - combits = sepbits; /* Force separate entries */ - } else { - sepbits = 2 * a->ords[bigt].bits; /* Total separate bits */ - combits = a->ords[combt].bits; /* Total combined bits */ - } - - if (sepbits <= combits) { /* We will use separate entries */ - t->wo_xs = 1; - t->we_es = a->ords[bigt].bits/8; /* size in bytes for weighting entry */ - t->we_ab = a->ords[bigt].bits; /* bits available for weighting */ - t->we_eo = 0; /* Entry offset in simplex table */ - t->vo_es = a->ords[bigt].bits/8; /* size in bytes for vertex offset entry */ - t->vo_ab = a->ords[bigt].bits; /* bits available for vertex offset */ - t->vo_eo = t->we_es; /* Entry offset in simplex table */ - t->wo_es = t->we_es + t->vo_es; /* Total entry size for each vertex */ - t->sm_ts = (g->id + 1) * (t->we_es + t->vo_es) ; /* Total size in bytes */ - - f->weet = bigt; /* Variable type for accessing weighting entry */ - f->voet = bigt; /* Variable type for accessing vertex offset entry */ - f->wevt = nord(f, wit); /* Variable type for holding weight value */ - f->vovt = nord(f, oft); /* Variable type for holding offset value */ - - } else { /* We will combine the two entries */ - t->wo_xs = 0; - t->wo_es = a->ords[combt].bits/8; /* entry size in bytes for each entry */ - t->wo_ab = a->ords[combt].bits; /* bits in weightig + offset */ - t->we_ab = f->wemnb; /* bits available for weighting */ - t->vo_ab = t->wo_ab - t->we_ab; /* Allow all spare bits to vertex offset */ - t->wo_eo = 0; /* entry offset in simplex table */ - t->sm_ts = (g->id + 1) * t->wo_es; /* Total size in bytes */ - - f->woet = combt; /* Variable type for accessing combined entry */ - f->wovt = nord(f, combt); /* Variable type holding weight/offset read value */ - - if ((f->wevt = findnord(f, t->we_ab)) < 0) { - fprintf(stderr,"Can't find variable size to hold weighting factor\n"); - exit(-1); - } - if ((f->vovt = findnord(f, t->vo_ab)) < 0) { - fprintf(stderr,"Can't find variable size to hold vertex offset index\n"); - exit(-1); - } - } - - /* Compute the number of bits needed to hold an index into */ - /* the simplex table (index is in terms of table entry size). */ - /* This value is used to figure out the room needed in the input */ - /* table to accumulate the simplex cube base offset value. (SW_O macro) */ - f->sxmnb = calc_bits(g->id, g->stres); - -#ifdef VERBOSE - /* Summarise the simplex table arrangements */ - printf("\n"); - printf("Simplex table structure:\n"); - printf(" Minimum bits needed to index table %d\n", f->sxmnb); - printf(" Total simplex entry size %d bytes to hold %d entries\n",t->sm_ts, g->id+1); - if (t->wo_xs) { - printf(" Separate entries for offset and weight\n"); - printf(" Weighting entry size %d bytes\n",t->we_es); - printf(" Offset entry size %d bytes\n",t->vo_es); - } else { - printf(" Combined offset and weight entries in %d bytes\n",t->wo_es); - printf(" Weighting entry size %d bits\n",t->we_ab); - printf(" Offset entry size %d bits\n",t->vo_ab); - } - printf(" Vertex offset scale factor %d\n", t->vo_om); -#endif /* VERBOSE */ - - /* We known how big the interpolation and simplex */ - /* tables indexes are going to be, so complete figuring out */ - /* how big the input table entries have to be. */ - if ((f->itet = findord(f, f->sxmnb + f->ixmnb)) >= 0) {/* size to read */ - int rem; /* Remainder bits */ - - t->it_xs = 0; /* Combined simplex+interp index */ - - t->it_ab = a->ords[f->itet].bits; /* Bits in combined input entry */ - rem = t->it_ab - f->sxmnb - f->ixmnb; - t->sx_ab = f->sxmnb + rem/2; /* simplex index bits actually available */ - t->ix_ab = t->it_ab - t->sx_ab; /* interp index bits actually available */ - t->it_ts = a->ords[f->itet].bits/8; /* total size in bytes */ - f->itvt = nord(f, f->itet); /* Variable type */ - - if ((f->sxvt = findnord(f, t->sx_ab)) < 0) { - fprintf(stderr,"Simplex index variable size can't be handled\n"); - exit(-1); - } - if ((f->ixvt = findnord(f, t->ix_ab)) < 0) { - fprintf(stderr,"Interp index variable size can't be handled\n"); - exit(-1); - } - } else { /* Separate entries */ - int bbits; /* Largest number of bits needed */ - - t->it_xs = 1; /* Separate simplex+interp indexes */ - bbits = f->sxmnb > f->ixmnb ? f->sxmnb : f->ixmnb; - - /* Allocate same size for both so that total structure size is power of 2 */ - if ((f->sxet = f->ixet = findord(f, bbits)) < 0) { - fprintf(stderr,"Interp/Simplex index entry size can't be handled\n"); - exit(-1); - } - - t->sx_ab = a->ords[f->sxet].bits; /* Actual bits available */ - t->sx_es = t->sx_ab/8; /* Entry size in bytes */ - t->ix_ab = a->ords[f->ixet].bits; - t->ix_es = t->sx_ab/8; - t->it_ts = t->sx_es + t->ix_es; /* total size in bytes */ - t->sx_eo = 0; /* simplex index offset in bytes */ - t->ix_eo = t->sx_es; /* interp. index offset in bytes */ - f->sxvt = nord(f, f->sxet); /* Variable type */ - f->ixvt = nord(f, f->ixet); /* Variable type */ - } - -#ifdef VERBOSE - /* Summarise the input table arrangements */ - printf("\n"); - printf("Input table structure:\n"); - if (t->it_ix) { - printf(" Input table extracts value from read values\n"); - } else { - printf(" Value extraction read values is explicit\n"); - } - printf(" Input value re-ordering is ["); - for (e = 0; e < g->id; e++) - printf("%s%d",e > 0 ? " " : "", t->it_map[e]); - printf("]\n"); - printf(" Input table entry size = %d bytes\n",t->it_ts); - if (t->it_xs) { - printf(" Separate Interp. and Simplex index values\n"); - printf(" Interp. index is at offset %d, size %d bytes\n",t->ix_eo, t->ix_es); - printf(" Simplex index is at offset %d, size %d bytes\n",t->sx_eo, t->sx_es); - } else { - printf(" Combined Interp. and Simplex index values\n"); - printf(" Values are size %d bytes\n",t->it_ts); - printf(" Interp. index = %d bits\n",t->ix_ab); - printf(" Simplex index = %d bits\n",t->sx_ab); - } -#endif /* VERBOSE */ - } - - /* Figure out output table stuff */ - { - /* A variable to hold the index into an output table */ - if ((f->otit = findord(f, g->prec)) < 0) { - fprintf(stderr,"Can't find output table index size\n"); - exit(-1); - } - f->otit = nord(f,f->otit); /* Make temp variable natural size */ - - if (g->out.pint != 0) /* Pixel interleaved */ - f->nop = 1; - else - f->nop = g->od; - - /* Figure out the output pointer types */ - f->otvt = 0; /* Output table value type */ - for (e = 0; e < f->nop; e++) { - if ((f->opt[e] = findord(f, g->out.bpch[e])) < 0) { - fprintf(stderr,"Output channel size can't be handled\n"); - exit(-1); - } - if (f->opt[e] > f->otvt) - f->otvt = f->opt[e]; /* Make value type big enough for any channel size */ - } - t->ot_ts = a->ords[f->otvt].bits/8; /* Output table entry size in bytes */ - - /* Setup information on data placement in output table enries */ - for (e = 0; e < g->od; e++) { - t->ot_off[e] = g->out.bov[e]; /* Transfer info from generation spec. */ - t->ot_bits[e] = g->out.bpv[e]; - } - } - -#ifdef VERBOSE - /* Summarise the output table arrangements */ - printf(" Output value re-ordering is ["); - for (e = 0; e < g->od; e++) - printf("%s%d",e > 0 ? " " : "", t->im_map[e]); - printf("]\n"); - printf("\n"); - - printf("Output table structure:\n"); - printf(" Entry size = %d bytes\n",t->ot_ts); - printf(" Output value placement within each enry is:\n"); - for (e = 0; e < f->nop; e++) { - printf(" %d: Offset %d bits, size %d bits\n", e, t->ot_off[e], t->ot_bits[e]); - } -#endif /* VERBOSE */ - - /* Compute the maximum interpolation table resolution we will be able to handle */ - { - int res, ores; - - res = calc_res(g->id, t->ix_ab); - ores = calc_ores(g->id, t->vo_ab, t->vo_om); - f->ixmxres = res < ores ? res : ores; - } - - /* Compute the maximum simplex table resolution we will be able to handle */ - if (t->sort) { - f->sxmxres = 0; - } else { - f->sxmxres = calc_res(g->id, t->sx_ab); - } - -#ifdef VERBOSE - printf("Emitting introductory code\n"); fflush(stdout); -#endif /* VERBOSE */ - - /* Start of code generation */ - doheader(f); /* Output the header comments */ - - /* We need an include file */ - line(f,"#ifndef IMDI_INCLUDED"); - line(f,"#include "); - line(f,"#include \"imdi_imp.h\""); - line(f,"#define IMDI_INCLUDED"); - line(f,"#endif /* IMDI_INCLUDED */"); - cr(f); - - /* Declare our explicit pointer type */ - line(f,"#ifndef DEFINED_pointer"); - line(f,"#define DEFINED_pointer"); - line(f,"typedef unsigned char * pointer;"); - line(f,"#endif"); - cr(f); - - /* Declare our explicit structure access macros */ - -#ifdef VERBOSE - printf("Declaring macros\n"); fflush(stdout); -#endif /* VERBOSE */ - - /* Macros for accessing input table entries */ - if (t->sort) { - if (t->it_xs) { - line(f,"/* Input table interp. index */"); - line(f,"#define IT_IX(p, off) *((%s *)((p) + %d + (off) * %d))", - a->ords[f->ixet].name, t->ix_eo, t->it_ts); - cr(f); - if (t->wo_xs) { - line(f,"/* Input table input weighting enty */"); - line(f,"#define IT_WE(p, off) *((%s *)((p) + %d + (off) * %d))", - a->ords[f->weet].name, t->we_eo, t->it_ts); - cr(f); - line(f,"/* Input table input offset value enty */"); - line(f,"#define IT_VO(p, off) *((%s *)((p) + %d + (off) * %d))", - a->ords[f->voet].name, t->vo_eo, t->it_ts); - cr(f); - } else { - line(f,"/* Input table input weighting/offset value enty */"); - line(f,"#define IT_WO(p, off) *((%s *)((p) + %d + (off) * %d))", - a->ords[f->woet].name, t->wo_eo, t->it_ts); - cr(f); - } - } else { - line(f,"/* Input table interp index, weighting and vertex offset */"); - line(f,"#define IT_IT(p, off) *((%s *)((p) + %d + (off) * %d))", - a->ords[f->itet].name, 0, t->it_ts); - cr(f); - } - - /* Macro to conditionally exchange two varibles */ - /* Doing this in place using an xor seems to be fastest */ - /* on most architectures. */ - line(f,"/* Conditional exchange for sorting */"); - if (t->wo_xs) { - line(f,"#define CEX(A, AA, B, BB) if (A < B) { \\"); - line(f," A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; }"); - } else - line(f,"#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; }"); - cr(f); - - } else { /* Simplex table */ - if (t->it_xs) { - line(f,"/* Input table interp. index */"); - line(f,"#define IT_IX(p, off) *((%s *)((p) + %d + (off) * %d))", - a->ords[f->ixet].name, t->ix_eo, t->it_ts); - cr(f); - line(f,"/* Input table simplex index enty */"); - line(f,"#define IT_SX(p, off) *((%s *)((p) + %d + (off) * %d))", - a->ords[f->sxet].name, t->sx_eo, t->it_ts); - cr(f); - } else { - line(f,"/* Input table inter & simplex indexes */"); - line(f,"#define IT_IT(p, off) *((%s *)((p) + %d + (off) * %d))", - a->ords[f->itet].name, 0, t->it_ts); - cr(f); - } - } - - if (!t->sort) { - /* Macro for computing a simplex table entry */ - line(f,"/* Simplex weighting table access */"); - line(f,"#define SW_O(off) ((off) * %d)", t->sm_ts); - cr(f); - - /* Macros for accessing the contents of the simplex table */ - if (t->wo_xs) { /* If separate */ - line(f,"/* Simplex table - get weighting value */"); - line(f,"#define SX_WE(p, v) *((%s *)((p) + (v) * %d + %d))", - a->ords[f->weet].name, t->wo_es, t->we_eo); - cr(f); - - line(f,"/* Simplex table - get offset value */"); - line(f,"#define SX_VO(p, v) *((%s *)((p) + (v) * %d + %d))", - a->ords[f->voet].name, t->wo_es, t->vo_eo); - cr(f); - - } else { /* Combined */ - line(f,"/* Simplex table - get weighting/offset value */"); - line(f,"#define SX_WO(p, v) *((%s *)((p) + (v) * %d))", - a->ords[f->woet].name, t->wo_es); - cr(f); - } - } - - /* Macro for computing an interpolation table entry */ - line(f,"/* Interpolation multi-dim. table access */"); - line(f,"#define IM_O(off) ((off) * %d)", t->im_ts); - cr(f); - - /* Macro for accessing an entry in the interpolation table */ - line(f,"/* Interpolation table - get vertex values */"); - - if (t->im_fn > 0) { - /* Arguments to macro are cell base address, vertex offset, data offset */ - - if (f->imfvt == f->iafvt) { /* Table and accumulator are the same size */ - if (!timp || t->im_fn == 1) - line(f,"#define IM_FE(p, v, c) *((%s *)((p) + (v) * %d + (c) * %d))", - a->ords[f->imfvt].name, t->im_oc, t->im_fs); - else { - line(f,"#define IM_TP(p, v) ((p) + (v) * %d)", t->im_oc); - line(f,"#define IM_FE(p, c) *((%s *)((p) + (c) * %d))", - a->ords[f->imfvt].name, t->im_fs); - } - } else { /* Expand single table entry to accumulator size */ - if (!timp || t->im_fn == 1) - line(f,"#define IM_FE(p, v, c) ((%s)*((%s *)((p) + (v) * %d + (c) * %d)))", - a->ords[f->iafvt].name, - a->ords[f->imfvt].name, t->im_oc, t->im_fs); - else { - line(f,"#define IM_TP(p, v) ((p) + (v) * %d)", t->im_oc); - line(f,"#define IM_FE(p, c) ((%s)*((%s *)((p) + (c) * %d)))", - a->ords[f->iafvt].name, - a->ords[f->imfvt].name, t->im_fs); - } - } - } - if (t->im_pn > 0) { - /* Arguments to macro are cell base address, vertex offset */ - /* There is no data offset since there can be only be one partial entry */ - - if (f->imfvt == f->iafvt) /* Table and accumulator are the same size */ - line(f,"#define IM_PE(p, v) *((%s *)((p) + %d + (v) * %d))", - a->ords[f->impvt].name, t->im_fn * t->im_fs, t->im_oc); - else /* Expand single table entry to accumulator size */ - line(f,"#define IM_PE(p, v) ((%s)*((%s *)((p) + %d + (v) * %d)))", - a->ords[f->iafvt].name, - a->ords[f->impvt].name, t->im_fn * t->im_fs, t->im_oc); - } - cr(f); - - /* Macro for accessing an output table entry */ - line(f,"/* Output table indexes */"); - line(f,"#define OT_E(p, off) *((%s *)((p) + (off) * %d))", - a->ords[f->otvt].name, t->ot_ts); - cr(f); - - /* =============================================== */ - -#ifdef VERBOSE - printf("Starting interpolation function\n"); fflush(stdout); -#endif /* VERBOSE */ - - /* Declare the function */ - line(f,"static void"); - line(f, "imdi_k%d(",index); - line(f, "imdi *s, /* imdi context */"); - line(f, "void **outp, /* pointer to output pointers */"); - line(f, "void **inp, /* pointer to input pointers */"); - line(f, "unsigned int npix /* Number of pixels to process */"); - line(f, ") {"); - inc(f); - - /* We need access to the imdi_imp */ - line(f, "imdi_imp *p = (imdi_imp *)(s->impl);"); - - /* Declare the input pointers and init them */ - for (e = 0; e < f->nip; e++) { - line(f, "%s *ip%d = (%s *)inp[%d];", - a->ords[f->ipt[e]].name, e, a->ords[f->ipt[e]].name, e); - } - - /* Declare the output pointers and init them */ - for (e = 0; e < f->nop; e++) { - line(f, "%s *op%d = (%s *)outp[%d];", - a->ords[f->opt[e]].name, e, a->ords[f->opt[e]].name, e); - } - - /* Declare and intialise the end pointer */ - line(f, "%s *ep = ip0 + npix * %d ;", - a->ords[f->ipt[0]].name, g->in.chi[0]); - - /* Declare and initialise the input table pointers */ - for (e = 0; e < g->id; e++) - line(f,"pointer it%d = (pointer)p->in_tables[%d];",e,e); - - /* Declare and initialise the output table pointers */ - for (e = 0; e < g->od; e++) - line(f,"pointer ot%d = (pointer)p->out_tables[%d];",e,e); - - if (!t->sort) { - /* Declare and initialise the Simplex weighting base pointer */ - line(f,"pointer sw_base = (pointer)p->sw_table;"); - } - - /* Declare and initialise the Interpolation multidim base pointer */ - line(f,"pointer im_base = (pointer)p->im_table;"); - - /* Figure out whether input channel reads can be used directly as table offsets */ - t->it_ix = 1; /* Default use input table lookup to extract value */ - - if (g->in.packed != 0) - t->it_ix = 0; /* Extract will be done explicitly */ - - for (e = 0; e < g->id; e++) { - int ee = (g->in.pint != 0) ? 0 : e; /* bpch index */ - - if ((g->in.bov[e] + g->in.bpv[e]) <= 12) - continue; /* Table can do extract */ - - if (g->in.bov[e] != 0 || g->in.bpv[e] != g->in.bpch[ee]) { - t->it_ix = 0; /* Extract will be done explicitly */ - break; - } - } - - /* ------------------------------- */ -#ifdef VERBOSE - printf("Starting pixel processing loop\n"); fflush(stdout); -#endif /* VERBOSE */ - - /* Start the pixel processing loop */ - cr(f); - sline(f, "for(;ip0 < ep;"); - for (e = 0; e < f->nip; e++) - mline(f, " ip%d += %d,", e, g->in.chi[e]); - for (e = 0; e < f->nop; e++) - mline(f, " op%d += %d%s", e, g->out.chi[e], ((e+1) < f->nop) ? "," : ""); - eline(f, ") {"); - inc(f); - - /* Declare output value accumulator(s) */ - for (i = 0; i < t->im_fn; i++) { - line(f,"%s ova%d; /* Output value accumulator */",a->ords[f->iafvt].name,i); - } - for (; i < f->ian; i++) { - line(f,"%s ova%d; /* Output value partial accumulator */",a->ords[f->iapvt].name,i); - } - - /* Context around interp/Simplex table lookup */ - line(f, "{"); - inc(f); - - if (!t->sort) - line(f,"pointer swp;"); /* Declare Simplex weighting pointer */ - line(f,"pointer imp;"); /* Declare Interpolation multidim pointer */ - - /* Declare the input weighting/vertex offset variables */ - if (t->sort) { - for (e = 0; e < g->id; e++) { - if (t->wo_xs) { - line(f,"%s we%d; /* Weighting value variable */", - a->ords[f->wevt].name, e); - line(f,"%s vo%d; /* Vertex offset variable */", - a->ords[f->vovt].name, e); - } else { - line(f,"%s wo%d; /* Weighting value and vertex offset variable */", - a->ords[f->wovt].name, e); - } - } - } - - /* Context around input table processing */ - line(f, "{"); - inc(f); - - /* Declare the table index variables/input weighting/vertex offset variables */ - if (t->sort) { - if (!t->it_xs) - line(f,"%s ti; /* Input table entry variable */",a->ords[f->itvt].name); - line(f,"%s ti_i; /* Interpolation index variable */",a->ords[f->ixvt].name); - } else { - if (t->it_xs) { - line(f,"%s ti_s; /* Simplex index variable */",a->ords[f->sxvt].name); - line(f,"%s ti_i; /* Interpolation index variable */",a->ords[f->ixvt].name); - } else { - line(f,"%s ti; /* Simplex+Interpolation index variable */",a->ords[f->itvt].name); - } - } - - if (g->in.packed != 0) /* We need to unpack from a single read */ - line(f,"%s rdv; /* Read value */",a->ords[f->ipt[0]].name); - - if (t->it_ix == 0) { - int bv = 0; - for (e = 0; e < f->nip; e++) { /* Find largest input type */ - if (f->ipt[e] > bv) - bv = f->ipt[e]; - } - bv = nord(f, bv); - line(f,"%s chv; /* Channel value */",a->ords[bv].name); - f->chv_bits = a->ords[bv].bits; - } - cr(f); - -#ifdef VERBOSE - printf("Read code\n"); fflush(stdout); -#endif /* VERBOSE */ - - /* For all the input channels */ - for (e = 0; e < g->id; e++) { - char rde[50]; /* Read expression */ - char toff[50]; /* Table offset expression */ - int ee = (g->in.pint != 0) ? 0 : e; /* bpch index */ - - if (g->in.pint != 0) /* Pixel interleaved */ - sprintf(rde,"ip0[%d]",e); /* Offset from single pointer */ - else - sprintf(rde,"*ip%d",e); /* Pointer per channel */ - - if (g->in.packed != 0) { - if (e == 0) - line(f,"rdv = %s;",rde); /* Do single read */ - sprintf(rde,"rdv"); /* Use read value for extraction */ - } - - if (t->it_ix == 0) { - if (g->in.bov[e] == 0 ) { /* No offset */ - if (g->in.bpv[e] == g->in.bpch[ee]) /* No mask */ - line(f,"chv = %s;",rde); - else /* Just mask */ - line(f,"chv = (%s & %s);",rde, hmask(g->in.bpv[e])); - } else { /* Offset */ - if ((g->in.bov[e] + g->in.bpv[e]) == g->in.bpch[ee]) - line(f,"chv = (%s >> %d);",rde, g->in.bov[e]); - else { /* Offset and mask */ - if (a->shfm || g->in.bpv[e] > 32) { - /* Extract using just shifts */ - line(f,"chv = ((%s << %d) >> %d);", rde, - f->chv_bits - g->in.bpv[e] - g->in.bov[e], - f->chv_bits - g->in.bpv[e]); - } else { - /* Extract using shift and mask */ - line(f,"chv = ((%s >> %d) & %s);", - rde, g->in.bov[e], hmask(g->in.bpv[e])); - } - } - } - sprintf(toff,"chv"); - } else { /* No extraction */ - sprintf(toff,"%s",rde); - } - - if (t->sort) { - if (t->it_xs) { - line(f,"ti_i %s= IT_IX(it%d, %s);", e ? "+" : " ", e, toff); - if (t->wo_xs) { - line(f,"we%d = IT_WE(it%d, %s);", e, e, toff); - line(f,"vo%d = IT_VO(it%d, %s);", e, e, toff); - } else { - line(f,"wo%d = IT_WO(it%d, %s);", e, e, toff); - } - } else { /* All three combined */ - line(f,"ti = IT_IT(it%d, %s);", e, toff); - if (a->shfm || t->wo_ab > 32) { - /* Extract using just shifts */ - line(f,"wo%d = ((ti << %d) >> %d); " - "/* Extract weighting/vertex offset value */", - e, a->ords[f->wovt].bits - t->wo_ab, a->ords[f->wovt].bits - t->wo_ab); - line(f,"ti_i %s= (ti >> %d); " - "/* Extract interpolation table value */", - e ? "+" : " ", t->wo_ab); - } else { - /* Extract using shift and mask */ - line(f,"wo%d = (ti & %s); " - "/* Extract weighting/vertex offset value */", - e, hmask(t->wo_ab)); - line(f,"ti_i %s= (ti >> %d); " - "/* Extract interpolation table value */", - e ? "+" : " ", t->wo_ab); - } - } - - } else { /* Simplex */ - if (t->it_xs) { - /* ~~~~ should toff be forced to be a temp variable ?? */ - /* (ie. force use of rde (above) if t->it_xs is nonz) */ - line(f,"ti_i %s= IT_IX(it%d, %s);", e ? "+" : " ", e, toff); - line(f,"ti_s %s= IT_SX(it%d, %s);", e ? "+" : " ", e, toff); - } else { - line(f,"ti %s= IT_IT(it%d, %s);", e ? "+" : " ", e, toff); - } - } - } - -#ifdef VERBOSE - printf("Index extraction code\n"); fflush(stdout); -#endif /* VERBOSE */ - - cr(f); - - if (t->sort) { - /* Extract Simplex and Interpolation indexes from accumulator */ - line(f,"imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */"); - } else { - if (t->it_xs) { /* Extract Simplex and Interpolation indexes from accumulator */ - line(f,"swp = sw_base + SW_O(ti_s); /* Compute simplex table entry pointer */"); - line(f,"imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */"); - } else { - line(f,"imp = im_base + IM_O(ti >> %d); " - "/* Extract interp. index and comp. entry */", - t->sx_ab); - if (a->shfm || t->sx_ab > 32) { - /* Extract using just shifts */ - line(f,"swp = sw_base + SW_O((ti << %d) >> %d); " - "/* Extract simplex index & comp. entry */", - a->ords[f->itvt].bits - t->sx_ab, a->ords[f->itvt].bits - t->sx_ab); - } else { - /* Extract using shift and mask */ - line(f,"swp = sw_base + SW_O(ti & %s); " - "/* Extract simplex index and comp. entry */", - hmask(t->sx_ab)); - } - } - } - - /* Do the explicit sort now */ - if (t->sort) { - cr(f); - /* Sort from largest to smallest using a selection sort */ - /* Use simple sequence for the moment. More elaborate sequence */ - /* may allow other optimisations. */ - line(f,"/* Sort weighting values and vertex offset values */"); - for (i = 0; i < (g->id-1); i++) { - for (e = i+1; e < g->id; e++) { - if (t->wo_xs) - line(f,"CEX(we%d, vo%d, we%d, vo%d);",i,i,e,e); - else - line(f,"CEX(wo%d, wo%d);",i,e); - } - } - } - - /* End of input table processing context */ - dec(f); - line(f,"}"); - - line(f,"{"); /* Context around vertex lookup and accumulation */ - inc(f); - - /* Declare vertex offset and weight variables */ - if (t->sort && t->wo_xs == 0) { - line(f,"%s nvof; /* Next vertex offset value */",a->ords[f->vovt].name); - } else { - if (!t->wo_xs) /* If combined in table */ - line(f,"%s vowr; /* Vertex offset/weight value */",a->ords[f->wovt].name); - } - line(f,"%s vof; /* Vertex offset value */",a->ords[f->vovt].name); - line(f,"%s vwe; /* Vertex weighting */",a->ords[f->wevt].name); - if (timp && t->im_fn > 1) - line(f,"pointer timp; /* Temporary interpolation table pointer */"); - cr(f); - -#ifdef VERBOSE - printf("Vertex offset and weight code\n"); fflush(stdout); -#endif /* VERBOSE */ - - /* For each vertex in the simplex */ - for (e = 0; e < (g->id +1); e++) { - - if (t->sort) { - - if (e == 0) { - line(f,"vof = 0; /* First vertex offset is 0 */"); - } else { - if (t->wo_xs) - line(f,"vof += vo%d; /* Move to next vertex */",e-1); - else - line(f,"vof += nvof; /* Move to next vertex */"); - } - - /* Extract the vertex offset and weight values from the sorted input values */ - if (e < g->id && !t->wo_xs) { - if (a->shfm || t->vo_ab > 32) { - /* Extract using just shifts */ - line(f,"nvof = ((wo%d << %d) >> %d); " - "/* Extract offset value */", - e, a->ords[f->vovt].bits - t->vo_ab, a->ords[f->vovt].bits - t->vo_ab); - line(f,"wo%d = (wo%d >> %d); " - " /* Extract weighting value */", - e, e, t->vo_ab); - } else { - /* Extract using shift and mask */ - line(f,"nvof = (wo%d & %s); " - "/* Extract offset value */", - e, hmask(t->vo_ab)); - line(f,"wo%d = (wo%d >> %d); " - " /* Extract weighting value */", - e, e, t->vo_ab); - } - } - /* Compute the weighting value */ - if (!t->wo_xs) { - if (e == 0) { - line(f,"vwe = %d - wo%d; /* Baricentric weighting */", 1 << g->prec, e); - } else if (e < g->id) { - line(f,"vwe = wo%d - wo%d; /* Baricentric weighting */", e-1, e); - } else { - line(f,"vwe = wo%d; /* Baricentric weighting */", e-1); - } - } else { - if (e == 0) { - line(f,"vwe = %d - we%d; /* Baricentric weighting */", 1 << g->prec, e); - } else if (e < g->id) { - line(f,"vwe = we%d - we%d; /* Baricentric weighting */", e-1, e); - } else { - line(f,"vwe = we%d; /* Baricentric weighting */", e-1); - } - } - - } else { /* Not sort */ - /* Read the vertex offset and weight values from the simplex table */ - if (t->wo_xs) { /* If separate */ - line(f,"vof = SX_VO(swp, %d); /* Read vertex offset value */", e); - line(f,"vwe = SX_WE(swp, %d); /* Read vertex weighting value */", e); - } else { /* If combined in table */ - line(f,"vowr = SX_WO(swp, %d); /* Read vertex offset+weighting values */", e); - if (a->shfm || t->vo_ab > 32) { - /* Extract using just shifts */ - line(f,"vof = ((vowr << %d) >> %d); " - "/* Extract offset value */", - a->ords[f->vovt].bits - t->vo_ab, a->ords[f->vovt].bits - t->vo_ab); - line(f,"vwe = (vowr >> %d); " - "/* Extract weighting value */", - t->vo_ab); - } else { - /* Extract using shift and mask */ - line(f,"vof = (vowr & %s); " - "/* Extract offset value */", - hmask(t->vo_ab)); - line(f,"vwe = (vowr >> %d); " - "/* Extract weighting value */", - t->vo_ab); - } - } - } - - /* Lookup the vertex value, weight it, and accumulate it into output value */ - if (timp && t->im_fn > 1) - line(f,"timp = IM_TP(imp, vof); /* Vertex address */"); - for (i = 0; i < f->ian; i++) { /* For each output accumulation chunk */ - if (i < t->im_fn) { /* Full entry */ - if (!timp || t->im_fn == 1) - line(f,"ova%d %s= IM_FE(imp, vof, %d) * vwe; " - "/* Accumulate weighted output values */", - i, e ? "+" : " ", i); - else - line(f,"ova%d %s= IM_FE(timp, %d) * vwe; " - "/* Accumulate weighted output values */", - i, e ? "+" : " ", i); - } else /* One partial entry */ - line(f,"ova%d %s= IM_PE(imp, vof) * vwe; " - "/* Accumulate last weighted output values */", - i, e ? "+" : " "); - } - } - - dec(f); - line(f, "}"); /* End of output value lookup context */ - - dec(f); - line(f, "}"); /* End of output value accumulation context */ - - /* Start of output lookup and write */ - line(f,"{"); - inc(f); - -#ifdef VERBOSE - printf("Output table code\n"); fflush(stdout); -#endif /* VERBOSE */ - - { - char wre[50]; /* Write destination expression */ - - if (g->out.packed != 0) /* We need to pack results into a single write */ - line(f,"%s wrv; /* Write value */",a->ords[f->ipt[0]].name); - - /* Declare temporary to hold index into output lookup table */ - line(f,"%s oti; /* Vertex offset value */",a->ords[f->otit].name); - - /* For each accumulator value */ - /* (Assume they are in output order for the moment ?) */ - for (e = i = 0; i < f->ian; i++) { /* For each output accumulation chunk */ - int vpa = i < t->im_fn ? t->im_fv : t->im_pv; /* Chanel values per accumulator */ - int oat = i < t->im_fn ? f->iafvt : f->iapvt; /* Output accumulator type */ - int ee; /* Relative e to this accumulator */ - - /* For each output value in this accumulator */ - for (ee = 0; ee < vpa && e < g->od; ee++, e++) { - int off, size; /* Bits to be extracted */ - - /* Extract wanted 8 bits from the 8.8 bit result in accumulator */ - off = ee * f->iaovb + (f->iaovb - g->prec); - size = g->prec; - - if (e == 0 || g->out.packed == 0) { - if (g->out.pint != 0) /* Pixel interleaved */ - sprintf(wre,"op0[%d]",e); /* Offset from single pointer */ - else - sprintf(wre,"*op%d",e); /* Pointer per channel */ - } - - if (a->shfm || size > 32) { - /* Extract using just shifts */ - line(f,"oti = ((ova%d << %d) >> %d); " - "/* Extract integer part of result */", - i, a->ords[oat].bits - off - size, a->ords[oat].bits - size); - } else { - /* Extract using shift and mask */ - line(f,"oti = ((ova%d >> %d) & %s); " - "/* Extract integer part of result */", - i, off, hmask(size)); - } - - /* Lookup in output table and write to destination */ - if (g->out.packed != 0) { - line(f,"wrv %s= OT_E(ot%d, oti);", e ? "+" : "", e); - } else { - line(f,"%s = OT_E(ot%d, oti); /* Write result */", wre, e); - } - } - } - - if (g->out.packed != 0) { /* Write out the accumulated value */ - line(f,"%s = wrv; /* Write result */", wre); - } - } - - /* The end of the output lookup and write */ - dec(f); - line(f, "}"); - - /* The end of the pixel processing loop */ - dec(f); - line(f, "}"); - - /* The end of the function */ - dec(f); - line(f, "}"); - - /* Undefine all the macros */ - if (t->sort) { - if (t->it_xs) { - if (t->wo_xs) { - line(f,"#undef IT_WE"); - line(f,"#undef IT_VO"); - } else - line(f,"#undef IT_WO"); - line(f,"#undef IT_IX"); - } else { - line(f,"#undef IT_IT"); - } - line(f,"#undef CEX"); - } else { - if (t->it_xs) { - line(f,"#undef IT_IX"); - line(f,"#undef IT_SX"); - } else { - line(f,"#undef IT_IT"); - } - - line(f,"#undef SW_O"); - if (t->wo_xs) { - line(f,"#undef SX_WE"); - line(f,"#undef SX_VO"); - } else { - line(f,"#undef SX_WO"); - } - } - line(f,"#undef IM_O"); - if (t->im_fn > 0) { - if (timp && t->im_fn > 1) - line(f,"#undef IM_TP"); - line(f,"#undef IM_FE"); - } - if (t->im_pn > 0) { - line(f,"#undef IM_PE"); - } - line(f,"#undef OT_E"); - - /* =============================================== */ -#ifdef VERBOSE - printf("Done interpolation code\n"); fflush(stdout); -#endif /* VERBOSE */ - - /* =============================================== */ - - { - int sog = sizeof(genspec); /* Size of genspec structure */ - unsigned char *dp = (unsigned char *)g; - - int s_stres, s_itres; /* Save values */ - - s_stres = g->stres; - s_itres = g->itres; - g->stres = f->sxmxres; /* Set maximum values */ - g->itres = f->ixmxres; - - /* Declare the generation structure data function */ - cr(f); - line(f,"static void"); - line(f, "imdi_k%d_gen(",index); - line(f, "genspec *g /* structure to be initialised */"); - line(f, ") {"); - inc(f); - - /* Declare the genspec initialisation data */ - line(f, "static unsigned char data[] = {"); - inc(f); - for (i = 0; i < sog; i++) { - if ((i & 7) == 0) - sline(f,""); - mline(f, "0x%02x%s ", dp[i], (i+1) < sog ? "," : "", dp[i]); - if ((i & 7) == 7 || (i+1) == sog) - eline(f,""); - } - dec(f); - line(f, "}; /* Structure image */"); - - cr(f); - line(f, "memcpy(g, data, sizeof(data)); /* Initialise the structure */"); - /* The end of the function */ - dec(f); - line(f, "}"); - - g->stres = s_stres; /* Restore entry values */ - g->itres = s_itres; - } - - /* =============================================== */ - - { - int sot = sizeof(tabspec); /* Size of tabspec structure */ - unsigned char *dp = (unsigned char *)t; - - /* Declare the generation structure data function */ - cr(f); - line(f,"static void"); - line(f, "imdi_k%d_tab(",index); - line(f, "tabspec *t /* structure to be initialised */"); - line(f, ") {"); - inc(f); - - /* Declare the genspec initialisation data */ - line(f, "static unsigned char data[] = {"); - inc(f); - for (i = 0; i < sot; i++) { - if ((i & 7) == 0) - sline(f,""); - mline(f, "0x%02x%s ", dp[i], (i+1) < sot ? "," : "", dp[i]); - if ((i & 7) == 7 || (i+1) == sot) - eline(f,""); - } - dec(f); - line(f, "}; /* Structure image */"); - - cr(f); - line(f, "memcpy(t, data, sizeof(data)); /* Initialise the structure */"); - /* The end of the function */ - dec(f); - line(f, "}"); - } - - /* =============================================== */ - - cr(f); cr(f); cr(f); cr(f); cr(f); cr(f); - - return 0; -} - -/* Return bits needed to store index into table of */ -/* given resolution and dimensionality. */ -static int -calc_bits( -int dim, -int res) { - - return ceil(log((double)res) * (double)dim/log(2.0) - 1e-14); -} - -/* Return maximum resolution possible given dimensionality */ -/* and number of index bits. */ -static int -calc_res( -int dim, -int bits) { - double fres; - - fres = log(2.0) * (double)bits/(double)dim; - if (fres > 12 || (fres = exp(fres)) > 65536.0) - fres = 65536.0; /* Limit to a sane value */ - return (int)(fres + 1e-14); -} - -/* Return bits needed to store a relative offset of 1, */ -/* into a table of given resolution, dimensionality , and */ -/* entry size. */ -static int -calc_obits( -int dim, -int res, -int esize) { - double off; /* Maximum diagonal offset value */ - int bits; - - if (res == 0 || res == 1) - return 0; - if (dim == 1) - off = esize; - else { - off = (double)esize * floor(exp(log((double)res) * dim - log(res-1.0))); - } - - bits = ceil(log(off)/log(2.0) - 1e-14); - return bits; -} - -/* Return maximum resolution possible given dimensionality */ -/* number of index bits, and entry size */ -static int -calc_ores( -int dim, -int bits, -int esize) { - int res; - - /* Find resolution. Stop at arbitrary 65536 */ - for (res = 1; res < 65537; res++) { - int bn; - bn = calc_obits(dim, res, esize); - if (bn > bits) { - return res-1; - } - } - return res-1; -} - -/* Output the introductory comments */ -static void -doheader( - fileo *f -) { - genspec *g = f->g; - tabspec *t = f->t; - mach_arch *a = f->a; - int e; - - /* - - - - - - - - - - - - */ - /* Output file title block */ - line(f,"/* Integer Multi-Dimensional Interpolation */"); - line(f,"/* Interpolation Kernel Code */"); - line(f,"/* Generated by cgen */"); - line(f,"/* Copyright 2000 - 2002 Graeme W. Gill */"); - line(f,"/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */\n"); - line(f,"/* see the Licence.txt file for licencing details.*/\n"); - cr(f); - - /* - - - - - - - - - - - - */ - /* Output the specification */ - line(f,"/*"); - line(f," Interpolation kernel specs:"); - cr(f); - line(f," Input channels per pixel = %d",g->id); - for (e = 0; e < g->id; e++) { - line(f," Input channel %d bits = %d",e, g->in.bpch[e]); - line(f," Input channel %d increment = %d",e, g->in.chi[e]); - } - if (g->in.pint != 0) - line(f," Input is channel interleaved"); - else - line(f," Input is plane interleaved"); - - if (g->in.packed != 0) - line(f," Input channels are packed into one word"); - else - line(f," Input channels are separate words"); - - if (t->it_ix) - line(f," Input value extraction is done in input table lookup"); - cr(f); - - line(f," Output channels per pixel = %d",g->od); - for (e = 0; e < g->od; e++) { - line(f," Output channel %d bits = %d",e, g->out.bpch[e]); - line(f," Output channel %d increment = %d",e, g->out.chi[e]); - } - if (g->out.pint != 0) - line(f," Output is channel interleaved"); - else - line(f," Output is plane interleaved"); - cr(f); - if (g->out.packed != 0) - line(f," Output channels are packed into one word"); - else - line(f," Output channels are separate words"); - - if (t->sort) - line(f," Weight+voffset bits = %d",t->sx_ab); - else - line(f," Simplex table index bits = %d",t->sx_ab); - line(f," Interpolation table index bits = %d",t->ix_ab); - if (!t->sort) - line(f," Simplex table max resolution = %d",f->sxmxres); - line(f," Interpolation table max resolution = %d",f->ixmxres); - line(f," */"); - cr(f); - - /* - - - - - - - - - - - - */ - line(f,"/*"); - line(f," Machine architecture specs:"); - cr(f); - if (a->bigend != 0) - line(f," Big Endian"); - else - line(f," Little endian"); - - if (a->uwa != 0) - line(f," Using maximum sized memory accesses where possible"); - else - line(f," Reading and writing pixel values separately"); - - line(f," Pointer size = %d bits",a->pbits); - cr(f); - - for (e = 0; e < a->nords; e++) { - line(f," Ordinal size %2d bits is known as '%s'", - a->ords[e].bits,a->ords[e].name); - } - line(f," Natural ordinal is '%s'", a->ords[a->natord].name); - cr(f); - - for (e = 0; e < a->nints; e++) { - line(f," Integer size %2d bits is known as '%s'", - a->ints[e].bits,a->ints[e].name); - } - line(f," Natural integer is '%s'", a->ints[a->natint].name); - cr(f); - - line(f," */"); - cr(f); -} - -/* ---------------------------------------- */ -/* Architecture support */ -/* Find an ordinal with at least bits size */ -/* Return -1 if failed */ -int findord( -fileo *f, -int bits -) { - mach_arch *a = f->a; - int i; - - for (i = 0; i < a->nords; i++) { - if (a->ords[i].bits >= bits) - return i; - } - return -1; -} - -/* Round ordinal type up to natural size */ -int nord( - fileo *f, - int ov -) { - if (ov >= 0 && ov < f->a->natord) - ov = f->a->natord; - return ov; -} - -/* Find an ordinal with at least bits size, */ -/* or natural size, whichever is greater. */ -/* Return -1 if failed */ -int findnord( - fileo *f, - int bits -) { - int ov; - - ov = findord(f, bits); - ov = nord(f, ov); - return ov; -} - -/* Find an integer with at least bits size */ -/* Return -1 if failed */ -int findint( - fileo *f, - int bits -) { - mach_arch *a = f->a; - int i; - - for (i = 0; i < a->nints; i++) { - if (a->ints[i].bits >= bits) - return i; - } - return -1; -} - -/* Round integer type up to natural size */ -int nint( - fileo *f, - int iv -) { - if (iv >= 0 && iv < f->a->natint) - iv = f->a->natint; - return iv; -} - -/* Find an interger with at least bits size, */ -/* or natural size, whichever is greater. */ -/* Return -1 if failed */ -int findnint( - fileo *f, - int bits -) { - int iv; - - iv = findint(f, bits); - iv = nint(f, iv); - return iv; -} - -/* ------------------------------------ */ -/* File output support */ - -/* Output a line to the file (including trailing \n) */ -void -line(fileo *f, char *fmt, ...) -{ - int i; - va_list args; - - /* Indent to the correct level */ - for (i = 0; i < f->indt; i++) - fprintf(f->of," "); - - va_start(args, fmt); - vfprintf(f->of, fmt, args); - va_end(args); - fprintf(f->of, "\n"); -} - -/* Output the start of a line to the file) */ -void -sline(fileo *f, char *fmt, ...) -{ - int i; - va_list args; - - /* Indent to the correct level */ - for (i = 0; i < f->indt; i++) - fprintf(f->of," "); - - va_start(args, fmt); - vfprintf(f->of, fmt, args); - va_end(args); -} - -/* Output the middle of a line to the file) */ -void -mline(fileo *f, char *fmt, ...) -{ - int i; - va_list args; - - va_start(args, fmt); - vfprintf(f->of, fmt, args); - va_end(args); -} - -/* Output the end of a line to the file (including trailing \n) */ -void -eline(fileo *f, char *fmt, ...) -{ - int i; - va_list args; - - va_start(args, fmt); - vfprintf(f->of, fmt, args); - va_end(args); - fprintf(f->of, "\n"); -} -/* ------------------------------------ */ diff -Nru ghostscript-9.04~dfsg/imdi/config.h ghostscript-9.05~dfsg~20120125/imdi/config.h --- ghostscript-9.04~dfsg/imdi/config.h 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/imdi/config.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -#ifndef __CONFIG_H__ -#define __CONFIG_H__ - -/* General project wide configuration */ - -/* Version of Argyll release */ - -#define ARGYLL_VERSION 0x000503 -#define ARGYLL_VERSION_STR "0.53" - -/* Maximum file path length */ -#define MAXNAMEL 512 - -#endif /* __CONFIG_H__ */ diff -Nru ghostscript-9.04~dfsg/imdi/copyright.h ghostscript-9.05~dfsg~20120125/imdi/copyright.h --- ghostscript-9.04~dfsg/imdi/copyright.h 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/imdi/copyright.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -/* Embed a copyright string */ -static char __copyright__[] = "Copyright 2005 Graeme W. Gill"; diff -Nru ghostscript-9.04~dfsg/imdi/imdi.c ghostscript-9.05~dfsg~20120125/imdi/imdi.c --- ghostscript-9.04~dfsg/imdi/imdi.c 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/imdi/imdi.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,211 +0,0 @@ -/* Integer Multi-Dimensional Interpolation */ -/* - * Copyright 2000 - 2002 Graeme W. Gill - * All rights reserved. - * - * This material is licenced under the GNU GENERAL PUBLIC LICENCE :- - * see the Licence.txt file for licencing details. - */ - -/* - This is the implementation of the run time code. - */ - -#include -#include -#include -#include -#include - -#include "imdi_imp.h" -#include "imdi_gen.h" -#include "imdi_tab.h" -#include "imdi_k.h" /* Declaration of all the kernel functions */ - -#undef VERBOSE - -static void imdi_free(imdi *im); - -/* Create a new imdi */ -/* Return NULL if request is not supported */ -imdi *new_imdi( - int id, /* Number of input dimensions */ - int od, /* Number of output dimensions */ - imdi_pixrep in, /* Input pixel representation */ - int in_signed, /* Bit flag per channel, NZ if treat as signed */ - imdi_pixrep out,/* Output pixel representation */ - int out_signed, /* Bit flag per channel, NZ if treat as signed */ - int res, /* Desired table resolution */ - - /* Callbacks to lookup the mdi table values */ - double (*input_curve) (void *cntx, int ch, double in_val), - void (*md_table) (void *cntx, double *out_vals, double *in_vals), - double (*output_curve)(void *cntx, int ch, double in_val), - void *cntx /* Context to callbacks */ -) { - int i; - int bk = -1; /* Best table */ - int bfig = 0x7fffffff; /* Best tables figure of merit */ - int bstres; /* Best tables target stres */ - genspec bgs; /* Best gen spec */ - - tabspec ts; /* Table specifications */ - imdi *im; - -#ifdef VERBOSE - printf("new_imdi called with id %d, od %d, res %d\n", id, od, res); - printf("about to checking %d kernels\n", no_kfuncs); -#endif - - /* The first thing to do is see if there is an available kernel function */ - for (i = 0; i < no_kfuncs; i++) { - genspec gs; - int stres; /* Computed stres needed */ - int fig; - ktable[i].gen(&gs); /* Get the kernel functions genspec */ - -#ifdef VERBOSE - printf("\n"); - printf("kernel %d has id %d, od %d, irep %d orep %d\n", i, gs.id, gs.od, gs.irep, gs.orep); - printf("Input req is id %d, od %d, irep %d orep %d\n", id, od, in, out); -#endif - /* First check mandatory things */ - if (id != gs.id /* Input dimension */ - || od != gs.od /* Output dimension */ - || in != gs.irep /* Input dimension */ - || out != gs.orep) { /* Output dimension */ - continue; - } - -#ifdef VERBOSE - printf(" found match\n"); -#endif - ktable[i].tab(&ts); /* Get the kernel functions tabspec */ - - if (ts.sort) { - stres = 0; -#ifdef VERBOSE - printf("gres = %d\n",res); -#endif - /* We want one that is equals or exceeds the desired */ - /* resolution, but doesn't exceed it too much, or the code */ - /* will be inefficient. */ - /* If there are no routines that can meet the desired precision, */ - /* then it is ok to use the one closest to the desired precision. */ - if (gs.itres >= res) { - fig = 10 * (gs.itres - res); - } { - fig = 0; - if (gs.itres < res) { - fig += 10000 * (res - gs.itres); - } - } - } else { - /* compute the needed stres (Assumint not sort) */ - stres = ((1 << gs.prec)-1 + res-2)/(res-1); -/* stres = ((1024)-1 + res-2)/(res-1); */ - -#ifdef VERBOSE - printf("gres = %d, sres = %d\n",res,stres); -#endif - /* We want one that is equals or exceeds the desired */ - /* resolution, but doesn't exceed it too much, or the code */ - /* will be inefficient. */ - /* If there are no routines that can meet the desired precision, */ - /* then it is ok to use the one closest to the desired precision. */ - if (gs.itres >= res && gs.stres >= stres) { - fig = 10 * (gs.itres - res) + (gs.stres - stres); - } { - fig = 0; - if (gs.itres < res) { - fig += 10000 * (res - gs.itres); - } - if (gs.stres < stres) { - fig += 1000 * (stres - gs.stres); - } - } - } - -#ifdef VERBOSE - printf(" figure of merit %d\n",fig); -#endif - /* Is this the best one so far ? */ - if (fig < bfig) { - bfig = fig; - bk = i; - bstres = stres; - bgs = gs; /* Structure copy */ -#ifdef VERBOSE - printf(" best so far\n"); -#endif - } - } - - if (bk < 0) { -#ifdef VERBOSE - printf("new_imdi failed - dimensionality or representations couldn't be matched\n"); -#endif - return NULL; /* Nothing matches */ - } - - if ((im = (imdi *)malloc(sizeof(imdi))) == NULL) { -#ifdef VERBOSE - printf("new_imdi malloc imdi failed\n"); -#endif - /* Should we return an error somehow ? */ - return NULL; - } - - /* We've decided kernel function bk is going to be the best, */ - /* so now setup the appropriate tables to use with it. */ - ktable[bk].tab(&ts); /* Get the kernel functions tabspec */ - - if (bgs.itres > res) - bgs.itres = res; /* Tell table create what the res is */ - if (bgs.stres > bstres) - bgs.stres = bstres; - - /* Tel table setup how to treat integer input in per channel lookups */ - bgs.in_signed = in_signed; - bgs.out_signed = out_signed; - -#ifdef VERBOSE - if (!ts.sort) { - if ((bgs.stres * (bgs.itres-1)) < ((1 << bgs.prec)-1)) { - printf("Warning: table chosen doesn't reach desired precision!\n"); - printf("Wanted %d, got %d\n", ((1 << bgs.prec)-1), (bgs.stres * (bgs.itres-1))); - } - } -#endif - - /* Allocate and initialise the appropriate tables */ - im->impl = (void *)imdi_tab(&bgs, &ts, input_curve, md_table, output_curve, cntx); - - if (im->impl == NULL) { -#ifdef VERBOSE - printf("imdi_tab failed\n"); -#endif - imdi_free(im); - return NULL; - } - - im->interp = ktable[bk].interp; - im->done = imdi_free; - -#ifdef VERBOSE - printf("new_imdi returning 0x%x\n", im); -#endif - return im; -} - -/* Free up the structure */ -static void imdi_free( -imdi *im -) { - /* Free all the allocated tables */ - if (im->impl != NULL) - imdi_tab_free((imdi_imp *)im->impl); - - /* Free this structure */ - free(im); -} diff -Nru ghostscript-9.04~dfsg/imdi/imdi_gen.c ghostscript-9.05~dfsg~20120125/imdi/imdi_gen.c --- ghostscript-9.04~dfsg/imdi/imdi_gen.c 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/imdi/imdi_gen.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,660 +0,0 @@ -/* Integer Multi-Dimensional Interpolation */ -/* - * Copyright 2000 - 2002 Graeme W. Gill - * All rights reserved. - * - * This material is licenced under the GNU GENERAL PUBLIC LICENCE :- - * see the Licence.txt file for licencing details. - */ - -/* Top level kerenel code generator */ - -/* - * This module is invoked from the make system, - * and generates all the versions and configurations of - * the IMDI kernel code. It includes all the generated - * files in imdi_k.h, which also contains a table - * so that the run time code knows what kernels - * are available. -*/ - -/* - Ideal grid resolutions for 8/16 bit precision calculations: - - There are a limited number of grid resolution and grid cells - sub resolution values that work perfectly, and allow every possible - input value to map to a precise interpolation value. For any - system that deals with Lab data, it is also better if there is - a grid point near a,b == 0, meaning that an odd grid size is - preferable for 3 dimensional conversions. Reasonable memory - usage is usuall somewhere between 100K and 1M entries for - the grid table, limiting the maximum grid resolution. - The following lists the some of the possible grid and sub grid - resolutions in order of best to worst. (Fewer jumps is better). - - Grid Sub8 Round8 Sub16 Round16 Jumps - 4 85 85 21845 21845 0 - 6 51 51 13107 13107 0 - 16 17 17 4369 4369 0 - 18 15 15 3855 3855 0 - 52 5 5 1285 1285 0 - 86 3 3 771 771 0 - 256 1 1 257 257 0 - 258 255 255 0 - 772 85 85 0 - 1286 51 51 0 - 3856 17 17 0 - 4370 15 15 0 - 13108 5 5 0 - 21846 3 3 0 - 65536 1 1 0 - 3 127.5 128 1 - 5 63.75 64 1 - 9 31.875 32 1 - 17 15.937 16 1 - 33 7.968 8 1 - 65 3.984 4 1 - 128 2.007 2 1 - 129 1.992 2 1 - 255 1.003 1 1 - 12 23.188 23 2 - 24 11.086 11 2 - 254 1.007 1 2 - 7 42.5 43 3 - 8 36.428 36 3 - 10 28.333 28 3 - 13 21.25 21 3 - 15 18.214 18 3 - 19 14.166 14 3 - 22 12.142 12 3 - 29 9.107 9 3 - 37 7.083 7 3 - 43 6.071 6 3 - 44 5.930 6 3 - 64 4.047 4 3 - 85 3.035 3 3 - 87 2.965 3 3 - 127 2.023 2 3 - 130 1.976 2 3 - 253 1.011 1 3 - - [8 bit: sub = 255/(grid-1), jumps = abs((grid-1)*round(sub)-255)] - [16 bit: sub = 65535/(grid-1), jumps = abs((grid-1)*round(sub)-65535)] - - The above takes into consideration the mapping of the sub-cell or - simplex table resolution, but doesn't take into account the quantizing - of the sub-cell weighting values into the range 0..256 or 0..65536. - - This will be best when round(sub) divides evenly into 256 or 65536, - so grid resolutions of 3, 5, 9, 17, 33, 65, 128, 129, 255 may be the - best choice for sort algorithm grid resolutions. - - */ - -#include -#include -#include -#include -#include -#include "copyright.h" -#include "config.h" - -#include "imdi_imp.h" -#include "imdi_gen.h" -#include "imdi_tab.h" - -#undef VERBOSE -#undef TEST1 /* Generate one test case */ -#define FULL /* Full set of combinations */ - -/* The following structure initialisations define what kernel routines should be built */ -static -gendesc descs[] = { -#ifdef TEST1 - { - { 1, 0 }, /* Input dimension combinations */ - { 256, 0 }, /* Interpolation table resolutions */ - { 1, 0 }, /* Simplex table resolutions */ - { 1, 0 }, /* Output dimension combinations */ - {pixint16, 0 }, /* Input pixel representation */ - {pixint16, 0}, /* Output pixel representation */ - {forward, 0} /* Direction (not implemented) */ - } -#else -#ifndef FULL - /* Normal */ - /* * means multiplies combination */ - /* + means lockstep with previous line */ - { - { 1, 3, 4, 8, 0 }, /* Input dimension combinations */ - { 256, 33, 18, 5, 0 }, /* + Interpolation table resolutions */ - { 1, 8, 17, 1, 0 }, /* + Simplex table resolutions */ - { 1, 3, 4, 8, 0 }, /* * Output dimension combinations */ - {pixint8, pixint8, pixint16, 0 }, - /* Input pixel representation (determines precision) */ - {pixint8, pixint16, pixint16, 0 }, - /* + Output pixel representation */ - {forward, 0} /* * Direction (not implemented) */ - } -#else - /* Full set of combinations */ - /* * means multiplies combination */ - /* + means lockstep with previous line */ - { - { 1, 3, 4, 5, 6, 7, 8, 0 }, /* Input dimension combinations */ - { 256, 33, 18, 16, 12, 8, 7, 0 }, /* + Min Interpolation table resolutions */ - { 1, 8, 17, 1, 1, 1, 1, 0 }, /* + Min Simplex table resolutions */ - { 1, 3, 4, 5, 6, 7, 8, 0 }, /* * Output dimension combinations */ - {pixint8, pixint8, pixint16, 0 }, - /* Input pixel representation (determines precision) */ - {pixint8, pixint16, pixint16, 0 }, - /* + Output pixel representation */ - {forward, 0} /* * Direction (not implemented) */ - } -#endif -#endif /* TEST1 */ -}; - -int set_genspec(genspec *gs, gendesc *gd, int comb, mach_arch *a); -void set_architecture(mach_arch *ar); - -struct _knamestr { - char name[100]; - char desc[100]; - struct _knamestr *next; -}; typedef struct _knamestr knamestr; - -knamestr * -new_knamestr(char *name, char *desc) { - knamestr *kn; - - if ((kn = (knamestr *)malloc(sizeof(knamestr))) == NULL) { - fprintf(stderr,"new_knamestr malloc failed\n"); - exit(-1); - } - strcpy(kn->name, name); - strcpy(kn->desc, desc); - kn->next = NULL; - return kn; -} - -void usage(void) { - fprintf(stderr,"Generate imdi kernel code Version %s\n",ARGYLL_VERSION_STR); - fprintf(stderr,"usage: imdi_gen [-i]\n"); - fprintf(stderr," -i Individial Files\n"); - exit(1); -} - -int -main(int argc, char *argv[]) { - int fa,nfa; /* argument we're looking at */ - int indiv = 0; /* Individual files */ - int rv; - int dn, tnd; - genspec gs; - mach_arch ar; - int ix = 1; - knamestr *list = NULL, *lp; - FILE *kcode; /* Kernel routine code file */ - FILE *kheader; /* Kernel routine header file */ - - /* Process the arguments */ - for(fa = 1;fa < argc;fa++) { - nfa = fa; /* skip to nfa if next argument is used */ - if (argv[fa][0] == '-') { /* Look for any flags */ - char *na = NULL; /* next argument after flag, null if none */ - - if (argv[fa][2] != '\000') - na = &argv[fa][2]; /* next is directly after flag */ - else { - if ((fa+1) < argc) { - if (argv[fa+1][0] != '-') { - nfa = fa + 1; - na = argv[nfa]; /* next is seperate non-flag argument */ - } - } - } - - if (argv[fa][1] == '?') - usage(); - - /* Individual files */ - else if (argv[fa][1] == 'i' || argv[fa][1] == 'I') { - indiv = 1; - } - else - usage(); - } else - break; - } - - set_architecture(&ar); - - /* Open the file for kernel routine declaration header */ - if ((kheader = fopen("imdi_k.h", "w")) == NULL) { - fprintf(stderr,"imdi_gen: unable to open file 'imdi_k.h'\n"); - exit(-1); - } - - if (!indiv) { - if ((kcode = fopen("imdi_k.c", "w")) == NULL) { - fprintf(stderr,"imdi_gen: unable to open file 'imdi_k.c'\n"); - exit(-1); - } - } - - tnd = sizeof(descs)/sizeof(gendesc); /* Total number of descriptions */ -#ifdef VERBOSE - printf("Number of descriptions = %d\n",tnd); -#endif /* VERBOSE */ - - fprintf(kheader,"/* Declarations for all the generated kernel functions */\n"); - fprintf(kheader,"/* This file is generated by imdi_gen */\n"); - fprintf(kheader,"\n"); - - /* For all the descriptions */ - for (dn = 0; dn < tnd; dn++) { - int cb, ncb; - - for (cb = 0, ncb = 1; cb < ncb; cb++) { - char ofname[100]; - - /* Compute generate spec */ - ncb = set_genspec(&gs, &descs[dn], cb, &ar); - - if (indiv) { - if ((kcode = fopen(ofname, "w")) == NULL) { - fprintf(stderr,"imdi_gen: unable to open file '%s'\n",ofname); - exit(-1); - } - } - - /* Generate it */ -#ifdef TEST1 - rv = gen_c_kernel(&gs, &ar, kcode, 99); ix++; -#else - rv = gen_c_kernel(&gs, &ar, kcode, ix++); -#endif - if (rv != 0) { - fprintf(stderr,"gen_c_kernel failed with %d\n",rv); - exit(-1); - } - - /* Add the name to the list */ - if (list == NULL) - lp = list = new_knamestr(gs.kname, gs.kdesc); - else { - lp->next = new_knamestr(gs.kname, gs.kdesc); - lp = lp->next; - } - if (indiv) { - if (fclose(kcode) != 0) { - fprintf(stderr,"imdi_gen: unable to close file '%s'\n",ofname); - exit(-1); - } - } - } - } - - /* Include the kernel functions in the header file */ - if (indiv) { - for(lp = list; lp != NULL; lp = lp->next) { - fprintf(kheader,"#include \"%s_%s.c\"\n",lp->name,lp->desc); - } - } else { - fprintf(kheader,"#include \"imdi_k.c\" /* All the kernel code */\n"); - } - fprintf(kheader,"\n"); - - /* Output function table */ - - fprintf(kheader, - "struct {\n" - " void (*interp)(imdi *s, void **outp, void **inp, unsigned int npix);\n" - " void (*gen)(genspec *g);\n" - " void (*tab)(tabspec *t);\n" - "} ktable[%d] = {\n",ix-1); - - for(lp = list; lp != NULL; lp = lp->next) { - fprintf(kheader,"\t{ %s, %s_gen, %s_tab }%s\n", lp->name, lp->name, lp->name, - lp->next != NULL ? "," : ""); - } - fprintf(kheader,"};\n"); - fprintf(kheader,"\n"); - fprintf(kheader,"int no_kfuncs = %d;\n",ix-1); - fprintf(kheader,"\n"); - - if (!indiv) { - if (fclose(kcode) != 0) { - fprintf(stderr,"imdi_gen: unable to close file 'imdi_k.c'\n"); - exit(-1); - } - } - - if (fclose(kheader) != 0) { - fprintf(stderr,"imdi_gen: unable to close file 'imdi_k.h'\n"); - exit(-1); - } - - /* Free the kname list */ - for(lp = list; lp != NULL;) { - char *p = (char *)lp; - lp = lp->next; - free(p); - } - - return 0; -} - -void translate_pixrep(pixlayout *pl, char **desc, int *prec, imdi_pixrep rep, int dim, mach_arch *a); - -/* Translate between a gendesc and genspec */ - -int /* Return number of combinations possible */ -set_genspec( -genspec *gs, /* Return specification */ -gendesc *gd, /* Input description */ -int comb, /* Combination index */ -mach_arch *a /* Machine architecture */ -) { - int nc = 1; /* Number of combinations */ - int nidc, id; /* Number of input dimension combinations, current index */ - int nodc, od; /* Number of output dimension combinations, current index */ - int nirc, ir; /* Number of input representation combinations, current index */ - int norc, or; /* Number of output representation combinations, current index */ - int ndc, dir; /* Number of direction combinations, current index */ - - /* Figure out how many combinations there are */ - for (nidc = 0; gd->idcombs[nidc] != 0; nidc++) /* Input dimension */ - ; - nc *= nidc; - for (nodc = 0; gd->odcombs[nodc] != 0; nodc++) /* Output dimension */ - ; - nc *= nodc; - for (nirc = 0; gd->incombs[nirc] != 0; nirc++) /* Input representation */ - ; - nc *= nirc; - for (norc = 0; gd->outcombs[norc] != 0; norc++) /* Output representation */ - ; - if (nirc != norc) { - fprintf(stderr,"imdi_gen: Must be equal numberof input and output representations\n"); - exit(-1); - } - - for (ndc = 0; gd->dircombs[ndc] != 0; ndc++) /* Direction */ - ; - nc *= ndc; - - if (comb < nc) { /* If we are within a legal combination */ - int iprec, oprec; - char *idesc, *odesc; /* Representation descriptions */ - char *ddesc; /* Direction description */ - - id = comb % nidc; - comb /= nidc; - od = comb % nodc; - comb /= nodc; - ir = comb % nirc; - comb /= nirc; - or = ir; /* In and out combs track together */ - dir = comb % ndc; - comb /= ndc; -#ifdef VERBOSE - printf("Combination id = %d, od = %d, ir = %d, or = %d, dir = %d\n", - id,od,ir,or,dir); -#endif /* VERBOSE */ - - gs->id = gd->idcombs[id]; /* Input dimensions */ - gs->itres = gd->itres[id]; /* Interpolation table resolution */ - gs->stres = gd->stres[id]; /* Simplex table resolution */ - gs->od = gd->odcombs[od]; /* Output dimensions */ - - if (gs->id > IXDI) { - fprintf(stderr,"imdi_gen: Input dimension %d exceeds limit %d\n",gs->id,IXDI); - exit(-1); - } - if (gs->od > IXDO) { - fprintf(stderr,"imdi_gen: Output dimension %d exceeds limit %d\n",gs->od,IXDO); - exit(-1); - } - /* Input representation */ - gs->irep = gd->incombs[ir]; /* Keep a copy of this */ - translate_pixrep(&gs->in, &idesc, &iprec, gd->incombs[ir], gs->id, a); - gs->in_signed = 0x0; /* Not used during generation, used at runtime setup */ - - /* Output representation */ - gs->orep = gd->outcombs[or]; /* Keep a copy of this */ - translate_pixrep(&gs->out, &odesc, &oprec, gd->outcombs[or], gs->od, a); - gs->out_signed = 0x0; /* Not used during generation, used at runtime setup */ - - /* Make native precision the smaller of input and output representation */ - gs->prec = iprec < oprec ? iprec : oprec; - - gs->dir = gd->dircombs[dir]; /* Direction */ - - ddesc = gs->dir == backward ? "b" : "f"; /* Direction description */ - -#ifdef VERBOSE - printf("translates to prec = %d, id = %d, od = %d, itres %d, stdres %d\n", - gs->prec,gs->id,gs->od,gs->itres,gs->stres); -#endif /* VERBOSE */ - - /* Create a concise description string */ - sprintf(gs->kdesc,"%d_%d_%s_%s_%s", gs->id, gs->od, idesc, odesc, ddesc); - } - return nc; -} - -void -translate_pixrep( -pixlayout *pl, /* pixlayout to initialise */ -char **desc, /* Return description identifier */ -int *prec, /* Return basic precision specifier (may be NULL) */ -imdi_pixrep rep, /* Representation to be translated */ -int dim, /* Number of dimensions (values/pixel) */ -mach_arch *a /* Machine architecture */ -) { - switch (rep) { - - case pixint8: { /* 8 Bits per value, pixel interleaved, no padding */ - int i; - - /* Could optimise this to packed for dim == 4 ~~~~ */ - - pl->pint = 1; /* pixel interleaved */ - pl->packed = 0; /* Not packed */ - - for (i = 0; i < dim; i++) { - pl->bpch[i] = 8; /* Bits per channel */ - pl->chi[i] = dim; /* Channel increment */ - pl->bov[i] = 0; /* Bit offset to value within channel */ - pl->bpv[i] = 8; /* Bits per value within channel */ - } - - if (prec != NULL) - *prec = 8; /* Basic 8 bit precision */ - if (desc != NULL) - *desc = "i8"; /* Interleaved 8 bit */ - } break; - - case planeint8: { /* 8 bits per value, plane interleaved */ - int i; - - pl->pint = 0; /* Not pixel interleaved */ - pl->packed = 0; /* Not packed */ - - for (i = 0; i < dim; i++) { - pl->bpch[i] = 8; /* Bits per channel */ - pl->chi[i] = 1; /* Channel increment */ - pl->bov[i] = 0; /* Bit offset to value within channel */ - pl->bpv[i] = 8; /* Bits per value within channel */ - } - - if (prec != NULL) - *prec = 8; /* Basic 8 bit precision */ - if (desc != NULL) - *desc = "p8"; /* Planar 8 bit */ - - } break; - - case pixint16: { /* 16 Bits per value, pixel interleaved, no padding */ - int i; - - /* Could optimise this to packed for dim == 4 ~~~~ */ - - pl->pint = 1; /* pixel interleaved */ - pl->packed = 0; /* Not packed */ - - for (i = 0; i < dim; i++) { - pl->bpch[i] = 16; /* Bits per channel */ - pl->chi[i] = dim; /* Channel increment */ - pl->bov[i] = 0; /* Bit offset to value within channel */ - pl->bpv[i] = 16; /* Bits per value within channel */ - } - - if (prec != NULL) - *prec = 16; /* Basic 8 bit precision */ - if (desc != NULL) - *desc = "i16"; /* Interleaved 16 bit */ - } break; - - case planeint16: { /* 16 bits per value, plane interleaved */ - int i; - - pl->pint = 0; /* Not pixel interleaved */ - pl->packed = 0; /* Not packed */ - - for (i = 0; i < dim; i++) { - pl->bpch[i] = 16; /* Bits per channel */ - pl->chi[i] = 1; /* Channel increment */ - pl->bov[i] = 0; /* Bit offset to value within channel */ - pl->bpv[i] = 16; /* Bits per value within channel */ - } - - if (prec != NULL) - *prec = 16; /* Basic 8 bit precision */ - - if (desc != NULL) - *desc = "p16"; /* Planar 8 bit */ - } break; - - default: { - fprintf(stderr,"Warning: Unknown pixel representation %d\n",rep); - } break; - } -} - -/* Initialse the aritecture structure properly */ -void -set_architecture( -mach_arch *ar -) { - unsigned long etest = 0xff; - - if (*((unsigned char *)&etest) == 0xff) { - ar->bigend = 0; /* Little endian */ - } else { - ar->bigend = 1; /* Big endian endian */ - } - -#ifdef __ppc__ /* Section tunable for PowerPC */ - - ar->uwa = 0; /* Use wide memory access */ - ar->shfm = 0; /* Use shifts to mask values */ - ar->oscale = 8; /* Has scaled indexing up to * 8 */ - ar->smmul = 0; /* Doesn't have fast small multiply for index scaling */ - ar->nords = 3; /* Number of ord types */ - ar->natord = 2; /* Most natural type (assume unsigned int) */ - ar->nints = 3; /* Number of int types */ - ar->natint = 2; /* Most natural type (assume int) */ - - ar->pbits = sizeof(void *) * 8; /* Number of bits in a pointer */ - - ar->ords[0].bits = 8 * sizeof(unsigned char); - ar->ords[0].name = "unsigned char"; - ar->ords[0].align = 1; - - ar->ords[1].bits = 8 * sizeof(unsigned short); - ar->ords[1].name = "unsigned short"; - ar->ords[1].align = 1; - - ar->ords[2].bits = 8 * sizeof(unsigned int); - ar->ords[2].name = "unsigned int"; - ar->ords[2].align = 1; - -#ifdef ALLOW64 - ar->ords[3].bits = 8 * sizeof(unsigned longlong); - ar->ords[3].name = "unsigned " str_longlong ; - ar->ords[3].align = 0; -#endif /* ALLOW64 */ - - ar->ints[0].bits = 8 * sizeof(signed char); - ar->ints[0].name = "signed char"; - ar->ints[0].align = 1; - - ar->ints[1].bits = 8 * sizeof(short); - ar->ints[1].name = "short"; - ar->ints[1].align = 1; - - ar->ints[2].bits = 8 * sizeof(int); - ar->ints[2].name = "int"; - ar->ints[2].align = 1; - -#ifdef ALLOW64 - ar->ints[3].bits = 8 * sizeof(longlong); - ar->ints[3].name = str_longlong ; - ar->ints[3].align = 0; -#endif /* ALLOW64 */ - -#else /* Currently assume x86 type */ - - ar->uwa = 0; /* Use wide memory access */ - ar->shfm = 0; /* Use shifts to mask values */ - ar->oscale = 8; /* Has scaled indexing up to * 8 */ - ar->smmul = 0; /* Doesn't have fast small multiply for index scaling */ -/* ~~99 */ - ar->nords = 3; /* Number of ord types */ - ar->natord = 2; /* Most natural type (assume unsigned int) */ - ar->nints = 3; /* Number of int types */ - ar->natint = 2; /* Most natural type (assume int) */ - - ar->pbits = sizeof(void *) * 8; /* Number of bits in a pointer */ - - ar->ords[0].bits = 8 * sizeof(unsigned char); - ar->ords[0].name = "unsigned char"; - ar->ords[0].align = 1; - - ar->ords[1].bits = 8 * sizeof(unsigned short); - ar->ords[1].name = "unsigned short"; - ar->ords[1].align = 1; - - ar->ords[2].bits = 8 * sizeof(unsigned int); - ar->ords[2].name = "unsigned int"; - ar->ords[2].align = 1; - -#ifdef ALLOW64 - ar->ords[3].bits = 8 * sizeof(unsigned longlong); - ar->ords[3].name = "unsigned " str_longlong ; - ar->ords[3].align = 0; -#endif /* ALLOW64 */ - - ar->ints[0].bits = 8 * sizeof(signed char); - ar->ints[0].name = "signed char"; - ar->ints[0].align = 1; - - ar->ints[1].bits = 8 * sizeof(short); - ar->ints[1].name = "short"; - ar->ints[1].align = 1; - - ar->ints[2].bits = 8 * sizeof(int); - ar->ints[2].name = "int"; - ar->ints[2].align = 1; - -#ifdef ALLOW64 - ar->ints[3].bits = 8 * sizeof(longlong); - ar->ints[3].name = str_longlong ; - ar->ints[3].align = 0; -#endif /* ALLOW64 */ - -#endif /* Processor Architecture */ -} diff -Nru ghostscript-9.04~dfsg/imdi/imdi_gen.h ghostscript-9.05~dfsg~20120125/imdi/imdi_gen.h --- ghostscript-9.04~dfsg/imdi/imdi_gen.h 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/imdi/imdi_gen.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,97 +0,0 @@ -#ifndef IMDI_GEN_H -#define IMDI_GEN_H - -/* Integer Multi-Dimensional Interpolation */ -/* - * Copyright 2000 - 2002 Graeme W. Gill - * All rights reserved. - * - * This material is licenced under the GNU GENERAL PUBLIC LICENCE :- - * see the Licence.txt file for licencing details. - */ - -/* Kernel code generation definitions */ - -#include "imdi.h" -#include "arch.h" - -typedef enum { - invalid_dir = 0, - forward = 1, /* 8 Bits per value, pixel interleaved, no padding */ - backward = 2 /* 8 bits per value, plane interleaved */ -} imdi_dir; - -/* -------------------------------------------------- */ -/* High level kernel generation description */ - -/* This sructure allows a series of related kernels to be generated, */ -/* the only variation being the number of input and output dimensions. */ -typedef struct { - int idcombs[10]; /* Input dimension combinations (0 at end) */ - int itres[10]; /* Interpolation table resolutions for each input dimension */ - int stres[10]; /* Simplex table resolutions for each input dimension */ - int odcombs[10]; /* Output dimensions combinations (0 at end) */ - imdi_pixrep incombs[10];/* Input pixel representation combinations */ - imdi_pixrep outcombs[10]; /* Output pixel representation combinations */ - imdi_dir dircombs[10]; /* Direction combinations (not implemented) */ -} gendesc; - -/* -------------------------------------------------- */ -/* Detailed level of generation specification */ - -/* Pixel layout: */ -/* Each channel value is assumed to be read with a */ -/* native machine single read of size bpch, */ -/* and bov and bpv being bit indexes into that value. */ -/* */ -/* If pint == 0, then each read will be of size bpch[], and will */ -/* have its own pointer, will be incremented by chi[]. */ -/* If pint != 0, then the reads will be size bpch[0], from successive */ -/* locations, chi[] apart. */ -/* */ -/* If packed == 0, then separate reads are needed for each input */ -/* channel. */ -/* If packed != 0, then the channel values will be extracted */ -/* from a single read of size bpch[0] */ -/* */ -/* Note that at all times the bit offset and size values */ -/* will be obeyed for each input value. */ - -typedef struct { - int bpch[IXDIDO]; /* Bits per channel read (must be divisible by 8) */ - int chi[IXDIDO]; /* channel increment in multiples of bpch[] (0 == dimensionality) */ - int bov[IXDIDO]; /* Bit offset to value within channel */ - int bpv[IXDIDO]; /* Bits per value within channel */ - int pint; /* Flag - nonz if pixel interleaved (ie. reads from successice locations) */ - int packed; /* Flag - nonz if all channels are packed into a single read */ -} pixlayout; - -/* Structure that specifies the configuration of a generated interpolation kernel. */ -typedef struct { - /* Input to code generator */ - int prec; /* Basic precision:- either 8 or 16 bits, determined by irep */ - int id; /* Number of input dimensions */ - int od; /* Number of output dimensions */ - imdi_pixrep irep;/* Input pixel representation */ - imdi_pixrep orep;/* Output pixel representation */ - int in_signed; /* Bit flag per channel, NZ if treat as signed (runtime setup) */ - int out_signed; /* Bit flag per channel, NZ if treat as signed (runtime setup) */ - pixlayout in; /* Input pixel layout */ - pixlayout out; /* Output pixel layout */ - int dir; /* forward or backward (not implemented */ - int itres; /* Interpolation table resolution */ - int stres; /* Simplex table resolution */ - - /* Returned value */ - char kkeys[100]; /* Kernel keys */ - char kdesc[100]; /* At genspec time */ - char kname[100]; /* At generation time */ -} genspec; - -/* Supported code generators */ - -int gen_c_kernel(genspec *g, mach_arch *a, FILE *fp, int index); /* The 'C' code generator */ - -/* asm, MMX, etc. generators declarations go here ! */ - -#endif /* IMDI_GEN_H */ diff -Nru ghostscript-9.04~dfsg/imdi/imdi.h ghostscript-9.05~dfsg~20120125/imdi/imdi.h --- ghostscript-9.04~dfsg/imdi/imdi.h 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/imdi/imdi.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -#ifndef IMDI_H -#define IMDI_H - -/* Integer Multi-Dimensional Interpolation */ -/* - * Copyright 2000 - 2002 Graeme W. Gill - * All rights reserved. - * - * This material is licenced under the GNU GENERAL PUBLIC LICENCE :- - * see the Licence.txt file for licencing details. - */ - -/* - * This software provides support for high speed integer - * multimensional interpolation. - */ - -/* - * This file provides the common definitions for IMDI, and - * the data structures for communcating between the client - * imdi object. -*/ - -/* Pixel representation description */ - -/* This is a high level macro desciption of the pixel layout. */ -/* It can be expanded by adding a new enumeration, and then */ -/* implementing the code in imdi_gen to translate the enumeration */ -/* into the exact pixlayout structure details. */ - -typedef enum { - invalid_rep = 0, - pixint8 = 1, /* 8 Bits per value, pixel interleaved, no padding */ - planeint8 = 2, /* 8 bits per value, plane interleaved */ - pixint16 = 3, /* 16 Bits per value, pixel interleaved, no padding */ - planeint16 = 4 /* 16 bits per value, plane interleaved */ -} imdi_pixrep; - -/* IMDI Object */ -struct _imdi { - void *impl; /* Pointer to implementation information */ - - /* Do the interpolation */ - void (*interp)(struct _imdi *s, void **inp, void **outp, unsigned int npixels); - void (*done)(struct _imdi *s); /* Done with it */ - -}; typedef struct _imdi imdi; - -/* Create a new imdi */ -/* Return NULL if request is not supported */ -imdi *new_imdi( - int id, /* Number of input dimensions */ - int od, /* Number of output dimensions */ - imdi_pixrep in, /* Input pixel representation */ - int in_signed, /* Bit flag per channel, NZ if treat as signed */ - imdi_pixrep out,/* Output pixel representation */ - int out_signed, /* Bit flag per channel, NZ if treat as signed */ - int res, /* Desired table resolution */ - - /* Callbacks to lookup the mdi table values */ - double (*input_curve) (void *cntx, int ch, double in_val), - void (*md_table) (void *cntx, double *out_vals, double *in_vals), - double (*output_curve)(void *cntx, int ch, double in_val), - void *cntx /* Context to callbacks */ -); - -#endif /* IMDI_H */ diff -Nru ghostscript-9.04~dfsg/imdi/imdi_imp.h ghostscript-9.05~dfsg~20120125/imdi/imdi_imp.h --- ghostscript-9.04~dfsg/imdi/imdi_imp.h 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/imdi/imdi_imp.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,247 +0,0 @@ -#ifndef IMDI_IMP_H -#define IMDI_IMP_H - -/* Integer Multi-Dimensional Interpolation */ -/* - * Copyright 2000 - 2002 Graeme W. Gill - * All rights reserved. - * - * This material is licenced under the GNU GENERAL PUBLIC LICENCE :- - * see the Licence.txt file for licencing details. - */ - -/* Common implementation definitions */ - -#define IXDI 8 /* maximum input channels/dimensions allowed */ -#define IXDO 8 /* maximum output channels/dimensions allowed */ - -#if IXDI > IXDO /* Maximum of either DI or DO */ -# define IXDIDO IXDI -#else -# define IXDIDO IXDO -#endif - -#define ALLOW64 /* Allow declarations but not use of 64 bit types */ - /* Enabling must be done in architecture setup */ - -#undef USE64 /* Use 64 bit, even on architectures where it's */ - /* not a native size. ALLOW64 must be defined */ - -/* Private run time implementation definitions */ -typedef struct { - /* Table data */ - void *in_tables[IXDI]; /* Input dimension input lookup tables */ - void *sw_table; /* Simplex weighting lookup table */ - void *im_table; /* Interpolation Multi-dimensional lookup table */ - void *out_tables[IXDO]; /* Output dimension output lookup tables */ - int nintabs; /* Number of input tables */ - int nouttabs; /* Number of output tables */ -} imdi_imp; - -/* ------------------------------------------------------- */ -/* Macros combination counter */ -/* Declare the counter name nn, combinations out of total */ -/* Maximum combinations is DI+2 */ - -#define COMBO(nn, comb, total) \ - int nn[IXDI+2]; /* counter value */ \ - int nn##_cmb = (comb); /* number of combinations*/ \ - int nn##_tot = (total); /* out of total possible */ \ - int nn##_e /* dimension index */ - -/* Set total to new setting */ -#define CB_SETT(nn, total) \ - nn##_tot = (total) /* total possible */ - -/* Set combinations to new setting */ -#define CB_SETC(nn, comb) \ - nn##_cmb = (comb) /* number of combinations*/ - -/* Set the counter to its initial value */ -#define CB_INIT(nn) \ -{ \ - for (nn##_e = 0; nn##_e < nn##_cmb; nn##_e++) \ - nn[nn##_e] = nn##_cmb-nn##_e-1; \ - nn##_e = 0; \ -} - -/* Increment the counter value */ -#define CB_INC(nn) \ -{ \ - for (nn##_e = 0; nn##_e < nn##_cmb; nn##_e++) { \ - nn[nn##_e]++; \ - if (nn[nn##_e] < (nn##_tot-nn##_e)) { \ - int nn##_ee; /* No carry */ \ - for (nn##_ee = nn##_e-1; nn##_ee >= 0; nn##_ee--) \ - nn[nn##_ee] = nn[nn##_ee+1] + 1; \ - break; \ - } \ - } \ -} - -/* After increment, expression is TRUE if counter is done */ -#define CB_DONE(nn) \ - (nn##_e >= nn##_cmb) - -/* ------------------------------------------------------- */ -/* Macros simplex combination counter. */ -/* Based on COMBO, but skips invalid simplex combinations */ - -#define XCOMBO(nn, comb, total) \ - COMBO(nn, comb, total) - -/* Set total to new setting */ -#define XCB_SETT(nn, total) \ - CB_SETT(nn, total) - -/* Set combinations to new setting */ -#define XCB_SETC(nn, comb) \ - CB_SETC(nn, comb) - -/* Set the counter to its initial value */ -#define XCB_INIT(nn) \ -{ \ - int nn##_ii; \ - \ - for (nn##_e = 0; nn##_e < nn##_cmb; nn##_e++) \ - nn[nn##_e] = nn##_cmb-nn##_e-1; \ - for (nn##_ii = 1; nn##_ii < nn##_cmb; nn##_ii++) { \ - if ((nn[nn##_ii-1] ^ nn[nn##_ii]) & nn[nn##_ii])\ - break; /* Went from 0 to 1 */ \ - } \ - if (nn##_ii < nn##_cmb) { /* Fix invalid combination */ \ - XCB_INC(nn); \ - } \ - nn##_e = 0; \ -} - -/* Increment the counter value */ -#define XCB_INC(nn) \ -{ \ - int nn##_ii = 0; \ - \ - while (nn##_ii < nn##_cmb) { \ - for (nn##_e = 0; nn##_e < nn##_cmb; nn##_e++) { \ - nn[nn##_e]++; \ - if (nn[nn##_e] < (nn##_tot-nn##_e)) { \ - int nn##_ee; /* No carry */ \ - for (nn##_ee = nn##_e-1; nn##_ee >= 0; nn##_ee--) \ - nn[nn##_ee] = nn[nn##_ee+1] + 1; \ - break; \ - } \ - } \ - if (nn##_e >= nn##_cmb) \ - break; /* Done */ \ - \ - /* Reject invalid combinations */ \ - for (nn##_ii = 1; nn##_ii < nn##_cmb; nn##_ii++) { \ - if ((nn[nn##_ii-1] ^ nn[nn##_ii]) & nn[nn##_ii]) \ - break; /* Went from 0 to 1 */ \ - } \ - } \ -} - -/* After increment, expression is TRUE if counter is done */ -#define XCB_DONE(nn) \ - CB_DONE(nn) - -/* ------------------------------------------------------- */ -/* Macro pseudo-hilbert counter */ -/* This multi-dimensional count sequence is a distributed */ -/* Gray code sequence, with direction reversal on every */ -/* alternate power of 2 scale. */ -/* It is intended to aid cache coherence in multi-dimensional */ -/* regular sampling. It approximates the Hilbert curve sequence. */ - -#define PHILBERT(nn) \ - int nn[IXDIDO];/* counter value */ \ - int nn##di; /* Dimensionality */ \ - unsigned nn##res; /* Resolution per coordinate */ \ - unsigned nn##bits; /* Bits per coordinate */ \ - unsigned nn##ix; /* Current binary index */ \ - unsigned nn##tmask; /* Total 2^n count mask */ \ - unsigned nn##count; /* Usable count */ - -/* Init counter for dimenion di, resolution res */ -#define PH_INIT(nn, pdi, pres) \ -{ \ - int nn##e; \ - \ - nn##di = pdi; \ - nn##res = (unsigned)pres; \ - \ - /* Compute bits */ \ - for (nn##bits = 0; (1 << nn##bits) < nn##res; nn##bits++) \ - ; \ - \ - /* Compute the total count mask */ \ - nn##tmask = ((((unsigned)1) << (nn##bits * nn##di))-1); \ - \ - /* Compute usable count */ \ - nn##count = 1; \ - for (nn##e = 0; nn##e < nn##di; nn##e++) \ - nn##count *= nn##res; \ - \ - nn##ix = 0; \ - for (nn##e = 0; nn##e < nn##di; nn##e++) \ - nn[nn##e] = 0; \ -} - -/* Increment the counter value */ -#define PH_INC(nn) \ -{ \ - int nn##e; \ - do { \ - int nn##b; \ - int nn##gix; /* Gray code index */ \ - \ - nn##ix = (nn##ix + 1) & nn##tmask; \ - \ - /* Convert to gray code index */ \ - nn##gix = nn##ix ^ (nn##ix >> 1); \ - \ - for (nn##e = 0; nn##e < nn##di; nn##e++) \ - nn[nn##e] = 0; \ - \ - /* Distribute bits */ \ - for (nn##b = 0; nn##b < nn##bits; nn##b++) { \ - if (nn##b & 1) { /* In reverse order */ \ - for (nn##e = nn##di-1; nn##e >= 0; nn##e--) { \ - nn[nn##e] |= (nn##gix & 1) << nn##b; \ - nn##gix >>= 1; \ - } \ - } else { /* In normal order */ \ - for (nn##e = 0; nn##e < nn##di; nn##e++) { \ - nn[nn##e] |= (nn##gix & 1) << nn##b; \ - nn##gix >>= 1; \ - } \ - } \ - } \ - \ - /* Convert from Gray to binary coordinates */ \ - for (nn##e = 0; nn##e < nn##di; nn##e++) { \ - unsigned nn##sh, nn##tv; \ - \ - for(nn##sh = 1, nn##tv = nn[nn##e];; nn##sh <<= 1) { \ - unsigned nn##ptv = nn##tv; \ - nn##tv ^= (nn##tv >> nn##sh); \ - if (nn##ptv <= 1 || nn##sh == 16) \ - break; \ - } \ - /* Filter - increment again if outside cube range */ \ - if (nn##tv >= nn##res) \ - break; \ - nn[nn##e] = nn##tv; \ - } \ - \ - } while (nn##e < nn##di); \ - \ -} - -/* After increment, expression is TRUE if counter has looped back to start. */ -#define PH_LOOPED(nn) \ - (nn##ix == 0) \ - -/* ------------------------------------------------------- */ - -#endif /* IMDI_IMP_H */ diff -Nru ghostscript-9.04~dfsg/imdi/imdi_k.c ghostscript-9.05~dfsg~20120125/imdi/imdi_k.c --- ghostscript-9.04~dfsg/imdi/imdi_k.c 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/imdi/imdi_k.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,52298 +0,0 @@ -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 8 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 8 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 0 - Interpolation table index bits = 8 - Simplex table max resolution = 1 - Interpolation table max resolution = 255 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned char *)((p) + 0 + (off) * 1)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 4) - -/* Simplex table - get weighting/offset value */ -#define SX_WO(p, v) *((unsigned short *)((p) + (v) * 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 4) - -/* Interpolation table - get vertex values */ -#define IM_PE(p, v) *((unsigned int *)((p) + 0 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k1( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 1) { - unsigned int ova0; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - - imp = im_base + IM_O(ti >> 0); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0x0); /* Extract simplex index and comp. entry */ - } - { - unsigned int vowr; /* Vertex offset/weight value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vowr = SX_WO(swp, 0); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vowr = SX_WO(swp, 1); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WO -#undef IM_O -#undef IM_PE -#undef OT_E - -static void -imdi_k1_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0xdb, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xc0, 0xa6, 0xdc, 0xb7, - 0xff, 0xff, 0x0f, 0x00, 0x51, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x8d, 0xb7, 0xf3, 0xb7, 0xc3, 0xd1, 0xf2, 0xb7, - 0x38, 0x18, 0xf4, 0xb7, 0xc4, 0x1f, 0xf4, 0xb7, - 0xa0, 0xdc, 0x83, 0xbf, 0x08, 0x00, 0x00, 0x00, - 0x4b, 0xa5, 0xf3, 0xb7, 0x34, 0x80, 0x04, 0x08, - 0x07, 0x00, 0x00, 0x00, 0x28, 0xd9, 0x83, 0xbf, - 0x03, 0x00, 0x00, 0x00, 0xae, 0xd9, 0x83, 0xbf, - 0x00, 0xe4, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x34, 0x80, 0x04, 0x08, - 0xd0, 0x85, 0x04, 0x08, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x31, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k1_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2c, 0xf3, 0xdc, 0xb7, - 0x08, 0xad, 0xf2, 0xb7, 0xf8, 0xac, 0xf2, 0xb7, - 0x46, 0x83, 0x04, 0x08, 0x50, 0xd5, 0x83, 0xbf, - 0x60, 0x80, 0xf3, 0xb7, 0x46, 0x83, 0x04, 0x08, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0xac, 0x53, 0xdd, 0xb7, - 0xa4, 0xd5, 0x83, 0xbf, 0x00, 0x00, 0x00, 0x00, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0x07, 0x00, 0x00, 0x00, - 0x2c, 0xf3, 0xdc, 0xb7, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 8 - Input channel 0 increment = 3 - Input channel 1 bits = 8 - Input channel 1 increment = 3 - Input channel 2 bits = 8 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 8 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 12 - Interpolation table index bits = 20 - Simplex table max resolution = 16 - Interpolation table max resolution = 101 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 16) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 4) - -/* Interpolation table - get vertex values */ -#define IM_PE(p, v) *((unsigned int *)((p) + 0 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k2( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 1) { - unsigned int ova0; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - ti += IT_IT(it1, ip0[1]); - ti += IT_IT(it2, ip0[2]); - - imp = im_base + IM_O(ti >> 12); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0xfff); /* Extract simplex index and comp. entry */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_PE -#undef OT_E - -static void -imdi_k2_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0xdb, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x0f, 0x00, 0x51, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x8d, 0xb7, 0xf3, 0xb7, 0xc3, 0xd1, 0xf2, 0xb7, - 0x38, 0x18, 0xf4, 0xb7, 0xc4, 0x1f, 0xf4, 0xb7, - 0xa0, 0xdc, 0x83, 0xbf, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x28, 0xd9, 0x83, 0xbf, - 0x03, 0x00, 0x00, 0x00, 0xae, 0xd9, 0x83, 0xbf, - 0x00, 0xe4, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x34, 0x80, 0x04, 0x08, - 0xd0, 0x85, 0x04, 0x08, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x65, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x31, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x32, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k2_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0xf8, 0xac, 0xf2, 0xb7, - 0x46, 0x83, 0x04, 0x08, 0x50, 0xd5, 0x83, 0xbf, - 0x60, 0x80, 0xf3, 0xb7, 0x46, 0x83, 0x04, 0x08, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0xac, 0x53, 0xdd, 0xb7, - 0xa4, 0xd5, 0x83, 0xbf, 0x0c, 0x00, 0x00, 0x00, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0xf8, 0xac, 0xf2, 0xb7, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 8 - Input channel 0 increment = 4 - Input channel 1 bits = 8 - Input channel 1 increment = 4 - Input channel 2 bits = 8 - Input channel 2 increment = 4 - Input channel 3 bits = 8 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 8 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 32 - Interpolation table index bits = 32 - Simplex table max resolution = 255 - Interpolation table max resolution = 39 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Input table simplex index enty */ -#define IT_SX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 20) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 4) - -/* Interpolation table - get vertex values */ -#define IM_PE(p, v) *((unsigned int *)((p) + 0 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k3( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 1) { - unsigned int ova0; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti_s; /* Simplex index variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - ti_s = IT_SX(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - ti_s += IT_SX(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - ti_s += IT_SX(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - ti_s += IT_SX(it3, ip0[3]); - - swp = sw_base + SW_O(ti_s); /* Compute simplex table entry pointer */ - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 4); /* Read vertex offset value */ - vwe = SX_WE(swp, 4); /* Read vertex weighting value */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_IX -#undef IT_SX -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_PE -#undef OT_E - -static void -imdi_k3_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0xdb, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc3, 0xd1, 0xf2, 0xb7, - 0x38, 0x18, 0xf4, 0xb7, 0xc4, 0x1f, 0xf4, 0xb7, - 0xa0, 0xdc, 0x83, 0xbf, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x28, 0xd9, 0x83, 0xbf, - 0x03, 0x00, 0x00, 0x00, 0xae, 0xd9, 0x83, 0xbf, - 0x00, 0xe4, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x34, 0x80, 0x04, 0x08, - 0xd0, 0x85, 0x04, 0x08, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x27, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x31, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x33, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k3_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x46, 0x83, 0x04, 0x08, 0x50, 0xd5, 0x83, 0xbf, - 0x60, 0x80, 0xf3, 0xb7, 0x46, 0x83, 0x04, 0x08, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0xf8, 0xac, 0xf2, 0xb7, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 8 - Input channel 0 increment = 5 - Input channel 1 bits = 8 - Input channel 1 increment = 5 - Input channel 2 bits = 8 - Input channel 2 increment = 5 - Input channel 3 bits = 8 - Input channel 3 increment = 5 - Input channel 4 bits = 8 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 8 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 53 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 4) - -/* Interpolation table - get vertex values */ -#define IM_PE(p, v) *((unsigned int *)((p) + 0 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k4( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 1) { - unsigned int ova0; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo3, wo4); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo4; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_PE -#undef OT_E - -static void -imdi_k4_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0xdb, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x38, 0x18, 0xf4, 0xb7, 0xc4, 0x1f, 0xf4, 0xb7, - 0xa0, 0xdc, 0x83, 0xbf, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0xae, 0xd9, 0x83, 0xbf, - 0x00, 0xe4, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x34, 0x80, 0x04, 0x08, - 0xd0, 0x85, 0x04, 0x08, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x31, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k4_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x50, 0xd5, 0x83, 0xbf, - 0x60, 0x80, 0xf3, 0xb7, 0x46, 0x83, 0x04, 0x08, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 8 - Input channel 0 increment = 6 - Input channel 1 bits = 8 - Input channel 1 increment = 6 - Input channel 2 bits = 8 - Input channel 2 increment = 6 - Input channel 3 bits = 8 - Input channel 3 increment = 6 - Input channel 4 bits = 8 - Input channel 4 increment = 6 - Input channel 5 bits = 8 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 8 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 24 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 4) - -/* Interpolation table - get vertex values */ -#define IM_PE(p, v) *((unsigned int *)((p) + 0 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k5( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 1) { - unsigned int ova0; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo4, wo5); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo5; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_PE -#undef OT_E - -static void -imdi_k5_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x80, 0xdb, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc4, 0x1f, 0xf4, 0xb7, - 0xa0, 0xdc, 0x83, 0xbf, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0xae, 0xd9, 0x83, 0xbf, - 0x00, 0xe4, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x34, 0x80, 0x04, 0x08, - 0xd0, 0x85, 0x04, 0x08, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x31, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x35, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k5_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x60, 0x80, 0xf3, 0xb7, 0x46, 0x83, 0x04, 0x08, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 8 - Input channel 0 increment = 7 - Input channel 1 bits = 8 - Input channel 1 increment = 7 - Input channel 2 bits = 8 - Input channel 2 increment = 7 - Input channel 3 bits = 8 - Input channel 3 increment = 7 - Input channel 4 bits = 8 - Input channel 4 increment = 7 - Input channel 5 bits = 8 - Input channel 5 increment = 7 - Input channel 6 bits = 8 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 8 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 14 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 4) - -/* Interpolation table - get vertex values */ -#define IM_PE(p, v) *((unsigned int *)((p) + 0 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k6( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 1) { - unsigned int ova0; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo5, wo6); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo6; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_PE -#undef OT_E - -static void -imdi_k6_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xdc, 0x83, 0xbf, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0xe4, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x34, 0x80, 0x04, 0x08, - 0xd0, 0x85, 0x04, 0x08, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x31, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x36, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k6_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x46, 0x83, 0x04, 0x08, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 8 - Input channel 0 increment = 8 - Input channel 1 bits = 8 - Input channel 1 increment = 8 - Input channel 2 bits = 8 - Input channel 2 increment = 8 - Input channel 3 bits = 8 - Input channel 3 increment = 8 - Input channel 4 bits = 8 - Input channel 4 increment = 8 - Input channel 5 bits = 8 - Input channel 5 increment = 8 - Input channel 6 bits = 8 - Input channel 6 increment = 8 - Input channel 7 bits = 8 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 8 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 9 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 4) - -/* Interpolation table - get vertex values */ -#define IM_PE(p, v) *((unsigned int *)((p) + 0 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k7( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 1) { - unsigned int ova0; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - unsigned int wo7; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - wo7 = IT_WO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo0, wo7); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo1, wo7); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo2, wo7); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo3, wo7); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo4, wo7); - CEX(wo5, wo6); - CEX(wo5, wo7); - CEX(wo6, wo7); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo7 & 0x7fffff); /* Extract offset value */ - wo7 = (wo7 >> 23); /* Extract weighting value */ - vwe = wo6 - wo7; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo7; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_PE -#undef OT_E - -static void -imdi_k7_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x34, 0x80, 0x04, 0x08, - 0xd0, 0x85, 0x04, 0x08, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x31, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x37, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k7_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 8 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 8 - Output channel 0 increment = 3 - Output channel 1 bits = 8 - Output channel 1 increment = 3 - Output channel 2 bits = 8 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 0 - Interpolation table index bits = 8 - Simplex table max resolution = 1 - Interpolation table max resolution = 255 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned char *)((p) + 0 + (off) * 1)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 4) - -/* Simplex table - get weighting/offset value */ -#define SX_WO(p, v) *((unsigned short *)((p) + (v) * 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 4 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k8( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - - imp = im_base + IM_O(ti >> 0); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0x0); /* Extract simplex index and comp. entry */ - } - { - unsigned int vowr; /* Vertex offset/weight value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vowr = SX_WO(swp, 0); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vowr = SX_WO(swp, 1); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WO -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k8_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0xd0, 0x85, 0x04, 0x08, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x33, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x38, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k8_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 8 - Input channel 0 increment = 3 - Input channel 1 bits = 8 - Input channel 1 increment = 3 - Input channel 2 bits = 8 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 8 - Output channel 0 increment = 3 - Output channel 1 bits = 8 - Output channel 1 increment = 3 - Output channel 2 bits = 8 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 12 - Interpolation table index bits = 20 - Simplex table max resolution = 16 - Interpolation table max resolution = 101 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 16) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 4 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k9( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - ti += IT_IT(it1, ip0[1]); - ti += IT_IT(it2, ip0[2]); - - imp = im_base + IM_O(ti >> 12); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0xfff); /* Extract simplex index and comp. entry */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k9_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0xd0, 0x85, 0x04, 0x08, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x65, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x33, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x39, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k9_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 8 - Input channel 0 increment = 4 - Input channel 1 bits = 8 - Input channel 1 increment = 4 - Input channel 2 bits = 8 - Input channel 2 increment = 4 - Input channel 3 bits = 8 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 8 - Output channel 0 increment = 3 - Output channel 1 bits = 8 - Output channel 1 increment = 3 - Output channel 2 bits = 8 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 32 - Interpolation table index bits = 32 - Simplex table max resolution = 255 - Interpolation table max resolution = 39 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Input table simplex index enty */ -#define IT_SX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 20) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 4 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k10( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti_s; /* Simplex index variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - ti_s = IT_SX(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - ti_s += IT_SX(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - ti_s += IT_SX(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - ti_s += IT_SX(it3, ip0[3]); - - swp = sw_base + SW_O(ti_s); /* Compute simplex table entry pointer */ - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 4); /* Read vertex offset value */ - vwe = SX_WE(swp, 4); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_IX -#undef IT_SX -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k10_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0xd0, 0x85, 0x04, 0x08, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x27, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x33, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k10_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 8 - Input channel 0 increment = 5 - Input channel 1 bits = 8 - Input channel 1 increment = 5 - Input channel 2 bits = 8 - Input channel 2 increment = 5 - Input channel 3 bits = 8 - Input channel 3 increment = 5 - Input channel 4 bits = 8 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 8 - Output channel 0 increment = 3 - Output channel 1 bits = 8 - Output channel 1 increment = 3 - Output channel 2 bits = 8 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 53 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 4 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k11( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo3, wo4); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k11_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0xd0, 0x85, 0x04, 0x08, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x33, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k11_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 8 - Input channel 0 increment = 6 - Input channel 1 bits = 8 - Input channel 1 increment = 6 - Input channel 2 bits = 8 - Input channel 2 increment = 6 - Input channel 3 bits = 8 - Input channel 3 increment = 6 - Input channel 4 bits = 8 - Input channel 4 increment = 6 - Input channel 5 bits = 8 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 8 - Output channel 0 increment = 3 - Output channel 1 bits = 8 - Output channel 1 increment = 3 - Output channel 2 bits = 8 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 24 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 4 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k12( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo4, wo5); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k12_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0xd0, 0x85, 0x04, 0x08, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x33, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k12_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 8 - Input channel 0 increment = 7 - Input channel 1 bits = 8 - Input channel 1 increment = 7 - Input channel 2 bits = 8 - Input channel 2 increment = 7 - Input channel 3 bits = 8 - Input channel 3 increment = 7 - Input channel 4 bits = 8 - Input channel 4 increment = 7 - Input channel 5 bits = 8 - Input channel 5 increment = 7 - Input channel 6 bits = 8 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 8 - Output channel 0 increment = 3 - Output channel 1 bits = 8 - Output channel 1 increment = 3 - Output channel 2 bits = 8 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 14 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 4 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k13( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo5, wo6); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k13_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0xd0, 0x85, 0x04, 0x08, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x33, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x33, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k13_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 8 - Input channel 0 increment = 8 - Input channel 1 bits = 8 - Input channel 1 increment = 8 - Input channel 2 bits = 8 - Input channel 2 increment = 8 - Input channel 3 bits = 8 - Input channel 3 increment = 8 - Input channel 4 bits = 8 - Input channel 4 increment = 8 - Input channel 5 bits = 8 - Input channel 5 increment = 8 - Input channel 6 bits = 8 - Input channel 6 increment = 8 - Input channel 7 bits = 8 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 8 - Output channel 0 increment = 3 - Output channel 1 bits = 8 - Output channel 1 increment = 3 - Output channel 2 bits = 8 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 9 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 4 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k14( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - unsigned int wo7; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - wo7 = IT_WO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo0, wo7); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo1, wo7); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo2, wo7); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo3, wo7); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo4, wo7); - CEX(wo5, wo6); - CEX(wo5, wo7); - CEX(wo6, wo7); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo7 & 0x7fffff); /* Extract offset value */ - wo7 = (wo7 >> 23); /* Extract weighting value */ - vwe = wo6 - wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k14_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0xd0, 0x85, 0x04, 0x08, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x33, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x34, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k14_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 8 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 8 - Output channel 0 increment = 4 - Output channel 1 bits = 8 - Output channel 1 increment = 4 - Output channel 2 bits = 8 - Output channel 2 increment = 4 - Output channel 3 bits = 8 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 0 - Interpolation table index bits = 8 - Simplex table max resolution = 1 - Interpolation table max resolution = 255 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned char *)((p) + 0 + (off) * 1)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 4) - -/* Simplex table - get weighting/offset value */ -#define SX_WO(p, v) *((unsigned short *)((p) + (v) * 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k15( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - - imp = im_base + IM_O(ti >> 0); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0x0); /* Extract simplex index and comp. entry */ - } - { - unsigned int vowr; /* Vertex offset/weight value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vowr = SX_WO(swp, 0); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vowr = SX_WO(swp, 1); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WO -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k15_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x34, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x35, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k15_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 8 - Input channel 0 increment = 3 - Input channel 1 bits = 8 - Input channel 1 increment = 3 - Input channel 2 bits = 8 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 8 - Output channel 0 increment = 4 - Output channel 1 bits = 8 - Output channel 1 increment = 4 - Output channel 2 bits = 8 - Output channel 2 increment = 4 - Output channel 3 bits = 8 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 12 - Interpolation table index bits = 20 - Simplex table max resolution = 16 - Interpolation table max resolution = 101 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 16) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k16( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - ti += IT_IT(it1, ip0[1]); - ti += IT_IT(it2, ip0[2]); - - imp = im_base + IM_O(ti >> 12); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0xfff); /* Extract simplex index and comp. entry */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k16_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x65, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x34, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x36, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k16_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 8 - Input channel 0 increment = 4 - Input channel 1 bits = 8 - Input channel 1 increment = 4 - Input channel 2 bits = 8 - Input channel 2 increment = 4 - Input channel 3 bits = 8 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 8 - Output channel 0 increment = 4 - Output channel 1 bits = 8 - Output channel 1 increment = 4 - Output channel 2 bits = 8 - Output channel 2 increment = 4 - Output channel 3 bits = 8 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 32 - Interpolation table index bits = 32 - Simplex table max resolution = 255 - Interpolation table max resolution = 39 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Input table simplex index enty */ -#define IT_SX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 20) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k17( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti_s; /* Simplex index variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - ti_s = IT_SX(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - ti_s += IT_SX(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - ti_s += IT_SX(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - ti_s += IT_SX(it3, ip0[3]); - - swp = sw_base + SW_O(ti_s); /* Compute simplex table entry pointer */ - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 4); /* Read vertex offset value */ - vwe = SX_WE(swp, 4); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_IX -#undef IT_SX -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k17_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x27, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x34, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x37, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k17_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 8 - Input channel 0 increment = 5 - Input channel 1 bits = 8 - Input channel 1 increment = 5 - Input channel 2 bits = 8 - Input channel 2 increment = 5 - Input channel 3 bits = 8 - Input channel 3 increment = 5 - Input channel 4 bits = 8 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 8 - Output channel 0 increment = 4 - Output channel 1 bits = 8 - Output channel 1 increment = 4 - Output channel 2 bits = 8 - Output channel 2 increment = 4 - Output channel 3 bits = 8 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 53 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k18( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo3, wo4); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k18_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x34, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x38, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k18_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 8 - Input channel 0 increment = 6 - Input channel 1 bits = 8 - Input channel 1 increment = 6 - Input channel 2 bits = 8 - Input channel 2 increment = 6 - Input channel 3 bits = 8 - Input channel 3 increment = 6 - Input channel 4 bits = 8 - Input channel 4 increment = 6 - Input channel 5 bits = 8 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 8 - Output channel 0 increment = 4 - Output channel 1 bits = 8 - Output channel 1 increment = 4 - Output channel 2 bits = 8 - Output channel 2 increment = 4 - Output channel 3 bits = 8 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 24 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k19( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo4, wo5); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k19_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x34, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x39, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k19_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 8 - Input channel 0 increment = 7 - Input channel 1 bits = 8 - Input channel 1 increment = 7 - Input channel 2 bits = 8 - Input channel 2 increment = 7 - Input channel 3 bits = 8 - Input channel 3 increment = 7 - Input channel 4 bits = 8 - Input channel 4 increment = 7 - Input channel 5 bits = 8 - Input channel 5 increment = 7 - Input channel 6 bits = 8 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 8 - Output channel 0 increment = 4 - Output channel 1 bits = 8 - Output channel 1 increment = 4 - Output channel 2 bits = 8 - Output channel 2 increment = 4 - Output channel 3 bits = 8 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 14 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k20( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo5, wo6); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k20_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x34, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x32, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k20_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 8 - Input channel 0 increment = 8 - Input channel 1 bits = 8 - Input channel 1 increment = 8 - Input channel 2 bits = 8 - Input channel 2 increment = 8 - Input channel 3 bits = 8 - Input channel 3 increment = 8 - Input channel 4 bits = 8 - Input channel 4 increment = 8 - Input channel 5 bits = 8 - Input channel 5 increment = 8 - Input channel 6 bits = 8 - Input channel 6 increment = 8 - Input channel 7 bits = 8 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 8 - Output channel 0 increment = 4 - Output channel 1 bits = 8 - Output channel 1 increment = 4 - Output channel 2 bits = 8 - Output channel 2 increment = 4 - Output channel 3 bits = 8 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 9 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k21( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - unsigned int wo7; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - wo7 = IT_WO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo0, wo7); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo1, wo7); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo2, wo7); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo3, wo7); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo4, wo7); - CEX(wo5, wo6); - CEX(wo5, wo7); - CEX(wo6, wo7); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo7 & 0x7fffff); /* Extract offset value */ - wo7 = (wo7 >> 23); /* Extract weighting value */ - vwe = wo6 - wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k21_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x72, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x34, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x32, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k21_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 8 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 8 - Output channel 0 increment = 5 - Output channel 1 bits = 8 - Output channel 1 increment = 5 - Output channel 2 bits = 8 - Output channel 2 increment = 5 - Output channel 3 bits = 8 - Output channel 3 increment = 5 - Output channel 4 bits = 8 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 0 - Interpolation table index bits = 8 - Simplex table max resolution = 1 - Interpolation table max resolution = 255 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned char *)((p) + 0 + (off) * 1)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 4) - -/* Simplex table - get weighting/offset value */ -#define SX_WO(p, v) *((unsigned short *)((p) + (v) * 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 8 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k22( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - - imp = im_base + IM_O(ti >> 0); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0x0); /* Extract simplex index and comp. entry */ - } - { - unsigned int vowr; /* Vertex offset/weight value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vowr = SX_WO(swp, 0); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vowr = SX_WO(swp, 1); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WO -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k22_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x35, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x32, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k22_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 8 - Input channel 0 increment = 3 - Input channel 1 bits = 8 - Input channel 1 increment = 3 - Input channel 2 bits = 8 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 8 - Output channel 0 increment = 5 - Output channel 1 bits = 8 - Output channel 1 increment = 5 - Output channel 2 bits = 8 - Output channel 2 increment = 5 - Output channel 3 bits = 8 - Output channel 3 increment = 5 - Output channel 4 bits = 8 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 12 - Interpolation table index bits = 20 - Simplex table max resolution = 16 - Interpolation table max resolution = 101 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 16) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 8 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k23( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - ti += IT_IT(it1, ip0[1]); - ti += IT_IT(it2, ip0[2]); - - imp = im_base + IM_O(ti >> 12); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0xfff); /* Extract simplex index and comp. entry */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k23_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x65, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x35, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x32, 0x33, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k23_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 8 - Input channel 0 increment = 4 - Input channel 1 bits = 8 - Input channel 1 increment = 4 - Input channel 2 bits = 8 - Input channel 2 increment = 4 - Input channel 3 bits = 8 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 8 - Output channel 0 increment = 5 - Output channel 1 bits = 8 - Output channel 1 increment = 5 - Output channel 2 bits = 8 - Output channel 2 increment = 5 - Output channel 3 bits = 8 - Output channel 3 increment = 5 - Output channel 4 bits = 8 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 32 - Interpolation table index bits = 32 - Simplex table max resolution = 255 - Interpolation table max resolution = 27 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Input table simplex index enty */ -#define IT_SX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 20) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 8 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k24( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti_s; /* Simplex index variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - ti_s = IT_SX(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - ti_s += IT_SX(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - ti_s += IT_SX(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - ti_s += IT_SX(it3, ip0[3]); - - swp = sw_base + SW_O(ti_s); /* Compute simplex table entry pointer */ - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 4); /* Read vertex offset value */ - vwe = SX_WE(swp, 4); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_IX -#undef IT_SX -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k24_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x1b, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x35, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x32, 0x34, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k24_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 8 - Input channel 0 increment = 5 - Input channel 1 bits = 8 - Input channel 1 increment = 5 - Input channel 2 bits = 8 - Input channel 2 increment = 5 - Input channel 3 bits = 8 - Input channel 3 increment = 5 - Input channel 4 bits = 8 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 8 - Output channel 0 increment = 5 - Output channel 1 bits = 8 - Output channel 1 increment = 5 - Output channel 2 bits = 8 - Output channel 2 increment = 5 - Output channel 3 bits = 8 - Output channel 3 increment = 5 - Output channel 4 bits = 8 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 40 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 8 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k25( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo3, wo4); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k25_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x35, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x32, 0x35, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k25_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 8 - Input channel 0 increment = 6 - Input channel 1 bits = 8 - Input channel 1 increment = 6 - Input channel 2 bits = 8 - Input channel 2 increment = 6 - Input channel 3 bits = 8 - Input channel 3 increment = 6 - Input channel 4 bits = 8 - Input channel 4 increment = 6 - Input channel 5 bits = 8 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 8 - Output channel 0 increment = 5 - Output channel 1 bits = 8 - Output channel 1 increment = 5 - Output channel 2 bits = 8 - Output channel 2 increment = 5 - Output channel 3 bits = 8 - Output channel 3 increment = 5 - Output channel 4 bits = 8 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 19 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 8 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k26( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo4, wo5); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k26_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x35, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x32, 0x36, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k26_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 8 - Input channel 0 increment = 7 - Input channel 1 bits = 8 - Input channel 1 increment = 7 - Input channel 2 bits = 8 - Input channel 2 increment = 7 - Input channel 3 bits = 8 - Input channel 3 increment = 7 - Input channel 4 bits = 8 - Input channel 4 increment = 7 - Input channel 5 bits = 8 - Input channel 5 increment = 7 - Input channel 6 bits = 8 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 8 - Output channel 0 increment = 5 - Output channel 1 bits = 8 - Output channel 1 increment = 5 - Output channel 2 bits = 8 - Output channel 2 increment = 5 - Output channel 3 bits = 8 - Output channel 3 increment = 5 - Output channel 4 bits = 8 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 11 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 8 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k27( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo5, wo6); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k27_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x35, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x32, 0x37, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k27_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 8 - Input channel 0 increment = 8 - Input channel 1 bits = 8 - Input channel 1 increment = 8 - Input channel 2 bits = 8 - Input channel 2 increment = 8 - Input channel 3 bits = 8 - Input channel 3 increment = 8 - Input channel 4 bits = 8 - Input channel 4 increment = 8 - Input channel 5 bits = 8 - Input channel 5 increment = 8 - Input channel 6 bits = 8 - Input channel 6 increment = 8 - Input channel 7 bits = 8 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 8 - Output channel 0 increment = 5 - Output channel 1 bits = 8 - Output channel 1 increment = 5 - Output channel 2 bits = 8 - Output channel 2 increment = 5 - Output channel 3 bits = 8 - Output channel 3 increment = 5 - Output channel 4 bits = 8 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 8 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 8 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k28( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - unsigned int wo7; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - wo7 = IT_WO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo0, wo7); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo1, wo7); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo2, wo7); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo3, wo7); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo4, wo7); - CEX(wo5, wo6); - CEX(wo5, wo7); - CEX(wo6, wo7); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo7 & 0x7fffff); /* Extract offset value */ - wo7 = (wo7 >> 23); /* Extract weighting value */ - vwe = wo6 - wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k28_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x74, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x35, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x32, 0x38, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k28_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 8 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 8 - Output channel 0 increment = 6 - Output channel 1 bits = 8 - Output channel 1 increment = 6 - Output channel 2 bits = 8 - Output channel 2 increment = 6 - Output channel 3 bits = 8 - Output channel 3 increment = 6 - Output channel 4 bits = 8 - Output channel 4 increment = 6 - Output channel 5 bits = 8 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 0 - Interpolation table index bits = 8 - Simplex table max resolution = 1 - Interpolation table max resolution = 255 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned char *)((p) + 0 + (off) * 1)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 4) - -/* Simplex table - get weighting/offset value */ -#define SX_WO(p, v) *((unsigned short *)((p) + (v) * 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k29( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - - imp = im_base + IM_O(ti >> 0); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0x0); /* Extract simplex index and comp. entry */ - } - { - unsigned int vowr; /* Vertex offset/weight value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vowr = SX_WO(swp, 0); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vowr = SX_WO(swp, 1); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WO -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k29_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x36, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x32, 0x39, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k29_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 8 - Input channel 0 increment = 3 - Input channel 1 bits = 8 - Input channel 1 increment = 3 - Input channel 2 bits = 8 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 8 - Output channel 0 increment = 6 - Output channel 1 bits = 8 - Output channel 1 increment = 6 - Output channel 2 bits = 8 - Output channel 2 increment = 6 - Output channel 3 bits = 8 - Output channel 3 increment = 6 - Output channel 4 bits = 8 - Output channel 4 increment = 6 - Output channel 5 bits = 8 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 12 - Interpolation table index bits = 20 - Simplex table max resolution = 16 - Interpolation table max resolution = 101 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 16) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k30( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - ti += IT_IT(it1, ip0[1]); - ti += IT_IT(it2, ip0[2]); - - imp = im_base + IM_O(ti >> 12); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0xfff); /* Extract simplex index and comp. entry */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k30_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x65, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x36, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x33, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k30_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 8 - Input channel 0 increment = 4 - Input channel 1 bits = 8 - Input channel 1 increment = 4 - Input channel 2 bits = 8 - Input channel 2 increment = 4 - Input channel 3 bits = 8 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 8 - Output channel 0 increment = 6 - Output channel 1 bits = 8 - Output channel 1 increment = 6 - Output channel 2 bits = 8 - Output channel 2 increment = 6 - Output channel 3 bits = 8 - Output channel 3 increment = 6 - Output channel 4 bits = 8 - Output channel 4 increment = 6 - Output channel 5 bits = 8 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 32 - Interpolation table index bits = 32 - Simplex table max resolution = 255 - Interpolation table max resolution = 27 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Input table simplex index enty */ -#define IT_SX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 20) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k31( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti_s; /* Simplex index variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - ti_s = IT_SX(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - ti_s += IT_SX(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - ti_s += IT_SX(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - ti_s += IT_SX(it3, ip0[3]); - - swp = sw_base + SW_O(ti_s); /* Compute simplex table entry pointer */ - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 4); /* Read vertex offset value */ - vwe = SX_WE(swp, 4); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_IX -#undef IT_SX -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k31_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x1b, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x36, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x33, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k31_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 8 - Input channel 0 increment = 5 - Input channel 1 bits = 8 - Input channel 1 increment = 5 - Input channel 2 bits = 8 - Input channel 2 increment = 5 - Input channel 3 bits = 8 - Input channel 3 increment = 5 - Input channel 4 bits = 8 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 8 - Output channel 0 increment = 6 - Output channel 1 bits = 8 - Output channel 1 increment = 6 - Output channel 2 bits = 8 - Output channel 2 increment = 6 - Output channel 3 bits = 8 - Output channel 3 increment = 6 - Output channel 4 bits = 8 - Output channel 4 increment = 6 - Output channel 5 bits = 8 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 40 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k32( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo3, wo4); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k32_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x36, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x33, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k32_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 8 - Input channel 0 increment = 6 - Input channel 1 bits = 8 - Input channel 1 increment = 6 - Input channel 2 bits = 8 - Input channel 2 increment = 6 - Input channel 3 bits = 8 - Input channel 3 increment = 6 - Input channel 4 bits = 8 - Input channel 4 increment = 6 - Input channel 5 bits = 8 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 8 - Output channel 0 increment = 6 - Output channel 1 bits = 8 - Output channel 1 increment = 6 - Output channel 2 bits = 8 - Output channel 2 increment = 6 - Output channel 3 bits = 8 - Output channel 3 increment = 6 - Output channel 4 bits = 8 - Output channel 4 increment = 6 - Output channel 5 bits = 8 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 19 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k33( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo4, wo5); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k33_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x36, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x33, 0x33, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k33_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 8 - Input channel 0 increment = 7 - Input channel 1 bits = 8 - Input channel 1 increment = 7 - Input channel 2 bits = 8 - Input channel 2 increment = 7 - Input channel 3 bits = 8 - Input channel 3 increment = 7 - Input channel 4 bits = 8 - Input channel 4 increment = 7 - Input channel 5 bits = 8 - Input channel 5 increment = 7 - Input channel 6 bits = 8 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 8 - Output channel 0 increment = 6 - Output channel 1 bits = 8 - Output channel 1 increment = 6 - Output channel 2 bits = 8 - Output channel 2 increment = 6 - Output channel 3 bits = 8 - Output channel 3 increment = 6 - Output channel 4 bits = 8 - Output channel 4 increment = 6 - Output channel 5 bits = 8 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 11 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k34( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo5, wo6); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k34_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x36, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x33, 0x34, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k34_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 8 - Input channel 0 increment = 8 - Input channel 1 bits = 8 - Input channel 1 increment = 8 - Input channel 2 bits = 8 - Input channel 2 increment = 8 - Input channel 3 bits = 8 - Input channel 3 increment = 8 - Input channel 4 bits = 8 - Input channel 4 increment = 8 - Input channel 5 bits = 8 - Input channel 5 increment = 8 - Input channel 6 bits = 8 - Input channel 6 increment = 8 - Input channel 7 bits = 8 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 8 - Output channel 0 increment = 6 - Output channel 1 bits = 8 - Output channel 1 increment = 6 - Output channel 2 bits = 8 - Output channel 2 increment = 6 - Output channel 3 bits = 8 - Output channel 3 increment = 6 - Output channel 4 bits = 8 - Output channel 4 increment = 6 - Output channel 5 bits = 8 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 8 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k35( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - unsigned int wo7; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - wo7 = IT_WO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo0, wo7); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo1, wo7); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo2, wo7); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo3, wo7); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo4, wo7); - CEX(wo5, wo6); - CEX(wo5, wo7); - CEX(wo6, wo7); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo7 & 0x7fffff); /* Extract offset value */ - wo7 = (wo7 >> 23); /* Extract weighting value */ - vwe = wo6 - wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k35_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x36, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x33, 0x35, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k35_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 8 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 8 - Output channel 0 increment = 7 - Output channel 1 bits = 8 - Output channel 1 increment = 7 - Output channel 2 bits = 8 - Output channel 2 increment = 7 - Output channel 3 bits = 8 - Output channel 3 increment = 7 - Output channel 4 bits = 8 - Output channel 4 increment = 7 - Output channel 5 bits = 8 - Output channel 5 increment = 7 - Output channel 6 bits = 8 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 0 - Interpolation table index bits = 8 - Simplex table max resolution = 1 - Interpolation table max resolution = 255 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned char *)((p) + 0 + (off) * 1)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 4) - -/* Simplex table - get weighting/offset value */ -#define SX_WO(p, v) *((unsigned short *)((p) + (v) * 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 12 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k36( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - - imp = im_base + IM_O(ti >> 0); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0x0); /* Extract simplex index and comp. entry */ - } - { - unsigned int vowr; /* Vertex offset/weight value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vowr = SX_WO(swp, 0); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vowr = SX_WO(swp, 1); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WO -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k36_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x37, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x33, 0x36, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k36_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 8 - Input channel 0 increment = 3 - Input channel 1 bits = 8 - Input channel 1 increment = 3 - Input channel 2 bits = 8 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 8 - Output channel 0 increment = 7 - Output channel 1 bits = 8 - Output channel 1 increment = 7 - Output channel 2 bits = 8 - Output channel 2 increment = 7 - Output channel 3 bits = 8 - Output channel 3 increment = 7 - Output channel 4 bits = 8 - Output channel 4 increment = 7 - Output channel 5 bits = 8 - Output channel 5 increment = 7 - Output channel 6 bits = 8 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 12 - Interpolation table index bits = 20 - Simplex table max resolution = 16 - Interpolation table max resolution = 101 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 16) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 12 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k37( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - ti += IT_IT(it1, ip0[1]); - ti += IT_IT(it2, ip0[2]); - - imp = im_base + IM_O(ti >> 12); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0xfff); /* Extract simplex index and comp. entry */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k37_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x65, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x37, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x33, 0x37, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k37_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 8 - Input channel 0 increment = 4 - Input channel 1 bits = 8 - Input channel 1 increment = 4 - Input channel 2 bits = 8 - Input channel 2 increment = 4 - Input channel 3 bits = 8 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 8 - Output channel 0 increment = 7 - Output channel 1 bits = 8 - Output channel 1 increment = 7 - Output channel 2 bits = 8 - Output channel 2 increment = 7 - Output channel 3 bits = 8 - Output channel 3 increment = 7 - Output channel 4 bits = 8 - Output channel 4 increment = 7 - Output channel 5 bits = 8 - Output channel 5 increment = 7 - Output channel 6 bits = 8 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 32 - Interpolation table index bits = 32 - Simplex table max resolution = 255 - Interpolation table max resolution = 31 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Input table simplex index enty */ -#define IT_SX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 20) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 12 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k38( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti_s; /* Simplex index variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - ti_s = IT_SX(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - ti_s += IT_SX(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - ti_s += IT_SX(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - ti_s += IT_SX(it3, ip0[3]); - - swp = sw_base + SW_O(ti_s); /* Compute simplex table entry pointer */ - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 4); /* Read vertex offset value */ - vwe = SX_WE(swp, 4); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_IX -#undef IT_SX -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k38_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x1f, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x37, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x33, 0x38, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k38_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 8 - Input channel 0 increment = 5 - Input channel 1 bits = 8 - Input channel 1 increment = 5 - Input channel 2 bits = 8 - Input channel 2 increment = 5 - Input channel 3 bits = 8 - Input channel 3 increment = 5 - Input channel 4 bits = 8 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 8 - Output channel 0 increment = 7 - Output channel 1 bits = 8 - Output channel 1 increment = 7 - Output channel 2 bits = 8 - Output channel 2 increment = 7 - Output channel 3 bits = 8 - Output channel 3 increment = 7 - Output channel 4 bits = 8 - Output channel 4 increment = 7 - Output channel 5 bits = 8 - Output channel 5 increment = 7 - Output channel 6 bits = 8 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 45 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 12 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k39( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo3, wo4); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k39_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x37, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x33, 0x39, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k39_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 8 - Input channel 0 increment = 6 - Input channel 1 bits = 8 - Input channel 1 increment = 6 - Input channel 2 bits = 8 - Input channel 2 increment = 6 - Input channel 3 bits = 8 - Input channel 3 increment = 6 - Input channel 4 bits = 8 - Input channel 4 increment = 6 - Input channel 5 bits = 8 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 8 - Output channel 0 increment = 7 - Output channel 1 bits = 8 - Output channel 1 increment = 7 - Output channel 2 bits = 8 - Output channel 2 increment = 7 - Output channel 3 bits = 8 - Output channel 3 increment = 7 - Output channel 4 bits = 8 - Output channel 4 increment = 7 - Output channel 5 bits = 8 - Output channel 5 increment = 7 - Output channel 6 bits = 8 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 20 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 12 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k40( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo4, wo5); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k40_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x37, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x34, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k40_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 8 - Input channel 0 increment = 7 - Input channel 1 bits = 8 - Input channel 1 increment = 7 - Input channel 2 bits = 8 - Input channel 2 increment = 7 - Input channel 3 bits = 8 - Input channel 3 increment = 7 - Input channel 4 bits = 8 - Input channel 4 increment = 7 - Input channel 5 bits = 8 - Input channel 5 increment = 7 - Input channel 6 bits = 8 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 8 - Output channel 0 increment = 7 - Output channel 1 bits = 8 - Output channel 1 increment = 7 - Output channel 2 bits = 8 - Output channel 2 increment = 7 - Output channel 3 bits = 8 - Output channel 3 increment = 7 - Output channel 4 bits = 8 - Output channel 4 increment = 7 - Output channel 5 bits = 8 - Output channel 5 increment = 7 - Output channel 6 bits = 8 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 12 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 12 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k41( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo5, wo6); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k41_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x37, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x34, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k41_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 8 - Input channel 0 increment = 8 - Input channel 1 bits = 8 - Input channel 1 increment = 8 - Input channel 2 bits = 8 - Input channel 2 increment = 8 - Input channel 3 bits = 8 - Input channel 3 increment = 8 - Input channel 4 bits = 8 - Input channel 4 increment = 8 - Input channel 5 bits = 8 - Input channel 5 increment = 8 - Input channel 6 bits = 8 - Input channel 6 increment = 8 - Input channel 7 bits = 8 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 8 - Output channel 0 increment = 7 - Output channel 1 bits = 8 - Output channel 1 increment = 7 - Output channel 2 bits = 8 - Output channel 2 increment = 7 - Output channel 3 bits = 8 - Output channel 3 increment = 7 - Output channel 4 bits = 8 - Output channel 4 increment = 7 - Output channel 5 bits = 8 - Output channel 5 increment = 7 - Output channel 6 bits = 8 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 8 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 12 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k42( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - unsigned int wo7; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - wo7 = IT_WO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo0, wo7); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo1, wo7); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo2, wo7); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo3, wo7); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo4, wo7); - CEX(wo5, wo6); - CEX(wo5, wo7); - CEX(wo6, wo7); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo7 & 0x7fffff); /* Extract offset value */ - wo7 = (wo7 >> 23); /* Extract weighting value */ - vwe = wo6 - wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k42_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x37, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x34, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k42_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 8 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 8 - Output channel 0 increment = 8 - Output channel 1 bits = 8 - Output channel 1 increment = 8 - Output channel 2 bits = 8 - Output channel 2 increment = 8 - Output channel 3 bits = 8 - Output channel 3 increment = 8 - Output channel 4 bits = 8 - Output channel 4 increment = 8 - Output channel 5 bits = 8 - Output channel 5 increment = 8 - Output channel 6 bits = 8 - Output channel 6 increment = 8 - Output channel 7 bits = 8 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 0 - Interpolation table index bits = 8 - Simplex table max resolution = 1 - Interpolation table max resolution = 255 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned char *)((p) + 0 + (off) * 1)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 4) - -/* Simplex table - get weighting/offset value */ -#define SX_WO(p, v) *((unsigned short *)((p) + (v) * 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k43( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - - imp = im_base + IM_O(ti >> 0); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0x0); /* Extract simplex index and comp. entry */ - } - { - unsigned int vowr; /* Vertex offset/weight value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vowr = SX_WO(swp, 0); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vowr = SX_WO(swp, 1); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova3 >> 24) & 0xff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WO -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k43_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x38, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x34, 0x33, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k43_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 8 - Input channel 0 increment = 3 - Input channel 1 bits = 8 - Input channel 1 increment = 3 - Input channel 2 bits = 8 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 8 - Output channel 0 increment = 8 - Output channel 1 bits = 8 - Output channel 1 increment = 8 - Output channel 2 bits = 8 - Output channel 2 increment = 8 - Output channel 3 bits = 8 - Output channel 3 increment = 8 - Output channel 4 bits = 8 - Output channel 4 increment = 8 - Output channel 5 bits = 8 - Output channel 5 increment = 8 - Output channel 6 bits = 8 - Output channel 6 increment = 8 - Output channel 7 bits = 8 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 12 - Interpolation table index bits = 20 - Simplex table max resolution = 16 - Interpolation table max resolution = 101 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 16) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k44( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - ti += IT_IT(it1, ip0[1]); - ti += IT_IT(it2, ip0[2]); - - imp = im_base + IM_O(ti >> 12); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0xfff); /* Extract simplex index and comp. entry */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova3 >> 24) & 0xff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k44_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x65, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x38, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x34, 0x34, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k44_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 8 - Input channel 0 increment = 4 - Input channel 1 bits = 8 - Input channel 1 increment = 4 - Input channel 2 bits = 8 - Input channel 2 increment = 4 - Input channel 3 bits = 8 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 8 - Output channel 0 increment = 8 - Output channel 1 bits = 8 - Output channel 1 increment = 8 - Output channel 2 bits = 8 - Output channel 2 increment = 8 - Output channel 3 bits = 8 - Output channel 3 increment = 8 - Output channel 4 bits = 8 - Output channel 4 increment = 8 - Output channel 5 bits = 8 - Output channel 5 increment = 8 - Output channel 6 bits = 8 - Output channel 6 increment = 8 - Output channel 7 bits = 8 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 32 - Interpolation table index bits = 32 - Simplex table max resolution = 255 - Interpolation table max resolution = 31 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Input table simplex index enty */ -#define IT_SX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 20) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k45( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti_s; /* Simplex index variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - ti_s = IT_SX(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - ti_s += IT_SX(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - ti_s += IT_SX(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - ti_s += IT_SX(it3, ip0[3]); - - swp = sw_base + SW_O(ti_s); /* Compute simplex table entry pointer */ - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 4); /* Read vertex offset value */ - vwe = SX_WE(swp, 4); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova3 >> 24) & 0xff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_IX -#undef IT_SX -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k45_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x1f, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x38, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x34, 0x35, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k45_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 8 - Input channel 0 increment = 5 - Input channel 1 bits = 8 - Input channel 1 increment = 5 - Input channel 2 bits = 8 - Input channel 2 increment = 5 - Input channel 3 bits = 8 - Input channel 3 increment = 5 - Input channel 4 bits = 8 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 8 - Output channel 0 increment = 8 - Output channel 1 bits = 8 - Output channel 1 increment = 8 - Output channel 2 bits = 8 - Output channel 2 increment = 8 - Output channel 3 bits = 8 - Output channel 3 increment = 8 - Output channel 4 bits = 8 - Output channel 4 increment = 8 - Output channel 5 bits = 8 - Output channel 5 increment = 8 - Output channel 6 bits = 8 - Output channel 6 increment = 8 - Output channel 7 bits = 8 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 45 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k46( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo3, wo4); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova3 >> 24) & 0xff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k46_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x38, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x34, 0x36, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k46_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 8 - Input channel 0 increment = 6 - Input channel 1 bits = 8 - Input channel 1 increment = 6 - Input channel 2 bits = 8 - Input channel 2 increment = 6 - Input channel 3 bits = 8 - Input channel 3 increment = 6 - Input channel 4 bits = 8 - Input channel 4 increment = 6 - Input channel 5 bits = 8 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 8 - Output channel 0 increment = 8 - Output channel 1 bits = 8 - Output channel 1 increment = 8 - Output channel 2 bits = 8 - Output channel 2 increment = 8 - Output channel 3 bits = 8 - Output channel 3 increment = 8 - Output channel 4 bits = 8 - Output channel 4 increment = 8 - Output channel 5 bits = 8 - Output channel 5 increment = 8 - Output channel 6 bits = 8 - Output channel 6 increment = 8 - Output channel 7 bits = 8 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 20 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k47( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo4, wo5); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova3 >> 24) & 0xff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k47_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x38, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x34, 0x37, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k47_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 8 - Input channel 0 increment = 7 - Input channel 1 bits = 8 - Input channel 1 increment = 7 - Input channel 2 bits = 8 - Input channel 2 increment = 7 - Input channel 3 bits = 8 - Input channel 3 increment = 7 - Input channel 4 bits = 8 - Input channel 4 increment = 7 - Input channel 5 bits = 8 - Input channel 5 increment = 7 - Input channel 6 bits = 8 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 8 - Output channel 0 increment = 8 - Output channel 1 bits = 8 - Output channel 1 increment = 8 - Output channel 2 bits = 8 - Output channel 2 increment = 8 - Output channel 3 bits = 8 - Output channel 3 increment = 8 - Output channel 4 bits = 8 - Output channel 4 increment = 8 - Output channel 5 bits = 8 - Output channel 5 increment = 8 - Output channel 6 bits = 8 - Output channel 6 increment = 8 - Output channel 7 bits = 8 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 12 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k48( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo5, wo6); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova3 >> 24) & 0xff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k48_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x38, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x34, 0x38, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k48_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 8 - Input channel 0 increment = 8 - Input channel 1 bits = 8 - Input channel 1 increment = 8 - Input channel 2 bits = 8 - Input channel 2 increment = 8 - Input channel 3 bits = 8 - Input channel 3 increment = 8 - Input channel 4 bits = 8 - Input channel 4 increment = 8 - Input channel 5 bits = 8 - Input channel 5 increment = 8 - Input channel 6 bits = 8 - Input channel 6 increment = 8 - Input channel 7 bits = 8 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 8 - Output channel 0 increment = 8 - Output channel 1 bits = 8 - Output channel 1 increment = 8 - Output channel 2 bits = 8 - Output channel 2 increment = 8 - Output channel 3 bits = 8 - Output channel 3 increment = 8 - Output channel 4 bits = 8 - Output channel 4 increment = 8 - Output channel 5 bits = 8 - Output channel 5 increment = 8 - Output channel 6 bits = 8 - Output channel 6 increment = 8 - Output channel 7 bits = 8 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 8 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned char *)((p) + (off) * 1)) - -static void -imdi_k49( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned char *op0 = (unsigned char *)outp[0]; - unsigned char *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - unsigned int wo7; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - wo7 = IT_WO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo0, wo7); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo1, wo7); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo2, wo7); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo3, wo7); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo4, wo7); - CEX(wo5, wo6); - CEX(wo5, wo7); - CEX(wo6, wo7); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo7 & 0x7fffff); /* Extract offset value */ - wo7 = (wo7 >> 23); /* Extract weighting value */ - vwe = wo6 - wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova3 >> 24) & 0xff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k49_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x38, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x38, 0x5f, 0x66, 0x00, - 0x8e, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x34, 0x39, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k49_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 8 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 16 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 0 - Interpolation table index bits = 8 - Simplex table max resolution = 1 - Interpolation table max resolution = 255 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned char *)((p) + 0 + (off) * 1)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 4) - -/* Simplex table - get weighting/offset value */ -#define SX_WO(p, v) *((unsigned short *)((p) + (v) * 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 4) - -/* Interpolation table - get vertex values */ -#define IM_PE(p, v) *((unsigned int *)((p) + 0 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k50( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 1) { - unsigned int ova0; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - - imp = im_base + IM_O(ti >> 0); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0x0); /* Extract simplex index and comp. entry */ - } - { - unsigned int vowr; /* Vertex offset/weight value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vowr = SX_WO(swp, 0); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vowr = SX_WO(swp, 1); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WO -#undef IM_O -#undef IM_PE -#undef OT_E - -static void -imdi_k50_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x31, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x35, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k50_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 8 - Input channel 0 increment = 3 - Input channel 1 bits = 8 - Input channel 1 increment = 3 - Input channel 2 bits = 8 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 16 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 12 - Interpolation table index bits = 20 - Simplex table max resolution = 16 - Interpolation table max resolution = 101 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 16) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 4) - -/* Interpolation table - get vertex values */ -#define IM_PE(p, v) *((unsigned int *)((p) + 0 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k51( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 1) { - unsigned int ova0; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - ti += IT_IT(it1, ip0[1]); - ti += IT_IT(it2, ip0[2]); - - imp = im_base + IM_O(ti >> 12); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0xfff); /* Extract simplex index and comp. entry */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_PE -#undef OT_E - -static void -imdi_k51_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x65, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x31, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x35, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k51_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 8 - Input channel 0 increment = 4 - Input channel 1 bits = 8 - Input channel 1 increment = 4 - Input channel 2 bits = 8 - Input channel 2 increment = 4 - Input channel 3 bits = 8 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 16 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 32 - Interpolation table index bits = 32 - Simplex table max resolution = 255 - Interpolation table max resolution = 39 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Input table simplex index enty */ -#define IT_SX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 20) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 4) - -/* Interpolation table - get vertex values */ -#define IM_PE(p, v) *((unsigned int *)((p) + 0 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k52( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 1) { - unsigned int ova0; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti_s; /* Simplex index variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - ti_s = IT_SX(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - ti_s += IT_SX(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - ti_s += IT_SX(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - ti_s += IT_SX(it3, ip0[3]); - - swp = sw_base + SW_O(ti_s); /* Compute simplex table entry pointer */ - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 4); /* Read vertex offset value */ - vwe = SX_WE(swp, 4); /* Read vertex weighting value */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_IX -#undef IT_SX -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_PE -#undef OT_E - -static void -imdi_k52_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x27, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x31, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x35, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k52_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 8 - Input channel 0 increment = 5 - Input channel 1 bits = 8 - Input channel 1 increment = 5 - Input channel 2 bits = 8 - Input channel 2 increment = 5 - Input channel 3 bits = 8 - Input channel 3 increment = 5 - Input channel 4 bits = 8 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 16 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 53 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 4) - -/* Interpolation table - get vertex values */ -#define IM_PE(p, v) *((unsigned int *)((p) + 0 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k53( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 1) { - unsigned int ova0; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo3, wo4); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo4; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_PE -#undef OT_E - -static void -imdi_k53_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x31, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x35, 0x33, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k53_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 8 - Input channel 0 increment = 6 - Input channel 1 bits = 8 - Input channel 1 increment = 6 - Input channel 2 bits = 8 - Input channel 2 increment = 6 - Input channel 3 bits = 8 - Input channel 3 increment = 6 - Input channel 4 bits = 8 - Input channel 4 increment = 6 - Input channel 5 bits = 8 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 16 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 24 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 4) - -/* Interpolation table - get vertex values */ -#define IM_PE(p, v) *((unsigned int *)((p) + 0 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k54( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 1) { - unsigned int ova0; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo4, wo5); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo5; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_PE -#undef OT_E - -static void -imdi_k54_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x31, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x35, 0x34, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k54_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 8 - Input channel 0 increment = 7 - Input channel 1 bits = 8 - Input channel 1 increment = 7 - Input channel 2 bits = 8 - Input channel 2 increment = 7 - Input channel 3 bits = 8 - Input channel 3 increment = 7 - Input channel 4 bits = 8 - Input channel 4 increment = 7 - Input channel 5 bits = 8 - Input channel 5 increment = 7 - Input channel 6 bits = 8 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 16 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 14 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 4) - -/* Interpolation table - get vertex values */ -#define IM_PE(p, v) *((unsigned int *)((p) + 0 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k55( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 1) { - unsigned int ova0; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo5, wo6); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo6; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_PE -#undef OT_E - -static void -imdi_k55_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x31, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x35, 0x35, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k55_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 8 - Input channel 0 increment = 8 - Input channel 1 bits = 8 - Input channel 1 increment = 8 - Input channel 2 bits = 8 - Input channel 2 increment = 8 - Input channel 3 bits = 8 - Input channel 3 increment = 8 - Input channel 4 bits = 8 - Input channel 4 increment = 8 - Input channel 5 bits = 8 - Input channel 5 increment = 8 - Input channel 6 bits = 8 - Input channel 6 increment = 8 - Input channel 7 bits = 8 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 16 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 9 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 4) - -/* Interpolation table - get vertex values */ -#define IM_PE(p, v) *((unsigned int *)((p) + 0 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k56( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 1) { - unsigned int ova0; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - unsigned int wo7; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - wo7 = IT_WO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo0, wo7); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo1, wo7); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo2, wo7); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo3, wo7); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo4, wo7); - CEX(wo5, wo6); - CEX(wo5, wo7); - CEX(wo6, wo7); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo7 & 0x7fffff); /* Extract offset value */ - wo7 = (wo7 >> 23); /* Extract weighting value */ - vwe = wo6 - wo7; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo7; /* Baricentric weighting */ - ova0 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_PE -#undef OT_E - -static void -imdi_k56_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x31, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x35, 0x36, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k56_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 8 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 16 - Output channel 0 increment = 3 - Output channel 1 bits = 16 - Output channel 1 increment = 3 - Output channel 2 bits = 16 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 0 - Interpolation table index bits = 8 - Simplex table max resolution = 1 - Interpolation table max resolution = 255 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned char *)((p) + 0 + (off) * 1)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 4) - -/* Simplex table - get weighting/offset value */ -#define SX_WO(p, v) *((unsigned short *)((p) + (v) * 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 4 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k57( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - - imp = im_base + IM_O(ti >> 0); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0x0); /* Extract simplex index and comp. entry */ - } - { - unsigned int vowr; /* Vertex offset/weight value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vowr = SX_WO(swp, 0); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vowr = SX_WO(swp, 1); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WO -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k57_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x33, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x35, 0x37, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k57_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 8 - Input channel 0 increment = 3 - Input channel 1 bits = 8 - Input channel 1 increment = 3 - Input channel 2 bits = 8 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 16 - Output channel 0 increment = 3 - Output channel 1 bits = 16 - Output channel 1 increment = 3 - Output channel 2 bits = 16 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 12 - Interpolation table index bits = 20 - Simplex table max resolution = 16 - Interpolation table max resolution = 101 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 16) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 4 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k58( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - ti += IT_IT(it1, ip0[1]); - ti += IT_IT(it2, ip0[2]); - - imp = im_base + IM_O(ti >> 12); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0xfff); /* Extract simplex index and comp. entry */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k58_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x65, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x33, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x35, 0x38, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k58_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 8 - Input channel 0 increment = 4 - Input channel 1 bits = 8 - Input channel 1 increment = 4 - Input channel 2 bits = 8 - Input channel 2 increment = 4 - Input channel 3 bits = 8 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 16 - Output channel 0 increment = 3 - Output channel 1 bits = 16 - Output channel 1 increment = 3 - Output channel 2 bits = 16 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 32 - Interpolation table index bits = 32 - Simplex table max resolution = 255 - Interpolation table max resolution = 39 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Input table simplex index enty */ -#define IT_SX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 20) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 4 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k59( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti_s; /* Simplex index variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - ti_s = IT_SX(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - ti_s += IT_SX(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - ti_s += IT_SX(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - ti_s += IT_SX(it3, ip0[3]); - - swp = sw_base + SW_O(ti_s); /* Compute simplex table entry pointer */ - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 4); /* Read vertex offset value */ - vwe = SX_WE(swp, 4); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_IX -#undef IT_SX -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k59_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x27, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x33, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x35, 0x39, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k59_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 8 - Input channel 0 increment = 5 - Input channel 1 bits = 8 - Input channel 1 increment = 5 - Input channel 2 bits = 8 - Input channel 2 increment = 5 - Input channel 3 bits = 8 - Input channel 3 increment = 5 - Input channel 4 bits = 8 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 16 - Output channel 0 increment = 3 - Output channel 1 bits = 16 - Output channel 1 increment = 3 - Output channel 2 bits = 16 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 53 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 4 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k60( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo3, wo4); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k60_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x33, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x36, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k60_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 8 - Input channel 0 increment = 6 - Input channel 1 bits = 8 - Input channel 1 increment = 6 - Input channel 2 bits = 8 - Input channel 2 increment = 6 - Input channel 3 bits = 8 - Input channel 3 increment = 6 - Input channel 4 bits = 8 - Input channel 4 increment = 6 - Input channel 5 bits = 8 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 16 - Output channel 0 increment = 3 - Output channel 1 bits = 16 - Output channel 1 increment = 3 - Output channel 2 bits = 16 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 24 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 4 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k61( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo4, wo5); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k61_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x33, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x36, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k61_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 8 - Input channel 0 increment = 7 - Input channel 1 bits = 8 - Input channel 1 increment = 7 - Input channel 2 bits = 8 - Input channel 2 increment = 7 - Input channel 3 bits = 8 - Input channel 3 increment = 7 - Input channel 4 bits = 8 - Input channel 4 increment = 7 - Input channel 5 bits = 8 - Input channel 5 increment = 7 - Input channel 6 bits = 8 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 16 - Output channel 0 increment = 3 - Output channel 1 bits = 16 - Output channel 1 increment = 3 - Output channel 2 bits = 16 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 14 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 4 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k62( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo5, wo6); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k62_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x33, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x36, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k62_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 8 - Input channel 0 increment = 8 - Input channel 1 bits = 8 - Input channel 1 increment = 8 - Input channel 2 bits = 8 - Input channel 2 increment = 8 - Input channel 3 bits = 8 - Input channel 3 increment = 8 - Input channel 4 bits = 8 - Input channel 4 increment = 8 - Input channel 5 bits = 8 - Input channel 5 increment = 8 - Input channel 6 bits = 8 - Input channel 6 increment = 8 - Input channel 7 bits = 8 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 16 - Output channel 0 increment = 3 - Output channel 1 bits = 16 - Output channel 1 increment = 3 - Output channel 2 bits = 16 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 9 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 4 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k63( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - unsigned int wo7; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - wo7 = IT_WO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo0, wo7); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo1, wo7); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo2, wo7); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo3, wo7); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo4, wo7); - CEX(wo5, wo6); - CEX(wo5, wo7); - CEX(wo6, wo7); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo7 & 0x7fffff); /* Extract offset value */ - wo7 = (wo7 >> 23); /* Extract weighting value */ - vwe = wo6 - wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k63_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x33, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x36, 0x33, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k63_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 8 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 16 - Output channel 0 increment = 4 - Output channel 1 bits = 16 - Output channel 1 increment = 4 - Output channel 2 bits = 16 - Output channel 2 increment = 4 - Output channel 3 bits = 16 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 0 - Interpolation table index bits = 8 - Simplex table max resolution = 1 - Interpolation table max resolution = 255 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned char *)((p) + 0 + (off) * 1)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 4) - -/* Simplex table - get weighting/offset value */ -#define SX_WO(p, v) *((unsigned short *)((p) + (v) * 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k64( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - - imp = im_base + IM_O(ti >> 0); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0x0); /* Extract simplex index and comp. entry */ - } - { - unsigned int vowr; /* Vertex offset/weight value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vowr = SX_WO(swp, 0); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vowr = SX_WO(swp, 1); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WO -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k64_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x34, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x36, 0x34, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k64_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 8 - Input channel 0 increment = 3 - Input channel 1 bits = 8 - Input channel 1 increment = 3 - Input channel 2 bits = 8 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 16 - Output channel 0 increment = 4 - Output channel 1 bits = 16 - Output channel 1 increment = 4 - Output channel 2 bits = 16 - Output channel 2 increment = 4 - Output channel 3 bits = 16 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 12 - Interpolation table index bits = 20 - Simplex table max resolution = 16 - Interpolation table max resolution = 101 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 16) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k65( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - ti += IT_IT(it1, ip0[1]); - ti += IT_IT(it2, ip0[2]); - - imp = im_base + IM_O(ti >> 12); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0xfff); /* Extract simplex index and comp. entry */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k65_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x65, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x34, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x36, 0x35, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k65_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 8 - Input channel 0 increment = 4 - Input channel 1 bits = 8 - Input channel 1 increment = 4 - Input channel 2 bits = 8 - Input channel 2 increment = 4 - Input channel 3 bits = 8 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 16 - Output channel 0 increment = 4 - Output channel 1 bits = 16 - Output channel 1 increment = 4 - Output channel 2 bits = 16 - Output channel 2 increment = 4 - Output channel 3 bits = 16 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 32 - Interpolation table index bits = 32 - Simplex table max resolution = 255 - Interpolation table max resolution = 39 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Input table simplex index enty */ -#define IT_SX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 20) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k66( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti_s; /* Simplex index variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - ti_s = IT_SX(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - ti_s += IT_SX(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - ti_s += IT_SX(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - ti_s += IT_SX(it3, ip0[3]); - - swp = sw_base + SW_O(ti_s); /* Compute simplex table entry pointer */ - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 4); /* Read vertex offset value */ - vwe = SX_WE(swp, 4); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_IX -#undef IT_SX -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k66_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x27, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x34, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x36, 0x36, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k66_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 8 - Input channel 0 increment = 5 - Input channel 1 bits = 8 - Input channel 1 increment = 5 - Input channel 2 bits = 8 - Input channel 2 increment = 5 - Input channel 3 bits = 8 - Input channel 3 increment = 5 - Input channel 4 bits = 8 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 16 - Output channel 0 increment = 4 - Output channel 1 bits = 16 - Output channel 1 increment = 4 - Output channel 2 bits = 16 - Output channel 2 increment = 4 - Output channel 3 bits = 16 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 53 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k67( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo3, wo4); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k67_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x34, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x36, 0x37, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k67_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 8 - Input channel 0 increment = 6 - Input channel 1 bits = 8 - Input channel 1 increment = 6 - Input channel 2 bits = 8 - Input channel 2 increment = 6 - Input channel 3 bits = 8 - Input channel 3 increment = 6 - Input channel 4 bits = 8 - Input channel 4 increment = 6 - Input channel 5 bits = 8 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 16 - Output channel 0 increment = 4 - Output channel 1 bits = 16 - Output channel 1 increment = 4 - Output channel 2 bits = 16 - Output channel 2 increment = 4 - Output channel 3 bits = 16 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 24 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k68( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo4, wo5); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k68_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x34, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x36, 0x38, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k68_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 8 - Input channel 0 increment = 7 - Input channel 1 bits = 8 - Input channel 1 increment = 7 - Input channel 2 bits = 8 - Input channel 2 increment = 7 - Input channel 3 bits = 8 - Input channel 3 increment = 7 - Input channel 4 bits = 8 - Input channel 4 increment = 7 - Input channel 5 bits = 8 - Input channel 5 increment = 7 - Input channel 6 bits = 8 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 16 - Output channel 0 increment = 4 - Output channel 1 bits = 16 - Output channel 1 increment = 4 - Output channel 2 bits = 16 - Output channel 2 increment = 4 - Output channel 3 bits = 16 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 14 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k69( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo5, wo6); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k69_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x34, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x36, 0x39, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k69_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 8 - Input channel 0 increment = 8 - Input channel 1 bits = 8 - Input channel 1 increment = 8 - Input channel 2 bits = 8 - Input channel 2 increment = 8 - Input channel 3 bits = 8 - Input channel 3 increment = 8 - Input channel 4 bits = 8 - Input channel 4 increment = 8 - Input channel 5 bits = 8 - Input channel 5 increment = 8 - Input channel 6 bits = 8 - Input channel 6 increment = 8 - Input channel 7 bits = 8 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 16 - Output channel 0 increment = 4 - Output channel 1 bits = 16 - Output channel 1 increment = 4 - Output channel 2 bits = 16 - Output channel 2 increment = 4 - Output channel 3 bits = 16 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 9 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k70( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - unsigned int wo7; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - wo7 = IT_WO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo0, wo7); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo1, wo7); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo2, wo7); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo3, wo7); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo4, wo7); - CEX(wo5, wo6); - CEX(wo5, wo7); - CEX(wo6, wo7); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo7 & 0x7fffff); /* Extract offset value */ - wo7 = (wo7 >> 23); /* Extract weighting value */ - vwe = wo6 - wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k70_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x34, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x37, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k70_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 8 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 16 - Output channel 0 increment = 5 - Output channel 1 bits = 16 - Output channel 1 increment = 5 - Output channel 2 bits = 16 - Output channel 2 increment = 5 - Output channel 3 bits = 16 - Output channel 3 increment = 5 - Output channel 4 bits = 16 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 0 - Interpolation table index bits = 8 - Simplex table max resolution = 1 - Interpolation table max resolution = 255 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned char *)((p) + 0 + (off) * 1)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 4) - -/* Simplex table - get weighting/offset value */ -#define SX_WO(p, v) *((unsigned short *)((p) + (v) * 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 8 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k71( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - - imp = im_base + IM_O(ti >> 0); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0x0); /* Extract simplex index and comp. entry */ - } - { - unsigned int vowr; /* Vertex offset/weight value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vowr = SX_WO(swp, 0); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vowr = SX_WO(swp, 1); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WO -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k71_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x35, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x37, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k71_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 8 - Input channel 0 increment = 3 - Input channel 1 bits = 8 - Input channel 1 increment = 3 - Input channel 2 bits = 8 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 16 - Output channel 0 increment = 5 - Output channel 1 bits = 16 - Output channel 1 increment = 5 - Output channel 2 bits = 16 - Output channel 2 increment = 5 - Output channel 3 bits = 16 - Output channel 3 increment = 5 - Output channel 4 bits = 16 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 12 - Interpolation table index bits = 20 - Simplex table max resolution = 16 - Interpolation table max resolution = 101 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 16) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 8 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k72( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - ti += IT_IT(it1, ip0[1]); - ti += IT_IT(it2, ip0[2]); - - imp = im_base + IM_O(ti >> 12); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0xfff); /* Extract simplex index and comp. entry */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k72_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x65, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x35, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x37, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k72_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 8 - Input channel 0 increment = 4 - Input channel 1 bits = 8 - Input channel 1 increment = 4 - Input channel 2 bits = 8 - Input channel 2 increment = 4 - Input channel 3 bits = 8 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 16 - Output channel 0 increment = 5 - Output channel 1 bits = 16 - Output channel 1 increment = 5 - Output channel 2 bits = 16 - Output channel 2 increment = 5 - Output channel 3 bits = 16 - Output channel 3 increment = 5 - Output channel 4 bits = 16 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 32 - Interpolation table index bits = 32 - Simplex table max resolution = 255 - Interpolation table max resolution = 27 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Input table simplex index enty */ -#define IT_SX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 20) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 8 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k73( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti_s; /* Simplex index variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - ti_s = IT_SX(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - ti_s += IT_SX(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - ti_s += IT_SX(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - ti_s += IT_SX(it3, ip0[3]); - - swp = sw_base + SW_O(ti_s); /* Compute simplex table entry pointer */ - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 4); /* Read vertex offset value */ - vwe = SX_WE(swp, 4); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_IX -#undef IT_SX -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k73_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x1b, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x35, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x37, 0x33, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k73_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 8 - Input channel 0 increment = 5 - Input channel 1 bits = 8 - Input channel 1 increment = 5 - Input channel 2 bits = 8 - Input channel 2 increment = 5 - Input channel 3 bits = 8 - Input channel 3 increment = 5 - Input channel 4 bits = 8 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 16 - Output channel 0 increment = 5 - Output channel 1 bits = 16 - Output channel 1 increment = 5 - Output channel 2 bits = 16 - Output channel 2 increment = 5 - Output channel 3 bits = 16 - Output channel 3 increment = 5 - Output channel 4 bits = 16 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 40 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 8 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k74( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo3, wo4); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k74_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x35, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x37, 0x34, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k74_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 8 - Input channel 0 increment = 6 - Input channel 1 bits = 8 - Input channel 1 increment = 6 - Input channel 2 bits = 8 - Input channel 2 increment = 6 - Input channel 3 bits = 8 - Input channel 3 increment = 6 - Input channel 4 bits = 8 - Input channel 4 increment = 6 - Input channel 5 bits = 8 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 16 - Output channel 0 increment = 5 - Output channel 1 bits = 16 - Output channel 1 increment = 5 - Output channel 2 bits = 16 - Output channel 2 increment = 5 - Output channel 3 bits = 16 - Output channel 3 increment = 5 - Output channel 4 bits = 16 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 19 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 8 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k75( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo4, wo5); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k75_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x35, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x37, 0x35, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k75_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 8 - Input channel 0 increment = 7 - Input channel 1 bits = 8 - Input channel 1 increment = 7 - Input channel 2 bits = 8 - Input channel 2 increment = 7 - Input channel 3 bits = 8 - Input channel 3 increment = 7 - Input channel 4 bits = 8 - Input channel 4 increment = 7 - Input channel 5 bits = 8 - Input channel 5 increment = 7 - Input channel 6 bits = 8 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 16 - Output channel 0 increment = 5 - Output channel 1 bits = 16 - Output channel 1 increment = 5 - Output channel 2 bits = 16 - Output channel 2 increment = 5 - Output channel 3 bits = 16 - Output channel 3 increment = 5 - Output channel 4 bits = 16 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 11 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 8 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k76( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo5, wo6); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k76_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x35, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x37, 0x36, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k76_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 8 - Input channel 0 increment = 8 - Input channel 1 bits = 8 - Input channel 1 increment = 8 - Input channel 2 bits = 8 - Input channel 2 increment = 8 - Input channel 3 bits = 8 - Input channel 3 increment = 8 - Input channel 4 bits = 8 - Input channel 4 increment = 8 - Input channel 5 bits = 8 - Input channel 5 increment = 8 - Input channel 6 bits = 8 - Input channel 6 increment = 8 - Input channel 7 bits = 8 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 16 - Output channel 0 increment = 5 - Output channel 1 bits = 16 - Output channel 1 increment = 5 - Output channel 2 bits = 16 - Output channel 2 increment = 5 - Output channel 3 bits = 16 - Output channel 3 increment = 5 - Output channel 4 bits = 16 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 8 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 8 + (v) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k77( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - unsigned int wo7; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - wo7 = IT_WO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo0, wo7); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo1, wo7); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo2, wo7); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo3, wo7); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo4, wo7); - CEX(wo5, wo6); - CEX(wo5, wo7); - CEX(wo6, wo7); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo7 & 0x7fffff); /* Extract offset value */ - wo7 = (wo7 >> 23); /* Extract weighting value */ - vwe = wo6 - wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k77_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x35, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x37, 0x37, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k77_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x21, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 8 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 16 - Output channel 0 increment = 6 - Output channel 1 bits = 16 - Output channel 1 increment = 6 - Output channel 2 bits = 16 - Output channel 2 increment = 6 - Output channel 3 bits = 16 - Output channel 3 increment = 6 - Output channel 4 bits = 16 - Output channel 4 increment = 6 - Output channel 5 bits = 16 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 0 - Interpolation table index bits = 8 - Simplex table max resolution = 1 - Interpolation table max resolution = 255 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned char *)((p) + 0 + (off) * 1)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 4) - -/* Simplex table - get weighting/offset value */ -#define SX_WO(p, v) *((unsigned short *)((p) + (v) * 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k78( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - - imp = im_base + IM_O(ti >> 0); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0x0); /* Extract simplex index and comp. entry */ - } - { - unsigned int vowr; /* Vertex offset/weight value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vowr = SX_WO(swp, 0); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vowr = SX_WO(swp, 1); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WO -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k78_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x36, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x37, 0x38, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k78_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 8 - Input channel 0 increment = 3 - Input channel 1 bits = 8 - Input channel 1 increment = 3 - Input channel 2 bits = 8 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 16 - Output channel 0 increment = 6 - Output channel 1 bits = 16 - Output channel 1 increment = 6 - Output channel 2 bits = 16 - Output channel 2 increment = 6 - Output channel 3 bits = 16 - Output channel 3 increment = 6 - Output channel 4 bits = 16 - Output channel 4 increment = 6 - Output channel 5 bits = 16 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 12 - Interpolation table index bits = 20 - Simplex table max resolution = 16 - Interpolation table max resolution = 101 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 16) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k79( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - ti += IT_IT(it1, ip0[1]); - ti += IT_IT(it2, ip0[2]); - - imp = im_base + IM_O(ti >> 12); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0xfff); /* Extract simplex index and comp. entry */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k79_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x65, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x36, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x37, 0x39, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k79_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 8 - Input channel 0 increment = 4 - Input channel 1 bits = 8 - Input channel 1 increment = 4 - Input channel 2 bits = 8 - Input channel 2 increment = 4 - Input channel 3 bits = 8 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 16 - Output channel 0 increment = 6 - Output channel 1 bits = 16 - Output channel 1 increment = 6 - Output channel 2 bits = 16 - Output channel 2 increment = 6 - Output channel 3 bits = 16 - Output channel 3 increment = 6 - Output channel 4 bits = 16 - Output channel 4 increment = 6 - Output channel 5 bits = 16 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 32 - Interpolation table index bits = 32 - Simplex table max resolution = 255 - Interpolation table max resolution = 27 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Input table simplex index enty */ -#define IT_SX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 20) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k80( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti_s; /* Simplex index variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - ti_s = IT_SX(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - ti_s += IT_SX(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - ti_s += IT_SX(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - ti_s += IT_SX(it3, ip0[3]); - - swp = sw_base + SW_O(ti_s); /* Compute simplex table entry pointer */ - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 4); /* Read vertex offset value */ - vwe = SX_WE(swp, 4); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_IX -#undef IT_SX -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k80_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x1b, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x36, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x38, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k80_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 8 - Input channel 0 increment = 5 - Input channel 1 bits = 8 - Input channel 1 increment = 5 - Input channel 2 bits = 8 - Input channel 2 increment = 5 - Input channel 3 bits = 8 - Input channel 3 increment = 5 - Input channel 4 bits = 8 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 16 - Output channel 0 increment = 6 - Output channel 1 bits = 16 - Output channel 1 increment = 6 - Output channel 2 bits = 16 - Output channel 2 increment = 6 - Output channel 3 bits = 16 - Output channel 3 increment = 6 - Output channel 4 bits = 16 - Output channel 4 increment = 6 - Output channel 5 bits = 16 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 40 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k81( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo3, wo4); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k81_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x36, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x38, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k81_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 8 - Input channel 0 increment = 6 - Input channel 1 bits = 8 - Input channel 1 increment = 6 - Input channel 2 bits = 8 - Input channel 2 increment = 6 - Input channel 3 bits = 8 - Input channel 3 increment = 6 - Input channel 4 bits = 8 - Input channel 4 increment = 6 - Input channel 5 bits = 8 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 16 - Output channel 0 increment = 6 - Output channel 1 bits = 16 - Output channel 1 increment = 6 - Output channel 2 bits = 16 - Output channel 2 increment = 6 - Output channel 3 bits = 16 - Output channel 3 increment = 6 - Output channel 4 bits = 16 - Output channel 4 increment = 6 - Output channel 5 bits = 16 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 19 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k82( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo4, wo5); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k82_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x36, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x38, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k82_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 8 - Input channel 0 increment = 7 - Input channel 1 bits = 8 - Input channel 1 increment = 7 - Input channel 2 bits = 8 - Input channel 2 increment = 7 - Input channel 3 bits = 8 - Input channel 3 increment = 7 - Input channel 4 bits = 8 - Input channel 4 increment = 7 - Input channel 5 bits = 8 - Input channel 5 increment = 7 - Input channel 6 bits = 8 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 16 - Output channel 0 increment = 6 - Output channel 1 bits = 16 - Output channel 1 increment = 6 - Output channel 2 bits = 16 - Output channel 2 increment = 6 - Output channel 3 bits = 16 - Output channel 3 increment = 6 - Output channel 4 bits = 16 - Output channel 4 increment = 6 - Output channel 5 bits = 16 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 11 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k83( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo5, wo6); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k83_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x36, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x38, 0x33, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k83_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 8 - Input channel 0 increment = 8 - Input channel 1 bits = 8 - Input channel 1 increment = 8 - Input channel 2 bits = 8 - Input channel 2 increment = 8 - Input channel 3 bits = 8 - Input channel 3 increment = 8 - Input channel 4 bits = 8 - Input channel 4 increment = 8 - Input channel 5 bits = 8 - Input channel 5 increment = 8 - Input channel 6 bits = 8 - Input channel 6 increment = 8 - Input channel 7 bits = 8 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 16 - Output channel 0 increment = 6 - Output channel 1 bits = 16 - Output channel 1 increment = 6 - Output channel 2 bits = 16 - Output channel 2 increment = 6 - Output channel 3 bits = 16 - Output channel 3 increment = 6 - Output channel 4 bits = 16 - Output channel 4 increment = 6 - Output channel 5 bits = 16 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 8 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 4 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k84( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - unsigned int wo7; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - wo7 = IT_WO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo0, wo7); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo1, wo7); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo2, wo7); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo3, wo7); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo4, wo7); - CEX(wo5, wo6); - CEX(wo5, wo7); - CEX(wo6, wo7); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo7 & 0x7fffff); /* Extract offset value */ - wo7 = (wo7 >> 23); /* Extract weighting value */ - vwe = wo6 - wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k84_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x36, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x38, 0x34, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k84_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 8 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 16 - Output channel 0 increment = 7 - Output channel 1 bits = 16 - Output channel 1 increment = 7 - Output channel 2 bits = 16 - Output channel 2 increment = 7 - Output channel 3 bits = 16 - Output channel 3 increment = 7 - Output channel 4 bits = 16 - Output channel 4 increment = 7 - Output channel 5 bits = 16 - Output channel 5 increment = 7 - Output channel 6 bits = 16 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 0 - Interpolation table index bits = 8 - Simplex table max resolution = 1 - Interpolation table max resolution = 255 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned char *)((p) + 0 + (off) * 1)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 4) - -/* Simplex table - get weighting/offset value */ -#define SX_WO(p, v) *((unsigned short *)((p) + (v) * 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 12 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k85( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - - imp = im_base + IM_O(ti >> 0); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0x0); /* Extract simplex index and comp. entry */ - } - { - unsigned int vowr; /* Vertex offset/weight value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vowr = SX_WO(swp, 0); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vowr = SX_WO(swp, 1); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WO -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k85_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x37, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x38, 0x35, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k85_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 8 - Input channel 0 increment = 3 - Input channel 1 bits = 8 - Input channel 1 increment = 3 - Input channel 2 bits = 8 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 16 - Output channel 0 increment = 7 - Output channel 1 bits = 16 - Output channel 1 increment = 7 - Output channel 2 bits = 16 - Output channel 2 increment = 7 - Output channel 3 bits = 16 - Output channel 3 increment = 7 - Output channel 4 bits = 16 - Output channel 4 increment = 7 - Output channel 5 bits = 16 - Output channel 5 increment = 7 - Output channel 6 bits = 16 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 12 - Interpolation table index bits = 20 - Simplex table max resolution = 16 - Interpolation table max resolution = 101 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 16) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 12 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k86( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - ti += IT_IT(it1, ip0[1]); - ti += IT_IT(it2, ip0[2]); - - imp = im_base + IM_O(ti >> 12); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0xfff); /* Extract simplex index and comp. entry */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k86_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x65, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x37, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x38, 0x36, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k86_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 8 - Input channel 0 increment = 4 - Input channel 1 bits = 8 - Input channel 1 increment = 4 - Input channel 2 bits = 8 - Input channel 2 increment = 4 - Input channel 3 bits = 8 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 16 - Output channel 0 increment = 7 - Output channel 1 bits = 16 - Output channel 1 increment = 7 - Output channel 2 bits = 16 - Output channel 2 increment = 7 - Output channel 3 bits = 16 - Output channel 3 increment = 7 - Output channel 4 bits = 16 - Output channel 4 increment = 7 - Output channel 5 bits = 16 - Output channel 5 increment = 7 - Output channel 6 bits = 16 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 32 - Interpolation table index bits = 32 - Simplex table max resolution = 255 - Interpolation table max resolution = 31 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Input table simplex index enty */ -#define IT_SX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 20) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 12 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k87( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value partial accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti_s; /* Simplex index variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - ti_s = IT_SX(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - ti_s += IT_SX(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - ti_s += IT_SX(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - ti_s += IT_SX(it3, ip0[3]); - - swp = sw_base + SW_O(ti_s); /* Compute simplex table entry pointer */ - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof = SX_VO(swp, 4); /* Read vertex offset value */ - vwe = SX_WE(swp, 4); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_IX -#undef IT_SX -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k87_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x1f, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x37, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x38, 0x37, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k87_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 8 - Input channel 0 increment = 5 - Input channel 1 bits = 8 - Input channel 1 increment = 5 - Input channel 2 bits = 8 - Input channel 2 increment = 5 - Input channel 3 bits = 8 - Input channel 3 increment = 5 - Input channel 4 bits = 8 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 16 - Output channel 0 increment = 7 - Output channel 1 bits = 16 - Output channel 1 increment = 7 - Output channel 2 bits = 16 - Output channel 2 increment = 7 - Output channel 3 bits = 16 - Output channel 3 increment = 7 - Output channel 4 bits = 16 - Output channel 4 increment = 7 - Output channel 5 bits = 16 - Output channel 5 increment = 7 - Output channel 6 bits = 16 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 45 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 12 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k88( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo3, wo4); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k88_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x37, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x38, 0x38, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k88_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 8 - Input channel 0 increment = 6 - Input channel 1 bits = 8 - Input channel 1 increment = 6 - Input channel 2 bits = 8 - Input channel 2 increment = 6 - Input channel 3 bits = 8 - Input channel 3 increment = 6 - Input channel 4 bits = 8 - Input channel 4 increment = 6 - Input channel 5 bits = 8 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 16 - Output channel 0 increment = 7 - Output channel 1 bits = 16 - Output channel 1 increment = 7 - Output channel 2 bits = 16 - Output channel 2 increment = 7 - Output channel 3 bits = 16 - Output channel 3 increment = 7 - Output channel 4 bits = 16 - Output channel 4 increment = 7 - Output channel 5 bits = 16 - Output channel 5 increment = 7 - Output channel 6 bits = 16 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 20 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 12 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k89( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo4, wo5); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k89_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x37, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x38, 0x39, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k89_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 8 - Input channel 0 increment = 7 - Input channel 1 bits = 8 - Input channel 1 increment = 7 - Input channel 2 bits = 8 - Input channel 2 increment = 7 - Input channel 3 bits = 8 - Input channel 3 increment = 7 - Input channel 4 bits = 8 - Input channel 4 increment = 7 - Input channel 5 bits = 8 - Input channel 5 increment = 7 - Input channel 6 bits = 8 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 16 - Output channel 0 increment = 7 - Output channel 1 bits = 16 - Output channel 1 increment = 7 - Output channel 2 bits = 16 - Output channel 2 increment = 7 - Output channel 3 bits = 16 - Output channel 3 increment = 7 - Output channel 4 bits = 16 - Output channel 4 increment = 7 - Output channel 5 bits = 16 - Output channel 5 increment = 7 - Output channel 6 bits = 16 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 12 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 12 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k90( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo5, wo6); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k90_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x37, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x39, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k90_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 8 - Input channel 0 increment = 8 - Input channel 1 bits = 8 - Input channel 1 increment = 8 - Input channel 2 bits = 8 - Input channel 2 increment = 8 - Input channel 3 bits = 8 - Input channel 3 increment = 8 - Input channel 4 bits = 8 - Input channel 4 increment = 8 - Input channel 5 bits = 8 - Input channel 5 increment = 8 - Input channel 6 bits = 8 - Input channel 6 increment = 8 - Input channel 7 bits = 8 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 16 - Output channel 0 increment = 7 - Output channel 1 bits = 16 - Output channel 1 increment = 7 - Output channel 2 bits = 16 - Output channel 2 increment = 7 - Output channel 3 bits = 16 - Output channel 3 increment = 7 - Output channel 4 bits = 16 - Output channel 4 increment = 7 - Output channel 5 bits = 16 - Output channel 5 increment = 7 - Output channel 6 bits = 16 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 8 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) -#define IM_PE(p, v) *((unsigned int *)((p) + 12 + (v) * 8)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k91( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value partial accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - unsigned int wo7; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - wo7 = IT_WO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo0, wo7); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo1, wo7); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo2, wo7); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo3, wo7); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo4, wo7); - CEX(wo5, wo6); - CEX(wo5, wo7); - CEX(wo6, wo7); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo7 & 0x7fffff); /* Extract offset value */ - wo7 = (wo7 >> 23); /* Extract weighting value */ - vwe = wo6 - wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_PE(imp, vof) * vwe; /* Accumulate last weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef IM_PE -#undef OT_E - -static void -imdi_k91_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x37, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x39, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k91_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 8 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 16 - Output channel 0 increment = 8 - Output channel 1 bits = 16 - Output channel 1 increment = 8 - Output channel 2 bits = 16 - Output channel 2 increment = 8 - Output channel 3 bits = 16 - Output channel 3 increment = 8 - Output channel 4 bits = 16 - Output channel 4 increment = 8 - Output channel 5 bits = 16 - Output channel 5 increment = 8 - Output channel 6 bits = 16 - Output channel 6 increment = 8 - Output channel 7 bits = 16 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 0 - Interpolation table index bits = 8 - Simplex table max resolution = 1 - Interpolation table max resolution = 255 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned char *)((p) + 0 + (off) * 1)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 4) - -/* Simplex table - get weighting/offset value */ -#define SX_WO(p, v) *((unsigned short *)((p) + (v) * 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k92( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - - imp = im_base + IM_O(ti >> 0); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0x0); /* Extract simplex index and comp. entry */ - } - { - unsigned int vowr; /* Vertex offset/weight value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vowr = SX_WO(swp, 0); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vowr = SX_WO(swp, 1); /* Read vertex offset+weighting values */ - vof = (vowr & 0x7f); /* Extract offset value */ - vwe = (vowr >> 7); /* Extract weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova3 >> 24) & 0xff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WO -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k92_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x38, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x39, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k92_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 8 - Input channel 0 increment = 3 - Input channel 1 bits = 8 - Input channel 1 increment = 3 - Input channel 2 bits = 8 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 16 - Output channel 0 increment = 8 - Output channel 1 bits = 16 - Output channel 1 increment = 8 - Output channel 2 bits = 16 - Output channel 2 increment = 8 - Output channel 3 bits = 16 - Output channel 3 increment = 8 - Output channel 4 bits = 16 - Output channel 4 increment = 8 - Output channel 5 bits = 16 - Output channel 5 increment = 8 - Output channel 6 bits = 16 - Output channel 6 increment = 8 - Output channel 7 bits = 16 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 12 - Interpolation table index bits = 20 - Simplex table max resolution = 16 - Interpolation table max resolution = 101 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table inter & simplex indexes */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 16) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k93( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti; /* Simplex+Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - ti += IT_IT(it1, ip0[1]); - ti += IT_IT(it2, ip0[2]); - - imp = im_base + IM_O(ti >> 12); /* Extract interp. index and comp. entry */ - swp = sw_base + SW_O(ti & 0xfff); /* Extract simplex index and comp. entry */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova3 >> 24) & 0xff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k93_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x65, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x38, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x39, 0x33, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k93_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 8 - Input channel 0 increment = 4 - Input channel 1 bits = 8 - Input channel 1 increment = 4 - Input channel 2 bits = 8 - Input channel 2 increment = 4 - Input channel 3 bits = 8 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 16 - Output channel 0 increment = 8 - Output channel 1 bits = 16 - Output channel 1 increment = 8 - Output channel 2 bits = 16 - Output channel 2 increment = 8 - Output channel 3 bits = 16 - Output channel 3 increment = 8 - Output channel 4 bits = 16 - Output channel 4 increment = 8 - Output channel 5 bits = 16 - Output channel 5 increment = 8 - Output channel 6 bits = 16 - Output channel 6 increment = 8 - Output channel 7 bits = 16 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Simplex table index bits = 32 - Interpolation table index bits = 32 - Simplex table max resolution = 255 - Interpolation table max resolution = 31 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Input table simplex index enty */ -#define IT_SX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Simplex weighting table access */ -#define SW_O(off) ((off) * 20) - -/* Simplex table - get weighting value */ -#define SX_WE(p, v) *((unsigned short *)((p) + (v) * 4 + 0)) - -/* Simplex table - get offset value */ -#define SX_VO(p, v) *((unsigned short *)((p) + (v) * 4 + 2)) - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k94( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer sw_base = (pointer)p->sw_table; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer swp; - pointer imp; - { - unsigned int ti_s; /* Simplex index variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - ti_s = IT_SX(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - ti_s += IT_SX(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - ti_s += IT_SX(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - ti_s += IT_SX(it3, ip0[3]); - - swp = sw_base + SW_O(ti_s); /* Compute simplex table entry pointer */ - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = SX_VO(swp, 0); /* Read vertex offset value */ - vwe = SX_WE(swp, 0); /* Read vertex weighting value */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 1); /* Read vertex offset value */ - vwe = SX_WE(swp, 1); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 2); /* Read vertex offset value */ - vwe = SX_WE(swp, 2); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 3); /* Read vertex offset value */ - vwe = SX_WE(swp, 3); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof = SX_VO(swp, 4); /* Read vertex offset value */ - vwe = SX_WE(swp, 4); /* Read vertex weighting value */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova3 >> 24) & 0xff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_IX -#undef IT_SX -#undef SW_O -#undef SX_WE -#undef SX_VO -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k94_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x1f, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x38, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x39, 0x34, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k94_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 8 - Input channel 0 increment = 5 - Input channel 1 bits = 8 - Input channel 1 increment = 5 - Input channel 2 bits = 8 - Input channel 2 increment = 5 - Input channel 3 bits = 8 - Input channel 3 increment = 5 - Input channel 4 bits = 8 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 16 - Output channel 0 increment = 8 - Output channel 1 bits = 16 - Output channel 1 increment = 8 - Output channel 2 bits = 16 - Output channel 2 increment = 8 - Output channel 3 bits = 16 - Output channel 3 increment = 8 - Output channel 4 bits = 16 - Output channel 4 increment = 8 - Output channel 5 bits = 16 - Output channel 5 increment = 8 - Output channel 6 bits = 16 - Output channel 6 increment = 8 - Output channel 7 bits = 16 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 45 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k95( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo3, wo4); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova3 >> 24) & 0xff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k95_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x38, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x39, 0x35, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k95_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 8 - Input channel 0 increment = 6 - Input channel 1 bits = 8 - Input channel 1 increment = 6 - Input channel 2 bits = 8 - Input channel 2 increment = 6 - Input channel 3 bits = 8 - Input channel 3 increment = 6 - Input channel 4 bits = 8 - Input channel 4 increment = 6 - Input channel 5 bits = 8 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 16 - Output channel 0 increment = 8 - Output channel 1 bits = 16 - Output channel 1 increment = 8 - Output channel 2 bits = 16 - Output channel 2 increment = 8 - Output channel 3 bits = 16 - Output channel 3 increment = 8 - Output channel 4 bits = 16 - Output channel 4 increment = 8 - Output channel 5 bits = 16 - Output channel 5 increment = 8 - Output channel 6 bits = 16 - Output channel 6 increment = 8 - Output channel 7 bits = 16 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 20 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k96( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo4, wo5); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova3 >> 24) & 0xff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k96_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x38, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x39, 0x36, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k96_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 8 - Input channel 0 increment = 7 - Input channel 1 bits = 8 - Input channel 1 increment = 7 - Input channel 2 bits = 8 - Input channel 2 increment = 7 - Input channel 3 bits = 8 - Input channel 3 increment = 7 - Input channel 4 bits = 8 - Input channel 4 increment = 7 - Input channel 5 bits = 8 - Input channel 5 increment = 7 - Input channel 6 bits = 8 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 16 - Output channel 0 increment = 8 - Output channel 1 bits = 16 - Output channel 1 increment = 8 - Output channel 2 bits = 16 - Output channel 2 increment = 8 - Output channel 3 bits = 16 - Output channel 3 increment = 8 - Output channel 4 bits = 16 - Output channel 4 increment = 8 - Output channel 5 bits = 16 - Output channel 5 increment = 8 - Output channel 6 bits = 16 - Output channel 6 increment = 8 - Output channel 7 bits = 16 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 12 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k97( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo5, wo6); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova3 >> 24) & 0xff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k97_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x38, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x39, 0x37, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k97_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 8 - Input channel 0 increment = 8 - Input channel 1 bits = 8 - Input channel 1 increment = 8 - Input channel 2 bits = 8 - Input channel 2 increment = 8 - Input channel 3 bits = 8 - Input channel 3 increment = 8 - Input channel 4 bits = 8 - Input channel 4 increment = 8 - Input channel 5 bits = 8 - Input channel 5 increment = 8 - Input channel 6 bits = 8 - Input channel 6 increment = 8 - Input channel 7 bits = 8 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 16 - Output channel 0 increment = 8 - Output channel 1 bits = 16 - Output channel 1 increment = 8 - Output channel 2 bits = 16 - Output channel 2 increment = 8 - Output channel 3 bits = 16 - Output channel 3 increment = 8 - Output channel 4 bits = 16 - Output channel 4 increment = 8 - Output channel 5 bits = 16 - Output channel 5 increment = 8 - Output channel 6 bits = 16 - Output channel 6 increment = 8 - Output channel 7 bits = 16 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 8 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) *((unsigned int *)((p) + (v) * 8 + (c) * 4)) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k98( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned char *ip0 = (unsigned char *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned char *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - unsigned int wo4; /* Weighting value and vertex offset variable */ - unsigned int wo5; /* Weighting value and vertex offset variable */ - unsigned int wo6; /* Weighting value and vertex offset variable */ - unsigned int wo7; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - wo4 = IT_WO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - wo5 = IT_WO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - wo6 = IT_WO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - wo7 = IT_WO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo0, wo4); - CEX(wo0, wo5); - CEX(wo0, wo6); - CEX(wo0, wo7); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo1, wo4); - CEX(wo1, wo5); - CEX(wo1, wo6); - CEX(wo1, wo7); - CEX(wo2, wo3); - CEX(wo2, wo4); - CEX(wo2, wo5); - CEX(wo2, wo6); - CEX(wo2, wo7); - CEX(wo3, wo4); - CEX(wo3, wo5); - CEX(wo3, wo6); - CEX(wo3, wo7); - CEX(wo4, wo5); - CEX(wo4, wo6); - CEX(wo4, wo7); - CEX(wo5, wo6); - CEX(wo5, wo7); - CEX(wo6, wo7); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fffff); /* Extract offset value */ - wo0 = (wo0 >> 23); /* Extract weighting value */ - vwe = 256 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fffff); /* Extract offset value */ - wo1 = (wo1 >> 23); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fffff); /* Extract offset value */ - wo2 = (wo2 >> 23); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fffff); /* Extract offset value */ - wo3 = (wo3 >> 23); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo4 & 0x7fffff); /* Extract offset value */ - wo4 = (wo4 >> 23); /* Extract weighting value */ - vwe = wo3 - wo4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo5 & 0x7fffff); /* Extract offset value */ - wo5 = (wo5 >> 23); /* Extract weighting value */ - vwe = wo4 - wo5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo6 & 0x7fffff); /* Extract offset value */ - wo6 = (wo6 >> 23); /* Extract weighting value */ - vwe = wo5 - wo6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo7 & 0x7fffff); /* Extract offset value */ - wo7 = (wo7 >> 23); /* Extract weighting value */ - vwe = wo6 - wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 8) & 0xff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova0 >> 24) & 0xff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova1 >> 8) & 0xff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova1 >> 24) & 0xff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova2 >> 8) & 0xff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova2 >> 24) & 0xff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova3 >> 8) & 0xff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova3 >> 24) & 0xff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k98_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x38, 0x5f, - 0x69, 0x38, 0x5f, 0x69, 0x31, 0x36, 0x5f, 0x66, - 0x00, 0xff, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x39, 0x38, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k98_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 16 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 16 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 12 - Interpolation table max resolution = 4095 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp index, weighting and vertex offset */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 2) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k99( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 1) { - unsigned int ova0; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - { - unsigned int ti; /* Input table entry variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - wo0 = (ti & 0xfffff); /* Extract weighting/vertex offset value */ - ti_i = (ti >> 20); /* Extract interpolation table value */ - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7); /* Extract offset value */ - wo0 = (wo0 >> 3); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo0; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k99_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x31, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x39, 0x39, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k99_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 16 - Input channel 0 increment = 3 - Input channel 1 bits = 16 - Input channel 1 increment = 3 - Input channel 2 bits = 16 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 16 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 16 - Interpolation table max resolution = 40 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned short *)((p) + 0 + (off) * 6)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 2 + (off) * 6)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 2) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k100( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 1) { - unsigned int ova0; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo1, wo2); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fff); /* Extract offset value */ - wo0 = (wo0 >> 15); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fff); /* Extract offset value */ - wo1 = (wo1 >> 15); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fff); /* Extract offset value */ - wo2 = (wo2 >> 15); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k100_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x31, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x30, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k100_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 16 - Input channel 0 increment = 4 - Input channel 1 bits = 16 - Input channel 1 increment = 4 - Input channel 2 bits = 16 - Input channel 2 increment = 4 - Input channel 3 bits = 16 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 16 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 31 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 2) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k101( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 1) { - unsigned int ova0; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo2, wo3); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fff); /* Extract offset value */ - wo0 = (wo0 >> 15); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fff); /* Extract offset value */ - wo1 = (wo1 >> 15); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fff); /* Extract offset value */ - wo2 = (wo2 >> 15); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fff); /* Extract offset value */ - wo3 = (wo3 >> 15); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k101_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x31, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x30, - 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k101_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 16 - Input channel 0 increment = 5 - Input channel 1 bits = 16 - Input channel 1 increment = 5 - Input channel 2 bits = 16 - Input channel 2 increment = 5 - Input channel 3 bits = 16 - Input channel 3 increment = 5 - Input channel 4 bits = 16 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 16 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 84 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 2) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k102( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 1) { - unsigned int ova0; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we3, vo3, we4, vo4); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k102_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x31, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x30, - 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k102_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 16 - Input channel 0 increment = 6 - Input channel 1 bits = 16 - Input channel 1 increment = 6 - Input channel 2 bits = 16 - Input channel 2 increment = 6 - Input channel 3 bits = 16 - Input channel 3 increment = 6 - Input channel 4 bits = 16 - Input channel 4 increment = 6 - Input channel 5 bits = 16 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 16 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 40 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 2) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k103( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 1) { - unsigned int ova0; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we4, vo4, we5, vo5); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k103_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x31, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x30, - 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k103_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 16 - Input channel 0 increment = 7 - Input channel 1 bits = 16 - Input channel 1 increment = 7 - Input channel 2 bits = 16 - Input channel 2 increment = 7 - Input channel 3 bits = 16 - Input channel 3 increment = 7 - Input channel 4 bits = 16 - Input channel 4 increment = 7 - Input channel 5 bits = 16 - Input channel 5 increment = 7 - Input channel 6 bits = 16 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 16 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 23 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 2) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k104( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 1) { - unsigned int ova0; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - unsigned int we6; /* Weighting value variable */ - unsigned int vo6; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - we6 = IT_WE(it6, ip0[6]); - vo6 = IT_VO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we0, vo0, we6, vo6); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we1, vo1, we6, vo6); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we2, vo2, we6, vo6); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we3, vo3, we6, vo6); - CEX(we4, vo4, we5, vo5); - CEX(we4, vo4, we6, vo6); - CEX(we5, vo5, we6, vo6); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5 - we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo6; /* Move to next vertex */ - vwe = we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k104_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x31, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x30, - 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k104_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 16 - Input channel 0 increment = 8 - Input channel 1 bits = 16 - Input channel 1 increment = 8 - Input channel 2 bits = 16 - Input channel 2 increment = 8 - Input channel 3 bits = 16 - Input channel 3 increment = 8 - Input channel 4 bits = 16 - Input channel 4 increment = 8 - Input channel 5 bits = 16 - Input channel 5 increment = 8 - Input channel 6 bits = 16 - Input channel 6 increment = 8 - Input channel 7 bits = 16 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 1 - Output channel 0 bits = 16 - Output channel 0 increment = 1 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 16 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 2) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k105( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 1) { - unsigned int ova0; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - unsigned int we6; /* Weighting value variable */ - unsigned int vo6; /* Vertex offset variable */ - unsigned int we7; /* Weighting value variable */ - unsigned int vo7; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - we6 = IT_WE(it6, ip0[6]); - vo6 = IT_VO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - we7 = IT_WE(it7, ip0[7]); - vo7 = IT_VO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we0, vo0, we6, vo6); - CEX(we0, vo0, we7, vo7); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we1, vo1, we6, vo6); - CEX(we1, vo1, we7, vo7); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we2, vo2, we6, vo6); - CEX(we2, vo2, we7, vo7); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we3, vo3, we6, vo6); - CEX(we3, vo3, we7, vo7); - CEX(we4, vo4, we5, vo5); - CEX(we4, vo4, we6, vo6); - CEX(we4, vo4, we7, vo7); - CEX(we5, vo5, we6, vo6); - CEX(we5, vo5, we7, vo7); - CEX(we6, vo6, we7, vo7); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5 - we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo6; /* Move to next vertex */ - vwe = we6 - we7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - vof += vo7; /* Move to next vertex */ - vwe = we7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k105_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x31, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x30, - 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k105_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0xd4, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0xd6, 0x83, 0xbf, 0x8b, 0x22, 0xe2, 0xb7, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 16 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 16 - Output channel 0 increment = 3 - Output channel 1 bits = 16 - Output channel 1 increment = 3 - Output channel 2 bits = 16 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 11 - Interpolation table max resolution = 2048 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp index, weighting and vertex offset */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 6) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k106( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - { - unsigned int ti; /* Input table entry variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - wo0 = (ti & 0x1fffff); /* Extract weighting/vertex offset value */ - ti_i = (ti >> 21); /* Extract interpolation table value */ - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0xf); /* Extract offset value */ - wo0 = (wo0 >> 4); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo0; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k106_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x33, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x30, - 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k106_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 16 - Input channel 0 increment = 3 - Input channel 1 bits = 16 - Input channel 1 increment = 3 - Input channel 2 bits = 16 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 16 - Output channel 0 increment = 3 - Output channel 1 bits = 16 - Output channel 1 increment = 3 - Output channel 2 bits = 16 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 16 - Interpolation table max resolution = 40 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned short *)((p) + 0 + (off) * 6)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 2 + (off) * 6)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 6) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k107( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo1, wo2); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fff); /* Extract offset value */ - wo0 = (wo0 >> 15); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fff); /* Extract offset value */ - wo1 = (wo1 >> 15); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fff); /* Extract offset value */ - wo2 = (wo2 >> 15); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k107_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x33, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x30, - 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k107_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 16 - Input channel 0 increment = 4 - Input channel 1 bits = 16 - Input channel 1 increment = 4 - Input channel 2 bits = 16 - Input channel 2 increment = 4 - Input channel 3 bits = 16 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 16 - Output channel 0 increment = 3 - Output channel 1 bits = 16 - Output channel 1 increment = 3 - Output channel 2 bits = 16 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 21 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 6) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k108( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo2, wo3); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fff); /* Extract offset value */ - wo0 = (wo0 >> 15); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fff); /* Extract offset value */ - wo1 = (wo1 >> 15); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fff); /* Extract offset value */ - wo2 = (wo2 >> 15); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fff); /* Extract offset value */ - wo3 = (wo3 >> 15); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k108_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x33, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x30, - 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k108_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 16 - Input channel 0 increment = 5 - Input channel 1 bits = 16 - Input channel 1 increment = 5 - Input channel 2 bits = 16 - Input channel 2 increment = 5 - Input channel 3 bits = 16 - Input channel 3 increment = 5 - Input channel 4 bits = 16 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 16 - Output channel 0 increment = 3 - Output channel 1 bits = 16 - Output channel 1 increment = 3 - Output channel 2 bits = 16 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 84 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 6) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k109( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we3, vo3, we4, vo4); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k109_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x33, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x30, - 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k109_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 16 - Input channel 0 increment = 6 - Input channel 1 bits = 16 - Input channel 1 increment = 6 - Input channel 2 bits = 16 - Input channel 2 increment = 6 - Input channel 3 bits = 16 - Input channel 3 increment = 6 - Input channel 4 bits = 16 - Input channel 4 increment = 6 - Input channel 5 bits = 16 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 16 - Output channel 0 increment = 3 - Output channel 1 bits = 16 - Output channel 1 increment = 3 - Output channel 2 bits = 16 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 40 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 6) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k110( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we4, vo4, we5, vo5); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k110_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x33, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x31, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k110_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 16 - Input channel 0 increment = 7 - Input channel 1 bits = 16 - Input channel 1 increment = 7 - Input channel 2 bits = 16 - Input channel 2 increment = 7 - Input channel 3 bits = 16 - Input channel 3 increment = 7 - Input channel 4 bits = 16 - Input channel 4 increment = 7 - Input channel 5 bits = 16 - Input channel 5 increment = 7 - Input channel 6 bits = 16 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 16 - Output channel 0 increment = 3 - Output channel 1 bits = 16 - Output channel 1 increment = 3 - Output channel 2 bits = 16 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 23 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 6) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k111( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - unsigned int we6; /* Weighting value variable */ - unsigned int vo6; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - we6 = IT_WE(it6, ip0[6]); - vo6 = IT_VO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we0, vo0, we6, vo6); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we1, vo1, we6, vo6); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we2, vo2, we6, vo6); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we3, vo3, we6, vo6); - CEX(we4, vo4, we5, vo5); - CEX(we4, vo4, we6, vo6); - CEX(we5, vo5, we6, vo6); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5 - we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo6; /* Move to next vertex */ - vwe = we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k111_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x33, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x31, - 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k111_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 16 - Input channel 0 increment = 8 - Input channel 1 bits = 16 - Input channel 1 increment = 8 - Input channel 2 bits = 16 - Input channel 2 increment = 8 - Input channel 3 bits = 16 - Input channel 3 increment = 8 - Input channel 4 bits = 16 - Input channel 4 increment = 8 - Input channel 5 bits = 16 - Input channel 5 increment = 8 - Input channel 6 bits = 16 - Input channel 6 increment = 8 - Input channel 7 bits = 16 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 3 - Output channel 0 bits = 16 - Output channel 0 increment = 3 - Output channel 1 bits = 16 - Output channel 1 increment = 3 - Output channel 2 bits = 16 - Output channel 2 increment = 3 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 16 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 6) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k112( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 3) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - unsigned int we6; /* Weighting value variable */ - unsigned int vo6; /* Vertex offset variable */ - unsigned int we7; /* Weighting value variable */ - unsigned int vo7; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - we6 = IT_WE(it6, ip0[6]); - vo6 = IT_VO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - we7 = IT_WE(it7, ip0[7]); - vo7 = IT_VO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we0, vo0, we6, vo6); - CEX(we0, vo0, we7, vo7); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we1, vo1, we6, vo6); - CEX(we1, vo1, we7, vo7); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we2, vo2, we6, vo6); - CEX(we2, vo2, we7, vo7); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we3, vo3, we6, vo6); - CEX(we3, vo3, we7, vo7); - CEX(we4, vo4, we5, vo5); - CEX(we4, vo4, we6, vo6); - CEX(we4, vo4, we7, vo7); - CEX(we5, vo5, we6, vo6); - CEX(we5, vo5, we7, vo7); - CEX(we6, vo6, we7, vo7); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5 - we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo6; /* Move to next vertex */ - vwe = we6 - we7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - vof += vo7; /* Move to next vertex */ - vwe = we7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k112_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x33, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x31, - 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k112_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf4, 0xd5, 0x83, 0xbf, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 16 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 16 - Output channel 0 increment = 4 - Output channel 1 bits = 16 - Output channel 1 increment = 4 - Output channel 2 bits = 16 - Output channel 2 increment = 4 - Output channel 3 bits = 16 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 12 - Interpolation table max resolution = 4095 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp index, weighting and vertex offset */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 8 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k113( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - { - unsigned int ti; /* Input table entry variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - wo0 = (ti & 0xfffff); /* Extract weighting/vertex offset value */ - ti_i = (ti >> 20); /* Extract interpolation table value */ - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7); /* Extract offset value */ - wo0 = (wo0 >> 3); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo0; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k113_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x34, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x31, - 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k113_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 16 - Input channel 0 increment = 3 - Input channel 1 bits = 16 - Input channel 1 increment = 3 - Input channel 2 bits = 16 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 16 - Output channel 0 increment = 4 - Output channel 1 bits = 16 - Output channel 1 increment = 4 - Output channel 2 bits = 16 - Output channel 2 increment = 4 - Output channel 3 bits = 16 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 16 - Interpolation table max resolution = 40 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned short *)((p) + 0 + (off) * 6)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 2 + (off) * 6)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 8 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k114( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo1, wo2); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fff); /* Extract offset value */ - wo0 = (wo0 >> 15); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fff); /* Extract offset value */ - wo1 = (wo1 >> 15); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fff); /* Extract offset value */ - wo2 = (wo2 >> 15); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k114_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x34, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x31, - 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k114_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 16 - Input channel 0 increment = 4 - Input channel 1 bits = 16 - Input channel 1 increment = 4 - Input channel 2 bits = 16 - Input channel 2 increment = 4 - Input channel 3 bits = 16 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 16 - Output channel 0 increment = 4 - Output channel 1 bits = 16 - Output channel 1 increment = 4 - Output channel 2 bits = 16 - Output channel 2 increment = 4 - Output channel 3 bits = 16 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 31 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 8 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k115( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo2, wo3); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fff); /* Extract offset value */ - wo0 = (wo0 >> 15); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fff); /* Extract offset value */ - wo1 = (wo1 >> 15); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fff); /* Extract offset value */ - wo2 = (wo2 >> 15); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fff); /* Extract offset value */ - wo3 = (wo3 >> 15); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k115_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x34, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x31, - 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k115_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 16 - Input channel 0 increment = 5 - Input channel 1 bits = 16 - Input channel 1 increment = 5 - Input channel 2 bits = 16 - Input channel 2 increment = 5 - Input channel 3 bits = 16 - Input channel 3 increment = 5 - Input channel 4 bits = 16 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 16 - Output channel 0 increment = 4 - Output channel 1 bits = 16 - Output channel 1 increment = 4 - Output channel 2 bits = 16 - Output channel 2 increment = 4 - Output channel 3 bits = 16 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 84 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 8 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k116( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we3, vo3, we4, vo4); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k116_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x34, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x31, - 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k116_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 16 - Input channel 0 increment = 6 - Input channel 1 bits = 16 - Input channel 1 increment = 6 - Input channel 2 bits = 16 - Input channel 2 increment = 6 - Input channel 3 bits = 16 - Input channel 3 increment = 6 - Input channel 4 bits = 16 - Input channel 4 increment = 6 - Input channel 5 bits = 16 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 16 - Output channel 0 increment = 4 - Output channel 1 bits = 16 - Output channel 1 increment = 4 - Output channel 2 bits = 16 - Output channel 2 increment = 4 - Output channel 3 bits = 16 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 40 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 8 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k117( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we4, vo4, we5, vo5); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k117_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x34, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x31, - 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k117_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 16 - Input channel 0 increment = 7 - Input channel 1 bits = 16 - Input channel 1 increment = 7 - Input channel 2 bits = 16 - Input channel 2 increment = 7 - Input channel 3 bits = 16 - Input channel 3 increment = 7 - Input channel 4 bits = 16 - Input channel 4 increment = 7 - Input channel 5 bits = 16 - Input channel 5 increment = 7 - Input channel 6 bits = 16 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 16 - Output channel 0 increment = 4 - Output channel 1 bits = 16 - Output channel 1 increment = 4 - Output channel 2 bits = 16 - Output channel 2 increment = 4 - Output channel 3 bits = 16 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 23 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 8 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k118( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - unsigned int we6; /* Weighting value variable */ - unsigned int vo6; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - we6 = IT_WE(it6, ip0[6]); - vo6 = IT_VO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we0, vo0, we6, vo6); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we1, vo1, we6, vo6); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we2, vo2, we6, vo6); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we3, vo3, we6, vo6); - CEX(we4, vo4, we5, vo5); - CEX(we4, vo4, we6, vo6); - CEX(we5, vo5, we6, vo6); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5 - we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo6; /* Move to next vertex */ - vwe = we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k118_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x34, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x31, - 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k118_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 16 - Input channel 0 increment = 8 - Input channel 1 bits = 16 - Input channel 1 increment = 8 - Input channel 2 bits = 16 - Input channel 2 increment = 8 - Input channel 3 bits = 16 - Input channel 3 increment = 8 - Input channel 4 bits = 16 - Input channel 4 increment = 8 - Input channel 5 bits = 16 - Input channel 5 increment = 8 - Input channel 6 bits = 16 - Input channel 6 increment = 8 - Input channel 7 bits = 16 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 4 - Output channel 0 bits = 16 - Output channel 0 increment = 4 - Output channel 1 bits = 16 - Output channel 1 increment = 4 - Output channel 2 bits = 16 - Output channel 2 increment = 4 - Output channel 3 bits = 16 - Output channel 3 increment = 4 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 16 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 8) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 8 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k119( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 4) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - unsigned int we6; /* Weighting value variable */ - unsigned int vo6; /* Vertex offset variable */ - unsigned int we7; /* Weighting value variable */ - unsigned int vo7; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - we6 = IT_WE(it6, ip0[6]); - vo6 = IT_VO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - we7 = IT_WE(it7, ip0[7]); - vo7 = IT_VO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we0, vo0, we6, vo6); - CEX(we0, vo0, we7, vo7); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we1, vo1, we6, vo6); - CEX(we1, vo1, we7, vo7); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we2, vo2, we6, vo6); - CEX(we2, vo2, we7, vo7); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we3, vo3, we6, vo6); - CEX(we3, vo3, we7, vo7); - CEX(we4, vo4, we5, vo5); - CEX(we4, vo4, we6, vo6); - CEX(we4, vo4, we7, vo7); - CEX(we5, vo5, we6, vo6); - CEX(we5, vo5, we7, vo7); - CEX(we6, vo6, we7, vo7); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5 - we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo6; /* Move to next vertex */ - vwe = we6 - we7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - vof += vo7; /* Move to next vertex */ - vwe = we7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k119_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x34, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x31, - 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k119_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xca, 0x04, 0x08, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 16 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 16 - Output channel 0 increment = 5 - Output channel 1 bits = 16 - Output channel 1 increment = 5 - Output channel 2 bits = 16 - Output channel 2 increment = 5 - Output channel 3 bits = 16 - Output channel 3 increment = 5 - Output channel 4 bits = 16 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 10 - Interpolation table max resolution = 1024 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp index, weighting and vertex offset */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 10) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k120( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - { - unsigned int ti; /* Input table entry variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - wo0 = (ti & 0x3fffff); /* Extract weighting/vertex offset value */ - ti_i = (ti >> 22); /* Extract interpolation table value */ - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x1f); /* Extract offset value */ - wo0 = (wo0 >> 5); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo0; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k120_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x35, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x32, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k120_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 16 - Input channel 0 increment = 3 - Input channel 1 bits = 16 - Input channel 1 increment = 3 - Input channel 2 bits = 16 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 16 - Output channel 0 increment = 5 - Output channel 1 bits = 16 - Output channel 1 increment = 5 - Output channel 2 bits = 16 - Output channel 2 increment = 5 - Output channel 3 bits = 16 - Output channel 3 increment = 5 - Output channel 4 bits = 16 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 16 - Interpolation table max resolution = 40 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned short *)((p) + 0 + (off) * 6)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 2 + (off) * 6)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 10) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k121( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo1, wo2); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fff); /* Extract offset value */ - wo0 = (wo0 >> 15); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fff); /* Extract offset value */ - wo1 = (wo1 >> 15); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fff); /* Extract offset value */ - wo2 = (wo2 >> 15); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k121_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x35, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x32, - 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k121_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 16 - Input channel 0 increment = 4 - Input channel 1 bits = 16 - Input channel 1 increment = 4 - Input channel 2 bits = 16 - Input channel 2 increment = 4 - Input channel 3 bits = 16 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 16 - Output channel 0 increment = 5 - Output channel 1 bits = 16 - Output channel 1 increment = 5 - Output channel 2 bits = 16 - Output channel 2 increment = 5 - Output channel 3 bits = 16 - Output channel 3 increment = 5 - Output channel 4 bits = 16 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 18 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 10) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k122( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo2, wo3); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fff); /* Extract offset value */ - wo0 = (wo0 >> 15); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fff); /* Extract offset value */ - wo1 = (wo1 >> 15); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fff); /* Extract offset value */ - wo2 = (wo2 >> 15); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fff); /* Extract offset value */ - wo3 = (wo3 >> 15); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k122_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x35, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x32, - 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k122_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 16 - Input channel 0 increment = 5 - Input channel 1 bits = 16 - Input channel 1 increment = 5 - Input channel 2 bits = 16 - Input channel 2 increment = 5 - Input channel 3 bits = 16 - Input channel 3 increment = 5 - Input channel 4 bits = 16 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 16 - Output channel 0 increment = 5 - Output channel 1 bits = 16 - Output channel 1 increment = 5 - Output channel 2 bits = 16 - Output channel 2 increment = 5 - Output channel 3 bits = 16 - Output channel 3 increment = 5 - Output channel 4 bits = 16 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 84 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 10) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k123( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we3, vo3, we4, vo4); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k123_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x35, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x32, - 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k123_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 16 - Input channel 0 increment = 6 - Input channel 1 bits = 16 - Input channel 1 increment = 6 - Input channel 2 bits = 16 - Input channel 2 increment = 6 - Input channel 3 bits = 16 - Input channel 3 increment = 6 - Input channel 4 bits = 16 - Input channel 4 increment = 6 - Input channel 5 bits = 16 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 16 - Output channel 0 increment = 5 - Output channel 1 bits = 16 - Output channel 1 increment = 5 - Output channel 2 bits = 16 - Output channel 2 increment = 5 - Output channel 3 bits = 16 - Output channel 3 increment = 5 - Output channel 4 bits = 16 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 40 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 10) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k124( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we4, vo4, we5, vo5); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k124_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x35, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x32, - 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k124_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 16 - Input channel 0 increment = 7 - Input channel 1 bits = 16 - Input channel 1 increment = 7 - Input channel 2 bits = 16 - Input channel 2 increment = 7 - Input channel 3 bits = 16 - Input channel 3 increment = 7 - Input channel 4 bits = 16 - Input channel 4 increment = 7 - Input channel 5 bits = 16 - Input channel 5 increment = 7 - Input channel 6 bits = 16 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 16 - Output channel 0 increment = 5 - Output channel 1 bits = 16 - Output channel 1 increment = 5 - Output channel 2 bits = 16 - Output channel 2 increment = 5 - Output channel 3 bits = 16 - Output channel 3 increment = 5 - Output channel 4 bits = 16 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 23 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 10) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k125( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - unsigned int we6; /* Weighting value variable */ - unsigned int vo6; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - we6 = IT_WE(it6, ip0[6]); - vo6 = IT_VO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we0, vo0, we6, vo6); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we1, vo1, we6, vo6); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we2, vo2, we6, vo6); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we3, vo3, we6, vo6); - CEX(we4, vo4, we5, vo5); - CEX(we4, vo4, we6, vo6); - CEX(we5, vo5, we6, vo6); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5 - we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo6; /* Move to next vertex */ - vwe = we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k125_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x35, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x32, - 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k125_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 16 - Input channel 0 increment = 8 - Input channel 1 bits = 16 - Input channel 1 increment = 8 - Input channel 2 bits = 16 - Input channel 2 increment = 8 - Input channel 3 bits = 16 - Input channel 3 increment = 8 - Input channel 4 bits = 16 - Input channel 4 increment = 8 - Input channel 5 bits = 16 - Input channel 5 increment = 8 - Input channel 6 bits = 16 - Input channel 6 increment = 8 - Input channel 7 bits = 16 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 5 - Output channel 0 bits = 16 - Output channel 0 increment = 5 - Output channel 1 bits = 16 - Output channel 1 increment = 5 - Output channel 2 bits = 16 - Output channel 2 increment = 5 - Output channel 3 bits = 16 - Output channel 3 increment = 5 - Output channel 4 bits = 16 - Output channel 4 increment = 5 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 16 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 10) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k126( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 5) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - unsigned int we6; /* Weighting value variable */ - unsigned int vo6; /* Vertex offset variable */ - unsigned int we7; /* Weighting value variable */ - unsigned int vo7; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - we6 = IT_WE(it6, ip0[6]); - vo6 = IT_VO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - we7 = IT_WE(it7, ip0[7]); - vo7 = IT_VO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we0, vo0, we6, vo6); - CEX(we0, vo0, we7, vo7); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we1, vo1, we6, vo6); - CEX(we1, vo1, we7, vo7); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we2, vo2, we6, vo6); - CEX(we2, vo2, we7, vo7); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we3, vo3, we6, vo6); - CEX(we3, vo3, we7, vo7); - CEX(we4, vo4, we5, vo5); - CEX(we4, vo4, we6, vo6); - CEX(we4, vo4, we7, vo7); - CEX(we5, vo5, we6, vo6); - CEX(we5, vo5, we7, vo7); - CEX(we6, vo6, we7, vo7); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5 - we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo6; /* Move to next vertex */ - vwe = we6 - we7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - vof += vo7; /* Move to next vertex */ - vwe = we7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k126_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x35, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x32, - 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k126_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0xd6, 0x83, 0xbf, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x22, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 16 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 16 - Output channel 0 increment = 6 - Output channel 1 bits = 16 - Output channel 1 increment = 6 - Output channel 2 bits = 16 - Output channel 2 increment = 6 - Output channel 3 bits = 16 - Output channel 3 increment = 6 - Output channel 4 bits = 16 - Output channel 4 increment = 6 - Output channel 5 bits = 16 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 11 - Interpolation table max resolution = 2048 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp index, weighting and vertex offset */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 4 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k127( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - { - unsigned int ti; /* Input table entry variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - wo0 = (ti & 0x1fffff); /* Extract weighting/vertex offset value */ - ti_i = (ti >> 21); /* Extract interpolation table value */ - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0xf); /* Extract offset value */ - wo0 = (wo0 >> 4); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo0; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k127_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x36, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x32, - 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k127_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 16 - Input channel 0 increment = 3 - Input channel 1 bits = 16 - Input channel 1 increment = 3 - Input channel 2 bits = 16 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 16 - Output channel 0 increment = 6 - Output channel 1 bits = 16 - Output channel 1 increment = 6 - Output channel 2 bits = 16 - Output channel 2 increment = 6 - Output channel 3 bits = 16 - Output channel 3 increment = 6 - Output channel 4 bits = 16 - Output channel 4 increment = 6 - Output channel 5 bits = 16 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 16 - Interpolation table max resolution = 40 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned short *)((p) + 0 + (off) * 6)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 2 + (off) * 6)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 4 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k128( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo1, wo2); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fff); /* Extract offset value */ - wo0 = (wo0 >> 15); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fff); /* Extract offset value */ - wo1 = (wo1 >> 15); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fff); /* Extract offset value */ - wo2 = (wo2 >> 15); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k128_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x36, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x32, - 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k128_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 16 - Input channel 0 increment = 4 - Input channel 1 bits = 16 - Input channel 1 increment = 4 - Input channel 2 bits = 16 - Input channel 2 increment = 4 - Input channel 3 bits = 16 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 16 - Output channel 0 increment = 6 - Output channel 1 bits = 16 - Output channel 1 increment = 6 - Output channel 2 bits = 16 - Output channel 2 increment = 6 - Output channel 3 bits = 16 - Output channel 3 increment = 6 - Output channel 4 bits = 16 - Output channel 4 increment = 6 - Output channel 5 bits = 16 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 21 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 4 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k129( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo2, wo3); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fff); /* Extract offset value */ - wo0 = (wo0 >> 15); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fff); /* Extract offset value */ - wo1 = (wo1 >> 15); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fff); /* Extract offset value */ - wo2 = (wo2 >> 15); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fff); /* Extract offset value */ - wo3 = (wo3 >> 15); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k129_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x36, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x32, - 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k129_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 16 - Input channel 0 increment = 5 - Input channel 1 bits = 16 - Input channel 1 increment = 5 - Input channel 2 bits = 16 - Input channel 2 increment = 5 - Input channel 3 bits = 16 - Input channel 3 increment = 5 - Input channel 4 bits = 16 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 16 - Output channel 0 increment = 6 - Output channel 1 bits = 16 - Output channel 1 increment = 6 - Output channel 2 bits = 16 - Output channel 2 increment = 6 - Output channel 3 bits = 16 - Output channel 3 increment = 6 - Output channel 4 bits = 16 - Output channel 4 increment = 6 - Output channel 5 bits = 16 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 84 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 4 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k130( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we3, vo3, we4, vo4); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k130_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x36, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x33, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k130_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 16 - Input channel 0 increment = 6 - Input channel 1 bits = 16 - Input channel 1 increment = 6 - Input channel 2 bits = 16 - Input channel 2 increment = 6 - Input channel 3 bits = 16 - Input channel 3 increment = 6 - Input channel 4 bits = 16 - Input channel 4 increment = 6 - Input channel 5 bits = 16 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 16 - Output channel 0 increment = 6 - Output channel 1 bits = 16 - Output channel 1 increment = 6 - Output channel 2 bits = 16 - Output channel 2 increment = 6 - Output channel 3 bits = 16 - Output channel 3 increment = 6 - Output channel 4 bits = 16 - Output channel 4 increment = 6 - Output channel 5 bits = 16 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 40 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 4 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k131( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we4, vo4, we5, vo5); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k131_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x36, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x33, - 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k131_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 16 - Input channel 0 increment = 7 - Input channel 1 bits = 16 - Input channel 1 increment = 7 - Input channel 2 bits = 16 - Input channel 2 increment = 7 - Input channel 3 bits = 16 - Input channel 3 increment = 7 - Input channel 4 bits = 16 - Input channel 4 increment = 7 - Input channel 5 bits = 16 - Input channel 5 increment = 7 - Input channel 6 bits = 16 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 16 - Output channel 0 increment = 6 - Output channel 1 bits = 16 - Output channel 1 increment = 6 - Output channel 2 bits = 16 - Output channel 2 increment = 6 - Output channel 3 bits = 16 - Output channel 3 increment = 6 - Output channel 4 bits = 16 - Output channel 4 increment = 6 - Output channel 5 bits = 16 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 23 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 4 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k132( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - unsigned int we6; /* Weighting value variable */ - unsigned int vo6; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - we6 = IT_WE(it6, ip0[6]); - vo6 = IT_VO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we0, vo0, we6, vo6); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we1, vo1, we6, vo6); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we2, vo2, we6, vo6); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we3, vo3, we6, vo6); - CEX(we4, vo4, we5, vo5); - CEX(we4, vo4, we6, vo6); - CEX(we5, vo5, we6, vo6); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5 - we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo6; /* Move to next vertex */ - vwe = we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k132_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x36, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x33, - 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k132_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 16 - Input channel 0 increment = 8 - Input channel 1 bits = 16 - Input channel 1 increment = 8 - Input channel 2 bits = 16 - Input channel 2 increment = 8 - Input channel 3 bits = 16 - Input channel 3 increment = 8 - Input channel 4 bits = 16 - Input channel 4 increment = 8 - Input channel 5 bits = 16 - Input channel 5 increment = 8 - Input channel 6 bits = 16 - Input channel 6 increment = 8 - Input channel 7 bits = 16 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 6 - Output channel 0 bits = 16 - Output channel 0 increment = 6 - Output channel 1 bits = 16 - Output channel 1 increment = 6 - Output channel 2 bits = 16 - Output channel 2 increment = 6 - Output channel 3 bits = 16 - Output channel 3 increment = 6 - Output channel 4 bits = 16 - Output channel 4 increment = 6 - Output channel 5 bits = 16 - Output channel 5 increment = 6 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 16 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 12) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 4 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k133( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 6) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - unsigned int we6; /* Weighting value variable */ - unsigned int vo6; /* Vertex offset variable */ - unsigned int we7; /* Weighting value variable */ - unsigned int vo7; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - we6 = IT_WE(it6, ip0[6]); - vo6 = IT_VO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - we7 = IT_WE(it7, ip0[7]); - vo7 = IT_VO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we0, vo0, we6, vo6); - CEX(we0, vo0, we7, vo7); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we1, vo1, we6, vo6); - CEX(we1, vo1, we7, vo7); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we2, vo2, we6, vo6); - CEX(we2, vo2, we7, vo7); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we3, vo3, we6, vo6); - CEX(we3, vo3, we7, vo7); - CEX(we4, vo4, we5, vo5); - CEX(we4, vo4, we6, vo6); - CEX(we4, vo4, we7, vo7); - CEX(we5, vo5, we6, vo6); - CEX(we5, vo5, we7, vo7); - CEX(we6, vo6, we7, vo7); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5 - we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo6; /* Move to next vertex */ - vwe = we6 - we7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - vof += vo7; /* Move to next vertex */ - vwe = we7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k133_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x36, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x33, - 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k133_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0xda, 0x83, 0xbf, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 16 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 16 - Output channel 0 increment = 7 - Output channel 1 bits = 16 - Output channel 1 increment = 7 - Output channel 2 bits = 16 - Output channel 2 increment = 7 - Output channel 3 bits = 16 - Output channel 3 increment = 7 - Output channel 4 bits = 16 - Output channel 4 increment = 7 - Output channel 5 bits = 16 - Output channel 5 increment = 7 - Output channel 6 bits = 16 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 10 - Interpolation table max resolution = 1024 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp index, weighting and vertex offset */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 14) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k134( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - unsigned int ova6; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - { - unsigned int ti; /* Input table entry variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - wo0 = (ti & 0x3fffff); /* Extract weighting/vertex offset value */ - ti_i = (ti >> 22); /* Extract interpolation table value */ - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x1f); /* Extract offset value */ - wo0 = (wo0 >> 5); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 = IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo0; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova6 >> 16) & 0xffff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k134_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x37, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x33, - 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k134_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 16 - Input channel 0 increment = 3 - Input channel 1 bits = 16 - Input channel 1 increment = 3 - Input channel 2 bits = 16 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 16 - Output channel 0 increment = 7 - Output channel 1 bits = 16 - Output channel 1 increment = 7 - Output channel 2 bits = 16 - Output channel 2 increment = 7 - Output channel 3 bits = 16 - Output channel 3 increment = 7 - Output channel 4 bits = 16 - Output channel 4 increment = 7 - Output channel 5 bits = 16 - Output channel 5 increment = 7 - Output channel 6 bits = 16 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 16 - Interpolation table max resolution = 40 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned short *)((p) + 0 + (off) * 6)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 2 + (off) * 6)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 14) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k135( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - unsigned int ova6; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo1, wo2); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fff); /* Extract offset value */ - wo0 = (wo0 >> 15); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 = IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fff); /* Extract offset value */ - wo1 = (wo1 >> 15); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fff); /* Extract offset value */ - wo2 = (wo2 >> 15); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova6 >> 16) & 0xffff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k135_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x37, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x33, - 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k135_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 16 - Input channel 0 increment = 4 - Input channel 1 bits = 16 - Input channel 1 increment = 4 - Input channel 2 bits = 16 - Input channel 2 increment = 4 - Input channel 3 bits = 16 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 16 - Output channel 0 increment = 7 - Output channel 1 bits = 16 - Output channel 1 increment = 7 - Output channel 2 bits = 16 - Output channel 2 increment = 7 - Output channel 3 bits = 16 - Output channel 3 increment = 7 - Output channel 4 bits = 16 - Output channel 4 increment = 7 - Output channel 5 bits = 16 - Output channel 5 increment = 7 - Output channel 6 bits = 16 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 255 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 14) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k136( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - unsigned int ova6; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we2, vo2, we3, vo3); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 = IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova6 >> 16) & 0xffff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k136_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x37, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x33, - 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k136_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 16 - Input channel 0 increment = 5 - Input channel 1 bits = 16 - Input channel 1 increment = 5 - Input channel 2 bits = 16 - Input channel 2 increment = 5 - Input channel 3 bits = 16 - Input channel 3 increment = 5 - Input channel 4 bits = 16 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 16 - Output channel 0 increment = 7 - Output channel 1 bits = 16 - Output channel 1 increment = 7 - Output channel 2 bits = 16 - Output channel 2 increment = 7 - Output channel 3 bits = 16 - Output channel 3 increment = 7 - Output channel 4 bits = 16 - Output channel 4 increment = 7 - Output channel 5 bits = 16 - Output channel 5 increment = 7 - Output channel 6 bits = 16 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 84 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 14) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k137( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - unsigned int ova6; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we3, vo3, we4, vo4); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 = IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova6 >> 16) & 0xffff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k137_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x37, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x33, - 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k137_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 16 - Input channel 0 increment = 6 - Input channel 1 bits = 16 - Input channel 1 increment = 6 - Input channel 2 bits = 16 - Input channel 2 increment = 6 - Input channel 3 bits = 16 - Input channel 3 increment = 6 - Input channel 4 bits = 16 - Input channel 4 increment = 6 - Input channel 5 bits = 16 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 16 - Output channel 0 increment = 7 - Output channel 1 bits = 16 - Output channel 1 increment = 7 - Output channel 2 bits = 16 - Output channel 2 increment = 7 - Output channel 3 bits = 16 - Output channel 3 increment = 7 - Output channel 4 bits = 16 - Output channel 4 increment = 7 - Output channel 5 bits = 16 - Output channel 5 increment = 7 - Output channel 6 bits = 16 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 40 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 14) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k138( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - unsigned int ova6; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we4, vo4, we5, vo5); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 = IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova6 >> 16) & 0xffff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k138_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x37, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x33, - 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k138_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 16 - Input channel 0 increment = 7 - Input channel 1 bits = 16 - Input channel 1 increment = 7 - Input channel 2 bits = 16 - Input channel 2 increment = 7 - Input channel 3 bits = 16 - Input channel 3 increment = 7 - Input channel 4 bits = 16 - Input channel 4 increment = 7 - Input channel 5 bits = 16 - Input channel 5 increment = 7 - Input channel 6 bits = 16 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 16 - Output channel 0 increment = 7 - Output channel 1 bits = 16 - Output channel 1 increment = 7 - Output channel 2 bits = 16 - Output channel 2 increment = 7 - Output channel 3 bits = 16 - Output channel 3 increment = 7 - Output channel 4 bits = 16 - Output channel 4 increment = 7 - Output channel 5 bits = 16 - Output channel 5 increment = 7 - Output channel 6 bits = 16 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 23 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 14) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k139( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - unsigned int ova6; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - unsigned int we6; /* Weighting value variable */ - unsigned int vo6; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - we6 = IT_WE(it6, ip0[6]); - vo6 = IT_VO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we0, vo0, we6, vo6); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we1, vo1, we6, vo6); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we2, vo2, we6, vo6); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we3, vo3, we6, vo6); - CEX(we4, vo4, we5, vo5); - CEX(we4, vo4, we6, vo6); - CEX(we5, vo5, we6, vo6); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 = IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5 - we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo6; /* Move to next vertex */ - vwe = we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova6 >> 16) & 0xffff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k139_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x37, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x33, - 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k139_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 16 - Input channel 0 increment = 8 - Input channel 1 bits = 16 - Input channel 1 increment = 8 - Input channel 2 bits = 16 - Input channel 2 increment = 8 - Input channel 3 bits = 16 - Input channel 3 increment = 8 - Input channel 4 bits = 16 - Input channel 4 increment = 8 - Input channel 5 bits = 16 - Input channel 5 increment = 8 - Input channel 6 bits = 16 - Input channel 6 increment = 8 - Input channel 7 bits = 16 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 7 - Output channel 0 bits = 16 - Output channel 0 increment = 7 - Output channel 1 bits = 16 - Output channel 1 increment = 7 - Output channel 2 bits = 16 - Output channel 2 increment = 7 - Output channel 3 bits = 16 - Output channel 3 increment = 7 - Output channel 4 bits = 16 - Output channel 4 increment = 7 - Output channel 5 bits = 16 - Output channel 5 increment = 7 - Output channel 6 bits = 16 - Output channel 6 increment = 7 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 16 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 14) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 2 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k140( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 7) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - unsigned int ova6; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - unsigned int we6; /* Weighting value variable */ - unsigned int vo6; /* Vertex offset variable */ - unsigned int we7; /* Weighting value variable */ - unsigned int vo7; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - we6 = IT_WE(it6, ip0[6]); - vo6 = IT_VO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - we7 = IT_WE(it7, ip0[7]); - vo7 = IT_VO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we0, vo0, we6, vo6); - CEX(we0, vo0, we7, vo7); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we1, vo1, we6, vo6); - CEX(we1, vo1, we7, vo7); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we2, vo2, we6, vo6); - CEX(we2, vo2, we7, vo7); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we3, vo3, we6, vo6); - CEX(we3, vo3, we7, vo7); - CEX(we4, vo4, we5, vo5); - CEX(we4, vo4, we6, vo6); - CEX(we4, vo4, we7, vo7); - CEX(we5, vo5, we6, vo6); - CEX(we5, vo5, we7, vo7); - CEX(we6, vo6, we7, vo7); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 = IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5 - we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo6; /* Move to next vertex */ - vwe = we6 - we7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - vof += vo7; /* Move to next vertex */ - vwe = we7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova6 >> 16) & 0xffff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k140_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x37, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x34, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k140_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdc, 0x60, 0xef, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x14, 0xda, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 1 - Input channel 0 bits = 16 - Input channel 0 increment = 1 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 16 - Output channel 0 increment = 8 - Output channel 1 bits = 16 - Output channel 1 increment = 8 - Output channel 2 bits = 16 - Output channel 2 increment = 8 - Output channel 3 bits = 16 - Output channel 3 increment = 8 - Output channel 4 bits = 16 - Output channel 4 increment = 8 - Output channel 5 bits = 16 - Output channel 5 increment = 8 - Output channel 6 bits = 16 - Output channel 6 increment = 8 - Output channel 7 bits = 16 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 11 - Interpolation table max resolution = 2048 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp index, weighting and vertex offset */ -#define IT_IT(p, off) *((unsigned int *)((p) + 0 + (off) * 4)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 8 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k141( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 1 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 1, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - unsigned int ova6; /* Output value accumulator */ - unsigned int ova7; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - { - unsigned int ti; /* Input table entry variable */ - unsigned int ti_i; /* Interpolation index variable */ - - ti = IT_IT(it0, ip0[0]); - wo0 = (ti & 0x1fffff); /* Extract weighting/vertex offset value */ - ti_i = (ti >> 21); /* Extract interpolation table value */ - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0xf); /* Extract offset value */ - wo0 = (wo0 >> 4); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 = IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 = IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo0; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova6 >> 16) & 0xffff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova7 >> 16) & 0xffff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_IT -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k141_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x31, 0x5f, 0x38, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x34, - 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k141_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 3 - Input channel 0 bits = 16 - Input channel 0 increment = 3 - Input channel 1 bits = 16 - Input channel 1 increment = 3 - Input channel 2 bits = 16 - Input channel 2 increment = 3 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 16 - Output channel 0 increment = 8 - Output channel 1 bits = 16 - Output channel 1 increment = 8 - Output channel 2 bits = 16 - Output channel 2 increment = 8 - Output channel 3 bits = 16 - Output channel 3 increment = 8 - Output channel 4 bits = 16 - Output channel 4 increment = 8 - Output channel 5 bits = 16 - Output channel 5 increment = 8 - Output channel 6 bits = 16 - Output channel 6 increment = 8 - Output channel 7 bits = 16 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 16 - Interpolation table max resolution = 40 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned short *)((p) + 0 + (off) * 6)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 2 + (off) * 6)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 8 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k142( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 3 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 3, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - unsigned int ova6; /* Output value accumulator */ - unsigned int ova7; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo1, wo2); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fff); /* Extract offset value */ - wo0 = (wo0 >> 15); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 = IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 = IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fff); /* Extract offset value */ - wo1 = (wo1 >> 15); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fff); /* Extract offset value */ - wo2 = (wo2 >> 15); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova6 >> 16) & 0xffff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova7 >> 16) & 0xffff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k142_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x33, 0x5f, 0x38, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x34, - 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k142_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 4 - Input channel 0 bits = 16 - Input channel 0 increment = 4 - Input channel 1 bits = 16 - Input channel 1 increment = 4 - Input channel 2 bits = 16 - Input channel 2 increment = 4 - Input channel 3 bits = 16 - Input channel 3 increment = 4 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 16 - Output channel 0 increment = 8 - Output channel 1 bits = 16 - Output channel 1 increment = 8 - Output channel 2 bits = 16 - Output channel 2 increment = 8 - Output channel 3 bits = 16 - Output channel 3 increment = 8 - Output channel 4 bits = 16 - Output channel 4 increment = 8 - Output channel 5 bits = 16 - Output channel 5 increment = 8 - Output channel 6 bits = 16 - Output channel 6 increment = 8 - Output channel 7 bits = 16 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 25 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 8)) - -/* Input table input weighting/offset value enty */ -#define IT_WO(p, off) *((unsigned int *)((p) + 4 + (off) * 8)) - -/* Conditional exchange for sorting */ -#define CEX(A, B) if (A < B) { A ^= B; B ^= A; A ^= B; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 8 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k143( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 4 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 4, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - unsigned int ova6; /* Output value accumulator */ - unsigned int ova7; /* Output value accumulator */ - { - pointer imp; - unsigned int wo0; /* Weighting value and vertex offset variable */ - unsigned int wo1; /* Weighting value and vertex offset variable */ - unsigned int wo2; /* Weighting value and vertex offset variable */ - unsigned int wo3; /* Weighting value and vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - wo0 = IT_WO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - wo1 = IT_WO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - wo2 = IT_WO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - wo3 = IT_WO(it3, ip0[3]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(wo0, wo1); - CEX(wo0, wo2); - CEX(wo0, wo3); - CEX(wo1, wo2); - CEX(wo1, wo3); - CEX(wo2, wo3); - } - { - unsigned int nvof; /* Next vertex offset value */ - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - nvof = (wo0 & 0x7fff); /* Extract offset value */ - wo0 = (wo0 >> 15); /* Extract weighting value */ - vwe = 65536 - wo0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 = IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 = IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo1 & 0x7fff); /* Extract offset value */ - wo1 = (wo1 >> 15); /* Extract weighting value */ - vwe = wo0 - wo1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo2 & 0x7fff); /* Extract offset value */ - wo2 = (wo2 >> 15); /* Extract weighting value */ - vwe = wo1 - wo2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - nvof = (wo3 & 0x7fff); /* Extract offset value */ - wo3 = (wo3 >> 15); /* Extract weighting value */ - vwe = wo2 - wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += nvof; /* Move to next vertex */ - vwe = wo3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova6 >> 16) & 0xffff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova7 >> 16) & 0xffff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_WO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k143_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x34, 0x5f, 0x38, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x34, - 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k143_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 5 - Input channel 0 bits = 16 - Input channel 0 increment = 5 - Input channel 1 bits = 16 - Input channel 1 increment = 5 - Input channel 2 bits = 16 - Input channel 2 increment = 5 - Input channel 3 bits = 16 - Input channel 3 increment = 5 - Input channel 4 bits = 16 - Input channel 4 increment = 5 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 16 - Output channel 0 increment = 8 - Output channel 1 bits = 16 - Output channel 1 increment = 8 - Output channel 2 bits = 16 - Output channel 2 increment = 8 - Output channel 3 bits = 16 - Output channel 3 increment = 8 - Output channel 4 bits = 16 - Output channel 4 increment = 8 - Output channel 5 bits = 16 - Output channel 5 increment = 8 - Output channel 6 bits = 16 - Output channel 6 increment = 8 - Output channel 7 bits = 16 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 84 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 8 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k144( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 5 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 5, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - unsigned int ova6; /* Output value accumulator */ - unsigned int ova7; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we3, vo3, we4, vo4); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 = IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 = IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova6 >> 16) & 0xffff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova7 >> 16) & 0xffff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k144_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x35, 0x5f, 0x38, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x34, - 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k144_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 6 - Input channel 0 bits = 16 - Input channel 0 increment = 6 - Input channel 1 bits = 16 - Input channel 1 increment = 6 - Input channel 2 bits = 16 - Input channel 2 increment = 6 - Input channel 3 bits = 16 - Input channel 3 increment = 6 - Input channel 4 bits = 16 - Input channel 4 increment = 6 - Input channel 5 bits = 16 - Input channel 5 increment = 6 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 16 - Output channel 0 increment = 8 - Output channel 1 bits = 16 - Output channel 1 increment = 8 - Output channel 2 bits = 16 - Output channel 2 increment = 8 - Output channel 3 bits = 16 - Output channel 3 increment = 8 - Output channel 4 bits = 16 - Output channel 4 increment = 8 - Output channel 5 bits = 16 - Output channel 5 increment = 8 - Output channel 6 bits = 16 - Output channel 6 increment = 8 - Output channel 7 bits = 16 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 40 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 8 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k145( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 6 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 6, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - unsigned int ova6; /* Output value accumulator */ - unsigned int ova7; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we4, vo4, we5, vo5); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 = IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 = IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova6 >> 16) & 0xffff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova7 >> 16) & 0xffff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k145_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x36, 0x5f, 0x38, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x34, - 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k145_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 7 - Input channel 0 bits = 16 - Input channel 0 increment = 7 - Input channel 1 bits = 16 - Input channel 1 increment = 7 - Input channel 2 bits = 16 - Input channel 2 increment = 7 - Input channel 3 bits = 16 - Input channel 3 increment = 7 - Input channel 4 bits = 16 - Input channel 4 increment = 7 - Input channel 5 bits = 16 - Input channel 5 increment = 7 - Input channel 6 bits = 16 - Input channel 6 increment = 7 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 16 - Output channel 0 increment = 8 - Output channel 1 bits = 16 - Output channel 1 increment = 8 - Output channel 2 bits = 16 - Output channel 2 increment = 8 - Output channel 3 bits = 16 - Output channel 3 increment = 8 - Output channel 4 bits = 16 - Output channel 4 increment = 8 - Output channel 5 bits = 16 - Output channel 5 increment = 8 - Output channel 6 bits = 16 - Output channel 6 increment = 8 - Output channel 7 bits = 16 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 23 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 8 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k146( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 7 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 7, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - unsigned int ova6; /* Output value accumulator */ - unsigned int ova7; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - unsigned int we6; /* Weighting value variable */ - unsigned int vo6; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - we6 = IT_WE(it6, ip0[6]); - vo6 = IT_VO(it6, ip0[6]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we0, vo0, we6, vo6); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we1, vo1, we6, vo6); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we2, vo2, we6, vo6); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we3, vo3, we6, vo6); - CEX(we4, vo4, we5, vo5); - CEX(we4, vo4, we6, vo6); - CEX(we5, vo5, we6, vo6); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 = IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 = IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5 - we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo6; /* Move to next vertex */ - vwe = we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova6 >> 16) & 0xffff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova7 >> 16) & 0xffff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k146_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x37, 0x5f, 0x38, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x34, - 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k146_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} - -/* Integer Multi-Dimensional Interpolation */ -/* Interpolation Kernel Code */ -/* Generated by cgen */ -/* Copyright 2000 - 2002 Graeme W. Gill */ -/* This material is licenced under the GNU GENERAL PUBLIC LICENCE :- */ - -/* see the Licence.txt file for licencing details.*/ - -/* - Interpolation kernel specs: - - Input channels per pixel = 8 - Input channel 0 bits = 16 - Input channel 0 increment = 8 - Input channel 1 bits = 16 - Input channel 1 increment = 8 - Input channel 2 bits = 16 - Input channel 2 increment = 8 - Input channel 3 bits = 16 - Input channel 3 increment = 8 - Input channel 4 bits = 16 - Input channel 4 increment = 8 - Input channel 5 bits = 16 - Input channel 5 increment = 8 - Input channel 6 bits = 16 - Input channel 6 increment = 8 - Input channel 7 bits = 16 - Input channel 7 increment = 8 - Input is channel interleaved - Input channels are separate words - Input value extraction is done in input table lookup - - Output channels per pixel = 8 - Output channel 0 bits = 16 - Output channel 0 increment = 8 - Output channel 1 bits = 16 - Output channel 1 increment = 8 - Output channel 2 bits = 16 - Output channel 2 increment = 8 - Output channel 3 bits = 16 - Output channel 3 increment = 8 - Output channel 4 bits = 16 - Output channel 4 increment = 8 - Output channel 5 bits = 16 - Output channel 5 increment = 8 - Output channel 6 bits = 16 - Output channel 6 increment = 8 - Output channel 7 bits = 16 - Output channel 7 increment = 8 - Output is channel interleaved - - Output channels are separate words - Weight+voffset bits = 32 - Interpolation table index bits = 32 - Interpolation table max resolution = 16 - */ - -/* - Machine architecture specs: - - Little endian - Reading and writing pixel values separately - Pointer size = 32 bits - - Ordinal size 8 bits is known as 'unsigned char' - Ordinal size 16 bits is known as 'unsigned short' - Ordinal size 32 bits is known as 'unsigned int' - Natural ordinal is 'unsigned int' - - Integer size 8 bits is known as 'signed char' - Integer size 16 bits is known as 'short' - Integer size 32 bits is known as 'int' - Natural integer is 'int' - - */ - -#ifndef IMDI_INCLUDED -#include -#include "imdi_imp.h" -#define IMDI_INCLUDED -#endif /* IMDI_INCLUDED */ - -#ifndef DEFINED_pointer -#define DEFINED_pointer -typedef unsigned char * pointer; -#endif - -/* Input table interp. index */ -#define IT_IX(p, off) *((unsigned int *)((p) + 0 + (off) * 12)) - -/* Input table input weighting enty */ -#define IT_WE(p, off) *((unsigned int *)((p) + 4 + (off) * 12)) - -/* Input table input offset value enty */ -#define IT_VO(p, off) *((unsigned int *)((p) + 8 + (off) * 12)) - -/* Conditional exchange for sorting */ -#define CEX(A, AA, B, BB) if (A < B) { \ - A ^= B; B ^= A; A ^= B; AA ^= BB; BB ^= AA; AA ^= BB; } - -/* Interpolation multi-dim. table access */ -#define IM_O(off) ((off) * 16) - -/* Interpolation table - get vertex values */ -#define IM_FE(p, v, c) ((unsigned int)*((unsigned short *)((p) + (v) * 8 + (c) * 2))) - -/* Output table indexes */ -#define OT_E(p, off) *((unsigned short *)((p) + (off) * 2)) - -static void -imdi_k147( -imdi *s, /* imdi context */ -void **outp, /* pointer to output pointers */ -void **inp, /* pointer to input pointers */ -unsigned int npix /* Number of pixels to process */ -) { - imdi_imp *p = (imdi_imp *)(s->impl); - unsigned short *ip0 = (unsigned short *)inp[0]; - unsigned short *op0 = (unsigned short *)outp[0]; - unsigned short *ep = ip0 + npix * 8 ; - pointer it0 = (pointer)p->in_tables[0]; - pointer it1 = (pointer)p->in_tables[1]; - pointer it2 = (pointer)p->in_tables[2]; - pointer it3 = (pointer)p->in_tables[3]; - pointer it4 = (pointer)p->in_tables[4]; - pointer it5 = (pointer)p->in_tables[5]; - pointer it6 = (pointer)p->in_tables[6]; - pointer it7 = (pointer)p->in_tables[7]; - pointer ot0 = (pointer)p->out_tables[0]; - pointer ot1 = (pointer)p->out_tables[1]; - pointer ot2 = (pointer)p->out_tables[2]; - pointer ot3 = (pointer)p->out_tables[3]; - pointer ot4 = (pointer)p->out_tables[4]; - pointer ot5 = (pointer)p->out_tables[5]; - pointer ot6 = (pointer)p->out_tables[6]; - pointer ot7 = (pointer)p->out_tables[7]; - pointer im_base = (pointer)p->im_table; - - for(;ip0 < ep; ip0 += 8, op0 += 8) { - unsigned int ova0; /* Output value accumulator */ - unsigned int ova1; /* Output value accumulator */ - unsigned int ova2; /* Output value accumulator */ - unsigned int ova3; /* Output value accumulator */ - unsigned int ova4; /* Output value accumulator */ - unsigned int ova5; /* Output value accumulator */ - unsigned int ova6; /* Output value accumulator */ - unsigned int ova7; /* Output value accumulator */ - { - pointer imp; - unsigned int we0; /* Weighting value variable */ - unsigned int vo0; /* Vertex offset variable */ - unsigned int we1; /* Weighting value variable */ - unsigned int vo1; /* Vertex offset variable */ - unsigned int we2; /* Weighting value variable */ - unsigned int vo2; /* Vertex offset variable */ - unsigned int we3; /* Weighting value variable */ - unsigned int vo3; /* Vertex offset variable */ - unsigned int we4; /* Weighting value variable */ - unsigned int vo4; /* Vertex offset variable */ - unsigned int we5; /* Weighting value variable */ - unsigned int vo5; /* Vertex offset variable */ - unsigned int we6; /* Weighting value variable */ - unsigned int vo6; /* Vertex offset variable */ - unsigned int we7; /* Weighting value variable */ - unsigned int vo7; /* Vertex offset variable */ - { - unsigned int ti_i; /* Interpolation index variable */ - - ti_i = IT_IX(it0, ip0[0]); - we0 = IT_WE(it0, ip0[0]); - vo0 = IT_VO(it0, ip0[0]); - ti_i += IT_IX(it1, ip0[1]); - we1 = IT_WE(it1, ip0[1]); - vo1 = IT_VO(it1, ip0[1]); - ti_i += IT_IX(it2, ip0[2]); - we2 = IT_WE(it2, ip0[2]); - vo2 = IT_VO(it2, ip0[2]); - ti_i += IT_IX(it3, ip0[3]); - we3 = IT_WE(it3, ip0[3]); - vo3 = IT_VO(it3, ip0[3]); - ti_i += IT_IX(it4, ip0[4]); - we4 = IT_WE(it4, ip0[4]); - vo4 = IT_VO(it4, ip0[4]); - ti_i += IT_IX(it5, ip0[5]); - we5 = IT_WE(it5, ip0[5]); - vo5 = IT_VO(it5, ip0[5]); - ti_i += IT_IX(it6, ip0[6]); - we6 = IT_WE(it6, ip0[6]); - vo6 = IT_VO(it6, ip0[6]); - ti_i += IT_IX(it7, ip0[7]); - we7 = IT_WE(it7, ip0[7]); - vo7 = IT_VO(it7, ip0[7]); - - imp = im_base + IM_O(ti_i); /* Compute interp. table entry pointer */ - - /* Sort weighting values and vertex offset values */ - CEX(we0, vo0, we1, vo1); - CEX(we0, vo0, we2, vo2); - CEX(we0, vo0, we3, vo3); - CEX(we0, vo0, we4, vo4); - CEX(we0, vo0, we5, vo5); - CEX(we0, vo0, we6, vo6); - CEX(we0, vo0, we7, vo7); - CEX(we1, vo1, we2, vo2); - CEX(we1, vo1, we3, vo3); - CEX(we1, vo1, we4, vo4); - CEX(we1, vo1, we5, vo5); - CEX(we1, vo1, we6, vo6); - CEX(we1, vo1, we7, vo7); - CEX(we2, vo2, we3, vo3); - CEX(we2, vo2, we4, vo4); - CEX(we2, vo2, we5, vo5); - CEX(we2, vo2, we6, vo6); - CEX(we2, vo2, we7, vo7); - CEX(we3, vo3, we4, vo4); - CEX(we3, vo3, we5, vo5); - CEX(we3, vo3, we6, vo6); - CEX(we3, vo3, we7, vo7); - CEX(we4, vo4, we5, vo5); - CEX(we4, vo4, we6, vo6); - CEX(we4, vo4, we7, vo7); - CEX(we5, vo5, we6, vo6); - CEX(we5, vo5, we7, vo7); - CEX(we6, vo6, we7, vo7); - } - { - unsigned int vof; /* Vertex offset value */ - unsigned int vwe; /* Vertex weighting */ - - vof = 0; /* First vertex offset is 0 */ - vwe = 65536 - we0; /* Baricentric weighting */ - ova0 = IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 = IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 = IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 = IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 = IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 = IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 = IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 = IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo0; /* Move to next vertex */ - vwe = we0 - we1; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo1; /* Move to next vertex */ - vwe = we1 - we2; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo2; /* Move to next vertex */ - vwe = we2 - we3; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo3; /* Move to next vertex */ - vwe = we3 - we4; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo4; /* Move to next vertex */ - vwe = we4 - we5; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo5; /* Move to next vertex */ - vwe = we5 - we6; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo6; /* Move to next vertex */ - vwe = we6 - we7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - vof += vo7; /* Move to next vertex */ - vwe = we7; /* Baricentric weighting */ - ova0 += IM_FE(imp, vof, 0) * vwe; /* Accumulate weighted output values */ - ova1 += IM_FE(imp, vof, 1) * vwe; /* Accumulate weighted output values */ - ova2 += IM_FE(imp, vof, 2) * vwe; /* Accumulate weighted output values */ - ova3 += IM_FE(imp, vof, 3) * vwe; /* Accumulate weighted output values */ - ova4 += IM_FE(imp, vof, 4) * vwe; /* Accumulate weighted output values */ - ova5 += IM_FE(imp, vof, 5) * vwe; /* Accumulate weighted output values */ - ova6 += IM_FE(imp, vof, 6) * vwe; /* Accumulate weighted output values */ - ova7 += IM_FE(imp, vof, 7) * vwe; /* Accumulate weighted output values */ - } - } - { - unsigned int oti; /* Vertex offset value */ - oti = ((ova0 >> 16) & 0xffff); /* Extract integer part of result */ - op0[0] = OT_E(ot0, oti); /* Write result */ - oti = ((ova1 >> 16) & 0xffff); /* Extract integer part of result */ - op0[1] = OT_E(ot1, oti); /* Write result */ - oti = ((ova2 >> 16) & 0xffff); /* Extract integer part of result */ - op0[2] = OT_E(ot2, oti); /* Write result */ - oti = ((ova3 >> 16) & 0xffff); /* Extract integer part of result */ - op0[3] = OT_E(ot3, oti); /* Write result */ - oti = ((ova4 >> 16) & 0xffff); /* Extract integer part of result */ - op0[4] = OT_E(ot4, oti); /* Write result */ - oti = ((ova5 >> 16) & 0xffff); /* Extract integer part of result */ - op0[5] = OT_E(ot5, oti); /* Write result */ - oti = ((ova6 >> 16) & 0xffff); /* Extract integer part of result */ - op0[6] = OT_E(ot6, oti); /* Write result */ - oti = ((ova7 >> 16) & 0xffff); /* Extract integer part of result */ - op0[7] = OT_E(ot7, oti); /* Write result */ - } - } -} -#undef IT_WE -#undef IT_VO -#undef IT_IX -#undef CEX -#undef IM_O -#undef IM_FE -#undef OT_E - -static void -imdi_k147_gen( -genspec *g /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x30, 0x34, 0x20, 0x47, - 0x72, 0x61, 0x65, 0x6d, 0x65, 0x20, 0x57, 0x2e, - 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x00, 0x04, 0x08, - 0x04, 0xad, 0xf2, 0xb7, 0xc5, 0x83, 0x04, 0x08, - 0x50, 0xad, 0xf2, 0xb7, 0x6c, 0x6c, 0xdd, 0xb7, - 0x34, 0xda, 0x83, 0xbf, 0xf6, 0x35, 0xf3, 0xb7, - 0x8b, 0xca, 0xdd, 0xb7, 0xbb, 0x83, 0x04, 0x08, - 0x31, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, - 0x4e, 0xcb, 0xdd, 0xb7, 0xfc, 0x79, 0xdd, 0xb7, - 0x2c, 0xf3, 0xdc, 0xb7, 0x38, 0x5f, 0x38, 0x5f, - 0x69, 0x31, 0x36, 0x5f, 0x69, 0x31, 0x36, 0x5f, - 0x66, 0x00, 0x77, 0x01, 0x9b, 0x83, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0xac, 0xb1, 0xf2, 0xb7, 0xf8, 0xda, 0x83, 0xbf, - 0xc9, 0x37, 0xf3, 0xb7, 0x40, 0x82, 0x04, 0x08, - 0xb4, 0xda, 0x83, 0xbf, 0x58, 0xb1, 0xf2, 0xb7, - 0x02, 0x00, 0x00, 0x00, 0x80, 0xb0, 0xdc, 0xb7, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x6e, 0x6f, 0xb4, 0xda, 0x83, 0xbf, - 0x69, 0x6d, 0x64, 0x69, 0x5f, 0x6b, 0x31, 0x34, - 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0x77, 0x01, - 0x20, 0xdb, 0x83, 0xbf, 0x00, 0xb0, 0xf2, 0xb7, - 0x9b, 0x83, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0xfa, 0x83, 0xbf, 0xee, 0xb1, 0xec, 0xb7, - 0x98, 0xc8, 0x04, 0x08, 0xe8, 0xf0, 0x04, 0x08, - 0xc8, 0xda, 0x83, 0xbf, 0xdd, 0x84, 0x04, 0x08, - 0xdc, 0x60, 0xef, 0xb7, 0x80, 0xdb, 0x83, 0xbf, - 0xe8, 0xda, 0x83, 0xbf, 0xb3, 0xc8, 0x04, 0x08, - 0x38, 0x18, 0xf4, 0xb7, 0xdc, 0x60, 0xef, 0xb7, - 0x00, 0xf0, 0x04, 0x08 - }; /* Structure image */ - - memcpy(g, data, sizeof(data)); /* Initialise the structure */ -} - -static void -imdi_k147_tab( -tabspec *t /* structure to be initialised */ -) { - static unsigned char data[] = { - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff - }; /* Structure image */ - - memcpy(t, data, sizeof(data)); /* Initialise the structure */ -} diff -Nru ghostscript-9.04~dfsg/imdi/imdi_k.h ghostscript-9.05~dfsg~20120125/imdi/imdi_k.h --- ghostscript-9.04~dfsg/imdi/imdi_k.h 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/imdi/imdi_k.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,160 +0,0 @@ -/* Declarations for all the generated kernel functions */ -/* This file is generated by imdi_gen */ - -#include "imdi_k.c" /* All the kernel code */ - -struct { - void (*interp)(imdi *s, void **outp, void **inp, unsigned int npix); - void (*gen)(genspec *g); - void (*tab)(tabspec *t); -} ktable[147] = { - { imdi_k1, imdi_k1_gen, imdi_k1_tab }, - { imdi_k2, imdi_k2_gen, imdi_k2_tab }, - { imdi_k3, imdi_k3_gen, imdi_k3_tab }, - { imdi_k4, imdi_k4_gen, imdi_k4_tab }, - { imdi_k5, imdi_k5_gen, imdi_k5_tab }, - { imdi_k6, imdi_k6_gen, imdi_k6_tab }, - { imdi_k7, imdi_k7_gen, imdi_k7_tab }, - { imdi_k8, imdi_k8_gen, imdi_k8_tab }, - { imdi_k9, imdi_k9_gen, imdi_k9_tab }, - { imdi_k10, imdi_k10_gen, imdi_k10_tab }, - { imdi_k11, imdi_k11_gen, imdi_k11_tab }, - { imdi_k12, imdi_k12_gen, imdi_k12_tab }, - { imdi_k13, imdi_k13_gen, imdi_k13_tab }, - { imdi_k14, imdi_k14_gen, imdi_k14_tab }, - { imdi_k15, imdi_k15_gen, imdi_k15_tab }, - { imdi_k16, imdi_k16_gen, imdi_k16_tab }, - { imdi_k17, imdi_k17_gen, imdi_k17_tab }, - { imdi_k18, imdi_k18_gen, imdi_k18_tab }, - { imdi_k19, imdi_k19_gen, imdi_k19_tab }, - { imdi_k20, imdi_k20_gen, imdi_k20_tab }, - { imdi_k21, imdi_k21_gen, imdi_k21_tab }, - { imdi_k22, imdi_k22_gen, imdi_k22_tab }, - { imdi_k23, imdi_k23_gen, imdi_k23_tab }, - { imdi_k24, imdi_k24_gen, imdi_k24_tab }, - { imdi_k25, imdi_k25_gen, imdi_k25_tab }, - { imdi_k26, imdi_k26_gen, imdi_k26_tab }, - { imdi_k27, imdi_k27_gen, imdi_k27_tab }, - { imdi_k28, imdi_k28_gen, imdi_k28_tab }, - { imdi_k29, imdi_k29_gen, imdi_k29_tab }, - { imdi_k30, imdi_k30_gen, imdi_k30_tab }, - { imdi_k31, imdi_k31_gen, imdi_k31_tab }, - { imdi_k32, imdi_k32_gen, imdi_k32_tab }, - { imdi_k33, imdi_k33_gen, imdi_k33_tab }, - { imdi_k34, imdi_k34_gen, imdi_k34_tab }, - { imdi_k35, imdi_k35_gen, imdi_k35_tab }, - { imdi_k36, imdi_k36_gen, imdi_k36_tab }, - { imdi_k37, imdi_k37_gen, imdi_k37_tab }, - { imdi_k38, imdi_k38_gen, imdi_k38_tab }, - { imdi_k39, imdi_k39_gen, imdi_k39_tab }, - { imdi_k40, imdi_k40_gen, imdi_k40_tab }, - { imdi_k41, imdi_k41_gen, imdi_k41_tab }, - { imdi_k42, imdi_k42_gen, imdi_k42_tab }, - { imdi_k43, imdi_k43_gen, imdi_k43_tab }, - { imdi_k44, imdi_k44_gen, imdi_k44_tab }, - { imdi_k45, imdi_k45_gen, imdi_k45_tab }, - { imdi_k46, imdi_k46_gen, imdi_k46_tab }, - { imdi_k47, imdi_k47_gen, imdi_k47_tab }, - { imdi_k48, imdi_k48_gen, imdi_k48_tab }, - { imdi_k49, imdi_k49_gen, imdi_k49_tab }, - { imdi_k50, imdi_k50_gen, imdi_k50_tab }, - { imdi_k51, imdi_k51_gen, imdi_k51_tab }, - { imdi_k52, imdi_k52_gen, imdi_k52_tab }, - { imdi_k53, imdi_k53_gen, imdi_k53_tab }, - { imdi_k54, imdi_k54_gen, imdi_k54_tab }, - { imdi_k55, imdi_k55_gen, imdi_k55_tab }, - { imdi_k56, imdi_k56_gen, imdi_k56_tab }, - { imdi_k57, imdi_k57_gen, imdi_k57_tab }, - { imdi_k58, imdi_k58_gen, imdi_k58_tab }, - { imdi_k59, imdi_k59_gen, imdi_k59_tab }, - { imdi_k60, imdi_k60_gen, imdi_k60_tab }, - { imdi_k61, imdi_k61_gen, imdi_k61_tab }, - { imdi_k62, imdi_k62_gen, imdi_k62_tab }, - { imdi_k63, imdi_k63_gen, imdi_k63_tab }, - { imdi_k64, imdi_k64_gen, imdi_k64_tab }, - { imdi_k65, imdi_k65_gen, imdi_k65_tab }, - { imdi_k66, imdi_k66_gen, imdi_k66_tab }, - { imdi_k67, imdi_k67_gen, imdi_k67_tab }, - { imdi_k68, imdi_k68_gen, imdi_k68_tab }, - { imdi_k69, imdi_k69_gen, imdi_k69_tab }, - { imdi_k70, imdi_k70_gen, imdi_k70_tab }, - { imdi_k71, imdi_k71_gen, imdi_k71_tab }, - { imdi_k72, imdi_k72_gen, imdi_k72_tab }, - { imdi_k73, imdi_k73_gen, imdi_k73_tab }, - { imdi_k74, imdi_k74_gen, imdi_k74_tab }, - { imdi_k75, imdi_k75_gen, imdi_k75_tab }, - { imdi_k76, imdi_k76_gen, imdi_k76_tab }, - { imdi_k77, imdi_k77_gen, imdi_k77_tab }, - { imdi_k78, imdi_k78_gen, imdi_k78_tab }, - { imdi_k79, imdi_k79_gen, imdi_k79_tab }, - { imdi_k80, imdi_k80_gen, imdi_k80_tab }, - { imdi_k81, imdi_k81_gen, imdi_k81_tab }, - { imdi_k82, imdi_k82_gen, imdi_k82_tab }, - { imdi_k83, imdi_k83_gen, imdi_k83_tab }, - { imdi_k84, imdi_k84_gen, imdi_k84_tab }, - { imdi_k85, imdi_k85_gen, imdi_k85_tab }, - { imdi_k86, imdi_k86_gen, imdi_k86_tab }, - { imdi_k87, imdi_k87_gen, imdi_k87_tab }, - { imdi_k88, imdi_k88_gen, imdi_k88_tab }, - { imdi_k89, imdi_k89_gen, imdi_k89_tab }, - { imdi_k90, imdi_k90_gen, imdi_k90_tab }, - { imdi_k91, imdi_k91_gen, imdi_k91_tab }, - { imdi_k92, imdi_k92_gen, imdi_k92_tab }, - { imdi_k93, imdi_k93_gen, imdi_k93_tab }, - { imdi_k94, imdi_k94_gen, imdi_k94_tab }, - { imdi_k95, imdi_k95_gen, imdi_k95_tab }, - { imdi_k96, imdi_k96_gen, imdi_k96_tab }, - { imdi_k97, imdi_k97_gen, imdi_k97_tab }, - { imdi_k98, imdi_k98_gen, imdi_k98_tab }, - { imdi_k99, imdi_k99_gen, imdi_k99_tab }, - { imdi_k100, imdi_k100_gen, imdi_k100_tab }, - { imdi_k101, imdi_k101_gen, imdi_k101_tab }, - { imdi_k102, imdi_k102_gen, imdi_k102_tab }, - { imdi_k103, imdi_k103_gen, imdi_k103_tab }, - { imdi_k104, imdi_k104_gen, imdi_k104_tab }, - { imdi_k105, imdi_k105_gen, imdi_k105_tab }, - { imdi_k106, imdi_k106_gen, imdi_k106_tab }, - { imdi_k107, imdi_k107_gen, imdi_k107_tab }, - { imdi_k108, imdi_k108_gen, imdi_k108_tab }, - { imdi_k109, imdi_k109_gen, imdi_k109_tab }, - { imdi_k110, imdi_k110_gen, imdi_k110_tab }, - { imdi_k111, imdi_k111_gen, imdi_k111_tab }, - { imdi_k112, imdi_k112_gen, imdi_k112_tab }, - { imdi_k113, imdi_k113_gen, imdi_k113_tab }, - { imdi_k114, imdi_k114_gen, imdi_k114_tab }, - { imdi_k115, imdi_k115_gen, imdi_k115_tab }, - { imdi_k116, imdi_k116_gen, imdi_k116_tab }, - { imdi_k117, imdi_k117_gen, imdi_k117_tab }, - { imdi_k118, imdi_k118_gen, imdi_k118_tab }, - { imdi_k119, imdi_k119_gen, imdi_k119_tab }, - { imdi_k120, imdi_k120_gen, imdi_k120_tab }, - { imdi_k121, imdi_k121_gen, imdi_k121_tab }, - { imdi_k122, imdi_k122_gen, imdi_k122_tab }, - { imdi_k123, imdi_k123_gen, imdi_k123_tab }, - { imdi_k124, imdi_k124_gen, imdi_k124_tab }, - { imdi_k125, imdi_k125_gen, imdi_k125_tab }, - { imdi_k126, imdi_k126_gen, imdi_k126_tab }, - { imdi_k127, imdi_k127_gen, imdi_k127_tab }, - { imdi_k128, imdi_k128_gen, imdi_k128_tab }, - { imdi_k129, imdi_k129_gen, imdi_k129_tab }, - { imdi_k130, imdi_k130_gen, imdi_k130_tab }, - { imdi_k131, imdi_k131_gen, imdi_k131_tab }, - { imdi_k132, imdi_k132_gen, imdi_k132_tab }, - { imdi_k133, imdi_k133_gen, imdi_k133_tab }, - { imdi_k134, imdi_k134_gen, imdi_k134_tab }, - { imdi_k135, imdi_k135_gen, imdi_k135_tab }, - { imdi_k136, imdi_k136_gen, imdi_k136_tab }, - { imdi_k137, imdi_k137_gen, imdi_k137_tab }, - { imdi_k138, imdi_k138_gen, imdi_k138_tab }, - { imdi_k139, imdi_k139_gen, imdi_k139_tab }, - { imdi_k140, imdi_k140_gen, imdi_k140_tab }, - { imdi_k141, imdi_k141_gen, imdi_k141_tab }, - { imdi_k142, imdi_k142_gen, imdi_k142_tab }, - { imdi_k143, imdi_k143_gen, imdi_k143_tab }, - { imdi_k144, imdi_k144_gen, imdi_k144_tab }, - { imdi_k145, imdi_k145_gen, imdi_k145_tab }, - { imdi_k146, imdi_k146_gen, imdi_k146_tab }, - { imdi_k147, imdi_k147_gen, imdi_k147_tab } -}; - -int no_kfuncs = 147; diff -Nru ghostscript-9.04~dfsg/imdi/imdi_tab.c ghostscript-9.05~dfsg~20120125/imdi/imdi_tab.c --- ghostscript-9.04~dfsg/imdi/imdi_tab.c 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/imdi/imdi_tab.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,687 +0,0 @@ -/* Integer Multi-Dimensional Interpolation */ -/* - * Copyright 2000 - 2002 Graeme W. Gill - * All rights reserved. - * - * This material is licenced under the GNU GENERAL PUBLIC LICENCE :- - * see the Licence.txt file for licencing details. - */ - -/* Run time table allocater and initialiser */ - -/* - * The function here that knows how to create the - * appropriate run time tables for our chosen kernel, - * and the color mapping we want to perform. - */ - -#include -#include -#include -#include -#include - -#include "imdi_imp.h" -#include "imdi_gen.h" -#include "imdi_tab.h" - -#undef VERBOSE -#undef ASSERTS /* Check asserts */ - -#ifdef ASSERTS -#include -#endif - -typedef unsigned char byte; - -/* Left shift, handles >= 32 properly */ -#define LSHIFT(aa, bb) ((bb) <= 31 ? ((aa) << (bb)) : (((aa) << 31) << ((bb)-31))) - -/* Specific entry size write routine */ - -void write_uchar( -byte *p, -#ifdef ALLOW64 -unsigned longlong v -#else -unsigned long v -#endif -) { - *((unsigned char *)p) = (unsigned char)v; -} - -void write_ushort( -byte *p, -#ifdef ALLOW64 -unsigned longlong v -#else -unsigned long v -#endif -) { - *((unsigned short *)p) = (unsigned short)v; -} - -void write_uint( -byte *p, -#ifdef ALLOW64 -unsigned longlong v -#else -unsigned long v -#endif -) { - *((unsigned int *)p) = (unsigned int)v; -} - -void write_ulong( -byte *p, -#ifdef ALLOW64 -unsigned longlong v -#else -unsigned long v -#endif -) { - *((unsigned long *)p) = (unsigned long)v; -} - -#ifdef ALLOW64 -void write_ulonglong( -byte *p, -unsigned longlong v -) { - *((unsigned longlong *)p) = (unsigned longlong)v; -} -#endif /* ALLOW64 */ - -void write_default( -byte *p, -#ifdef ALLOW64 -unsigned longlong v -#else -unsigned long v -#endif -) { - fprintf(stderr,"imdi_tabl: internal failure - unexpected write size!\n"); -*((char *)NULL) = 0; /* ~~999 */ - exit(-1); -} - -/* Array of write routines */ -#ifdef ALLOW64 -void (*write_entry[16])(byte *p, unsigned longlong v); -#else -void (*write_entry[16])(byte *p, unsigned long v); -#endif - -void -init_write_tab(void) { - int i; - - for (i = 0; i < 16; i++) - write_entry[i] = write_default; /* Make sure any un-inited access bombs */ - - write_entry[sizeof(unsigned char)] = write_uchar; - write_entry[sizeof(unsigned short)] = write_ushort; - write_entry[sizeof(unsigned int)] = write_uint; - write_entry[sizeof(unsigned long)] = write_ulong; -#ifdef ALLOW64 - write_entry[sizeof(unsigned longlong)] = write_ulonglong; -#endif /* ALLOW64 */ -} - -imdi_imp * -imdi_tab( - genspec *gs, /* Pointer to gen spec */ - tabspec *ts, /* Pointer to table spec */ - - /* Callbacks to lookup the mdi table values */ - double (*input_curve) (void *cntx, int ch, double in_val), - void (*md_table) (void *cntx, double *out_vals, double *in_vals), - double (*output_curve)(void *cntx, int ch, double in_val), - void *cntx /* Context to callbacks */ -) { - static inited = 0; - static bigend = 0; - int e; - imdi_imp *it; - unsigned long etest = 0xff; - int idinc[IXDI+1]; /* Increment for each dimension of interp table. */ - int ibdinc[IXDI+1]; /* idinc[] in bytes */ - int sdinc[IXDI+1]; /* Increment for each dimension of simplex table. */ - int sbdinc[IXDI+1]; /* sdinc[] in bytes */ - -#ifdef VERBOSE - printf("imdi_tab called\n"); -#endif - - if (inited == 0) { - init_write_tab(); - if (*((unsigned char *)&etest) == 0xff) - bigend = 0; /* Little endian */ - else - bigend = 1; /* Big endian */ - inited = 1; - } - - if ((it = (imdi_imp *)malloc(sizeof(imdi_imp))) == NULL) { -#ifdef VERBOSE - printf("malloc imdi_imp size %d failed\n",sizeof(imdi_imp)); -#endif - return NULL; /* Should we signal error ? How ? */ - } - - /* Compute interp and simplex table dimension increments & total sizes */ - idinc[0] = 1; - ibdinc[0] = ts->im_ts; - for (e = 1; e <= gs->id; e++) { - idinc[e] = idinc[e-1] * gs->itres; - ibdinc[e] = ibdinc[e-1] * gs->itres; - } - - if (!ts->sort) { - sdinc[0] = 1; - sbdinc[0] = ts->sm_ts; - for (e = 1; e <= gs->id; e++) { - sdinc[e] = sdinc[e-1] * gs->stres; - sbdinc[e] = sbdinc[e-1] * gs->stres; - } - } - - /* First we setup the input tables */ - for (e = 0; e < gs->id; e++) { - byte *t, *p; /* Pointer to input table, entry pointer */ - int ne; /* Number of entries */ - int ex; /* Entry index */ - int ix = 0; /* Extract flag */ - - /* Compute number of entries */ - if (ts->it_ix && !gs->in.packed) { /* Input is the whole bpch[] size */ - ix = 1; /* Need to do extraction in lookup */ - if (gs->in.pint) { - ne = (1 << (gs->in.bpch[0])); /* Same size used for all input tables */ - } else { - ne = (1 << (gs->in.bpch[e])); /* This input channels size */ - } - } else { /* Input is the value size */ - ne = (1 << (gs->in.bpv[e])); /* This input values size */ - } - - /* Allocate the table */ - if ((t = (byte *)malloc(ts->it_ts * ne)) == NULL) { -#ifdef VERBOSE - printf("malloc imdi input table size %d failed\n",ts->it_ts * ne); -#endif - return NULL; /* Should we signal error ? How ? */ - } - - /* For each possible input value, compute the entry value */ - for (ex = 0, p = t; ex < ne; ex++, p += ts->it_ts) { - int ee; - int iiv; /* Integer input value */ - int ivr; /* Input value range */ - int isb; /* Input sign bit/signed to offset displacement */ - double riv; /* Real input value, 0.0 - 1.0 */ - double rtv; /* Real transformed value, 0.0 - 1.0 */ - double rmi; /* Real interpolation table index */ - double rsi; /* Real simplex index */ - int imi; /* Interpiolation table index */ - int isi; /* Integer simplex index */ - int iwe; /* Integer weighting value */ - int vo; /* Vertex offset value */ - - if (ix) { /* Extract value from index */ - ivr = ((1 << (gs->in.bpv[e])) -1); - iiv = (ex >> gs->in.bov[e]) & ((1 << (gs->in.bpv[e])) -1); - } else { - ivr = (ne - 1); /* (Should be bpv[e], but take no chances!) */ - iiv = ex; /* Input value is simply index */ - } - isb = ivr & ~(((unsigned int)ivr) >> 1); /* Top bit */ - if (gs->in_signed & (1 << e)) /* Treat input as signed */ - iiv = (iiv & isb) ? iiv - isb : iiv + isb; /* Convert to offset from signed */ - riv = (double) iiv / (double)ivr; /* Compute floating point */ - rtv = input_curve(cntx, e, riv); /* Lookup the input table transform */ - if (rtv < 0.0) /* Guard against sillies */ - rtv = 0.0; - else if (rtv > 1.0) - rtv = 1.0; - - /* divide into interp base and cube sub index */ - rmi = rtv * (gs->itres - 1); - imi = (int)floor(rmi); /* Interp. entry coordinate */ - if (imi >= (gs->itres-1)) /* Keep cube base one row back from far edge */ - imi = gs->itres-2; - rsi = rmi - (double)imi; /* offset into entry cube */ - if (ts->sort) { - iwe = (int)((rsi * (1 << gs->prec)) + 0.5); /* Weighting scale */ - vo = idinc[e] * ts->vo_om; /* Vertex offset */ - } else { - isi = (int)((rsi * gs->stres) + 0.5); - if (isi == gs->stres) { /* Keep simplex index within table */ - isi = 0; - imi++; /* Move to next interp. lattice */ - } - isi *= sdinc[e]; /* Convert the raw indexes into offset in this dim */ - } - imi *= idinc[e]; /* Convert the raw indexes into offset in this dim */ - -#ifdef ASSERTS - /* ~~~ needs fixing for sort ~~~~ */ - if ((imi & (LSHIFT(1,ts->it_ab)-1)) != imi) - error("imdi_tab assert: (imi & ((1 << ts->it_ab)-1)) != imi, imi = 0x%x, it_ab = 0x%x\n",imi,ts->it_ab); - if (imi >= idinc[gs->id]) - error("imdi_tab assert: imi >= idinc[gs->id]\n"); - if ((isi & (LSHIFT(1,ts->sx_ab)-1)) != isi) - error("imdi_tab assert: (isi & ((1 << ts->sx_ab)-1)) != isi, isi = 0x%x, sx_ab = 0x%x\n",isi,ts->sx_ab); - if (!ts->sort && isi >= sdinc[gs->id]) - error("imdi_tab assert: isi >= sdinc[gs->id]\n"); -#endif - - /* Now stuff them into the table entry */ - if (ts->sort) { - if (ts->it_xs) { /* Separate interp index and weight/offset*/ - if (ts->wo_xs) { /* All 3 are separate */ - write_entry[ts->ix_es](p + ts->ix_eo, imi); - write_entry[ts->we_es](p + ts->we_eo, iwe); - write_entry[ts->vo_es](p + ts->vo_eo, vo); - } else { -#ifdef ALLOW64 - unsigned longlong iwo; -#else - unsigned long iwo; -#endif - - iwo = (iwe << ts->vo_ab) | vo; /* Combined weight+vertex offset */ - write_entry[ts->ix_es](p + ts->ix_eo, imi); - write_entry[ts->wo_es](p + ts->wo_eo, iwo); - } - } else { /* All 3 are combined */ -#ifdef ALLOW64 - unsigned longlong iit; -#else - unsigned long iit; -#endif - iit = (((imi << ts->we_ab) | iwe) << ts->vo_ab) | vo; - write_entry[ts->it_ts](p, iit); - } - } else { - if (ts->it_xs) { /* Separate interp index and weight/offset*/ - write_entry[ts->ix_es](p + ts->ix_eo, imi); - write_entry[ts->sx_es](p + ts->sx_eo, isi); - } else { -#ifdef ALLOW64 - unsigned longlong iit; -#else - unsigned long iit; -#endif - iit = (imi << ts->sx_ab) | isi; /* Combine interp and simplex indexes */ - write_entry[ts->it_ts](p, iit); - } - } - } - - /* Put table into place */ - it->in_tables[e] = (void *)t; - } - it->nintabs = e; - - /* Setup the interpolation table */ - { - byte *t, *p; /* Pointer to interp table, pointer to total entry */ - PHILBERT(phc) /* Pseudo Hilbert counter */ - double vscale; /* Value scale for fixed point */ - int vsize; /* Fixed point storage size */ - - if (ts->im_cd) - vsize = (gs->prec * 2)/8; /* Fixed point entry & computation size */ - else - vsize = gs->prec/8; /* Fixed point entry size */ - vscale = (1 << gs->prec) -1.0; /* Value scale for fixed point padding */ - /* -1.0 is to prevent carry after accumulation */ - /* Allocate the table */ - if ((t = (byte *)malloc(ibdinc[gs->id])) == NULL) { -#ifdef VERBOSE - printf("malloc imdi interpolation table size %d failed\n",ibdinc[gs->id]); -#endif - return NULL; /* Should we signal error ? How ? */ - } -#ifdef VERBOSE - printf("Allocated grid table = %d bytes\n",ibdinc[gs->id]); -#endif - - /* Get ready to access all the entries in the table */ - p = t; - PH_INIT(phc, gs->id, gs->itres) - - /* Create all the interpolation table entry values */ - do { - int ee, f; - double riv[IXDI]; /* Real input values */ - double rev[IXDO]; /* Real entry values */ - unsigned long iev; - byte *pp; /* Pointer to sub-entry */ - - for (e = 0, p = t; e < gs->id; e++) { - riv[e] = ((double)phc[e]) / (gs->itres - 1.0); - p += phc[e] * ibdinc[e]; /* Compute pointer to entry value */ - } - - /* Lookup this verticies value */ - md_table(cntx, rev, riv); - - /* Create all the output values */ - - /* I'm trying to avoid having to declare the actual entry sized */ - /* variables, since it is difficult dynamically. */ - - /* For all the full entries */ - f = 0; - pp = p; - for (e = 0; e < ts->im_fn; e++, pp += ts->im_fs) { - /* For all channels within full entry */ - for (ee = 0; ee < ts->im_fv; ee++, f++) { - double revf = rev[f]; - if (revf < 0.0) /* Guard against sillies */ - revf = 0.0; - else if (revf > 1.0) - revf = 1.0; - iev = (unsigned long)(revf * vscale + 0.5); - - if (bigend) { - write_entry[vsize](pp + (ts->im_fs - (ee+1) * vsize), iev); - } else { - write_entry[vsize](pp + ee * vsize, iev); - } - } - } - - /* For all the 0 or 1 partial entry */ - for (e = 0; e < ts->im_pn; e++) { - /* For all channels within partial entry */ - for (ee = 0; ee < ts->im_pv; ee++, f++) { - double revf = rev[f]; - if (revf < 0.0) /* Guard against sillies */ - revf = 0.0; - else if (revf > 1.0) - revf = 1.0; - iev = (unsigned long)(revf * vscale + 0.5); - - if (bigend) { - write_entry[vsize](pp + (ts->im_ps - (ee+1) * vsize), iev); - } else { - write_entry[vsize](pp + ee * vsize, iev); - } - } - } -#ifdef ASSERTS - if (f != gs->od) - fprintf(stderr,"imdi_tab assert: f == gs->od\n"); -#endif - - PH_INC(phc) - } while (!PH_LOOPED(phc)); - - /* Put table into place */ - it->im_table = (void *)t; - } - - /* Setup the simplex table */ - if (ts->sort) { - it->sw_table = (void *)NULL; - - } else { - byte *t, *p; /* Pointer to input table, pointer to total entry */ - int nsplx; /* Total number of simplexes */ - XCOMBO(vcmb, gs->id+1, 1 << gs->id);/* Simplex dimension id out of cube dimention id */ - int comb[24][IXDI]; /* Parameter[id]->Absolute[id] coordinate index */ - int ps[IXDI+1]; /* Base simplex parameter space counter */ - int pse; /* Base simplex parameter space counter index */ - int idioff; /* Interpolation table diagonal offset value */ - - if (gs->id > 4) { - fprintf(stderr,"imdi_tabl: internal failure - trying to create simplex table with di > 4!\n"); - exit(-1); - } - - /* Allocate the table */ - if ((t = (byte *)malloc(sbdinc[gs->id])) == NULL) { -#ifdef VERBOSE - printf("malloc imdi simplex table size %d failed\n",sbdinc[gs->id]); -#endif - return NULL; /* Should we signal error ? How ? */ - } -#ifdef VERBOSE - printf("Allocated simplex table = %d bytes\n",sbdinc[gs->id]); -#endif - - /* Compute the interp table offset to the diagonal vertex */ - for (idioff = 0, e = 0; e < gs->id; e++) - idioff += idinc[e]; /* Sum one offset in each dimension */ - - /* Figure out how many simplexes fit into this dimension cube, */ - /* and how to map from the base simplex to each actual simplex. */ - XCB_INIT(vcmb); - for (nsplx = 0; ;) { - int i; - - /* XCOMB generates verticies in order from max to min offest */ - - /* Compute Absolute -> Parameter mapping */ - for (e = 0; e < gs->id; e++) { /* For each absolute axis */ - for (i = 0; i < gs->id; i++) { /* For each verticy, order large to small */ - if ((vcmb[i] & (1< Abs = "); -for (e = 0; e < gs->id; e++) - printf("%d ",comb[nsplx][e]); -printf("\n"); -*/ - - /* Increment the counter value */ - XCB_INC(vcmb); - nsplx++; - if (XCB_DONE(vcmb)) - break; - } - - /* Now generate the contents of the base simplex, */ - /* and map it to all the symetrical simplexes */ - - /* Init parameter space counter. */ - /* Note that ps[id-1] >= ps[id-2] >= ... >= ps[1] >= ps[0] */ - for (pse = 0; pse < gs->id; pse++) - ps[pse] = 0; - ps[pse] = gs->stres-1; - - /* Itterate through the simplex parameter space */ - for (pse = 0; pse < gs->id;) { - double qps[IXDI]; /* Quantized parameter values */ - int we[IXDI+1]; /* Baricentric coords/vertex weighting */ - double wvscale = (1 << gs->prec); /* Weighting value scale */ - int sx; /* Simplex */ - -/* -printf("Param coord ="); -for (e = gs->id-1; e >= 0; e--) { - printf(" %d",ps[e]); -} -printf("\n"); -*/ - for (e = 0; e < gs->id; e++) { - /* (Should try wvscale + 0.49999999, or something ?) */ - double tt = (wvscale * (double)ps[e])/((double)gs->stres); - qps[e] = (int)(tt + 0.5); - } - - /* Convert quantized parameter values into weighting values */ - we[gs->id] = (1 << gs->prec) - qps[gs->id-1]; - for (e = gs->id-1; e > 0; e--) - we[e] = qps[e] - qps[e-1]; - we[0] = qps[0]; - -#ifdef ASSERTS - { - int sow = 0; - for (e = gs->id; e >= 0; e--) - sow += we[e]; - - if (sow != (1 << gs->prec)) - fprintf(stderr,"imdi_tab assert: sum weights == (1 << gs->prec)\n"); - } -#endif - -/* -printf("Baricentric coord ="); -for (e = gs->id; e >= 0; e--) { - printf(" %d",we[e]); -} -printf("\n"); -*/ - - /* For each simplex, compute the interp. and */ - /* and entry offsets, and write the entry. */ - for (sx = 0; sx < nsplx; sx++ ) { - int v; /* Vertex index */ - byte *pp; /* Pointer to sub-entry */ - unsigned long vofb; /* Vertex offset, base */ - unsigned long vwe; /* Vertex weight */ - - for (e = 0, p = t; e < gs->id; e++) { - int ee = comb[sx][e]; /* Absolute coord index */ - p += ps[e] * sbdinc[ee]; /* Pointer to entry */ - } - - /* For each vertex entry */ - for (v = 0, pp = p; v <= gs->id; v++) { - unsigned long vof; - if (v == 0) { - vofb = idioff; /* Start at diagonal offset */ - } else { - vofb -= idinc[comb[sx][v-1]];/* Move to next vertex */ - } - vwe = we[v]; /* Weight for this vertex */ - - if (vwe == 0) - vof = 0; /* Use zero offset if weight is zero */ - else - vof = vofb * ts->vo_om; /* Strength reduce kernel scaling */ - - /* Write vwe and vof to entry */ - if (ts->wo_xs) { /* Separate entries */ - write_entry[ts->we_es](pp + ts->we_eo, vwe); - write_entry[ts->vo_es](pp + ts->vo_eo, vof); - pp += ts->wo_es; - } else { /* Combined entries */ -#ifdef ALLOW64 - unsigned longlong iwo; -#else - unsigned long iwo; -#endif - iwo = (vwe << ts->vo_ab) | vof; /* Combined weight+vertex offset */ - write_entry[ts->wo_es](pp + ts->wo_eo, iwo); - pp += ts->wo_es; - } - } - - /* Assert vofb == 0 */ -#ifdef ASSERTS - if (vofb != 0) - fprintf(stderr,"imdi_tab assert: vofb == 0\n"); -#endif - } /* Next simplex */ - - /* Increment the parameter coords */ - for (pse = 0; pse < gs->id; pse++) { - ps[pse]++; - if (ps[pse] <= ps[pse+1]) - break; /* No carry */ - ps[pse] = 0; - } - } - - /* Put table into place */ - it->sw_table = (void *)t; - } - - /* Last, setup the output tables */ - for (e = 0; e < gs->od; e++) { - byte *t, *p; /* Pointer to output table, entry pointer */ - int ne; /* Number of entries */ - int iiv; /* Integer input value */ - double ivr = (double)((1 << gs->prec)-1); /* Input value range */ - double ovr = (double)((1 << ts->ot_bits[e])-1); /* Output value range */ - int osb = (1 << (ts->ot_bits[e]-1)); /* Output offset to signed displacement */ - int ooff = ts->ot_off[e]; /* Output value bit offset */ - - ne = (1 << gs->prec); /* Output of clut is prec bits */ - - /* Allocate the table */ - if ((t = (byte *)malloc(ts->ot_ts * ne)) == NULL) { -#ifdef VERBOSE - printf("malloc imdi output table size %d failed\n",ts->ot_ts * ne); -#endif - return NULL; /* Should we signal error ? How ? */ - } - - /* For each possible output value, compute the entry value */ - for (iiv = 0, p = t; iiv < ne; iiv++, p += ts->ot_ts) { - int ee; - double riv; /* Real input value, 0.0 - 1.0 */ - double rtv; /* Real transformed value, 0.0 - 1.0 */ - unsigned long iov; /* Integer output value */ - - riv = (double) iiv / ivr; /* Compute floating point */ - rtv = output_curve(cntx, e, riv); /* Lookup the output table transform */ - if (rtv < 0.0) /* Guard against sillies */ - rtv = 0.0; - else if (rtv > 1.0) - rtv = 1.0; - iov = (unsigned long)(rtv * ovr + 0.5); /* output value */ - if (gs->out_signed & (1 << e)) /* Treat output as signed */ - iov = (iov >= osb) ? iov - osb : iov + osb; /* Convert to signed from offset */ - iov <<= ooff; /* Aligned for output */ - - write_entry[ts->ot_ts](p, iov); /* Write entry */ - } - - /* Put table into place */ - it->out_tables[e] = (void *)t; - } - it->nouttabs = e; - -#ifdef VERBOSE - printf("imdi_tabl returning OK\n"); -#endif - return it; -} - -/* Free up the data allocated */ -void -imdi_tab_free( -imdi_imp *it -) { - int e; - - for (e = 0; e < it->nintabs; e++) - free(it->in_tables[e]); - - free(it->sw_table); - free(it->im_table); - - for (e = 0; e < it->nouttabs; e++) - free(it->out_tables[e]); - - free(it); - -} diff -Nru ghostscript-9.04~dfsg/imdi/imdi_tab.h ghostscript-9.05~dfsg~20120125/imdi/imdi_tab.h --- ghostscript-9.04~dfsg/imdi/imdi_tab.h 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/imdi/imdi_tab.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,99 +0,0 @@ -#ifndef IMDI_TAB_H -#define IMDI_TAB_H - -/* Integer Multi-Dimensional Interpolation */ -/* - * Copyright 2000 - 2002 Graeme W. Gill - * All rights reserved. - * - * This material is licenced under the GNU GENERAL PUBLIC LICENCE :- - * see the Licence.txt file for licencing details. - */ - -/* Implementation details needed for table initialisation for a particular kernel */ - -typedef struct { - - int sort; /* NZ for explicit sort rather than simplex table lookup */ - int it_xs; /* NZ if separate interp index and simplex index/Weighting+Offset values */ - int wo_xs; /* NZ if separate weighting and vertex offset entries are to be used */ - - int it_ix; /* Non-zero if input value extraction should be done in input table */ - int it_map[IXDI]; /* Mapping from input channels to table indexes needed */ - int it_ab; /* Input table entry size in bits */ - int it_ts; /* Input table :- total input table entry size in bytes */ - /* Bit packing order is (ms to ls) : - sort: ix, we, vo - sort: ix, wo - !sort: ix, sx - */ - - /* Interpolation index is always in the input table */ - int ix_ab; /* Interpolation index entry size in bits */ - int ix_es; /* Interpolation index entry size in bytes */ - int ix_eo; /* Interpolation index entry offset in bytes */ - - /* Simplex Index is always in the input table */ - int sx_ab; /* Simplex Index entry size in bits */ - int sx_es; /* Simplex Index entry size in bytes */ - int sx_eo; /* Simplex Index entry offset in bytes */ - - int sm_ts; /* Simplex table entry total size in bytes */ - /* Bit packing order is (ms to ls) : we, vo */ - - /* Combined Weighting + Offset may be in input table or Simplex entry */ - int wo_ab; /* Combined Weighting + Offset entry size in bits */ - int wo_es; /* Combined Weighting + Offset entry size in bytes */ - int wo_eo; /* Combined Weighting + Offset entry offset in bytes */ - - /* Weighting may be in input table or Simplex entry */ - int we_ab; /* Weighting entry size in bits */ - int we_es; /* Weighting entry size in bytes */ - int we_eo; /* Weighting entry offset in bytes */ - - /* Vertex offset may be in input table or Simplex entry */ - int vo_ab; /* Vertex Offset entry size in bits */ - int vo_es; /* Vertex Offset entry size in bytes */ - int vo_eo; /* Vertex Offset entry offset in bytes */ - int vo_om; /* Vertex Offset scaling multiplier */ - - int im_cd; /* Non-zero if interpolation table entries are padded with fraction */ - int im_ts; /* Interp. multidim :- total interp table entry size in bytes */ - int im_oc; /* Interp. multidim :- offset scale to apply to index into interp entry */ - int im_fs; /* Interp. multidim :- full table entry size in bytes */ - int im_fn; /* Interp. multidim :- number of full entries */ - int im_fv; /* Interp. multidim :- output values per full entry . */ - int im_ps; /* Interp. multidim :- partial table entry size in bytes, used & unsused */ - int im_pn; /* Interp. multidim :- number of partial entries - must be 0 or 1 */ - int im_pv; /* Interp. multidim :- used output values per partial entry . */ - int im_map[IXDO]; /* Mapping from output table values to output positions needed */ - - int ot_ts; /* Output table :- total entry size in bytes of every table */ - int ot_off[IXDO]; /* Offset for each output value within the output word needed */ - int ot_bits[IXDO]; /* Number of bits for value within the output word needed */ - - /* Associated interpolation function */ - void (*interp)(struct _imdi *s, void **inp, void **outp, unsigned int npix); /* At run time */ -} tabspec; - -/* - * We declare the function that knows how to create the - * appropriate run time tables for our chosen kernel, - * and the color mapping we want to perform. -*/ - -imdi_imp * -imdi_tab( - genspec *gs, /* Pointer to gen spec */ - tabspec *ts, /* Pointer to tabl spec */ - - /* Callbacks to lookup the mdi table values */ - double (*input_curve) (void *cntx, int ch, double in_val), - void (*md_table) (void *cntx, double *out_vals, double *in_vals), - double (*output_curve)(void *cntx, int ch, double in_val), - void *cntx /* Context to callbacks */ -); - -void imdi_tab_free(imdi_imp *it); - -#endif /* IMDI_TAB_H */ diff -Nru ghostscript-9.04~dfsg/imdi/Jamfile ghostscript-9.05~dfsg~20120125/imdi/Jamfile --- ghostscript-9.04~dfsg/imdi/Jamfile 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/imdi/Jamfile 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -LINKLIBS += -lm ; -Main imdi_gen : imdi_gen.c cgen.c ; -GenFile imdi_k.h : imdi_gen ; -# Library libimdi.lib : imdi.c imdi_tab.c ; diff -Nru ghostscript-9.04~dfsg/imdi/LICENSE ghostscript-9.05~dfsg~20120125/imdi/LICENSE --- ghostscript-9.04~dfsg/imdi/LICENSE 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/imdi/LICENSE 1970-01-01 00:00:00.000000000 +0000 @@ -1,282 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - diff -Nru ghostscript-9.04~dfsg/imdi/README ghostscript-9.05~dfsg~20120125/imdi/README --- ghostscript-9.04~dfsg/imdi/README 2011-08-05 11:12:21.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/imdi/README 1970-01-01 00:00:00.000000000 +0000 @@ -1,114 +0,0 @@ - -This is the development area for IMDI, the -Interger Multi-Dimensional Interpolation routines. - -They provide a flexible and high performance -system for applying color transforms to typical -raster pixel data. Because they provide a means of -applying arbitrary combination dependent mappings -of multi-channel pixel data, there are many other -possible uses for these sorts of routines as well, -including high quality matting/compositing. For instance, -one could create a smooth, proportional "chroma key" -type of matt for matting one RGB image onto another -by creating a 6 channel to 3 dimensional transform, -that its applied to each pair of pixels from the -source images and produces one combined output pixel. -Additional input or output alpha channels are easy -to add by simply adding more input and/or output -dimensions. The matting calculatons can be almost -arbitrarily complex, and the imdi will apply them -to the pixel data at very high speed. - -The system has two parts, one that generates taylored, -optimised source code for the transformation kernels, -and the run time code that matches a transform request -to a compiled kernel, and initialises the appropriate -run time lookup tables. - -The kernel source generator is intended to accomodate -various optimisations, such as assembly code, vector -instruction set (ie. MMX, AltiVec etc.) versions, but -at present only generates the more portable 'C' code -kernels. - -Both 8 bit per component and 16 bit per component -pixel data is handled, up to 8 input and output -dimensions (but this limit could be trivially raised). - -imdi_gen.exe is the module that triggers the generation of - optimised source code as configured for the color spaces - and pixel formats selected. By default creates - a single imdi_k.c and imdi_k.h file, but if - given the -i flag, creates a separate file - for each kernel variant. - -cgen.c C code generator module. - -itest.c regresion test routine. - Normally runs speed and accuracy tests for - all configured kernel variants. - The -q flag makes it run quicker, - but makes the benchmarking inacurate, - the -s flag will cause it to stop - if any routine has unexpectedly low - accuracy. - -cctiff.c is the utility that takes an ICC device - profile link, and converts a TIFF file - from the input colorspace to the output - space. Both 8 bit and 16 bit TIFF files - are handled, as well as colorspaces up to - 8 channels in and out. - This accepts either a device link ICC profile, - or links an input and output devce ICC profile - to define the color transform. - - -greytiff.c is a utility similar to cctiff, that - is an example of how to colorimetrically - convert an RGB file into a monochrome RGB file. - - - -Misc. Notes ------------ - - ITU-T Rec. T.42 specifies the ITULAB encoding in terms of a range - and offset for each component, which are related to the minimum and - maximum values as follows: - - minimum = - (range x offset) / 2^n - 1 - maximum = minimum + range - - The Decode field default values depend on the color space. For the - ITULAB color space encoding, the default values correspond to the - base range and offset, as specified in ITU-T Rec. T.42 [T.42]. The - following table gives the base range and offset values for - BitsPerSample=8 and 12, and the corresponding default minimum and - maximum default values for the Decode field, calculated using the - equations above when PhotometricInterpetation=10. - - +-----------------------------------------------+ - | ITU-T Rec. T.42 | Decode | - +---------+-----------| base values | default values | - | BitsPer + Component +------------------+----------------------------+ - | -Sample | | Range | Offset | Min | Max | - +---------+-----------+--------+---------+--------------+-------------+ - | 8 | L* | 100 | 0 | 0 | 100 | - | +-----------+--------+---------+--------------+-------------+ - | | a* | 170 | 128 | -21760/255 | 21590/255 | - | +-----------+--------+---------+--------------+-------------+ - | | b* | 200 | 96 | -19200/255 | 31800/255 | - +---------+-----------+--------+---------+--------------+-------------+ - | 12 | L* | 100 | 0 | 0 | 100 | - | +-----------+--------+---------+--------------+-------------+ - | | a* | 170 | 2048 | -348160/4095 | 347990/4095 | - | +-----------+--------+---------+--------------+-------------+ - | | b* | 200 | 1536 | -307200/4095 | 511800/4095 | - +---------+-----------+--------+---------+--------------+-------------+ - - For example, when PhotometricInterpretation=10 and BitsPerSample=8, - the default value for Decode is (0, 100, -21760/255, 21590/255, - -19200/255, 31800/255). - diff -Nru ghostscript-9.04~dfsg/lib/cbjc600.ppd ghostscript-9.05~dfsg~20120125/lib/cbjc600.ppd --- ghostscript-9.04~dfsg/lib/cbjc600.ppd 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/lib/cbjc600.ppd 2011-09-29 11:01:35.000000000 +0000 @@ -7,12 +7,15 @@ *% End of Copyright statement *FormatVersion: "4.1" *FileVersion: "1.0" +*LanguageEncoding: ISOLatin1 *LanguageVersion: English *PCFileName: "CBJC600.PPD" *Product: "(Canon Bubble Jet Color 600)" *PSVersion: "(2010.351) 0" *ModelName: "Canon Bubble Jet Color 600" *NickName: "BJC-600" +*ShortNickName: "BJC-600" +*Manufacturer: "Canon" *% This file is not complete, and may lack some useful information... @@ -104,6 +107,7 @@ " *End +*DefaultPaperDimension: Letter *PaperDimension A4: "595 842" *PaperDimension A5: "421 595" *PaperDimension A6: "297 421" @@ -332,7 +336,7 @@ *OpenUI *ThickMedia/Thick Media: PickOne *OrderDependency: 30 AnySetup *ThickMedia -*Default ThickMedia: Thin +*DefaultThickMedia: Thin *ThickMedia Thin/No: " 1 dict dup /MediaWeight 80 put setpagedevice" diff -Nru ghostscript-9.04~dfsg/lib/cbjc800.ppd ghostscript-9.05~dfsg~20120125/lib/cbjc800.ppd --- ghostscript-9.04~dfsg/lib/cbjc800.ppd 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/lib/cbjc800.ppd 2011-09-29 11:01:35.000000000 +0000 @@ -7,12 +7,15 @@ *% End of Copyright statement *FormatVersion: "4.1" *FileVersion: "1.0" +*LanguageEncoding: ISOLatin1 *LanguageVersion: English *PCFileName: "CBJC800.PPD" *Product: "(Canon Bubble Jet Color 800)" *PSVersion: "(2010.351) 0" *ModelName: "Canon Bubble Jet Color 800" *NickName: "BJC-800" +*ShortNickName: "BJC-800" +*Manufacturer: "Canon" *% This file is not complete, and may lack some useful information... @@ -114,6 +117,7 @@ " *End +*DefaultPaperDimension: Letter *PaperDimension A4: "595 842" *PaperDimension A5: "421 595" *PaperDimension A6: "297 421" @@ -342,7 +346,7 @@ *OpenUI *ThickMedia/Thick Media: PickOne *OrderDependency: 30 AnySetup *ThickMedia -*Default ThickMedia: Thin +*DefaultThickMedia: Thin *ThickMedia Thin/No: " 1 dict dup /MediaWeight 80 put setpagedevice" diff -Nru ghostscript-9.04~dfsg/lib/gssetgs32.bat ghostscript-9.05~dfsg~20120125/lib/gssetgs32.bat --- ghostscript-9.04~dfsg/lib/gssetgs32.bat 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/lib/gssetgs32.bat 2012-01-07 20:18:22.000000000 +0000 @@ -0,0 +1,8 @@ +@echo off +@rem $Id$ + +rem Set default values for GS (gs with graphics window) and GSC +rem (console mode gs) if the user hasn't set them. + +if %GS%/==/ set GS=gswin32 +if %GSC%/==/ set GSC=gswin32c diff -Nru ghostscript-9.04~dfsg/lib/gssetgs64.bat ghostscript-9.05~dfsg~20120125/lib/gssetgs64.bat --- ghostscript-9.04~dfsg/lib/gssetgs64.bat 1970-01-01 00:00:00.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/lib/gssetgs64.bat 2012-01-07 20:18:22.000000000 +0000 @@ -0,0 +1,8 @@ +@echo off +@rem $Id$ + +rem Set default values for GS (gs with graphics window) and GSC +rem (console mode gs) if the user hasn't set them. + +if %GS%/==/ set GS=gswin64 +if %GSC%/==/ set GSC=gswin64c diff -Nru ghostscript-9.04~dfsg/lib/opdfread.ps ghostscript-9.05~dfsg~20120125/lib/opdfread.ps --- ghostscript-9.04~dfsg/lib/opdfread.ps 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/lib/opdfread.ps 2012-01-07 20:18:22.000000000 +0000 @@ -890,8 +890,20 @@ } if pop pop 3 index 3 index 2 copy % bw bh px0 py0 bw bh bw bh currentglobal false setglobal 3 1 roll % bw bh px0 py0 bw bh bool bw bh - 2 array astore % bw bh px0 py0 bw bh bool [] - << exch /PageSize exch >> setpagedevice % bw bh px0 py0 bw bh bool + currentpagedevice dup /PageSize known { + /PageSize get aload pop % Get current page size + } { + 0 0 % dummy page size values if not known + }ifelse + % bw bh px0 py0 bw bh bool bw bh Width Height + round cvi 2 index round cvi % bw bh px0 py0 bw bh bool bw bh Width bool + exch round cvi 3 index round cvi eq and % bw bh px0 py0 bw bh bool bw bh bool + { % Page Size unchanged, do not emit setpagedevice + pop pop % bw bh px0 py0 bw bh bool + } { + 2 array astore % bw bh px0 py0 bw bh bool [] + << exch /PageSize exch >> setpagedevice % bw bh px0 py0 bw bh bool + } ifelse userdict /PDFR_InitialGS gstate put setglobal % bw bh px0 py0 bw bh } if @@ -1994,6 +2006,33 @@ closepath stroke } bind def +%% These two routines may have more general application. +%% When executing BuildChar we need to run in the context of the font +%% as far as resources are concerned (in case the glyph uses another font) +%% but since we are executing a page stream, we must not lose the original +%% context, or we won't be able to find page resources. Originally this was +%% a simpler routine, but this failed when presented with a type 3 font +%% whose BuildChar/CharProcs used another type 3 font +/SaveResourcesToStack +{ + [ + //PDFReader /OldResources known { + //PDFReader /OldResources get + }{ + null + } ifelse + //PDFReader /CurrentObject get /Context get /Resources get + ] + //PDFReader /OldResources 3 -1 roll put +}bind def + +/RestoreResourcesFromStack +{ + //PDFReader /OldResources get dup + 0 get //PDFReader /OldResources 3 -1 roll put + 1 get //PDFReader /CurrentObject get /Context get /Resources 3 -1 roll put +} bind def + /BuildChar % BuildChar - { //PDFR_DEBUG { (BuildChar ) print dup //=only exec ( ) print @@ -2005,12 +2044,24 @@ } if dup null eq { pop //NotDef exec % - } { % n - CharProcs exch //knownget exec { % cp_stream - //RunDelayedStream exec - } { + } + { % n + CharProcs exch//knownget exec + { + currentfont /Font get /Resources //knownget exec{ %% Does the Font have any Resources ? + exec %% Get them + SaveResourcesToStack %% Save the current Resources + //PDFReader /CurrentObject get /Context get %% Replace the current resources + /Resources 3 -1 roll put %% With the Font resources + //RunDelayedStream exec + RestoreResourcesFromStack %% Restore the previous Resources + } { + //RunDelayedStream exec + } ifelse + } + { //NotDef exec - } ifelse + }ifelse } ifelse % end % font } bind def @@ -2319,6 +2370,7 @@ % idiosyncratic fonts that start at 0xf000: pop /firstcode startc 0 getu16 16#ff00 and dup 16#f000 ne { pop 0 } if def + /striptopbyte false def /putglyph { glyphs code 3 -1 roll put /code code 1 add def } bind def @@ -2328,14 +2380,20 @@ /i2 exch def /scode startc i2 getu16 def /ecode endc i2 getu16 def - numcodes scode firstcode sub - % Hack for fonts that have only 0x0000 and 0xf000 ranges - %dup 16#e000 ge { 255 and } if - % the previous line is obstructive to CJK fonts, so it was removed - exch sub 0 .max ecode scode sub 1 add add - exch 1 index add exch - numcodes add /numcodes exch def - } for array def + ecode lastcode gt { + /lastcode ecode def + } if + } for pop + % If the glyph range is within 0x..00 to 0x..FF, make sure that we strip + % off any top bytes. + firstcode 16#f000 ge lastcode firstcode sub 255 le and { + lastcode 255 and + /striptopbyte true def + } { + lastcode + }ifelse + 1 add + array def % prefill the array with 0's faster than a { 0 putglyph } repeat glyphs length 1024 ge { .array1024z 0 1024 glyphs length 1023 sub { glyphs exch 2 index putinterval } for @@ -2365,9 +2423,19 @@ } if idroff i2 getu16 dup 0 eq { pop scode delta add 65535 and 1 ecode delta add 65535 and + striptopbyte { + /code scode 255 and def + } { + /code scode def + } ifelse { putglyph } for } { % The +2 is for the 'reserved pad'. /gloff exch 14 nseg2 3 mul add 2 add i2 add add def + striptopbyte { + /code scode 255 and def + } { + /code scode def + } ifelse 0 1 ecode scode sub { 2 mul gloff add etab exch getu16 dup 0 ne { delta add 65535 and } if putglyph @@ -3563,7 +3631,7 @@ dup 0 get /CalGray eq { 1 get % dict dup /Gamma //knownget exec { - [ exch /exp load ] cvx + [ exch [ exch /exp load ] cvx dup dup ] 1 index exch /DecodeLMN exch put } if [ exch /CIEBasedA exch ] % [] @@ -3717,6 +3785,16 @@ 2 copy 3 exch put pop } if + dup 0 get/Pattern eq{ + dup length 1 gt { + dup dup 1 get dup type /arraytype eq { + ResolveColorSpaceArray + 1 index 1 3 -1 roll put + }{ + pop + }ifelse + }if + }if PDFR_DEBUG { (Construcrted color space :) = dup == diff -Nru ghostscript-9.04~dfsg/lib/PDFA_def.ps ghostscript-9.05~dfsg~20120125/lib/PDFA_def.ps --- ghostscript-9.04~dfsg/lib/PDFA_def.ps 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/lib/PDFA_def.ps 2011-09-29 11:01:35.000000000 +0000 @@ -6,16 +6,7 @@ % This assumes an ICC profile to reside in the file (ISO Coated sb.icc), % unless the user modifies the corresponding line below. -systemdict /ProcessColorModel known { - systemdict /ProcessColorModel get dup /DeviceGray ne exch /DeviceCMYK ne and -} { - true -} ifelse -{ (ERROR: ProcessColorModel must be /DeviceGray or DeviceCMYK.)= - /ProcessColorModel cvx /rangecheck signalerror -} if - -% Define entries to the document Info dictionary : +% Define entries in the document Info dictionary : /ICCProfile (ISO Coated sb.icc) % Customize. def diff -Nru ghostscript-9.04~dfsg/lib/prfont.ps ghostscript-9.05~dfsg~20120125/lib/prfont.ps --- ghostscript-9.04~dfsg/lib/prfont.ps 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/lib/prfont.ps 2011-09-29 11:02:09.000000000 +0000 @@ -155,7 +155,7 @@ 0 128 Unencoded length 1 sub { /BlockStart 1 index def - dup 128 add Unencoded length .min 1 index sub + dup 128 add Unencoded length min 1 index sub Unencoded 3 1 roll getinterval TempEncoding copy /BlockEncoding exch def /BlockCount BlockEncoding length def @@ -176,7 +176,7 @@ 36 2.4 Inch moveto 0 32 BlockCount 1 sub { 0 -0.4 Inch rmoveto gsave - dup 31 add BlockCount 1 sub .min + dup 31 add BlockCount 1 sub min exch BlockStart add exch BlockStart add DoLine grestore } for diff -Nru ghostscript-9.04~dfsg/Makefile.in ghostscript-9.05~dfsg~20120125/Makefile.in --- ghostscript-9.04~dfsg/Makefile.in 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,628 +0,0 @@ -# Copyright (C) 2001-2006 Artifex Software, Inc. -# All Rights Reserved. -# -# This software is provided AS-IS with no warranty, either express or -# implied. -# -# This software is distributed under license and may not be copied, modified -# or distributed except as expressly authorized under the terms of that -# license. Refer to licensing information at http://www.artifex.com/ -# or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, -# San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -# -# $Id$ -# makefile template for/from the autoconf build. -# @configure_input@ - -# ------------------------------- Options ------------------------------- # - -####### The following are the only parts of the file you should need to edit. - -# Define the directory for the final executable, and the -# source, generated intermediate file, and object directories -# for the graphics library (GL) and the PostScript/PDF interpreter (PS). - -BINDIR=./$(BUILDDIRPREFIX)bin -GLSRCDIR=./base -GLGENDIR=./$(BUILDDIRPREFIX)@OBJDIR_BSDMAKE_WORKAROUND@ -GLOBJDIR=./$(BUILDDIRPREFIX)@OBJDIR_BSDMAKE_WORKAROUND@ -AUXDIR=$(GLGENDIR)/aux -PSSRCDIR=./psi -PSLIBDIR=./lib -PSRESDIR=./Resource -PSGENDIR=./$(BUILDDIRPREFIX)@OBJDIR_BSDMAKE_WORKAROUND@ -PSOBJDIR=./$(BUILDDIRPREFIX)@OBJDIR_BSDMAKE_WORKAROUND@ -CONTRIBDIR=./contrib - -# Do not edit the next group of lines. - -include $(GLSRCDIR)/version.mak -DD=$(GLGENDIR)/ -GLD=$(GLGENDIR)/ -PSD=$(PSGENDIR)/ - -# ------ Generic options ------ # - -# Define the installation commands and target directories for -# executables and files. The commands are only relevant to `make install'; -# the directories also define the default search path for the -# initialization files (gs_*.ps) and the fonts. - -INSTALL = $(GLSRCDIR)/instcopy -c -INSTALL_PROGRAM = $(INSTALL) -m 755 -INSTALL_DATA = $(INSTALL) -m 644 -INSTALL_SHARED = @INSTALL_SHARED@ - -prefix = @prefix@ -exec_prefix = @exec_prefix@ -bindir = @bindir@ -scriptdir = $(bindir) -includedir = @includedir@ -libdir = @libdir@ -mandir = @mandir@ -man1ext = 1 -man1dir = $(mandir)/man$(man1ext) -datadir = @datadir@ -datarootdir = @datarootdir@ - -# The following must be substituted using @datadir@ and @libdir@ -# to avoid adding RPM generation paths (CUPS STR #1112) -gsdir = @datadir@/ghostscript -gsdatadir = $(gsdir)/$(GS_DOT_VERSION) -gssharedir = @libdir@/ghostscript/$(GS_DOT_VERSION) -gsincludedir = @includedir@/ghostscript/ - -docdir=$(gsdatadir)/doc -exdir=$(gsdatadir)/examples -GS_DOCDIR=$(docdir) - -# Define install location for 'cups' device/filter support -CUPSCFLAGS=@CUPSCFLAGS@ -CUPSLIBS=@CUPSLIBS@ -CUPSLIBDIRS=@CUPSLIBDIRS@ -CUPSSERVERBIN=@CUPSSERVERBIN@ -CUPSSERVERROOT=@CUPSSERVERROOT@ -CUPSDATA=@CUPSDATA@ -CUPSPDFTORASTER=@CUPSPDFTORASTER@ - -CUPSINSTTARGET=@CUPSINSTALL@ - -# Choose whether to compile the .ps initialization files into the executable. -# See gs.mak for details. - -COMPILE_INITS=@COMPILE_INITS@ - -# Define the default directory/ies for the runtime -# initialization and font files. Separate multiple directories with a :. - -GS_LIB_DEFAULT=$(gsdatadir)/Resource/Init:$(gsdatadir)/lib:$(gsdatadir)/Resource/Font:$(gsdir)/fonts:@fontpath@ - -# Define the default directory for cached data files -# this must be a single path. - -GS_CACHE_DIR="~/.ghostscript/cache/" - -# Define whether or not searching for initialization files should always -# look in the current directory first. This leads to well-known security -# and confusion problems, but may be convenient sometimes. - -SEARCH_HERE_FIRST=0 - -# Define the name of the interpreter initialization file. -# (There is no reason to change this.) - -GS_INIT=gs_init.ps - -# Choose generic configuration options. - -# -DDEBUG -# includes debugging features (-Z switch) in the code. -# Code runs substantially slower even if no debugging switches -# are set. - -GENOPT= - -# Choose capability options. - -# -DHAVE_BSWAP32 -# use bswap32 intrinsic -# -DHAVE_BYTESWAP_H -# use byteswap.h functions -# -# -DHAVE_MKSTEMP -# uses mkstemp instead of mktemp -# This uses the more secure temporary file creation call -# Enable this if it is available on your platform. -# -DHAVE_FILE64 -# use marked versions of the stdio FILE calls, fopen64() et al. -# -# -DHAVE_MKSTEMP64 -# use non-standard function mkstemp64() -# -# -DHAVE_LIBIDN -# use libidn to canonicalize Unicode passwords -# -# -DHAVE_SETLOCALE -# call setlocale(LC_CTYPE) when running as a standalone app -# -DHAVE_SSE2 -# use sse2 intrinsics - -CAPOPT= @HAVE_MKSTEMP@ @HAVE_FILE64@ @HAVE_MKSTEMP64@ @HAVE_FONTCONFIG@ @HAVE_LIBIDN@ @HAVE_SETLOCALE@ @HAVE_SSE2@ @HAVE_DBUS@ @HAVE_BSWAP32@ @HAVE_BYTESWAP_H@ - -# Define the name of the executable file. - -GS=@GS@@EXEEXT@ - -# Define the directories for debugging and profiling binaries, relative to -# the standard binaries. - -DEBUGDIRPREFIX=debug -PGDIRPREFIX=pg - -# Define whether to compile in the FreeType library, and if so, where -# the source tree is location. Otherwise, what library name to use -# in linking to a shared implementation. - -FT_BRIDGE=@FT_BRIDGE@ -SHARE_FT=@SHARE_FT@ -FTSRCDIR=@FTSRCDIR@ -FT_CFLAGS=@FT_CFLAGS@ -FT_LIBS=@FT_LIBS@ -FT_CONFIG_SYSTEM_ZLIB=@FT_SYS_ZLIB@ - -# Define whether to compile in UFST. Note that freetype will/must be disabled. -# FAPI/UFST depends on UFST_BRIDGE being undefined - hence the construct below. -# (i.e. use "UFST_BRIDGE=1" or *not to define UFST_BRIDGE to anything*) -@INSERT_UFST_BRIDGE_EQUAL_ONE@ -UFST_ROOT=@UFST_ROOT@ -UFST_LIB_EXT=@UFST_LIB_EXT@ - -UFST_ROMFS_ARGS?=-b \ - -P $(UFST_ROOT)/fontdata/mtfonts/pcl45/mt3/ -d fontdata/mtfonts/pcl45/mt3/ pcl___xj.fco plug__xi.fco wd____xh.fco \ - -P $(UFST_ROOT)/fontdata/mtfonts/pclps2/mt3/ -d fontdata/mtfonts/pclps2/mt3/ pclp2_xj.fco \ - -c -P $(PSSRCDIR)/../lib/ -d Resource/Init/ FAPIconfig-FCO - -UFSTROMFONTDIR=\"%rom%fontdata/\" -UFSTDISCFONTDIR?=\"$(UFST_ROOT)/fontdata/\" - - -UFST_CFLAGS=@UFST_CFLAGS@ - -# Define the directory where the IJG JPEG library sources are stored, -# and the major version of the library that is stored there. -# You may need to change this if the IJG library version changes. -# See jpeg.mak for more information. - -JSRCDIR=@LIBJPEGDIR@ - -# Note: if a shared library is used, it may not contain the -# D_MAX_BLOCKS_IN_MCU patch, and thus may not be able to read -# some older JPEG streams that violate the standard. If the JPEG -# library built from local sources, the patch will be applied. - -SHARE_JPEG=@SHARE_LIBJPEG@ -JPEG_NAME=jpeg - -# Define the directory where the PNG library sources are stored, -# and the version of the library that is stored there. -# You may need to change this if the libpng version changes. -# See png.mak for more information. - -SHARE_LIBPNG=@SHARE_LIBPNG@ -PNGSRCDIR=@LIBPNGDIR@ -LIBPNG_NAME=png - -# libtiff -SHARE_LIBTIFF=@SHARE_LIBTIFF@ -TIFFSRCDIR=@LIBTIFFDIR@ -TIFFPLATFORM=unix -TIFFCONFIG_SUFFIX= -LIBTIFF_NAME=tiff - -# Define the directory where the zlib sources are stored. -# See zlib.mak for more information. - -SHARE_ZLIB=@SHARE_ZLIB@ -ZSRCDIR=@ZLIBDIR@ -#ZLIB_NAME=gz -ZLIB_NAME=z - -# Choose shared or compiled in libjbig2dec and source location -# JBIG2_LIB=jbig2dec -JBIG2_LIB=@JBIG2_DECODER@ -SHARE_JBIG2=@SHARE_JBIG2@ -JBIG2SRCDIR=@JBIG2DIR@ -JBIG2_CFLAGS=@JBIG2_AUTOCONF_CFLAGS@ - -# uncomment the following three lines and one of the last two to -# compile in the Luratech ldf_jb2 codec -#JBIG2_LIB=luratech -#SHARE_JBIG2=0 -#JBIG2SRCDIR=ldf_jb2 -#JBIG2_CFLAGS=-DUSE_LDF_JB2 -DLINUX -#JBIG2_CFLAGS=-DUSE_LDF_JB2 -DMAC -DMAC_OS_X_BUILD - - -# Choose the library to use for (JPXDecode support) -# whether to link to an external build or compile in from source -# and source location and configuration flags for compiling in -JPX_LIB=@JPX_DECODER@ -SHARE_JPX=@SHARE_JASPER@ -JPXSRCDIR=@JPXDIR@ -JPX_CFLAGS=@JPX_AUTOCONF_CFLAGS@ - -# uncomment the following three lines and one of the last two to -# compile in the Luratech lwf_jp2 codec -#JPX_LIB=luratech -#SHARE_JPX=0 -#JPXSRCDIR=lwf_jp2 -#JPX_CFLAGS=-DUSE_LWF_JP2 -DLINUX -#JPX_CFLAGS=-DUSE_LWF_JP2 -DMAC -DMAC_OS_X_BUILD - -# Define the directory where the icclib source are stored. -# See icclib.mak for more information - -ICCSRCDIR=icclib - -# options for lcms color management library -SHARE_LCMS=@SHARELCMS@ -LCMSSRCDIR=@LCMSDIR@ -LCMS2SRCDIR=@LCMS2DIR@ - -# Which CMS are we using? -# Options are currently lcms or lcms2 -WHICH_CMS=lcms - -# Define the directory where the ijs source is stored, -# and the process forking method to use for the server. -# See ijs.mak for more information. - -SHARE_IJS=@SHAREIJS@ -IJS_NAME=@IJSLIB@ -IJSSRCDIR=@IJSDIR@ -IJSEXECTYPE=unix - - -SHARE_LCUPS=@SHARELCUPS@ -LCUPS_NAME=cups -LCUPSSRCDIR=cups -LCUPSBUILDTYPE=@LCUPSBUILDTYPE@ -CUPS_CC=$(CC) - -SHARE_LCUPSI=@SHARELCUPSI@ -LCUPSI_NAME=cupsimage -LCUPSISRCDIR=cups -CUPS_CC=$(CC) - - -# Define the directory where the imdi library source is stored. -# See devs.mak for more information. - -IMDISRCDIR=imdi - -# Define how to build the library archives. (These are not used in any -# standard configuration.) - -AR=ar -ARFLAGS=qc -RANLIB=@RANLIB@ - -# ------ Platform-specific options ------ # - -# Define the name of the C compiler (target and host (AUX)) - -CC=@CC@ -CCAUX=@CC@ - -# Define the name of the linker for the final link step. -# Normally this is the same as the C compiler. - -CCLD=$(CC) -CCAUXLD=$(CCAUX) - -# Define the default gcc flags. -GCFLAGS=@CPPFLAGS@ @GCFLAGS@ @CFLAGS@ - -# Define the added flags for standard, debugging, profiling -# and shared object builds. - -CFLAGS_STANDARD=@OPT_CFLAGS@ -CFLAGS_DEBUG=@DBG_CFLAGS@ -CFLAGS_PROFILE=-pg @OPT_CFLAGS@ -CFLAGS_SO=@DYNAMIC_CFLAGS@ - -# Define the other compilation flags. Add at most one of the following: -# -DBSD4_2 for 4.2bsd systems. -# -DSYSV for System V or DG/UX. -# -DSYSV -D__SVR3 for SCO ODT, ISC Unix 2.2 or before, -# or any System III Unix, or System V release 3-or-older Unix. -# -DSVR4 -DSVR4_0 (not -DSYSV) for System V release 4.0. -# -DSVR4 (not -DSYSV) for System V release 4.2 (or later) and Solaris 2. -# XCFLAGS can be set from the command line. -# We don't include -ansi, because this gets in the way of the platform- -# specific stuff that typically needs; nevertheless, we expect -# gcc to accept ANSI-style function prototypes and function definitions. -XCFLAGS=@DYNAMIC_FLAGS@ - -# fontconfig flags, used by unix-aux.mak -FONTCONFIG_CFLAGS=@FONTCONFIG_CFLAGS@ -FONTCONFIG_LIBS=@FONTCONFIG_LIBS@ - -# DBus flags, used by cups.mak -DBUS_CFLAGS=@DBUS_CFLAGS@ -DBUS_LIBS=@DBUS_LIBS@ - -# defines from autoconf; note that we don't use these at present. -ACDEFS=@DEFS@ - -CFLAGS=$(CFLAGS_STANDARD) $(GCFLAGS) $(XCFLAGS) - -# Define platform flags for ld. -# SunOS 4.n may need -Bstatic. -# Solaris 2.6 (and possibly some other versions) with any of the SHARE_ -# parameters set to 1 may need -# -R /usr/local/xxx/lib:/usr/local/lib -# giving the full path names of the shared library directories. -# XLDFLAGS can be set from the command line. -XLDFLAGS=@X_LDFLAGS@ - -LDFLAGS=@LDFLAGS@ $(XLDFLAGS) - -# Define any extra libraries to link into the executable. -# ISC Unix 2.2 wants -linet. -# SCO Unix needs -lsocket if you aren't including the X11 driver. -# SVR4 may need -lnsl. -# Solaris may need -lnsl -lsocket -lposix4. -# (Libraries required by individual drivers are handled automatically.) - -EXTRALIBS=@LIBS@ @DYNAMIC_LIBS@ @FONTCONFIG_LIBS@ - -# Define the standard libraries to search at the end of linking. -# Most platforms require -lpthread for the POSIX threads library; -# on FreeBSD, change -lpthread to -lc_r; BSDI and perhaps some others -# include pthreads in libc and don't require any additional library. -# All reasonable platforms require -lm, but Rhapsody and perhaps one or -# two others fold libm into libc and don't require any additional library. - -STDLIBS=@PTHREAD_LIBS@ -lm - -# Define the include switch(es) for the X11 header files. -# This can be null if handled in some other way (e.g., the files are -# in /usr/include, or the directory is supplied by an environment variable) - -XINCLUDE=@X_CFLAGS@ - -# Define the directory/ies and library names for the X11 library files. -# XLIBDIRS is for ld and should include -L; XLIBDIR is for LD_RUN_PATH -# (dynamic libraries on SVR4) and should not include -L. -# Newer SVR4 systems can use -R in XLIBDIRS rather than setting XLIBDIR. -# Both can be null if these files are in the default linker search path. - -# Solaris and other SVR4 systems with dynamic linking probably want -#XLIBDIRS=-L/usr/openwin/lib -R/usr/openwin/lib -# X11R6 (on any platform) may need -#XLIBS=Xt SM ICE Xext X11 - -# We use the autoconf macro AC_PATH_XTRA which defines X_LIBS with -# the -L (or whatever). It also defines X_PRE_LIBS and X_EXTRA_LIBS -# all three of which are stripped and slotted into XLIBS below. -# Usually however, all but X_LIBS are empty on modern platforms. -XLIBDIRS=@X_LDFLAGS@ -XLIBDIR= -#XLIBS=Xt Xext X11 -XLIBS=@X_LIBS@ - -# Define the .dev module that implements thread and synchronization -# primitives for this platform. - -# If POSIX sync primitives are used, also change the STDLIBS to include -# the pthread library. Otherwise use SYNC=nosync -#SYNC=posync -#SYNC=nosync -SYNC=@SYNC@ - -# programs we use -RM=rm -f - -# ------ Dynamic loader options ------- # -SOC_CFLAGS = @SOC_CFLAGS@ -SOC_LIBS = @SOC_LIBS@ -SOC_LOADER = @SOC_LOADER@ - - -#CAIRO_CFLAGS = @CAIRO_CFLAGS@ -#CAIRO_LIBS = @CAIRO_LIBS@ - -# ------ Devices and features ------ # - -# Choose the language feature(s) to include. See gs.mak for details. - -FEATURE_DEVS=$(PSD)psl3.dev $(PSD)pdf.dev $(PSD)dpsnext.dev $(PSD)ttfont.dev $(PSD)epsf.dev $(GLD)pipe.dev $(GLD)gsnogc.dev $(GLD)htxlib.dev $(PSD)fapi.dev @JBIG2DEVS@ @JPXDEVS@ @UTF8DEVS@ -#FEATURE_DEVS=$(PSD)psl3.dev $(PSD)pdf.dev -#FEATURE_DEVS=$(PSD)psl3.dev $(PSD)pdf.dev $(PSD)dpsnext.dev $(PSD)ttfont.dev $(PSD)rasterop.dev $(GLD)pipe.dev -# The following is strictly for testing. -FEATURE_DEVS_ALL=$(PSD)psl3.dev $(PSD)pdf.dev $(PSD)dpsnext.dev $(PSD)ttfont.dev $(PSD)rasterop.dev $(PSD)double.dev $(PSD)trapping.dev $(PSD)stocht.dev $(GLD)pipe.dev $(GLD)gsnogc.dev $(GLD)htxlib.dev @JBIG2DEVS@ @JPXDEVS@ @UTF8DEVS@ -#FEATURE_DEVS=$(FEATURE_DEVS_ALL) - -# The list of resources to be included in the %rom% file system. -# This is in the top makefile since the file descriptors are platform specific -RESOURCE_LIST=Resource/CMap/ Resource/ColorSpace/ Resource/Decoding/ Resource/Font/ Resource/ProcSet/ Resource/IdiomSet/ Resource/CIDFont/ - -# Choose whether to store band lists on files or in memory. -# The choices are 'file' or 'memory'. - -BAND_LIST_STORAGE=file - -# Choose which compression method to use when storing band lists in memory. -# The choices are 'lzw' or 'zlib'. - -BAND_LIST_COMPRESSOR=zlib - -# Choose the implementation of file I/O: 'stdio', 'fd', or 'both'. -# See gs.mak and sfxfd.c for more details. - -FILE_IMPLEMENTATION=stdio - -# Choose the implementation of stdio: '' for file I/O and 'c' for callouts -# See gs.mak and ziodevs.c/ziodevsc.c for more details. - -STDIO_IMPLEMENTATION=c - -# List of default devices, in order of priority. They need not be -# present in the actual build. -GS_DEV_DEFAULT="x11alpha bbox" - -# Fallback default device. This is set to 'display' by -# unix-dll.mak when building a shared object. -DISPLAY_DEV=$(DD)bbox.dev - -# Choose the device(s) to include. See devs.mak for details, -# devs.mak and contrib.mak for the list of available devices. - -#DEVICE_DEVS=$(DISPLAY_DEV) $(DD)x11.dev $(DD)x11alpha.dev $(DD)x11cmyk.dev $(DD)x11gray2.dev $(DD)x11gray4.dev $(DD)x11mono.dev -#DEVICE_DEVS=$(DISPLAY_DEV) @X11DEVS@ -#DEVICE_DEVS=$(DISPLAY_DEV) @X_DEVS@ - -#DEVICE_DEVS1=$(DD)bmpmono.dev $(DD)bmpgray.dev $(DD)bmpsep1.dev $(DD)bmpsep8.dev $(DD)bmp16.dev $(DD)bmp256.dev $(DD)bmp16m.dev $(DD)bmp32b.dev -#DEVICE_DEVS2=#$(DD)gdevjbig2.dev $(DD)gdevjpx.dev #$(DD)rinkj.dev -#DEVICE_DEVS3=$(DD)deskjet.dev $(DD)djet500.dev $(DD)laserjet.dev $(DD)ljetplus.dev $(DD)ljet2p.dev $(DD)ljet3.dev $(DD)ljet3d.dev $(DD)ljet4.dev $(DD)ljet4d.dev $(DD)lj5mono.dev $(DD)lj5gray.dev -#DEVICE_DEVS4=$(DD)cdeskjet.dev $(DD)cdjcolor.dev $(DD)cdjmono.dev $(DD)cdj550.dev $(DD)pj.dev $(DD)pjxl.dev $(DD)pjxl300.dev -#DEVICE_DEVS5=$(DD)uniprint.dev @IJSDEVS@ -#DEVICE_DEVS6=$(DD)bj10e.dev $(DD)bj200.dev $(DD)bjc600.dev $(DD)bjc800.dev -#DEVICE_DEVS7=$(DD)faxg3.dev $(DD)faxg32d.dev $(DD)faxg4.dev $(DD)cfax.dev -#DEVICE_DEVS8=$(DD)pcxmono.dev $(DD)pcxgray.dev $(DD)pcx16.dev $(DD)pcx256.dev $(DD)pcx24b.dev $(DD)pcxcmyk.dev -#DEVICE_DEVS9=$(DD)pbm.dev $(DD)pbmraw.dev $(DD)pgm.dev $(DD)pgmraw.dev $(DD)pgnm.dev $(DD)pgnmraw.dev $(DD)pnm.dev $(DD)pnmraw.dev $(DD)ppm.dev $(DD)ppmraw.dev $(DD)pkm.dev $(DD)pkmraw.dev $(DD)pksm.dev $(DD)pksmraw.dev -#DEVICE_DEVS10=$(DD)tiffcrle.dev $(DD)tiffg3.dev $(DD)tiffg32d.dev $(DD)tiffg4.dev $(DD)tifflzw.dev $(DD)tiffpack.dev -#DEVICE_DEVS11=$(DD)tiff12nc.dev $(DD)tiff24nc.dev $(DD)tiff48nc.dev $(DD)tiffgray.dev $(DD)tiff32nc.dev $(DD)tiff64nc $(DD)tiffsep.dev $(DD)tiffsep1.dev -#DEVICE_DEVS12=$(DD)psmono.dev $(DD)psgray.dev $(DD)psrgb.dev $(DD)bit.dev $(DD)bitrgb.dev $(DD)bitcmyk.dev -#DEVICE_DEVS13=$(DD)pngmono.dev $(DD)pnggray.dev $(DD)png16.dev $(DD)png256.dev $(DD)png16m.dev -#DEVICE_DEVS13=@PNGDEVS@ -#DEVICE_DEVS14=$(DD)jpeg.dev $(DD)jpeggray.dev -#DEVICE_DEVS15=$(DD)pdfwrite.dev $(DD)pswrite.dev $(DD)ps2write.dev $(DD)epswrite.dev $(DD)txtwrite.dev $(DD)pxlmono.dev $(DD)pxlcolor.dev -#DEVICE_DEVS16=$(DD)bbox.dev - -#DEVICE_DEVS17= -#DEVICE_DEVS18= -#DEVICE_DEVS19= -#DEVICE_DEVS20=$(DD)cljet5.dev $(DD)cljet5c.dev -#DEVICE_DEVS21=$(DD)spotcmyk.dev $(DD)devicen.dev $(DD)xcf.dev $(DD)psdcmyk.dev $(DD)psdrgb.dev -DEVICE_DEVS=$(DISPLAY_DEV) @X11_DEVS@ -DEVICE_DEVS1=@F_DEVS@ -DEVICE_DEVS2=@P_DEVS@ -DEVICE_DEVS3=@CUPS_DEVS@ -DEVICE_DEVS4=@IJS_DEVS@ -DEVICE_DEVS5=@OMNIDEVS@ -DEVICE_DEVS6=@PNG_DEVS@ -DEVICE_DEVS7=@JBIG2_DEVS@ -DEVICE_DEVS8=@SVG_DEVS@ -DEVICE_DEVS9= -DEVICE_DEVS10= -DEVICE_DEVS11= -DEVICE_DEVS12= -DEVICE_DEVS13= -DEVICE_DEVS14= -DEVICE_DEVS15= -DEVICE_DEVS16= -DEVICE_DEVS17= -DEVICE_DEVS18= -DEVICE_DEVS19= -DEVICE_DEVS20= -DEVICE_DEVS21= - - -# Shared library target to build. -GS_SHARED_OBJS=@DYNAMIC_DEVS@ - -# ---------------------------- End of options --------------------------- # - -# Define the name of the partial makefile that specifies options -- -# used in dependencies. - -MAKEFILE=Makefile -TOP_MAKEFILES=$(MAKEFILE) $(GLSRCDIR)/unixhead.mak - -# Define the auxiliary program dependency. We don't use this. - -AK= - -# Define the compilation rules and flags. - -CCFLAGS=$(GENOPT) $(CAPOPT) $(CFLAGS) -CC_=$(CC) $(CCFLAGS) -CCAUX_=$(CCAUX) $(CFLAGS) -CC_LEAF=$(CC_) -# note gcc can't use -fomit-frame-pointer with -pg. -CC_LEAF_PG=$(CC_) -# These are the specific warnings we have to turn off to compile those -# specific few files that need this. We may turn off others in the future. -CC_NO_WARN=$(CC_) -CCAUX_NO_WARN=$(CCAUX_) -CC_SHARED=$(CC_) @DYNAMIC_CFLAGS@ - -LD_SET_DT_SONAME=@SET_DT_SONAME@ - -# MAKEDIRS = the dependency on ALL object files (must be the last one on -# the line. Requires GNU make to make it an 'order only' dependency -# MAKEDIRSTOP = the topmost dependency - set this if you can't set MAKEDIRS - -MAKEDIRS=| directories -MAKEDIRSTOP= - -# ---------------- End of platform-specific section ---------------- # - -INSTALL_CONTRIB=@INSTALL_CONTRIB@ -include $(GLSRCDIR)/unixhead.mak -include $(GLSRCDIR)/gs.mak -# psromfs.mak must precede lib.mak -include $(PSSRCDIR)/psromfs.mak -include $(GLSRCDIR)/lib.mak -include $(PSSRCDIR)/int.mak -include $(GLSRCDIR)/freetype.mak -include $(GLSRCDIR)/jpeg.mak -# zlib.mak must precede png.mak -include $(GLSRCDIR)/zlib.mak -include $(GLSRCDIR)/png.mak -include $(GLSRCDIR)/tiff.mak -include $(GLSRCDIR)/jbig2.mak -include $(GLSRCDIR)/jasper.mak -include $(GLSRCDIR)/ldf_jb2.mak -include $(GLSRCDIR)/lwf_jp2.mak -include $(GLSRCDIR)/icclib.mak -include $(GLSRCDIR)/$(WHICH_CMS).mak -include $(GLSRCDIR)/ijs.mak -@LCUPSINCLUDE@ -@LCUPSIINCLUDE@ -include $(GLSRCDIR)/devs.mak -include $(GLSRCDIR)/contrib.mak -include $(GLSRCDIR)/unix-aux.mak -include $(GLSRCDIR)/unixlink.mak -include $(GLSRCDIR)/unix-dll.mak -include $(GLSRCDIR)/unix-end.mak -include $(GLSRCDIR)/unixinst.mak -@CONTRIBINCLUDE@ -@CUPSINCLUDE@ - -# Clean up after the autotools scripts -# configure.ac and Makefile.in are symlinks from a subdir -# (created by autogen.sh) and so are safe to remove -distclean : clean config-clean soclean pgclean debugclean - -$(RM_) -r $(BINDIR) $(GLOBJDIR) $(PSOBJDIR) $(AUXDIR) - -$(RM_) -r autom4te.cache - -$(RM_) config.log config.status - -$(RM_) Makefile - @-rmdir $(BINDIR) $(GLOBJDIR) $(PSOBJDIR) -# The following is *very* poor - we shouldn't be creating derived files in -# the source directory, but for now..... - -$(RM_) $(TIFFSRCDIR)$(D)libtiff$(D)tif_config.h $(TIFFSRCDIR)$(D)libtiff$(D)tiffconf.h - -# a debug-clean target for consistency with the ghostpdl builds -debug-clean : debugclean - -maintainer-clean : distclean - -$(RM_) configure.ac - -$(RM_) configure - -$(RM_) Makefile.in - -check : default - $(NO_OP) - diff -Nru ghostscript-9.04~dfsg/psi/dwinst.cpp ghostscript-9.05~dfsg~20120125/psi/dwinst.cpp --- ghostscript-9.04~dfsg/psi/dwinst.cpp 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/psi/dwinst.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,954 +0,0 @@ -/* Copyright (C) 2001-2006 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ - -// $Id$ - -#define STRICT -#include -#include -#include -#include -#include -#include - -#include "dwinst.h" - -#define UNINSTALLKEY TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall") -#define UNINSTALLSTRINGKEY TEXT("UninstallString") -#define DISPLAYNAMEKEY TEXT("DisplayName") -#define UNINSTALL_FILE "uninstal.txt" -char szSection[] = "////////////////////////////////\n"; - -#ifdef _MSC_VER -#define mktemp(x) _mktemp(x) -#define chdir(x) _chdir(x) -#define mkdir(x) _mkdir(x) -#endif - - - -////////////////////////////////////////////////////////////////////// -// Construction/Destruction -////////////////////////////////////////////////////////////////////// - -CInstall::CInstall() -{ - CoInitialize(NULL); - - m_szTargetDir[0] = '\0'; - m_szTargetGroup[0] = '\0'; - m_szPrograms[0] = '\0'; - m_szMainDir[0] = '\0'; - AddMessageFn = NULL; - SetAllUsers(FALSE); -} - -CInstall::~CInstall() -{ - CoUninitialize(); -} - -void CInstall::CleanUp(void) -{ - // delete all temporary files - if (m_fLogNew) - fclose(m_fLogNew); - m_fLogNew = NULL; - if (m_fLogOld) - fclose(m_fLogOld); - m_fLogOld = NULL; - - if (strlen(m_szRegistryNew)) - DeleteFile(m_szRegistryNew); - m_szRegistryNew[0] = '\0'; - - if (strlen(m_szRegistryOld)) - DeleteFile(m_szRegistryOld); - m_szRegistryOld[0] = '\0'; - - if (strlen(m_szShellNew)) - DeleteFile(m_szShellNew); - m_szShellNew[0] = '\0'; - - if (strlen(m_szShellOld)) - DeleteFile(m_szShellOld); - m_szShellOld[0] = '\0'; - - if (strlen(m_szFileNew)) - DeleteFile(m_szFileNew); - m_szFileNew[0] = '\0'; -} - - -void CInstall::SetMessageFunction(void(*fn)(const char *)) -{ - AddMessageFn = fn; -} - -void CInstall::AddMessage(const char *message) -{ - if (AddMessageFn) - (*AddMessageFn)(message); -} - -void CInstall::SetTargetDir(const char *szTargetDir) -{ - strcpy(m_szTargetDir, szTargetDir); - // remove trailing backslash - char *p; - p = m_szTargetDir + strlen(m_szTargetDir) - 1; - if (*p == '\\') - *p = '\0'; -} - -void CInstall::SetTargetGroup(const char *szTargetGroup) -{ - strcpy(m_szTargetGroup, szTargetGroup); - // remove trailing backslash - char *p; - p = m_szTargetGroup + strlen(m_szTargetGroup) - 1; - if (*p == '\\') - *p = '\0'; -} - -const char *CInstall::GetMainDir() -{ - return m_szMainDir; -} - -const char *CInstall::GetUninstallName() -{ - return m_szUninstallName; -} - -BOOL CInstall::Init(const char *szSourceDir, const char *szFileList) -{ - FILE *f; - - strcpy(m_szSourceDir, szSourceDir); - // remove trailing backslash - char *p; - p = m_szSourceDir + strlen(m_szSourceDir) - 1; - if (*p == '\\') - *p = '\0'; - strcpy(m_szFileList, szFileList); - - m_szRegistryNew[0] = m_szRegistryOld[0] = - m_szShellNew[0] = m_szShellOld[0] = - m_szFileNew[0] = '\0'; - - // Open list of files - SetCurrentDirectory(m_szSourceDir); - f = fopen(m_szFileList, "r"); - if (f == (FILE *)NULL) { - char buf[MAXSTR]; - wsprintf(buf, "Failed to open \042%s\042\n", m_szFileList); - AddMessage(buf); - return FALSE; - } - - // get application and directory name - m_szUninstallName[0] = '\0'; - if (!fgets(m_szUninstallName, sizeof(m_szUninstallName), f)) { - AddMessage("Invalid file list\n"); - fclose(f); - return FALSE; - } - if (*m_szUninstallName ) - m_szUninstallName[strlen(m_szUninstallName)-1] = '\0'; - - m_szMainDir[0] = '\0'; - if (!fgets(m_szMainDir, sizeof(m_szMainDir), f)) { - AddMessage("Invalid file list\n"); - fclose(f); - return FALSE; - } - if (*m_szMainDir ) - m_szMainDir[strlen(m_szMainDir)-1] = '\0'; - fclose(f); - - // Create log directory - strcpy(m_szLogDir, m_szTargetDir); - strcat(m_szLogDir, "\\"); - strcat(m_szLogDir, m_szMainDir); - MakeDir(m_szLogDir); - - return TRUE; -} - - -////////////////////////////////////////// -// File installation methods - -BOOL CInstall::InstallFiles(BOOL bNoCopy, BOOL *pbQuit) -{ - char szLogNew[MAXSTR]; - - AddMessage(bNoCopy ? "Checking" : "Copying"); - AddMessage(" files listed in "); - AddMessage(m_szFileList); - AddMessage("\n"); - - // Open list of files - SetCurrentDirectory(m_szSourceDir); - FILE *f = fopen(m_szFileList, "r"); - if (f == (FILE *)NULL) { - AddMessage("Failed to open \042"); - AddMessage(m_szFileList); - AddMessage("\042\n"); - return FALSE; - } - - // skip application and directory name - fgets(szLogNew, sizeof(szLogNew), f); - fgets(szLogNew, sizeof(szLogNew), f); - - // Create target log - - m_fLogNew = MakeTemp(m_szFileNew); - if (!m_fLogNew) { - AddMessage("Failed to create FileNew temporary file\n"); - return FALSE; - } - - // Copy files - char line[MAXSTR]; - while (fgets(line, sizeof(line), f) != (char *)NULL) { - if (*pbQuit) - return FALSE; - if (*line) - line[strlen(line)-1] = '\0'; - if (!InstallFile(line, bNoCopy)) { - fclose(f); - fclose(m_fLogNew); - return FALSE; - } - } - fclose(f); - fclose(m_fLogNew); - m_fLogNew = NULL; - return TRUE; -} - - -void CInstall::AppendFileNew(const char *filename) -{ - FILE *f; - /* mark backup file for uninstall */ - if ((f = fopen(m_szFileNew, "a")) != (FILE *)NULL) { - fputs(filename, f); - fputs("\n", f); - fclose(f); - } -} - -// recursive mkdir -// requires a full path to be specified, so ignores root \ -// apart from root \, must not contain trailing \ -// Examples: -// c:\ (OK, but useless) -// c:\gstools (OK) -// c:\gstools\ (incorrect) -// c:gstools (incorrect) -// gstools (incorrect) -// The following UNC names should work, -// but didn't under Win3.1 because gs_chdir wouldn't accept UNC names -// Needs to be tested under Windows 95. -// \\server\sharename\gstools (OK) -// \\server\sharename\ (OK, but useless) -// - -BOOL CInstall::MakeDir(const char *dirname) -{ - char newdir[MAXSTR]; - const char *p; - if (strlen(dirname) < 3) - return -1; - - if (isalpha(dirname[0]) && dirname[1]==':' && dirname[2]=='\\') { - // drive mapped path - p = dirname+3; - } - else if (dirname[1]=='\\' && dirname[1]=='\\') { - // UNC path - p = strchr(dirname+2, '\\'); // skip servername - if (p == NULL) - return -1; - p++; - p = strchr(p, '\\'); // skip sharename - if (p == NULL) - return -1; - } - else { - // not full path so error - return -1; - } - - while (1) { - strncpy(newdir, dirname, (int)(p-dirname)); - newdir[(int)(p-dirname)] = '\0'; - if (chdir(newdir)) { - if (mkdir(newdir)) - return -1; - } - p++; - if (p >= dirname + strlen(dirname)) - break; // all done - p = strchr(p, '\\'); - if (p == NULL) - p = dirname + strlen(dirname); - } - - return SetCurrentDirectory(dirname); -} - -void CInstall::ResetReadonly(const char *filename) -{ - DWORD dwAttr = GetFileAttributes(filename); - if (dwAttr & FILE_ATTRIBUTE_READONLY) - SetFileAttributes(filename, dwAttr & (~FILE_ATTRIBUTE_READONLY)); -} - -BOOL CInstall::InstallFile(char *filename, BOOL bNoCopy) -{ - char existing_name[MAXSTR]; - char new_name[MAXSTR]; - char dir_name[MAXSTR]; - - strcpy(existing_name, m_szSourceDir); - strcat(existing_name, "\\"); - strcat(existing_name, filename); - strcpy(new_name, m_szTargetDir); - strcat(new_name, "\\"); - strcat(new_name, filename); - strcpy(dir_name, new_name); - char *p = strrchr(dir_name, '\\'); - if (p) { - *p = '\0'; - if (!MakeDir(dir_name)) { - AddMessage("Failed to make directory "); - AddMessage(dir_name); - AddMessage("\n"); - return FALSE; - } - } - AddMessage(" "); - AddMessage(new_name); - AddMessage("\n"); - - if (bNoCopy) { - // Don't copy files. Leave them where they are. - // Check that all files exist - FILE *f; - if ((f = fopen(existing_name, "r")) == (FILE *)NULL) { - AddMessage("Missing file "); - AddMessage(existing_name); - AddMessage("\n"); - return FALSE; - } - fclose(f); - } - else { - if (!CopyFile(existing_name, new_name, FALSE)) { - char message[MAXSTR+MAXSTR+100]; - wsprintf(message, "Failed to copy file %s to %s\n", - existing_name, new_name); - AddMessage(message); - return FALSE; - } - ResetReadonly(new_name); - fputs(new_name, m_fLogNew); - fputs("\n", m_fLogNew); - } - - - return TRUE; -} - -////////////////////////////////////////// -// Shell methods - -BOOL CInstall::StartMenuBegin() -{ - m_fLogNew = MakeTemp(m_szShellNew); - if (!m_fLogNew) { - AddMessage("Failed to create ShellNew temporary file\n"); - return FALSE; - } - - m_fLogOld = MakeTemp(m_szShellOld); - if (!m_fLogOld) { - AddMessage("Failed to create ShellNew temporary file\n"); - return FALSE; - } - - // make folder if needed - char szLink[MAXSTR]; - strcpy(szLink, m_szPrograms); - strcat(szLink, "\\"); - strcat(szLink, m_szTargetGroup); - if (chdir(szLink) != 0) { - if (mkdir(szLink) != 0) { - char buf[MAXSTR+64]; - wsprintf(buf, "Couldn't make Programs folder \042%s'042", szLink); - AddMessage(buf); - StartMenuEnd(); - return FALSE; - } - } - else { - fprintf(m_fLogOld, "Group=%s\n\n", szLink); - } - fprintf(m_fLogNew, "Group=%s\n\n", szLink); - - return TRUE; -} - -BOOL CInstall::StartMenuEnd() -{ - if (m_fLogOld) - fclose(m_fLogOld); - m_fLogOld = NULL; - if (m_fLogNew) - fclose(m_fLogNew); - m_fLogNew = NULL; - return TRUE; -} - -BOOL CInstall::StartMenuAdd(const char *szDescription, - const char *szProgram, const char *szArguments) -{ - if (!CreateShellLink(szDescription, szProgram, szArguments)) { - AddMessage("Couldn't make shell link for "); - AddMessage(szDescription); - AddMessage("\n"); - StartMenuEnd(); - return FALSE; - } - - return TRUE; -} - - -BOOL CInstall::CreateShellLink(LPCSTR description, LPCSTR program, - LPCSTR arguments, LPCSTR icon, int nIconIndex) -{ - HRESULT hres; - IShellLink* psl; - CHAR szLink[MAXSTR]; - strcpy(szLink, m_szPrograms); - strcat(szLink, "\\"); - strcat(szLink, m_szTargetGroup); - strcat(szLink, "\\"); - strcat(szLink, description); - strcat(szLink, ".LNK"); - AddMessage("Adding shell link\n "); - AddMessage(szLink); - AddMessage("\n"); - - // Ensure string is UNICODE. - WCHAR wsz[MAX_PATH]; - MultiByteToWideChar(CP_ACP, 0, szLink, -1, wsz, MAX_PATH); - - // Save old shell link - - // Get a pointer to the IShellLink interface. - hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, - IID_IShellLink, (void **)&psl); - if (SUCCEEDED(hres)) { - IPersistFile* ppf; - // Query IShellLink for the IPersistFile interface. - hres = psl->QueryInterface(IID_IPersistFile, (void **)&ppf); - if (SUCCEEDED(hres)) { - // Load the shell link. - hres = ppf->Load(wsz, STGM_READ); - if (SUCCEEDED(hres)) { - // Resolve the link. - hres = psl->Resolve(HWND_DESKTOP, SLR_ANY_MATCH); - if (SUCCEEDED(hres)) { - // found it, so save details - CHAR szTemp[MAXSTR]; - WIN32_FIND_DATA wfd; - int i; - - - fprintf(m_fLogOld, "Name=%s\n", szLink); - hres = psl->GetPath(szTemp, MAXSTR, (WIN32_FIND_DATA *)&wfd, - SLGP_SHORTPATH ); - if (SUCCEEDED(hres)) - fprintf(m_fLogOld, "Path=%s\n", szTemp); - hres = psl->GetDescription(szTemp, MAXSTR); - if (SUCCEEDED(hres)) - fprintf(m_fLogOld, "Description=%s\n", szTemp); - hres = psl->GetArguments(szTemp, MAXSTR); - if (SUCCEEDED(hres) && (szTemp[0] != '\0')) - fprintf(m_fLogOld, "Arguments=%s\n", szTemp); - hres = psl->GetWorkingDirectory(szTemp, MAXSTR); - if (SUCCEEDED(hres) && (szTemp[0] != '\0')) - fprintf(m_fLogOld, "Directory=%s\n", szTemp); - hres = psl->GetIconLocation(szTemp, MAXSTR, &i); - if (SUCCEEDED(hres) && (szTemp[0] != '\0')) { - fprintf(m_fLogOld, "IconLocation=%s\n", szTemp); - fprintf(m_fLogOld, "IconIndex=%d\n", i); - } - fprintf(m_fLogOld, "\n"); - } - } - // Release pointer to IPersistFile. - ppf->Release(); - } - // Release pointer to IShellLink. - psl->Release(); - } - - - // Save new shell link - - // Get a pointer to the IShellLink interface. - hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, - IID_IShellLink, (void **)&psl); - if (SUCCEEDED(hres)) { - IPersistFile* ppf; - // Query IShellLink for the IPersistFile interface for - // saving the shell link in persistent storage. - hres = psl->QueryInterface(IID_IPersistFile, (void **)&ppf); - if (SUCCEEDED(hres)) { - fprintf(m_fLogNew, "Name=%s\n", szLink); - - // Set the path to the shell link target. - hres = psl->SetPath(program); - if (!SUCCEEDED(hres)) - AddMessage("SetPath failed!"); - fprintf(m_fLogNew, "Path=%s\n", program); - // Set the description of the shell link. - hres = psl->SetDescription(description); - if (!SUCCEEDED(hres)) - AddMessage("SetDescription failed!"); - fprintf(m_fLogNew, "Description=%s\n", description); - if (arguments != (LPCSTR)NULL) { - // Set the arguments of the shell link target. - hres = psl->SetArguments(arguments); - if (!SUCCEEDED(hres)) - AddMessage("SetArguments failed!"); - fprintf(m_fLogNew, "Arguments=%s\n", arguments); - } - if (icon != (LPCSTR)NULL) { - // Set the arguments of the shell link target. - hres = psl->SetIconLocation(icon, nIconIndex); - if (!SUCCEEDED(hres)) - AddMessage("SetIconLocation failed!"); - fprintf(m_fLogNew, "IconLocation=%s\n", icon); - fprintf(m_fLogNew, "IconIndex=%d\n", nIconIndex); - } - - // Save the link via the IPersistFile::Save method. - hres = ppf->Save(wsz, TRUE); - // Release pointer to IPersistFile. - ppf->Release(); - } - // Release pointer to IShellLink. - psl->Release(); - fprintf(m_fLogNew, "\n"); - } - - return (hres == 0); -} - - -////////////////////////////////////////// -// Registry methods - -void -reg_quote(char *d, const char *s) -{ - while (*s) { - if (*s == '\\') - *d++ = '\\'; - *d++ = *s++; - } - *d = *s; -} - -BOOL CInstall::UpdateRegistryBegin() -{ - const char regheader[]="REGEDIT4\n"; - m_fLogNew = MakeTemp(m_szRegistryNew); - if (!m_fLogNew) { - AddMessage("Failed to create RegistryNew temporary file\n"); - return FALSE; - } - fputs(regheader, m_fLogNew); - - m_fLogOld = MakeTemp(m_szRegistryOld); - if (!m_fLogOld) { - AddMessage("Failed to create RegistryOld temporary file\n"); - UpdateRegistryEnd(); - return FALSE; - } - fputs(regheader, m_fLogOld); - - return TRUE; -} - -BOOL CInstall::UpdateRegistryEnd() -{ - if (m_fLogNew) - fclose(m_fLogNew); - m_fLogNew = NULL; - if (m_fLogOld) - fclose(m_fLogOld); - m_fLogOld = NULL; - return TRUE; -} - -BOOL CInstall::UpdateRegistryKey(const char *product, const char *version) -{ - const char hkey_name[] = "HKEY_LOCAL_MACHINE"; - const HKEY hkey_key = HKEY_LOCAL_MACHINE; - const char key_format[] = "\n[%s\\%s]\n"; - - /* Create default registry entries */ - HKEY hkey; - LONG lrc; - char name[MAXSTR]; - - // Create/Open application key - sprintf(name, "SOFTWARE\\%s", product); - lrc = RegOpenKey(hkey_key, name, &hkey); - if (lrc == ERROR_SUCCESS) { - fprintf(m_fLogOld, key_format, hkey_name, name); - } - else { - lrc = RegCreateKey(hkey_key, name, &hkey); - if (lrc == ERROR_SUCCESS) - fprintf(m_fLogNew, key_format, hkey_name, name); - } - if (lrc == ERROR_SUCCESS) - RegCloseKey(hkey); - - // Create/Open application version key - sprintf(name, "SOFTWARE\\%s\\%s", product, version); - - AddMessage(" "); - AddMessage(hkey_name); - AddMessage("\\"); - AddMessage(name); - AddMessage("\n"); - lrc = RegOpenKey(hkey_key, name, &hkey); - if (lrc == ERROR_SUCCESS) - fprintf(m_fLogOld, key_format, hkey_name, name); - else - lrc = RegCreateKey(hkey_key, name, &hkey); - if (lrc == ERROR_SUCCESS) { - fprintf(m_fLogNew, key_format, hkey_name, name); - } - else { - UpdateRegistryEnd(); - } - return TRUE; -} - -BOOL CInstall::UpdateRegistryValue(const char *product, const char *version, - const char *name, const char *value) -{ - char appver[MAXSTR]; - BOOL flag = FALSE; - HKEY hkey; - // Open application/version key - sprintf(appver, "SOFTWARE\\%s\\%s", product, version); - - if (RegOpenKey(HKEY_LOCAL_MACHINE, appver, &hkey) - == ERROR_SUCCESS) { - flag = SetRegistryValue(hkey, name, value); - RegCloseKey(hkey); - } - - return flag; -} - -BOOL CInstall::SetRegistryValue(HKEY hkey, const char *value_name, const char *value) -{ - char buf[MAXSTR]; - char qbuf[MAXSTR]; - DWORD cbData; - DWORD keytype; - - cbData = sizeof(buf); - keytype = REG_SZ; - if (RegQueryValueEx(hkey, value_name, 0, &keytype, - (LPBYTE)buf, &cbData) == ERROR_SUCCESS) { - reg_quote(qbuf, buf); - fprintf(m_fLogOld, "\042%s\042=\042%s\042\n", value_name, qbuf); - } - reg_quote(qbuf, value); - fprintf(m_fLogNew, "\042%s\042=\042%s\042\n", value_name, qbuf); - AddMessage(" "); - AddMessage(value_name); - AddMessage("="); - AddMessage(value); - AddMessage("\n"); - if (RegSetValueEx(hkey, value_name, 0, REG_SZ, - (CONST BYTE *)value, strlen(value)+1) != ERROR_SUCCESS) - return FALSE; - return TRUE; -} - -//////////////////////////////////// -// Uninstall - - -BOOL CInstall::WriteUninstall(const char *szProg, BOOL bNoCopy) -{ - LONG rc; - HKEY hkey; - HKEY hsubkey; - char buffer[MAXSTR]; - char ungsprog[MAXSTR]; - - lstrcpy(ungsprog, m_szTargetDir); - lstrcat(ungsprog, "\\"); - lstrcat(ungsprog, szProg); - - lstrcpy(buffer, m_szSourceDir); - lstrcat(buffer, "\\"); - lstrcat(buffer, szProg); - - if (bNoCopy) { - // Don't copy files. Leave them where they are. - // Check that all files exist - FILE *f; - if ((f = fopen(buffer, "r")) == (FILE *)NULL) { - AddMessage("Missing file "); - AddMessage(buffer); - AddMessage("\n"); - return FALSE; - } - fclose(f); - } - else if (!CopyFile(buffer, ungsprog, FALSE)) { - char message[MAXSTR+MAXSTR+100]; - wsprintf(message, "Failed to copy file %s to %s", buffer, ungsprog); - AddMessage(message); - return FALSE; - } - ResetReadonly(ungsprog); - - /* write registry entries for uninstall */ - if ((rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, UNINSTALLKEY, 0, - KEY_ALL_ACCESS, &hkey)) != ERROR_SUCCESS) { - /* failed to open key, so try to create it */ - rc = RegCreateKey(HKEY_LOCAL_MACHINE, UNINSTALLKEY, &hkey); - } - if (rc == ERROR_SUCCESS) { - // Uninstall key for program - if (RegCreateKey(hkey, m_szUninstallName, &hsubkey) == ERROR_SUCCESS) { - RegSetValueEx(hsubkey, DISPLAYNAMEKEY, 0, REG_SZ, - (CONST BYTE *)m_szUninstallName, lstrlen(m_szUninstallName)+1); - lstrcpy(buffer, "\042"); // leading " before ungsprog which may have spaces in the path - lstrcat(buffer, ungsprog); - lstrcat(buffer, "\042 \042"); // ending " for ungsprog, leading " before UNINSTALL_FILE path - lstrcat(buffer, m_szTargetDir); - lstrcat(buffer, "\\"); - lstrcat(buffer, m_szMainDir); - lstrcat(buffer, "\\"); - lstrcat(buffer, UNINSTALL_FILE); - lstrcat(buffer, "\042"); // ending " after UNINSTALL_FILE path - AddMessage(" "); - AddMessage(m_szUninstallName); - AddMessage("="); - AddMessage(buffer); - AddMessage("\n"); - RegSetValueEx(hsubkey, UNINSTALLSTRINGKEY, 0, REG_SZ, - (CONST BYTE *)buffer, lstrlen(buffer)+1); - RegCloseKey(hsubkey); - } - - RegCloseKey(hkey); - } - return TRUE; -} - - -void -CInstall::CopyFileContents(FILE *df, FILE *sf) -{ - char buf[MAXSTR]; - int count; - while ((count = fread(buf, 1, sizeof(buf), sf)) != 0) - fwrite(buf, 1, count, df); -} - -FILE *CInstall::MakeTemp(char *fname) -{ - char *temp; - if ( (temp = getenv("TEMP")) == NULL ) - strcpy(fname, m_szTargetDir); - else - strcpy(fname, temp); - - /* Prevent X's in path from being converted by mktemp. */ - for ( temp = fname; *temp; temp++ ) { - *temp = (char)tolower(*temp); - if (*temp == '/') - *temp = '\\'; - } - if ( strlen(fname) && (fname[strlen(fname)-1] != '\\') ) - strcat(fname, "\\"); - - strcat(fname, "gsXXXXXX"); - mktemp(fname); - AddMessage("Creating temporary file "); - AddMessage(fname); - AddMessage("\n"); - return fopen(fname, "w"); -} - -BOOL CInstall::MakeLog() -{ - FILE *f, *lf; - char szFileName[MAXSTR]; - char szLogDir[MAXSTR]; - strcpy(szLogDir, m_szTargetDir); - strcat(szLogDir, "\\"); - strcat(szLogDir, m_szMainDir); - strcat(szLogDir, "\\"); - - strcpy(szFileName, szLogDir); - strcat(szFileName, UNINSTALL_FILE); - lf = fopen(szFileName, "w"); - if (lf == (FILE *)NULL) { - AddMessage("Can't create uninstall log"); - CleanUp(); - return FALSE; - } - fputs(szSection, lf); - fputs("UninstallName\n", lf); - fputs(m_szUninstallName, lf); - fputs("\n\n", lf); - - if (strlen(m_szRegistryNew) && - (f = fopen(m_szRegistryNew, "r")) != (FILE *)NULL) { - fputs(szSection, lf); - fputs("RegistryNew\n", lf); - CopyFileContents(lf, f); - fputs("\n", lf); - fclose(f); - DeleteFile(m_szRegistryNew); - m_szRegistryNew[0] = '\0'; - } - - if (strlen(m_szRegistryOld) && - (f = fopen(m_szRegistryOld, "r")) != (FILE *)NULL) { - fputs(szSection, lf); - fputs("RegistryOld\n", lf); - CopyFileContents(lf, f); - fputs("\n", lf); - fclose(f); - DeleteFile(m_szRegistryOld); - m_szRegistryOld[0] = '\0'; - } - - if (strlen(m_szShellNew) && - (f = fopen(m_szShellNew, "r")) != (FILE *)NULL) { - fputs(szSection, lf); - fputs("ShellNew\n", lf); - CopyFileContents(lf, f); - fputs("\n", lf); - fclose(f); - DeleteFile(m_szShellNew); - m_szShellNew[0] = '\0'; - } - - if (strlen(m_szShellOld) && - (f = fopen(m_szShellOld, "r")) != (FILE *)NULL) { - fputs(szSection, lf); - fputs("ShellOld\n", lf); - CopyFileContents(lf, f); - fputs("\n", lf); - fclose(f); - DeleteFile(m_szShellOld); - m_szShellOld[0] = '\0'; - } - - if (strlen(m_szFileNew) && - (f = fopen(m_szFileNew, "r")) != (FILE *)NULL) { - fputs(szSection, lf); - fputs("FileNew\n", lf); - CopyFileContents(lf, f); - fputs("\n", lf); - fclose(f); - DeleteFile(m_szFileNew); - m_szFileNew[0] = '\0'; - } - - fputs(szSection, lf); - fclose(lf); - - return TRUE; -} - -BOOL CInstall::GetPrograms(BOOL bUseCommon, char *buf, int buflen) -{ - // Get the directory for the Program menu. This is - // stored in the Registry under HKEY_CURRENT_USER\Software\ - // Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Programs. - LONG rc; - HKEY hCU; - DWORD dwType; - ULONG ulSize = buflen; - HKEY hrkey = HKEY_CURRENT_USER; - if (bUseCommon) - hrkey = HKEY_LOCAL_MACHINE; - if (RegOpenKeyEx(hrkey, - "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", - 0,KEY_QUERY_VALUE, - &hCU) == ERROR_SUCCESS) { - rc = RegQueryValueEx( hCU, - bUseCommon ? "Common Programs" : "Programs", - NULL, - &dwType, - (unsigned char *)buf, - &ulSize); - RegCloseKey(hCU); - return TRUE; - } - return FALSE; - -#ifdef NOTUSED - // This is an alternate version, but it needs - // Internet Explorer 4.0 with Web Integrated Desktop. - // It does not work with the standard - // Windows 95, Windows NT 4.0, Internet Explorer 3.0, - // and Internet Explorer 4.0 without Web Integrated Desktop. - - HRESULT rc; - m_szPrograms[0] = '\0'; - int nFolder = CSIDL_PROGRAMS; - if (bUseCommon) - nFolder = CSIDL_COMMON_PROGRAMS; - - rc = SHGetSpecialFolderPath(HWND_DESKTOP, m_szPrograms, - nFolder, FALSE); - return (rc == NOERROR); -#endif - -} - -BOOL CInstall::SetAllUsers(BOOL bUseCommon) -{ - m_bUseCommon = bUseCommon; - return GetPrograms(bUseCommon, m_szPrograms, sizeof(m_szPrograms)); -} - - -////////////////////////////////////////////////////////////////////// diff -Nru ghostscript-9.04~dfsg/psi/dwinst.h ghostscript-9.05~dfsg~20120125/psi/dwinst.h --- ghostscript-9.04~dfsg/psi/dwinst.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/psi/dwinst.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,114 +0,0 @@ -/* Copyright (C) 2001-2006 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ - -// $Id$ - -#ifndef dwinst_INCLUDED -# define dwinst_INCLUDED - -// Definitions for Ghostscript installer - -#ifndef MAXSTR -#ifdef MAX_PATH -#define MAXSTR MAX_PATH -#else -#define MAXSTR 256 -#endif -#endif - -class CInstall -{ -public: - CInstall(); - virtual ~CInstall(); - void SetMessageFunction(void(*fn)(const char *)); - void AddMessage(const char *message); - const char *GetMainDir(); - const char *GetUninstallName(); - BOOL GetPrograms(BOOL bUseCommon, char *buf, int buflen); - BOOL Init(const char *szSourceDir, const char *szFileList); - BOOL InstallFiles(BOOL bNoCopy, BOOL *pbQuit); - BOOL InstallFile(char *filename, BOOL bNoCopy); - BOOL MakeDir(const char *dirname); - FILE * MakeTemp(char *name); - - BOOL SetAllUsers(BOOL bUseCommon); - void SetTargetDir(const char *szTargetDir); - void SetTargetGroup(const char *szTargetGroup); - - BOOL StartMenuBegin(); - BOOL StartMenuEnd(); - BOOL StartMenuAdd(const char *szDescription, const char *szProgram, const char *szArguments); - - BOOL UpdateRegistryBegin(); - BOOL UpdateRegistryKey(const char *product, const char *version); - BOOL UpdateRegistryValue(const char *product, const char *version, const char *name, const char *value); - BOOL UpdateRegistryEnd(); - - BOOL WriteUninstall(const char *prog, BOOL bNoCopy); - BOOL MakeLog(void); - - void CleanUp(void); - - void AppendFileNew(const char *filename); - -private: - BOOL m_bNoCopy; - BOOL m_bUseCommon; - BOOL m_bQuit; - - // Source directory - char m_szSourceDir[MAXSTR]; - - // File containing list of files to install - char m_szFileList[MAXSTR]; - - // Target directory for program and fonts. - char m_szTargetDir[MAXSTR]; - - // Target Group for shortcut - char m_szTargetGroup[MAXSTR]; - - // Directory where the Start Menu is located. - char m_szPrograms[MAXSTR]; - - // Name used for uninstall - char m_szUninstallName[MAXSTR]; - - // Main directory prefix, where log files should be written - char m_szMainDir[MAXSTR]; - - // Full directory where log files should be written - char m_szLogDir[MAXSTR]; - - // Temporary log files for uninstall - char m_szFileNew[MAXSTR]; - char m_szRegistryNew[MAXSTR]; - char m_szRegistryOld[MAXSTR]; - char m_szShellNew[MAXSTR]; - char m_szShellOld[MAXSTR]; - - // Log files - FILE * m_fLogNew; - FILE * m_fLogOld; - - BOOL SetRegistryValue(HKEY hkey, const char *value_name, const char *value); - BOOL CreateShellLink(LPCSTR description, LPCSTR program, LPCSTR arguments, LPCSTR icon = NULL, int nIconIndex = 0); - void CopyFileContents(FILE *df, FILE *sf); - void ResetReadonly(const char *filename); - - void(*AddMessageFn)(const char *); - -}; - -#endif /* dwinst_INCLUDED */ diff -Nru ghostscript-9.04~dfsg/psi/dwsetup.cpp ghostscript-9.05~dfsg~20120125/psi/dwsetup.cpp --- ghostscript-9.04~dfsg/psi/dwsetup.cpp 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/psi/dwsetup.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,1057 +0,0 @@ -/* Copyright (C) 2001-2008 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ - -// $Id$ -// -// -// This is the setup program for Win32 and Win64 GPL Ghostscript -// -// The starting point is a self extracting zip archive -// with the following contents: -// setupgs.exe -// uninstgs.exe -// filelist.txt (contains list of program files) -// gs#.##\* (files listed in filelist.txt) -// This is the same as the zip file created by Aladdin Enterprises, -// with the addition of setupgs.exe, uninstgs.exe, and filelist.txt -// -// The first line of the file filelist.txt -// contains the uninstall name to be used. -// The second line contains name of the main directory where -// uninstall log files are to be placed. -// Subsequent lines contain files to be copied (but not directories). -// For example, filelist.txt might contain: -// GPL Ghostscript 8.55 -// gs8.55 -// gs8.55\bin\gsdll32.dll or gs8.55\bin\gsdll64.dll -// gs8.55\lib\gs_init.ps -// -// The default install directory is c:\gs. -// The default Start Menu Folder is Ghostscript. -// These are set in the resources. -// The setup program will create the following uninstall log files -// c:\gs\gs#.##\uninstal.txt -// The uninstall program (accessed through control panel) will not -// remove directories nor will it remove itself. -// -// If the install directory is the same as the current file -// location, no files will be copied, but the existence of each file -// will be checked. This allows the archive to be unzipped, then -// configured in its current location. Running the uninstall will not -// remove uninstgs.exe, setupgs.exe, or filelist.txt. - - -#define STRICT -#include -#include -#include -#include -#include -#include - -#ifdef MAX_PATH -#define MAXSTR MAX_PATH -#else -#define MAXSTR 256 -#endif - -#include "dwsetup.h" -#include "dwinst.h" - -extern "C" { -typedef HRESULT (WINAPI *PFN_SHGetFolderPath)( - HWND hwndOwner, - int nFolder, - HANDLE hToken, - DWORD dwFlags, - LPSTR pszPath); - -typedef BOOL (WINAPI *PFN_SHGetSpecialFolderPath)( - HWND hwndOwner, - LPTSTR lpszPath, - int nFolder, - BOOL fCreate); -} - -//#define DEBUG - -#define UNINSTALLPROG "uninstgs.exe" - - -///////////////////////////////// -// Globals - -CInstall cinst; - -// TRUE = Place Start Menu items in All Users. -// FALSE = Current User -BOOL g_bUseCommon; - -// TRUE = Destination is the same as Source, so don't copy files. -BOOL g_bNoCopy; - -// Source directory, usually a temporary directory created by -// unzip self extractor. -CHAR g_szSourceDir[MAXSTR]; - -// Target directory for program. -// Default loaded from resources -CHAR g_szTargetDir[MAXSTR]; - -// Target Group for shortcut. -// Default loaded from resources -CHAR g_szTargetGroup[MAXSTR]; - -// Setup application name, loaded from resources -CHAR g_szAppName[MAXSTR]; - -BOOL g_bCJKFonts = FALSE; -BOOL g_bAllUsers = FALSE; - - -HWND g_hMain; // Main install dialog -HWND g_hWndText; // Install log dialog -HINSTANCE g_hInstance; - -// If a directory is listed on the command line, g_bBatch will -// be TRUE and a silent install will occur. -BOOL g_bBatch = FALSE; - -BOOL g_bQuit = FALSE; // TRUE = Get out of message loop. -BOOL g_bError = FALSE; // TRUE = Install was not successful -BOOL is_winnt = FALSE; // Disable "All Users" if not NT. - -#ifdef _WIN64 -#define DLGRETURN INT_PTR -#else -#define DLGRETURN BOOL -#endif - -// Prototypes -DLGRETURN CALLBACK MainDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); -void gs_addmess_count(const char *str, int count); -void gs_addmess(const char *str); -void gs_addmess_update(void); -BOOL init(); -BOOL install_all(); -BOOL install_prog(); -int get_font_path(char *path, unsigned int pathlen); -BOOL write_cidfmap(const char *gspath, const char *cidpath); -BOOL GetProgramFiles(LPTSTR path); - - -////////////////////////////////////////////////////////////////////// -// Entry point -////////////////////////////////////////////////////////////////////// - -int APIENTRY WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) -{ - MSG msg; - g_hInstance = hInstance; - - if (!init()) { - MessageBox(HWND_DESKTOP, "Initialisation failed", - g_szAppName, MB_OK); - return 1; - } - - if (!g_bBatch) { - while (GetMessage(&msg, (HWND)NULL, 0, 0)) { - if (!IsDialogMessage(g_hWndText, &msg) && - !IsDialogMessage(g_hMain, &msg)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - DestroyWindow(g_hMain); - } - - return (g_bError ? 1 : 0); -} - - - - -////////////////////////////////////////////////////////////////////// -// Text log window -////////////////////////////////////////////////////////////////////// - - -#define TWLENGTH 32768 -#define TWSCROLL 1024 -char twbuf[TWLENGTH]; -int twend; - -// Modeless Dialog Box -DLGRETURN CALLBACK -TextWinDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch(message) { - case WM_INITDIALOG: - EnableWindow(g_hMain, FALSE); - return TRUE; - case WM_COMMAND: - switch(LOWORD(wParam)) { - case IDC_TEXTWIN_COPY: - {HGLOBAL hglobal; - LPSTR p; - DWORD result; - int start, end; - result = SendDlgItemMessage(hwnd, IDC_TEXTWIN_MLE, EM_GETSEL, (WPARAM)0, (LPARAM)0); - start = LOWORD(result); - end = HIWORD(result); - if (start == end) { - start = 0; - end = twend; - } - hglobal = GlobalAlloc(GHND | GMEM_SHARE, end-start+1); - if (hglobal == (HGLOBAL)NULL) { - MessageBeep(-1); - return(FALSE); - } - p = (char *)GlobalLock(hglobal); - if (p == (LPSTR)NULL) { - MessageBeep(-1); - return(FALSE); - } - lstrcpyn(p, twbuf+start, end-start); - GlobalUnlock(hglobal); - OpenClipboard(hwnd); - EmptyClipboard(); - SetClipboardData(CF_TEXT, hglobal); - CloseClipboard(); - } - break; - case IDCANCEL: - g_bQuit = TRUE; - DestroyWindow(hwnd); - return TRUE; - } - break; - case WM_CLOSE: - DestroyWindow(hwnd); - return TRUE; - case WM_DESTROY: - g_bQuit = TRUE; - g_hWndText = (HWND)NULL; - EnableWindow(g_hMain, TRUE); - PostQuitMessage(0); - break; - } - return FALSE; -} - - - -// Add string to log window -void -gs_addmess_count(const char *str, int count) -{ - const char *s; - char *p; - int i, lfcount; - MSG msg; - - // we need to add \r after each \n, so count the \n's - lfcount = 0; - s = str; - for (i=0; i= TWSCROLL) - return; // too large - if (count + lfcount + twend >= TWLENGTH-1) { - // scroll buffer - twend -= TWSCROLL; - memmove(twbuf, twbuf+TWSCROLL, twend); - } - p = twbuf+twend; - for (i=0; i= MAXCMDTOKENS - 1) - break; - - e = d; - while ((*p) && (*p != ' ')) { - if (*p == '\042') { - // Remove quotes, skipping over embedded spaces. - // Doesn't handle embedded quotes. - p++; - while ((*p) && (*p != '\042')) - *d++ =*p++; - } - else - *d++ = *p; - if (*p) - p++; - } - *d++ = '\0'; - argv[argc++] = e; - - while ((*p) && (*p == ' ')) - p++; // Skip over trailing spaces - } - argv[argc] = NULL; - - if (strlen(argv[0]) == 0) { - GetModuleFileName(g_hInstance, command, sizeof(command)-1); - argv[0] = command; - } - - if (argc > 2) { - MessageBox(HWND_DESKTOP, - "make_filelist functionality split out and no longer in setupgs", - g_szAppName, MB_OK); - return FALSE; - } - - - // check if batch mode requested - // get location of target directory from command line as argv[1] - if (argc == 2) { - strncpy(g_szTargetDir, argv[1], sizeof(g_szTargetDir)); - g_bBatch = TRUE; - if (is_winnt) - g_bAllUsers = TRUE; - } - if (g_bBatch) { - if (!install_all()) { - // display log showing error - g_bBatch = FALSE; - g_hWndText = CreateDialogParam(g_hInstance, - MAKEINTRESOURCE(IDD_TEXTWIN), - (HWND)HWND_DESKTOP, TextWinDlgProc, - (LPARAM)NULL); - gs_addmess_update(); - } - return TRUE; - } - - // Interactive setup - if (!GetProgramFiles(g_szTargetDir)) - strcpy(g_szTargetDir, "C:\\Program Files"); - strcat(g_szTargetDir, "\\"); - LoadString(g_hInstance, IDS_TARGET_DIR, - g_szTargetDir+strlen(g_szTargetDir), - sizeof(g_szTargetDir)-strlen(g_szTargetDir)); - - // main dialog box - g_hMain = CreateDialogParam(g_hInstance, MAKEINTRESOURCE(IDD_MAIN), (HWND)NULL, MainDlgProc, (LPARAM)NULL); - // centre dialog on screen - int width = GetSystemMetrics(SM_CXFULLSCREEN); - int height = GetSystemMetrics(SM_CYFULLSCREEN); - RECT rect; - GetWindowRect(g_hMain, &rect); - MoveWindow(g_hMain, (width - (rect.right - rect.left))/2, - (height - (rect.bottom - rect.top))/2, - (rect.right - rect.left), - (rect.bottom - rect.top), FALSE); - - // initialize targets - cinst.SetMessageFunction(message_box); - if (!cinst.Init(g_szSourceDir, "filelist.txt")) - return FALSE; - - SetDlgItemText(g_hMain, IDC_TARGET_DIR, g_szTargetDir); - SetDlgItemText(g_hMain, IDC_TARGET_GROUP, g_szTargetGroup); - SetDlgItemText(g_hMain, IDC_PRODUCT_NAME, cinst.GetUninstallName()); - ShowWindow(g_hMain, SW_SHOWNORMAL); - - return (g_hMain != (HWND)NULL); /* success */ -} - - -// Main Modeless Dialog Box -DLGRETURN CALLBACK -MainDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch(message) { - case WM_INITDIALOG: - EnableWindow(GetDlgItem(hwnd, IDC_ALLUSERS), is_winnt); - return TRUE; - case WM_COMMAND: - switch(LOWORD(wParam)) { - case IDC_README: - { - char buf[MAXSTR]; - sprintf(buf, "%s\\%s\\doc\\Readme.htm", g_szSourceDir, - cinst.GetMainDir()); - ShellExecute(hwnd, NULL, buf, NULL, g_szSourceDir, - SW_SHOWNORMAL); - } - return TRUE; - case IDC_BROWSE_DIR: - { char dir[MAXSTR]; - char *p; - GetDlgItemText(hwnd, IDC_TARGET_DIR, dir, sizeof(dir)); - strcpy(szDirName, dir); - if ( (p = strrchr(szDirName, '\\')) != (char *)NULL ) { - strcpy(szFolderName, p+1); - if (p == szDirName+2) - p++; // step over c:\ // - *p = '\0'; - } - else { - strcpy(szDirName, "c:\\"); - strcpy(szFolderName, dir); - } - if (DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_DIRDLG), - hwnd, DirDlgProc)) { - strcpy(dir, szDirName); - if (strlen(dir) && (dir[strlen(dir)-1] != '\\')) - strcat(dir, "\\"); - strcat(dir, szFolderName); - SetDlgItemText(hwnd, IDC_TARGET_DIR, dir); - } - } - return TRUE; - case IDC_BROWSE_GROUP: - { char dir[MAXSTR]; - char programs[MAXSTR]; - char *p; - GetDlgItemText(hwnd, IDC_TARGET_GROUP, dir, sizeof(dir)); - cinst.GetPrograms( - SendDlgItemMessage(hwnd, IDC_ALLUSERS, - BM_GETCHECK, 0, 0) == BST_CHECKED, - programs, sizeof(programs)); - strcpy(szDirName, programs); - strcpy(szFolderName, dir); - if (DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_DIRDLG), - hwnd, DirDlgProc)) { - strcpy(dir, szFolderName); - p = szDirName; - if (strnicmp(szDirName, programs, - strlen(programs)) == 0) { - p += strlen(programs); - if (*p == '\\') - p++; - strcpy(dir, p); - if (strlen(dir) && - (dir[strlen(dir)-1] != '\\')) - strcat(dir, "\\"); - strcat(dir, szFolderName); - } - SetDlgItemText(hwnd, IDC_TARGET_GROUP, dir); - } - } - return TRUE; - case IDCANCEL: - PostQuitMessage(0); - return TRUE; - case IDC_INSTALL: - GetDlgItemText(hwnd, IDC_TARGET_DIR, - g_szTargetDir, sizeof(g_szTargetDir)); - GetDlgItemText(hwnd, IDC_TARGET_GROUP, - g_szTargetGroup, sizeof(g_szTargetGroup)); - g_bCJKFonts = (SendDlgItemMessage(g_hMain, - IDC_CJK_FONTS, BM_GETCHECK, 0, 0) - == BST_CHECKED); - g_bAllUsers = (SendDlgItemMessage(hwnd, - IDC_ALLUSERS, BM_GETCHECK, 0, 0 - ) == BST_CHECKED); - - // install log dialog box - g_hWndText = CreateDialogParam(g_hInstance, - MAKEINTRESOURCE(IDD_TEXTWIN), - (HWND)hwnd, TextWinDlgProc, (LPARAM)NULL); - EnableWindow(GetDlgItem(hwnd, IDC_INSTALL), FALSE); - if (install_all()) - PostQuitMessage(0); - return TRUE; - default: - return(FALSE); - } - case WM_CLOSE: - PostQuitMessage(0); - return TRUE; - } - return FALSE; -} - -// install program and files -BOOL -install_all() -{ - gs_addmess("Source Directory="); - gs_addmess(g_szSourceDir); - gs_addmess("\n"); - gs_addmess("Target Directory="); - gs_addmess(g_szTargetDir); - gs_addmess("\n"); - gs_addmess("Target Shell Folder="); - gs_addmess(g_szTargetGroup); - gs_addmess("\n"); - gs_addmess(g_bAllUsers ? " All users\n" : " Current user\n"); - - if (stricmp(g_szSourceDir, g_szTargetDir) == 0) { - // Don't copy files - if (!g_bBatch) - if (::MessageBox(g_hWndText, "Install location is the same as the current file location. No files will be copied.", g_szAppName, MB_OKCANCEL) - != IDOK) { - return FALSE; - } - g_bNoCopy = TRUE; - } - - - if (g_bQuit) - return FALSE; - - if (!install_prog()) { - cinst.CleanUp(); - g_bError = TRUE; - return FALSE; - } - - gs_addmess("Install successful\n"); - - // show start menu folder - if (!g_bBatch) { - char szFolder[MAXSTR]; - szFolder[0] = '\0'; - cinst.GetPrograms(g_bAllUsers, szFolder, sizeof(szFolder)); - strcat(szFolder, "\\"); - strcat(szFolder, g_szTargetGroup); - ShellExecute(HWND_DESKTOP, "open", szFolder, - NULL, NULL, SW_SHOWNORMAL); - } - -#ifdef DEBUG - return FALSE; -#endif - - return TRUE; -} - -BOOL -install_prog() -{ - char *regkey1 = "GPL Ghostscript"; - char regkey2[16]; - char szDLL[MAXSTR]; - char szLIB[MAXSTR+MAXSTR]; - char szProgram[MAXSTR]; - char szArguments[MAXSTR]; - char szDescription[MAXSTR]; - char szDotVersion[MAXSTR]; - char szPlatformSuffix[MAXSTR]; - const char *pSuffix = ""; - - if (g_bQuit) - return FALSE; - - cinst.SetMessageFunction(gs_addmess); - cinst.SetTargetDir(g_szTargetDir); - cinst.SetTargetGroup(g_szTargetGroup); - cinst.SetAllUsers(g_bAllUsers); - if (!cinst.Init(g_szSourceDir, "filelist.txt")) - return FALSE; - - // Get GS version number - gs_addmess("Installing Program...\n"); - int nGSversion = 0; - const char *p = cinst.GetMainDir(); - while (*p && !isdigit(*p)) // skip over "gs" prefix - p++; - if (strlen(p) == 4) - nGSversion = (p[0]-'0')*100 + (p[2]-'0')*10 + (p[3]-'0'); - else if (strlen(p) == 3) - nGSversion = (p[0]-'0')*100 + (p[2]-'0')*10; - strncpy(szDotVersion, p, sizeof(szDotVersion)); - strncpy(regkey2, szDotVersion, sizeof(regkey2)); - - // copy files - if (!cinst.InstallFiles(g_bNoCopy, &g_bQuit)) { - gs_addmess("Program install failed\n"); - return FALSE; - } - - if (g_bQuit) - return FALSE; - - // write registry entries - gs_addmess("Updating Registry\n"); - if (!cinst.UpdateRegistryBegin()) { - gs_addmess("Failed to begin registry update\n"); - return FALSE; - } - if (!cinst.UpdateRegistryKey(regkey1, regkey2)) { - gs_addmess("Failed to open/create registry application key\n"); - return FALSE; - } - strcpy(szDLL, g_szTargetDir); - strcat(szDLL, "\\"); - strcat(szDLL, cinst.GetMainDir()); -#ifdef _WIN64 - strcat(szDLL, "\\bin\\gsdll64.dll"); -#else - strcat(szDLL, "\\bin\\gsdll32.dll"); -#endif - if (!cinst.UpdateRegistryValue(regkey1, regkey2, "GS_DLL", szDLL)) { - gs_addmess("Failed to add registry value\n"); - return FALSE; - } - strcpy(szLIB, g_szTargetDir); - strcat(szLIB, "\\"); - strcat(szLIB, cinst.GetMainDir()); - strcat(szLIB, "\\lib;"); - strcat(szLIB, g_szTargetDir); - strcat(szLIB, "\\fonts"); - if (g_bCJKFonts) { - strcat(szLIB, ";"); - get_font_path(szLIB+strlen(szLIB), sizeof(szLIB)-strlen(szLIB)-1); - } - if (!cinst.UpdateRegistryValue(regkey1, regkey2, "GS_LIB", szLIB)) { - gs_addmess("Failed to add registry value\n"); - return FALSE; - } - if (!cinst.UpdateRegistryEnd()) { - gs_addmess("Failed to end registry update\n"); - return FALSE; - } - if (g_bQuit) - return FALSE; - - // Add Start Menu items - gs_addmess("Adding Start Menu items\n"); - - memset(szPlatformSuffix, 0, sizeof(szPlatformSuffix)); - if (GetProgramFiles(szPlatformSuffix)) { - /* If ProgramFiles has a suffix like " (x86)" then use - * it for Start menu entries to distinguish between - * 32-bit and 64-bit programs. - */ - for (pSuffix = szPlatformSuffix; *pSuffix; pSuffix++) - if ((pSuffix[0] == ' ') && (pSuffix[1] == '(')) - break; - } - else { - pSuffix = ""; - } - - - if (!cinst.StartMenuBegin()) { - gs_addmess("Failed to begin Start Menu update\n"); - return FALSE; - } - strcpy(szProgram, g_szTargetDir); - strcat(szProgram, "\\"); - strcat(szProgram, cinst.GetMainDir()); -#ifdef _WIN64 - strcat(szProgram, "\\bin\\gswin64.exe"); -#else - strcat(szProgram, "\\bin\\gswin32.exe"); -#endif - strcpy(szArguments, "\042-I"); - strcat(szArguments, szLIB); - strcat(szArguments, "\042"); - sprintf(szDescription, "Ghostscript %s%s", szDotVersion, pSuffix); - if (!cinst.StartMenuAdd(szDescription, szProgram, szArguments)) { - gs_addmess("Failed to add Start Menu item\n"); - return FALSE; - } - strcpy(szProgram, g_szTargetDir); - strcat(szProgram, "\\"); - strcat(szProgram, cinst.GetMainDir()); - strcat(szProgram, "\\doc\\Readme.htm"); - sprintf(szDescription, "Ghostscript Readme %s%s", - szDotVersion, pSuffix); - if (!cinst.StartMenuAdd(szDescription, szProgram, NULL)) { - gs_addmess("Failed to add Start Menu item\n"); - return FALSE; - } - if (!cinst.StartMenuEnd()) { - gs_addmess("Failed to end Start Menu update\n"); - return FALSE; - } - - /* Create lib/cidfmap */ - if (g_bCJKFonts) { - char szCIDFmap[MAXSTR]; - char szCIDFmap_bak[MAXSTR]; - char szGSPATH[MAXSTR]; - - /* backup old cidfmap */ - strcpy(szCIDFmap, g_szTargetDir); - strcat(szCIDFmap, "\\"); - strcat(szCIDFmap, cinst.GetMainDir()); - strcat(szCIDFmap, "\\lib\\cidfmap"); - strcpy(szCIDFmap_bak, szCIDFmap); - strcat(szCIDFmap_bak, ".bak"); - gs_addmess("Backing up\n "); - gs_addmess(szCIDFmap); - gs_addmess("\nto\n "); - gs_addmess(szCIDFmap_bak); - gs_addmess("\n"); - rename(szCIDFmap, szCIDFmap_bak); - - /* mark backup for uninstall */ - cinst.AppendFileNew(szCIDFmap_bak); - - /* write new cidfmap */ - gs_addmess("Writing cidfmap\n "); - gs_addmess(szCIDFmap); - gs_addmess("\n"); - strcpy(szGSPATH, g_szTargetDir); - strcat(szGSPATH, "\\"); - strcat(szGSPATH, cinst.GetMainDir()); - if (!write_cidfmap(szGSPATH, szCIDFmap)) { - gs_addmess("Failed to write cidfmap\n"); - return FALSE; - } - } - - // consolidate logs into one uninstall file - if (cinst.MakeLog()) { - // add uninstall entry for "Add/Remove Programs" - gs_addmess("Adding uninstall program\n"); - if (!cinst.WriteUninstall(UNINSTALLPROG, g_bNoCopy)) { - gs_addmess("Failed to write uninstall entry\n"); - return FALSE; - } - } - else { - gs_addmess("Failed to write uninstall log\n"); - // If batch install, files might be on a server - // in a write protected directory. - // Don't return an error for batch install. - if (g_bBatch) - return TRUE; - return FALSE; - } - - gs_addmess("Program install successful\n"); - return TRUE; -} - - - -////////////////////////////////////////////////////////////////////// -// Create lib/cidfmap based on installed fonts -////////////////////////////////////////////////////////////////////// - -/* Get the path to enumerate for fonts */ -int -get_font_path(char *path, unsigned int pathlen) -{ - int i; - int len = GetWindowsDirectory(path, pathlen); - if (len == 0) - return -1; - if (pathlen - strlen(path) < 8) - return -1; - strncat(path, "/fonts", pathlen - strlen(path) - 7); - for (i = strlen(path)-1; i >= 0; i--) - if (path[i] == '\\') - path[i] = '/'; - return len; -} - -BOOL write_cidfmap(const char *gspath, const char *cidpath) -{ - char fontpath[MAXSTR]; - char buf[4*MAXSTR]; - STARTUPINFO siStartInfo; - PROCESS_INFORMATION piProcInfo; - - get_font_path(fontpath, sizeof(fontpath)-1); - - strcpy(buf, "\042"); - strcat(buf, gspath); -#ifdef _WIN64 - strcat(buf, "\\bin\\gswin64c.exe\042 -q -dBATCH \042-sFONTDIR="); -#else - strcat(buf, "\\bin\\gswin32c.exe\042 -q -dBATCH \042-sFONTDIR="); -#endif - strcat(buf, fontpath); - strcat(buf, "\042 \042"); - strcat(buf, "-sCIDFMAP="); - strcat(buf, cidpath); - strcat(buf, "\042 \042"); - strcat(buf, gspath); - strcat(buf, "\\lib\\mkcidfm.ps\042"); - - siStartInfo.cb = sizeof(STARTUPINFO); - siStartInfo.lpReserved = NULL; - siStartInfo.lpDesktop = NULL; - siStartInfo.lpTitle = NULL; /* use executable name as title */ - siStartInfo.dwX = siStartInfo.dwY = CW_USEDEFAULT; /* ignored */ - siStartInfo.dwXSize = siStartInfo.dwYSize = CW_USEDEFAULT; /* ignored */ - siStartInfo.dwXCountChars = 80; - siStartInfo.dwYCountChars = 25; - siStartInfo.dwFillAttribute = 0; /* ignored */ - siStartInfo.dwFlags = STARTF_USESHOWWINDOW; - siStartInfo.wShowWindow = SW_HIDE; - siStartInfo.cbReserved2 = 0; - siStartInfo.lpReserved2 = NULL; - siStartInfo.hStdInput = NULL; - siStartInfo.hStdOutput = NULL; - siStartInfo.hStdError = NULL; - - /* Create the child process. */ - if (!CreateProcess(NULL, - (char *)buf, /* command line */ - NULL, /* process security attributes */ - NULL, /* primary thread security attributes */ - FALSE, /* handles are not inherited */ - 0, /* creation flags */ - NULL, /* environment */ - NULL, /* use parent's current directory */ - &siStartInfo, /* STARTUPINFO pointer */ - &piProcInfo)) /* receives PROCESS_INFORMATION */ - return FALSE; - - /* We don't care if ghostscript fails, so just return */ - - CloseHandle(piProcInfo.hProcess); - CloseHandle(piProcInfo.hThread); - - return TRUE; -} - - -////////////////////////////////////////////////////////////////////// - -#ifndef CSIDL_PROGRAM_FILES -#define CSIDL_PROGRAM_FILES 0x0026 -#endif -#ifndef CSIDL_FLAG_CREATE -#define CSIDL_FLAG_CREATE 0x8000 -#endif -#ifndef SHGFP_TYPE_CURRENT -#define SHGFP_TYPE_CURRENT 0 -#endif - -BOOL -GetProgramFiles(LPTSTR path) -{ - PFN_SHGetSpecialFolderPath PSHGetSpecialFolderPath = NULL; - PFN_SHGetFolderPath PSHGetFolderPath = NULL; - HMODULE hModuleShell32 = NULL; - HMODULE hModuleShfolder = NULL; - BOOL fOk = FALSE; - hModuleShfolder = LoadLibrary("shfolder.dll"); - hModuleShell32 = LoadLibrary("shell32.dll"); - - if (hModuleShfolder) { - PSHGetFolderPath = (PFN_SHGetFolderPath) - GetProcAddress(hModuleShfolder, "SHGetFolderPathA"); - if (PSHGetFolderPath) { - fOk = (PSHGetFolderPath(HWND_DESKTOP, - CSIDL_PROGRAM_FILES | CSIDL_FLAG_CREATE, - NULL, SHGFP_TYPE_CURRENT, path) == S_OK); - } - } - - if (!fOk && hModuleShell32) { - PSHGetFolderPath = (PFN_SHGetFolderPath) - GetProcAddress(hModuleShell32, "SHGetFolderPathA"); - if (PSHGetFolderPath) { - fOk = (PSHGetFolderPath(HWND_DESKTOP, - CSIDL_PROGRAM_FILES | CSIDL_FLAG_CREATE, - NULL, SHGFP_TYPE_CURRENT, path) == S_OK); - } - } - - if (!fOk && hModuleShell32) { - PSHGetSpecialFolderPath = (PFN_SHGetSpecialFolderPath) - GetProcAddress(hModuleShell32, "SHGetSpecialFolderPathA"); - if (PSHGetSpecialFolderPath) { - fOk = PSHGetSpecialFolderPath(HWND_DESKTOP, path, - CSIDL_PROGRAM_FILES, TRUE); - } - } - - if (!fOk) { - /* If all else fails (probably Win95), try the registry */ - LONG rc; - HKEY hkey; - DWORD cbData; - DWORD keytype; - rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, - "SOFTWARE\\Microsoft\\Windows\\CurrentVersion", 0, KEY_READ, &hkey); - if (rc == ERROR_SUCCESS) { - cbData = MAX_PATH; - keytype = REG_SZ; - if (rc == ERROR_SUCCESS) - rc = RegQueryValueEx(hkey, "ProgramFilesDir", 0, &keytype, - (LPBYTE)path, &cbData); - RegCloseKey(hkey); - } - fOk = (rc == ERROR_SUCCESS); - } - return fOk; -} - - -////////////////////////////////////////////////////////////////////// - diff -Nru ghostscript-9.04~dfsg/psi/dwsetup.h ghostscript-9.05~dfsg~20120125/psi/dwsetup.h --- ghostscript-9.04~dfsg/psi/dwsetup.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/psi/dwsetup.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -/* Copyright (C) 2001-2008 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ - -// $Id$ - -#ifndef dwsetup_INCLUDED -# define dwsetup_INCLUDED - -// Definitions for Ghostscript setup program - -#ifndef IDC_STATIC -#define IDC_STATIC -1 -#endif - -#define IDD_TEXTWIN 101 -#define IDD_DIRDLG 102 -#define IDR_MAIN 200 -#define IDD_MAIN 201 -#define IDC_TARGET_DIR 202 -#define IDC_TARGET_GROUP 203 -#define IDC_BROWSE_DIR 204 -#define IDC_BROWSE_GROUP 205 -#define IDC_README 206 -#define IDS_APPNAME 501 -#define IDS_TARGET_DIR 502 -#define IDS_TARGET_GROUP 503 -#define IDC_PRODUCT_NAME 1000 -#define IDC_TEXTWIN_MLE 1002 -#define IDC_TEXTWIN_COPY 1003 -#define IDC_INSTALL 1004 -#define IDC_FILES 1006 -#define IDC_FOLDER 1007 -#define IDC_TARGET 1008 -#define IDC_ALLUSERS 1009 -#define IDC_COPYRIGHT 1010 -#define IDC_CJK_FONTS 1011 - -#endif /* dwsetup_INCLUDED */ diff -Nru ghostscript-9.04~dfsg/psi/dwsetup.rc ghostscript-9.05~dfsg~20120125/psi/dwsetup.rc --- ghostscript-9.04~dfsg/psi/dwsetup.rc 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/psi/dwsetup.rc 1970-01-01 00:00:00.000000000 +0000 @@ -1,146 +0,0 @@ -/* Copyright (C) 2001-2011 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ - - -// $Id$ - -#include -#include "dwsetup.h" - -#ifndef DS_3DLOOK -#define DS_3DLOOK 0x0004L /* for Windows 95 look */ -#endif - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG 32, 32, 300, 200 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP /* | WS_VISIBLE */ | WS_CAPTION | WS_SYSMENU -CAPTION "GPL Ghostscript Setup" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Install",IDC_INSTALL,240,178,50,14 - ICON IDR_MAIN,IDC_STATIC,11,17,20,20 - LTEXT "This installs",IDC_STATIC,56,6,232,8 - LTEXT "Product Name",IDC_PRODUCT_NAME,72,16,216,8 - LTEXT "Copyright (C) 1994-2011 Artifex Software, Inc. All rights reserved.\n\nRequires 40 Mbytes disk space.", - IDC_COPYRIGHT,56,30,232,40 - - LTEXT "Install to directory",IDC_STATIC,8,72,56,8 - EDITTEXT IDC_TARGET_DIR,8,84,220,12,ES_AUTOHSCROLL - PUSHBUTTON "Browse...",IDC_BROWSE_DIR,240,83,50,14 - - LTEXT "Add shortcuts to",IDC_STATIC,8,112,52,8 - CONTROL "All Users",IDC_ALLUSERS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,160,110,44,10 - EDITTEXT IDC_TARGET_GROUP,8,124,220,12,ES_AUTOHSCROLL - PUSHBUTTON "Browse...",IDC_BROWSE_GROUP,240,123,50,14 - - CONTROL "Use Windows TrueType fonts for Chinese, Japanese and Korean",IDC_CJK_FONTS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,8,156,220,12 - - PUSHBUTTON "Cancel",IDCANCEL,8,178,50,14 - PUSHBUTTON "Help",IDC_README,124,178,50,14 -END - - - -IDD_TEXTWIN DIALOG DISCARDABLE 0, 0, 318, 169 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "GPL Ghostscript setup log" -FONT 8, "MS Sans Serif" -BEGIN - PUSHBUTTON "Cancel",IDCANCEL,261,148,50,14 - EDITTEXT IDC_TEXTWIN_MLE,7,7,304,136,ES_MULTILINE | ES_WANTRETURN | - WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "Copy to Clipboard",IDC_TEXTWIN_COPY,7,148,84,14 -END - -IDD_DIRDLG DIALOG DISCARDABLE 0, 0, 273, 140 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Select Folder" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,216,7,50,14 - PUSHBUTTON "Cancel",IDCANCEL,216,24,50,14 - LISTBOX IDC_FILES,7,7,197,70,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Folder",IDC_FOLDER,7,82,259,12 - LTEXT "Destination Folder",IDC_STATIC,7,105,259,12 - EDITTEXT IDC_TARGET,7,120,259,12,ES_AUTOHSCROLL -END - - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDR_MAIN ICON DISCARDABLE "gswin.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 8 - RIGHTMARGIN, 288 - TOPMARGIN, 6 - BOTTOMMARGIN, 192 - END - IDD_TEXTWIN, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 311 - TOPMARGIN, 7 - BOTTOMMARGIN, 162 - END - - IDD_DIRDLG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 266 - TOPMARGIN, 7 - BOTTOMMARGIN, 133 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_APPNAME "GPL Ghostscript Setup" - IDS_TARGET_DIR "gs" - IDS_TARGET_GROUP "Ghostscript" -END - -///////////////////////////////////////////////////////////////////////////// - - - - diff -Nru ghostscript-9.04~dfsg/psi/dwuninst.cpp ghostscript-9.05~dfsg~20120125/psi/dwuninst.cpp --- ghostscript-9.04~dfsg/psi/dwuninst.cpp 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/psi/dwuninst.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,918 +0,0 @@ -/* Copyright (C) 2001-2006 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ - -// $Id$ - -#define STRICT -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "dwuninst.h" - - -#ifdef _MSC_VER -#define _export -#define chdir(x) _chdir(x) -#define mkdir(x) _mkdir(x) -#endif -#define DELAY_STEP 500 -#define DELAY_FILE 0 -#define MAXSTR 256 -#define UNINSTALLKEY TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall") - -HWND hDlgModeless; -HWND hText1; -HWND hText2; -char path[MAXSTR]; -int language = 0; -BOOL is_win4 = FALSE; -HINSTANCE phInstance; -char szSection[] = "////////////////////////////////"; -BOOL bQuit = FALSE; -BOOL gError = FALSE; // set TRUE if an uninstall was not successful -BOOL bSilent = FALSE; - -char szTitle[MAXSTR]; -char szLogFile[MAXSTR]; -char szLine[MAXSTR]; -FILE *fLog; - -void do_message(void); -BOOL dofiles(void); -BOOL registry_delete(void); -BOOL registry_import(void); -BOOL shell_new(void); -BOOL shell_old(void); -BOOL doEOF(void); - -#ifdef _WIN64 -#define DLGRETURN INT_PTR -#else -#define DLGRETURN BOOL -#endif - -// #define gs_addmess(str) fputs(str, stdout) // for debug -#define gs_addmess(str) - -int message_box(LPCTSTR message, LPCTSTR title, int nType) -{ - if (bSilent) - return 0; - return MessageBox(HWND_DESKTOP, message, title, nType); -} - -// linked list for deleting registry entries in reverse order -typedef struct tagKEY { - long index; - struct tagKEY *previous; -} KEY; -KEY *last_key = NULL; - - -// read a line from the log, removing trailing new line character -BOOL GetLine(void) -{ - BOOL err = TRUE; - int i; - szLine[0] = '\0'; - if (fLog) - err = (fgets(szLine, sizeof(szLine)-1, fLog) == NULL); - i = strlen(szLine) - 1; - if ( (szLine[0] != '\0') && (szLine[i] == '\n')) - szLine[i] = '\0'; - return !err; -} - -BOOL IsSection(void) -{ - return (strncmp(szLine, szSection, strlen(szSection)) == 0); -} - -BOOL -NextSection(void) -{ - while (GetLine()) { - do_message(); - if (bQuit) - return FALSE; - if (IsSection()) - return TRUE; - } - - return TRUE; -} - -BOOL ReadSection(void) -{ - do_message(); - if (bQuit) - return FALSE; - GetLine(); - if (strlen(szLine) == 0) { - doEOF(); - return TRUE; - } - else if (strcmp(szLine, "FileNew")==0) { - SetWindowText(hText1, "Removing Files"); - if (!bSilent) - Sleep(DELAY_STEP); - if (!dofiles()) - return FALSE; - SetWindowText(hText1, ""); - return TRUE; - } - else if (strcmp(szLine, "RegistryNew")==0) { - SetWindowText(hText1, "Removing Registry entries"); - if (!bSilent) - Sleep(DELAY_STEP); - if (!registry_delete()) - return FALSE; - SetWindowText(hText1, ""); - return TRUE; - } - else if (strcmp(szLine, "RegistryOld")==0) { - SetWindowText(hText1, "Restoring Registry entries"); - if (!bSilent) - Sleep(DELAY_STEP); - if (!registry_import()) - return FALSE; - SetWindowText(hText1, ""); - return TRUE; - } - else if (strcmp(szLine, "ShellNew")==0) { - SetWindowText(hText1, "Removing Start Menu items"); - if (!bSilent) - Sleep(DELAY_STEP); - if (!shell_new()) - return FALSE; - SetWindowText(hText1, ""); - return TRUE; - } - else if (strcmp(szLine, "ShellOld")==0) { - SetWindowText(hText1, "Restoring Start Menu items"); - if (!bSilent) - Sleep(DELAY_STEP); - if (!shell_old()) - return FALSE; - SetWindowText(hText1, ""); - return TRUE; - } - return FALSE; -} - - -BOOL -dofiles(void) -{ - while (GetLine()) { - do_message(); - if (bQuit) - return FALSE; - if (IsSection()) { - SetWindowText(hText2, ""); - return TRUE; - } - if (szLine[0] != '\0') { - SetWindowText(hText2, szLine); - if (!bSilent) - Sleep(DELAY_FILE); - gs_addmess("Deleting File: "); - gs_addmess(szLine); - gs_addmess("\n"); - DeleteFile(szLine); - } - } - return FALSE; -} - -BOOL -doEOF(void) -{ - fclose(fLog); - fLog = NULL; - unlink(szLogFile); - PostMessage(hDlgModeless, WM_COMMAND, IDC_DONE, 0L); - bQuit = TRUE; - return TRUE; -} - - -BOOL -registry_delete_key(void) -{ -char keyname[MAXSTR]; -HKEY hkey = HKEY_CLASSES_ROOT; -HKEY hrkey = HKEY_CLASSES_ROOT; -char *rkey, *skey; -char *name; -DWORD dwResult; - keyname[0] = '\0'; - while (GetLine()) { - if ((szLine[0] == '\0') || (szLine[0] == '\r') || (szLine[0] == '\n')) - break; - if (szLine[0] == '[') { - // key name - rkey = strtok(szLine+1, "\\]\n\r"); - if (rkey == (char *)NULL) - return FALSE; - skey = strtok(NULL, "]\n\r"); - if (strcmp(rkey, "HKEY_CLASSES_ROOT")==0) - hrkey = HKEY_CLASSES_ROOT; - else if (strcmp(rkey, "HKEY_CURRENT_USER")==0) - hrkey = HKEY_CURRENT_USER; - else if (strcmp(rkey, "HKEY_LOCAL_MACHINE")==0) - hrkey = HKEY_LOCAL_MACHINE; - else if (strcmp(rkey, "HKEY_USERS")==0) - hrkey = HKEY_USERS; - else - return FALSE; - if (skey == (char *)NULL) - return FALSE; - gs_addmess("Opening registry key\n "); - gs_addmess(rkey); - gs_addmess("\\"); - gs_addmess(skey); - gs_addmess("\n"); - if (RegCreateKeyEx(hrkey, skey, 0, "", 0, KEY_ALL_ACCESS, - NULL, &hkey, &dwResult) - != ERROR_SUCCESS) - return FALSE; - strcpy(keyname, skey); - } - else if (szLine[0] == '@') { - // default value - RegDeleteValue(hkey, NULL); - gs_addmess("Deleting registry default value\n"); - } - else if (szLine[0] == '\042') { - // named value - name = strtok(szLine+1, "\042\r\n"); - RegDeleteValue(hkey, name); - gs_addmess("Deleting registry named value\n "); - gs_addmess(name); - gs_addmess("\n"); - } - } - - // Find out if key has subkeys or values - TCHAR szClass[MAXSTR]; - DWORD cchClass; - DWORD cSubKeys; - DWORD cchMaxSubKey; - DWORD cchMaxClass; - DWORD cValues; - DWORD cchMaxValueName; - DWORD cbMaxValueData; - DWORD cbSecurityDescriptor; - FILETIME ftLastWriteTime; - cchClass = sizeof(szClass) / sizeof(TCHAR); - cSubKeys = 0; - cValues = 0; - RegQueryInfoKey(hkey, szClass, &cchClass, NULL, - &cSubKeys, &cchMaxSubKey, &cchMaxClass, - &cValues, &cchMaxValueName, &cbMaxValueData, - &cbSecurityDescriptor, &ftLastWriteTime); - - // close key - if (hkey != HKEY_CLASSES_ROOT) - RegCloseKey(hkey); - // delete the key - if ((cSubKeys != 0) || (cValues != 0)) { - gs_addmess("Not deleting non empty registry key\n "); - gs_addmess(keyname); - gs_addmess("\n"); - } - else if (strlen(keyname)) { - gs_addmess("Deleting registry key\n "); - gs_addmess(keyname); - gs_addmess("\n"); - RegOpenKeyEx(hrkey, NULL, 0, 0, &hkey); - RegDeleteKey(hkey, keyname); - RegCloseKey(hkey); - } - return TRUE; -} - -BOOL -registry_delete() -{ - long logindex; - KEY *key; - - // scan log file - // so we can remove keys in reverse order - logindex = 0; - while (GetLine() && !IsSection()) { - KEY *key; - if (szLine[0] == '[') { - if ((key = (KEY *)malloc(sizeof(KEY))) - != (KEY *)NULL) { - key->previous = last_key; - key->index = logindex; - last_key = key; - } - } - logindex = ftell(fLog); - } - - // Remove keys - for (key = last_key; key != NULL; key = key->previous) { - if (key != last_key) - free(last_key); - fseek(fLog, key->index, SEEK_SET); - registry_delete_key(); - last_key = key; - } - free(last_key); - - fseek(fLog, logindex, SEEK_SET); - GetLine(); - return TRUE; -} - - - -void -registry_unquote(char *line) -{ -char *s, *d; -int value; - s = d = line; - while (*s) { - if (*s != '\\') { - *d++ = *s; - } - else { - s++; - if (*s == '\\') - *d++ = *s; - else { - value = 0; - if (*s) { - value = *s++ - '0'; - } - if (*s) { - value <<= 3; - value += *s++ - '0'; - } - if (*s) { - value <<= 3; - value += *s - '0'; - } - *d++ = (char)value; - } - } - s++; - } - *d = '\0'; -} - -BOOL -registry_import() -{ - HKEY hkey = HKEY_CLASSES_ROOT; - HKEY hrkey; - char *rkey, *skey; - char *value; - char *name; - DWORD dwResult; - GetLine(); - if (strncmp(szLine, "REGEDIT4", 8) != 0) - return FALSE; - - while (GetLine()) { - if (IsSection()) - break; - if ((szLine[0] == '\0') || (szLine[0] == '\r') || (szLine[0] == '\n')) - continue; - if (szLine[0] == '[') { - // key name - if (hkey != HKEY_CLASSES_ROOT) { - RegCloseKey(hkey); - hkey = HKEY_CLASSES_ROOT; - } - rkey = strtok(szLine+1, "\\]\n\r"); - if (rkey == (char *)NULL) - return FALSE; - skey = strtok(NULL, "]\n\r"); - if (strcmp(rkey, "HKEY_CLASSES_ROOT")==0) - hrkey = HKEY_CLASSES_ROOT; - else if (strcmp(rkey, "HKEY_CURRENT_USER")==0) - hrkey = HKEY_CURRENT_USER; - else if (strcmp(rkey, "HKEY_LOCAL_MACHINE")==0) - hrkey = HKEY_LOCAL_MACHINE; - else if (strcmp(rkey, "HKEY_USERS")==0) - hrkey = HKEY_USERS; - else - return FALSE; - if (skey == (char *)NULL) - return FALSE; - gs_addmess("Creating registry key\n "); - gs_addmess(rkey); - gs_addmess("\\"); - gs_addmess("skey"); - gs_addmess("\n"); - if (RegCreateKeyEx(hrkey, skey, 0, "", 0, KEY_ALL_ACCESS, - NULL, &hkey, &dwResult) - != ERROR_SUCCESS) - return FALSE; - } - else if (szLine[0] == '@') { - // default value - if (strlen(szLine) < 4) - return FALSE; - value = strtok(szLine+3, "\042\r\n"); - if (value) { - registry_unquote(value); - gs_addmess("Setting registry key value\n "); - gs_addmess(value); - gs_addmess("\n"); - if (RegSetValueEx(hkey, NULL, 0, REG_SZ, - (CONST BYTE *)value, strlen(value)+1) - != ERROR_SUCCESS) - return FALSE; - } - } - else if (szLine[0] == '\042') { - // named value - name = strtok(szLine+1, "\042\r\n"); - strtok(NULL, "\042\r\n"); - value = strtok(NULL, "\042\r\n"); - registry_unquote(value); - gs_addmess("Setting registry key value\n "); - gs_addmess(name); - gs_addmess("="); - gs_addmess(value); - gs_addmess("\n"); - if (RegSetValueEx(hkey, name, 0, REG_SZ, (CONST BYTE *)value, - strlen(value)+1) != ERROR_SUCCESS) - return FALSE; - } - } - if (hkey != HKEY_CLASSES_ROOT) - RegCloseKey(hkey); - return TRUE; -} - -// recursive mkdir -// requires a full path to be specified, so ignores root \ -// apart from root \, must not contain trailing \ -// Examples: -// c:\ (OK, but useless) -// c:\gstools (OK) -// c:\gstools\ (incorrect) -// c:gstools (incorrect) -// gstools (incorrect) -// The following UNC names should work, -// but didn't under Win3.1 because gs_chdir wouldn't accept UNC names -// Needs to be tested under Windows 95. -// \\server\sharename\gstools (OK) -// \\server\sharename\ (OK, but useless) -// - -BOOL MakeDir(char *dirname) -{ -char newdir[MAXSTR]; -char *p; - if (strlen(dirname) < 3) - return -1; - - gs_addmess("Making Directory\n "); - gs_addmess(dirname); - gs_addmess("\n"); - if (isalpha(dirname[0]) && dirname[1]==':' && dirname[2]=='\\') { - // drive mapped path - p = dirname+3; - } - else if (dirname[1]=='\\' && dirname[1]=='\\') { - // UNC path - p = strchr(dirname+2, '\\'); // skip servername - if (p == NULL) - return -1; - p++; - p = strchr(p, '\\'); // skip sharename - if (p == NULL) - return -1; - } - else { - // not full path so error - return -1; - } - - while (1) { - strncpy(newdir, dirname, (int)(p-dirname)); - newdir[(int)(p-dirname)] = '\0'; - if (chdir(newdir)) { - if (mkdir(newdir)) - return -1; - } - p++; - if (p >= dirname + strlen(dirname)) - break; // all done - p = strchr(p, '\\'); - if (p == NULL) - p = dirname + strlen(dirname); - } - - return SetCurrentDirectory(dirname); -} - - -BOOL shell_new(void) -{ - - char *p, *q; - char group[MAXSTR]; - // remove shell items added by Ghostscript - // We can only delete one group with this code - group[0] = '\0'; - while (GetLine()) { - if (IsSection()) { - if (strlen(group) != 0) { - gs_addmess("Removing shell folder\n "); - gs_addmess(group); - gs_addmess("\n"); - RemoveDirectory(group); - } - return TRUE; - } - p = strtok(szLine, "="); - q = strtok(NULL, ""); - if (p == NULL) { - continue; - } - else if (strcmp(p, "Group")==0) { - if (q) - strncpy(group, q, sizeof(group)-1); - // defer this until we have remove contents - } - else if (strcmp(p, "Name") == 0) { - if (q) { - gs_addmess("Removing shell link\n "); - gs_addmess(q); - gs_addmess("\n"); - DeleteFile(q); - } - } - } - - return TRUE; -} - - -BOOL CreateShellLink(LPCSTR name, LPCSTR description, LPCSTR program, - LPCSTR arguments, LPCSTR directory, LPCSTR icon, int nIconIndex) -{ - HRESULT hres; - IShellLink* psl; - - // Ensure string is UNICODE. - WCHAR wsz[MAX_PATH]; - MultiByteToWideChar(CP_ACP, 0, name, -1, wsz, MAX_PATH); - - // Save new shell link - - // Get a pointer to the IShellLink interface. - hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, - IID_IShellLink, (void **)&psl); - if (SUCCEEDED(hres)) { - IPersistFile* ppf; - // Query IShellLink for the IPersistFile interface for - // saving the shell link in persistent storage. - hres = psl->QueryInterface(IID_IPersistFile, (void **)&ppf); - if (SUCCEEDED(hres)) { - gs_addmess("Adding shell link\n "); - gs_addmess(name); - gs_addmess("\n"); - - // Set the path to the shell link target. - hres = psl->SetPath(program); - if (!SUCCEEDED(hres)) { - gs_addmess("SetPath failed!"); - gError = TRUE; - } - // Set the description of the shell link. - hres = psl->SetDescription(description); - if (!SUCCEEDED(hres)) { - gs_addmess("SetDescription failed!"); - gError = TRUE; - } - if ((arguments != (LPCSTR)NULL) && *arguments) { - // Set the arguments of the shell link target. - hres = psl->SetArguments(arguments); - if (!SUCCEEDED(hres)) { - gs_addmess("SetArguments failed!"); - gError = TRUE; - } - } - if ((directory != (LPCSTR)NULL) && *directory) { - // Set the arguments of the shell link target. - hres = psl->SetWorkingDirectory(directory); - if (!SUCCEEDED(hres)) { - gs_addmess("SetWorkingDirectory failed!"); - gError = TRUE; - } - } - if ((icon != (LPCSTR)NULL) && *icon) { - // Set the arguments of the shell link target. - hres = psl->SetIconLocation(icon, nIconIndex); - if (!SUCCEEDED(hres)) { - gs_addmess("SetIconLocation failed!"); - gError = TRUE; - } - } - - // Save the link via the IPersistFile::Save method. - hres = ppf->Save(wsz, TRUE); - // Release pointer to IPersistFile. - ppf->Release(); - } - // Release pointer to IShellLink. - psl->Release(); - } - - return (hres == 0); -} - - - -BOOL shell_old(void) -{ - // Add shell items removed by Ghostscript - char *p, *q; - char name[MAXSTR]; - char description[MAXSTR]; - char program[MAXSTR]; - char arguments[MAXSTR]; - char directory[MAXSTR]; - char icon[MAXSTR]; - int nIconIndex; - // Remove shell items added by Ghostscript - name[0] = description[0] = program[0] = arguments[0] - = directory[0] = icon[0] = '\0'; - nIconIndex = 0; - - while (GetLine()) { - if (IsSection()) - return TRUE; - p = strtok(szLine, "="); - q = strtok(NULL, ""); - if (strlen(szLine) == 0) { - if (name[0] != '\0') { - // add start menu item - CreateShellLink(name, description, program, arguments, - directory, icon, nIconIndex); - } - name[0] = description[0] = program[0] = arguments[0] - = directory[0] = icon[0] = '\0'; - nIconIndex = 0; - continue; - } - else if (p == (char *)NULL) { - continue; - } - else if (strcmp(p, "Group")==0) { - MakeDir(q); - } - else if (strcmp(p, "Name") == 0) - strncpy(name, q, sizeof(name)-1); - else if (strcmp(p, "Description") == 0) - strncpy(description, q, sizeof(description)-1); - else if (strcmp(p, "Program") == 0) - strncpy(program, q, sizeof(program)-1); - else if (strcmp(p, "Arguments") == 0) - strncpy(arguments, q, sizeof(arguments)-1); - else if (strcmp(p, "Directory") == 0) - strncpy(directory, q, sizeof(directory)-1); - else if (strcmp(p, "IconLocation") == 0) - strncpy(icon, q, sizeof(icon)-1); - else if (strcmp(p, "IconIndex") == 0) - nIconIndex = atoi(q); - } - - return TRUE; -} - - - -#ifdef __BORLANDC__ -#pragma argsused -#endif -DLGRETURN CALLBACK _export -RemoveDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch(message) { - case WM_INITDIALOG: - SetWindowText(hwnd, szTitle); - if (bSilent) - PostMessage(hwnd, WM_COMMAND, IDOK, 0); - return TRUE; - case WM_COMMAND: - switch(LOWORD(wParam)) { - case IDC_DONE: - // delete registry entries for uninstall - if (is_win4) { - HKEY hkey; - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, - UNINSTALLKEY, 0, KEY_ALL_ACCESS, &hkey) - == ERROR_SUCCESS) { - RegDeleteKey(hkey, szTitle); - RegCloseKey(hkey); - } - } - - SetWindowText(hText1, "Uninstall successful"); - SetWindowText(hText2, ""); - EnableWindow(GetDlgItem(hwnd, IDOK), FALSE); - EnableWindow(GetDlgItem(hwnd, IDCANCEL), TRUE); - SetDlgItemText(hwnd, IDCANCEL, "Exit"); - SetFocus(GetDlgItem(hwnd, IDCANCEL)); - if (bSilent) - PostMessage(hwnd, WM_COMMAND, IDCANCEL, 0); - return TRUE; - case IDOK: - // Start removal - EnableWindow(GetDlgItem(hwnd, IDOK), FALSE); - EnableWindow(GetDlgItem(hwnd, IDC_PRESSOK), FALSE); - while (!bQuit) { - do_message(); - if (!ReadSection()) { - SetWindowText(hText1, "Uninstall FAILED"); - SetWindowText(hText2, ""); - EnableWindow(GetDlgItem(hwnd, IDOK), FALSE); - EnableWindow(GetDlgItem(hwnd, IDCANCEL), TRUE); - SetDlgItemText(hwnd, IDCANCEL, "Exit"); - SetFocus(GetDlgItem(hwnd, IDCANCEL)); - bQuit = TRUE; - } - } - return TRUE; - case IDCANCEL: - bQuit = TRUE; - DestroyWindow(hwnd); - hDlgModeless = 0; - return TRUE; - } - case WM_CLOSE: - DestroyWindow(hwnd); - hDlgModeless = 0; - return TRUE; - } - return FALSE; -} - -void -do_message(void) -{ -MSG msg; - while (hDlgModeless && PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE)) { - if ((hDlgModeless == 0) || !IsDialogMessage(hDlgModeless, &msg)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } -} - - - -BOOL -init(void) -{ - DWORD version = GetVersion(); - char *p, *s; - int len; - BOOL inquote = FALSE; - // get location of uninstall log from command line as argv[1] - p = GetCommandLine(); - s = p; - if (*s == '\042') { - // skip over program name - s++; - while (*s && *s!='\042') - s++; - if (*s) - s++; - } - else if (*s != ' ') { - // skip over program name - s++; - while (*s && *s!=' ') - s++; - if (*s) - s++; - } - while (*s && *s==' ') - s++; - if (*s == '\042') { - s++; - inquote = TRUE; - } - p = s; - if (inquote) { - while (*s && (*s != '\042')) - s++; - } - else { - while (*s && (*s != ' ')) - s++; - } - len = s - p; - strncpy(szLogFile, p, min(len, (int)sizeof(szLogFile)-1)); - szLogFile[len] = '\0'; - if (inquote && (*s == '\042')) { - s++; - inquote = FALSE; - } - - if (strlen(szLogFile) == 0) { - message_box("Usage: uninstgs logfile.txt [-q]", - "GPL Ghostscript Uninstall", MB_OK); - return FALSE; - } - - while (*s && *s==' ') - s++; - if (strncmp(s, "-q", 2) == 0) - bSilent = TRUE; - - // read first few lines of file to get title - fLog = fopen(szLogFile, "r"); - if (fLog == (FILE *)NULL) { - message_box(szLogFile, "Can't find file", MB_OK); - return FALSE; - } - GetLine(); - if (!IsSection()) { - message_box(szLogFile, "Not valid uninstall log", MB_OK); - return FALSE; - } - GetLine(); - if (strcmp(szLine, "UninstallName") != 0) { - message_box(szLogFile, "Not valid uninstall log", MB_OK); - return FALSE; - } - GetLine(); - strcpy(szTitle, szLine); - - NextSection(); - - if (LOBYTE(LOWORD(version)) >= 4) - is_win4 = TRUE; - return TRUE; -} - -#ifdef __BORLANDC__ -#pragma argsused -#endif -int PASCAL -WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int cmdShow) -{ -MSG msg; - - phInstance = hInstance; - if (!init()) - return 1; - - - CoInitialize(NULL); - - hDlgModeless = CreateDialogParam(hInstance, - MAKEINTRESOURCE(IDD_UNSET), - HWND_DESKTOP, RemoveDlgProc, (LPARAM)NULL); - hText1 = GetDlgItem(hDlgModeless, IDC_T1); - hText2 = GetDlgItem(hDlgModeless, IDC_T2); - - SetWindowPos(hDlgModeless, HWND_TOP, 0, 0, 0, 0, - (bSilent ? SWP_HIDEWINDOW : SWP_SHOWWINDOW) | SWP_NOMOVE | SWP_NOSIZE); - - while (hDlgModeless && GetMessage(&msg, (HWND)NULL, 0, 0)) { - if ((hDlgModeless == 0) || !IsDialogMessage(hDlgModeless, &msg)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - - if (fLog) - fclose(fLog); - - CoUninitialize(); - - return 0; -} - diff -Nru ghostscript-9.04~dfsg/psi/dwuninst.h ghostscript-9.05~dfsg~20120125/psi/dwuninst.h --- ghostscript-9.04~dfsg/psi/dwuninst.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/psi/dwuninst.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -/* Copyright (C) 2001-2006 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ - -// $Id$ - -#ifndef dwuninst_INCLUDED -# define dwuninst_INCLUDED - -// Definitions for Ghostscript installer - -#define ID_UNINSTGS 1 -#define ID_UNINST 2 -#define IDD_UNSET 2 -#define IDC_GSICON 101 -#define IDC_PROG 102 -#define IDC_DONE 103 -#define IDC_PRESSOK 103 -#define IDC_T1 111 -#define IDC_T2 112 - -#endif /* dwuninst_INCLUDED */ diff -Nru ghostscript-9.04~dfsg/psi/dwuninst.rc ghostscript-9.05~dfsg~20120125/psi/dwuninst.rc --- ghostscript-9.04~dfsg/psi/dwuninst.rc 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/psi/dwuninst.rc 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -/* Copyright (C) 2001-2006 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, modified - or distributed except as expressly authorized under the terms of that - license. Refer to licensing information at http://www.artifex.com/ - or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, - San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. -*/ - -// $Id$ - -#include -#include "dwuninst.h" - -ID_UNINSTGS ICON "gswin.ico" - - -IDD_UNSET DIALOG 6, 15, 242, 123 -STYLE DS_MODALFRAME | 0x4L | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "" -FONT 8, "MS Sans Serif" -{ - DEFPUSHBUTTON "&Cancel", IDCANCEL, 106, 98, 50, 14 - PUSHBUTTON "&Uninstall", IDOK, 16, 98, 50, 14 - LTEXT "To remove this package, press Uninstall", IDC_PRESSOK, 44, 8, 192, 8 - LTEXT "", IDC_T1, 32, 48, 200, 16 - LTEXT "", IDC_T2, 32, 64, 200, 16 - ICON ID_UNINSTGS, IDC_GSICON, 8, 8, 18, 20 -} - - diff -Nru ghostscript-9.04~dfsg/psi/fapi_ft.c ghostscript-9.05~dfsg~20120125/psi/fapi_ft.c --- ghostscript-9.04~dfsg/psi/fapi_ft.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/psi/fapi_ft.c 2012-01-07 20:18:22.000000000 +0000 @@ -25,12 +25,18 @@ #include "write_t1.h" #include "write_t2.h" #include "math_.h" -#include "gserror.h" +#include "gserrors.h" #include "gsmemory.h" #include "gsmalloc.h" #include "gxfixed.h" #include "gdebug.h" #include "gxbitmap.h" +#include "gsmchunk.h" + +#include "stream.h" +#include "gxiodev.h" /* must come after stream.h */ + +#include "gsfname.h" /* FreeType headers */ #include @@ -55,6 +61,7 @@ FT_BitmapGlyph bitmap_glyph; gs_memory_t *mem; FT_Memory ftmemory; + struct FT_MemoryRec_ ftmemory_rec; } FF_server; typedef struct FF_face_s @@ -69,7 +76,8 @@ /* If non-null, the incremental interface object passed to FreeType. */ FT_Incremental_InterfaceRec *ft_inc_int; - + /* If non-null, we're using a custom stream object for Freetype to read the font file */ + FT_Stream ftstrm; /* Non-null if font data is owned by this object. */ unsigned char *font_data; } FF_face; @@ -111,7 +119,6 @@ } tmp = gs_malloc (mem, new_size, 1, "FF_realloc"); - if (tmp && block) { memcpy (tmp, block, min(cur_size, new_size)); @@ -128,8 +135,107 @@ gs_free (mem, block, 0, 0, "FF_free"); } +/* The following three functions are used in providing a custom stream + * object to Freetype, so file access happens through Ghostscript's + * file i/o. Most importantly, this gives Freetype direct access to + * files in the romfs + */ +static FT_ULong FF_stream_read (FT_Stream str, unsigned long offset, unsigned char* buffer, unsigned long count) +{ + stream *ps = (stream *)str->descriptor.pointer; + unsigned int rlen = 0; + int status = 0; + + if (sseek(ps, offset) < 0) + return_error(-1); + + if (count) { + status = sgets(ps, buffer, count, &rlen); + + if (status < 0 && status != EOFC) + return(-1); + } + return(rlen); +} + +static void FF_stream_close (FT_Stream str) +{ + stream *ps = (stream *)str->descriptor.pointer; + + (void)sclose(ps); +} + +extern const uint file_default_buffer_size; + +static int FF_open_read_stream (gs_memory_t *mem, char *fname, FT_Stream *fts) +{ + int code = 0; + gs_parsed_file_name_t pfn; + stream *ps = (stream *)NULL; + long length; + FT_Stream ftstrm = NULL; + + code = gs_parse_file_name(&pfn, (const char *)fname, strlen(fname), mem); + if (code < 0){ + goto error_out; + } + + if (!pfn.fname) { + code = e_undefinedfilename; + goto error_out; + } + + if (pfn.iodev == NULL) { + pfn.iodev = iodev_default(mem); + } + + if (pfn.iodev) { + gx_io_device *const iodev = pfn.iodev; + iodev_proc_open_file((*open_file)) = iodev->procs.open_file; + + if (open_file) { + code = open_file(iodev, pfn.fname, pfn.len, "r", &ps, mem); + if (code < 0) { + goto error_out; + } + } + else { + code = file_open_stream(pfn.fname, pfn.len, "r", file_default_buffer_size, + &ps, pfn.iodev, pfn.iodev->procs.fopen, mem); + if (code < 0) { + goto error_out; + } + } + } + + if ((code = savailable(ps, &length)) < 0){ + goto error_out; + } + + ftstrm = gs_malloc(mem, sizeof(FT_StreamRec), 1, "FF_open_read_stream"); + if (!ftstrm){ + code = e_VMerror; + goto error_out; + } + memset(ftstrm, 0x00, sizeof(FT_StreamRec)); + + ftstrm->descriptor.pointer = ps; + ftstrm->read = FF_stream_read; + ftstrm->close = FF_stream_close; + ftstrm->size = length; + *fts = ftstrm; + +error_out: + if (code < 0) { + if (ps) (void)sclose(ps); + if (ftstrm) gs_free(mem, ftstrm, 0, 0, "FF_open_read_stream"); + } + return(code); +} + + static FF_face * -new_face(FAPI_server *a_server, FT_Face a_ft_face, FT_Incremental_InterfaceRec *a_ft_inc_int, unsigned char *a_font_data) +new_face(FAPI_server *a_server, FT_Face a_ft_face, FT_Incremental_InterfaceRec *a_ft_inc_int, FT_Stream ftstrm, unsigned char *a_font_data) { FF_server *s = (FF_server*)a_server; @@ -139,6 +245,7 @@ face->ft_face = a_ft_face; face->ft_inc_int = a_ft_inc_int; face->font_data = a_font_data; + face->ftstrm = ftstrm; } return face; } @@ -153,6 +260,9 @@ FT_Done_Face(a_face->ft_face); FF_free(s->ftmemory, a_face->ft_inc_int); FF_free(s->ftmemory, a_face->font_data); + if (a_face->ftstrm) { + FF_free(s->ftmemory, a_face->ftstrm); + } FF_free(s->ftmemory, a_face); } } @@ -558,7 +668,7 @@ ft_error = FT_Get_Glyph(ft_face->glyph, a_glyph); } else { - if (a_bitmap == true) { + if (ft_face->glyph->format == FT_GLYPH_FORMAT_BITMAP) { FT_BitmapGlyph bmg; ft_error = FT_Get_Glyph(ft_face->glyph, (FT_Glyph *)&bmg); if (!ft_error) { @@ -651,11 +761,6 @@ /* As we want FT to use our memory management, we cannot use the convenience of * FT_Init_FreeType(), we have to do each stage "manually" */ - s->ftmemory = gs_malloc (s->mem, sizeof(*s->ftmemory), 1, "ensure_open"); - if (!s->ftmemory) { - return(-1); - } - s->ftmemory->user = s->mem; s->ftmemory->alloc = FF_alloc; s->ftmemory->free = FF_free; @@ -717,33 +822,31 @@ FT_Matrix ftscale_mat; FT_UInt xres; FT_UInt yres; - FT_Vector vectx, vecty; bool indep_scale; scalex = hypot ((double)a_transform->xx, (double)a_transform->xy); scaley = hypot ((double)a_transform->yx, (double)a_transform->yy); if (*xresp != *yresp) { - /* We need to give the resolution in "glyph space", taking account - * of rotation and shearing, so that makes life a little complicated - * when non-square resolutions are used. + /* To get good results, we have to pull the implicit scaling from + * non-square resolutions, and apply it in the matrix. This means + * we get the correct "shearing" effect for rotated glyphs. + * The previous solution was only effective for for glyphs whose + * axes were coincident with the axes of the page. */ - ftscale_mat.xx = scalex; - ftscale_mat.xy = ftscale_mat.yx = 0; - ftscale_mat.yy = scaley; - - FT_Matrix_Invert(&ftscale_mat); + bool use_x = true; + + if (*xresp < *yresp) { + use_x = false; + } - FT_Matrix_Multiply (a_transform, &ftscale_mat); + ftscale_mat.xx = (int)(((double)(*xresp) / ((double)(use_x ? (*xresp) : (*yresp)))) * 65536); + ftscale_mat.xy = ftscale_mat.yx = 0; + ftscale_mat.yy = (int)(((double)(*yresp) / ((double)(use_x ? (*xresp) : (*yresp)))) * 65536); - vectx.x = *xresp << 16; - vecty.y = *yresp << 16; - vectx.y = vecty.x = 0; + FT_Matrix_Multiply (&ftscale_mat, a_transform); - FT_Vector_Transform (&vectx, &ftscale_mat); - FT_Vector_Transform (&vecty, &ftscale_mat); - xres = (FT_UInt)((hypot ((double)vectx.x, (double)vecty.x) * (1.0/65536.0)) + 0.5); - yres = (FT_UInt)((hypot ((double)vectx.y, (double)vecty.y) * (1.0/65536.0)) + 0.5); + xres = yres = (use_x ? (*xresp) : (*yresp)); } else { /* Life is considerably easier when square resolutions are in use! */ @@ -801,14 +904,21 @@ } /* We also have to watch for variable overflow in Freetype. - * I've opted to fiddle with the resolution here, as it is - * almost always a larger value than the text size, and therefore - * we have more scope to manipulate it. + * We fiddle with whichever of the resolution or the scale + * is larger for the current iteration, but change the scale + * by a smaller multiple, firstly because it is a floating point + * value, so we can, but also because varying the scale by larger + * amounts is more prone to causing rounding errors. */ facty = 1.0; - while (scaley * yres > 256.0 * 72 && yres > 0) { - yres >>= 1; - facty *= 2.0; + while (scaley * yres > 512.0 * 72 && yres > 0 && scaley > 0.0) { + if (scaley < yres) { + yres >>= 1; + facty *= 2.0; + } + else { + scaley /= 1.25; + } } if (scalex < 10.0) { @@ -824,9 +934,14 @@ /* see above */ factx = 1.0; - while (scalex * xres > 256.0 * 72.0 && xres > 0) { - xres >>= 1; - factx *= 2.0; + while (scalex * xres > 512.0 * 72.0 && xres > 0 && scalex > 0.0) { + if (scalex < xres) { + xres >>= 1; + factx *= 2.0; + } + else { + scalex /= 1.25; + } } } else { @@ -856,15 +971,21 @@ } /* We also have to watch for variable overflow in Freetype. - * I've opted to fiddle with the resolution here, as it is - * almost always a larger value than the text size, and therefore - * we have more scope to manipulate it. + * We fiddle with whichever of the resolution or the scale + * is larger for the current iteration. */ fact = 1.0; - while (scalex * xres > 256.0 * 72 && xres > 0 && yres > 0) { - xres >>= 1; - yres >>= 1; - fact *= 2.0; + while (scalex * xres > 512.0 * 72 && xres > 0 && yres > 0 + && (scalex > 0.0 && scaley > 0.0)) { + if (scalex < xres) { + xres >>= 1; + yres >>= 1; + fact *= 2.0; + } + else { + scalex /= 1.25; + scaley /= 1.25; + } } } else { @@ -883,19 +1004,25 @@ /* see above */ fact = 1.0; - while (scaley * yres > 256.0 * 72.0 && xres > 0 && yres > 0) { - xres >>= 1; - yres >>= 1; - - fact *= 2.0; + while (scaley * yres > 512.0 * 72.0 && (xres > 0 && yres > 0) + && (scalex > 0.0 && scaley > 0.0)) { + if (scaley < yres) { + xres >>= 1; + yres >>= 1; + fact *= 2.0; + } + else { + scalex /= 1.25; + scaley /= 1.25; + } } } factx = facty = fact; } - ftscale_mat.xx = (FT_Fixed)(65536.0 / scalex) * factx; + ftscale_mat.xx = (FT_Fixed)((65536.0 / scalex) * factx); ftscale_mat.xy = 0; ftscale_mat.yx = 0; - ftscale_mat.yy = (FT_Fixed)(65536.0 / scaley) * facty; + ftscale_mat.yy = (FT_Fixed)((65536.0 / scaley) * facty); FT_Matrix_Multiply (a_transform, &ftscale_mat); memcpy(a_transform, &ftscale_mat, sizeof(FT_Matrix)); @@ -953,13 +1080,28 @@ FT_Parameter ft_param; FT_Incremental_InterfaceRec *ft_inc_int = NULL; unsigned char *own_font_data = NULL; + FT_Stream ft_strm = NULL; /* dpf("get_scaled_font creating face\n"); */ /* Load a typeface from a file. */ if (a_font->font_file_path) { - ft_error = FT_New_Face(s->freetype_library, a_font->font_file_path, a_font->subfont, &ft_face); + FT_Open_Args args; + int code; + + memset(&args, 0x00, sizeof(args)); + + if ((code = FF_open_read_stream ((gs_memory_t *)(s->ftmemory->user), + (char *)a_font->font_file_path, &ft_strm)) < 0){ + return(code); + } + + args.flags = FT_OPEN_STREAM; + args.stream = ft_strm; + + ft_error = FT_Open_Face(s->freetype_library, &args, a_font->subfont, &ft_face); + if (!ft_error && ft_face) ft_error = FT_Select_Charmap(ft_face, ft_encoding_unicode); } @@ -1040,7 +1182,7 @@ if (ft_face) { - face = new_face(a_server, ft_face, ft_inc_int, own_font_data); + face = new_face(a_server, ft_face, ft_inc_int, ft_strm, own_font_data); if (!face) { FF_free(s->ftmemory, own_font_data); @@ -1185,8 +1327,8 @@ { FF_server *s = (FF_server*)a_server; return load_glyph(a_server, a_font, a_char_ref, a_metrics, - a_server->max_bitmap > 0 ? (FT_Glyph*)&s->bitmap_glyph : (FT_Glyph*)&s->outline_glyph, - a_server->max_bitmap > 0 ? true : false, a_server->max_bitmap); + (FT_Glyph*)&s->outline_glyph, + false, a_server->max_bitmap); } static FAPI_retcode get_fontmatrix(FAPI_server *server, gs_matrix *m) @@ -1455,11 +1597,21 @@ int gs_fapi_ft_instantiate( i_plugin_client_memory *a_memory, i_plugin_instance **a_plugin_instance) { FF_server *server = (FF_server*) a_memory->alloc(a_memory, sizeof (FF_server), "FF_server"); + int code; + if (!server) return e_VMerror; memset(server, 0, sizeof(*server)); - server->mem = a_memory->client_data; + + code = gs_memory_chunk_wrap(&(server->mem), a_memory->client_data); + if (code != 0) { + return(code); + } + server->fapi_server = TheFreeTypeServer; + + server->ftmemory = (FT_Memory)(&(server->ftmemory_rec)); + *a_plugin_instance = &server->fapi_server.ig; return 0; } @@ -1476,7 +1628,6 @@ * FT_Done_Library () and then discard the memory ourselves */ FT_Done_Library(server->freetype_library); - gs_free (server->mem, server->ftmemory, 0, 0, "gs_freetype_destroy"); - + gs_memory_chunk_release (server->mem); a_memory->free(a_memory, server, "FF_server"); } diff -Nru ghostscript-9.04~dfsg/psi/fapiufst.c ghostscript-9.05~dfsg~20120125/psi/fapiufst.c --- ghostscript-9.04~dfsg/psi/fapiufst.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/psi/fapiufst.c 2011-12-08 09:35:23.000000000 +0000 @@ -61,9 +61,15 @@ #include "ipacked.h" /* for packed_next */ #include "iddict.h" #include "ifont42.h" /* for string_array_access_proc */ +#include "gsmalloc.h" +#include "gsmchunk.h" #undef frac_bits +#ifndef _MSC_VER +#define _MSC_VER 0 +#endif + /* UFST includes : */ #include "cgconfig.h" #include "ufstport.h" @@ -95,6 +101,9 @@ #endif #if UFST_VERSION_MAJOR >= 6 && UFST_VERSION_MINOR >= 2 +#undef true +#undef false + #define false FALSE #define true TRUE #define UNICODE UFST_UNICODE @@ -131,8 +140,7 @@ typedef struct fapi_ufst_server_s fapi_ufst_server; -static gs_memory_t *gs_mem_ctx = NULL; -static unsigned long long int font_ids; +static unsigned int font_ids = 0x7fffffff; #if UFST_REENTRANT #define FSA_FROM_SERVER IF_STATE *pIFS = &r->IFS @@ -173,7 +181,7 @@ FAPI_server If; int bInitialized; FAPI_font *ff; - i_plugin_client_memory client_mem; + gs_memory_t *mem; byte *param; int param_size; IF_STATE IFS; @@ -201,6 +209,22 @@ { return (fapi_ufst_server *)((char *)pIFS - offset_of(fapi_ufst_server, IFS)); } +/* assign font_id not based on fchandle value, nor read from font */ +static inline int assign_font_id(void) +{ + /* We're only allowed 5 open FCOs at one time + * so make sure we don't clash with those + */ + if ((--font_ids) <= (5 << 16)) { + /* When we clash with the expected values for FCO's + * wrap around. No will ever have enough concurrent + * fonts for this to be a problem! + */ + font_ids = 0x7fffffff; + } + return(font_ids); +} + /*------------------ FAPI_server members ------------------------------------*/ static inline void release_char_data_inline(fapi_ufst_server *r) @@ -248,7 +272,7 @@ FSA_FROM_SERVER; if (server_param_size > 0 && server_param) { - r->param = (byte *)r->client_mem.alloc(&r->client_mem, server_param_size, "server_params"); + r->param = (byte *)gs_malloc(r->mem, server_param_size, 1, "server_params"); if (!r->param) { return_error (e_VMerror); } @@ -275,17 +299,17 @@ sPlugIn[l] = 0; bPlugIn = TRUE; } else - emprintf(r->client_mem.client_data, + emprintf(r->mem, "Warning: Unknown UFST parameter ignored.\n"); } #if !NO_SYMSET_MAPPING if (!bSSdir) { strcpy(ufst_root_dir, "."); - emprintf(r->client_mem.client_data, + emprintf(r->mem, "Warning: UFST_SSdir is not specified, will search *.ss files in the curent directory.\n"); } #endif - code = gx_UFST_init(r->client_mem.client_data, (const UB8 *)ufst_root_dir); + code = gx_UFST_init(r->mem, (const UB8 *)ufst_root_dir); if (code < 0) return code; r->ufst_is_singleton = (code == 1); @@ -297,7 +321,7 @@ return code; } else { #ifdef FCO_RDR - emprintf(r->client_mem.client_data, + emprintf(r->mem, "Warning: UFST_PlugIn is not specified, some characters may be missing.\n"); #endif } @@ -316,7 +340,7 @@ { code = open_UFST(r, server_param, server_param_size); if (code < 0) { - emprintf(r->client_mem.client_data, "Error opening the UFST font server.\n"); + emprintf(r->mem, "Error opening the UFST font server.\n"); return code; } } @@ -440,9 +464,9 @@ r->callback_error = e_invalidfont; return 0; } - g = (pcleo_glyph_list_elem *)r->client_mem.alloc(&r->client_mem, + g = (pcleo_glyph_list_elem *)gs_malloc(r->mem, sizeof(pcleo_glyph_list_elem) + - (use_XL_format ? 12 : sizeof(PCLETTO_CHDR)) + glyph_length + 2, + (use_XL_format ? 12 : sizeof(PCLETTO_CHDR)) + glyph_length + 2, 1, "PCLETTO char"); if (g == 0) { r->callback_error = e_VMerror; @@ -510,7 +534,7 @@ return (NULL); } - cstring = MEMptr(charstring.hdata); + cstring = (unsigned char *)MEMptr(charstring.hdata); if (ff->get_glyph(ff, chId, cstring, glyph_length) != glyph_length) { @@ -537,8 +561,8 @@ #else ushort glyph_length = ff->get_glyph(ff, chId, 0, 0); LPUB8 q; - pcleo_glyph_list_elem *g = (pcleo_glyph_list_elem *)r->client_mem.alloc(&r->client_mem, - sizeof(pcleo_glyph_list_elem) + sizeof(PS_CHAR_HDR) + 2 + 2 + glyph_length + 1, "PSEO char"); + pcleo_glyph_list_elem *g = (pcleo_glyph_list_elem *)gs_malloc(r->mem, + sizeof(pcleo_glyph_list_elem) + sizeof(PS_CHAR_HDR) + 2 + 2 + glyph_length + 1, 1, "PSEO char"); PS_CHAR_HDR *h; ufst_common_font_data *d = (ufst_common_font_data *)r->fc.font_hdr - 1; FSA_FROM_SERVER; @@ -657,12 +681,12 @@ static void pack_pseo_fhdr(fapi_ufst_server *r, FAPI_font *ff, UB8 *p) { ushort j, n, skip = 0; - while ((UL32)p & 0x03) /* align to QUADWORD */ + while (((uint64_t)p) & 0x03) /* align to QUADWORD */ PACK_ZERO(p); pack_long(&p, 1); /* format = 1 */ for (j = 0; j < 6; j++) pack_float(&p, ff->get_float(ff, FAPI_FONT_FEATURE_FontMatrix, j)); - while ((UL32)p & 0x03) /* align to QUADWORD */ + while (((uint64_t)p) & 0x03) /* align to QUADWORD */ PACK_ZERO(p); /* UFST has no definition for PSEO structure, so implement serialization : */ PACK_LONG(p, 0, FAPI_FONT_FEATURE_UniqueID); @@ -727,11 +751,11 @@ } static char *my_strdup(fapi_ufst_server *r, const char *s, const char *cname) -{ int l = strlen(s) + 1; - char *p = (char *)r->client_mem.alloc(&r->client_mem, l, cname); +{ int len = strlen(s) + 1; + char *p = (char *)gs_malloc(r->mem, len, 1, cname); if (p != 0) - memcpy(p, s, l); + memcpy(p, s, len); return p; } @@ -753,7 +777,7 @@ if ((code = CGIFfco_Open(FSA (UB8 *)font_file_path, &fcHandle)) != 0) return code; - e = (fco_list_elem *)r->client_mem.alloc(&r->client_mem, sizeof(*e), "fco_list_elem"); + e = (fco_list_elem *)gs_malloc(r->mem, sizeof(*e), 1, "fco_list_elem"); if (e == 0) { CGIFfco_Close(FSA fcHandle); return e_VMerror; @@ -763,7 +787,7 @@ e->file_path = my_strdup(r, font_file_path, "fco_file_path"); if (e->file_path == 0) { CGIFfco_Close(FSA fcHandle); - r->client_mem.free(&r->client_mem, e, "fco_list_elem"); + gs_free(r->mem, e, 0, 0, "fco_list_elem"); return e_VMerror; } e->next = r->fco_list; @@ -822,7 +846,7 @@ #endif area_length += strlen(font_file_path) + 1; } - buf = r->client_mem.alloc(&r->client_mem, area_length, "ufst font data"); + buf = gs_malloc(r->mem, area_length, 1, "ufst font data"); if (buf == 0) return e_VMerror; @@ -843,9 +867,9 @@ d->font_id = (e->fcHandle << 16) | ff->subfont; d->font_type = FC_FCO_TYPE; } else { - stream *f = sfopen(font_file_path, "rb", (gs_memory_t *)(r->client_mem.client_data)); + stream *f = sfopen(font_file_path, "rb", r->mem); if (f == NULL) { - emprintf1((gs_memory_t *)(r->client_mem.client_data), + emprintf1(r->mem, "fapiufst: Can't open %s\n", font_file_path); return e_undefinedfilename; @@ -864,7 +888,7 @@ d->font_type = (ff->is_type1 ? FC_PST1_TYPE : FC_TT_TYPE); d->font_id = ff->get_long(ff, FAPI_FONT_FEATURE_UniqueID, 0); if (d->font_id < 0) { - d->font_id = ++font_ids; + d->font_id = assign_font_id(); } h = (PCLETTO_FHDR *)(buf + sizeof(ufst_common_font_data)); h->fontDescriptorSize = PCLETTOFONTHDRSIZE; @@ -970,6 +994,7 @@ FAPI_retcode code = 0; bool use_XL_format = ff->is_mtx_skipped; int world_scale = 0; + FONT_METRICS fm; FSA_FROM_SERVER; if (ff->is_cid && ff->is_type1 && ff->font_file_path == NULL && @@ -989,8 +1014,12 @@ prepare_typeface(r, d); if (ff->font_file_path != NULL || ff->is_type1) /* such fonts don't use RAW_GLYPH */ choose_decoding(r, d, xlatmap); - } else + } + else { prepare_typeface(r, d); + if (ff->font_file_path != NULL || ff->is_type1) /* such fonts don't use RAW_GLYPH */ + choose_decoding(r, d, xlatmap); + } r->tran_xx = font_scale->matrix[0] / scale, r->tran_xy = font_scale->matrix[1] / scale; r->tran_yx = font_scale->matrix[2] / scale, r->tran_yy = font_scale->matrix[3] / scale; @@ -1053,7 +1082,11 @@ if (r->callback_error != 0) return r->callback_error; - return code; + code = CGIFfont_metrics(&fm); + if (r->callback_error != 0) + return r->callback_error; + + return code; } static FAPI_retcode get_decodingID(FAPI_server *server, FAPI_font *ff, const char **decodingID_result) @@ -1145,7 +1178,7 @@ while (d->glyphs != 0) { pcleo_glyph_list_elem *e = d->glyphs; d->glyphs = e->next; - r->client_mem.free(&r->client_mem, e, "PCLEO char"); + gs_free(r->mem, e, 0, 0, "PCLEO char"); } d->glyphs = NULL; } @@ -1153,6 +1186,40 @@ static FAPI_retcode get_fontmatrix(FAPI_server *I, gs_matrix *m) { + fapi_ufst_server *r = If_to_I(I); + ufst_common_font_data *d = (ufst_common_font_data *)I->ff.server_font_data; + FAPI_retcode code = 0; + + if (d == 0) { + if ((code = make_font_data(r, I->ff.font_file_path, &(I->ff), &d)) != 0) + return (code); + I->ff.server_font_data = d; + prepare_typeface(r, d); + } + + /* There are PS jobs that rely on the standard fonts having + * a FontMatrix of [0.001 0 0 0.001 0 0], but MT fonts actually + * have an identity matrix. We need to compensate here. Other + * fonts need an identity matrix returned here, as we apply the + * font matrix explicitly in the scale calculation in zfapi.c + */ + if (d->font_type & FC_FCO_TYPE) { + m->xx = 0.001; + m->xy = 0.0; + m->yx = 0.0; + m->yy = 0.001; + m->tx = 0.0; + m->ty = 0.0; + } + else { + m->xx = 1.0; + m->xy = 0.0; + m->yx = 0.0; + m->yy = 1.0; + m->tx = 0.0; + m->ty = 0.0; + } + #if 0 gs_matrix *base_font_matrix = &I->initial_FontMatrix; m->xx = I->initial_FontMatrix.xx; @@ -1161,42 +1228,9 @@ m->yy = I->initial_FontMatrix.yy; m->tx = I->initial_FontMatrix.tx; m->ty = I->initial_FontMatrix.ty; -#else - m->xx = 1; - m->xy = 0; - m->yx = 0; - m->yy = 1; - m->tx = 0; - m->ty = 0; #endif - return 0; - -} - -static FAPI_retcode get_char_width(FAPI_server *server, FAPI_font *ff, FAPI_char_ref *c, FAPI_metrics *metrics) -{ fapi_ufst_server *r = If_to_I(server); - UW16 buffer[2]; - UW16 cc = (UW16)c->char_code; - WIDTH_LIST_INPUT_ENTRY li[1]; - char PSchar_name[MAX_CHAR_NAME_LENGTH]; - int code; - FSA_FROM_SERVER; + return (code); -#if !UFST_REENTRANT - static_server_ptr_for_ufst_callback = r; -#endif - make_asciiz_char_name(PSchar_name, sizeof(PSchar_name), c); - r->ff = ff; - CGIFchIdptr(FSA &cc, PSchar_name); - li[0]. CharType.IF_cgnum = cc; - if ((code = CGIFwidth(FSA li, 1, 4, buffer)) != 0) - return code; - r->ff = 0; -/* CGIFhdr_font_purge (&r->fc); - release_glyphs(r, (ufst_common_font_data *)ff->server_font_data); */ - metrics->escapement = buffer[0]; - metrics->em_x = metrics->em_y = buffer[1]; - return 0; } static int export_outline(fapi_ufst_server *r, PIFOUTLINE pol, FAPI_path *p) @@ -1265,7 +1299,7 @@ ufst_common_font_data *d = (ufst_common_font_data *)ff->server_font_data; SW16 design_escapement[2]; SW16 du_emx, du_emy; - char *notdef = ".notdef"; + const char *notdef = ".notdef"; const void *client_char_data = ff->char_data; const int client_char_data_len = ff->char_data_len; bool need_decrypt = ff->need_decrypt; @@ -1343,12 +1377,12 @@ r->callback_error = 0; ff->char_data = (void *)notdef; ff->char_data_len = strlen(notdef); - CGIFchIdptr(FSA &c1, notdef); + CGIFchIdptr(FSA (void *)&c1, (void *)notdef); code2 = CGIFchar_handle(FSA c1, &result, (SW16)0); if (code2 && code2 != ERR_fixed_space && code2 != ERR_bm_buff && code2 != ERR_bm_too_big) { - ff->char_data = "space"; + ff->char_data = (void *)"space"; ff->char_data_len = strlen("space"); - CGIFchIdptr(FSA &c1, "space"); + CGIFchIdptr(FSA (void *)&c1, (void *)"space"); code2 = CGIFchar_handle(FSA c1, &result, (SW16)0); } if (!code2 || code2 == ERR_fixed_space) { @@ -1493,19 +1527,36 @@ } static FAPI_retcode get_char_raster_metrics(FAPI_server *server, FAPI_font *ff, FAPI_char_ref *c, FAPI_metrics *metrics) -{ fapi_ufst_server *r = If_to_I(server); +{ + fapi_ufst_server *r = If_to_I(server); int code; release_char_data_inline(r); code = get_char(r, ff, c, NULL, metrics, FC_BITMAP_TYPE); if (code == ERR_bm_buff || code == ERR_bm_too_big) /* Too big character ? */ - return e_limitcheck; + return (e_VMerror); + return code; + /* UFST cannot render enough metrics information without generating raster or outline. + r->char_data keeps a raster after calling this function. + */ +} + +static FAPI_retcode get_char_width(FAPI_server *server, FAPI_font *ff, FAPI_char_ref *c, FAPI_metrics *metrics) +{ + fapi_ufst_server *r = If_to_I(server); + int code; + + release_char_data_inline(r); + code = get_char(r, ff, c, NULL, metrics, server->use_outline ? FC_CUBIC_TYPE : FC_BITMAP_TYPE); + if (code == ERR_bm_buff || code == ERR_bm_too_big) /* Too big character ? */ + return (e_VMerror); return code; /* UFST cannot render enough metrics information without generating raster or outline. r->char_data keeps a raster after calling this function. */ } + static FAPI_retcode get_char_raster(FAPI_server *server, FAPI_raster *rast) { fapi_ufst_server *r = If_to_I(server); @@ -1553,8 +1604,8 @@ *e = ee->next; CGIFfco_Close(FSA ee->fcHandle); - r->client_mem.free(&r->client_mem, ee->file_path, "fco_file_path"); - r->client_mem.free(&r->client_mem, ee, "fco_list_elem"); + gs_free(r->mem, ee->file_path, 0, 0, "fco_file_path"); + gs_free(r->mem, ee, 0, 0, "fco_list_elem"); } else e = &(*e)->next; } @@ -1579,11 +1630,11 @@ release_glyphs(r, d); release_fco(r, (SW16)(d->font_id >> 16)); - r->client_mem.free(&r->client_mem, font_data, "ufst font data"); + gs_free(r->mem, font_data, 0, 0, "ufst font data"); return code; } -static FAPI_retcode check_cmap_for_GID(FAPI_server *server, uint index) +static FAPI_retcode check_cmap_for_GID(FAPI_server *server, uint *index) { return 0; } @@ -1651,12 +1702,18 @@ gs_main_instance *inst; ref entry; char tmppath[512]; + int code = 0; if (r == 0) return e_Fatal; memset(r, 0, sizeof(*r)); r->If = If0; - r->client_mem = *client_mem; + + code = gs_memory_chunk_wrap(&(r->mem), client_mem->client_data); + if (code != 0) { + return(code); + } + *p_instance = &r->If.ig; inst = get_minst_from_memory((const gs_memory_t *)(client_mem->client_data)); @@ -1715,7 +1772,9 @@ if (r->bInitialized && !r->ufst_is_singleton) gx_UFST_fini(); if (r->param) { - mem->free (mem, r->param, "server_params"); + gs_free (r->mem, r->param, 0, 0, "server_params"); } + gs_memory_chunk_release (r->mem); + mem->free(mem, r, "fapi_ufst_server"); } diff -Nru ghostscript-9.04~dfsg/psi/gs.c ghostscript-9.05~dfsg~20120125/psi/gs.c --- ghostscript-9.04~dfsg/psi/gs.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/psi/gs.c 2011-11-12 18:29:08.000000000 +0000 @@ -106,7 +106,7 @@ fflush(stdout); code = gs_main_run_string(minst, *pstr, 0, &exit_code, &error_object); - zflush(osp); + zflush(minst->i_ctx_p); fprintf(stdout, " => code = %d\n", code); fflush(stdout); if (code < 0) { diff -Nru ghostscript-9.04~dfsg/psi/idisp.c ghostscript-9.05~dfsg~20120125/psi/idisp.c --- ghostscript-9.04~dfsg/psi/idisp.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/psi/idisp.c 2011-11-12 18:29:08.000000000 +0000 @@ -49,11 +49,11 @@ int display_set_callback(gs_main_instance *minst, display_callback *callback) { - i_ctx_t *i_ctx_p = minst->i_ctx_p; + i_ctx_t *i_ctx_p; bool was_open; int code; int exit_code = 0; - os_ptr op = osp; + os_ptr op; gx_device *dev; gx_device_display *ddev; @@ -69,6 +69,7 @@ if (code < 0) return code; + i_ctx_p = minst->i_ctx_p; /* run_string may change i_ctx_p if GC */ op = osp; check_type(*op, t_boolean); if (op->value.boolval) { diff -Nru ghostscript-9.04~dfsg/psi/ifilter.h ghostscript-9.05~dfsg~20120125/psi/ifilter.h --- ghostscript-9.04~dfsg/psi/ifilter.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/psi/ifilter.h 2011-11-12 18:29:08.000000000 +0000 @@ -34,7 +34,7 @@ /* top dictionary operand (both of which will always be popped) */ int npop, /* Template for stream */ - const stream_template * template, + const stream_template * templat, /* Initialized s_xxx_state, 0 if no separate state */ stream_state * st, /* Max of space attributes of all parameters referenced by */ @@ -42,7 +42,7 @@ uint space ); int filter_write(i_ctx_t *i_ctx_p, int npop, - const stream_template * template, + const stream_template * templat, stream_state * st, uint space); /* @@ -50,9 +50,9 @@ * an optional dictionary) or state. */ int filter_read_simple(i_ctx_t *i_ctx_p, - const stream_template * template); + const stream_template * templat); int filter_write_simple(i_ctx_t *i_ctx_p, - const stream_template * template); + const stream_template * templat); /* Mark a filter stream as temporary. */ /* See stream.h for the meaning of is_temp. */ diff -Nru ghostscript-9.04~dfsg/psi/ifrpred.h ghostscript-9.05~dfsg~20120125/psi/ifrpred.h --- ghostscript-9.04~dfsg/psi/ifrpred.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/psi/ifrpred.h 2011-11-12 18:29:08.000000000 +0000 @@ -19,7 +19,7 @@ /* Exported by zfdecode.c for zfzlib.c */ int filter_read_predictor(i_ctx_t *i_ctx_p, int npop, - const stream_template * template, + const stream_template * templat, stream_state * st); #endif /* ifrpred_INCLUDED */ diff -Nru ghostscript-9.04~dfsg/psi/ifwpred.h ghostscript-9.05~dfsg~20120125/psi/ifwpred.h --- ghostscript-9.04~dfsg/psi/ifwpred.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/psi/ifwpred.h 2011-11-12 18:29:08.000000000 +0000 @@ -19,7 +19,7 @@ /* Exported by zfilter2.c for zfzlib.c */ int filter_write_predictor(i_ctx_t *i_ctx_p, int npop, - const stream_template * template, + const stream_template * templat, stream_state * st); #endif /* ifwpred_INCLUDED */ diff -Nru ghostscript-9.04~dfsg/psi/igc.c ghostscript-9.05~dfsg~20120125/psi/igc.c --- ghostscript-9.04~dfsg/psi/igc.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/psi/igc.c 2011-09-29 11:01:35.000000000 +0000 @@ -415,6 +415,7 @@ /* Compute relocation based on marks, in the spaces */ /* we are going to compact. Also finalize freed objects. */ + state.cur_mem = (gs_memory_t *)mem; for_collected_chunks(mem, cp) { gc_objects_set_reloc(&state, cp); @@ -1170,7 +1171,7 @@ if_debug2('u', "[u]GC finalizing %s 0x%lx\n", struct_type_name_string(pre->o_type), (ulong) (pre + 1)); - (*finalize) (pre + 1); + (*finalize) (gcst->cur_mem, pre + 1); } pfree = (byte *) pre; pre->o_back = (pfree - (byte *) chead) >> obj_back_shift; diff -Nru ghostscript-9.04~dfsg/psi/igc.h ghostscript-9.05~dfsg~20120125/psi/igc.h --- ghostscript-9.04~dfsg/psi/igc.h 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/psi/igc.h 2011-09-29 11:01:35.000000000 +0000 @@ -64,6 +64,7 @@ /* pointers from untraced spaces */ gs_memory_t *heap; /* for extending mark stack */ name_table *ntable; /* (implicitly referenced by names) */ + gs_memory_t *cur_mem; #ifdef DEBUG chunk_t *container; #endif diff -Nru ghostscript-9.04~dfsg/psi/imainarg.c ghostscript-9.05~dfsg~20120125/psi/imainarg.c --- ghostscript-9.04~dfsg/psi/imainarg.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/psi/imainarg.c 2011-11-12 18:29:08.000000000 +0000 @@ -173,6 +173,9 @@ } else if (!strcmp(argv[i], "--help")) { print_help(minst); helping = true; + } else if (!strcmp(argv[i], "--debug")) { + gs_debug_flags_list(minst->heap); + helping = true; } else if (!strcmp(argv[i], "--version")) { print_version(minst); puts(minst->heap, ""); /* \n */ @@ -290,8 +293,16 @@ return code; break; case '-': /* run with command line args */ + if (strncmp(arg, "debug=", 6) == 0) { + code = gs_debug_flags_parse(minst->heap, arg+6); + if (code < 0) + return code; + break; + } + /* FALLTHROUGH */ case '+': pal->expand_ats = false; + /* FALLTHROUGH */ case '@': /* ditto with @-expansion */ { const char *psarg = arg_next(pal, &code); @@ -904,6 +915,11 @@ -sDEVICE= select device | -dBATCH exit after last file\n\ -sOutputFile= select output file: - for stdout, |command for pipe,\n\ embed %d or %ld for page #\n"; +#ifdef DEBUG +static const char help_debug[] = "\ + --debug=

"; + } + if ($at & 1) { + } elsif ($status & 8) { + print ""; + } elsif ($status & 4) { + print ""; + } elsif ($quiet == 0) { + print ""; + } + } + $started = 0; + $text = ""; + $at |= 1; + next LINE; + } + elsif (($i) = $line =~ m/Memory squeezing @ (\d+)/) + { + if ($started) { + if (($quiet == 0) || (($at & 1) == 1) || (($status & 12) != 0)) { + print "$text"; + } + if ($at & 1) { + } elsif ($status & 8) { + print ""; + } elsif ($status & 4) { + print ""; + } elsif ($quiet == 0) { + print ""; + } + } + $at = $i * 2; + $started = 0; + $status = 1; + next LINE; + } + elsif ($line =~ m/Allocated blocks:/) + { + $status |= 4; + } + if ($started == 0) { + $text = "
$line";
+	$started = 1;
+    } else {
+        $text = $text."\n".$line;
+    }
+}
+if ($started) {
+  if (($quiet == 0) || (($at & 1) == 1) || (($status & 12) != 0)) {
+    print "$text
"; + } + if ($at & 1) { + } elsif ($status & 8) { + print ""; + } elsif ($status & 4) { + print ""; + } elsif ($quiet == 0) { + print ""; + } +} + +print ""; diff -Nru ghostscript-9.04~dfsg/toolbin/tests/fuzzy.c ghostscript-9.05~dfsg~20120125/toolbin/tests/fuzzy.c --- ghostscript-9.04~dfsg/toolbin/tests/fuzzy.c 2011-08-05 11:12:20.000000000 +0000 +++ ghostscript-9.05~dfsg~20120125/toolbin/tests/fuzzy.c 2012-01-25 08:44:24.000000000 +0000 @@ -478,8 +478,8 @@ int row_bytes = width * 3; unsigned int out_buffer_size = (image_out ? row_bytes : 0); int half_win = window_size >> 1; - uchar **buf1 = alloc_window (row_bytes, window_size); - uchar **buf2 = alloc_window (row_bytes, window_size); + uchar **buf1 = alloc_window (row_bytes*2, window_size); + uchar **buf2 = alloc_window (row_bytes*2, window_size); uchar *out_buf = NULL; int x0 = -2, y0 = -2, mc = 0, mmax = 10; int y;